diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 3ac440ca0d2214305cf0578fe580c3aa20c63059..7b8995710dd91772d84ecb7dfbf29af7d5afa1d4 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -139,7 +139,6 @@ namespace Canvas3D { const postprocessing = new PostprocessingPass(webgl, camera, drawPass, p.postprocessing) const multiSample = new MultiSamplePass(webgl, camera, drawPass, postprocessing, p.multiSample) - let isUpdating = false let drawPending = false let cameraResetRequested = false @@ -206,7 +205,7 @@ namespace Canvas3D { } function render(variant: 'pick' | 'draw', force: boolean) { - if (isUpdating || scene.isCommiting) return false + if (scene.isCommiting) return false let didRender = false controls.update(currentTime); @@ -266,8 +265,21 @@ namespace Canvas3D { return pickPass.identify(x, y) } + function commit(renderObjects?: readonly GraphicsRenderObject[]) { + scene.update(renderObjects, false) + + runTask(scene.commit()).then(() => { + if (cameraResetRequested && !scene.isCommiting) { + camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius) + cameraResetRequested = false + } + if (debugHelper.isEnabled) debugHelper.update() + requestDraw(true) + reprCount.next(reprRenderObjects.size) + }) + } + function add(repr: Representation.Any) { - isUpdating = true const oldRO = reprRenderObjects.get(repr) const newRO = new Set<GraphicsRenderObject>() repr.renderObjects.forEach(o => newRO.add(o)) @@ -281,18 +293,7 @@ namespace Canvas3D { repr.renderObjects.forEach(o => scene.add(o)) } reprRenderObjects.set(repr, newRO) - scene.update(repr.renderObjects, false) - if (debugHelper.isEnabled) debugHelper.update() - isUpdating = false - - runTask(scene.commit()).then(() => { - if (cameraResetRequested && !scene.isCommiting) { - camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius) - cameraResetRequested = false - } - requestDraw(true) - reprCount.next(reprRenderObjects.size) - }) + commit(repr.renderObjects) } handleResize() @@ -313,21 +314,9 @@ namespace Canvas3D { } const renderObjects = reprRenderObjects.get(repr) if (renderObjects) { - isUpdating = true renderObjects.forEach(o => scene.remove(o)) reprRenderObjects.delete(repr) - scene.update(void 0, false) - if (debugHelper.isEnabled) debugHelper.update() - isUpdating = false - - runTask(scene.commit()).then(() => { - if (cameraResetRequested && !scene.isCommiting) { - camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius) - cameraResetRequested = false - } - requestDraw(true) - reprCount.next(reprRenderObjects.size) - }) + commit() } }, update: (repr, keepSphere) => { diff --git a/src/mol-canvas3d/helper/bounding-sphere-helper.ts b/src/mol-canvas3d/helper/bounding-sphere-helper.ts index 22a2f19bd977a720d6d04005668138e1eb925e93..2574795adff90ae182d02aac00930030103c6466 100644 --- a/src/mol-canvas3d/helper/bounding-sphere-helper.ts +++ b/src/mol-canvas3d/helper/bounding-sphere-helper.ts @@ -81,7 +81,8 @@ export class BoundingSphereHelper { } }) - this.scene.update(void 0, false); + this.scene.update(void 0, false) + this.scene.syncCommit() } syncVisibility() { diff --git a/src/mol-gl/scene.ts b/src/mol-gl/scene.ts index 69db1673ee04f8e81ff26baeab76a1e7cc5ef586..e47ae7f194970625aa738054fa9569dd7069caa6 100644 --- a/src/mol-gl/scene.ts +++ b/src/mol-gl/scene.ts @@ -61,6 +61,7 @@ interface Scene extends Object3D { update: (objects: ArrayLike<GraphicsRenderObject> | undefined, keepBoundingSphere: boolean) => void add: (o: GraphicsRenderObject) => void // Renderable<any> remove: (o: GraphicsRenderObject) => void + syncCommit: () => void commit: () => Task<void> has: (o: GraphicsRenderObject) => boolean clear: () => void @@ -151,6 +152,13 @@ namespace Scene { remove: (o: GraphicsRenderObject) => { toRemove.push(o) }, + syncCommit: () => { + for (let i = 0, il = toRemove.length; i < il; ++i) remove(toRemove[i]) + toRemove.length = 0 + for (let i = 0, il = toAdd.length; i < il; ++i) add(toAdd[i]) + toAdd.length = 0 + renderables.sort(renderableSort) + }, commit: () => { const params = { toAdd: [ ...toAdd ], toRemove: [ ...toRemove ] } toAdd.length = 0