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