| onRegister?(renderer: IRenderManager): void; | onRegister?(renderer: IRenderManager): void; | ||||
| onUnregister?(renderer: IRenderManager): void; | onUnregister?(renderer: IRenderManager): void; | ||||
| onPostFrame?(renderManager: IRenderManager): void; | |||||
| } | } |
| reRender(renderer: IWebGLRenderer, writeBuffer?: WebGLMultipleRenderTargets | WebGLRenderTarget | null, deltaTime?: number, maskActive?: boolean) { | reRender(renderer: IWebGLRenderer, writeBuffer?: WebGLMultipleRenderTargets | WebGLRenderTarget | null, deltaTime?: number, maskActive?: boolean) { | ||||
| if (this._lastReadBuffer) this.render(renderer, writeBuffer, this._lastReadBuffer, deltaTime, maskActive) | if (this._lastReadBuffer) this.render(renderer, writeBuffer, this._lastReadBuffer, deltaTime, maskActive) | ||||
| } | } | ||||
| private _needsReRender = false | |||||
| onPostFrame(renderManager: IRenderManager) { | |||||
| if (!this._needsReRender) return | |||||
| this._needsReRender = false | |||||
| this.reRender(renderManager.renderer) | |||||
| } | |||||
| dispose() { | dispose() { | ||||
| this._lastReadBuffer = undefined | this._lastReadBuffer = undefined |
| this.refreshPasses() | this.refreshPasses() | ||||
| } | } | ||||
| for (const pass of this._passes) { | for (const pass of this._passes) { | ||||
| if (pass.enabled) pass.beforeRender?.(scene, scene.mainCamera, this) | |||||
| if (pass.enabled && pass.beforeRender) pass.beforeRender(scene, scene.mainCamera, this) | |||||
| } | } | ||||
| this._composer.render() | this._composer.render() | ||||
| this._frameCount += 1 | this._frameCount += 1 | ||||
| this._dirty = false | this._dirty = false | ||||
| } | } | ||||
| onPostFrame = () => { | |||||
| for (const pass of this._passes) { | |||||
| if (pass.enabled && pass.onPostFrame) pass.onPostFrame?.(this) | |||||
| } | |||||
| } | |||||
| get needsRender(): boolean { | get needsRender(): boolean { | ||||
| this._dirty = this._dirty || this._passes.findIndex(value => value.dirty) >= 0 // todo: check for enabled passes only. | this._dirty = this._dirty || this._passes.findIndex(value => value.dirty) >= 0 // todo: check for enabled passes only. | ||||
| return this._dirty | return this._dirty |
| export {dataTextureFromColor, dataTextureFromVec4, halfFloatToRgbe} from './conversion' | export {dataTextureFromColor, dataTextureFromVec4, halfFloatToRgbe} from './conversion' | ||||
| export {uniform, matDefine} from './decorators' | export {uniform, matDefine} from './decorators' | ||||
| export {getEncodingComponents, getTexelEncoding, getTexelDecoding, getTexelDecoding2, getTexelDecodingFunction, getTexelEncodingFunction, getTextureColorSpaceFromMap} from './encoding' | export {getEncodingComponents, getTexelEncoding, getTexelDecoding, getTexelDecoding2, getTexelDecodingFunction, getTexelEncodingFunction, getTextureColorSpaceFromMap} from './encoding' | ||||
| export {generateUUID, toIndexedGeometry} from './misc' | |||||
| export {generateUUID, toIndexedGeometry, isInScene} from './misc' | |||||
| export {getTextureDataType, textureToCanvas, textureDataToImageData, textureToDataUrl, texImageToCanvas} from './texture' | export {getTextureDataType, textureToCanvas, textureDataToImageData, textureToDataUrl, texImageToCanvas} from './texture' | ||||
| export {threeConstMappings} from './const-mappings' | export {threeConstMappings} from './const-mappings' | ||||
| } | } | ||||
| this.dispatchEvent({type: 'postFrame', target: this}) | this.dispatchEvent({type: 'postFrame', target: this}) | ||||
| this.renderManager.onPostFrame() | |||||
| if (!needsRender) // break if no frame rendered | if (!needsRender) // break if no frame rendered | ||||
| break | break |