| @@ -120,7 +120,7 @@ export class MaterialManager<T = ''> extends EventDispatcher<BaseEvent, T> { | |||
| .forEach(map=> | |||
| !map.isRenderTargetTexture && map.userData.disposeOnIdle !== false && | |||
| map.dispose && !isInScene(map) && map.dispose()) | |||
| this.unregisterMaterial(mat) // todo, re-add when material is added again to the scene. | |||
| // this.unregisterMaterial(mat) // not unregistering on dispose, that has to be done explicitly. todo: make an easy way to do that. | |||
| } | |||
| private _materialMaps = new Map<string, Set<ITexture>>() | |||
| @@ -607,6 +607,7 @@ export class RenderManager<TEvent extends BaseEvent = IRenderManagerEvent, TEven | |||
| protected _createTargetClass(clazz: Class<WebGLRenderTarget>, size: number[], options: WebGLRenderTargetOptions): IRenderTarget { | |||
| const processNewTarget = this._processNewTarget | |||
| const disposeTarget = this.disposeTarget.bind(this) | |||
| return new class RenderTarget extends clazz implements IRenderTarget { | |||
| isTemporary?: boolean | |||
| sizeMultiplier?: number | |||
| @@ -666,7 +667,11 @@ export class RenderManager<TEvent extends BaseEvent = IRenderManagerEvent, TEven | |||
| super.copy(source as any) | |||
| return this | |||
| } | |||
| // Note - by default unregister need to be false. | |||
| dispose(unregister = false) { | |||
| if (unregister === true) disposeTarget(this, true) | |||
| else super.dispose() | |||
| } | |||
| }(this, ...size, options) | |||
| } | |||
| @@ -86,11 +86,18 @@ export abstract class RenderTargetManager<E extends BaseEvent = BaseEvent, ET ex | |||
| return target | |||
| } | |||
| disposeTarget(target: IRenderTarget): void { | |||
| /** | |||
| * Dispose and remove tracked target. Release target in-case of temporary target. | |||
| * To just dispose from the GPU memory and keep reference, call `target.dispose()` or `target.dispose(false)` | |||
| * @param target | |||
| * @param remove | |||
| */ | |||
| disposeTarget(target: IRenderTarget, remove = true): void { | |||
| if (!target) return | |||
| if (target.isTemporary) return this.releaseTempTarget(target) | |||
| this.removeTrackedTarget(target) | |||
| target.dispose() | |||
| if (remove) this.removeTrackedTarget(target) | |||
| // @ts-expect-error internal, not in types | |||
| target.dispose(false) // false is not required but still passing so that it doesnt cause infinite loop in future. | |||
| } | |||
| getTempTarget<T extends IRenderTarget = IRenderTarget>(op: CreateRenderTargetOptions = {}): T { | |||
| @@ -588,7 +588,7 @@ export class ThreeViewer extends EventDispatcher<IViewerEvent, IViewerEventTypes | |||
| ;(window as any).threeViewers?.splice((window as any).threeViewers.indexOf(this), 1) | |||
| if (this.resizeObserver) this.resizeObserver.unobserve(this._canvas) | |||
| else window.removeEventListener('resize', this.resize) | |||
| window.removeEventListener('resize', this.resize) | |||
| this.dispatchEvent({type: 'dispose'}) | |||
| } | |||