Skip to content

Commit

Permalink
Soft Pipeline Reset (#2452)
Browse files Browse the repository at this point in the history
* Simplified a lot from the Pipeline's render loop. UpdateFlags.Render now does not reset the pipeline. Added UpdateFlags.RESET_RENDER which resets the pipeline. Measurements now do not reset the pipeline needlessly

* Fixed sandbox lint error

* Accumulation now starts automatically based on the current accumulation frames count. SectionTool no longer resets the pipeline without a reason. Changing light paramters no longer reset s the pipeline without a reason. Clipping plane updating no longer resets the pipeline, except when the planes are actually set. Highlight and selection now no longer reset the pipeline. Explosion does reset the pipeline

* Fixed sandbox linting error
  • Loading branch information
AlexandruPopovici authored Jul 2, 2024
1 parent d944b99 commit 3c2b016
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 109 deletions.
18 changes: 9 additions & 9 deletions packages/viewer-sandbox/src/Sandbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ import {
SpeckleLoader,
ObjLoader,
UrlHelper,
LoaderEvent
LoaderEvent,
UpdateFlags
} from '@speckle/viewer'
import { FolderApi, Pane } from 'tweakpane'
import { DiffResult } from '@speckle/viewer'
Expand All @@ -24,7 +25,6 @@ import { SelectionExtension } from '@speckle/viewer'
import { FilteringExtension } from '@speckle/viewer'
import { MeasurementsExtension } from '@speckle/viewer'
import { CameraController } from '@speckle/viewer'
import { UpdateFlags } from '@speckle/viewer'
import { AssetType, Assets } from '@speckle/viewer'
import Neutral from '../assets/hdri/Neutral.png'
import Mild from '../assets/hdri/Mild.png'
Expand Down Expand Up @@ -297,12 +297,12 @@ export default class Sandbox {
// })
// const origin = unionBox.getCenter(new Vector3())
objects.forEach((obj: BatchObject) => {
// obj.transformTRS(position.value, rotation.value, scale.value, origin)
obj.position = new Vector3(
position.value.x,
position.value.y,
position.value.z
)
obj.transformTRS(position.value)
// obj.position = new Vector3(
// position.value.x,
// position.value.y,
// position.value.z
// )
})
this.viewer.requestRender()
})
Expand Down Expand Up @@ -487,7 +487,7 @@ export default class Sandbox {
this.viewer
.getExtension(CameraController)
.setCameraView({ azimuth: Math.PI / 12, polar: 0 }, false)
this.viewer.getRenderer().resetPipeline()
this.viewer.requestRender(UpdateFlags.RENDER_RESET)
await waitForAnimation(1000)
}
})
Expand Down
3 changes: 2 additions & 1 deletion packages/viewer/src/IViewer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,8 @@ export enum ObjectLayers {
export enum UpdateFlags {
RENDER = 0b1,
SHADOWS = 0b10,
CLIPPING_PLANES = 0b100
CLIPPING_PLANES = 0b100,
RENDER_RESET = 0b1000
}

export interface MaterialOptions {
Expand Down
8 changes: 4 additions & 4 deletions packages/viewer/src/modules/SpeckleRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,9 @@ export default class SpeckleRenderer {
public set clippingPlanes(value: Plane[]) {
this._clippingPlanes = value.map((value: Plane) => new Plane().copy(value))
this.updateClippingPlanes()
this.renderer.shadowMap.needsUpdate = true
this.needsRender = true
this.resetPipeline()
}

/****************
Expand Down Expand Up @@ -521,7 +524,6 @@ export default class SpeckleRenderer {
public resetPipeline() {
this._needsRender = true
this.pipeline.reset()
// if (force) this.pipeline.reset()
}

public render(): void {
Expand Down Expand Up @@ -829,8 +831,6 @@ export default class SpeckleRenderer {
})
this.pipeline.updateClippingPlanes(planes)
this._shadowcatcher?.updateClippingPlanes(planes)
this.renderer.shadowMap.needsUpdate = true
this.resetPipeline()
}

public updateShadowCatcher() {
Expand All @@ -842,7 +842,7 @@ export default class SpeckleRenderer {
this.clippingVolume,
this._renderer.capabilities.maxTextureSize
)
this.resetPipeline()
this.needsRender = true
}
}

Expand Down
8 changes: 5 additions & 3 deletions packages/viewer/src/modules/Viewer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,14 +186,17 @@ export class Viewer extends EventEmitter implements IViewer {
public requestRender(flags: UpdateFlags = UpdateFlags.RENDER) {
if (flags & UpdateFlags.RENDER) {
this.speckleRenderer.needsRender = true
this.speckleRenderer.resetPipeline()
}
if (flags & UpdateFlags.SHADOWS) {
this.speckleRenderer.shadowMapNeedsUpdate = true
}
if (flags & UpdateFlags.CLIPPING_PLANES) {
this.speckleRenderer.updateClippingPlanes()
}
if (flags & UpdateFlags.RENDER_RESET) {
this.speckleRenderer.needsRender = true
this.speckleRenderer.resetPipeline()
}
}

private frame() {
Expand Down Expand Up @@ -331,8 +334,7 @@ export class Viewer extends EventEmitter implements IViewer {
}
Logger.log(this.getRenderer().renderingStats)
Logger.log('ASYNC batch build time -> ', performance.now() - t0)
this.requestRender(UpdateFlags.RENDER | UpdateFlags.SHADOWS)
this.speckleRenderer.resetPipeline()
this.requestRender(UpdateFlags.RENDER_RESET | UpdateFlags.SHADOWS)
this.emit(ViewerEvent.LoadComplete, loader.resource)
}

Expand Down
2 changes: 1 addition & 1 deletion packages/viewer/src/modules/extensions/ExplodeExtension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ export class ExplodeExtension extends Extension {

objects[i].transformTRS(dir, undefined, undefined, undefined)
}
this.viewer.requestRender(UpdateFlags.RENDER | UpdateFlags.SHADOWS)
this.viewer.requestRender(UpdateFlags.RENDER_RESET | UpdateFlags.SHADOWS)
}
}
81 changes: 42 additions & 39 deletions packages/viewer/src/modules/extensions/SectionTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -230,53 +230,56 @@ export class SectionTool extends Extension {

private _draggingChangeHandler() {
if (!this.display.visible) return

this.boxGeometry.computeBoundingBox()
this.boxMeshHelper.box.copy(this.boxGeometry.boundingBox || new Box3())

// Dragging a side / plane
if (this.dragging && this.currentRange) {
this._generateOrUpdatePlanes()
if (this.prevPosition === null)
if (this.dragging) {
// Dragging a side / plane
if (this.currentRange) {
this._generateOrUpdatePlanes()
if (this.prevPosition === null)
this.prevPosition = this.hoverPlane.position.clone()
this.prevPosition.sub(this.hoverPlane.position)
this.prevPosition.negate()
const boxArr = this.boxGeometry.attributes.position.array as number[]
for (let i = 0; i < this.currentRange.length; i++) {
const index = this.currentRange[i]
boxArr[3 * index] += this.prevPosition.x
boxArr[3 * index + 1] += this.prevPosition.y
boxArr[3 * index + 2] += this.prevPosition.z
}

this.prevPosition = this.hoverPlane.position.clone()
this.prevPosition.sub(this.hoverPlane.position)
this.prevPosition.negate()
const boxArr = this.boxGeometry.attributes.position.array as number[]
for (let i = 0; i < this.currentRange.length; i++) {
const index = this.currentRange[i]
boxArr[3 * index] += this.prevPosition.x
boxArr[3 * index + 1] += this.prevPosition.y
boxArr[3 * index + 2] += this.prevPosition.z
this.boxGeometry.attributes.position.needsUpdate = true
this.boxGeometry.computeVertexNormals()
this.boxGeometry.computeBoundingBox()
this.boxGeometry.computeBoundingSphere()
}

this.prevPosition = this.hoverPlane.position.clone()
this.boxGeometry.attributes.position.needsUpdate = true
this.boxGeometry.computeVertexNormals()
this.boxGeometry.computeBoundingBox()
this.boxGeometry.computeBoundingSphere()
}

// Dragging the whole section box
if (this.dragging && !this.currentRange) {
this._generateOrUpdatePlanes()
if (this.prevPosition === null) this.prevPosition = this.sphere.position.clone()
this.prevPosition.sub(this.sphere.position)
this.prevPosition.negate()
const verts = this.boxGeometry.attributes.position.array as number[]
for (let i = 0; i < verts.length; i += 3) {
verts[i] += this.prevPosition.x
verts[i + 1] += this.prevPosition.y
verts[i + 2] += this.prevPosition.z
// Dragging the whole section box. This legacy bit seems to never happen ¯\_(ツ)_/¯
else {
this._generateOrUpdatePlanes()
if (this.prevPosition === null) this.prevPosition = this.sphere.position.clone()
this.prevPosition.sub(this.sphere.position)
this.prevPosition.negate()
const verts = this.boxGeometry.attributes.position.array as number[]
for (let i = 0; i < verts.length; i += 3) {
verts[i] += this.prevPosition.x
verts[i + 1] += this.prevPosition.y
verts[i + 2] += this.prevPosition.z
}
this.boxGeometry.attributes.position.needsUpdate = true
this.boxGeometry.computeVertexNormals()
this.boxGeometry.computeBoundingBox()
this.boxGeometry.computeBoundingSphere()

this.prevPosition = this.sphere.position.clone()
}
this.boxGeometry.attributes.position.needsUpdate = true
this.boxGeometry.computeVertexNormals()
this.boxGeometry.computeBoundingBox()
this.boxGeometry.computeBoundingSphere()

this.prevPosition = this.sphere.position.clone()
this.viewer.getRenderer().clippingPlanes = this.planes
this.viewer.getRenderer().clippingVolume = this.getBox()
this.emit(SectionToolEvent.Updated, this.planes)
}
this.viewer.getRenderer().clippingPlanes = this.planes
this.viewer.getRenderer().clippingVolume = this.getBox()
this.emit(SectionToolEvent.Updated, this.planes)
this.viewer.requestRender()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,7 @@ export class MeasurementsExtension extends Extension {
this._activeMeasurement.update()
if (!value) this.cancelMeasurement()
}
this.renderer.needsRender = true
this.renderer.resetPipeline()
this.viewer.requestRender()
}

public get options(): MeasurementOptions {
Expand Down Expand Up @@ -183,8 +182,7 @@ export class MeasurementsExtension extends Extension {
}
this._activeMeasurement.update()

this.renderer.needsRender = true
this.renderer.resetPipeline()
this.viewer.requestRender()
this._frameLock = true
this._sceneHit = true
// console.log('Time -> ', performance.now() - start)
Expand Down Expand Up @@ -309,8 +307,7 @@ export class MeasurementsExtension extends Extension {
protected cancelMeasurement() {
if (this._activeMeasurement) this.renderer.scene.remove(this._activeMeasurement)
this._activeMeasurement = null
this.renderer.needsRender = true
this.renderer.resetPipeline()
this.viewer.requestRender()
}

protected finishMeasurement() {
Expand All @@ -332,8 +329,7 @@ export class MeasurementsExtension extends Extension {
this.measurements.splice(this.measurements.indexOf(this._selectedMeasurement), 1)
this.renderer.scene.remove(this._selectedMeasurement)
this._selectedMeasurement = null
this.renderer.needsRender = true
this.renderer.resetPipeline()
this.viewer.requestRender()
} else {
this.cancelMeasurement()
}
Expand All @@ -357,8 +353,7 @@ export class MeasurementsExtension extends Extension {
if (flashCount >= maxFlashCount) {
clearInterval(handle)
}
this.renderer.needsRender = true
this.renderer.resetPipeline()
this.viewer.requestRender()
}
}, 100)
}
Expand Down Expand Up @@ -446,8 +441,7 @@ export class MeasurementsExtension extends Extension {
if (this._options.visible) this.raycaster.layers.enable(ObjectLayers.MEASUREMENTS)
else this.raycaster.layers.disable(ObjectLayers.MEASUREMENTS)

this.renderer.needsRender = true
this.renderer.resetPipeline()
this.viewer.requestRender()
}

public fromMeasurementData(startPoint: Vector3, endPoint: Vector3) {
Expand Down
Loading

0 comments on commit 3c2b016

Please sign in to comment.