Browse Source

mol-canvas3d: updated render method

David Sehnal 6 years ago
parent
commit
fa44b52684
1 changed files with 19 additions and 17 deletions
  1. 19 17
      src/mol-canvas3d/canvas3d.ts

+ 19 - 17
src/mol-canvas3d/canvas3d.ts

@@ -179,7 +179,7 @@ namespace Canvas3D {
             }
         }
 
-        function render(variant: RenderVariant, force: boolean) {
+        function render(variant: 'pick' | 'draw', force: boolean) {
             if (isPicking || isUpdating) return false
 
             let didRender = false
@@ -190,20 +190,22 @@ namespace Canvas3D {
 
             if (force || cameraChanged) {
                 switch (variant) {
-                    case 'pickObject': objectPickTarget.bind(); break;
-                    case 'pickInstance': instancePickTarget.bind(); break;
-                    case 'pickGroup': groupPickTarget.bind(); break;
+                    case 'pick':
+                        objectPickTarget.bind();
+                        renderer.render(scene, 'pickObject');
+                        instancePickTarget.bind();
+                        renderer.render(scene, 'pickInstance');
+                        groupPickTarget.bind();
+                        renderer.render(scene, 'pickGroup');
+                        break;
                     case 'draw':
                         webgl.unbindFramebuffer();
                         renderer.setViewport(0, 0, canvas.width, canvas.height);
+                        renderer.render(scene, variant);
+                        lastRenderTime = now()
+                        pickDirty = true
                         break;
                 }
-
-                renderer.render(scene, variant)
-                if (variant === 'draw') {
-                    lastRenderTime = now()
-                    pickDirty = true
-                }
                 didRender = true
             }
 
@@ -230,18 +232,18 @@ namespace Canvas3D {
             const t = now();
             camera.transition.tick(t);
             draw(false)
-            if (t - lastRenderTime > 200) {
-                if (pickDirty) pick()
+            if (t - lastRenderTime > 1000 / 12 /** picking at 12 fps */ && pickDirty) {
+                // TODO would it not be better to call pick in identify?
+                // because currently for example highlighting something
+                // sets pickDirty = true that is not true
+                // there should definitely be a better "dirty" mechanism
+                pick();
             }
             window.requestAnimationFrame(animate)
         }
 
         function pick() {
-            render('pickObject', pickDirty)
-            render('pickInstance', pickDirty)
-            render('pickGroup', pickDirty)
-            webgl.gl.finish()
-
+            render('pick', pickDirty)
             pickDirty = false
         }