diff --git a/packages/renderer-debugger/source/App.vue b/packages/renderer-debugger/source/App.vue
index b1dbde1..2ade4fd 100644
--- a/packages/renderer-debugger/source/App.vue
+++ b/packages/renderer-debugger/source/App.vue
@@ -4,23 +4,25 @@
diff --git a/packages/renderer-webgl/source/kernel/WebGLState.ts b/packages/renderer-webgl/source/kernel/WebGLState.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/renderer-webgl/source/renderer/WebGLRenderer.ts b/packages/renderer-webgl/source/renderer/WebGLRenderer.ts
index 59b5d4c..e08a864 100644
--- a/packages/renderer-webgl/source/renderer/WebGLRenderer.ts
+++ b/packages/renderer-webgl/source/renderer/WebGLRenderer.ts
@@ -1,7 +1,22 @@
+import { WebGLCanvas } from "state/WebGLCanvas";
+import { WebGLState } from "state/WebGLState";
+import type { WebGLCanvasOption } from "state/WebGLCanvas";
+
+type WebGLRendererOption = WebGLCanvasOption;
class WebGLRenderer {
- public constructor() {}
+ public canvas: WebGLCanvas;
+
+ public state: WebGLState;
+
+ public constructor(option: WebGLRendererOption) {
+
+ this.canvas = new WebGLCanvas(option);
+
+ this.state = new WebGLState();
+ this.state.bindCanvas(this.canvas);
+ }
}
export { WebGLRenderer };
\ No newline at end of file
diff --git a/packages/renderer-webgl/source/kernel/WebGLCanvas.ts b/packages/renderer-webgl/source/state/WebGLCanvas.ts
similarity index 99%
rename from packages/renderer-webgl/source/kernel/WebGLCanvas.ts
rename to packages/renderer-webgl/source/state/WebGLCanvas.ts
index 2aa8335..0e56c5f 100644
--- a/packages/renderer-webgl/source/kernel/WebGLCanvas.ts
+++ b/packages/renderer-webgl/source/state/WebGLCanvas.ts
@@ -1,5 +1,5 @@
import { ResizeObserver as ResizeObserverPolyfill } from '@juggle/resize-observer';
-import { EventEmitter } from "./EventEmitter";
+import { EventEmitter } from "kernel/EventEmitter";
const ResizeObserver = window.ResizeObserver || ResizeObserverPolyfill;
diff --git a/packages/renderer-webgl/source/state/WebGLState.ts b/packages/renderer-webgl/source/state/WebGLState.ts
new file mode 100644
index 0000000..1b114d6
--- /dev/null
+++ b/packages/renderer-webgl/source/state/WebGLState.ts
@@ -0,0 +1,37 @@
+import type { WebGLCanvas } from "./WebGLCanvas";
+import { WebGLStateAbstract } from "./WebGLStateAbstract";
+
+class WebGLState extends WebGLStateAbstract {
+
+ private statePool: Array = [];
+
+ private registerState(state: WebGLStateAbstract) {
+ this.statePool.push(state);
+ }
+
+ public override contextWillBind(newcanvas: WebGLCanvas) {
+ for (const state of this.statePool) {
+ state.bindCanvas(newcanvas);
+ }
+ }
+
+ public override contextLost() {
+ for (const state of this.statePool) {
+ state.contextLost();
+ }
+ }
+
+ public override resetState() {
+ for (const state of this.statePool) {
+ state.resetState();
+ }
+ }
+
+ public override destroy() {
+ for (const state of this.statePool) {
+ state.destroy();
+ }
+ }
+}
+
+export { WebGLState };
diff --git a/packages/renderer-webgl/source/state/WebGLStateAbstract.ts b/packages/renderer-webgl/source/state/WebGLStateAbstract.ts
new file mode 100644
index 0000000..31901a2
--- /dev/null
+++ b/packages/renderer-webgl/source/state/WebGLStateAbstract.ts
@@ -0,0 +1,56 @@
+import type { WebGLCanvas } from "./WebGLCanvas";
+
+/**
+ * Used for management, caching, encapsulation, WebGL context.
+ */
+abstract class WebGLStateAbstract {
+
+ private _canvas: WebGLCanvas | undefined;
+
+ /**
+ * binded canvas.
+ */
+ public get canvas(): WebGLCanvas {
+ if (this._canvas) {
+ return this._canvas;
+ }
+ else {
+ throw new Error(
+ "[ray-lab WebGLStateBasic] Please get canvas instance after context binding."
+ );
+ }
+ };
+
+ /**
+ * Bind new WebGLCanvas.
+ */
+ public bindCanvas(canvas: WebGLCanvas) {
+ this.contextWillBind(canvas);
+ this._canvas = canvas;
+ };
+
+ /**
+ * Life cycle hook function.
+ * Triggered when the context is rebound.
+ * @param newcanvas - New canvas object to be bound.
+ */
+ public abstract contextWillBind(newcanvas: WebGLCanvas): any;
+
+ /**
+ * Life cycle hook function.
+ * Triggered when the context is lost.
+ */
+ public abstract contextLost(): any;
+
+ /**
+ * Reset all states.
+ */
+ public abstract resetState(): any;
+
+ /**
+ * Triggered when destroyed.
+ */
+ public abstract destroy(): any;
+}
+
+export { WebGLStateAbstract };
diff --git a/packages/renderer-webgl/source/webgl-renderer.ts b/packages/renderer-webgl/source/webgl-renderer.ts
index 5b43b7b..512dbd4 100644
--- a/packages/renderer-webgl/source/webgl-renderer.ts
+++ b/packages/renderer-webgl/source/webgl-renderer.ts
@@ -1,3 +1,3 @@
-export * from "kernel/WebGLCanvas";
+export * from "state/WebGLCanvas";
export * from "kernel/EventEmitter";
export * from "renderer/WebGLRenderer";
\ No newline at end of file
diff --git a/packages/renderer-webgl/tsconfig.json b/packages/renderer-webgl/tsconfig.json
index 3b3e1a9..c0902a9 100644
--- a/packages/renderer-webgl/tsconfig.json
+++ b/packages/renderer-webgl/tsconfig.json
@@ -13,7 +13,8 @@
],
"paths": {
"kernel/*": ["./source/kernel/*"],
- "renderer/*": ["./source/renderer/*"]
+ "renderer/*": ["./source/renderer/*"],
+ "state/*": ["./source/state/*"]
}
}
}
\ No newline at end of file