diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 4edbf744d69fbab7078701839031187af7fa2fe0..918837a18821d3d0b1b52de5b3ca09bd7d2310a3 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/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 }