| @@ -29,4 +29,7 @@ export interface IPipelinePass<Tid extends IPassID = IPassID> extends IPass<Tid> | |||
| onRegister?(renderer: IRenderManager): void; | |||
| onUnregister?(renderer: IRenderManager): void; | |||
| onPostFrame?(renderManager: IRenderManager): void; | |||
| } | |||
| @@ -45,6 +45,12 @@ export class ScreenPass extends ExtendedShaderPass implements IPipelinePass<'scr | |||
| reRender(renderer: IWebGLRenderer, writeBuffer?: WebGLMultipleRenderTargets | WebGLRenderTarget | null, deltaTime?: number, maskActive?: boolean) { | |||
| 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() { | |||
| this._lastReadBuffer = undefined | |||
| @@ -189,7 +189,7 @@ export class RenderManager extends RenderTargetManager<IRenderManagerEvent, IRen | |||
| this.refreshPasses() | |||
| } | |||
| 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._frameCount += 1 | |||
| @@ -197,6 +197,12 @@ export class RenderManager extends RenderTargetManager<IRenderManagerEvent, IRen | |||
| this._dirty = false | |||
| } | |||
| onPostFrame = () => { | |||
| for (const pass of this._passes) { | |||
| if (pass.enabled && pass.onPostFrame) pass.onPostFrame?.(this) | |||
| } | |||
| } | |||
| get needsRender(): boolean { | |||
| this._dirty = this._dirty || this._passes.findIndex(value => value.dirty) >= 0 // todo: check for enabled passes only. | |||
| return this._dirty | |||
| @@ -3,7 +3,7 @@ export {overrideThreeCache} from './cache' | |||
| export {dataTextureFromColor, dataTextureFromVec4, halfFloatToRgbe} from './conversion' | |||
| export {uniform, matDefine} from './decorators' | |||
| 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 {threeConstMappings} from './const-mappings' | |||
| @@ -524,6 +524,7 @@ export class ThreeViewer extends EventDispatcher<IViewerEvent, IViewerEventTypes | |||
| } | |||
| this.dispatchEvent({type: 'postFrame', target: this}) | |||
| this.renderManager.onPostFrame() | |||
| if (!needsRender) // break if no frame rendered | |||
| break | |||