Browse Source

handle undefined renderObject

Alexander Rose 6 years ago
parent
commit
00f5ff24ea

+ 1 - 1
src/mol-geo/representation/index.ts

@@ -23,7 +23,7 @@ export interface Representation<D, P extends RepresentationProps = {}> {
 }
 
 export interface Visual<D, P extends RepresentationProps = {}> {
-    readonly renderObject: RenderObject
+    readonly renderObject: RenderObject | undefined
     create: (ctx: RuntimeContext, data: D, props?: Partial<P>) => Promise<void>
     update: (ctx: RuntimeContext, props: Partial<P>) => Promise<boolean>
     getLoci: (pickingId: PickingId) => Loci

+ 3 - 2
src/mol-geo/representation/shape/index.ts

@@ -33,7 +33,7 @@ export type ShapeProps = typeof DefaultShapeProps
 
 export function ShapeRepresentation<P extends ShapeProps>(): ShapeRepresentation<P> {
     const renderObjects: RenderObject[] = []
-    let _renderObject: MeshRenderObject
+    let _renderObject: MeshRenderObject | undefined
     let _shape: Shape
     let _props: P
 
@@ -83,12 +83,13 @@ export function ShapeRepresentation<P extends ShapeProps>(): ShapeRepresentation
         update,
         getLoci(pickingId: PickingId) {
             const { objectId, groupId } = pickingId
-            if (_renderObject.id === objectId) {
+            if (_renderObject && _renderObject.id === objectId) {
                 return Shape.Loci([ { shape: _shape, ids: OrderedSet.ofSingleton(groupId) } ])
             }
             return EmptyLoci
         },
         mark(loci: Loci, action: MarkerAction) {
+            if (!_renderObject) return
             const { tMarker } = _renderObject.values
             let changed = false
             if (isEveryLoci(loci)) {

+ 3 - 1
src/mol-geo/representation/structure/complex-representation.ts

@@ -68,7 +68,9 @@ export function ComplexRepresentation<P extends StructureProps>(visualCtor: () =
     }
 
     return {
-        get renderObjects() { return [ visual.renderObject ] },
+        get renderObjects() {
+            return visual.renderObject ? [ visual.renderObject ] : []
+        },
         get props() { return _props },
         create,
         update,

+ 3 - 1
src/mol-geo/representation/structure/units-representation.ts

@@ -114,7 +114,9 @@ export function UnitsRepresentation<P extends StructureProps>(visualCtor: () =>
     return {
         get renderObjects() {
             const renderObjects: RenderObject[] = []
-            visuals.forEach(({ visual }) => renderObjects.push(visual.renderObject))
+            visuals.forEach(({ visual }) => {
+                if (visual.renderObject) renderObjects.push(visual.renderObject)
+            })
             return renderObjects
         },
         get props() {

+ 4 - 3
src/mol-geo/representation/structure/units-visual.ts

@@ -12,7 +12,7 @@ import { PickingId } from '../../util/picking';
 import { LocationIterator } from '../../util/location-iterator';
 import { Mesh } from '../../mesh/mesh';
 import { MarkerAction, applyMarkerAction } from '../../util/marker-data';
-import { Loci, isEveryLoci } from 'mol-model/loci';
+import { Loci, isEveryLoci, EmptyLoci } from 'mol-model/loci';
 import { MeshRenderObject } from 'mol-gl/render-object';
 import { createUnitsMeshRenderObject, createColors } from './visual/util/common';
 import { deepEqual, ValueCell } from 'mol-util';
@@ -40,7 +40,7 @@ export function UnitsMeshVisual<P extends UnitsMeshProps>(builder: UnitsMeshVisu
     const { defaultProps, createMesh, createLocationIterator, getLoci, mark, setUpdateState } = builder
     const updateState = MeshUpdateState.create()
 
-    let renderObject: MeshRenderObject
+    let renderObject: MeshRenderObject | undefined
     let currentProps: P
     let mesh: Mesh
     let currentGroup: Unit.SymmetryGroup
@@ -97,9 +97,10 @@ export function UnitsMeshVisual<P extends UnitsMeshProps>(builder: UnitsMeshVisu
             return true
         },
         getLoci(pickingId: PickingId) {
-            return getLoci(pickingId, currentGroup, renderObject.id)
+            return renderObject ? getLoci(pickingId, currentGroup, renderObject.id) : EmptyLoci
         },
         mark(loci: Loci, action: MarkerAction) {
+            if (!renderObject) return
             const { tMarker } = renderObject.values
             const { groupCount, instanceCount } = locationIt
 

+ 1 - 1
src/mol-geo/representation/volume/index.ts

@@ -33,7 +33,7 @@ export function VolumeRepresentation<P extends VolumeProps>(visualCtor: (volumeD
             _volumeData = volumeData
             const visual = visualCtor(_volumeData)
             await visual.create(ctx, _volumeData, props)
-            renderObjects.push(visual.renderObject)
+            if (visual.renderObject) renderObjects.push(visual.renderObject)
         });
     }