Bladeren bron

add renderable.state.disposed flag

- set when disposing render-objects
- don't render disposed objects (can be temporarily still in a scene)
Alexander Rose 4 jaren geleden
bovenliggende
commit
672875187b

+ 1 - 1
src/mol-canvas3d/helper/bounding-sphere-helper.ts

@@ -160,5 +160,5 @@ const instanceMaterialId = getNextMaterialId();
 
 function createBoundingSphereRenderObject(mesh: Mesh, color: Color, materialId: number, transform?: TransformData) {
     const values = Mesh.Utils.createValuesSimple(mesh, { alpha: 0.1, doubleSided: false }, color, 1, transform);
-    return createRenderObject('mesh', values, { visible: true, alphaFactor: 1, pickable: false, colorOnly: false, opaque: false, writeDepth: false, noClip: false }, materialId);
+    return createRenderObject('mesh', values, { disposed: false, visible: true, alphaFactor: 1, pickable: false, colorOnly: false, opaque: false, writeDepth: false, noClip: false }, materialId);
 }

+ 1 - 0
src/mol-geo/geometry/base.ts

@@ -75,6 +75,7 @@ export namespace BaseGeometry {
     export function createRenderableState(props: Partial<PD.Values<Params>> = {}): RenderableState {
         const opaque = props.alpha === undefined ? true : props.alpha === 1;
         return {
+            disposed: false,
             visible: true,
             alphaFactor: 1,
             pickable: true,

+ 1 - 0
src/mol-gl/_spec/renderer.spec.ts

@@ -89,6 +89,7 @@ function createPoints() {
         uPointEdgeBleach: ValueCell.create(0.5),
     };
     const state: RenderableState = {
+        disposed: false,
         visible: true,
         alphaFactor: 1,
         pickable: true,

+ 1 - 0
src/mol-gl/renderable.ts

@@ -15,6 +15,7 @@ import { Textures } from './webgl/texture';
 const getNextRenderableId = idFactory();
 
 export type RenderableState = {
+    disposed: boolean
     visible: boolean
     alphaFactor: number
     pickable: boolean

+ 1 - 1
src/mol-gl/renderer.ts

@@ -267,7 +267,7 @@ namespace Renderer {
         let globalUniformsNeedUpdate = true;
 
         const renderObject = (r: GraphicsRenderable, variant: GraphicsRenderVariant) => {
-            if (!r.state.visible || (!r.state.pickable && variant[0] === 'p')) {
+            if (r.state.disposed || !r.state.visible || (!r.state.pickable && variant[0] === 'p')) {
                 return;
             }
 

+ 4 - 2
src/mol-repr/shape/representation.ts

@@ -222,9 +222,11 @@ export function ShapeRepresentation<D, G extends Geometry, P extends Geometry.Pa
             }
         },
         destroy() {
-            // TODO
             renderObjects.length = 0;
-            _renderObject = undefined;
+            if (_renderObject) {
+                _renderObject.state.disposed = true;
+                _renderObject = undefined;
+            }
         }
     };
 }

+ 4 - 1
src/mol-repr/structure/complex-visual.ts

@@ -242,7 +242,10 @@ export function ComplexVisual<G extends Geometry, P extends StructureParams & Ge
         },
         destroy() {
             dispose?.(geometry);
-            renderObject = undefined;
+            if (renderObject) {
+                renderObject.state.disposed = true;
+                renderObject = undefined;
+            }
         },
         mustRecreate
     };

+ 4 - 1
src/mol-repr/structure/units-visual.ts

@@ -294,7 +294,10 @@ export function UnitsVisual<G extends Geometry, P extends StructureParams & Geom
         },
         destroy() {
             dispose?.(geometry);
-            renderObject = undefined;
+            if (renderObject) {
+                renderObject.state.disposed = true;
+                renderObject = undefined;
+            }
         },
         mustRecreate
     };

+ 4 - 1
src/mol-repr/volume/representation.ts

@@ -210,7 +210,10 @@ export function VolumeVisual<G extends Geometry, P extends VolumeParams & Geomet
         },
         destroy() {
             dispose?.(geometry);
-            renderObject = undefined;
+            if (renderObject) {
+                renderObject.state.disposed = true;
+                renderObject = undefined;
+            }
         },
         mustRecreate
     };