@babylonjs/core 8.9.0 → 8.10.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 (84) hide show
  1. package/AudioV2/abstractAudio/abstractSound.d.ts +0 -7
  2. package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
  3. package/AudioV2/abstractAudio/abstractSoundSource.d.ts +6 -3
  4. package/AudioV2/abstractAudio/abstractSoundSource.js +1 -2
  5. package/AudioV2/abstractAudio/abstractSoundSource.js.map +1 -1
  6. package/AudioV2/webAudio/webAudioEngine.js +4 -1
  7. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  8. package/AudioV2/webAudio/webAudioSoundSource.js +1 -1
  9. package/AudioV2/webAudio/webAudioSoundSource.js.map +1 -1
  10. package/AudioV2/webAudio/webAudioStaticSound.js +1 -1
  11. package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
  12. package/AudioV2/webAudio/webAudioStreamingSound.js +1 -1
  13. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
  14. package/Collisions/gpuPicker.d.ts +3 -0
  15. package/Collisions/gpuPicker.js +26 -2
  16. package/Collisions/gpuPicker.js.map +1 -1
  17. package/Engines/WebGPU/webgpuCacheBindGroups.js +4 -4
  18. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  19. package/Engines/abstractEngine.js +2 -2
  20. package/Engines/abstractEngine.js.map +1 -1
  21. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +16 -1
  22. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
  23. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.d.ts +3 -0
  24. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.js +13 -0
  25. package/FrameGraph/Node/Blocks/Rendering/csmShadowGeneratorBlock.js.map +1 -1
  26. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +7 -0
  27. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +17 -0
  28. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  29. package/FrameGraph/frameGraph.d.ts +2 -0
  30. package/FrameGraph/frameGraph.js +2 -0
  31. package/FrameGraph/frameGraph.js.map +1 -1
  32. package/Gizmos/planeRotationGizmo.js +1 -1
  33. package/Gizmos/planeRotationGizmo.js.map +1 -1
  34. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +2 -4
  35. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  36. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.d.ts +8 -0
  37. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js +23 -3
  38. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js.map +1 -1
  39. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.d.ts +13 -0
  40. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js +44 -0
  41. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js.map +1 -1
  42. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js +3 -0
  43. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js.map +1 -1
  44. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +4 -1
  45. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  46. package/Materials/Node/nodeMaterialBuildState.d.ts +1 -1
  47. package/Materials/Node/nodeMaterialBuildState.js +6 -3
  48. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  49. package/Materials/Node/nodeMaterialDefault.js +6 -1
  50. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  51. package/Materials/Textures/renderTargetTexture.d.ts +4 -4
  52. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  53. package/Maths/ThinMaths/thinMath.matrix.functions.d.ts +11 -11
  54. package/Maths/ThinMaths/thinMath.matrix.functions.js.map +1 -1
  55. package/Maths/math.like.d.ts +2 -2
  56. package/Maths/math.like.js.map +1 -1
  57. package/Meshes/Builders/decalBuilder.js +3 -2
  58. package/Meshes/Builders/decalBuilder.js.map +1 -1
  59. package/Meshes/csg2.js +1 -1
  60. package/Meshes/csg2.js.map +1 -1
  61. package/Misc/minMaxReducer.js +5 -0
  62. package/Misc/minMaxReducer.js.map +1 -1
  63. package/Shaders/ShadersInclude/gaussianSplatting.js +4 -4
  64. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  65. package/Shaders/ShadersInclude/pbrBlockReflectivity.js +2 -2
  66. package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  67. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +4 -4
  68. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  69. package/Shaders/gaussianSplatting.vertex.js +3 -3
  70. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  71. package/Shaders/pbr.fragment.js +4 -1
  72. package/Shaders/pbr.fragment.js.map +1 -1
  73. package/Shaders/pbr.vertex.js +7 -2
  74. package/Shaders/pbr.vertex.js.map +1 -1
  75. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +2 -2
  76. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  77. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +2 -2
  78. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  79. package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
  80. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  81. package/package.json +1 -1
  82. package/scene.d.ts +4 -0
  83. package/scene.js +21 -15
  84. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"planeRotationGizmo.js","sourceRoot":"","sources":["../../../../dev/core/src/Gizmos/planeRotationGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { Quaternion, Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport \"../Meshes/Builders/linesBuilder\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Node } from \"../node\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { GizmoAxisCache, IGizmo } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { RotationGizmo } from \"./rotationGizmo\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder\";\r\nimport { CreateTorus } from \"../Meshes/Builders/torusBuilder\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Interface for plane rotation gizmo\r\n */\r\nexport interface IPlaneRotationGizmo extends IGizmo {\r\n /** Drag behavior responsible for the gizmos dragging interactions */\r\n dragBehavior: PointerDragBehavior;\r\n /** Drag distance in babylon units that the gizmo will snap to when dragged */\r\n snapDistance: number;\r\n /** Sensitivity factor for dragging */\r\n sensitivity: number;\r\n /**\r\n * Event that fires each time the gizmo snaps to a new location.\r\n * * snapDistance is the change in distance\r\n */\r\n onSnapObservable: Observable<{ snapDistance: number }>;\r\n /** Accumulated relative angle value for rotation on the axis. */\r\n angle: number;\r\n /** If the gizmo is enabled */\r\n isEnabled: boolean;\r\n\r\n /** Default material used to render when gizmo is not disabled or hovered */\r\n coloredMaterial: StandardMaterial;\r\n /** Material used to render when gizmo is hovered with mouse */\r\n hoverMaterial: StandardMaterial;\r\n /** Color used to render the drag angle sector when gizmo is rotated with mouse */\r\n rotationColor: Color3;\r\n /** Material used to render when gizmo is disabled. typically grey. */\r\n disableMaterial: StandardMaterial;\r\n}\r\n\r\n/**\r\n * Single plane rotation gizmo\r\n */\r\nexport class PlaneRotationGizmo extends Gizmo implements IPlaneRotationGizmo {\r\n /**\r\n * Drag behavior responsible for the gizmos dragging interactions\r\n */\r\n public dragBehavior: PointerDragBehavior;\r\n protected _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n\r\n /**\r\n * Rotation distance in radians that the gizmo will snap to (Default: 0)\r\n */\r\n public snapDistance = 0;\r\n /**\r\n * Event that fires each time the gizmo snaps to a new location.\r\n * * snapDistance is the change in distance\r\n */\r\n public onSnapObservable = new Observable<{ snapDistance: number }>();\r\n\r\n /**\r\n * The maximum angle between the camera and the rotation allowed for interaction\r\n * If a rotation plane appears 'flat', a lower value allows interaction.\r\n */\r\n public static MaxDragAngle: number = (Math.PI * 9) / 20;\r\n\r\n /**\r\n * Accumulated relative angle value for rotation on the axis. Reset to 0 when a dragStart occurs\r\n */\r\n public angle: number = 0;\r\n\r\n /**\r\n * Custom sensitivity value for the drag strength\r\n */\r\n public sensitivity = 1;\r\n\r\n /** Default material used to render when gizmo is not disabled or hovered */\r\n public get coloredMaterial() {\r\n return this._coloredMaterial;\r\n }\r\n\r\n /** Material used to render when gizmo is hovered with mouse */\r\n public get hoverMaterial() {\r\n return this._hoverMaterial;\r\n }\r\n\r\n /** Color used to render the drag angle sector when gizmo is rotated with mouse */\r\n public set rotationColor(color: Color3) {\r\n this._rotationShaderMaterial.setColor3(\"rotationColor\", color);\r\n }\r\n\r\n /** Material used to render when gizmo is disabled. typically grey. */\r\n public get disableMaterial() {\r\n return this._disableMaterial;\r\n }\r\n\r\n protected _isEnabled: boolean = true;\r\n protected _parent: Nullable<RotationGizmo> = null;\r\n protected _coloredMaterial: StandardMaterial;\r\n protected _hoverMaterial: StandardMaterial;\r\n protected _disableMaterial: StandardMaterial;\r\n protected _gizmoMesh: Mesh;\r\n protected _rotationDisplayPlane: Mesh;\r\n protected _dragging: boolean = false;\r\n protected _angles = new Vector3();\r\n\r\n protected static _RotationGizmoVertexShader = `\r\n precision highp float;\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n uniform mat4 worldViewProjection;\r\n varying vec3 vPosition;\r\n varying vec2 vUV;\r\n\r\n void main(void) {\r\n gl_Position = worldViewProjection * vec4(position, 1.0);\r\n vUV = uv;\r\n }`;\r\n\r\n protected static _RotationGizmoFragmentShader = `\r\n precision highp float;\r\n varying vec2 vUV;\r\n varying vec3 vPosition;\r\n uniform vec3 angles;\r\n uniform vec3 rotationColor;\r\n\r\n #define twopi 6.283185307\r\n\r\n void main(void) {\r\n vec2 uv = vUV - vec2(0.5);\r\n float angle = atan(uv.y, uv.x) + 3.141592;\r\n float delta = gl_FrontFacing ? angles.y : -angles.y;\r\n float begin = angles.x - delta * angles.z;\r\n float start = (begin < (begin + delta)) ? begin : (begin + delta);\r\n float end = (begin > (begin + delta)) ? begin : (begin + delta);\r\n float len = sqrt(dot(uv,uv));\r\n float opacity = 1. - step(0.5, len);\r\n\r\n float base = abs(floor(start / twopi)) * twopi;\r\n start += base;\r\n end += base;\r\n\r\n float intensity = 0.;\r\n for (int i = 0; i < 5; i++)\r\n {\r\n intensity += max(step(start, angle) - step(end, angle), 0.);\r\n angle += twopi;\r\n }\r\n gl_FragColor = vec4(rotationColor, min(intensity * 0.25, 0.8)) * opacity;\r\n }\r\n `;\r\n\r\n protected _rotationShaderMaterial: ShaderMaterial;\r\n\r\n /**\r\n * Creates a PlaneRotationGizmo\r\n * @param planeNormal The normal of the plane which the gizmo will be able to rotate on\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param tessellation Amount of tessellation to be used when creating rotation circles\r\n * @param parent\r\n * @param useEulerRotation Use and update Euler angle instead of quaternion\r\n * @param thickness display gizmo axis thickness\r\n * @param hoverColor The color of the gizmo when hovering over and dragging\r\n * @param disableColor The Color of the gizmo when its disabled\r\n */\r\n constructor(\r\n planeNormal: Vector3,\r\n color: Color3 = Color3.Gray(),\r\n gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n tessellation = 32,\r\n parent: Nullable<RotationGizmo> = null,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n useEulerRotation = false,\r\n thickness: number = 1,\r\n hoverColor: Color3 = Color3.Yellow(),\r\n disableColor: Color3 = Color3.Gray()\r\n ) {\r\n super(gizmoLayer);\r\n this._parent = parent;\r\n // Create Material\r\n this._coloredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._coloredMaterial.diffuseColor = color;\r\n this._coloredMaterial.specularColor = color.subtract(new Color3(0.1, 0.1, 0.1));\r\n\r\n this._hoverMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._hoverMaterial.diffuseColor = hoverColor;\r\n this._hoverMaterial.specularColor = hoverColor;\r\n\r\n this._disableMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._disableMaterial.diffuseColor = disableColor;\r\n this._disableMaterial.alpha = 0.4;\r\n\r\n // Build mesh on root node\r\n this._gizmoMesh = new Mesh(\"\", gizmoLayer.utilityLayerScene);\r\n const { rotationMesh, collider } = this._createGizmoMesh(this._gizmoMesh, thickness, tessellation);\r\n\r\n // Setup Rotation Circle\r\n this._rotationDisplayPlane = CreatePlane(\r\n \"rotationDisplay\",\r\n {\r\n size: 0.6,\r\n updatable: false,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n this._rotationDisplayPlane.rotation.z = Math.PI * 0.5;\r\n this._rotationDisplayPlane.parent = this._gizmoMesh;\r\n this._rotationDisplayPlane.setEnabled(false);\r\n\r\n Effect.ShadersStore[\"rotationGizmoVertexShader\"] = PlaneRotationGizmo._RotationGizmoVertexShader;\r\n Effect.ShadersStore[\"rotationGizmoFragmentShader\"] = PlaneRotationGizmo._RotationGizmoFragmentShader;\r\n this._rotationShaderMaterial = new ShaderMaterial(\r\n \"shader\",\r\n this.gizmoLayer.utilityLayerScene,\r\n {\r\n vertex: \"rotationGizmo\",\r\n fragment: \"rotationGizmo\",\r\n },\r\n {\r\n attributes: [\"position\", \"uv\"],\r\n uniforms: [\"worldViewProjection\", \"angles\", \"rotationColor\"],\r\n }\r\n );\r\n this._rotationShaderMaterial.backFaceCulling = false;\r\n this.rotationColor = hoverColor;\r\n\r\n this._rotationDisplayPlane.material = this._rotationShaderMaterial;\r\n this._rotationDisplayPlane.visibility = 0.999;\r\n\r\n this._gizmoMesh.lookAt(this._rootMesh.position.add(planeNormal));\r\n this._rootMesh.addChild(this._gizmoMesh, Gizmo.PreserveScaling);\r\n this._gizmoMesh.scaling.scaleInPlace(1 / 3);\r\n // Add drag behavior to handle events when the gizmo is dragged\r\n this.dragBehavior = new PointerDragBehavior({ dragPlaneNormal: planeNormal });\r\n this.dragBehavior.moveAttached = false;\r\n this.dragBehavior.maxDragAngle = PlaneRotationGizmo.MaxDragAngle;\r\n this.dragBehavior._useAlternatePickedPointAboveMaxDragAngle = true;\r\n this._rootMesh.addBehavior(this.dragBehavior);\r\n\r\n // Closures for drag logic\r\n const lastDragPosition = new Vector3();\r\n\r\n const rotationMatrix = new Matrix();\r\n const planeNormalTowardsCamera = new Vector3();\r\n let localPlaneNormalTowardsCamera = new Vector3();\r\n\r\n this.dragBehavior.onDragStartObservable.add((e) => {\r\n if (this.attachedNode) {\r\n lastDragPosition.copyFrom(e.dragPlanePoint);\r\n this._rotationDisplayPlane.setEnabled(true);\r\n\r\n this._rotationDisplayPlane.getWorldMatrix().invertToRef(rotationMatrix);\r\n Vector3.TransformCoordinatesToRef(e.dragPlanePoint, rotationMatrix, lastDragPosition);\r\n\r\n this._angles.x = Math.atan2(lastDragPosition.y, lastDragPosition.x) + Math.PI;\r\n this._angles.y = 0;\r\n this._angles.z = this.updateGizmoRotationToMatchAttachedMesh ? 1 : 0;\r\n this._dragging = true;\r\n lastDragPosition.copyFrom(e.dragPlanePoint);\r\n this._rotationShaderMaterial.setVector3(\"angles\", this._angles);\r\n this.angle = 0;\r\n }\r\n });\r\n\r\n this.dragBehavior.onDragEndObservable.add(() => {\r\n this._dragging = false;\r\n this._rotationDisplayPlane.setEnabled(false);\r\n });\r\n\r\n const tmpSnapEvent = { snapDistance: 0 };\r\n let currentSnapDragDistance = 0;\r\n const tmpMatrix = new Matrix();\r\n const amountToRotate = new Quaternion();\r\n this.dragBehavior.onDragObservable.add((event) => {\r\n if (this.attachedNode) {\r\n // Calc angle over full 360 degree (https://stackoverflow.com/questions/43493711/the-angle-between-two-3d-vectors-with-a-result-range-0-360)\r\n const nodeScale = new Vector3(1, 1, 1);\r\n const nodeQuaternion = new Quaternion(0, 0, 0, 1);\r\n const nodeTranslation = new Vector3(0, 0, 0);\r\n const attachedNodeTransform = this._attachedNode as TransformNode;\r\n // check there is an active pivot for the TransformNode attached\r\n if (attachedNodeTransform && attachedNodeTransform.isUsingPivotMatrix && attachedNodeTransform.isUsingPivotMatrix() && attachedNodeTransform.position) {\r\n // When a TransformNode has an active pivot, even without parenting,\r\n // translation from the world matrix is different from TransformNode.position.\r\n // Pivot works like a virtual parent that's using the node orientation.\r\n // As the world matrix is transformed by the gizmo and then decomposed to TRS\r\n // its translation part must be set to the Node's position.\r\n attachedNodeTransform.getWorldMatrix().setTranslation(attachedNodeTransform.position);\r\n }\r\n\r\n this.attachedNode.getWorldMatrix().decompose(nodeScale, nodeQuaternion, nodeTranslation);\r\n // uniform scaling of absolute value of components\r\n // (-1,1,1) is uniform but (1,1.001,1) is not\r\n const uniformScaling = Math.abs(Math.abs(nodeScale.x) - Math.abs(nodeScale.y)) <= Epsilon && Math.abs(Math.abs(nodeScale.x) - Math.abs(nodeScale.z)) <= Epsilon;\r\n if (!uniformScaling && this.updateGizmoRotationToMatchAttachedMesh) {\r\n Logger.Warn(\r\n \"Unable to use a rotation gizmo matching mesh rotation with non uniform scaling. Use uniform scaling or set updateGizmoRotationToMatchAttachedMesh to false.\"\r\n );\r\n return;\r\n }\r\n nodeQuaternion.normalize();\r\n\r\n const nodeTranslationForOperation = this.updateGizmoPositionToMatchAttachedMesh ? nodeTranslation : this._rootMesh.absolutePosition;\r\n const newVector = event.dragPlanePoint.subtract(nodeTranslationForOperation).normalize();\r\n const originalVector = lastDragPosition.subtract(nodeTranslationForOperation).normalize();\r\n const cross = Vector3.Cross(newVector, originalVector);\r\n const dot = Vector3.Dot(newVector, originalVector);\r\n let angle = Math.atan2(cross.length(), dot) * this.sensitivity;\r\n planeNormalTowardsCamera.copyFrom(planeNormal);\r\n localPlaneNormalTowardsCamera.copyFrom(planeNormal);\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n nodeQuaternion.toRotationMatrix(rotationMatrix);\r\n localPlaneNormalTowardsCamera = Vector3.TransformCoordinates(planeNormalTowardsCamera, rotationMatrix);\r\n }\r\n // Flip up vector depending on which side the camera is on\r\n let cameraFlipped = false;\r\n if (gizmoLayer.utilityLayerScene.activeCamera) {\r\n const camVec = gizmoLayer.utilityLayerScene.activeCamera.position.subtract(nodeTranslationForOperation).normalize();\r\n if (Vector3.Dot(camVec, localPlaneNormalTowardsCamera) > 0) {\r\n planeNormalTowardsCamera.scaleInPlace(-1);\r\n localPlaneNormalTowardsCamera.scaleInPlace(-1);\r\n cameraFlipped = true;\r\n }\r\n }\r\n const halfCircleSide = Vector3.Dot(localPlaneNormalTowardsCamera, cross) > 0.0;\r\n if (halfCircleSide) {\r\n angle = -angle;\r\n }\r\n\r\n TmpVectors.Vector3[0].set(angle, 0, 0);\r\n if (!this.dragBehavior.validateDrag(TmpVectors.Vector3[0])) {\r\n angle = 0;\r\n }\r\n\r\n // Snapping logic\r\n let snapped = false;\r\n if (this.snapDistance != 0) {\r\n currentSnapDragDistance += angle;\r\n if (Math.abs(currentSnapDragDistance) > this.snapDistance) {\r\n let dragSteps = Math.floor(Math.abs(currentSnapDragDistance) / this.snapDistance);\r\n if (currentSnapDragDistance < 0) {\r\n dragSteps *= -1;\r\n }\r\n currentSnapDragDistance = currentSnapDragDistance % this.snapDistance;\r\n angle = this.snapDistance * dragSteps;\r\n snapped = true;\r\n } else {\r\n angle = 0;\r\n }\r\n }\r\n\r\n // Convert angle and axis to quaternion (http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm)\r\n const quaternionCoefficient = Math.sin(angle / 2);\r\n amountToRotate.set(\r\n planeNormalTowardsCamera.x * quaternionCoefficient,\r\n planeNormalTowardsCamera.y * quaternionCoefficient,\r\n planeNormalTowardsCamera.z * quaternionCoefficient,\r\n Math.cos(angle / 2)\r\n );\r\n\r\n // If the meshes local scale is inverted (eg. loaded gltf file parent with z scale of -1) the rotation needs to be inverted on the y axis\r\n if (tmpMatrix.determinant() > 0) {\r\n const tmpVector = new Vector3();\r\n amountToRotate.toEulerAnglesToRef(tmpVector);\r\n Quaternion.RotationYawPitchRollToRef(tmpVector.y, -tmpVector.x, -tmpVector.z, amountToRotate);\r\n }\r\n\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n // Rotate selected mesh quaternion over fixed axis\r\n nodeQuaternion.multiplyToRef(amountToRotate, nodeQuaternion);\r\n nodeQuaternion.normalize();\r\n // recompose matrix\r\n Matrix.ComposeToRef(nodeScale, nodeQuaternion, nodeTranslation, this.attachedNode.getWorldMatrix());\r\n } else {\r\n // Rotate selected mesh quaternion over rotated axis\r\n amountToRotate.toRotationMatrix(TmpVectors.Matrix[0]);\r\n const translation = this.attachedNode.getWorldMatrix().getTranslation();\r\n this.attachedNode.getWorldMatrix().multiplyToRef(TmpVectors.Matrix[0], this.attachedNode.getWorldMatrix());\r\n this.attachedNode.getWorldMatrix().setTranslation(translation);\r\n }\r\n\r\n lastDragPosition.copyFrom(event.dragPlanePoint);\r\n if (snapped) {\r\n tmpSnapEvent.snapDistance = angle;\r\n this.onSnapObservable.notifyObservers(tmpSnapEvent);\r\n }\r\n this._angles.y += angle;\r\n this.angle += cameraFlipped ? -angle : angle;\r\n this._rotationShaderMaterial.setVector3(\"angles\", this._angles);\r\n this._matrixChanged();\r\n }\r\n });\r\n\r\n const light = gizmoLayer._getSharedGizmoLight();\r\n light.includedOnlyMeshes = light.includedOnlyMeshes.concat(this._rootMesh.getChildMeshes(false));\r\n\r\n const cache: GizmoAxisCache = {\r\n colliderMeshes: [collider],\r\n gizmoMeshes: [rotationMesh],\r\n material: this._coloredMaterial,\r\n hoverMaterial: this._hoverMaterial,\r\n disableMaterial: this._disableMaterial,\r\n active: false,\r\n dragBehavior: this.dragBehavior,\r\n };\r\n this._parent?.addToAxisCache(this._gizmoMesh, cache);\r\n\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (this._customMeshSet) {\r\n return;\r\n }\r\n // updating here the maxangle because ondragstart is too late (value already used) and the updated value is not taken into account\r\n this.dragBehavior.maxDragAngle = PlaneRotationGizmo.MaxDragAngle;\r\n this._isHovered = !!(cache.colliderMeshes.indexOf(<Mesh>pointerInfo?.pickInfo?.pickedMesh) != -1);\r\n if (!this._parent) {\r\n const material = cache.dragBehavior.enabled ? (this._isHovered || this._dragging ? this._hoverMaterial : this._coloredMaterial) : this._disableMaterial;\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, material);\r\n }\r\n });\r\n\r\n this.dragBehavior.onEnabledObservable.add((newState) => {\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, newState ? this._coloredMaterial : this._disableMaterial);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n * Create Geometry for Gizmo\r\n * @param parentMesh\r\n * @param thickness\r\n * @param tessellation\r\n * @returns\r\n */\r\n protected _createGizmoMesh(parentMesh: AbstractMesh, thickness: number, tessellation: number) {\r\n const collider = CreateTorus(\r\n \"ignore\",\r\n {\r\n diameter: 0.6,\r\n thickness: 0.03 * thickness,\r\n tessellation,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n collider.visibility = 0;\r\n const rotationMesh = CreateTorus(\r\n \"\",\r\n {\r\n diameter: 0.6,\r\n thickness: 0.005 * thickness,\r\n tessellation,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n rotationMesh.material = this._coloredMaterial;\r\n\r\n // Position arrow pointing in its drag axis\r\n rotationMesh.rotation.x = Math.PI / 2;\r\n collider.rotation.x = Math.PI / 2;\r\n\r\n parentMesh.addChild(rotationMesh, Gizmo.PreserveScaling);\r\n parentMesh.addChild(collider, Gizmo.PreserveScaling);\r\n return { rotationMesh, collider };\r\n }\r\n\r\n protected override _attachedNodeChanged(value: Nullable<Node>) {\r\n if (this.dragBehavior) {\r\n this.dragBehavior.enabled = value ? true : false;\r\n }\r\n }\r\n\r\n /**\r\n * If the gizmo is enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n this._isEnabled = value;\r\n if (!value) {\r\n this.attachedMesh = null;\r\n } else {\r\n if (this._parent) {\r\n this.attachedMesh = this._parent.attachedMesh;\r\n }\r\n }\r\n }\r\n\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public override dispose() {\r\n this.onSnapObservable.clear();\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this.dragBehavior.detach();\r\n if (this._gizmoMesh) {\r\n this._gizmoMesh.dispose();\r\n }\r\n if (this._rotationDisplayPlane) {\r\n this._rotationDisplayPlane.dispose();\r\n }\r\n if (this._rotationShaderMaterial) {\r\n this._rotationShaderMaterial.dispose();\r\n }\r\n const materials = [this._coloredMaterial, this._hoverMaterial, this._disableMaterial];\r\n for (const matl of materials) {\r\n if (matl) {\r\n matl.dispose();\r\n }\r\n }\r\n super.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"planeRotationGizmo.js","sourceRoot":"","sources":["../../../../dev/core/src/Gizmos/planeRotationGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { Quaternion, Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport \"../Meshes/Builders/linesBuilder\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Node } from \"../node\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { GizmoAxisCache, IGizmo } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { RotationGizmo } from \"./rotationGizmo\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder\";\r\nimport { CreateTorus } from \"../Meshes/Builders/torusBuilder\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Interface for plane rotation gizmo\r\n */\r\nexport interface IPlaneRotationGizmo extends IGizmo {\r\n /** Drag behavior responsible for the gizmos dragging interactions */\r\n dragBehavior: PointerDragBehavior;\r\n /** Drag distance in babylon units that the gizmo will snap to when dragged */\r\n snapDistance: number;\r\n /** Sensitivity factor for dragging */\r\n sensitivity: number;\r\n /**\r\n * Event that fires each time the gizmo snaps to a new location.\r\n * * snapDistance is the change in distance\r\n */\r\n onSnapObservable: Observable<{ snapDistance: number }>;\r\n /** Accumulated relative angle value for rotation on the axis. */\r\n angle: number;\r\n /** If the gizmo is enabled */\r\n isEnabled: boolean;\r\n\r\n /** Default material used to render when gizmo is not disabled or hovered */\r\n coloredMaterial: StandardMaterial;\r\n /** Material used to render when gizmo is hovered with mouse */\r\n hoverMaterial: StandardMaterial;\r\n /** Color used to render the drag angle sector when gizmo is rotated with mouse */\r\n rotationColor: Color3;\r\n /** Material used to render when gizmo is disabled. typically grey. */\r\n disableMaterial: StandardMaterial;\r\n}\r\n\r\n/**\r\n * Single plane rotation gizmo\r\n */\r\nexport class PlaneRotationGizmo extends Gizmo implements IPlaneRotationGizmo {\r\n /**\r\n * Drag behavior responsible for the gizmos dragging interactions\r\n */\r\n public dragBehavior: PointerDragBehavior;\r\n protected _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n\r\n /**\r\n * Rotation distance in radians that the gizmo will snap to (Default: 0)\r\n */\r\n public snapDistance = 0;\r\n /**\r\n * Event that fires each time the gizmo snaps to a new location.\r\n * * snapDistance is the change in distance\r\n */\r\n public onSnapObservable = new Observable<{ snapDistance: number }>();\r\n\r\n /**\r\n * The maximum angle between the camera and the rotation allowed for interaction\r\n * If a rotation plane appears 'flat', a lower value allows interaction.\r\n */\r\n public static MaxDragAngle: number = (Math.PI * 9) / 20;\r\n\r\n /**\r\n * Accumulated relative angle value for rotation on the axis. Reset to 0 when a dragStart occurs\r\n */\r\n public angle: number = 0;\r\n\r\n /**\r\n * Custom sensitivity value for the drag strength\r\n */\r\n public sensitivity = 1;\r\n\r\n /** Default material used to render when gizmo is not disabled or hovered */\r\n public get coloredMaterial() {\r\n return this._coloredMaterial;\r\n }\r\n\r\n /** Material used to render when gizmo is hovered with mouse */\r\n public get hoverMaterial() {\r\n return this._hoverMaterial;\r\n }\r\n\r\n /** Color used to render the drag angle sector when gizmo is rotated with mouse */\r\n public set rotationColor(color: Color3) {\r\n this._rotationShaderMaterial.setColor3(\"rotationColor\", color);\r\n }\r\n\r\n /** Material used to render when gizmo is disabled. typically grey. */\r\n public get disableMaterial() {\r\n return this._disableMaterial;\r\n }\r\n\r\n protected _isEnabled: boolean = true;\r\n protected _parent: Nullable<RotationGizmo> = null;\r\n protected _coloredMaterial: StandardMaterial;\r\n protected _hoverMaterial: StandardMaterial;\r\n protected _disableMaterial: StandardMaterial;\r\n protected _gizmoMesh: Mesh;\r\n protected _rotationDisplayPlane: Mesh;\r\n protected _dragging: boolean = false;\r\n protected _angles = new Vector3();\r\n\r\n protected static _RotationGizmoVertexShader = `\r\n precision highp float;\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n uniform mat4 worldViewProjection;\r\n varying vec3 vPosition;\r\n varying vec2 vUV;\r\n\r\n void main(void) {\r\n gl_Position = worldViewProjection * vec4(position, 1.0);\r\n vUV = uv;\r\n }`;\r\n\r\n protected static _RotationGizmoFragmentShader = `\r\n precision highp float;\r\n varying vec2 vUV;\r\n varying vec3 vPosition;\r\n uniform vec3 angles;\r\n uniform vec3 rotationColor;\r\n\r\n #define twopi 6.283185307\r\n\r\n void main(void) {\r\n vec2 uv = vUV - vec2(0.5);\r\n float angle = atan(uv.y, uv.x) + 3.141592;\r\n float delta = gl_FrontFacing ? angles.y : -angles.y;\r\n float begin = angles.x - delta * angles.z;\r\n float start = (begin < (begin + delta)) ? begin : (begin + delta);\r\n float end = (begin > (begin + delta)) ? begin : (begin + delta);\r\n float len = sqrt(dot(uv,uv));\r\n float opacity = 1. - step(0.5, len);\r\n\r\n float base = abs(floor(start / twopi)) * twopi;\r\n start += base;\r\n end += base;\r\n\r\n float intensity = 0.;\r\n for (int i = 0; i < 5; i++)\r\n {\r\n intensity += max(step(start, angle) - step(end, angle), 0.);\r\n angle += twopi;\r\n }\r\n gl_FragColor = vec4(rotationColor, min(intensity * 0.25, 0.8)) * opacity;\r\n }\r\n `;\r\n\r\n protected _rotationShaderMaterial: ShaderMaterial;\r\n\r\n /**\r\n * Creates a PlaneRotationGizmo\r\n * @param planeNormal The normal of the plane which the gizmo will be able to rotate on\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param tessellation Amount of tessellation to be used when creating rotation circles\r\n * @param parent\r\n * @param useEulerRotation Use and update Euler angle instead of quaternion\r\n * @param thickness display gizmo axis thickness\r\n * @param hoverColor The color of the gizmo when hovering over and dragging\r\n * @param disableColor The Color of the gizmo when its disabled\r\n */\r\n constructor(\r\n planeNormal: Vector3,\r\n color: Color3 = Color3.Gray(),\r\n gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n tessellation = 32,\r\n parent: Nullable<RotationGizmo> = null,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n useEulerRotation = false,\r\n thickness: number = 1,\r\n hoverColor: Color3 = Color3.Yellow(),\r\n disableColor: Color3 = Color3.Gray()\r\n ) {\r\n super(gizmoLayer);\r\n this._parent = parent;\r\n // Create Material\r\n this._coloredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._coloredMaterial.diffuseColor = color;\r\n this._coloredMaterial.specularColor = color.subtract(new Color3(0.1, 0.1, 0.1));\r\n\r\n this._hoverMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._hoverMaterial.diffuseColor = hoverColor;\r\n this._hoverMaterial.specularColor = hoverColor;\r\n\r\n this._disableMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._disableMaterial.diffuseColor = disableColor;\r\n this._disableMaterial.alpha = 0.4;\r\n\r\n // Build mesh on root node\r\n this._gizmoMesh = new Mesh(\"\", gizmoLayer.utilityLayerScene);\r\n const { rotationMesh, collider } = this._createGizmoMesh(this._gizmoMesh, thickness, tessellation);\r\n\r\n // Setup Rotation Circle\r\n this._rotationDisplayPlane = CreatePlane(\r\n \"rotationDisplay\",\r\n {\r\n size: 0.6,\r\n updatable: false,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n this._rotationDisplayPlane.rotation.z = Math.PI * 0.5;\r\n this._rotationDisplayPlane.parent = this._gizmoMesh;\r\n this._rotationDisplayPlane.setEnabled(false);\r\n\r\n Effect.ShadersStore[\"rotationGizmoVertexShader\"] = PlaneRotationGizmo._RotationGizmoVertexShader;\r\n Effect.ShadersStore[\"rotationGizmoFragmentShader\"] = PlaneRotationGizmo._RotationGizmoFragmentShader;\r\n this._rotationShaderMaterial = new ShaderMaterial(\r\n \"shader\",\r\n this.gizmoLayer.utilityLayerScene,\r\n {\r\n vertex: \"rotationGizmo\",\r\n fragment: \"rotationGizmo\",\r\n },\r\n {\r\n attributes: [\"position\", \"uv\"],\r\n uniforms: [\"worldViewProjection\", \"angles\", \"rotationColor\"],\r\n }\r\n );\r\n this._rotationShaderMaterial.backFaceCulling = false;\r\n this.rotationColor = hoverColor;\r\n\r\n this._rotationDisplayPlane.material = this._rotationShaderMaterial;\r\n this._rotationDisplayPlane.visibility = 0.999;\r\n\r\n this._gizmoMesh.lookAt(this._rootMesh.position.add(planeNormal));\r\n this._rootMesh.addChild(this._gizmoMesh, Gizmo.PreserveScaling);\r\n this._gizmoMesh.scaling.scaleInPlace(1 / 3);\r\n // Add drag behavior to handle events when the gizmo is dragged\r\n this.dragBehavior = new PointerDragBehavior({ dragPlaneNormal: planeNormal });\r\n this.dragBehavior.moveAttached = false;\r\n this.dragBehavior.maxDragAngle = PlaneRotationGizmo.MaxDragAngle;\r\n this.dragBehavior._useAlternatePickedPointAboveMaxDragAngle = true;\r\n this._rootMesh.addBehavior(this.dragBehavior);\r\n\r\n // Closures for drag logic\r\n const lastDragPosition = new Vector3();\r\n\r\n const rotationMatrix = new Matrix();\r\n const planeNormalTowardsCamera = new Vector3();\r\n let localPlaneNormalTowardsCamera = new Vector3();\r\n\r\n this.dragBehavior.onDragStartObservable.add((e) => {\r\n if (this.attachedNode) {\r\n lastDragPosition.copyFrom(e.dragPlanePoint);\r\n this._rotationDisplayPlane.setEnabled(true);\r\n\r\n this._rotationDisplayPlane.getWorldMatrix().invertToRef(rotationMatrix);\r\n Vector3.TransformCoordinatesToRef(e.dragPlanePoint, rotationMatrix, lastDragPosition);\r\n\r\n this._angles.x = Math.atan2(lastDragPosition.y, lastDragPosition.x) + Math.PI;\r\n this._angles.y = 0;\r\n this._angles.z = this.updateGizmoRotationToMatchAttachedMesh ? 1 : 0;\r\n this._dragging = true;\r\n lastDragPosition.copyFrom(e.dragPlanePoint);\r\n this._rotationShaderMaterial.setVector3(\"angles\", this._angles);\r\n this.angle = 0;\r\n }\r\n });\r\n\r\n this.dragBehavior.onDragEndObservable.add(() => {\r\n this._dragging = false;\r\n this._rotationDisplayPlane.setEnabled(false);\r\n });\r\n\r\n const tmpSnapEvent = { snapDistance: 0 };\r\n let currentSnapDragDistance = 0;\r\n const tmpMatrix = new Matrix();\r\n const amountToRotate = new Quaternion();\r\n this.dragBehavior.onDragObservable.add((event) => {\r\n if (this.attachedNode) {\r\n // Calc angle over full 360 degree (https://stackoverflow.com/questions/43493711/the-angle-between-two-3d-vectors-with-a-result-range-0-360)\r\n const nodeScale = new Vector3(1, 1, 1);\r\n const nodeQuaternion = new Quaternion(0, 0, 0, 1);\r\n const nodeTranslation = new Vector3(0, 0, 0);\r\n const attachedNodeTransform = this._attachedNode as TransformNode;\r\n // check there is an active pivot for the TransformNode attached\r\n if (attachedNodeTransform && attachedNodeTransform.isUsingPivotMatrix && attachedNodeTransform.isUsingPivotMatrix() && attachedNodeTransform.position) {\r\n // When a TransformNode has an active pivot, even without parenting,\r\n // translation from the world matrix is different from TransformNode.position.\r\n // Pivot works like a virtual parent that's using the node orientation.\r\n // As the world matrix is transformed by the gizmo and then decomposed to TRS\r\n // its translation part must be set to the Node's position.\r\n attachedNodeTransform.getWorldMatrix().setTranslation(attachedNodeTransform.position);\r\n }\r\n\r\n this.attachedNode.getWorldMatrix().decompose(nodeScale, nodeQuaternion, nodeTranslation);\r\n // uniform scaling of absolute value of components\r\n // (-1,1,1) is uniform but (1,1.001,1) is not\r\n const uniformScaling = Math.abs(Math.abs(nodeScale.x) - Math.abs(nodeScale.y)) <= Epsilon && Math.abs(Math.abs(nodeScale.x) - Math.abs(nodeScale.z)) <= Epsilon;\r\n if (!uniformScaling && this.updateGizmoRotationToMatchAttachedMesh) {\r\n Logger.Warn(\r\n \"Unable to use a rotation gizmo matching mesh rotation with non uniform scaling. Use uniform scaling or set updateGizmoRotationToMatchAttachedMesh to false.\"\r\n );\r\n return;\r\n }\r\n nodeQuaternion.normalize();\r\n\r\n const nodeTranslationForOperation = this.updateGizmoPositionToMatchAttachedMesh ? nodeTranslation : this._rootMesh.absolutePosition;\r\n const newVector = event.dragPlanePoint.subtract(nodeTranslationForOperation).normalize();\r\n const originalVector = lastDragPosition.subtract(nodeTranslationForOperation).normalize();\r\n const cross = Vector3.Cross(newVector, originalVector);\r\n const dot = Vector3.Dot(newVector, originalVector);\r\n let angle = Math.atan2(cross.length(), dot) * this.sensitivity;\r\n planeNormalTowardsCamera.copyFrom(planeNormal);\r\n localPlaneNormalTowardsCamera.copyFrom(planeNormal);\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n nodeQuaternion.toRotationMatrix(rotationMatrix);\r\n localPlaneNormalTowardsCamera = Vector3.TransformCoordinates(planeNormalTowardsCamera, rotationMatrix);\r\n }\r\n // Flip up vector depending on which side the camera is on\r\n let cameraFlipped = false;\r\n if (gizmoLayer.utilityLayerScene.activeCamera) {\r\n const camVec = gizmoLayer.utilityLayerScene.activeCamera.position.subtract(nodeTranslationForOperation).normalize();\r\n if (Vector3.Dot(camVec, localPlaneNormalTowardsCamera) > 0) {\r\n planeNormalTowardsCamera.scaleInPlace(-1);\r\n localPlaneNormalTowardsCamera.scaleInPlace(-1);\r\n cameraFlipped = true;\r\n }\r\n }\r\n const halfCircleSide = Vector3.Dot(localPlaneNormalTowardsCamera, cross) > 0.0;\r\n if (halfCircleSide) {\r\n angle = -angle;\r\n }\r\n\r\n TmpVectors.Vector3[0].set(angle, 0, 0);\r\n if (!this.dragBehavior.validateDrag(TmpVectors.Vector3[0])) {\r\n angle = 0;\r\n }\r\n\r\n // Snapping logic\r\n let snapped = false;\r\n if (this.snapDistance != 0) {\r\n currentSnapDragDistance += angle;\r\n if (Math.abs(currentSnapDragDistance) > this.snapDistance) {\r\n let dragSteps = Math.floor(Math.abs(currentSnapDragDistance) / this.snapDistance);\r\n if (currentSnapDragDistance < 0) {\r\n dragSteps *= -1;\r\n }\r\n currentSnapDragDistance = currentSnapDragDistance % this.snapDistance;\r\n angle = this.snapDistance * dragSteps;\r\n snapped = true;\r\n } else {\r\n angle = 0;\r\n }\r\n }\r\n\r\n // Convert angle and axis to quaternion (http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm)\r\n const quaternionCoefficient = Math.sin(angle / 2);\r\n amountToRotate.set(\r\n planeNormalTowardsCamera.x * quaternionCoefficient,\r\n planeNormalTowardsCamera.y * quaternionCoefficient,\r\n planeNormalTowardsCamera.z * quaternionCoefficient,\r\n Math.cos(angle / 2)\r\n );\r\n\r\n // If the meshes local scale is inverted (eg. loaded gltf file parent with z scale of -1) the rotation needs to be inverted on the y axis\r\n if (tmpMatrix.determinant() > 0) {\r\n const tmpVector = new Vector3();\r\n amountToRotate.toEulerAnglesToRef(tmpVector);\r\n Quaternion.RotationYawPitchRollToRef(tmpVector.y, -tmpVector.x, -tmpVector.z, amountToRotate);\r\n }\r\n\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n // Rotate selected mesh quaternion over fixed axis\r\n nodeQuaternion.multiplyToRef(amountToRotate, nodeQuaternion);\r\n nodeQuaternion.normalize();\r\n // recompose matrix\r\n Matrix.ComposeToRef(nodeScale, nodeQuaternion, nodeTranslation, this.attachedNode.getWorldMatrix());\r\n } else {\r\n // Rotate selected mesh quaternion over rotated axis\r\n amountToRotate.toRotationMatrix(TmpVectors.Matrix[0]);\r\n const translation = this.attachedNode.getWorldMatrix().getTranslation();\r\n this.attachedNode.getWorldMatrix().multiplyToRef(TmpVectors.Matrix[0], this.attachedNode.getWorldMatrix());\r\n this.attachedNode.getWorldMatrix().setTranslation(translation);\r\n }\r\n\r\n lastDragPosition.copyFrom(event.dragPlanePoint);\r\n if (snapped) {\r\n tmpSnapEvent.snapDistance = angle;\r\n this.onSnapObservable.notifyObservers(tmpSnapEvent);\r\n }\r\n this._angles.y += gizmoLayer.utilityLayerScene.useRightHandedSystem ? -angle : angle;\r\n this.angle += cameraFlipped ? -angle : angle;\r\n this._rotationShaderMaterial.setVector3(\"angles\", this._angles);\r\n this._matrixChanged();\r\n }\r\n });\r\n\r\n const light = gizmoLayer._getSharedGizmoLight();\r\n light.includedOnlyMeshes = light.includedOnlyMeshes.concat(this._rootMesh.getChildMeshes(false));\r\n\r\n const cache: GizmoAxisCache = {\r\n colliderMeshes: [collider],\r\n gizmoMeshes: [rotationMesh],\r\n material: this._coloredMaterial,\r\n hoverMaterial: this._hoverMaterial,\r\n disableMaterial: this._disableMaterial,\r\n active: false,\r\n dragBehavior: this.dragBehavior,\r\n };\r\n this._parent?.addToAxisCache(this._gizmoMesh, cache);\r\n\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (this._customMeshSet) {\r\n return;\r\n }\r\n // updating here the maxangle because ondragstart is too late (value already used) and the updated value is not taken into account\r\n this.dragBehavior.maxDragAngle = PlaneRotationGizmo.MaxDragAngle;\r\n this._isHovered = !!(cache.colliderMeshes.indexOf(<Mesh>pointerInfo?.pickInfo?.pickedMesh) != -1);\r\n if (!this._parent) {\r\n const material = cache.dragBehavior.enabled ? (this._isHovered || this._dragging ? this._hoverMaterial : this._coloredMaterial) : this._disableMaterial;\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, material);\r\n }\r\n });\r\n\r\n this.dragBehavior.onEnabledObservable.add((newState) => {\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, newState ? this._coloredMaterial : this._disableMaterial);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n * Create Geometry for Gizmo\r\n * @param parentMesh\r\n * @param thickness\r\n * @param tessellation\r\n * @returns\r\n */\r\n protected _createGizmoMesh(parentMesh: AbstractMesh, thickness: number, tessellation: number) {\r\n const collider = CreateTorus(\r\n \"ignore\",\r\n {\r\n diameter: 0.6,\r\n thickness: 0.03 * thickness,\r\n tessellation,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n collider.visibility = 0;\r\n const rotationMesh = CreateTorus(\r\n \"\",\r\n {\r\n diameter: 0.6,\r\n thickness: 0.005 * thickness,\r\n tessellation,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n rotationMesh.material = this._coloredMaterial;\r\n\r\n // Position arrow pointing in its drag axis\r\n rotationMesh.rotation.x = Math.PI / 2;\r\n collider.rotation.x = Math.PI / 2;\r\n\r\n parentMesh.addChild(rotationMesh, Gizmo.PreserveScaling);\r\n parentMesh.addChild(collider, Gizmo.PreserveScaling);\r\n return { rotationMesh, collider };\r\n }\r\n\r\n protected override _attachedNodeChanged(value: Nullable<Node>) {\r\n if (this.dragBehavior) {\r\n this.dragBehavior.enabled = value ? true : false;\r\n }\r\n }\r\n\r\n /**\r\n * If the gizmo is enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n this._isEnabled = value;\r\n if (!value) {\r\n this.attachedMesh = null;\r\n } else {\r\n if (this._parent) {\r\n this.attachedMesh = this._parent.attachedMesh;\r\n }\r\n }\r\n }\r\n\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public override dispose() {\r\n this.onSnapObservable.clear();\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this.dragBehavior.detach();\r\n if (this._gizmoMesh) {\r\n this._gizmoMesh.dispose();\r\n }\r\n if (this._rotationDisplayPlane) {\r\n this._rotationDisplayPlane.dispose();\r\n }\r\n if (this._rotationShaderMaterial) {\r\n this._rotationShaderMaterial.dispose();\r\n }\r\n const materials = [this._coloredMaterial, this._hoverMaterial, this._disableMaterial];\r\n for (const matl of materials) {\r\n if (matl) {\r\n matl.dispose();\r\n }\r\n }\r\n super.dispose();\r\n }\r\n}\r\n"]}
