From 1d13f340fec6b1108df863bcd10facd2014819e5 Mon Sep 17 00:00:00 2001 From: AlexandruPopovici Date: Thu, 12 Dec 2024 11:56:45 +0200 Subject: [PATCH] SpeckleInstancedMeshes now recrete their shadow depth material whenever the instance configuration changes --- .../src/Extensions/ExtendedSelection.ts | 2 +- packages/viewer-sandbox/src/main.ts | 7 +++++-- .../shaders/speckle-standard-colored-vert.ts | 4 ++++ .../src/modules/objects/SpeckleInstancedMesh.ts | 11 +++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/viewer-sandbox/src/Extensions/ExtendedSelection.ts b/packages/viewer-sandbox/src/Extensions/ExtendedSelection.ts index 4e2fdbcbcc..a7966d3427 100644 --- a/packages/viewer-sandbox/src/Extensions/ExtendedSelection.ts +++ b/packages/viewer-sandbox/src/Extensions/ExtendedSelection.ts @@ -138,6 +138,6 @@ export class ExtendedSelection extends SelectionExtension { ) } this.lastGizmoTranslation.copy(this.dummyAnchor.position) - this.viewer.requestRender(UpdateFlags.RENDER | UpdateFlags.SHADOWS) + this.viewer.requestRender(UpdateFlags.RENDER_RESET | UpdateFlags.SHADOWS) } } diff --git a/packages/viewer-sandbox/src/main.ts b/packages/viewer-sandbox/src/main.ts index a473e0716f..afe349945c 100644 --- a/packages/viewer-sandbox/src/main.ts +++ b/packages/viewer-sandbox/src/main.ts @@ -21,6 +21,7 @@ import { SectionTool } from '@speckle/viewer' import { SectionOutlines } from '@speckle/viewer' import { ViewModesKeys } from './Extensions/ViewModesKeys' import { BoxSelection } from './Extensions/BoxSelection' +import { ExtendedSelection } from './Extensions/ExtendedSelection' const createViewer = async (containerName: string, stream: string) => { const container = document.querySelector(containerName) @@ -45,7 +46,8 @@ const createViewer = async (containerName: string, stream: string) => { await viewer.init() const cameraController = viewer.createExtension(CameraController) - const selection = viewer.createExtension(SelectionExtension) + const selection = viewer.createExtension(ExtendedSelection) + selection.init() const sections = viewer.createExtension(SectionTool) viewer.createExtension(SectionOutlines) const measurements = viewer.createExtension(MeasurementsExtension) @@ -115,7 +117,7 @@ const getStream = () => { // 'https://app.speckle.systems/streams/da9e320dad/commits/5388ef24b8' // 'https://latest.speckle.systems/streams/58b5648c4d/commits/60371ecb2d' // 'Super' heavy revit shit - 'https://app.speckle.systems/streams/e6f9156405/commits/0694d53bb5' + // 'https://app.speckle.systems/streams/e6f9156405/commits/0694d53bb5' // IFC building (good for a tree based structure) // 'https://latest.speckle.systems/streams/92b620fb17/commits/2ebd336223' // IFC story, a subtree of the above @@ -454,6 +456,7 @@ const getStream = () => { // 'https://app.speckle.systems/projects/344f803f81/models/5582ab673e' // 'https://speckle.xyz/streams/27e89d0ad6/commits/5ed4b74252' + 'https://app.speckle.systems/projects/e89b61b65c/models/2a0995f124' ) } diff --git a/packages/viewer/src/modules/materials/shaders/speckle-standard-colored-vert.ts b/packages/viewer/src/modules/materials/shaders/speckle-standard-colored-vert.ts index e48e38e972..c08fd86301 100644 --- a/packages/viewer/src/modules/materials/shaders/speckle-standard-colored-vert.ts +++ b/packages/viewer/src/modules/materials/shaders/speckle-standard-colored-vert.ts @@ -226,6 +226,10 @@ void main() { vec4 rtePivotShadow = computeRelativePositionSeparate(tPivotLow.xyz, tPivotHigh.xyz, uShadowViewer_low, uShadowViewer_high); shadowPosition.xyz = rotate_vertex_position((shadowPosition - rtePivotShadow).xyz, tQuaternion) * tScale.xyz + rtePivotShadow.xyz + tTranslation.xyz; #endif + #ifdef USE_INSTANCING + vec4 rtePivotShadow = computeRelativePositionSeparate(ZERO3, ZERO3, uShadowViewer_low, uShadowViewer_high); + shadowPosition.xyz = (mat3(instanceMatrix) * (shadowPosition - rtePivotShadow).xyz) + rtePivotShadow.xyz + instanceMatrix[3].xyz; + #endif shadowWorldPosition = modelMatrix * shadowPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 ); vDirectionalShadowCoord[ i ] = shadowMatrix * shadowWorldPosition; diff --git a/packages/viewer/src/modules/objects/SpeckleInstancedMesh.ts b/packages/viewer/src/modules/objects/SpeckleInstancedMesh.ts index d890f67d78..8c03f99f1b 100644 --- a/packages/viewer/src/modules/objects/SpeckleInstancedMesh.ts +++ b/packages/viewer/src/modules/objects/SpeckleInstancedMesh.ts @@ -11,6 +11,7 @@ import { Object3D, Ray, Raycaster, + RGBADepthPacking, SkinnedMesh, Sphere, Triangle, @@ -29,6 +30,7 @@ import { } from '../batching/Batch.js' import { SpeckleRaycaster } from './SpeckleRaycaster.js' import Logger from '../utils/Logger.js' +import SpeckleDepthMaterial from '../materials/SpeckleDepthMaterial.js' const _inverseMatrix = new Matrix4() const _ray = new Ray() @@ -183,6 +185,7 @@ export default class SpeckleInstancedMesh extends Group { public updateDrawGroups(transformBuffer: Float32Array, gradientBuffer: Float32Array) { this.instances.forEach((value: InstancedMesh) => { this.remove(value) + value.customDepthMaterial?.dispose() value.dispose() }) this.instances.length = 0 @@ -218,6 +221,14 @@ export default class SpeckleInstancedMesh extends Group { group.instanceMatrix.needsUpdate = true group.layers.set(ObjectLayers.STREAM_CONTENT_MESH) group.frustumCulled = false + group.customDepthMaterial = new SpeckleDepthMaterial( + { + depthPacking: RGBADepthPacking + }, + ['USE_RTE', 'ALPHATEST_REJECTION'] + ) + group.castShadow = !material.transparent + group.receiveShadow = !material.transparent this.instances.push(group) this.add(group)