@babylonjs/core 9.12.0 → 9.13.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 (127) hide show
  1. package/Behaviors/Cameras/interpolatingBehavior.d.ts +17 -2
  2. package/Behaviors/Cameras/interpolatingBehavior.js +53 -23
  3. package/Behaviors/Cameras/interpolatingBehavior.js.map +1 -1
  4. package/Cameras/Inputs/flyCameraKeyboardInput.js +9 -1
  5. package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
  6. package/Cameras/Inputs/flyCameraMouseInput.d.ts +2 -0
  7. package/Cameras/Inputs/flyCameraMouseInput.js +14 -2
  8. package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
  9. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +25 -5
  10. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  11. package/Cameras/Inputs/freeCameraMouseInput.d.ts +14 -0
  12. package/Cameras/Inputs/freeCameraMouseInput.js +26 -4
  13. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  14. package/Cameras/Inputs/freeCameraTouchInput.js +16 -5
  15. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  16. package/Cameras/Inputs/geospatialCameraKeyboardInput.js +8 -1
  17. package/Cameras/Inputs/geospatialCameraKeyboardInput.js.map +1 -1
  18. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  19. package/Cameras/flyCamera.pure.d.ts +8 -0
  20. package/Cameras/flyCamera.pure.js.map +1 -1
  21. package/Cameras/freeCamera.pure.d.ts +8 -0
  22. package/Cameras/freeCamera.pure.js.map +1 -1
  23. package/Cameras/geospatialCamera.pure.d.ts +30 -7
  24. package/Cameras/geospatialCamera.pure.js +39 -14
  25. package/Cameras/geospatialCamera.pure.js.map +1 -1
  26. package/Cameras/geospatialCameraMovement.js +2 -2
  27. package/Cameras/geospatialCameraMovement.js.map +1 -1
  28. package/Cameras/index.d.ts +1 -0
  29. package/Cameras/index.js +1 -0
  30. package/Cameras/index.js.map +1 -1
  31. package/Cameras/pure.d.ts +1 -0
  32. package/Cameras/pure.js +1 -0
  33. package/Cameras/pure.js.map +1 -1
  34. package/Cameras/targetCamera.pure.d.ts +25 -0
  35. package/Cameras/targetCamera.pure.js +83 -25
  36. package/Cameras/targetCamera.pure.js.map +1 -1
  37. package/Cameras/targetCameraMovement.d.ts +56 -0
  38. package/Cameras/targetCameraMovement.js +63 -0
  39. package/Cameras/targetCameraMovement.js.map +1 -0
  40. package/Collisions/gpuPicker.d.ts +111 -4
  41. package/Collisions/gpuPicker.js +673 -106
  42. package/Collisions/gpuPicker.js.map +1 -1
  43. package/Engines/AbstractEngine/abstractEngine.scissor.d.ts +18 -0
  44. package/Engines/AbstractEngine/abstractEngine.scissor.js +2 -0
  45. package/Engines/AbstractEngine/abstractEngine.scissor.js.map +1 -0
  46. package/Engines/Native/nativeInterfaces.d.ts +1 -0
  47. package/Engines/Native/nativeInterfaces.js.map +1 -1
  48. package/Engines/abstractEngine.pure.js +2 -2
  49. package/Engines/abstractEngine.pure.js.map +1 -1
  50. package/Engines/engine.d.ts +1 -0
  51. package/Engines/engine.js +1 -0
  52. package/Engines/engine.js.map +1 -1
  53. package/Engines/engine.pure.d.ts +0 -12
  54. package/Engines/engine.pure.js +0 -20
  55. package/Engines/engine.pure.js.map +1 -1
  56. package/Engines/nullEngine.pure.d.ts +66 -0
  57. package/Engines/nullEngine.pure.js +97 -0
  58. package/Engines/nullEngine.pure.js.map +1 -1
  59. package/Engines/pure.d.ts +1 -0
  60. package/Engines/pure.js +1 -0
  61. package/Engines/pure.js.map +1 -1
  62. package/Engines/thinEngine.scissor.d.ts +6 -0
  63. package/Engines/thinEngine.scissor.js +9 -0
  64. package/Engines/thinEngine.scissor.js.map +1 -0
  65. package/Engines/thinEngine.scissor.pure.d.ts +6 -0
  66. package/Engines/thinEngine.scissor.pure.js +24 -0
  67. package/Engines/thinEngine.scissor.pure.js.map +1 -0
  68. package/Engines/thinNativeEngine.d.ts +0 -1
  69. package/Engines/thinNativeEngine.js +0 -1
  70. package/Engines/thinNativeEngine.js.map +1 -1
  71. package/Engines/thinNativeEngine.pure.d.ts +3 -0
  72. package/Engines/thinNativeEngine.pure.js +50 -4
  73. package/Engines/thinNativeEngine.pure.js.map +1 -1
  74. package/Engines/webgpuEngine.pure.js.map +1 -1
  75. package/Loading/sceneLoader.d.ts +5 -1
  76. package/Loading/sceneLoader.js +298 -401
  77. package/Loading/sceneLoader.js.map +1 -1
  78. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.d.ts +15 -0
  79. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +34 -1
  80. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
  81. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +9 -0
  82. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +26 -2
  83. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
  84. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js +10 -3
  85. package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js.map +1 -1
  86. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +3 -1
  87. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
  88. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +18 -8
  89. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  90. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +77 -1
  91. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +243 -104
  92. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  93. package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.d.ts +39 -0
  94. package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js +308 -0
  95. package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js.map +1 -0
  96. package/Meshes/geometry.js +30 -15
  97. package/Meshes/geometry.js.map +1 -1
  98. package/Meshes/mesh.pure.js +26 -14
  99. package/Meshes/mesh.pure.js.map +1 -1
  100. package/Misc/tools.pure.js +1 -1
  101. package/Misc/tools.pure.js.map +1 -1
  102. package/Shaders/ShadersInclude/gaussianSplatting.js +1 -0
  103. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  104. package/Shaders/gaussianSplatting.fragment.js +17 -1
  105. package/Shaders/gaussianSplatting.fragment.js.map +1 -1
  106. package/Shaders/gaussianSplatting.vertex.js +1 -1
  107. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  108. package/Shaders/gaussianSplattingDepth.vertex.js +1 -1
  109. package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -1
  110. package/Shaders/greasedLine.vertex.js +19 -3
  111. package/Shaders/greasedLine.vertex.js.map +1 -1
  112. package/Shaders/picking.fragment.js +39 -3
  113. package/Shaders/picking.fragment.js.map +1 -1
  114. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +3 -1
  115. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  116. package/ShadersWGSL/gaussianSplatting.fragment.js +14 -1
  117. package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
  118. package/ShadersWGSL/gaussianSplatting.vertex.js +2 -2
  119. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  120. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -2
  121. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
  122. package/ShadersWGSL/picking.fragment.js +22 -1
  123. package/ShadersWGSL/picking.fragment.js.map +1 -1
  124. package/package.json +3 -2
  125. package/scene.pure.d.ts +12 -0
  126. package/scene.pure.js +36 -0
  127. package/scene.pure.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"greasedLinePluginMaterialShadersGLSL.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,gBAAgB;AAChB,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,YAAqB;IACnE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAQ;YACb,yBAAyB,EAAE;;;;;;;;;;;;;;;;;;;;iBAoBtB;YACL,6BAA6B,EAAE;;;;;;;iBAO1B;YACL,sBAAsB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8CnB;SACR,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACf,GAAG,CAAC,2CAA2C,CAAC,GAAG,IAAI,CAAC,CAAC,mCAAmC;QAChG,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO;YACH,2BAA2B,EAAE;;;;;;;;;;iBAUxB;YACL,gCAAgC,EAAE;;;;;;;;;;;;;;;;;;;;8CAoBA,+CAAuC;;qDAEhC,+CAAuC;;qDAEvC,oDAA4C;;;;;;;;;;;kDAW/C,+CAAuC;;yDAEhC,+CAAuC;;yDAEvC,oDAA4C;;;;;iBAKpF;SACR,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import { type Nullable } from \"../../types\";\nimport { GreasedLineMeshColorMode } from \"./greasedLineMaterialInterfaces\";\n\n/**\n * Returns GLSL custom shader code\n * @param shaderType vertex or fragment\n * @param cameraFacing is in camera facing mode?\n * @returns GLSL custom shader code\n */\n/** @internal */\nexport function GetCustomCode(shaderType: string, cameraFacing: boolean): Nullable<{ [pointName: string]: string }> {\n if (shaderType === \"vertex\") {\n const obj: any = {\n CUSTOM_VERTEX_DEFINITIONS: `\n attribute float grl_widths;\n attribute vec3 grl_offsets;\n attribute float grl_colorPointers;\n varying float grlCounters;\n varying float grlColorPointer;\n\n #ifdef GREASED_LINE_CAMERA_FACING\n attribute vec4 grl_previousAndSide;\n attribute vec4 grl_nextAndCounters;\n\n vec2 grlFix( vec4 i, float aspect ) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n }\n #else\n attribute vec3 grl_slopes;\n attribute float grl_counters;\n #endif\n `,\n CUSTOM_VERTEX_UPDATE_POSITION: `\n #ifdef GREASED_LINE_CAMERA_FACING\n vec3 grlPositionOffset = grl_offsets;\n positionUpdated += grlPositionOffset;\n #else\n positionUpdated = (positionUpdated + grl_offsets) + (grl_slopes * grl_widths);\n #endif\n `,\n CUSTOM_VERTEX_MAIN_END: `\n grlColorPointer = grl_colorPointers;\n\n #ifdef GREASED_LINE_CAMERA_FACING\n\n float grlAspect = grl_aspect_resolution_lineWidth.x;\n float grlBaseWidth = grl_aspect_resolution_lineWidth.w;\n\n vec3 grlPrevious = grl_previousAndSide.xyz;\n float grlSide = grl_previousAndSide.w;\n\n vec3 grlNext = grl_nextAndCounters.xyz;\n grlCounters = grl_nextAndCounters.w;\n float grlWidth = grlBaseWidth * grl_widths;\n \n vec3 worldDir = normalize(grlNext - grlPrevious);\n vec3 nearPosition = positionUpdated + (worldDir * 0.01);\n mat4 grlMatrix = viewProjection * finalWorld;\n vec4 grlFinalPosition = grlMatrix * vec4(positionUpdated , 1.0);\n vec4 screenNearPos = grlMatrix * vec4(nearPosition, 1.0);\n vec2 grlLinePosition = grlFix(grlFinalPosition, grlAspect);\n vec2 grlLineNearPosition = grlFix(screenNearPos, grlAspect);\n vec2 grlDir = normalize(grlLineNearPosition - grlLinePosition);\n\n vec4 grlNormal = vec4(-grlDir.y, grlDir.x, 0., 1.);\n\n #ifdef GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM\n grlNormal.xy *= -.5 * grlWidth;\n #else\n grlNormal.xy *= .5 * grlWidth;\n #endif\n\n grlNormal *= grl_projection;\n\n #ifdef GREASED_LINE_SIZE_ATTENUATION\n grlNormal.xy *= grlFinalPosition.w;\n grlNormal.xy /= (vec4(grl_aspect_resolution_lineWidth.yz, 0., 1.) * grl_projection).xy;\n #endif\n\n grlFinalPosition.xy += grlNormal.xy * grlSide;\n gl_Position = grlFinalPosition;\n\n vPositionW = vec3(grlFinalPosition);\n #else\n grlCounters = grl_counters;\n #endif\n `,\n };\n if (cameraFacing) {\n obj[\"!gl_Position\\\\=viewProjection\\\\*worldPos;\"] = \"//\"; // not needed for camera facing GRL\n }\n return obj;\n }\n\n if (shaderType === \"fragment\") {\n return {\n CUSTOM_FRAGMENT_DEFINITIONS: `\n #ifdef PBR\n #define grlFinalColor finalColor\n #else\n #define grlFinalColor color\n #endif\n\n varying float grlCounters;\n varying float grlColorPointer;\n uniform sampler2D grl_colors;\n `,\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\n float grlColorMode = grl_colorMode_visibility_colorsWidth_useColors.x;\n float grlVisibility = grl_colorMode_visibility_colorsWidth_useColors.y;\n float grlColorsWidth = grl_colorMode_visibility_colorsWidth_useColors.z;\n float grlUseColors = grl_colorMode_visibility_colorsWidth_useColors.w;\n\n float grlUseDash = grl_dashOptions.x;\n float grlDashArray = grl_dashOptions.y;\n float grlDashOffset = grl_dashOptions.z;\n float grlDashRatio = grl_dashOptions.w;\n\n grlFinalColor.a *= step(grlCounters, grlVisibility);\n if(grlFinalColor.a == 0.) discard;\n\n if(grlUseDash == 1.){\n grlFinalColor.a *= ceil(mod(grlCounters + grlDashOffset, grlDashArray) - (grlDashArray * grlDashRatio));\n if (grlFinalColor.a == 0.) discard;\n }\n\n #ifdef GREASED_LINE_HAS_COLOR\n if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_SET}.) {\n grlFinalColor.rgb = grl_singleColor;\n } else if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_ADD}.) {\n grlFinalColor.rgb += grl_singleColor;\n } else if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_MULTIPLY}.) {\n grlFinalColor.rgb *= grl_singleColor;\n }\n #else\n if (grlUseColors == 1.) {\n #ifdef GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE\n vec4 grlColor = texture2D(grl_colors, vec2(grlCounters, 0.), 0.);\n #else\n vec2 lookup = vec2(fract(grlColorPointer / grl_textureSize.x), 1.0 - floor(grlColorPointer / grl_textureSize.x) / max(grl_textureSize.y - 1.0, 1.0));\n vec4 grlColor = texture2D(grl_colors, lookup, 0.0);\n #endif\n if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_SET}.) {\n grlFinalColor = grlColor;\n } else if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_ADD}.) {\n grlFinalColor += grlColor;\n } else if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_MULTIPLY}.) {\n grlFinalColor *= grlColor;\n }\n }\n #endif\n `,\n };\n }\n\n return null;\n}\n"]}
