소스 검색

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

master
Palash Bansal 2 년 전
부모
커밋
2318b61e92
No account linked to committer's email address
5개의 변경된 파일18개의 추가작업 그리고 2개의 파일을 삭제
  1. 3
    0
      src/postprocessing/Pass.ts
  2. 6
    0
      src/postprocessing/ScreenPass.ts
  3. 7
    1
      src/rendering/RenderManager.ts
  4. 1
    1
      src/three/utils/index.ts
  5. 1
    0
      src/viewer/ThreeViewer.ts

+ 3
- 0
src/postprocessing/Pass.ts 파일 보기

@@ -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;

}

+ 6
- 0
src/postprocessing/ScreenPass.ts 파일 보기

@@ -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

+ 7
- 1
src/rendering/RenderManager.ts 파일 보기

@@ -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

+ 1
- 1
src/three/utils/index.ts 파일 보기

@@ -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'


+ 1
- 0
src/viewer/ThreeViewer.ts 파일 보기

@@ -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

Loading…
취소
저장