@@ -144,7 +144,7 @@ export class GaussianSplattingMaterial extends PushMaterial {
144
144
  "invViewport",
145
145
  "dataTextureSize",
146
146
  "focal",
147
- "vEyePosition",
147
+ "eyePosition",
148
148
  "kernelSize",
149
149
  ];
150
150
  const samplers = ["covariancesATexture", "covariancesBTexture", "centersTexture", "colorsTexture", "shTexture0", "shTexture1", "shTexture2"];
@@ -222,9 +222,7 @@ export class GaussianSplattingMaterial extends PushMaterial {
222
222
  }
223
223
  effect.setFloat2("focal", focal, focal);
224
224
  effect.setFloat("kernelSize", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);
225
- // vEyePosition doesn't get automatially bound on MacOS with Chromium for no apparent reason.
226
- // Binding it manually here instead. Remove next line when SH rendering is fine on that platform.
227
- scene.bindEyePosition(effect);
225
+ scene.bindEyePosition(effect, "eyePosition", true);
228
226
  if (gsMesh.covariancesATexture) {
229
227
  const textureSize = gsMesh.covariancesATexture.getSize();
230
228
  effect.setFloat2("dataTextureSize", textureSize.width, textureSize.height);
@@ -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 \"core/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 \"core/Cameras/camera\";\r\n\r\nimport \"../../Shaders/gaussianSplatting.fragment\";\r\nimport \"../../Shaders/gaussianSplatting.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.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 }\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 /**\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(mesh, scene, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, false, defines);\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 const attribs = [VertexBuffer.PositionKind, \"splatIndex\"];\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n const 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 \"vEyePosition\",\r\n \"kernelSize\",\r\n ];\r\n const samplers = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\", \"shTexture0\", \"shTexture1\", \"shTexture2\"];\r\n const uniformBuffers = [\"Scene\", \"Mesh\"];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(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: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: 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.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n\r\n // vEyePosition doesn't get automatially bound on MacOS with Chromium for no apparent reason.\r\n // Binding it manually here instead. Remove next line when SH rendering is fine on that platform.\r\n scene.bindEyePosition(effect);\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 /**\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":"AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,gCAA4B;AAE7C,OAAO,0CAA0C,CAAC;AAClD,OAAO,wCAAwC,CAAC;AAChD,OAAO,8CAA8C,CAAC;AACtD,OAAO,4CAA4C,CAAC;AACpD,OAAO,EACH,iBAAiB,EACjB,YAAY,EACZ,6BAA6B,EAC7B,2BAA2B,EAC3B,iCAAiC,EACjC,qBAAqB,EACrB,8BAA8B,GACjC,MAAM,6BAA6B,CAAC;AAGrC;;GAEG;AACH,MAAM,gCAAiC,SAAQ,eAAe;IAa1D;;OAEG;IACH;QACI,KAAK,EAAE,CAAC;QAhBL,QAAG,GAAG,KAAK,CAAC;QACZ,mBAAc,GAAG,IAAI,CAAC;QACtB,qBAAgB,GAAG,KAAK,CAAC;QACzB,cAAS,GAAG,KAAK,CAAC;QAClB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,KAAK,CAAC;QACnB,cAAS,GAAG,CAAC,CAAC;QACd,iBAAY,GAAG,KAAK,CAAC;QAOxB,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,YAAY;IACvD;;;;OAIG;IACH,YAAY,IAAY,EAAE,KAAa;QACnC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAevB;;WAEG;QACI,eAAU,GAAG,yBAAyB,CAAC,UAAU,CAAC;QACjD,kBAAa,GAAG,yBAAyB,CAAC,YAAY,CAAC;QAE/D,8CAA8C;QACtC,aAAQ,GAAG,KAAK,CAAC;QApBrB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IACjC,CAAC;IAqBD;;OAEG;IACH,IAAW,YAAY,CAAC,KAAc;QAClC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAoB,uBAAuB;QACvC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACa,gBAAgB;QAC5B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;OAGG;IACa,iBAAiB;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACa,iBAAiB,CAAC,IAAkB,EAAE,OAAgB;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC;QAE1B,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,OAAO,GAAqC,OAAO,CAAC,eAAe,CAAC;QAExE,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,WAAW,CAAC,mBAAmB,IAAI,WAAW,CAAC,4BAA4B,KAAK,YAAY,EAAE,CAAC;gBAC/F,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC3B,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,gCAAgC,EAAE,CAAC;QAC/E,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAA6B,CAAC;QAE7C,QAAQ;QACR,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAEjH,kDAAkD;QAClD,iCAAiC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE1F,UAAU;QACV,2BAA2B,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAEzD,4BAA4B;QAC5B,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3C,CAAC;QAED,eAAe;QACf,MAAM,aAAa,GAAG,MAAM,CAAC,QAAqC,CAAC;QACnE,OAAO,CAAC,cAAc,CAAC,GAAG,aAAa,IAAI,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,yBAAyB,CAAC,YAAY,CAAC;QAE5I,qBAAqB;QACrB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,eAAe,EAAE,CAAC;YAC1B,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAE5B,YAAY;YACZ,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAE1D,6BAA6B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEhD,MAAM,QAAQ,GAAG;gBACb,OAAO;gBACP,MAAM;gBACN,YAAY;gBACZ,WAAW;gBACX,WAAW;gBACX,0BAA0B;gBAC1B,aAAa;gBACb,iBAAiB;gBACjB,OAAO;gBACP,aAAa;gBACb,YAAY;aACf,CAAC;YACF,MAAM,QAAQ,GAAG,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;YAC7I,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAEzC,8BAA8B,CAAyB;gBACnD,aAAa,EAAE,QAAQ;gBACvB,mBAAmB,EAAE,cAAc;gBACnC,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,OAAO;aACnB,CAAC,CAAC;YAEH,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YAE/B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CACzC,mBAAmB,EACK;gBACpB,UAAU,EAAE,OAAO;gBACnB,aAAa,EAAE,QAAQ;gBACvB,mBAAmB,EAAE,cAAc;gBACnC,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,eAAe,EAAE,EAAE;gBACnB,cAAc,EAAE,IAAI,CAAC,eAAe;gBACpC,yBAAyB,EAAE,KAAK,IAAI,EAAE;oBAClC,IAAI,IAAI,CAAC,eAAe,gCAAwB,EAAE,CAAC;wBAC/C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,8CAA8C,CAAC,EAAE,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC;oBACtI,CAAC;yBAAM,CAAC;wBACJ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,0CAA0C,CAAC,EAAE,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC,CAAC;oBAC9H,CAAC;gBACL,CAAC;aACJ,EACD,MAAM,CACT,CAAC;YACF,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACxC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACvC,WAAW,CAAC,4BAA4B,GAAG,YAAY,CAAC;QACxD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,UAAU,CAAC,IAAU,EAAE,MAAc,EAAE,KAAY;QAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;QAElC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAE9C,MAAM,MAAM,GAAG,IAA6B,CAAC;QAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,QAAqC,CAAC;QAEhE,yCAAyC;QACzC,MAAM,YAAY,GAAG,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;QAE/D,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC;QAEpF,IAAI,KAAK,GAAG,IAAI,CAAC;QAEjB,IAAI,MAAM,EAAE,CAAC;YACT;;;;;;cAME;YACF,MAAM,CAAC,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;gBAClD,KAAK,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACJ,KAAK,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACpC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;QAClI,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;QAEnD,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YAEzD,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAE3E,MAAM,CAAC,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACrE,MAAM,CAAC,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACrE,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YAEzD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjD,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IACD;;;;;OAKG;IACa,cAAc,CAAC,KAAa,EAAE,IAAU,EAAE,OAAgB;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAqC,OAAO,CAAC,eAAe,CAAC;QAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAE5B,iBAAiB;QACjB,IAAI,CAAC,oBAAoB,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE7B,YAAY;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7E,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAChC,yBAAyB,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACtE,aAAa;YACb,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,8BAA8B,EAAE,CAAC;YACpE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACpC,CAAC;QAED,MAAM;QACN,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAEvC,aAAa;QACb,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACa,KAAK,CAAC,IAAY;QAC9B,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,yBAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACvG,CAAC;IAED;;;OAGG;IACa,SAAS;QACrB,MAAM,mBAAmB,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAC9C,mBAAmB,CAAC,UAAU,GAAG,mCAAmC,CAAC;QACrE,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,2BAA2B,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAU,KAAK,CAAC,MAAW,EAAE,KAAY,EAAE,OAAe;QACnE,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACtH,CAAC;;AAvUD;;GAEG;AACW,oCAAU,GAAW,GAAG,AAAd,CAAe;AAEvC;;GAEG;AACW,sCAAY,GAAY,KAAK,AAAjB,CAAkB;AAkUhD,aAAa,CAAC,mCAAmC,EAAE,yBAAyB,CAAC,CAAC","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 \"core/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 \"core/Cameras/camera\";\r\n\r\nimport \"../../Shaders/gaussianSplatting.fragment\";\r\nimport \"../../Shaders/gaussianSplatting.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.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 }\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 /**\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(mesh, scene, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, false, defines);\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 const attribs = [VertexBuffer.PositionKind, \"splatIndex\"];\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n const 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 ];\r\n const samplers = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\", \"shTexture0\", \"shTexture1\", \"shTexture2\"];\r\n const uniformBuffers = [\"Scene\", \"Mesh\"];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(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: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: 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.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 /**\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"]}
@@ -23,6 +23,14 @@ export declare class GaussianBlock extends NodeMaterialBlock {
23
23
  * Gets the rgba output component
24
24
  */
25
25
  get rgba(): NodeMaterialConnectionPoint;
26
+ /**
27
+ * Gets the rgb output component
28
+ */
29
+ get rgb(): NodeMaterialConnectionPoint;
30
+ /**
31
+ * Gets the alpha output component
32
+ */
33
+ get alpha(): NodeMaterialConnectionPoint;
26
34
  /**
27
35
  * Initialize the block and prepare the context for build
28
36
  * @param state defines the state that will be used for the build
@@ -15,6 +15,8 @@ export class GaussianBlock extends NodeMaterialBlock {
15
15
  this._isUnique = false;
16
16
  this.registerInput("splatColor", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment);
17
17
  this.registerOutput("rgba", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment);
18
+ this.registerOutput("rgb", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Fragment);
19
+ this.registerOutput("alpha", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Fragment);
18
20
  }
19
21
  /**
20
22
  * Gets the current class name
@@ -35,6 +37,18 @@ export class GaussianBlock extends NodeMaterialBlock {
35
37
  get rgba() {
36
38
  return this._outputs[0];
37
39
  }
40
+ /**
41
+ * Gets the rgb output component
42
+ */
43
+ get rgb() {
44
+ return this._outputs[1];
45
+ }
46
+ /**
47
+ * Gets the alpha output component
48
+ */
49
+ get alpha() {
50
+ return this._outputs[2];
51
+ }
38
52
  /**
39
53
  * Initialize the block and prepare the context for build
40
54
  * @param state defines the state that will be used for the build
@@ -54,14 +68,20 @@ export class GaussianBlock extends NodeMaterialBlock {
54
68
  state._emitFunctionFromInclude("fogFragmentDeclaration", comments);
55
69
  state._emitFunctionFromInclude("gaussianSplattingFragmentDeclaration", comments);
56
70
  state._emitVaryingFromString("vPosition", NodeMaterialBlockConnectionPointTypes.Vector2);
71
+ const tempSplatColor = state._getFreeVariableName("tempSplatColor");
57
72
  const color = this.splatColor;
58
- const output = this._outputs[0];
73
+ const rgba = this._outputs[0];
74
+ const rgb = this._outputs[1];
75
+ const alpha = this._outputs[2];
59
76
  if (state.shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
60
- state.compilationString += `${state._declareOutput(output)} = gaussianColor(${color.associatedVariableName}, input.vPosition);\n`;
77
+ state.compilationString += `let ${tempSplatColor}:vec4f = gaussianColor(${color.associatedVariableName}, input.vPosition);\n`;
61
78
  }
62
79
  else {
63
- state.compilationString += `${state._declareOutput(output)} = gaussianColor(${color.associatedVariableName});\n`;
80
+ state.compilationString += `vec4 ${tempSplatColor} = gaussianColor(${color.associatedVariableName});\n`;
64
81
  }
82
+ state.compilationString += `${state._declareOutput(rgba)} = ${tempSplatColor}.rgba;`;
83
+ state.compilationString += `${state._declareOutput(rgb)} = ${tempSplatColor}.rgb;`;
84
+ state.compilationString += `${state._declareOutput(alpha)} = ${tempSplatColor}.a;`;
65
85
  return this;
66
86
  }
67
87
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAE1G,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,iBAAiB;IAChD;;;OAGG;IACH,YAAmB,IAAY;QAC3B,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,qCAAqC,CAAC,MAAM,EAAE,KAAK,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAEzH,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,qCAAqC,CAAC,MAAM,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACjH,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,eAAe,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACa,UAAU,CAAC,KAA6B;QACpD,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAEkB,WAAW,CAAC,KAA6B;QACxD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzB,IAAI,KAAK,CAAC,MAAM,KAAK,wBAAwB,CAAC,MAAM,EAAE,CAAC;YACnD,OAAO;QACX,CAAC;QAED,YAAY;QACZ,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,KAAK,CAAC,wBAAwB,CAAC,8BAA8B,EAAE,QAAQ,CAAC,CAAC;QACzE,KAAK,CAAC,wBAAwB,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAChE,KAAK,CAAC,wBAAwB,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;QACnE,KAAK,CAAC,wBAAwB,CAAC,sCAAsC,EAAE,QAAQ,CAAC,CAAC;QACjF,KAAK,CAAC,sBAAsB,CAAC,WAAW,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEhC,IAAI,KAAK,CAAC,cAAc,gCAAwB,EAAE,CAAC;YAC/C,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,sBAAsB,uBAAuB,CAAC;QACtI,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,oBAAoB,KAAK,CAAC,sBAAsB,MAAM,CAAC;QACrH,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED,aAAa,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used for the Gaussian Splatting Fragment part\r\n */\r\nexport class GaussianBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new GaussianBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = false;\r\n\r\n this.registerInput(\"splatColor\", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"GaussianBlock\";\r\n }\r\n\r\n /**\r\n * Gets the color input component\r\n */\r\n public get splatColor(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgba output component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"vPosition\");\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n // Emit code\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"clipPlaneFragmentDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"logDepthDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"fogFragmentDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"gaussianSplattingFragmentDeclaration\", comments);\r\n state._emitVaryingFromString(\"vPosition\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n const color = this.splatColor;\r\n const output = this._outputs[0];\r\n\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n state.compilationString += `${state._declareOutput(output)} = gaussianColor(${color.associatedVariableName}, input.vPosition);\\n`;\r\n } else {\r\n state.compilationString += `${state._declareOutput(output)} = gaussianColor(${color.associatedVariableName});\\n`;\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianBlock\", GaussianBlock);\r\n"]}
1
+ {"version":3,"file":"gaussianBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used for the Gaussian Splatting Fragment part\r\n */\r\nexport class GaussianBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new GaussianBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this._isUnique = false;\r\n\r\n this.registerInput(\"splatColor\", NodeMaterialBlockConnectionPointTypes.Color4, false, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Fragment);\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Fragment);\r\n this.registerOutput(\"alpha\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Fragment);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"GaussianBlock\";\r\n }\r\n\r\n /**\r\n * Gets the color input component\r\n */\r\n public get splatColor(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgba output component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb output component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the alpha output component\r\n */\r\n public get alpha(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"vPosition\");\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n // Emit code\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"clipPlaneFragmentDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"logDepthDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"fogFragmentDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"gaussianSplattingFragmentDeclaration\", comments);\r\n state._emitVaryingFromString(\"vPosition\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n\r\n const tempSplatColor = state._getFreeVariableName(\"tempSplatColor\");\r\n const color = this.splatColor;\r\n const rgba = this._outputs[0];\r\n const rgb = this._outputs[1];\r\n const alpha = this._outputs[2];\r\n\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n state.compilationString += `let ${tempSplatColor}:vec4f = gaussianColor(${color.associatedVariableName}, input.vPosition);\\n`;\r\n } else {\r\n state.compilationString += `vec4 ${tempSplatColor} = gaussianColor(${color.associatedVariableName});\\n`;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(rgba)} = ${tempSplatColor}.rgba;`;\r\n state.compilationString += `${state._declareOutput(rgb)} = ${tempSplatColor}.rgb;`;\r\n state.compilationString += `${state._declareOutput(alpha)} = ${tempSplatColor}.a;`;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianBlock\", GaussianBlock);\r\n"]}
@@ -1,6 +1,8 @@
1
1
  import { NodeMaterialBlock } from "../../nodeMaterialBlock.js";