1
+ {"version":3,"file":"greasedLinePluginMaterialShadersGLSL.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,gBAAgB;AAChB,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,YAAqB;IACnE,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAQ;YACb,yBAAyB,EAAE;;;;;;;;;;;;;;;;;;;;;;iBAsBtB;YACL,6BAA6B,EAAE;;;;;;;;;;;;iBAY1B;YACL,sBAAsB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8CnB;SACR,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACf,GAAG,CAAC,2CAA2C,CAAC,GAAG,IAAI,CAAC,CAAC,mCAAmC;QAChG,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO;YACH,2BAA2B,EAAE;;;;;;;;;;iBAUxB;YACL,gCAAgC,EAAE;;;;;;;;;;;;;;;;;;;;8CAoBA,+CAAuC;;qDAEhC,+CAAuC;;qDAEvC,oDAA4C;;;;;;;;;;;kDAW/C,+CAAuC;;yDAEhC,+CAAuC;;yDAEvC,oDAA4C;;;;;iBAKpF;SACR,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import { type Nullable } from \"../../types\";\nimport { GreasedLineMeshColorMode } from \"./greasedLineMaterialInterfaces\";\n\n/**\n * Returns GLSL custom shader code\n * @param shaderType vertex or fragment\n * @param cameraFacing is in camera facing mode?\n * @returns GLSL custom shader code\n */\n/** @internal */\nexport function GetCustomCode(shaderType: string, cameraFacing: boolean): Nullable<{ [pointName: string]: string }> {\n if (shaderType === \"vertex\") {\n const obj: any = {\n CUSTOM_VERTEX_DEFINITIONS: `\n attribute float grl_widths;\n #ifdef GREASED_LINE_USE_OFFSETS\n attribute vec3 grl_offsets;\n #endif\n attribute float grl_colorPointers;\n varying float grlCounters;\n varying float grlColorPointer;\n\n #ifdef GREASED_LINE_CAMERA_FACING\n attribute vec4 grl_previousAndSide;\n attribute vec4 grl_nextAndCounters;\n\n vec2 grlFix( vec4 i, float aspect ) {\n vec2 res = i.xy / i.w;\n res.x *= aspect;\n return res;\n }\n #else\n attribute vec3 grl_slopes;\n attribute float grl_counters;\n #endif\n `,\n CUSTOM_VERTEX_UPDATE_POSITION: `\n #ifdef GREASED_LINE_USE_OFFSETS\n vec3 grlPositionOffset = grl_offsets;\n #else\n vec3 grlPositionOffset = vec3(0.);\n #endif\n\n #ifdef GREASED_LINE_CAMERA_FACING\n positionUpdated += grlPositionOffset;\n #else\n positionUpdated = (positionUpdated + grlPositionOffset) + (grl_slopes * grl_widths);\n #endif\n `,\n CUSTOM_VERTEX_MAIN_END: `\n grlColorPointer = grl_colorPointers;\n\n #ifdef GREASED_LINE_CAMERA_FACING\n\n float grlAspect = grl_aspect_resolution_lineWidth.x;\n float grlBaseWidth = grl_aspect_resolution_lineWidth.w;\n\n vec3 grlPrevious = grl_previousAndSide.xyz;\n float grlSide = grl_previousAndSide.w;\n\n vec3 grlNext = grl_nextAndCounters.xyz;\n grlCounters = grl_nextAndCounters.w;\n float grlWidth = grlBaseWidth * grl_widths;\n \n vec3 worldDir = normalize(grlNext - grlPrevious);\n vec3 nearPosition = positionUpdated + (worldDir * 0.01);\n mat4 grlMatrix = viewProjection * finalWorld;\n vec4 grlFinalPosition = grlMatrix * vec4(positionUpdated , 1.0);\n vec4 screenNearPos = grlMatrix * vec4(nearPosition, 1.0);\n vec2 grlLinePosition = grlFix(grlFinalPosition, grlAspect);\n vec2 grlLineNearPosition = grlFix(screenNearPos, grlAspect);\n vec2 grlDir = normalize(grlLineNearPosition - grlLinePosition);\n\n vec4 grlNormal = vec4(-grlDir.y, grlDir.x, 0., 1.);\n\n #ifdef GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM\n grlNormal.xy *= -.5 * grlWidth;\n #else\n grlNormal.xy *= .5 * grlWidth;\n #endif\n\n grlNormal *= grl_projection;\n\n #ifdef GREASED_LINE_SIZE_ATTENUATION\n grlNormal.xy *= grlFinalPosition.w;\n grlNormal.xy /= (vec4(grl_aspect_resolution_lineWidth.yz, 0., 1.) * grl_projection).xy;\n #endif\n\n grlFinalPosition.xy += grlNormal.xy * grlSide;\n gl_Position = grlFinalPosition;\n\n vPositionW = vec3(grlFinalPosition);\n #else\n grlCounters = grl_counters;\n #endif\n `,\n };\n if (cameraFacing) {\n obj[\"!gl_Position\\\\=viewProjection\\\\*worldPos;\"] = \"//\"; // not needed for camera facing GRL\n }\n return obj;\n }\n\n if (shaderType === \"fragment\") {\n return {\n CUSTOM_FRAGMENT_DEFINITIONS: `\n #ifdef PBR\n #define grlFinalColor finalColor\n #else\n #define grlFinalColor color\n #endif\n\n varying float grlCounters;\n varying float grlColorPointer;\n uniform sampler2D grl_colors;\n `,\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\n float grlColorMode = grl_colorMode_visibility_colorsWidth_useColors.x;\n float grlVisibility = grl_colorMode_visibility_colorsWidth_useColors.y;\n float grlColorsWidth = grl_colorMode_visibility_colorsWidth_useColors.z;\n float grlUseColors = grl_colorMode_visibility_colorsWidth_useColors.w;\n\n float grlUseDash = grl_dashOptions.x;\n float grlDashArray = grl_dashOptions.y;\n float grlDashOffset = grl_dashOptions.z;\n float grlDashRatio = grl_dashOptions.w;\n\n grlFinalColor.a *= step(grlCounters, grlVisibility);\n if(grlFinalColor.a == 0.) discard;\n\n if(grlUseDash == 1.){\n grlFinalColor.a *= ceil(mod(grlCounters + grlDashOffset, grlDashArray) - (grlDashArray * grlDashRatio));\n if (grlFinalColor.a == 0.) discard;\n }\n\n #ifdef GREASED_LINE_HAS_COLOR\n if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_SET}.) {\n grlFinalColor.rgb = grl_singleColor;\n } else if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_ADD}.) {\n grlFinalColor.rgb += grl_singleColor;\n } else if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_MULTIPLY}.) {\n grlFinalColor.rgb *= grl_singleColor;\n }\n #else\n if (grlUseColors == 1.) {\n #ifdef GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE\n vec4 grlColor = texture2D(grl_colors, vec2(grlCounters, 0.), 0.);\n #else\n vec2 lookup = vec2(fract(grlColorPointer / grl_textureSize.x), 1.0 - floor(grlColorPointer / grl_textureSize.x) / max(grl_textureSize.y - 1.0, 1.0));\n vec4 grlColor = texture2D(grl_colors, lookup, 0.0);\n #endif\n if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_SET}.) {\n grlFinalColor = grlColor;\n } else if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_ADD}.) {\n grlFinalColor += grlColor;\n } else if (grlColorMode == ${GreasedLineMeshColorMode.COLOR_MODE_MULTIPLY}.) {\n grlFinalColor *= grlColor;\n }\n }\n #endif\n `,\n };\n }\n\n return null;\n}\n"]}
@@ -80,6 +80,7 @@ export class GaussianSplattingBlock extends NodeMaterialBlock {
80
80
  state._excludeVariableName("focal");
81
81
  state._excludeVariableName("invViewport");
82
82
  state._excludeVariableName("kernelSize");
83
+ state._excludeVariableName("minPixelSize");
83
84
  state._excludeVariableName("eyePosition");
84
85
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
85
86
  this._initShaderSourceAsync(state.shaderLanguage);
@@ -130,6 +131,7 @@ export class GaussianSplattingBlock extends NodeMaterialBlock {
130
131
  state._emitUniformFromString("focal", NodeMaterialBlockConnectionPointTypes.Vector2);
131
132
  state._emitUniformFromString("invViewport", NodeMaterialBlockConnectionPointTypes.Vector2);
132
133
  state._emitUniformFromString("kernelSize", NodeMaterialBlockConnectionPointTypes.Float);
134
+ state._emitUniformFromString("minPixelSize", NodeMaterialBlockConnectionPointTypes.Float);
133
135
  state._emitUniformFromString("eyePosition", NodeMaterialBlockConnectionPointTypes.Vector3);
134
136
  state.attributes.push(VertexBuffer.PositionKind);
135
137
  state.attributes.push("splatIndex0");
@@ -153,7 +155,7 @@ export class GaussianSplattingBlock extends NodeMaterialBlock {
153
155
  let uniforms = "";
154
156
  if (state.shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
155
157
  input = "input.position";
156
- uniforms = ", uniforms.focal, uniforms.invViewport, uniforms.kernelSize";
158
+ uniforms = ", uniforms.focal, uniforms.invViewport, uniforms.kernelSize, uniforms.minPixelSize";
157
159
  }
158
160
  if (this.SH.isConnected) {
159
161
  state.compilationString += `#if SH_DEGREE > 0\n`;
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { 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 { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport { type GaussianSplattingMesh } from \"core/Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh.pure\";\r\nimport { type NodeMaterial, type NodeMaterialDefines } from \"../../nodeMaterial.pure\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block used for the Gaussian Splatting\r\n */\r\nexport class GaussianSplattingBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new GaussianSplattingBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"splatPosition\", NodeMaterialBlockConnectionPointTypes.Vector3, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"splatScale\", NodeMaterialBlockConnectionPointTypes.Vector2, true, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"world\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"view\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"projection\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n\r\n this.registerOutput(\"splatVertex\", NodeMaterialBlockConnectionPointTypes.Vector4, NodeMaterialBlockTargets.Vertex);\r\n this.registerOutput(\"SH\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Vertex);\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 \"GaussianSplattingBlock\";\r\n }\r\n\r\n /**\r\n * Gets the position input component\r\n */\r\n public get splatPosition(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the scale input component\r\n */\r\n public get splatScale(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the View matrix input component\r\n */\r\n public get world(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the View matrix input component\r\n */\r\n public get view(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the projection matrix input component\r\n */\r\n public get projection(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the splatVertex output component\r\n */\r\n public get splatVertex(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the SH output contribution\r\n */\r\n public get SH(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\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(\"focal\");\r\n state._excludeVariableName(\"invViewport\");\r\n state._excludeVariableName(\"kernelSize\");\r\n state._excludeVariableName(\"eyePosition\");\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._initShaderSourceAsync(state.shaderLanguage);\r\n }\r\n\r\n private async _initShaderSourceAsync(shaderLanguage: ShaderLanguage) {\r\n this._codeIsReady = false;\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([\r\n import(\"../../../../ShadersWGSL/ShadersInclude/gaussianSplattingVertexDeclaration\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/gaussianSplatting\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/helperFunctions\"),\r\n ]);\r\n } else {\r\n await Promise.all([\r\n import(\"../../../../Shaders/ShadersInclude/gaussianSplattingVertexDeclaration\"),\r\n import(\"../../../../Shaders/ShadersInclude/gaussianSplatting\"),\r\n import(\"../../../../Shaders/ShadersInclude/helperFunctions\"),\r\n ]);\r\n }\r\n\r\n this._codeIsReady = true;\r\n this.onCodeIsReadyObservable.notifyObservers(this);\r\n }\r\n /**\r\n * Update defines for shader compilation\r\n * @param defines defines the material defines to update\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param mesh defines the mesh to be rendered\r\n */\r\n public override prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n if (mesh.getClassName() == \"GaussianSplattingMesh\") {\r\n defines.setValue(\"SH_DEGREE\", (<GaussianSplattingMesh>mesh).shDegree, true);\r\n }\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"gaussianSplattingVertexDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"gaussianSplatting\", comments);\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n state._emitUniformFromString(\"focal\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"invViewport\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"kernelSize\", NodeMaterialBlockConnectionPointTypes.Float);\r\n state._emitUniformFromString(\"eyePosition\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n state.attributes.push(VertexBuffer.PositionKind);\r\n state.attributes.push(\"splatIndex0\");\r\n state.attributes.push(\"splatIndex1\");\r\n state.attributes.push(\"splatIndex2\");\r\n state.attributes.push(\"splatIndex3\");\r\n state.sharedData.nodeMaterial.backFaceCulling = false;\r\n\r\n const splatPosition = this.splatPosition;\r\n const splatScale = this.splatScale;\r\n const world = this.world;\r\n const view = this.view;\r\n const projection = this.projection;\r\n const output = this.splatVertex;\r\n const sh = this.SH;\r\n\r\n const addF = state.fSuffix;\r\n let splatScaleParameter = `vec2${addF}(1.,1.)`;\r\n if (splatScale.isConnected) {\r\n splatScaleParameter = splatScale.associatedVariableName;\r\n }\r\n\r\n let input = \"position\";\r\n let uniforms = \"\";\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n input = \"input.position\";\r\n uniforms = \", uniforms.focal, uniforms.invViewport, uniforms.kernelSize\";\r\n }\r\n if (this.SH.isConnected) {\r\n state.compilationString += `#if SH_DEGREE > 0\\n`;\r\n\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n state.compilationString += `let worldRot: mat3x3f = mat3x3f(${world.associatedVariableName}[0].xyz, ${world.associatedVariableName}[1].xyz, ${world.associatedVariableName}[2].xyz);`;\r\n state.compilationString += `let normWorldRot: mat3x3f = inverseMat3(worldRot);`;\r\n state.compilationString += `var eyeToSplatLocalSpace: vec3f = normalize(normWorldRot * (${splatPosition.associatedVariableName}.xyz - uniforms.eyePosition));\\n`;\r\n } else {\r\n state.compilationString += `mat3 worldRot = mat3(${world.associatedVariableName});`;\r\n state.compilationString += `mat3 normWorldRot = inverseMat3(worldRot);`;\r\n state.compilationString += `vec3 eyeToSplatLocalSpace = normalize(normWorldRot * (${splatPosition.associatedVariableName}.xyz - eyePosition));\\n`;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(sh)} = computeSH(splat, eyeToSplatLocalSpace);\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(sh)} = vec3${addF}(0.,0.,0.);\\n`;\r\n state.compilationString += `#endif;\\n`;\r\n } else {\r\n state.compilationString += `${state._declareOutput(sh)} = vec3${addF}(0.,0.,0.);`;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(output)} = gaussianSplatting(${input}.xy, ${splatPosition.associatedVariableName}, ${splatScaleParameter}, covA, covB, ${world.associatedVariableName}, ${view.associatedVariableName}, ${projection.associatedVariableName}${uniforms});\\n`;\r\n return this;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for gaussianSplattingBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterGaussianSplattingBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.GaussianSplattingBlock\", GaussianSplattingBlock);\r\n}\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { 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 { VertexBuffer } from \"core/Meshes/buffer\";\r\nimport { type GaussianSplattingMesh } from \"core/Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh.pure\";\r\nimport { type NodeMaterial, type NodeMaterialDefines } from \"../../nodeMaterial.pure\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Block used for the Gaussian Splatting\r\n */\r\nexport class GaussianSplattingBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new GaussianSplattingBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"splatPosition\", NodeMaterialBlockConnectionPointTypes.Vector3, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"splatScale\", NodeMaterialBlockConnectionPointTypes.Vector2, true, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"world\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"view\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"projection\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n\r\n this.registerOutput(\"splatVertex\", NodeMaterialBlockConnectionPointTypes.Vector4, NodeMaterialBlockTargets.Vertex);\r\n this.registerOutput(\"SH\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Vertex);\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 \"GaussianSplattingBlock\";\r\n }\r\n\r\n /**\r\n * Gets the position input component\r\n */\r\n public get splatPosition(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the scale input component\r\n */\r\n public get splatScale(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the View matrix input component\r\n */\r\n public get world(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the View matrix input component\r\n */\r\n public get view(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the projection matrix input component\r\n */\r\n public get projection(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the splatVertex output component\r\n */\r\n public get splatVertex(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the SH output contribution\r\n */\r\n public get SH(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\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(\"focal\");\r\n state._excludeVariableName(\"invViewport\");\r\n state._excludeVariableName(\"kernelSize\");\r\n state._excludeVariableName(\"minPixelSize\");\r\n state._excludeVariableName(\"eyePosition\");\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._initShaderSourceAsync(state.shaderLanguage);\r\n }\r\n\r\n private async _initShaderSourceAsync(shaderLanguage: ShaderLanguage) {\r\n this._codeIsReady = false;\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([\r\n import(\"../../../../ShadersWGSL/ShadersInclude/gaussianSplattingVertexDeclaration\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/gaussianSplatting\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/helperFunctions\"),\r\n ]);\r\n } else {\r\n await Promise.all([\r\n import(\"../../../../Shaders/ShadersInclude/gaussianSplattingVertexDeclaration\"),\r\n import(\"../../../../Shaders/ShadersInclude/gaussianSplatting\"),\r\n import(\"../../../../Shaders/ShadersInclude/helperFunctions\"),\r\n ]);\r\n }\r\n\r\n this._codeIsReady = true;\r\n this.onCodeIsReadyObservable.notifyObservers(this);\r\n }\r\n /**\r\n * Update defines for shader compilation\r\n * @param defines defines the material defines to update\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param mesh defines the mesh to be rendered\r\n */\r\n public override prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n if (mesh.getClassName() == \"GaussianSplattingMesh\") {\r\n defines.setValue(\"SH_DEGREE\", (<GaussianSplattingMesh>mesh).shDegree, true);\r\n }\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"gaussianSplattingVertexDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"gaussianSplatting\", comments);\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n state._emitUniformFromString(\"focal\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"invViewport\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n state._emitUniformFromString(\"kernelSize\", NodeMaterialBlockConnectionPointTypes.Float);\r\n state._emitUniformFromString(\"minPixelSize\", NodeMaterialBlockConnectionPointTypes.Float);\r\n state._emitUniformFromString(\"eyePosition\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n state.attributes.push(VertexBuffer.PositionKind);\r\n state.attributes.push(\"splatIndex0\");\r\n state.attributes.push(\"splatIndex1\");\r\n state.attributes.push(\"splatIndex2\");\r\n state.attributes.push(\"splatIndex3\");\r\n state.sharedData.nodeMaterial.backFaceCulling = false;\r\n\r\n const splatPosition = this.splatPosition;\r\n const splatScale = this.splatScale;\r\n const world = this.world;\r\n const view = this.view;\r\n const projection = this.projection;\r\n const output = this.splatVertex;\r\n const sh = this.SH;\r\n\r\n const addF = state.fSuffix;\r\n let splatScaleParameter = `vec2${addF}(1.,1.)`;\r\n if (splatScale.isConnected) {\r\n splatScaleParameter = splatScale.associatedVariableName;\r\n }\r\n\r\n let input = \"position\";\r\n let uniforms = \"\";\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n input = \"input.position\";\r\n uniforms = \", uniforms.focal, uniforms.invViewport, uniforms.kernelSize, uniforms.minPixelSize\";\r\n }\r\n if (this.SH.isConnected) {\r\n state.compilationString += `#if SH_DEGREE > 0\\n`;\r\n\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n state.compilationString += `let worldRot: mat3x3f = mat3x3f(${world.associatedVariableName}[0].xyz, ${world.associatedVariableName}[1].xyz, ${world.associatedVariableName}[2].xyz);`;\r\n state.compilationString += `let normWorldRot: mat3x3f = inverseMat3(worldRot);`;\r\n state.compilationString += `var eyeToSplatLocalSpace: vec3f = normalize(normWorldRot * (${splatPosition.associatedVariableName}.xyz - uniforms.eyePosition));\\n`;\r\n } else {\r\n state.compilationString += `mat3 worldRot = mat3(${world.associatedVariableName});`;\r\n state.compilationString += `mat3 normWorldRot = inverseMat3(worldRot);`;\r\n state.compilationString += `vec3 eyeToSplatLocalSpace = normalize(normWorldRot * (${splatPosition.associatedVariableName}.xyz - eyePosition));\\n`;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(sh)} = computeSH(splat, eyeToSplatLocalSpace);\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(sh)} = vec3${addF}(0.,0.,0.);\\n`;\r\n state.compilationString += `#endif;\\n`;\r\n } else {\r\n state.compilationString += `${state._declareOutput(sh)} = vec3${addF}(0.,0.,0.);`;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(output)} = gaussianSplatting(${input}.xy, ${splatPosition.associatedVariableName}, ${splatScaleParameter}, covA, covB, ${world.associatedVariableName}, ${view.associatedVariableName}, ${projection.associatedVariableName}${uniforms});\\n`;\r\n return this;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for gaussianSplattingBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterGaussianSplattingBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.GaussianSplattingBlock\", GaussianSplattingBlock);\r\n}\r\n"]}
@@ -2,6 +2,7 @@
2
2
  import { Matrix, Quaternion, Vector3 } from "../../Maths/math.vector.pure.js";
3
3
  import { GetGaussianSplattingMaxPartCount } from "../../Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js";
4
4
  import { GaussianSplattingMeshBase, AllocateShBuffers } from "./gaussianSplattingMeshBase.pure.js";
5
+ import { GaussianSplattingSortWorkerCommand } from "./gaussianSplattingSortWorker.js";
5
6
  import { RawTexture } from "../../Materials/Textures/rawTexture.js";
6
7
 
7
8
  import { DecodeBase64ToBinary, EncodeArrayBufferToBase64 } from "../../Misc/stringTools.js";
@@ -249,8 +250,8 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
249
250
  * @param worker the newly created sort worker
250
251
  */
251
252
  _onWorkerCreated(worker) {
252
- worker.postMessage({ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)) });
253
- worker.postMessage({ partIndices: this._partIndices ? new Uint8Array(this._partIndices) : null });
253
+ worker.postMessage({ command: GaussianSplattingSortWorkerCommand.PART_MATRICES, partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)) });
254
+ worker.postMessage({ command: GaussianSplattingSortWorkerCommand.PART_INDICES, partIndices: this._partIndices ? new Uint8Array(this._partIndices) : null });
254
255
  }
255
256
  /**
256
257
  * Stores the raw part index array, padded to texture length, so the worker and GPU texture
@@ -304,7 +305,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
304
305
  _notifyWorkerNewData() {
305
306
  super._notifyWorkerNewData();
306
307
  if (this._worker) {
307
- this._worker.postMessage({ partIndices: this._partIndices ?? null });
308
+ this._worker.postMessage({ command: GaussianSplattingSortWorkerCommand.PART_INDICES, partIndices: this._partIndices ?? null });
308
309
  }
309
310
  }
310
311
  /**
@@ -371,7 +372,10 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
371
372
  // once the full rebuild completes (at the end of removePart).
372
373
  if (!this._rebuilding) {
373
374
  if (this._worker) {
374
- this._worker.postMessage({ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)) });
375
+ this._worker.postMessage({
376
+ command: GaussianSplattingSortWorkerCommand.PART_MATRICES,
377
+ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)),
378
+ });
375
379
  }
376
380
  this._postToWorker(true);
377
381
  }
@@ -444,7 +448,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
444
448
  const partIndicesView = new Uint8Array(partIndices.buffer, texelStart, texelCount);
445
449
  this._updateTextureFromData(this._partIndicesTexture, partIndicesView, textureSize.x, lineStart, lineCount);
446
450
  if (this._worker) {
447
- this._worker.postMessage({ partIndices: partIndices });
451
+ this._worker.postMessage({ command: GaussianSplattingSortWorkerCommand.PART_INDICES, partIndices: partIndices });
448
452
  }
449
453
  }
450
454
  }
@@ -466,7 +470,7 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
466
470
  this._partIndicesTexture.wrapU = 0;
467
471
  this._partIndicesTexture.wrapV = 0;
468
472
  if (this._worker) {
469
- this._worker.postMessage({ partIndices: partIndices ?? null });
473
+ this._worker.postMessage({ command: GaussianSplattingSortWorkerCommand.PART_INDICES, partIndices: partIndices ?? null });
470
474
  }
471
475
  }
472
476
  _appendPartSourceToArrays(source, dstOffset, covA, covB, colorArray, sh, minimum, maximum) {
@@ -896,7 +900,10 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
896
900
  if (needsWorkerGate) {
897
901
  this._rebuilding = false;
898
902
  if (this._worker) {
899
- this._worker.postMessage({ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)) });
903
+ this._worker.postMessage({
904
+ command: GaussianSplattingSortWorkerCommand.PART_MATRICES,
905
+ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)),
906
+ });
900
907
  }
901
908
  this._canPostToWorker = true;
902
909
  this._postToWorker(true);
@@ -1057,7 +1064,10 @@ export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
1057
1064
  this._rebuilding = false;
1058
1065
  // Break TypeScript's flow narrowing — _addPartsInternal may have reinstantiated _worker.
1059
1066
  const workerAfterRebuild = this._worker;
1060
- workerAfterRebuild?.postMessage({ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)) });
1067
+ workerAfterRebuild?.postMessage({
1068
+ command: GaussianSplattingSortWorkerCommand.PART_MATRICES,
1069
+ partMatrices: this._partMatrices.map((matrix) => new Float32Array(matrix.m)),
1070
+ });
1061
1071
  this._canPostToWorker = true;
1062
1072
  this._postToWorker(true);
1063
1073
  }