diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 58bf1db6ae784a13f98a06d583022fb41d990a11..8f285da41dfa9b106b73aa6b3cedec06a6dc1cea 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -162,7 +162,7 @@ namespace Canvas3D { reprRenderObjects.forEach((_, _repr) => { changed = _repr.mark(loci.loci, action) || changed }) } if (changed) { - scene.update(true) + scene.update(void 0, true) const prevPickDirty = pickDirty draw(true) pickDirty = prevPickDirty // marking does not change picking buffers @@ -317,16 +317,17 @@ namespace Canvas3D { const oldRO = reprRenderObjects.get(repr) const newRO = new Set<GraphicsRenderObject>() repr.renderObjects.forEach(o => newRO.add(o)) + if (oldRO) { if (!SetUtils.areEqual(newRO, oldRO)) { - for (const o of Array.from(newRO)) { if (!oldRO.has(o)) scene.add(o) } + for (const o of Array.from(newRO)) { if (!oldRO.has(o)) scene.add(o); } for (const o of Array.from(oldRO)) { if (!newRO.has(o)) scene.remove(o) } } } else { repr.renderObjects.forEach(o => scene.add(o)) } reprRenderObjects.set(repr, newRO) - scene.update() + scene.update(repr.renderObjects, false) if (debugHelper.isEnabled) debugHelper.update() isUpdating = false requestDraw(true) @@ -354,14 +355,14 @@ namespace Canvas3D { isUpdating = true renderObjects.forEach(o => scene.remove(o)) reprRenderObjects.delete(repr) - scene.update() + scene.update(void 0, false) if (debugHelper.isEnabled) debugHelper.update() isUpdating = false requestDraw(true) reprCount.next(reprRenderObjects.size) } }, - update: () => scene.update(), + update: () => scene.update(void 0, false), clear: () => { reprRenderObjects.clear() scene.clear() diff --git a/src/mol-canvas3d/helper/bounding-sphere-helper.ts b/src/mol-canvas3d/helper/bounding-sphere-helper.ts index 03f52d9fa66fd5d5b5edbd6d284fad7794b6c8b7..9ac4938e9e08261c004bf059b02306a335427314 100644 --- a/src/mol-canvas3d/helper/bounding-sphere-helper.ts +++ b/src/mol-canvas3d/helper/bounding-sphere-helper.ts @@ -81,7 +81,7 @@ export class BoundingSphereHelper { } }) - this.scene.update() + this.scene.update(void 0, false); } syncVisibility() { diff --git a/src/mol-gl/scene.ts b/src/mol-gl/scene.ts index d744286b1f619c027f43c5ef2dbeb3260ed98a81..e8e079ceb5d01b3aeb5e0a07442bc510e0d481a4 100644 --- a/src/mol-gl/scene.ts +++ b/src/mol-gl/scene.ts @@ -7,7 +7,7 @@ import { Renderable } from './renderable' import { WebGLContext } from './webgl/context'; import { RenderableValues, BaseValues } from './renderable/schema'; -import { RenderObject, createRenderable } from './render-object'; +import { RenderObject, createRenderable, GraphicsRenderObject } from './render-object'; import { Object3D } from './object3d'; import { Sphere3D } from 'mol-math/geometry'; import { Vec3 } from 'mol-math/linear-algebra'; @@ -57,8 +57,8 @@ interface Scene extends Object3D { readonly renderables: ReadonlyArray<Renderable<RenderableValues & BaseValues>> readonly boundingSphere: Sphere3D - update: (keepBoundingSphere?: boolean) => void - add: (o: RenderObject) => void + update: (objects: ArrayLike<GraphicsRenderObject> | undefined, keepBoundingSphere: boolean) => void + add: (o: RenderObject) => Renderable<any> remove: (o: RenderObject) => void has: (o: RenderObject) => boolean clear: () => void @@ -80,10 +80,18 @@ namespace Scene { get direction () { return object3d.direction }, get up () { return object3d.up }, - update: (keepBoundingSphere?: boolean) => { + update(objects, keepBoundingSphere) { Object3D.update(object3d) - for (let i = 0, il = renderables.length; i < il; ++i) { - renderables[i].update() + if (objects) { + for (let i = 0, il = objects.length; i < il; ++i) { + const o = renderableMap.get(objects[i]); + if (!o) continue; + o.update(); + } + } else { + for (let i = 0, il = renderables.length; i < il; ++i) { + renderables[i].update() + } } if (!keepBoundingSphere) boundingSphereDirty = true }, @@ -94,8 +102,10 @@ namespace Scene { renderables.sort(renderableSort) renderableMap.set(o, renderable) boundingSphereDirty = true + return renderable; } else { console.warn(`RenderObject with id '${o.id}' already present`) + return renderableMap.get(o)! } }, remove: (o: RenderObject) => { diff --git a/src/mol-plugin/index.ts b/src/mol-plugin/index.ts index 73a7410f078a1776c84871c303b7638af031b540..9fb4643bae578f86bc599c5d9bf09f05b9a2deb5 100644 --- a/src/mol-plugin/index.ts +++ b/src/mol-plugin/index.ts @@ -52,7 +52,7 @@ export const DefaultPluginSpec: PluginSpec = { PluginSpec.Behavior(PluginBehaviors.Representation.DefaultLociLabelProvider), PluginSpec.Behavior(PluginBehaviors.Camera.FocusLociOnSelect, { minRadius: 20, extraRadius: 4 }), PluginSpec.Behavior(PluginBehaviors.Animation.StructureAnimation, { rotate: false, rotateValue: 0, explode: false, explodeValue: 0 }), - PluginSpec.Behavior(PluginBehaviors.Labels.SceneLabels), + // PluginSpec.Behavior(PluginBehaviors.Labels.SceneLabels), PluginSpec.Behavior(PluginBehaviors.CustomProps.PDBeStructureQualityReport, { autoAttach: true }), PluginSpec.Behavior(PluginBehaviors.CustomProps.RCSBAssemblySymmetry, { autoAttach: true }), ],