2
2
  import type { NodeMaterialBuildState } from "../../nodeMaterialBuildState.js";
3
3
  import type { NodeMaterialConnectionPoint } from "../../nodeMaterialBlockConnectionPoint.js";
4
+ import type { AbstractMesh } from "../../../../Meshes/abstractMesh.js";
5
+ import type { NodeMaterial, NodeMaterialDefines } from "../../nodeMaterial.js";
4
6
  /**
5
7
  * Block used for the Gaussian Splatting
6
8
  */
@@ -39,10 +41,21 @@ export declare class GaussianSplattingBlock extends NodeMaterialBlock {
39
41
  * Gets the splatVertex output component
40
42
  */
41
43
  get splatVertex(): NodeMaterialConnectionPoint;
44
+ /**
45
+ * Gets the SH output contribution
46
+ */
47
+ get SH(): NodeMaterialConnectionPoint;
42
48
  /**
43
49
  * Initialize the block and prepare the context for build
44
50
  * @param state defines the state that will be used for the build
45
51
  */
46
52
  initialize(state: NodeMaterialBuildState): void;
53
+ /**
54
+ * Update defines for shader compilation
55
+ * @param mesh defines the mesh to be rendered
56
+ * @param nodeMaterial defines the node material requesting the update
57
+ * @param defines defines the material defines to update
58
+ */
59
+ prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines): void;
47
60
  protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
48
61
  }
@@ -20,6 +20,7 @@ export class GaussianSplattingBlock extends NodeMaterialBlock {
20
20
  this.registerInput("view", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);
21
21
  this.registerInput("projection", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);
22
22
  this.registerOutput("splatVertex", NodeMaterialBlockConnectionPointTypes.Vector4, NodeMaterialBlockTargets.Vertex);
23
+ this.registerOutput("SH", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Vertex);
23
24
  }
24
25
  /**
25
26
  * Gets the current class name
@@ -64,6 +65,12 @@ export class GaussianSplattingBlock extends NodeMaterialBlock {
64
65
  get splatVertex() {
65
66
  return this._outputs[0];
66
67
  }
68
+ /**
69
+ * Gets the SH output contribution
70
+ */
71
+ get SH() {
72
+ return this._outputs[1];
73
+ }
67
74
  /**
68
75
  * Initialize the block and prepare the context for build
69
76
  * @param state defines the state that will be used for the build
@@ -72,18 +79,33 @@ export class GaussianSplattingBlock extends NodeMaterialBlock {
72
79
  state._excludeVariableName("focal");
73
80
  state._excludeVariableName("invViewport");
74
81
  state._excludeVariableName("kernelSize");
82
+ state._excludeVariableName("eyePosition");
83
+ }
84
+ /**
85
+ * Update defines for shader compilation
86
+ * @param mesh defines the mesh to be rendered
87
+ * @param nodeMaterial defines the node material requesting the update
88
+ * @param defines defines the material defines to update
89
+ */
90
+ prepareDefines(mesh, nodeMaterial, defines) {
91
+ if (mesh.getClassName() == "GaussianSplattingMesh") {
92
+ defines.setValue("SH_DEGREE", mesh.shDegree, true);
93
+ }
75
94
  }
76
95
  _buildBlock(state) {
77
96
  super._buildBlock(state);
78
97
  if (state.target === NodeMaterialBlockTargets.Fragment) {
79
98
  return;
80
99
  }
100
+ state.sharedData.blocksWithDefines.push(this);
81
101
  const comments = `//${this.name}`;
82
102
  state._emitFunctionFromInclude("gaussianSplattingVertexDeclaration", comments);
83
103
  state._emitFunctionFromInclude("gaussianSplatting", comments);
104
+ state._emitFunctionFromInclude("helperFunctions", comments);
84
105
  state._emitUniformFromString("focal", NodeMaterialBlockConnectionPointTypes.Vector2);
85
106
  state._emitUniformFromString("invViewport", NodeMaterialBlockConnectionPointTypes.Vector2);
86
107
  state._emitUniformFromString("kernelSize", NodeMaterialBlockConnectionPointTypes.Float);
108
+ state._emitUniformFromString("eyePosition", NodeMaterialBlockConnectionPointTypes.Vector3);
87
109
  state.attributes.push(VertexBuffer.PositionKind);
88
110
  state.sharedData.nodeMaterial.backFaceCulling = false;
89
111
  const splatPosition = this.splatPosition;
@@ -92,6 +114,7 @@ export class GaussianSplattingBlock extends NodeMaterialBlock {
92
114
  const view = this.view;
93
115
  const projection = this.projection;
94
116
  const output = this.splatVertex;
117
+ const sh = this.SH;
95
118
  const addF = state.fSuffix;
96
119
  let splatScaleParameter = `vec2${addF}(1.,1.)`;
97
120
  if (splatScale.isConnected) {
@@ -103,6 +126,27 @@ export class GaussianSplattingBlock extends NodeMaterialBlock {
103
126
  input = "input.position";
104
127
  uniforms = ", uniforms.focal, uniforms.invViewport, uniforms.kernelSize";
105
128
  }
129
+ if (this.SH.isConnected) {
130
+ state.compilationString += `#if SH_DEGREE > 0\n`;
131
+ if (state.shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
132
+ state.compilationString += `let worldRot: mat3x3f = mat3x3f(${world.associatedVariableName}[0].xyz, ${world.associatedVariableName}[1].xyz, ${world.associatedVariableName}[2].xyz);`;
133
+ state.compilationString += `let normWorldRot: mat3x3f = inverseMat3(worldRot);`;
134
+ state.compilationString += `var dir: vec3f = normalize(normWorldRot * (${splatPosition.associatedVariableName}.xyz - uniforms.eyePosition));\n`;
135
+ }
136
+ else {
137
+ state.compilationString += `mat3 worldRot = mat3(${world.associatedVariableName});`;
138
+ state.compilationString += `mat3 normWorldRot = inverseMat3(worldRot);`;
139
+ state.compilationString += `vec3 dir = normalize(normWorldRot * (${splatPosition.associatedVariableName}.xyz - eyePosition));\n`;
140
+ }
141
+ state.compilationString += `dir *= vec3${addF}(1.,1.,-1.);\n`;
142
+ state.compilationString += `${state._declareOutput(sh)} = computeSH(splat, dir);\n`;
143
+ state.compilationString += `#else\n`;
144
+ state.compilationString += `${state._declareOutput(sh)} = vec3${addF}(0.,0.,0.);\n`;
145
+ state.compilationString += `#endif;\n`;
146
+ }
147
+ else {
148
+ state.compilationString += `${state._declareOutput(sh)} = vec3${addF}(0.,0.,0.);`;
149
+ }
106
150
  state.compilationString += `${state._declareOutput(output)} = gaussianSplatting(${input}, ${splatPosition.associatedVariableName}, ${splatScaleParameter}, covA, covB, ${world.associatedVariableName}, ${view.associatedVariableName}, ${projection.associatedVariableName}${uniforms});\n`;
107
151
  return this;
108
152
  }