Skip to content
Snippets Groups Projects
Commit 48985cd4 authored by Alexander Rose's avatar Alexander Rose
Browse files

improved scene commit handling for canvas3d and debug-helper

parent dd0707a8
No related branches found
No related tags found
No related merge requests found
...@@ -139,7 +139,6 @@ namespace Canvas3D { ...@@ -139,7 +139,6 @@ namespace Canvas3D {
const postprocessing = new PostprocessingPass(webgl, camera, drawPass, p.postprocessing) const postprocessing = new PostprocessingPass(webgl, camera, drawPass, p.postprocessing)
const multiSample = new MultiSamplePass(webgl, camera, drawPass, postprocessing, p.multiSample) const multiSample = new MultiSamplePass(webgl, camera, drawPass, postprocessing, p.multiSample)
let isUpdating = false
let drawPending = false let drawPending = false
let cameraResetRequested = false let cameraResetRequested = false
...@@ -206,7 +205,7 @@ namespace Canvas3D { ...@@ -206,7 +205,7 @@ namespace Canvas3D {
} }
function render(variant: 'pick' | 'draw', force: boolean) { function render(variant: 'pick' | 'draw', force: boolean) {
if (isUpdating || scene.isCommiting) return false if (scene.isCommiting) return false
let didRender = false let didRender = false
controls.update(currentTime); controls.update(currentTime);
...@@ -266,8 +265,21 @@ namespace Canvas3D { ...@@ -266,8 +265,21 @@ namespace Canvas3D {
return pickPass.identify(x, y) 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) { function add(repr: Representation.Any) {
isUpdating = true
const oldRO = reprRenderObjects.get(repr) const oldRO = reprRenderObjects.get(repr)
const newRO = new Set<GraphicsRenderObject>() const newRO = new Set<GraphicsRenderObject>()
repr.renderObjects.forEach(o => newRO.add(o)) repr.renderObjects.forEach(o => newRO.add(o))
...@@ -281,18 +293,7 @@ namespace Canvas3D { ...@@ -281,18 +293,7 @@ namespace Canvas3D {
repr.renderObjects.forEach(o => scene.add(o)) repr.renderObjects.forEach(o => scene.add(o))
} }
reprRenderObjects.set(repr, newRO) reprRenderObjects.set(repr, newRO)
scene.update(repr.renderObjects, false) commit(repr.renderObjects)
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)
})
} }
handleResize() handleResize()
...@@ -313,21 +314,9 @@ namespace Canvas3D { ...@@ -313,21 +314,9 @@ namespace Canvas3D {
} }
const renderObjects = reprRenderObjects.get(repr) const renderObjects = reprRenderObjects.get(repr)
if (renderObjects) { if (renderObjects) {
isUpdating = true
renderObjects.forEach(o => scene.remove(o)) renderObjects.forEach(o => scene.remove(o))
reprRenderObjects.delete(repr) reprRenderObjects.delete(repr)
scene.update(void 0, false) commit()
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)
})
} }
}, },
update: (repr, keepSphere) => { update: (repr, keepSphere) => {
......
...@@ -81,7 +81,8 @@ export class BoundingSphereHelper { ...@@ -81,7 +81,8 @@ export class BoundingSphereHelper {
} }
}) })
this.scene.update(void 0, false); this.scene.update(void 0, false)
this.scene.syncCommit()
} }
syncVisibility() { syncVisibility() {
......
...@@ -61,6 +61,7 @@ interface Scene extends Object3D { ...@@ -61,6 +61,7 @@ interface Scene extends Object3D {
update: (objects: ArrayLike<GraphicsRenderObject> | undefined, keepBoundingSphere: boolean) => void update: (objects: ArrayLike<GraphicsRenderObject> | undefined, keepBoundingSphere: boolean) => void
add: (o: GraphicsRenderObject) => void // Renderable<any> add: (o: GraphicsRenderObject) => void // Renderable<any>
remove: (o: GraphicsRenderObject) => void remove: (o: GraphicsRenderObject) => void
syncCommit: () => void
commit: () => Task<void> commit: () => Task<void>
has: (o: GraphicsRenderObject) => boolean has: (o: GraphicsRenderObject) => boolean
clear: () => void clear: () => void
...@@ -151,6 +152,13 @@ namespace Scene { ...@@ -151,6 +152,13 @@ namespace Scene {
remove: (o: GraphicsRenderObject) => { remove: (o: GraphicsRenderObject) => {
toRemove.push(o) 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: () => { commit: () => {
const params = { toAdd: [ ...toAdd ], toRemove: [ ...toRemove ] } const params = { toAdd: [ ...toAdd ], toRemove: [ ...toRemove ] }
toAdd.length = 0 toAdd.length = 0
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment