@onerjs/core 8.31.9 → 8.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/Behaviors/Cameras/autoRotationBehavior.d.ts +4 -0
  2. package/Behaviors/Cameras/autoRotationBehavior.js +7 -0
  3. package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
  4. package/Behaviors/Cameras/bouncingBehavior.d.ts +5 -0
  5. package/Behaviors/Cameras/bouncingBehavior.js +8 -0
  6. package/Behaviors/Cameras/bouncingBehavior.js.map +1 -1
  7. package/Behaviors/Cameras/framingBehavior.d.ts +4 -0
  8. package/Behaviors/Cameras/framingBehavior.js +7 -0
  9. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  10. package/Behaviors/Cameras/interpolatingBehavior.d.ts +7 -2
  11. package/Behaviors/Cameras/interpolatingBehavior.js +12 -4
  12. package/Behaviors/Cameras/interpolatingBehavior.js.map +1 -1
  13. package/Behaviors/Meshes/attachToBoxBehavior.d.ts +5 -0
  14. package/Behaviors/Meshes/attachToBoxBehavior.js +8 -1
  15. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  16. package/Behaviors/Meshes/baseSixDofDragBehavior.d.ts +5 -2
  17. package/Behaviors/Meshes/baseSixDofDragBehavior.js +8 -0
  18. package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
  19. package/Behaviors/Meshes/fadeInOutBehavior.d.ts +5 -0
  20. package/Behaviors/Meshes/fadeInOutBehavior.js +6 -0
  21. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  22. package/Behaviors/Meshes/handConstraintBehavior.d.ts +5 -0
  23. package/Behaviors/Meshes/handConstraintBehavior.js +8 -0
  24. package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
  25. package/Behaviors/Meshes/multiPointerScaleBehavior.d.ts +5 -0
  26. package/Behaviors/Meshes/multiPointerScaleBehavior.js +8 -0
  27. package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
  28. package/Behaviors/Meshes/pointerDragBehavior.d.ts +1 -1
  29. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  30. package/Behaviors/Meshes/sixDofDragBehavior.js +1 -1
  31. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  32. package/Behaviors/Meshes/surfaceMagnetismBehavior.d.ts +5 -0
  33. package/Behaviors/Meshes/surfaceMagnetismBehavior.js +7 -0
  34. package/Behaviors/Meshes/surfaceMagnetismBehavior.js.map +1 -1
  35. package/Behaviors/behavior.d.ts +4 -0
  36. package/Behaviors/behavior.js.map +1 -1
  37. package/Cameras/geospatialCamera.d.ts +4 -5
  38. package/Cameras/geospatialCamera.js +42 -29
  39. package/Cameras/geospatialCamera.js.map +1 -1
  40. package/Cameras/geospatialCameraMovement.js +1 -1
  41. package/Cameras/geospatialCameraMovement.js.map +1 -1
  42. package/Engines/abstractEngine.js +2 -2
  43. package/Engines/abstractEngine.js.map +1 -1
  44. package/Helpers/sceneHelpers.js +1 -1
  45. package/Helpers/sceneHelpers.js.map +1 -1
  46. package/Lights/index.d.ts +1 -0
  47. package/Lights/index.js +1 -0
  48. package/Lights/index.js.map +1 -1
  49. package/Lights/lightingVolume.d.ts +89 -0
  50. package/Lights/lightingVolume.js +426 -0
  51. package/Lights/lightingVolume.js.map +1 -0
  52. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +7 -0
  53. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +19 -5
  54. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  55. package/Materials/floatingOriginMatrixOverrides.js +6 -5
  56. package/Materials/floatingOriginMatrixOverrides.js.map +1 -1
  57. package/Materials/uniformBuffer.d.ts +1 -0
  58. package/Materials/uniformBuffer.js +8 -1
  59. package/Materials/uniformBuffer.js.map +1 -1
  60. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +5 -2
  61. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +138 -45
  62. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  63. package/ShadersWGSL/gaussianSplattingDepth.fragment.d.ts +0 -1
  64. package/ShadersWGSL/gaussianSplattingDepth.fragment.js +0 -2
  65. package/ShadersWGSL/gaussianSplattingDepth.fragment.js.map +1 -1
  66. package/ShadersWGSL/lightingVolume.compute.d.ts +5 -0
  67. package/ShadersWGSL/lightingVolume.compute.js +27 -0
  68. package/ShadersWGSL/lightingVolume.compute.js.map +1 -0
  69. package/package.json +1 -1
  70. package/scene.js +6 -4
  71. package/scene.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightingVolume.js","sourceRoot":"","sources":["../../../../dev/core/src/Lights/lightingVolume.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractEngine, Engine, Nullable, RenderTargetWrapper, Scene, ShadowGenerator, WebGPUEngine } from \"core/index\";\r\nimport { AbortError } from \"core/Misc/error\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Matrix, Vector3 } from \"core/Maths/math.vector\";\r\nimport { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { ComputeShader } from \"core/Compute/computeShader\";\r\nimport { CopyTextureToTexture } from \"core/Misc/copyTextureToTexture\";\r\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { StorageBuffer } from \"core/Buffers/storageBuffer\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\n\r\nimport \"core/ShadersWGSL/lightingVolume.compute\";\r\n\r\nconst InvViewProjMatrix = new Matrix();\r\nconst TmpVec3 = new Vector3();\r\n\r\n/**\r\n * Class used to create a lighting volume from a directional light's shadow generator.\r\n */\r\nexport class LightingVolume {\r\n private readonly _engine: AbstractEngine;\r\n private readonly _scene: Scene;\r\n private readonly _mesh: Mesh;\r\n private readonly _copyTexture?: CopyTextureToTexture;\r\n private readonly _uBuffer?: UniformBuffer;\r\n private _name: string;\r\n private _cs?: ComputeShader;\r\n private _light?: DirectionalLight;\r\n private _fallbackTexture?: BaseTexture;\r\n private _storageBuffer?: StorageBuffer;\r\n private _depthCopy?: RenderTargetWrapper;\r\n private _readPixelPromise: Nullable<Promise<ArrayBufferView>> = null;\r\n private _readPixelAbortController: Nullable<AbortController> = null;\r\n private _numFrames = 0;\r\n private _firstUpdate = true;\r\n\r\n private _shadowGenerator?: ShadowGenerator;\r\n /**\r\n * The shadow generator used to create the lighting volume.\r\n */\r\n public get shadowGenerator() {\r\n return this._shadowGenerator!;\r\n }\r\n\r\n public set shadowGenerator(sg: ShadowGenerator) {\r\n const light = sg.getLight();\r\n\r\n if (!(light instanceof DirectionalLight)) {\r\n throw new Error(`LightingVolumeMesh ${this._name}: light must be a directional light`);\r\n }\r\n\r\n this._shadowGenerator = sg;\r\n this._light = light;\r\n\r\n this._createGeometry();\r\n\r\n if (!this._engine.isWebGPU) {\r\n this._createFallbackTextures();\r\n }\r\n\r\n const depthTexture = this._shadowGenerator.getShadowMap()?.depthStencilTexture;\r\n if (this._cs && depthTexture) {\r\n this._cs.setInternalTexture(\"shadowMap\", depthTexture);\r\n }\r\n }\r\n\r\n private _tesselation = 0;\r\n /**\r\n * The tesselation level of the lighting volume.\r\n */\r\n public get tesselation() {\r\n return this._tesselation;\r\n }\r\n\r\n public set tesselation(n: number) {\r\n this._tesselation = n;\r\n this._createGeometry();\r\n }\r\n\r\n private _buildFullVolume = false;\r\n /**\r\n * Indicates whether to build the full volume (true) or only the far plane (false). Default is false.\r\n */\r\n public get buildFullVolume() {\r\n return this._buildFullVolume;\r\n }\r\n\r\n public set buildFullVolume(value: boolean) {\r\n if (this._buildFullVolume === value) {\r\n return;\r\n }\r\n this._buildFullVolume = value;\r\n this._createGeometry();\r\n this._createComputeShader();\r\n }\r\n\r\n /**\r\n * The mesh used as a support for the lighting volume.\r\n * Note that this mesh is not automatically added to the scene's mesh array.\r\n * If you want to render it, you need to add it manually.\r\n */\r\n public get mesh() {\r\n return this._mesh;\r\n }\r\n\r\n private _frequency = 1;\r\n\r\n /**\r\n * The frequency (in number of times you call updateMesh) at which the lighting volume is updated.\r\n */\r\n public get frequency() {\r\n return this._frequency;\r\n }\r\n\r\n public set frequency(value: number) {\r\n this._frequency = value;\r\n this._firstUpdate = true;\r\n }\r\n\r\n /**\r\n * The name of the lighting volume.\r\n */\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n public set name(name: string) {\r\n this._name = name;\r\n if (this._mesh) {\r\n this._mesh.name = name;\r\n }\r\n }\r\n\r\n /**\r\n * Indicates whether this is the first update of the lighting volume.\r\n * If true, the volume has not yet been updated for the first time.\r\n */\r\n public get firstUpdate() {\r\n return this._firstUpdate;\r\n }\r\n\r\n /**\r\n * Creates a new LightingVolume.\r\n * @param name The name of the lighting volume.\r\n * @param scene The scene the lighting volume belongs to.\r\n * @param shadowGenerator The shadow generator used to create the lighting volume. This is optional in the constructor, but must be set before calling updateMesh.\r\n * @param tesselation The tesselation level of the lighting volume (default: 64).\r\n */\r\n constructor(name: string, scene: Scene, shadowGenerator?: ShadowGenerator, tesselation = 64) {\r\n const light = shadowGenerator ? shadowGenerator.getLight() : undefined;\r\n\r\n if (light && !(light instanceof DirectionalLight)) {\r\n throw new Error(`LightingVolumeMesh ${name}: light must be a directional light`);\r\n }\r\n\r\n this._name = name;\r\n this._shadowGenerator = shadowGenerator;\r\n this._light = light as DirectionalLight;\r\n\r\n this._engine = scene.getEngine();\r\n this._scene = scene;\r\n\r\n this._mesh = new Mesh(name, this._scene);\r\n scene.meshes.splice(scene.meshes.indexOf(this._mesh), 1);\r\n\r\n if (this._engine.isWebGPU) {\r\n this._uBuffer = new UniformBuffer(this._engine);\r\n\r\n this._uBuffer.addUniform(\"invViewProjMatrix\", 16);\r\n this._uBuffer.addUniform(\"startVertexIndex\", 1);\r\n this._uBuffer.addUniform(\"step\", 1);\r\n this._uBuffer.addUniform(\"tesselation\", 1);\r\n this._uBuffer.update();\r\n\r\n this._createComputeShader();\r\n } else {\r\n this._copyTexture = new CopyTextureToTexture(this._engine, false, true);\r\n this._createFallbackTextures();\r\n }\r\n\r\n this._tesselation = tesselation;\r\n this._createGeometry();\r\n }\r\n\r\n /**\r\n * Checks if the lighting volume is ready to be updated.\r\n * @returns True if the volume is ready to be updated.\r\n */\r\n public isReady() {\r\n let isReady = this._mesh.isReady(true);\r\n if (this._cs) {\r\n isReady = this._cs.isReady() && isReady;\r\n }\r\n return isReady;\r\n }\r\n\r\n /**\r\n * Updates the lighting volume mesh.\r\n * @param forceUpdate If true, forces the update even if the frequency condition is not met.\r\n */\r\n public update(forceUpdate = false) {\r\n if (this._tesselation === 0 || !this._shadowGenerator) {\r\n return;\r\n }\r\n\r\n if (!forceUpdate && !this._firstUpdate && (this.frequency === 0 || ++this._numFrames < this.frequency)) {\r\n return;\r\n }\r\n\r\n this._numFrames = 0;\r\n\r\n if (this._cs && this._uBuffer) {\r\n const dispatchSize = Math.ceil((this._tesselation + 1) / 8);\r\n\r\n const viewProjMatrix = this._shadowGenerator.getTransformMatrix();\r\n viewProjMatrix.invertToRef(InvViewProjMatrix);\r\n\r\n this._uBuffer.updateMatrix(\"invViewProjMatrix\", InvViewProjMatrix);\r\n this._uBuffer.update();\r\n\r\n this._engine._debugPushGroup?.(`Generate lighting volume (${this._name})`);\r\n this._cs.dispatch(dispatchSize, dispatchSize, 1);\r\n this._engine._debugPopGroup?.();\r\n\r\n this._firstUpdate = false;\r\n } else {\r\n try {\r\n void this._fallbackReadPixelAsync();\r\n } catch {\r\n this._readPixelPromise = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the lighting volume and associated resources.\r\n */\r\n public dispose() {\r\n this._readPixelAbortController?.abort(new AbortError(\"LightingVolume is disposed\"));\r\n this._readPixelAbortController = null;\r\n this._mesh.dispose();\r\n if (this._fallbackTexture) {\r\n this._fallbackTexture._texture = null;\r\n }\r\n this._fallbackTexture?.dispose();\r\n this._copyTexture?.dispose();\r\n this._storageBuffer?.dispose();\r\n this._uBuffer?.dispose();\r\n this._depthCopy?.dispose();\r\n }\r\n\r\n private _createComputeShader() {\r\n this._cs = new ComputeShader(\"createLightVolume\", this._engine, \"lightingVolume\", {\r\n bindingsMapping: {\r\n shadowMap: { group: 0, binding: 0 },\r\n params: { group: 0, binding: 1 },\r\n positions: { group: 0, binding: 2 },\r\n },\r\n defines: !this._buildFullVolume ? [\"#define KEEP_EDGES\", \"#define MOVE_FAR_DEPTH_TO_NEAR\"] : undefined,\r\n });\r\n\r\n if (this._shadowGenerator) {\r\n const depthTexture = this._shadowGenerator.getShadowMap()?.depthStencilTexture;\r\n if (depthTexture) {\r\n this._cs.setInternalTexture(\"shadowMap\", depthTexture);\r\n }\r\n }\r\n\r\n if (this._uBuffer) {\r\n this._cs.setUniformBuffer(\"params\", this._uBuffer);\r\n }\r\n if (this._storageBuffer) {\r\n this._cs.setStorageBuffer(\"positions\", this._storageBuffer);\r\n }\r\n }\r\n\r\n private _createFallbackTextures() {\r\n if (!this._shadowGenerator) {\r\n return;\r\n }\r\n\r\n this._readPixelAbortController?.abort(new AbortError(\"Fallback textures are being (re)created\"));\r\n this._readPixelAbortController = new AbortController();\r\n\r\n const mapSize = this._shadowGenerator.mapSize;\r\n\r\n this._depthCopy?.dispose();\r\n this._depthCopy = this._engine.createRenderTargetTexture(\r\n { width: mapSize, height: mapSize },\r\n {\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RED,\r\n samples: 1,\r\n label: `${this._name} - fallback internal texture`,\r\n generateDepthBuffer: false,\r\n }\r\n );\r\n\r\n this._fallbackTexture?.dispose();\r\n this._fallbackTexture = new BaseTexture(this._scene, this._depthCopy.texture);\r\n this._fallbackTexture.name = `${this._name} - fallback texture`;\r\n }\r\n\r\n private async _fallbackReadPixelAsync() {\r\n if (this._readPixelPromise || !this._fallbackTexture || !this._copyTexture) {\r\n return;\r\n }\r\n\r\n const abortController = this._readPixelAbortController;\r\n\r\n abortController?.signal.throwIfAborted();\r\n\r\n const engine = this._engine as Engine;\r\n\r\n const shadowGenerator = this._shadowGenerator;\r\n const shadowMapDepthTexture = shadowGenerator?.getShadowMap()?.depthStencilTexture;\r\n\r\n if (!shadowMapDepthTexture) {\r\n return;\r\n }\r\n\r\n // Copies the shadow map of the shadow generator into _depthCopy\r\n // That's because we can't read from a depth attachment texture in WebGL. We must first copy it to a regular texture.\r\n engine.updateTextureSamplingMode(Constants.TEXTURE_NEAREST_SAMPLINGMODE, shadowMapDepthTexture);\r\n engine.updateTextureComparisonFunction(shadowMapDepthTexture, 0);\r\n\r\n this._copyTexture.copy(shadowMapDepthTexture, this._depthCopy);\r\n\r\n engine.updateTextureComparisonFunction(shadowMapDepthTexture, Constants.LESS);\r\n\r\n // Gets the texture from GPU to CPU\r\n this._readPixelPromise = this._fallbackTexture.readPixels(0, 0, undefined, true, false);\r\n if (!this._readPixelPromise) {\r\n return;\r\n }\r\n\r\n const buffer = await this._readPixelPromise;\r\n\r\n abortController?.signal.throwIfAborted();\r\n\r\n const depthValues = buffer as Float32Array;\r\n const positions = this._mesh.getVerticesData(\"position\");\r\n const numTesselation = this._tesselation;\r\n const startPos = this._buildFullVolume ? (numTesselation + 1) * 4 * 3 : 4 * 3;\r\n const mapSize = shadowGenerator.mapSize;\r\n const step = (mapSize - 1) / numTesselation;\r\n\r\n if (!positions) {\r\n this._readPixelPromise = null;\r\n return;\r\n }\r\n\r\n const halfTesselation = numTesselation / 2;\r\n\r\n const invViewProjMatrix = shadowGenerator.getTransformMatrix().clone();\r\n invViewProjMatrix.invertToRef(invViewProjMatrix);\r\n\r\n const factor = 4;\r\n\r\n let posIndex = startPos;\r\n let stepY = 0;\r\n for (let y = 0; y < numTesselation + 1; ++y) {\r\n for (let x = 0; x < numTesselation + 1; ++x) {\r\n let depth = depthValues[Math.floor(mapSize * Math.floor(stepY) + x * step) * factor];\r\n if (!this._buildFullVolume && (depth === 1 || y === 0 || x === 0 || y === numTesselation || x === numTesselation)) {\r\n depth = 0;\r\n }\r\n\r\n TmpVec3.set((x - halfTesselation) / halfTesselation, (y - halfTesselation) / halfTesselation, -1 + 2 * depth);\r\n\r\n Vector3.TransformCoordinatesToRef(TmpVec3, invViewProjMatrix, TmpVec3);\r\n\r\n positions[posIndex] = TmpVec3.x;\r\n positions[posIndex + 1] = TmpVec3.y;\r\n positions[posIndex + 2] = TmpVec3.z;\r\n posIndex += 3;\r\n }\r\n stepY += step;\r\n }\r\n\r\n this._mesh.setVerticesData(\"position\", positions);\r\n\r\n this._readPixelPromise = null;\r\n this._firstUpdate = false;\r\n }\r\n\r\n private _createGeometry() {\r\n if (!this._light) {\r\n return;\r\n }\r\n\r\n this._tesselation = Math.max(Math.ceil(this._tesselation) & ~1, 2);\r\n\r\n const light = this._light;\r\n\r\n const min = new Vector3(light.orthoLeft, light.orthoBottom, light.shadowMinZ ?? Constants.ShadowMinZ);\r\n const max = new Vector3(light.orthoRight, light.orthoTop, light.shadowMaxZ ?? Constants.ShadowMaxZ);\r\n\r\n const invViewMatrix = Matrix.LookAtLH(light.position, light.position.add(light.direction), Vector3.UpReadOnly);\r\n invViewMatrix.invertToRef(invViewMatrix);\r\n\r\n const positions: number[] = [];\r\n const indices: number[] = [];\r\n\r\n const numTesselation = this._tesselation;\r\n const stepX = (max.x - min.x) / numTesselation;\r\n const stepY = (max.y - min.y) / numTesselation;\r\n const v = new Vector3();\r\n\r\n const startFarIndices = this._buildFullVolume ? (numTesselation + 1) * 4 : 4;\r\n\r\n if (this._buildFullVolume) {\r\n let startIndices = 0;\r\n\r\n // Right faces of the frustum\r\n for (let i = 0; i <= numTesselation; ++i) {\r\n v.set(max.x, min.y + i * stepY, min.z);\r\n\r\n const p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n if (i < numTesselation) {\r\n indices.push(startIndices + i, startFarIndices + numTesselation + (i + 1) * (numTesselation + 1), startFarIndices + numTesselation + i * (numTesselation + 1));\r\n indices.push(startIndices + i, startIndices + i + 1, startFarIndices + numTesselation + (i + 1) * (numTesselation + 1));\r\n }\r\n }\r\n\r\n const n0 = 0;\r\n const n1 = positions.length / 3 - 1;\r\n const n2 = n1 + 1;\r\n\r\n startIndices = positions.length / 3;\r\n\r\n // Left faces of the frustum\r\n for (let i = 0; i <= numTesselation; ++i) {\r\n v.set(min.x, min.y + i * stepY, min.z);\r\n\r\n const p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n if (i < numTesselation) {\r\n indices.push(startIndices + i, startFarIndices + 0 + i * (numTesselation + 1), startFarIndices + 0 + (i + 1) * (numTesselation + 1));\r\n indices.push(startIndices + i, startFarIndices + 0 + (i + 1) * (numTesselation + 1), startIndices + i + 1);\r\n }\r\n }\r\n\r\n const n3 = positions.length / 3 - 1;\r\n\r\n startIndices = positions.length / 3;\r\n\r\n // Bottom faces of the frustum\r\n for (let i = 0; i <= numTesselation; ++i) {\r\n v.set(min.x + i * stepX, min.y, min.z);\r\n\r\n const p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n if (i < numTesselation) {\r\n indices.push(startIndices + i, startIndices + i + 1, startFarIndices + i + 0 * (numTesselation + 1));\r\n indices.push(startIndices + i + 1, startFarIndices + i + 1 + 0 * (numTesselation + 1), startFarIndices + i + 0 * (numTesselation + 1));\r\n }\r\n }\r\n\r\n startIndices = positions.length / 3;\r\n\r\n // Top faces of the frustum\r\n for (let i = 0; i <= numTesselation; ++i) {\r\n v.set(min.x + i * stepX, max.y, min.z);\r\n\r\n const p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n if (i < numTesselation) {\r\n indices.push(startIndices + i, startFarIndices + i + numTesselation * (numTesselation + 1), startIndices + i + 1);\r\n indices.push(\r\n startIndices + i + 1,\r\n startFarIndices + i + numTesselation * (numTesselation + 1),\r\n startFarIndices + i + 1 + numTesselation * (numTesselation + 1)\r\n );\r\n }\r\n }\r\n\r\n startIndices = positions.length / 3;\r\n\r\n // Near faces of the frustum\r\n indices.push(n0, n2, n1);\r\n indices.push(n2, n3, n1);\r\n } else {\r\n let p: Vector3;\r\n\r\n v.set(max.x, min.y, min.z);\r\n p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n v.set(max.x, max.y, min.z);\r\n p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n v.set(min.x, min.y, min.z);\r\n p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n v.set(min.x, max.y, min.z);\r\n p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n indices.push(0, 2, 1);\r\n indices.push(2, 3, 1);\r\n }\r\n\r\n // Tesselate the far plane\r\n let y = min.y;\r\n for (let iy = 0; iy <= numTesselation; ++iy) {\r\n let x = min.x;\r\n for (let ix = 0; ix <= numTesselation; ++ix) {\r\n v.set(x, y, min.z);\r\n\r\n const p = Vector3.TransformCoordinates(v, invViewMatrix);\r\n positions.push(p.x, p.y, p.z);\r\n\r\n if (ix < numTesselation && iy < numTesselation) {\r\n indices.push(\r\n startFarIndices + ix + iy * (numTesselation + 1),\r\n startFarIndices + ix + 1 + iy * (numTesselation + 1),\r\n startFarIndices + ix + 1 + (iy + 1) * (numTesselation + 1)\r\n );\r\n indices.push(\r\n startFarIndices + ix + iy * (numTesselation + 1),\r\n startFarIndices + ix + 1 + (iy + 1) * (numTesselation + 1),\r\n startFarIndices + ix + (iy + 1) * (numTesselation + 1)\r\n );\r\n }\r\n x += stepX;\r\n }\r\n y += stepY;\r\n }\r\n\r\n if (this._uBuffer && this._cs) {\r\n const webGPUEngine = this._engine as WebGPUEngine;\r\n\r\n this._storageBuffer?.dispose();\r\n this._storageBuffer = new StorageBuffer(webGPUEngine, positions.length * 4, Constants.BUFFER_CREATIONFLAG_VERTEX | Constants.BUFFER_CREATIONFLAG_READWRITE);\r\n\r\n this._storageBuffer.update(positions);\r\n\r\n const vertexBuffer = new VertexBuffer(webGPUEngine, this._storageBuffer.getBuffer(), \"position\");\r\n\r\n this._mesh.setVerticesBuffer(vertexBuffer);\r\n\r\n this._cs.setStorageBuffer(\"positions\", this._storageBuffer);\r\n\r\n this._uBuffer.updateUInt(\"startVertexIndex\", this._buildFullVolume ? (numTesselation + 1) * 4 * 3 : 4 * 3);\r\n this._uBuffer.updateFloat(\"step\", ((this._shadowGenerator?.mapSize ?? 128) - 1) / numTesselation);\r\n this._uBuffer.updateUInt(\"tesselation\", numTesselation);\r\n } else {\r\n this._mesh.setVerticesData(\"position\", positions);\r\n }\r\n\r\n this._mesh.setIndices(indices, positions.length / 3);\r\n }\r\n}\r\n"]}
@@ -4,6 +4,7 @@ import type { Mesh } from "../../Meshes/mesh.js";
4
4
  import type { Effect } from "../../Materials/effect.js";
5
5
  import type { Scene } from "../../scene.js";
6
6
  import type { Matrix } from "../../Maths/math.vector.js";
7
+ import type { GaussianSplattingMesh } from "../../Meshes/GaussianSplatting/gaussianSplattingMesh.js";
7
8
  import { PushMaterial } from "../../Materials/pushMaterial.js";
8
9
  import { ShadowDepthWrapper } from "../../Materials/shadowDepthWrapper.js";
9
10
  import "../../Shaders/gaussianSplatting.fragment.js";
@@ -66,6 +67,7 @@ export declare class GaussianSplattingMaterial extends PushMaterial {
66
67
  protected static _Samplers: string[];
67
68
  protected static _UniformBuffers: string[];
68
69
  protected static _Uniforms: string[];
70
+ private _sourceMesh;
69
71
  /**
70
72
  * Checks whether the material is ready to be rendered for a given mesh.
71
73
  * @param mesh The mesh to render
@@ -73,6 +75,11 @@ export declare class GaussianSplattingMaterial extends PushMaterial {
73
75
  * @returns true if all the dependencies are ready (Textures, Effects...)
74
76
  */
75
77
  isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean;
78
+ /**
79
+ * GaussianSplattingMaterial belongs to a single mesh
80
+ * @param mesh mesh this material belongs to
81
+ */
82
+ setSourceMesh(mesh: GaussianSplattingMesh): void;
76
83
  /**
77
84
  * Bind material effect for a specific Gaussian Splatting mesh
78
85
  * @param mesh Gaussian splatting mesh
@@ -58,6 +58,7 @@ export class GaussianSplattingMaterial extends PushMaterial {
58
58
  this._compensation = GaussianSplattingMaterial.Compensation;
59
59
  // set to true when material defines are dirty
60
60
  this._isDirty = false;
61
+ this._sourceMesh = null;
61
62
  this.backFaceCulling = false;
62
63
  this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene, this.shaderLanguage);
63
64
  }
@@ -119,8 +120,11 @@ export class GaussianSplattingMaterial extends PushMaterial {
119
120
  if (this._isReadyForSubMesh(subMesh)) {
120
121
  return true;
121
122
  }
123
+ if (!this._sourceMesh) {
124
+ return false;
125
+ }
122
126
  const engine = scene.getEngine();
123
- const gsMesh = mesh;
127
+ const gsMesh = this._sourceMesh;
124
128
  // Misc.
125
129
  PrepareDefinesForMisc(mesh, scene, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, false, defines, undefined, undefined, undefined, this._isVertexOutputInvariant);
126
130
  // Values that need to be evaluated on every frame
@@ -178,6 +182,13 @@ export class GaussianSplattingMaterial extends PushMaterial {
178
182
  this._isDirty = false;
179
183
  return true;
180
184
  }
185
+ /**
186
+ * GaussianSplattingMaterial belongs to a single mesh
187
+ * @param mesh mesh this material belongs to
188
+ */
189
+ setSourceMesh(mesh) {
190
+ this._sourceMesh = mesh;
191
+ }
181
192
  /**
182
193
  * Bind material effect for a specific Gaussian Splatting mesh
183
194
  * @param mesh Gaussian splatting mesh
@@ -187,10 +198,13 @@ export class GaussianSplattingMaterial extends PushMaterial {
187
198
  static BindEffect(mesh, effect, scene) {
188
199
  const engine = scene.getEngine();
189
200
  const camera = scene.activeCamera;
190
- const renderWidth = engine.getRenderWidth();
191
- const renderHeight = engine.getRenderHeight();
192
- const gsMesh = mesh;
193
- const gsMaterial = gsMesh.material;
201
+ const renderWidth = engine.getRenderWidth() * camera.viewport.width;
202
+ const renderHeight = engine.getRenderHeight() * camera.viewport.height;
203
+ const gsMaterial = mesh.material;
204
+ if (!gsMaterial._sourceMesh) {
205
+ return;
206
+ }
207
+ const gsMesh = gsMaterial._sourceMesh;
194
208
  // check if rigcamera, get number of rigs
195
209
  const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;
196
210
  effect.setFloat2("invViewport", 1 / (renderWidth / numberOfRigs), 1 / renderHeight);
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Effect, IEffectCreationOptions } from \"../../Materials/effect\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport type { GaussianSplattingMesh } from \"../../Meshes\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport { PushMaterial } from \"../../Materials/pushMaterial\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"../clipPlaneMaterialHelper\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport { ShadowDepthWrapper } from \"../../Materials/shadowDepthWrapper\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\r\n\r\nimport \"../../Shaders/gaussianSplatting.fragment\";\r\nimport \"../../Shaders/gaussianSplatting.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.vertex\";\r\nimport \"../../Shaders/gaussianSplattingDepth.fragment\";\r\nimport \"../../Shaders/gaussianSplattingDepth.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.vertex\";\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n PrepareUniformsAndSamplersList,\r\n} from \"../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefines extends MaterialDefines {\r\n public FOG = false;\r\n public THIN_INSTANCES = true;\r\n public LOGARITHMICDEPTH = false;\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public SH_DEGREE = 0;\r\n public COMPENSATION = false;\r\n\r\n /**\r\n * Constructor of the defines.\r\n */\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * GaussianSplattingMaterial material used to render Gaussian Splatting\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMaterial extends PushMaterial {\r\n /**\r\n * Instantiates a Gaussian Splatting Material in the given scene\r\n * @param name The friendly name of the material\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.backFaceCulling = false;\r\n this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage);\r\n }\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material\r\n */\r\n public static KernelSize: number = 0.3;\r\n\r\n /**\r\n * Compensation\r\n */\r\n public static Compensation: boolean = false;\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value\r\n */\r\n public kernelSize = GaussianSplattingMaterial.KernelSize;\r\n private _compensation = GaussianSplattingMaterial.Compensation;\r\n\r\n // set to true when material defines are dirty\r\n private _isDirty = false;\r\n\r\n /**\r\n * Set compensation default value is `GaussianSplattingMaterial.Compensation`\r\n */\r\n public set compensation(value: boolean) {\r\n this._isDirty = this._isDirty != value;\r\n this._compensation = value;\r\n }\r\n\r\n /**\r\n * Get compensation\r\n */\r\n public get compensation(): boolean {\r\n return this._compensation;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public override get hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns false\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns true\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n protected static _Attribs = [VertexBuffer.PositionKind, \"splatIndex0\", \"splatIndex1\", \"splatIndex2\", \"splatIndex3\"];\r\n protected static _Samplers = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\", \"shTexture0\", \"shTexture1\", \"shTexture2\"];\r\n protected static _UniformBuffers = [\"Scene\", \"Mesh\"];\r\n protected static _Uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"invViewport\",\r\n \"dataTextureSize\",\r\n \"focal\",\r\n \"eyePosition\",\r\n \"kernelSize\",\r\n \"viewDirectionFactor\",\r\n ];\r\n /**\r\n * Checks whether the material is ready to be rendered for a given mesh.\r\n * @param mesh The mesh to render\r\n * @param subMesh The submesh to check against\r\n * @returns true if all the dependencies are ready (Textures, Effects...)\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const useInstances = true;\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n let defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n\r\n if (defines && this._isDirty) {\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines();\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, true);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // SH is disabled for webGL1\r\n if (engine.version > 1 || engine.isWebGPU) {\r\n defines[\"SH_DEGREE\"] = gsMesh.shDegree;\r\n }\r\n\r\n // Compensation\r\n const splatMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n defines[\"COMPENSATION\"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation;\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines);\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: GaussianSplattingMaterial._Uniforms,\r\n uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(GaussianSplattingMaterial._Uniforms);\r\n\r\n const join = defines.toString();\r\n const effect = scene.getEngine().createEffect(\r\n \"gaussianSplatting\",\r\n <IEffectCreationOptions>{\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniformsNames: GaussianSplattingMaterial._Uniforms,\r\n uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n defines: join,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: {},\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplatting.fragment\"), import(\"../../ShadersWGSL/gaussianSplatting.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplatting.fragment\"), import(\"../../Shaders/gaussianSplatting.vertex\")]);\r\n }\r\n },\r\n },\r\n engine\r\n );\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Bind material effect for a specific Gaussian Splatting mesh\r\n * @param mesh Gaussian splatting mesh\r\n * @param effect Splatting material or node material\r\n * @param scene scene that contains mesh and camera used for rendering\r\n */\r\n public static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const camera = scene.activeCamera;\r\n\r\n const renderWidth = engine.getRenderWidth();\r\n const renderHeight = engine.getRenderHeight();\r\n\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n const gsMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n\r\n // check if rigcamera, get number of rigs\r\n const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;\r\n\r\n effect.setFloat2(\"invViewport\", 1 / (renderWidth / numberOfRigs), 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setVector3(\"viewDirectionFactor\", gsMesh.viewDirectionFactor);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n scene.bindEyePosition(effect, \"eyePosition\", true);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.shTextures) {\r\n for (let i = 0; i < gsMesh.shTextures?.length; i++) {\r\n effect.setTexture(`shTexture${i}`, gsMesh.shTextures[i]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Bind data\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n if (mustRebind) {\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n GaussianSplattingMaterial.BindEffect(mesh, this._activeEffect, scene);\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper {\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepth\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n }\r\n );\r\n\r\n const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {\r\n standalone: true,\r\n });\r\n\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const effect = shaderMaterial.getEffect()!;\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n shaderMaterial.bindView(effect);\r\n shaderMaterial.bindViewProjection(effect);\r\n\r\n const shadowmapWidth = scene.getEngine().getRenderWidth();\r\n const shadowmapHeight = scene.getEngine().getRenderHeight();\r\n effect.setFloat2(\"invViewport\", 1 / shadowmapWidth, 1 / shadowmapHeight);\r\n\r\n const projection = scene.getProjectionMatrix();\r\n const t = projection.m[5];\r\n const focal = (shadowmapWidth * t) / 2.0;\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n }\r\n });\r\n\r\n return shadowDepthWrapper;\r\n }\r\n\r\n /**\r\n * Clones the material.\r\n * @param name The cloned name.\r\n * @returns The cloned material.\r\n */\r\n public override clone(name: string): GaussianSplattingMaterial {\r\n return SerializationHelper.Clone(() => new GaussianSplattingMaterial(name, this.getScene()), this);\r\n }\r\n\r\n /**\r\n * Serializes the current material to its JSON representation.\r\n * @returns The JSON representation.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GaussianSplattingMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns \"GaussianSplattingMaterial\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a Gaussian Splatting material.\r\n * @param source The JSON data to parse\r\n * @param scene The scene to create the parsed material in\r\n * @param rootUrl The root url of the assets the material depends upon\r\n * @returns the instantiated GaussianSplattingMaterial.\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial {\r\n return SerializationHelper.Parse(() => new GaussianSplattingMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianSplattingMaterial\", GaussianSplattingMaterial);\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Effect, IEffectCreationOptions } from \"../../Materials/effect\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport type { GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport { PushMaterial } from \"../../Materials/pushMaterial\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"../clipPlaneMaterialHelper\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport { ShadowDepthWrapper } from \"../../Materials/shadowDepthWrapper\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\r\n\r\nimport \"../../Shaders/gaussianSplatting.fragment\";\r\nimport \"../../Shaders/gaussianSplatting.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.vertex\";\r\nimport \"../../Shaders/gaussianSplattingDepth.fragment\";\r\nimport \"../../Shaders/gaussianSplattingDepth.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.vertex\";\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n PrepareUniformsAndSamplersList,\r\n} from \"../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefines extends MaterialDefines {\r\n public FOG = false;\r\n public THIN_INSTANCES = true;\r\n public LOGARITHMICDEPTH = false;\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public SH_DEGREE = 0;\r\n public COMPENSATION = false;\r\n\r\n /**\r\n * Constructor of the defines.\r\n */\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * GaussianSplattingMaterial material used to render Gaussian Splatting\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMaterial extends PushMaterial {\r\n /**\r\n * Instantiates a Gaussian Splatting Material in the given scene\r\n * @param name The friendly name of the material\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.backFaceCulling = false;\r\n this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage);\r\n }\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material\r\n */\r\n public static KernelSize: number = 0.3;\r\n\r\n /**\r\n * Compensation\r\n */\r\n public static Compensation: boolean = false;\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value\r\n */\r\n public kernelSize = GaussianSplattingMaterial.KernelSize;\r\n private _compensation = GaussianSplattingMaterial.Compensation;\r\n\r\n // set to true when material defines are dirty\r\n private _isDirty = false;\r\n\r\n /**\r\n * Set compensation default value is `GaussianSplattingMaterial.Compensation`\r\n */\r\n public set compensation(value: boolean) {\r\n this._isDirty = this._isDirty != value;\r\n this._compensation = value;\r\n }\r\n\r\n /**\r\n * Get compensation\r\n */\r\n public get compensation(): boolean {\r\n return this._compensation;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public override get hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns false\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns true\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n protected static _Attribs = [VertexBuffer.PositionKind, \"splatIndex0\", \"splatIndex1\", \"splatIndex2\", \"splatIndex3\"];\r\n protected static _Samplers = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\", \"shTexture0\", \"shTexture1\", \"shTexture2\"];\r\n protected static _UniformBuffers = [\"Scene\", \"Mesh\"];\r\n protected static _Uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"invViewport\",\r\n \"dataTextureSize\",\r\n \"focal\",\r\n \"eyePosition\",\r\n \"kernelSize\",\r\n \"viewDirectionFactor\",\r\n ];\r\n private _sourceMesh: GaussianSplattingMesh | null = null;\r\n /**\r\n * Checks whether the material is ready to be rendered for a given mesh.\r\n * @param mesh The mesh to render\r\n * @param subMesh The submesh to check against\r\n * @returns true if all the dependencies are ready (Textures, Effects...)\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const useInstances = true;\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n let defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n\r\n if (defines && this._isDirty) {\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines();\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n if (!this._sourceMesh) {\r\n return false;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n const gsMesh = this._sourceMesh;\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, true);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // SH is disabled for webGL1\r\n if (engine.version > 1 || engine.isWebGPU) {\r\n defines[\"SH_DEGREE\"] = gsMesh.shDegree;\r\n }\r\n\r\n // Compensation\r\n const splatMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n defines[\"COMPENSATION\"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation;\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines);\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: GaussianSplattingMaterial._Uniforms,\r\n uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(GaussianSplattingMaterial._Uniforms);\r\n\r\n const join = defines.toString();\r\n const effect = scene.getEngine().createEffect(\r\n \"gaussianSplatting\",\r\n <IEffectCreationOptions>{\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniformsNames: GaussianSplattingMaterial._Uniforms,\r\n uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n defines: join,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: {},\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplatting.fragment\"), import(\"../../ShadersWGSL/gaussianSplatting.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplatting.fragment\"), import(\"../../Shaders/gaussianSplatting.vertex\")]);\r\n }\r\n },\r\n },\r\n engine\r\n );\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * GaussianSplattingMaterial belongs to a single mesh\r\n * @param mesh mesh this material belongs to\r\n */\r\n public setSourceMesh(mesh: GaussianSplattingMesh) {\r\n this._sourceMesh = mesh;\r\n }\r\n /**\r\n * Bind material effect for a specific Gaussian Splatting mesh\r\n * @param mesh Gaussian splatting mesh\r\n * @param effect Splatting material or node material\r\n * @param scene scene that contains mesh and camera used for rendering\r\n */\r\n public static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const camera = scene.activeCamera;\r\n\r\n const renderWidth = engine.getRenderWidth() * camera!.viewport.width;\r\n const renderHeight = engine.getRenderHeight() * camera!.viewport.height;\r\n\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n\r\n if (!gsMaterial._sourceMesh) {\r\n return;\r\n }\r\n\r\n const gsMesh = gsMaterial._sourceMesh;\r\n\r\n // check if rigcamera, get number of rigs\r\n const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;\r\n\r\n effect.setFloat2(\"invViewport\", 1 / (renderWidth / numberOfRigs), 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setVector3(\"viewDirectionFactor\", gsMesh.viewDirectionFactor);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n scene.bindEyePosition(effect, \"eyePosition\", true);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.shTextures) {\r\n for (let i = 0; i < gsMesh.shTextures?.length; i++) {\r\n effect.setTexture(`shTexture${i}`, gsMesh.shTextures[i]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Bind data\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n if (mustRebind) {\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n GaussianSplattingMaterial.BindEffect(mesh, this._activeEffect, scene);\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper {\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepth\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n }\r\n );\r\n\r\n const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {\r\n standalone: true,\r\n });\r\n\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const effect = shaderMaterial.getEffect()!;\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n shaderMaterial.bindView(effect);\r\n shaderMaterial.bindViewProjection(effect);\r\n\r\n const shadowmapWidth = scene.getEngine().getRenderWidth();\r\n const shadowmapHeight = scene.getEngine().getRenderHeight();\r\n effect.setFloat2(\"invViewport\", 1 / shadowmapWidth, 1 / shadowmapHeight);\r\n\r\n const projection = scene.getProjectionMatrix();\r\n const t = projection.m[5];\r\n const focal = (shadowmapWidth * t) / 2.0;\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n }\r\n });\r\n\r\n return shadowDepthWrapper;\r\n }\r\n\r\n /**\r\n * Clones the material.\r\n * @param name The cloned name.\r\n * @returns The cloned material.\r\n */\r\n public override clone(name: string): GaussianSplattingMaterial {\r\n return SerializationHelper.Clone(() => new GaussianSplattingMaterial(name, this.getScene()), this);\r\n }\r\n\r\n /**\r\n * Serializes the current material to its JSON representation.\r\n * @returns The JSON representation.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GaussianSplattingMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns \"GaussianSplattingMaterial\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a Gaussian Splatting material.\r\n * @param source The JSON data to parse\r\n * @param scene The scene to create the parsed material in\r\n * @param rootUrl The root url of the assets the material depends upon\r\n * @returns the instantiated GaussianSplattingMaterial.\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial {\r\n return SerializationHelper.Parse(() => new GaussianSplattingMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianSplattingMaterial\", GaussianSplattingMaterial);\r\n"]}
@@ -119,19 +119,20 @@ function GetOffsetMatrix(uniformName, mat) {
119
119
  // Node material blocks uniforms are formatted u_BlockName, with trailing numbers if there are multiple blocks of the same name
120
120
  // Check u_ first so that we can early out for non-node material uniforms
121
121
  if (uniformName.startsWith("u_")) {
122
- if (uniformName.startsWith("u_WorldViewProjection")) {
122
+ const lowercaseUniformName = uniformName.toLowerCase();
123
+ if (lowercaseUniformName.startsWith("u_worldviewprojection")) {
123
124
  return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);
124
125
  }
125
- if (uniformName.startsWith("u_ViewProjection")) {
126
+ if (lowercaseUniformName.startsWith("u_viewprojection")) {
126
127
  return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);
127
128
  }
128
- if (uniformName.startsWith("u_WorldView")) {
129
+ if (lowercaseUniformName.startsWith("u_worldview")) {
129
130
  return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);
130
131
  }
131
- if (uniformName.startsWith("u_World")) {
132
+ if (lowercaseUniformName.startsWith("u_world")) {
132
133
  return OffsetWorldToRef(offset, mat, TempFinalMat);
133
134
  }
134
- if (uniformName.startsWith("u_View")) {
135
+ if (lowercaseUniformName.startsWith("u_view")) {
135
136
  return OffsetViewToRef(offset, mat, TempFinalMat);
136
137
  }
137
138
  }
@@ -1 +1 @@
1
- {"version":3,"file":"floatingOriginMatrixOverrides.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/floatingOriginMatrixOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAGxG,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,YAAY,GAAW,IAAI,MAAM,EAAE,CAAC;AAC1C,MAAM,QAAQ,GAAW,IAAI,MAAM,EAAE,CAAC;AACtC,MAAM,QAAQ,GAAW,IAAI,MAAM,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACtC,QAAQ,EAAE,GAAG,EAAE,CAAC,SAA8B;IAC9C,WAAW,EAAE,IAAI,EAAE,+GAA+G;CACrI,CAAC;AAEF,SAAS,gBAAgB,CAAC,MAAoB,EAAE,KAAiC,EAAE,GAAW;IAC1F,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IACzB,GAAG,CAAC,aAAa,EAAE,CAAC;IACpB,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoB,EAAE,UAAsC,EAAE,GAAgB;IACrG,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,kDAAkD;IAC3F,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,uCAAuC;IACrF,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,gCAAgC;IAClE,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB,EAAE,IAAgC,EAAE,GAAW;IAC/F,iIAAiI;IACjI,IAAI,CAAC,0BAA0B,CAAC,WAAW,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,GAAG,CAAC,aAAa,EAAE,CAAC;IACpB,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAoB,EAAE,IAAgC,EAAE,UAAsC,EAAE,GAAW;IAC1I,qBAAqB,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAe,EAAE,KAAY,EAAE,GAAU;IAC1E,6DAA6D;IAC7D,qEAAqE;IACrE,8BAA8B;IAC9B,kCAAkC;IAClC,8CAA8C;IAC9C,mCAAmC;IACnC,8BAA8B;IAC9B,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CACtC,MAAoB,EACpB,YAA2B,EAC3B,kBAAiC,EACjC,MAAc,EACd,WAAyB;IAEzB,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC;QAC/D,gCAAgC,CAAC,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjH,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAoB,EAAE,SAAqC,EAAE,IAAgC,EAAE,GAAW;IACpI,8CAA8C;IAC9C,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,yBAAyB;IAC5D,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,2CAA2C;IAEjG,iDAAiD;IACjD,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,yBAAyB;IACvE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,wBAAwB;IACjE,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE/C,OAAO,GAAG,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC5C,MAAoB,EACpB,UAAsC,EACtC,gBAA4C,EAC5C,GAAgB;IAEhB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAChD,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,8BAA8B,CACnC,MAAoB,EACpB,mBAA+C,EAC/C,cAA0C,EAC1C,IAAgC,EAChC,UAAsC,EACtC,GAAgB;IAEhB,8EAA8E;IAC9E,sEAAsE;IACtE,iBAAiB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,yCAAyC;IACtF,qBAAqB,CAAC,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,2CAA2C;IAE3G,qEAAqE;IACrE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,yBAAyB;IACvE,yBAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,kCAAkC;IACjG,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE/C,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,WAAmB,EAAE,GAAgB;IAC1D,MAAM,KAAK,GAAG,0BAA0B,CAAC,QAAQ,EAAE,CAAC;IACpD,kEAAkE;IAClE,qKAAqK;IACrK,IAAI,CAAC,KAAK,IAAI,YAAY,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC;IACf,CAAC;IACD,YAAY,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IACzC,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC;IAC1C,QAAQ,WAAW,EAAE,CAAC;QAClB,KAAK,OAAO;YACR,OAAO,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QACvD,KAAK,MAAM;YACP,OAAO,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QACtD,KAAK,WAAW;YACZ,OAAO,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;QAClF,KAAK,gBAAgB;YACjB,OAAO,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;QAC/G,KAAK,qBAAqB;YACtB,OAAO,8BAA8B,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;QACrJ;YACI,+HAA+H;YAC/H,yEAAyE;YACzE,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,IAAI,WAAW,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;oBAClD,OAAO,8BAA8B,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;gBACrJ,CAAC;gBACD,IAAI,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC7C,OAAO,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;gBAC/G,CAAC;gBACD,IAAI,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;oBACxC,OAAO,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;gBAClF,CAAC;gBACD,IAAI,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBACpC,OAAO,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;gBACvD,CAAC;gBACD,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnC,OAAO,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;gBACtD,CAAC;YACL,CAAC;YACD,OAAO,GAAG,CAAC;IACnB,CAAC;AACL,CAAC;AAED,wFAAwF;AACxF,MAAM,qBAAqB,GAAG,aAAoB,CAAC;AACnD,MAAM,cAAc,GAAG,MAAa,CAAC;AACrC,MAAM,8BAA8B,GAAG,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,CAAC;AAC/F,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;AAErD,MAAM,UAAU,oBAAoB;IAChC,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,iBAAiB,CAAC;IAC/C,cAAc,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAC9C,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,GAAG,8BAA8B,CAAC;IACzF,qBAAqB,CAAC,SAAS,CAAC,+BAA+B,GAAG,SAAS,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,uBAAuB;IACnC,cAAc,CAAC,SAAS,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;IAChE,cAAc,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,WAAmB,EAAE,MAAmB;QACnF,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,qBAAqB,CAAC,SAAS,CAAC,+BAA+B,GAAG,8BAA8B,CAAC;IACjG,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,GAAG,UAAU,WAAmB,EAAE,MAAmB;QACxG,IAAI,CAAC,+BAA+B,CAAC,WAAW,EAAE,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC;AACN,CAAC","sourcesContent":["import { Effect } from \"../Materials/effect\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { IMatrixLike, IVector3Like } from \"../Maths/math.like\";\r\nimport { InvertMatrixToRef, MultiplyMatricesToRef } from \"../Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { DeepImmutable } from \"../types\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\nconst TempFinalMat: Matrix = new Matrix();\r\nconst TempMat1: Matrix = new Matrix();\r\nconst TempMat2: Matrix = new Matrix();\r\n\r\n/**\r\n * When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions\r\n */\r\nexport const FloatingOriginCurrentScene = {\r\n getScene: () => undefined as Scene | undefined,\r\n eyeAtCamera: true, // When true, we can assume viewMatrix translation is at origin. Otherwise, we must do full offset calculations\r\n};\r\n\r\nfunction OffsetWorldToRef(offset: IVector3Like, world: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n const refArray = ref.asArray();\r\n const worldArray = world.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = worldArray[i];\r\n }\r\n refArray[12] -= offset.x;\r\n refArray[13] -= offset.y;\r\n refArray[14] -= offset.z;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction GetFullOffsetView(offset: IVector3Like, viewMatrix: DeepImmutable<IMatrixLike>, ref: IMatrixLike) {\r\n InvertMatrixToRef(viewMatrix, TempMat1); // TempMat1 = light world matrix (inverse of view)\r\n OffsetWorldToRef(offset, TempMat1, TempMat2); // TempMat2 = offset light world matrix\r\n InvertMatrixToRef(TempMat2, ref); // TempMat1 = offset view matrix\r\n return ref;\r\n}\r\n\r\nexport function OffsetViewToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // When eye is not at camera, we cannot assume the translation of view matrix is at origin, so we perform full offset calculation\r\n if (!FloatingOriginCurrentScene.eyeAtCamera) {\r\n return GetFullOffsetView(offset, view, ref);\r\n }\r\n const refArray = ref.asArray();\r\n const viewArray = view.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = viewArray[i];\r\n }\r\n refArray[12] = 0;\r\n refArray[13] = 0;\r\n refArray[14] = 0;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewProjectionToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, projection: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n MultiplyMatricesToRef(OffsetViewToRef(offset, view, ref), projection, ref);\r\n return ref;\r\n}\r\n\r\nexport function OffsetClipPlaneToRef(offset: Vector3, plane: Plane, ref: Plane): Plane {\r\n // Original clipplane is using equation normal.dot(p) + d = 0\r\n // Assume we have p' = p - offset, that means normal.dot(p') + d' = 0\r\n // So to get the offset plane,\r\n // normal.dot(p' + offset) + d = 0\r\n // normal.dot(p') + normal.dot(offset) + d = 0\r\n // -d' + normal.dot(offset) + d = 0\r\n // d' = d + normal.dot(offset)\r\n ref.normal.copyFrom(plane.normal);\r\n ref.d = plane.d + Vector3.Dot(plane.normal, offset);\r\n return ref;\r\n}\r\n\r\nexport function GetOffsetTransformMatrices(\r\n offset: IVector3Like,\r\n viewMatrices: Array<Matrix>,\r\n projectionMatrices: Array<Matrix>,\r\n length: number,\r\n resultArray: Float32Array\r\n): Float32Array {\r\n for (let cascadeIndex = 0; cascadeIndex < length; ++cascadeIndex) {\r\n GetFullOffsetViewProjectionToRef(offset, viewMatrices[cascadeIndex], projectionMatrices[cascadeIndex], TempMat1);\r\n TempMat1.copyToArray(resultArray, cascadeIndex * 16);\r\n }\r\n return resultArray;\r\n}\r\n\r\nfunction OffsetWorldViewToRef(offset: IVector3Like, worldView: DeepImmutable<IMatrixLike>, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // ( world * view ) * inverse ( view ) = world\r\n InvertMatrixToRef(view, TempMat1); // TempMat1 = inverseView\r\n MultiplyMatricesToRef(worldView, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetView ) = offsetWorldView\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewToRef(offset, view, TempMat2); // TempMat2 = offsetView\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nexport function GetFullOffsetViewProjectionToRef(\r\n offset: IVector3Like,\r\n viewMatrix: DeepImmutable<IMatrixLike>,\r\n projectionMatrix: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n GetFullOffsetView(offset, viewMatrix, TempMat2);\r\n MultiplyMatricesToRef(TempMat2, projectionMatrix, ref);\r\n return ref;\r\n}\r\n\r\nfunction OffsetWorldViewProjectionToRef(\r\n offset: IVector3Like,\r\n worldViewProjection: DeepImmutable<IMatrixLike>,\r\n viewProjection: DeepImmutable<IMatrixLike>,\r\n view: DeepImmutable<IMatrixLike>,\r\n projection: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n // ( world * view * projection ) * inverse(projection) * inverse(view) = world\r\n // ( world * view * projection ) * inverse (view * projection) = world\r\n InvertMatrixToRef(viewProjection, TempMat1); // TempMat1 = inverse (view * projection)\r\n MultiplyMatricesToRef(worldViewProjection, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetViewProjection) = offsetWorldViewProjection\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewProjectionToRef(offset, view, projection, TempMat2); // TempMat2 = offsetViewProjection\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nfunction GetOffsetMatrix(uniformName: string, mat: IMatrixLike): IMatrixLike {\r\n const scene = FloatingOriginCurrentScene.getScene();\r\n // Early out for scenes that don't have floatingOriginMode enabled\r\n // Effect.setMatrix will call pipelineContext.setMatrix. In WebGPU, this will in turn call ubo.updateMatrix. To avoid double offset, early out if mat is TempFinalMat\r\n if (!scene || TempFinalMat === mat) {\r\n return mat;\r\n }\r\n TempFinalMat.updateFlag = mat.updateFlag;\r\n const offset = scene.floatingOriginOffset;\r\n switch (uniformName) {\r\n case \"world\":\r\n return OffsetWorldToRef(offset, mat, TempFinalMat);\r\n case \"view\":\r\n return OffsetViewToRef(offset, mat, TempFinalMat);\r\n case \"worldView\":\r\n return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);\r\n case \"viewProjection\":\r\n return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n case \"worldViewProjection\":\r\n return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n default:\r\n // Node material blocks uniforms are formatted u_BlockName, with trailing numbers if there are multiple blocks of the same name\r\n // Check u_ first so that we can early out for non-node material uniforms\r\n if (uniformName.startsWith(\"u_\")) {\r\n if (uniformName.startsWith(\"u_WorldViewProjection\")) {\r\n return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n }\r\n if (uniformName.startsWith(\"u_ViewProjection\")) {\r\n return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n }\r\n if (uniformName.startsWith(\"u_WorldView\")) {\r\n return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);\r\n }\r\n if (uniformName.startsWith(\"u_World\")) {\r\n return OffsetWorldToRef(offset, mat, TempFinalMat);\r\n }\r\n if (uniformName.startsWith(\"u_View\")) {\r\n return OffsetViewToRef(offset, mat, TempFinalMat);\r\n }\r\n }\r\n return mat;\r\n }\r\n}\r\n\r\n// ---- Overriding the prototypes of effect and uniformBuffer's setMatrix functions ----\r\nconst UniformBufferInternal = UniformBuffer as any;\r\nconst EffectInternal = Effect as any;\r\nconst OriginalUpdateMatrixForUniform = UniformBufferInternal.prototype._updateMatrixForUniform;\r\nconst OriginalSetMatrix = Effect.prototype.setMatrix;\r\n\r\nexport function ResetMatrixFunctions() {\r\n Effect.prototype.setMatrix = OriginalSetMatrix;\r\n EffectInternal._setMatrixOverride = undefined;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = undefined;\r\n}\r\n\r\nexport function OverrideMatrixFunctions() {\r\n EffectInternal.prototype._setMatrixOverride = OriginalSetMatrix;\r\n EffectInternal.prototype.setMatrix = function (uniformName: string, matrix: IMatrixLike) {\r\n this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n return this;\r\n };\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName: string, matrix: IMatrixLike) {\r\n this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"floatingOriginMatrixOverrides.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/floatingOriginMatrixOverrides.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"../Materials/effect\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport type { IMatrixLike, IVector3Like } from \"../Maths/math.like\";\r\nimport { InvertMatrixToRef, MultiplyMatricesToRef } from \"../Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { DeepImmutable } from \"../types\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\nimport type { Plane } from \"../Maths/math.plane\";\r\n\r\nconst TempFinalMat: Matrix = new Matrix();\r\nconst TempMat1: Matrix = new Matrix();\r\nconst TempMat2: Matrix = new Matrix();\r\n\r\n/**\r\n * When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions\r\n */\r\nexport const FloatingOriginCurrentScene = {\r\n getScene: () => undefined as Scene | undefined,\r\n eyeAtCamera: true, // When true, we can assume viewMatrix translation is at origin. Otherwise, we must do full offset calculations\r\n};\r\n\r\nfunction OffsetWorldToRef(offset: IVector3Like, world: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n const refArray = ref.asArray();\r\n const worldArray = world.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = worldArray[i];\r\n }\r\n refArray[12] -= offset.x;\r\n refArray[13] -= offset.y;\r\n refArray[14] -= offset.z;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction GetFullOffsetView(offset: IVector3Like, viewMatrix: DeepImmutable<IMatrixLike>, ref: IMatrixLike) {\r\n InvertMatrixToRef(viewMatrix, TempMat1); // TempMat1 = light world matrix (inverse of view)\r\n OffsetWorldToRef(offset, TempMat1, TempMat2); // TempMat2 = offset light world matrix\r\n InvertMatrixToRef(TempMat2, ref); // TempMat1 = offset view matrix\r\n return ref;\r\n}\r\n\r\nexport function OffsetViewToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // When eye is not at camera, we cannot assume the translation of view matrix is at origin, so we perform full offset calculation\r\n if (!FloatingOriginCurrentScene.eyeAtCamera) {\r\n return GetFullOffsetView(offset, view, ref);\r\n }\r\n const refArray = ref.asArray();\r\n const viewArray = view.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = viewArray[i];\r\n }\r\n refArray[12] = 0;\r\n refArray[13] = 0;\r\n refArray[14] = 0;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewProjectionToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, projection: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n MultiplyMatricesToRef(OffsetViewToRef(offset, view, ref), projection, ref);\r\n return ref;\r\n}\r\n\r\nexport function OffsetClipPlaneToRef(offset: Vector3, plane: Plane, ref: Plane): Plane {\r\n // Original clipplane is using equation normal.dot(p) + d = 0\r\n // Assume we have p' = p - offset, that means normal.dot(p') + d' = 0\r\n // So to get the offset plane,\r\n // normal.dot(p' + offset) + d = 0\r\n // normal.dot(p') + normal.dot(offset) + d = 0\r\n // -d' + normal.dot(offset) + d = 0\r\n // d' = d + normal.dot(offset)\r\n ref.normal.copyFrom(plane.normal);\r\n ref.d = plane.d + Vector3.Dot(plane.normal, offset);\r\n return ref;\r\n}\r\n\r\nexport function GetOffsetTransformMatrices(\r\n offset: IVector3Like,\r\n viewMatrices: Array<Matrix>,\r\n projectionMatrices: Array<Matrix>,\r\n length: number,\r\n resultArray: Float32Array\r\n): Float32Array {\r\n for (let cascadeIndex = 0; cascadeIndex < length; ++cascadeIndex) {\r\n GetFullOffsetViewProjectionToRef(offset, viewMatrices[cascadeIndex], projectionMatrices[cascadeIndex], TempMat1);\r\n TempMat1.copyToArray(resultArray, cascadeIndex * 16);\r\n }\r\n return resultArray;\r\n}\r\n\r\nfunction OffsetWorldViewToRef(offset: IVector3Like, worldView: DeepImmutable<IMatrixLike>, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // ( world * view ) * inverse ( view ) = world\r\n InvertMatrixToRef(view, TempMat1); // TempMat1 = inverseView\r\n MultiplyMatricesToRef(worldView, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetView ) = offsetWorldView\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewToRef(offset, view, TempMat2); // TempMat2 = offsetView\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nexport function GetFullOffsetViewProjectionToRef(\r\n offset: IVector3Like,\r\n viewMatrix: DeepImmutable<IMatrixLike>,\r\n projectionMatrix: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n GetFullOffsetView(offset, viewMatrix, TempMat2);\r\n MultiplyMatricesToRef(TempMat2, projectionMatrix, ref);\r\n return ref;\r\n}\r\n\r\nfunction OffsetWorldViewProjectionToRef(\r\n offset: IVector3Like,\r\n worldViewProjection: DeepImmutable<IMatrixLike>,\r\n viewProjection: DeepImmutable<IMatrixLike>,\r\n view: DeepImmutable<IMatrixLike>,\r\n projection: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n // ( world * view * projection ) * inverse(projection) * inverse(view) = world\r\n // ( world * view * projection ) * inverse (view * projection) = world\r\n InvertMatrixToRef(viewProjection, TempMat1); // TempMat1 = inverse (view * projection)\r\n MultiplyMatricesToRef(worldViewProjection, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetViewProjection) = offsetWorldViewProjection\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewProjectionToRef(offset, view, projection, TempMat2); // TempMat2 = offsetViewProjection\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nfunction GetOffsetMatrix(uniformName: string, mat: IMatrixLike): IMatrixLike {\r\n const scene = FloatingOriginCurrentScene.getScene();\r\n // Early out for scenes that don't have floatingOriginMode enabled\r\n // Effect.setMatrix will call pipelineContext.setMatrix. In WebGPU, this will in turn call ubo.updateMatrix. To avoid double offset, early out if mat is TempFinalMat\r\n if (!scene || TempFinalMat === mat) {\r\n return mat;\r\n }\r\n TempFinalMat.updateFlag = mat.updateFlag;\r\n const offset = scene.floatingOriginOffset;\r\n switch (uniformName) {\r\n case \"world\":\r\n return OffsetWorldToRef(offset, mat, TempFinalMat);\r\n case \"view\":\r\n return OffsetViewToRef(offset, mat, TempFinalMat);\r\n case \"worldView\":\r\n return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);\r\n case \"viewProjection\":\r\n return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n case \"worldViewProjection\":\r\n return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n default:\r\n // Node material blocks uniforms are formatted u_BlockName, with trailing numbers if there are multiple blocks of the same name\r\n // Check u_ first so that we can early out for non-node material uniforms\r\n if (uniformName.startsWith(\"u_\")) {\r\n const lowercaseUniformName = uniformName.toLowerCase();\r\n if (lowercaseUniformName.startsWith(\"u_worldviewprojection\")) {\r\n return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n }\r\n if (lowercaseUniformName.startsWith(\"u_viewprojection\")) {\r\n return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n }\r\n if (lowercaseUniformName.startsWith(\"u_worldview\")) {\r\n return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);\r\n }\r\n if (lowercaseUniformName.startsWith(\"u_world\")) {\r\n return OffsetWorldToRef(offset, mat, TempFinalMat);\r\n }\r\n if (lowercaseUniformName.startsWith(\"u_view\")) {\r\n return OffsetViewToRef(offset, mat, TempFinalMat);\r\n }\r\n }\r\n return mat;\r\n }\r\n}\r\n\r\n// ---- Overriding the prototypes of effect and uniformBuffer's setMatrix functions ----\r\nconst UniformBufferInternal = UniformBuffer as any;\r\nconst EffectInternal = Effect as any;\r\nconst OriginalUpdateMatrixForUniform = UniformBufferInternal.prototype._updateMatrixForUniform;\r\nconst OriginalSetMatrix = Effect.prototype.setMatrix;\r\n\r\nexport function ResetMatrixFunctions() {\r\n Effect.prototype.setMatrix = OriginalSetMatrix;\r\n EffectInternal._setMatrixOverride = undefined;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = undefined;\r\n}\r\n\r\nexport function OverrideMatrixFunctions() {\r\n EffectInternal.prototype._setMatrixOverride = OriginalSetMatrix;\r\n EffectInternal.prototype.setMatrix = function (uniformName: string, matrix: IMatrixLike) {\r\n this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n return this;\r\n };\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName: string, matrix: IMatrixLike) {\r\n this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n };\r\n}\r\n"]}
@@ -24,6 +24,7 @@ export declare class UniformBuffer {
24
24
  private _buffer;
25
25
  private _buffers;
26
26
  private _bufferIndex;
27
+ private _bufferUpdatedLastFrame;
27
28
  private _createBufferOnWrite;
28
29
  private _data;
29
30
  private _bufferData;
@@ -45,6 +45,7 @@ export class UniformBuffer {
45
45
  if ((trackUBOsInFrame === undefined && this._engine._features.trackUbosInFrame) || trackUBOsInFrame === true) {
46
46
  this._buffers = [];
47
47
  this._bufferIndex = -1;
48
+ this._bufferUpdatedLastFrame = false;
48
49
  this._createBufferOnWrite = false;
49
50
  this._currentFrameId = 0;
50
51
  this._trackUBOsInFrame = true;
@@ -430,6 +431,7 @@ export class UniformBuffer {
430
431
  this._copyBuffer(this._bufferData, this._buffers[this._bufferIndex][1]);
431
432
  }
432
433
  }
434
+ this._bufferUpdatedLastFrame = true;
433
435
  this._engine.updateUniformBuffer(this._buffer, this._bufferData);
434
436
  if (this._engine._features._collectUbosUpdatedInFrame) {
435
437
  if (!UniformBuffer._UpdatedUbosInFrame[this._name]) {
@@ -456,7 +458,12 @@ export class UniformBuffer {
456
458
  this._currentFrameId = this._engine.frameId;
457
459
  this._createBufferOnWrite = false;
458
460
  if (this._buffers && this._buffers.length > 0) {
459
- this._needSync = this._bufferIndex !== 0;
461
+ if (this._buffers.length === 1) {
462
+ this._needSync = !this._bufferUpdatedLastFrame;
463
+ }
464
+ else {
465
+ this._needSync = this._bufferIndex !== 0;
466
+ }
460
467
  this._bufferIndex = 0;
461
468
  this._buffer = this._buffers[this._bufferIndex][0];
462
469
  }