瀏覽代碼

Add onPostFrame in Pass, ScreenPass and RenderManager that is triggered post frame.

master
Palash Bansal 2 年之前
父節點
當前提交
2318b61e92
沒有連結到貢獻者的電子郵件帳戶。

+ 3
- 0
src/postprocessing/Pass.ts 查看文件



onRegister?(renderer: IRenderManager): void; onRegister?(renderer: IRenderManager): void;
onUnregister?(renderer: IRenderManager): void; onUnregister?(renderer: IRenderManager): void;

onPostFrame?(renderManager: IRenderManager): void;

} }

+ 6
- 0
src/postprocessing/ScreenPass.ts 查看文件

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

+ 7
- 1
src/rendering/RenderManager.ts 查看文件

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

+ 1
- 1
src/three/utils/index.ts 查看文件

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'



+ 1
- 0
src/viewer/ThreeViewer.ts 查看文件

} }


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

Loading…
取消
儲存