Bladeren bron

fixed scene syncing issue, temporarily removed SceneLabels from behaviors

David Sehnal 6 jaren geleden
bovenliggende
commit
73e187c5be
4 gewijzigde bestanden met toevoegingen van 24 en 13 verwijderingen
  1. 6 5
      src/mol-canvas3d/canvas3d.ts
  2. 1 1
      src/mol-canvas3d/helper/bounding-sphere-helper.ts
  3. 16 6
      src/mol-gl/scene.ts
  4. 1 1
      src/mol-plugin/index.ts

+ 6 - 5
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()

+ 1 - 1
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() {

+ 16 - 6
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) => {

+ 1 - 1
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 }),
     ],