@babylonjs/core 8.33.3 → 8.34.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 (65) hide show
  1. package/AudioV2/abstractAudio/abstractSound.d.ts +4 -0
  2. package/AudioV2/abstractAudio/abstractSound.js +6 -0
  3. package/AudioV2/abstractAudio/abstractSound.js.map +1 -1
  4. package/AudioV2/abstractAudio/abstractSoundInstance.js +3 -0
  5. package/AudioV2/abstractAudio/abstractSoundInstance.js.map +1 -1
  6. package/AudioV2/webAudio/webAudioStreamingSound.js +1 -1
  7. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
  8. package/AudioV2/webAudio/webAudioUnmuteUI.js +1 -1
  9. package/AudioV2/webAudio/webAudioUnmuteUI.js.map +1 -1
  10. package/Engines/abstractEngine.js +2 -2
  11. package/Engines/abstractEngine.js.map +1 -1
  12. package/Lights/Shadows/cascadedShadowGenerator.d.ts +1 -0
  13. package/Lights/Shadows/cascadedShadowGenerator.js +9 -1
  14. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  15. package/Lights/Shadows/shadowGenerator.js +10 -3
  16. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  17. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +1 -1
  18. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  19. package/Materials/Textures/index.d.ts +1 -0
  20. package/Materials/Textures/index.js +1 -0
  21. package/Materials/Textures/index.js.map +1 -1
  22. package/Materials/Textures/mirrorTexture.d.ts +4 -0
  23. package/Materials/Textures/mirrorTexture.js +9 -0
  24. package/Materials/Textures/mirrorTexture.js.map +1 -1
  25. package/Materials/Textures/textureMerger.d.ts +75 -0
  26. package/Materials/Textures/textureMerger.js +206 -0
  27. package/Materials/Textures/textureMerger.js.map +1 -0
  28. package/Materials/floatingOriginMatrixOverrides.d.ts +6 -0
  29. package/Materials/floatingOriginMatrixOverrides.js +35 -11
  30. package/Materials/floatingOriginMatrixOverrides.js.map +1 -1
  31. package/Misc/sceneSerializer.js +4 -1
  32. package/Misc/sceneSerializer.js.map +1 -1
  33. package/Shaders/ShadersInclude/gaussianSplatting.js +2 -10
  34. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  35. package/Shaders/ShadersInclude/openpbrBaseLayerData.js +1 -1
  36. package/Shaders/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  37. package/Shaders/default.fragment.js +1 -1
  38. package/Shaders/default.fragment.js.map +1 -1
  39. package/Shaders/gaussianSplattingDepth.fragment.js +7 -1
  40. package/Shaders/gaussianSplattingDepth.fragment.js.map +1 -1
  41. package/Shaders/gaussianSplattingDepth.vertex.js +2 -2
  42. package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -1
  43. package/Shaders/textureMerger.fragment.d.ts +5 -0
  44. package/Shaders/textureMerger.fragment.js +94 -0
  45. package/Shaders/textureMerger.fragment.js.map +1 -0
  46. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +1 -7
  47. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  48. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js +1 -1
  49. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  50. package/ShadersWGSL/default.fragment.js +1 -1
  51. package/ShadersWGSL/default.fragment.js.map +1 -1
  52. package/ShadersWGSL/gaussianSplattingDepth.fragment.d.ts +1 -0
  53. package/ShadersWGSL/gaussianSplattingDepth.fragment.js +15 -3
  54. package/ShadersWGSL/gaussianSplattingDepth.fragment.js.map +1 -1
  55. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -2
  56. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
  57. package/ShadersWGSL/textureMerger.fragment.d.ts +5 -0
  58. package/ShadersWGSL/textureMerger.fragment.js +86 -0
  59. package/ShadersWGSL/textureMerger.fragment.js.map +1 -0
  60. package/Sprites/spriteManager.d.ts +8 -0
  61. package/Sprites/spriteManager.js +4 -0
  62. package/Sprites/spriteManager.js.map +1 -1
  63. package/XR/features/WebXRAnchorSystem.js +14 -21
  64. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  65. package/package.json +1 -1
@@ -279,7 +279,6 @@ export class GaussianSplattingMaterial extends PushMaterial {
279
279
  samplers: GaussianSplattingMaterial._Samplers,
280
280
  uniformBuffers: GaussianSplattingMaterial._UniformBuffers,
281
281
  shaderLanguage: shaderLanguage,
282
- defines: ["#define GS_DISABLE_COLOR"],
283
282
  });
284
283
  const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {
285
284
  standalone: true,
@@ -305,6 +304,7 @@ export class GaussianSplattingMaterial extends PushMaterial {
305
304
  effect.setTexture("covariancesATexture", gsMesh.covariancesATexture);
306
305
  effect.setTexture("covariancesBTexture", gsMesh.covariancesBTexture);
307
306
  effect.setTexture("centersTexture", gsMesh.centersTexture);
307
+ effect.setTexture("colorsTexture", gsMesh.colorsTexture);
308
308
  }
309
309
  });
310
310
  return shadowDepthWrapper;
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Effect, IEffectCreationOptions } from \"../../Materials/effect\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport type { GaussianSplattingMesh } from \"../../Meshes\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport { PushMaterial } from \"../../Materials/pushMaterial\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"../clipPlaneMaterialHelper\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport { ShadowDepthWrapper } from \"../../Materials/shadowDepthWrapper\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\r\n\r\nimport \"../../Shaders/gaussianSplatting.fragment\";\r\nimport \"../../Shaders/gaussianSplatting.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.vertex\";\r\nimport \"../../Shaders/gaussianSplattingDepth.fragment\";\r\nimport \"../../Shaders/gaussianSplattingDepth.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.vertex\";\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n PrepareUniformsAndSamplersList,\r\n} from \"../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefines extends MaterialDefines {\r\n public FOG = false;\r\n public THIN_INSTANCES = true;\r\n public LOGARITHMICDEPTH = false;\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public SH_DEGREE = 0;\r\n public COMPENSATION = false;\r\n\r\n /**\r\n * Constructor of the defines.\r\n */\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * GaussianSplattingMaterial material used to render Gaussian Splatting\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMaterial extends PushMaterial {\r\n /**\r\n * Instantiates a Gaussian Splatting Material in the given scene\r\n * @param name The friendly name of the material\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.backFaceCulling = false;\r\n this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage);\r\n }\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material\r\n */\r\n public static KernelSize: number = 0.3;\r\n\r\n /**\r\n * Compensation\r\n */\r\n public static Compensation: boolean = false;\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value\r\n */\r\n public kernelSize = GaussianSplattingMaterial.KernelSize;\r\n private _compensation = GaussianSplattingMaterial.Compensation;\r\n\r\n // set to true when material defines are dirty\r\n private _isDirty = false;\r\n\r\n /**\r\n * Set compensation default value is `GaussianSplattingMaterial.Compensation`\r\n */\r\n public set compensation(value: boolean) {\r\n this._isDirty = this._isDirty != value;\r\n this._compensation = value;\r\n }\r\n\r\n /**\r\n * Get compensation\r\n */\r\n public get compensation(): boolean {\r\n return this._compensation;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public override get hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns false\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns true\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n protected static _Attribs = [VertexBuffer.PositionKind, \"splatIndex\"];\r\n protected static _Samplers = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\", \"shTexture0\", \"shTexture1\", \"shTexture2\"];\r\n protected static _UniformBuffers = [\"Scene\", \"Mesh\"];\r\n protected static _Uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"invViewport\",\r\n \"dataTextureSize\",\r\n \"focal\",\r\n \"eyePosition\",\r\n \"kernelSize\",\r\n \"viewDirectionFactor\",\r\n ];\r\n /**\r\n * Checks whether the material is ready to be rendered for a given mesh.\r\n * @param mesh The mesh to render\r\n * @param subMesh The submesh to check against\r\n * @returns true if all the dependencies are ready (Textures, Effects...)\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const useInstances = true;\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n let defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n\r\n if (defines && this._isDirty) {\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines();\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, true);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // SH is disabled for webGL1\r\n if (engine.version > 1 || engine.isWebGPU) {\r\n defines[\"SH_DEGREE\"] = gsMesh.shDegree;\r\n }\r\n\r\n // Compensation\r\n const splatMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n defines[\"COMPENSATION\"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation;\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines);\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: GaussianSplattingMaterial._Uniforms,\r\n uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(GaussianSplattingMaterial._Uniforms);\r\n\r\n const join = defines.toString();\r\n const effect = scene.getEngine().createEffect(\r\n \"gaussianSplatting\",\r\n <IEffectCreationOptions>{\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniformsNames: GaussianSplattingMaterial._Uniforms,\r\n uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n defines: join,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: {},\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplatting.fragment\"), import(\"../../ShadersWGSL/gaussianSplatting.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplatting.fragment\"), import(\"../../Shaders/gaussianSplatting.vertex\")]);\r\n }\r\n },\r\n },\r\n engine\r\n );\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Bind material effect for a specific Gaussian Splatting mesh\r\n * @param mesh Gaussian splatting mesh\r\n * @param effect Splatting material or node material\r\n * @param scene scene that contains mesh and camera used for rendering\r\n */\r\n public static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const camera = scene.activeCamera;\r\n\r\n const renderWidth = engine.getRenderWidth();\r\n const renderHeight = engine.getRenderHeight();\r\n\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n const gsMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n\r\n // check if rigcamera, get number of rigs\r\n const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;\r\n\r\n effect.setFloat2(\"invViewport\", 1 / (renderWidth / numberOfRigs), 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setVector3(\"viewDirectionFactor\", gsMesh.viewDirectionFactor);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n scene.bindEyePosition(effect, \"eyePosition\", true);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.shTextures) {\r\n for (let i = 0; i < gsMesh.shTextures?.length; i++) {\r\n effect.setTexture(`shTexture${i}`, gsMesh.shTextures[i]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Bind data\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n if (mustRebind) {\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n GaussianSplattingMaterial.BindEffect(mesh, this._activeEffect, scene);\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper {\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepth\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n defines: [\"#define GS_DISABLE_COLOR\"],\r\n }\r\n );\r\n\r\n const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {\r\n standalone: true,\r\n });\r\n\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const effect = shaderMaterial.getEffect()!;\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n shaderMaterial.bindView(effect);\r\n shaderMaterial.bindViewProjection(effect);\r\n\r\n const shadowmapWidth = scene.getEngine().getRenderWidth();\r\n const shadowmapHeight = scene.getEngine().getRenderHeight();\r\n effect.setFloat2(\"invViewport\", 1 / shadowmapWidth, 1 / shadowmapHeight);\r\n\r\n const projection = scene.getProjectionMatrix();\r\n const t = projection.m[5];\r\n const focal = (shadowmapWidth * t) / 2.0;\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n }\r\n });\r\n\r\n return shadowDepthWrapper;\r\n }\r\n\r\n /**\r\n * Clones the material.\r\n * @param name The cloned name.\r\n * @returns The cloned material.\r\n */\r\n public override clone(name: string): GaussianSplattingMaterial {\r\n return SerializationHelper.Clone(() => new GaussianSplattingMaterial(name, this.getScene()), this);\r\n }\r\n\r\n /**\r\n * Serializes the current material to its JSON representation.\r\n * @returns The JSON representation.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GaussianSplattingMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns \"GaussianSplattingMaterial\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a Gaussian Splatting material.\r\n * @param source The JSON data to parse\r\n * @param scene The scene to create the parsed material in\r\n * @param rootUrl The root url of the assets the material depends upon\r\n * @returns the instantiated GaussianSplattingMaterial.\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial {\r\n return SerializationHelper.Parse(() => new GaussianSplattingMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianSplattingMaterial\", GaussianSplattingMaterial);\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingMaterial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Effect, IEffectCreationOptions } from \"../../Materials/effect\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Matrix } from \"../../Maths/math.vector\";\r\nimport type { GaussianSplattingMesh } from \"../../Meshes\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport { PushMaterial } from \"../../Materials/pushMaterial\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"../clipPlaneMaterialHelper\";\r\nimport { Camera } from \"../../Cameras/camera\";\r\nimport { ShadowDepthWrapper } from \"../../Materials/shadowDepthWrapper\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial\";\r\n\r\nimport \"../../Shaders/gaussianSplatting.fragment\";\r\nimport \"../../Shaders/gaussianSplatting.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplatting.vertex\";\r\nimport \"../../Shaders/gaussianSplattingDepth.fragment\";\r\nimport \"../../Shaders/gaussianSplattingDepth.vertex\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.fragment\";\r\nimport \"../../ShadersWGSL/gaussianSplattingDepth.vertex\";\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n PrepareUniformsAndSamplersList,\r\n} from \"../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefines extends MaterialDefines {\r\n public FOG = false;\r\n public THIN_INSTANCES = true;\r\n public LOGARITHMICDEPTH = false;\r\n public CLIPPLANE = false;\r\n public CLIPPLANE2 = false;\r\n public CLIPPLANE3 = false;\r\n public CLIPPLANE4 = false;\r\n public CLIPPLANE5 = false;\r\n public CLIPPLANE6 = false;\r\n public SH_DEGREE = 0;\r\n public COMPENSATION = false;\r\n\r\n /**\r\n * Constructor of the defines.\r\n */\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * GaussianSplattingMaterial material used to render Gaussian Splatting\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMaterial extends PushMaterial {\r\n /**\r\n * Instantiates a Gaussian Splatting Material in the given scene\r\n * @param name The friendly name of the material\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.backFaceCulling = false;\r\n this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage);\r\n }\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material\r\n */\r\n public static KernelSize: number = 0.3;\r\n\r\n /**\r\n * Compensation\r\n */\r\n public static Compensation: boolean = false;\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value\r\n */\r\n public kernelSize = GaussianSplattingMaterial.KernelSize;\r\n private _compensation = GaussianSplattingMaterial.Compensation;\r\n\r\n // set to true when material defines are dirty\r\n private _isDirty = false;\r\n\r\n /**\r\n * Set compensation default value is `GaussianSplattingMaterial.Compensation`\r\n */\r\n public set compensation(value: boolean) {\r\n this._isDirty = this._isDirty != value;\r\n this._compensation = value;\r\n }\r\n\r\n /**\r\n * Get compensation\r\n */\r\n public get compensation(): boolean {\r\n return this._compensation;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public override get hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns false\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns true\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n protected static _Attribs = [VertexBuffer.PositionKind, \"splatIndex\"];\r\n protected static _Samplers = [\"covariancesATexture\", \"covariancesBTexture\", \"centersTexture\", \"colorsTexture\", \"shTexture0\", \"shTexture1\", \"shTexture2\"];\r\n protected static _UniformBuffers = [\"Scene\", \"Mesh\"];\r\n protected static _Uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"invViewport\",\r\n \"dataTextureSize\",\r\n \"focal\",\r\n \"eyePosition\",\r\n \"kernelSize\",\r\n \"viewDirectionFactor\",\r\n ];\r\n /**\r\n * Checks whether the material is ready to be rendered for a given mesh.\r\n * @param mesh The mesh to render\r\n * @param subMesh The submesh to check against\r\n * @returns true if all the dependencies are ready (Textures, Effects...)\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const useInstances = true;\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n let defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n\r\n if (defines && this._isDirty) {\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines();\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, true);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // SH is disabled for webGL1\r\n if (engine.version > 1 || engine.isWebGPU) {\r\n defines[\"SH_DEGREE\"] = gsMesh.shDegree;\r\n }\r\n\r\n // Compensation\r\n const splatMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n defines[\"COMPENSATION\"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation;\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines);\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: GaussianSplattingMaterial._Uniforms,\r\n uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(GaussianSplattingMaterial._Uniforms);\r\n\r\n const join = defines.toString();\r\n const effect = scene.getEngine().createEffect(\r\n \"gaussianSplatting\",\r\n <IEffectCreationOptions>{\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniformsNames: GaussianSplattingMaterial._Uniforms,\r\n uniformBuffersNames: GaussianSplattingMaterial._UniformBuffers,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n defines: join,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: {},\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplatting.fragment\"), import(\"../../ShadersWGSL/gaussianSplatting.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplatting.fragment\"), import(\"../../Shaders/gaussianSplatting.vertex\")]);\r\n }\r\n },\r\n },\r\n engine\r\n );\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Bind material effect for a specific Gaussian Splatting mesh\r\n * @param mesh Gaussian splatting mesh\r\n * @param effect Splatting material or node material\r\n * @param scene scene that contains mesh and camera used for rendering\r\n */\r\n public static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const camera = scene.activeCamera;\r\n\r\n const renderWidth = engine.getRenderWidth();\r\n const renderHeight = engine.getRenderHeight();\r\n\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n const gsMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n\r\n // check if rigcamera, get number of rigs\r\n const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;\r\n\r\n effect.setFloat2(\"invViewport\", 1 / (renderWidth / numberOfRigs), 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setVector3(\"viewDirectionFactor\", gsMesh.viewDirectionFactor);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n scene.bindEyePosition(effect, \"eyePosition\", true);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.shTextures) {\r\n for (let i = 0; i < gsMesh.shTextures?.length; i++) {\r\n effect.setTexture(`shTexture${i}`, gsMesh.shTextures[i]);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Bind data\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n if (mustRebind) {\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n GaussianSplattingMaterial.BindEffect(mesh, this._activeEffect, scene);\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper {\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepth\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n }\r\n );\r\n\r\n const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {\r\n standalone: true,\r\n });\r\n\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const effect = shaderMaterial.getEffect()!;\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n shaderMaterial.bindView(effect);\r\n shaderMaterial.bindViewProjection(effect);\r\n\r\n const shadowmapWidth = scene.getEngine().getRenderWidth();\r\n const shadowmapHeight = scene.getEngine().getRenderHeight();\r\n effect.setFloat2(\"invViewport\", 1 / shadowmapWidth, 1 / shadowmapHeight);\r\n\r\n const projection = scene.getProjectionMatrix();\r\n const t = projection.m[5];\r\n const focal = (shadowmapWidth * t) / 2.0;\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n }\r\n });\r\n\r\n return shadowDepthWrapper;\r\n }\r\n\r\n /**\r\n * Clones the material.\r\n * @param name The cloned name.\r\n * @returns The cloned material.\r\n */\r\n public override clone(name: string): GaussianSplattingMaterial {\r\n return SerializationHelper.Clone(() => new GaussianSplattingMaterial(name, this.getScene()), this);\r\n }\r\n\r\n /**\r\n * Serializes the current material to its JSON representation.\r\n * @returns The JSON representation.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GaussianSplattingMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns \"GaussianSplattingMaterial\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a Gaussian Splatting material.\r\n * @param source The JSON data to parse\r\n * @param scene The scene to create the parsed material in\r\n * @param rootUrl The root url of the assets the material depends upon\r\n * @returns the instantiated GaussianSplattingMaterial.\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial {\r\n return SerializationHelper.Parse(() => new GaussianSplattingMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GaussianSplattingMaterial\", GaussianSplattingMaterial);\r\n"]}
@@ -22,6 +22,7 @@ export * from "./rawTexture2DArray.js";
22
22
  export * from "./rawTexture3D.js";
23
23
  export * from "./refractionTexture.js";
24
24
  export * from "./renderTargetTexture.js";
25
+ export * from "./textureMerger.js";
25
26
  export * from "./textureSampler.js";
26
27
  export * from "./texture.js";
27
28
  export * from "./thinTexture.js";
@@ -24,6 +24,7 @@ export * from "./rawTexture2DArray.js";
24
24
  export * from "./rawTexture3D.js";
25
25
  export * from "./refractionTexture.js";
26
26
  export * from "./renderTargetTexture.js";
27
+ export * from "./textureMerger.js";
27
28
  export * from "./textureSampler.js";
28
29
  export * from "./texture.js";
29
30
  export * from "./thinTexture.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,eAAe,CAAC;AAC9B,yCAAyC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AAEzC,kCAAkC;AAClC,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAEhD,gBAAgB;AAChB,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,iDAAiD,CAAC;AAChE,cAAc,mDAAmD,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./baseTexture\";\r\n// eslint-disable-next-line import/export\r\nexport * from \"./baseTexture.polynomial\";\r\nexport * from \"./colorGradingTexture\";\r\nexport * from \"./cubeTexture\";\r\nexport * from \"./dynamicTexture\";\r\nexport * from \"./equiRectangularCubeTexture\";\r\nexport * from \"./externalTexture\";\r\nexport * from \"./Filtering/hdrFiltering\";\r\nexport * from \"./envCubeTexture\";\r\nexport * from \"./hdrCubeTexture\";\r\nexport * from \"./exrCubeTexture\";\r\nexport * from \"./htmlElementTexture\";\r\nexport * from \"./internalTexture\";\r\nexport * from \"./Loaders/index\";\r\nexport * from \"./mirrorTexture\";\r\nexport * from \"./multiRenderTarget\";\r\nexport * from \"./Packer/index\";\r\nexport * from \"./Procedurals/index\";\r\nexport * from \"./rawCubeTexture\";\r\nexport * from \"./rawTexture\";\r\nexport * from \"./rawTexture2DArray\";\r\nexport * from \"./rawTexture3D\";\r\nexport * from \"./refractionTexture\";\r\nexport * from \"./renderTargetTexture\";\r\nexport * from \"./textureSampler\";\r\nexport * from \"./texture\";\r\nexport * from \"./thinTexture\";\r\nexport * from \"./thinRenderTargetTexture\";\r\nexport * from \"./videoTexture\";\r\nexport * from \"./ktx2decoderTypes\";\r\nexport * from \"./textureCreationOptions\";\r\n\r\n// Shaders for procedural textures\r\nexport * from \"../../ShadersWGSL/procedural.vertex\";\r\nexport * from \"../../Shaders/procedural.vertex\";\r\n\r\n// HDR filtering\r\nexport * from \"../../Shaders/hdrFiltering.vertex\";\r\nexport * from \"../../Shaders/hdrFiltering.fragment\";\r\nexport * from \"../../ShadersWGSL/hdrFiltering.vertex\";\r\nexport * from \"../../ShadersWGSL/hdrFiltering.fragment\";\r\nexport * from \"../../Shaders/hdrIrradianceFiltering.vertex\";\r\nexport * from \"../../Shaders/hdrIrradianceFiltering.fragment\";\r\nexport * from \"../../ShadersWGSL/hdrIrradianceFiltering.vertex\";\r\nexport * from \"../../ShadersWGSL/hdrIrradianceFiltering.fragment\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,eAAe,CAAC;AAC9B,yCAAyC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AAEzC,kCAAkC;AAClC,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAEhD,gBAAgB;AAChB,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,iDAAiD,CAAC;AAChE,cAAc,mDAAmD,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./baseTexture\";\r\n// eslint-disable-next-line import/export\r\nexport * from \"./baseTexture.polynomial\";\r\nexport * from \"./colorGradingTexture\";\r\nexport * from \"./cubeTexture\";\r\nexport * from \"./dynamicTexture\";\r\nexport * from \"./equiRectangularCubeTexture\";\r\nexport * from \"./externalTexture\";\r\nexport * from \"./Filtering/hdrFiltering\";\r\nexport * from \"./envCubeTexture\";\r\nexport * from \"./hdrCubeTexture\";\r\nexport * from \"./exrCubeTexture\";\r\nexport * from \"./htmlElementTexture\";\r\nexport * from \"./internalTexture\";\r\nexport * from \"./Loaders/index\";\r\nexport * from \"./mirrorTexture\";\r\nexport * from \"./multiRenderTarget\";\r\nexport * from \"./Packer/index\";\r\nexport * from \"./Procedurals/index\";\r\nexport * from \"./rawCubeTexture\";\r\nexport * from \"./rawTexture\";\r\nexport * from \"./rawTexture2DArray\";\r\nexport * from \"./rawTexture3D\";\r\nexport * from \"./refractionTexture\";\r\nexport * from \"./renderTargetTexture\";\r\nexport * from \"./textureMerger\";\r\nexport * from \"./textureSampler\";\r\nexport * from \"./texture\";\r\nexport * from \"./thinTexture\";\r\nexport * from \"./thinRenderTargetTexture\";\r\nexport * from \"./videoTexture\";\r\nexport * from \"./ktx2decoderTypes\";\r\nexport * from \"./textureCreationOptions\";\r\n\r\n// Shaders for procedural textures\r\nexport * from \"../../ShadersWGSL/procedural.vertex\";\r\nexport * from \"../../Shaders/procedural.vertex\";\r\n\r\n// HDR filtering\r\nexport * from \"../../Shaders/hdrFiltering.vertex\";\r\nexport * from \"../../Shaders/hdrFiltering.fragment\";\r\nexport * from \"../../ShadersWGSL/hdrFiltering.vertex\";\r\nexport * from \"../../ShadersWGSL/hdrFiltering.fragment\";\r\nexport * from \"../../Shaders/hdrIrradianceFiltering.vertex\";\r\nexport * from \"../../Shaders/hdrIrradianceFiltering.fragment\";\r\nexport * from \"../../ShadersWGSL/hdrIrradianceFiltering.vertex\";\r\nexport * from \"../../ShadersWGSL/hdrIrradianceFiltering.fragment\";\r\n"]}
@@ -1,6 +1,7 @@
1
1
  import type { Scene } from "../../scene.js";
2
2
  import { RenderTargetTexture } from "../../Materials/Textures/renderTargetTexture.js";
3
3
  import { Plane } from "../../Maths/math.plane.js";
4
+ import type { TextureSize } from "../../Materials/Textures/textureCreationOptions.js";
4
5
  /**
5
6
  * Mirror texture can be used to simulate the view from a mirror in a scene.
6
7
  * It will dynamically be rendered every frame to adapt to the camera point of view.
@@ -43,6 +44,9 @@ export declare class MirrorTexture extends RenderTargetTexture {
43
44
  set blurKernelY(value: number);
44
45
  get blurKernelY(): number;
45
46
  private _autoComputeBlurKernel;
47
+ resize(size: TextureSize | {
48
+ ratio: number;
49
+ }): void;
46
50
  protected _onRatioRescale(): void;
47
51
  private _updateGammaSpace;
48
52
  private _imageProcessingConfigChangeObserver;
@@ -76,6 +76,15 @@ export class MirrorTexture extends RenderTargetTexture {
76
76
  this.blurKernelX = this._adaptiveBlurKernel * dw;
77
77
  this.blurKernelY = this._adaptiveBlurKernel * dh;
78
78
  }
79
+ resize(size) {
80
+ super.resize(size);
81
+ if (!this._adaptiveBlurKernel) {
82
+ this._preparePostProcesses();
83
+ }
84
+ else {
85
+ this._autoComputeBlurKernel();
86
+ }
87
+ }
79
88
  _onRatioRescale() {
80
89
  if (this._sizeRatio) {
81
90
  this.resize(this._initialSizeParameter);
@@ -1 +1 @@
1
- {"version":3,"file":"mirrorTexture.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/mirrorTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3, Vector2 } from \"../../Maths/math.vector\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { ImageProcessingConfiguration } from \"../../Materials/imageProcessingConfiguration\";\r\nimport { BlurPostProcess } from \"../../PostProcesses/blurPostProcess\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { Plane } from \"../../Maths/math.plane\";\r\nimport type { UniformBuffer } from \"../uniformBuffer\";\r\n/**\r\n * Mirror texture can be used to simulate the view from a mirror in a scene.\r\n * It will dynamically be rendered every frame to adapt to the camera point of view.\r\n * You can then easily use it as a reflectionTexture on a flat surface.\r\n * In case the surface is not a plane, please consider relying on reflection probes.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrortexture\r\n */\r\nexport class MirrorTexture extends RenderTargetTexture {\r\n /**\r\n * Define the reflection plane we want to use. The mirrorPlane is usually set to the constructed reflector.\r\n * It is possible to directly set the mirrorPlane by directly using a Plane(a, b, c, d) where a, b and c give the plane normal vector (a, b, c) and d is a scalar displacement from the mirrorPlane to the origin. However in all but the very simplest of situations it is more straight forward to set it to the reflector as stated in the doc.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors\r\n */\r\n public mirrorPlane = new Plane(0, 1, 0, 1);\r\n\r\n /**\r\n * Define the blur ratio used to blur the reflection if needed.\r\n */\r\n public set blurRatio(value: number) {\r\n if (this._blurRatio === value) {\r\n return;\r\n }\r\n\r\n this._blurRatio = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurRatio(): number {\r\n return this._blurRatio;\r\n }\r\n\r\n /**\r\n * Define the adaptive blur kernel used to blur the reflection if needed.\r\n * This will autocompute the closest best match for the `blurKernel`\r\n */\r\n public set adaptiveBlurKernel(value: number) {\r\n this._adaptiveBlurKernel = value;\r\n this._autoComputeBlurKernel();\r\n }\r\n\r\n /**\r\n * Define the blur kernel used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernel(value: number) {\r\n this.blurKernelX = value;\r\n this.blurKernelY = value;\r\n }\r\n\r\n /**\r\n * Define the blur kernel on the X Axis used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernelX(value: number) {\r\n if (this._blurKernelX === value) {\r\n return;\r\n }\r\n\r\n this._blurKernelX = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurKernelX(): number {\r\n return this._blurKernelX;\r\n }\r\n\r\n /**\r\n * Define the blur kernel on the Y Axis used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernelY(value: number) {\r\n if (this._blurKernelY === value) {\r\n return;\r\n }\r\n\r\n this._blurKernelY = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurKernelY(): number {\r\n return this._blurKernelY;\r\n }\r\n\r\n private _autoComputeBlurKernel(): void {\r\n const engine = this.getScene()!.getEngine();\r\n\r\n const dw = this.getRenderWidth() / engine.getRenderWidth();\r\n const dh = this.getRenderHeight() / engine.getRenderHeight();\r\n this.blurKernelX = this._adaptiveBlurKernel * dw;\r\n this.blurKernelY = this._adaptiveBlurKernel * dh;\r\n }\r\n\r\n protected override _onRatioRescale(): void {\r\n if (this._sizeRatio) {\r\n this.resize(this._initialSizeParameter);\r\n if (!this._adaptiveBlurKernel) {\r\n this._preparePostProcesses();\r\n }\r\n }\r\n\r\n if (this._adaptiveBlurKernel) {\r\n this._autoComputeBlurKernel();\r\n }\r\n }\r\n\r\n private _updateGammaSpace() {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this.gammaSpace = !scene.imageProcessingConfiguration.isEnabled || !scene.imageProcessingConfiguration.applyByPostProcess;\r\n }\r\n\r\n private _imageProcessingConfigChangeObserver: Nullable<Observer<ImageProcessingConfiguration>>;\r\n\r\n private _transformMatrix = Matrix.Zero();\r\n private _mirrorMatrix = Matrix.Zero();\r\n\r\n private _blurX: Nullable<BlurPostProcess>;\r\n private _blurY: Nullable<BlurPostProcess>;\r\n private _adaptiveBlurKernel = 0;\r\n private _blurKernelX = 0;\r\n private _blurKernelY = 0;\r\n private _blurRatio = 1.0;\r\n private _sceneUBO: UniformBuffer;\r\n private _currentSceneUBO: UniformBuffer;\r\n\r\n /**\r\n * Instantiates a Mirror Texture.\r\n * Mirror texture can be used to simulate the view from a mirror in a scene.\r\n * It will dynamically be rendered every frame to adapt to the camera point of view.\r\n * You can then easily use it as a reflectionTexture on a flat surface.\r\n * In case the surface is not a plane, please consider relying on reflection probes.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors\r\n * @param name\r\n * @param size\r\n * @param scene\r\n * @param generateMipMaps\r\n * @param type\r\n * @param samplingMode\r\n * @param generateDepthBuffer\r\n */\r\n constructor(\r\n name: string,\r\n size: number | { width: number; height: number } | { ratio: number },\r\n scene?: Scene,\r\n generateMipMaps?: boolean,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode = Texture.BILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer = true\r\n ) {\r\n super(name, size, scene, generateMipMaps, true, type, false, samplingMode, generateDepthBuffer);\r\n\r\n scene = <Scene>this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n this.ignoreCameraViewport = true;\r\n\r\n this._updateGammaSpace();\r\n this._imageProcessingConfigChangeObserver = scene.imageProcessingConfiguration.onUpdateParameters.add(() => {\r\n this._updateGammaSpace();\r\n });\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (engine.supportsUniformBuffers) {\r\n this._sceneUBO = scene.createSceneUniformBuffer(`Scene for Mirror Texture (name \"${name}\")`);\r\n }\r\n\r\n let saveClipPlane: Nullable<Plane>;\r\n\r\n this.onBeforeRenderObservable.add(() => {\r\n if (this._sceneUBO) {\r\n this._currentSceneUBO = scene.getSceneUniformBuffer();\r\n scene.setSceneUniformBuffer(this._sceneUBO);\r\n scene.getSceneUniformBuffer().unbindEffect();\r\n }\r\n\r\n Matrix.ReflectionToRef(this.mirrorPlane, this._mirrorMatrix);\r\n this._mirrorMatrix.multiplyToRef(scene.getViewMatrix(), this._transformMatrix);\r\n\r\n scene.setTransformMatrix(this._transformMatrix, scene.getProjectionMatrix());\r\n\r\n saveClipPlane = scene.clipPlane;\r\n scene.clipPlane = this.mirrorPlane;\r\n\r\n scene._mirroredCameraPosition = Vector3.TransformCoordinates((<Camera>scene.activeCamera).globalPosition, this._mirrorMatrix);\r\n });\r\n\r\n this.onAfterRenderObservable.add(() => {\r\n if (this._sceneUBO) {\r\n scene.setSceneUniformBuffer(this._currentSceneUBO);\r\n }\r\n scene.updateTransformMatrix();\r\n scene._mirroredCameraPosition = null;\r\n\r\n scene.clipPlane = saveClipPlane;\r\n });\r\n }\r\n\r\n private _preparePostProcesses(): void {\r\n this.clearPostProcesses(true);\r\n\r\n if (this._blurKernelX && this._blurKernelY) {\r\n const engine = (<Scene>this.getScene()).getEngine();\r\n\r\n const textureType =\r\n engine.getCaps().textureFloatRender && engine.getCaps().textureFloatLinearFiltering ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_HALF_FLOAT;\r\n\r\n this._blurX = new BlurPostProcess(\r\n \"horizontal blur\",\r\n new Vector2(1.0, 0),\r\n this._blurKernelX,\r\n this._blurRatio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n textureType\r\n );\r\n this._blurX.autoClear = false;\r\n\r\n if (this._blurRatio === 1 && this.samples < 2 && this._texture) {\r\n this._blurX.inputTexture = this._renderTarget!;\r\n } else {\r\n this._blurX.alwaysForcePOT = true;\r\n }\r\n\r\n this._blurY = new BlurPostProcess(\r\n \"vertical blur\",\r\n new Vector2(0, 1.0),\r\n this._blurKernelY,\r\n this._blurRatio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n textureType\r\n );\r\n this._blurY.autoClear = false;\r\n this._blurY.alwaysForcePOT = this._blurRatio !== 1;\r\n\r\n this.addPostProcess(this._blurX);\r\n this.addPostProcess(this._blurY);\r\n } else {\r\n if (this._blurY) {\r\n this.removePostProcess(this._blurY);\r\n this._blurY.dispose();\r\n this._blurY = null;\r\n }\r\n if (this._blurX) {\r\n this.removePostProcess(this._blurX);\r\n this._blurX.dispose();\r\n this._blurX = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clone the mirror texture.\r\n * @returns the cloned texture\r\n */\r\n public override clone(): MirrorTexture {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n\r\n const textureSize = this.getSize();\r\n const newTexture = new MirrorTexture(\r\n this.name,\r\n textureSize.width,\r\n scene,\r\n this._renderTargetOptions.generateMipMaps,\r\n this._renderTargetOptions.type,\r\n this._renderTargetOptions.samplingMode,\r\n this._renderTargetOptions.generateDepthBuffer\r\n );\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // Mirror Texture\r\n newTexture.mirrorPlane = this.mirrorPlane.clone();\r\n if (this.renderList) {\r\n newTexture.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Serialize the texture to a JSON representation you could use in Parse later on\r\n * @returns the serialized JSON representation\r\n */\r\n public override serialize(): any {\r\n if (!this.name) {\r\n return null;\r\n }\r\n\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.mirrorPlane = this.mirrorPlane.asArray();\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n const scene = this.getScene();\r\n\r\n if (scene) {\r\n scene.imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingConfigChangeObserver);\r\n }\r\n this._sceneUBO?.dispose();\r\n }\r\n}\r\n\r\nTexture._CreateMirror = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean): MirrorTexture => {\r\n return new MirrorTexture(name, renderTargetSize, scene, generateMipMaps);\r\n};\r\n"]}
1
+ {"version":3,"file":"mirrorTexture.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/mirrorTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3, Vector2 } from \"../../Maths/math.vector\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport type { ImageProcessingConfiguration } from \"../../Materials/imageProcessingConfiguration\";\r\nimport { BlurPostProcess } from \"../../PostProcesses/blurPostProcess\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { Plane } from \"../../Maths/math.plane\";\r\nimport type { UniformBuffer } from \"../uniformBuffer\";\r\nimport type { TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\n\r\n/**\r\n * Mirror texture can be used to simulate the view from a mirror in a scene.\r\n * It will dynamically be rendered every frame to adapt to the camera point of view.\r\n * You can then easily use it as a reflectionTexture on a flat surface.\r\n * In case the surface is not a plane, please consider relying on reflection probes.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrortexture\r\n */\r\nexport class MirrorTexture extends RenderTargetTexture {\r\n /**\r\n * Define the reflection plane we want to use. The mirrorPlane is usually set to the constructed reflector.\r\n * It is possible to directly set the mirrorPlane by directly using a Plane(a, b, c, d) where a, b and c give the plane normal vector (a, b, c) and d is a scalar displacement from the mirrorPlane to the origin. However in all but the very simplest of situations it is more straight forward to set it to the reflector as stated in the doc.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors\r\n */\r\n public mirrorPlane = new Plane(0, 1, 0, 1);\r\n\r\n /**\r\n * Define the blur ratio used to blur the reflection if needed.\r\n */\r\n public set blurRatio(value: number) {\r\n if (this._blurRatio === value) {\r\n return;\r\n }\r\n\r\n this._blurRatio = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurRatio(): number {\r\n return this._blurRatio;\r\n }\r\n\r\n /**\r\n * Define the adaptive blur kernel used to blur the reflection if needed.\r\n * This will autocompute the closest best match for the `blurKernel`\r\n */\r\n public set adaptiveBlurKernel(value: number) {\r\n this._adaptiveBlurKernel = value;\r\n this._autoComputeBlurKernel();\r\n }\r\n\r\n /**\r\n * Define the blur kernel used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernel(value: number) {\r\n this.blurKernelX = value;\r\n this.blurKernelY = value;\r\n }\r\n\r\n /**\r\n * Define the blur kernel on the X Axis used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernelX(value: number) {\r\n if (this._blurKernelX === value) {\r\n return;\r\n }\r\n\r\n this._blurKernelX = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurKernelX(): number {\r\n return this._blurKernelX;\r\n }\r\n\r\n /**\r\n * Define the blur kernel on the Y Axis used to blur the reflection if needed.\r\n * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.\r\n */\r\n public set blurKernelY(value: number) {\r\n if (this._blurKernelY === value) {\r\n return;\r\n }\r\n\r\n this._blurKernelY = value;\r\n this._preparePostProcesses();\r\n }\r\n\r\n public get blurKernelY(): number {\r\n return this._blurKernelY;\r\n }\r\n\r\n private _autoComputeBlurKernel(): void {\r\n const engine = this.getScene()!.getEngine();\r\n\r\n const dw = this.getRenderWidth() / engine.getRenderWidth();\r\n const dh = this.getRenderHeight() / engine.getRenderHeight();\r\n this.blurKernelX = this._adaptiveBlurKernel * dw;\r\n this.blurKernelY = this._adaptiveBlurKernel * dh;\r\n }\r\n\r\n public override resize(size: TextureSize | { ratio: number }): void {\r\n super.resize(size);\r\n if (!this._adaptiveBlurKernel) {\r\n this._preparePostProcesses();\r\n } else {\r\n this._autoComputeBlurKernel();\r\n }\r\n }\r\n\r\n protected override _onRatioRescale(): void {\r\n if (this._sizeRatio) {\r\n this.resize(this._initialSizeParameter);\r\n if (!this._adaptiveBlurKernel) {\r\n this._preparePostProcesses();\r\n }\r\n }\r\n\r\n if (this._adaptiveBlurKernel) {\r\n this._autoComputeBlurKernel();\r\n }\r\n }\r\n\r\n private _updateGammaSpace() {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n this.gammaSpace = !scene.imageProcessingConfiguration.isEnabled || !scene.imageProcessingConfiguration.applyByPostProcess;\r\n }\r\n\r\n private _imageProcessingConfigChangeObserver: Nullable<Observer<ImageProcessingConfiguration>>;\r\n\r\n private _transformMatrix = Matrix.Zero();\r\n private _mirrorMatrix = Matrix.Zero();\r\n\r\n private _blurX: Nullable<BlurPostProcess>;\r\n private _blurY: Nullable<BlurPostProcess>;\r\n private _adaptiveBlurKernel = 0;\r\n private _blurKernelX = 0;\r\n private _blurKernelY = 0;\r\n private _blurRatio = 1.0;\r\n private _sceneUBO: UniformBuffer;\r\n private _currentSceneUBO: UniformBuffer;\r\n\r\n /**\r\n * Instantiates a Mirror Texture.\r\n * Mirror texture can be used to simulate the view from a mirror in a scene.\r\n * It will dynamically be rendered every frame to adapt to the camera point of view.\r\n * You can then easily use it as a reflectionTexture on a flat surface.\r\n * In case the surface is not a plane, please consider relying on reflection probes.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors\r\n * @param name\r\n * @param size\r\n * @param scene\r\n * @param generateMipMaps\r\n * @param type\r\n * @param samplingMode\r\n * @param generateDepthBuffer\r\n */\r\n constructor(\r\n name: string,\r\n size: number | { width: number; height: number } | { ratio: number },\r\n scene?: Scene,\r\n generateMipMaps?: boolean,\r\n type: number = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode = Texture.BILINEAR_SAMPLINGMODE,\r\n generateDepthBuffer = true\r\n ) {\r\n super(name, size, scene, generateMipMaps, true, type, false, samplingMode, generateDepthBuffer);\r\n\r\n scene = <Scene>this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n this.ignoreCameraViewport = true;\r\n\r\n this._updateGammaSpace();\r\n this._imageProcessingConfigChangeObserver = scene.imageProcessingConfiguration.onUpdateParameters.add(() => {\r\n this._updateGammaSpace();\r\n });\r\n\r\n const engine = scene.getEngine();\r\n\r\n if (engine.supportsUniformBuffers) {\r\n this._sceneUBO = scene.createSceneUniformBuffer(`Scene for Mirror Texture (name \"${name}\")`);\r\n }\r\n\r\n let saveClipPlane: Nullable<Plane>;\r\n\r\n this.onBeforeRenderObservable.add(() => {\r\n if (this._sceneUBO) {\r\n this._currentSceneUBO = scene.getSceneUniformBuffer();\r\n scene.setSceneUniformBuffer(this._sceneUBO);\r\n scene.getSceneUniformBuffer().unbindEffect();\r\n }\r\n\r\n Matrix.ReflectionToRef(this.mirrorPlane, this._mirrorMatrix);\r\n this._mirrorMatrix.multiplyToRef(scene.getViewMatrix(), this._transformMatrix);\r\n\r\n scene.setTransformMatrix(this._transformMatrix, scene.getProjectionMatrix());\r\n\r\n saveClipPlane = scene.clipPlane;\r\n scene.clipPlane = this.mirrorPlane;\r\n\r\n scene._mirroredCameraPosition = Vector3.TransformCoordinates((<Camera>scene.activeCamera).globalPosition, this._mirrorMatrix);\r\n });\r\n\r\n this.onAfterRenderObservable.add(() => {\r\n if (this._sceneUBO) {\r\n scene.setSceneUniformBuffer(this._currentSceneUBO);\r\n }\r\n scene.updateTransformMatrix();\r\n scene._mirroredCameraPosition = null;\r\n\r\n scene.clipPlane = saveClipPlane;\r\n });\r\n }\r\n\r\n private _preparePostProcesses(): void {\r\n this.clearPostProcesses(true);\r\n\r\n if (this._blurKernelX && this._blurKernelY) {\r\n const engine = (<Scene>this.getScene()).getEngine();\r\n\r\n const textureType =\r\n engine.getCaps().textureFloatRender && engine.getCaps().textureFloatLinearFiltering ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_HALF_FLOAT;\r\n\r\n this._blurX = new BlurPostProcess(\r\n \"horizontal blur\",\r\n new Vector2(1.0, 0),\r\n this._blurKernelX,\r\n this._blurRatio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n textureType\r\n );\r\n this._blurX.autoClear = false;\r\n\r\n if (this._blurRatio === 1 && this.samples < 2 && this._texture) {\r\n this._blurX.inputTexture = this._renderTarget!;\r\n } else {\r\n this._blurX.alwaysForcePOT = true;\r\n }\r\n\r\n this._blurY = new BlurPostProcess(\r\n \"vertical blur\",\r\n new Vector2(0, 1.0),\r\n this._blurKernelY,\r\n this._blurRatio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n textureType\r\n );\r\n this._blurY.autoClear = false;\r\n this._blurY.alwaysForcePOT = this._blurRatio !== 1;\r\n\r\n this.addPostProcess(this._blurX);\r\n this.addPostProcess(this._blurY);\r\n } else {\r\n if (this._blurY) {\r\n this.removePostProcess(this._blurY);\r\n this._blurY.dispose();\r\n this._blurY = null;\r\n }\r\n if (this._blurX) {\r\n this.removePostProcess(this._blurX);\r\n this._blurX.dispose();\r\n this._blurX = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clone the mirror texture.\r\n * @returns the cloned texture\r\n */\r\n public override clone(): MirrorTexture {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n\r\n const textureSize = this.getSize();\r\n const newTexture = new MirrorTexture(\r\n this.name,\r\n textureSize.width,\r\n scene,\r\n this._renderTargetOptions.generateMipMaps,\r\n this._renderTargetOptions.type,\r\n this._renderTargetOptions.samplingMode,\r\n this._renderTargetOptions.generateDepthBuffer\r\n );\r\n\r\n // Base texture\r\n newTexture.hasAlpha = this.hasAlpha;\r\n newTexture.level = this.level;\r\n\r\n // Mirror Texture\r\n newTexture.mirrorPlane = this.mirrorPlane.clone();\r\n if (this.renderList) {\r\n newTexture.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newTexture;\r\n }\r\n\r\n /**\r\n * Serialize the texture to a JSON representation you could use in Parse later on\r\n * @returns the serialized JSON representation\r\n */\r\n public override serialize(): any {\r\n if (!this.name) {\r\n return null;\r\n }\r\n\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.mirrorPlane = this.mirrorPlane.asArray();\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n const scene = this.getScene();\r\n\r\n if (scene) {\r\n scene.imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingConfigChangeObserver);\r\n }\r\n this._sceneUBO?.dispose();\r\n }\r\n}\r\n\r\nTexture._CreateMirror = (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean): MirrorTexture => {\r\n return new MirrorTexture(name, renderTargetSize, scene, generateMipMaps);\r\n};\r\n"]}
@@ -0,0 +1,75 @@
1
+ import type { Scene } from "../../scene.js";
2
+ import { ProceduralTexture } from "./Procedurals/proceduralTexture.js";
3
+ import type { BaseTexture } from "./baseTexture.js";
4
+ import type { TextureSize } from "./textureCreationOptions.js";
5
+ /**
6
+ * Configuration for a texture input source
7
+ */
8
+ export interface ITextureChannelInput {
9
+ /** The texture to use as input */
10
+ texture: BaseTexture;
11
+ /** Source channel to read from (0=R, 1=G, 2=B, 3=A) */
12
+ sourceChannel: number;
13
+ }
14
+ /**
15
+ * Configuration for a constant value input source
16
+ */
17
+ export interface IConstantChannelInput {
18
+ /** Constant value between 0.0 and 1.0 */
19
+ value: number;
20
+ }
21
+ /**
22
+ * Union type for channel input sources
23
+ */
24
+ export type ChannelInput = ITextureChannelInput | IConstantChannelInput;
25
+ /**
26
+ * Configuration for texture merging operation
27
+ */
28
+ export interface ITextureMergeConfiguration {
29
+ /** Configuration for red output channel */
30
+ red: ChannelInput;
31
+ /** Configuration for green output channel (optional, defaults to 0) */
32
+ green?: ChannelInput;
33
+ /** Configuration for blue output channel (optional, defaults to 0) */
34
+ blue?: ChannelInput;
35
+ /** Configuration for alpha output channel (optional, defaults to 1) */
36
+ alpha?: ChannelInput;
37
+ /** Output texture size. If not specified, uses the largest input texture size */
38
+ outputSize?: TextureSize;
39
+ /** Whether to generate mipmaps for the output texture */
40
+ generateMipMaps?: boolean;
41
+ }
42
+ /**
43
+ * @internal
44
+ * Merge multiple texture channels into a single texture
45
+ * @param name Name for the resulting texture
46
+ * @param config Merge configuration
47
+ * @param scene Scene to create the texture in
48
+ * @returns The merged texture
49
+ */
50
+ export declare function MergeTexturesAsync(name: string, config: ITextureMergeConfiguration, scene: Scene): Promise<ProceduralTexture>;
51
+ /**
52
+ * @internal
53
+ * Create a texture input configuration
54
+ * @param texture The texture to read from
55
+ * @param sourceChannel The channel to read (0=R, 1=G, 2=B, 3=A)
56
+ * @returns Texture channel input configuration
57
+ */
58
+ export declare function CreateTextureInput(texture: BaseTexture, sourceChannel: number): ITextureChannelInput;
59
+ /**
60
+ * @internal
61
+ * Create a constant value input configuration
62
+ * @param value The constant value (0.0-1.0)
63
+ * @returns Constant channel input configuration
64
+ */
65
+ export declare function CreateConstantInput(value: number): IConstantChannelInput;
66
+ /**
67
+ * @internal
68
+ * Create a simple RGBA channel packing configuration
69
+ * @param red Input for red channel
70
+ * @param green Input for green channel (optional, defaults to 0)
71
+ * @param blue Input for blue channel (optional, defaults to 0)
72
+ * @param alpha Input for alpha channel (optional, defaults to 1)
73
+ * @returns Texture merge configuration
74
+ */
75
+ export declare function CreateRGBAConfiguration(red: ChannelInput, green?: ChannelInput, blue?: ChannelInput, alpha?: ChannelInput): ITextureMergeConfiguration;
@@ -0,0 +1,206 @@
1
+ import { ProceduralTexture } from "./Procedurals/proceduralTexture.js";
2
+
3
+ const _ShaderName = "textureMerger";
4
+ /**
5
+ * @internal
6
+ * Check if a channel input is a texture input
7
+ * @param input The channel input to check
8
+ * @returns True if the input is a texture input, false otherwise
9
+ */
10
+ function IsTextureInput(input) {
11
+ return "texture" in input;
12
+ }
13
+ /**
14
+ * @internal
15
+ * Check if a channel input is a constant input
16
+ * @param input The channel input to check
17
+ * @returns True if the input is a constant input, false otherwise
18
+ */
19
+ function IsConstantInput(input) {
20
+ return "value" in input;
21
+ }
22
+ /**
23
+ * @internal
24
+ * Copy texture transformation properties from one texture to another
25
+ * @param source The source texture
26
+ * @param destination The destination texture
27
+ */
28
+ function CopyTextureTransform(source, destination) {
29
+ destination.uOffset = source.uOffset;
30
+ destination.vOffset = source.vOffset;
31
+ destination.uScale = source.uScale;
32
+ destination.vScale = source.vScale;
33
+ destination.uAng = source.uAng;
34
+ destination.vAng = source.vAng;
35
+ destination.wAng = source.wAng;
36
+ destination.uRotationCenter = source.uRotationCenter;
37
+ destination.vRotationCenter = source.vRotationCenter;
38
+ }
39
+ /**
40
+ * @internal
41
+ * Merge multiple texture channels into a single texture
42
+ * @param name Name for the resulting texture
43
+ * @param config Merge configuration
44
+ * @param scene Scene to create the texture in
45
+ * @returns The merged texture
46
+ */
47
+ export async function MergeTexturesAsync(name, config, scene) {
48
+ const channels = [config.red, config.green, config.blue, config.alpha];
49
+ const textureInputs = [];
50
+ const textureInputMap = []; // Maps channel index to texture input index (-1 for constants)
51
+ // Collect unique textures and validate inputs
52
+ for (let channelIndex = 0; channelIndex < 4; channelIndex++) {
53
+ const channel = channels[channelIndex];
54
+ if (channel) {
55
+ if (IsTextureInput(channel)) {
56
+ // Validate source channel
57
+ if (channel.sourceChannel < 0 || channel.sourceChannel > 3) {
58
+ throw new Error("Source channel must be between 0 and 3 (R, G, B, A)");
59
+ }
60
+ // Find or add texture to inputs
61
+ let textureIndex = textureInputs.indexOf(channel.texture);
62
+ if (textureIndex === -1) {
63
+ textureIndex = textureInputs.length;
64
+ textureInputs.push(channel.texture);
65
+ }
66
+ textureInputMap[channelIndex] = textureIndex;
67
+ }
68
+ else if (IsConstantInput(channel)) {
69
+ // Validate constant value
70
+ if (channel.value < 0 || channel.value > 1) {
71
+ throw new Error("Constant value must be between 0.0 and 1.0");
72
+ }
73
+ textureInputMap[channelIndex] = -1;
74
+ }
75
+ else {
76
+ throw new Error("Invalid channel input configuration");
77
+ }
78
+ }
79
+ else {
80
+ textureInputMap[channelIndex] = -1;
81
+ }
82
+ }
83
+ // Determine output size
84
+ let outputSize = config.outputSize;
85
+ if (!outputSize && textureInputs.length > 0) {
86
+ // Use the largest texture size
87
+ let maxSize = 0;
88
+ for (const texture of textureInputs) {
89
+ const size = texture.getSize();
90
+ const currentSize = Math.max(size.width, size.height);
91
+ if (currentSize > maxSize) {
92
+ maxSize = currentSize;
93
+ outputSize = size.width === size.height ? maxSize : size;
94
+ }
95
+ }
96
+ }
97
+ outputSize = outputSize || 512; // Fallback size
98
+ // Generate shader defines
99
+ const defines = [];
100
+ const usedTextures = new Set();
101
+ for (let channelIndex = 0; channelIndex < 4; channelIndex++) {
102
+ const channel = channels[channelIndex];
103
+ const channelName = ["RED", "GREEN", "BLUE", "ALPHA"][channelIndex];
104
+ if (channel && IsTextureInput(channel)) {
105
+ defines.push(`${channelName}_FROM_TEXTURE`);
106
+ const textureIndex = textureInputMap[channelIndex];
107
+ usedTextures.add(textureIndex);
108
+ }
109
+ }
110
+ // Add texture defines for used textures
111
+ usedTextures.forEach((textureIndex) => {
112
+ defines.push(`USE_TEXTURE${textureIndex}`);
113
+ });
114
+ // Create the procedural texture
115
+ const outputTextureOptions = {
116
+ type: 2,
117
+ format: 5,
118
+ samplingMode: 1,
119
+ generateDepthBuffer: false,
120
+ generateMipMaps: false,
121
+ shaderLanguage: scene.getEngine().isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */,
122
+ extraInitializationsAsync: async () => {
123
+ if (scene.getEngine().isWebGPU) {
124
+ await Promise.all([import("../../ShadersWGSL/textureMerger.fragment.js")]);
125
+ }
126
+ else {
127
+ await Promise.all([import("../../Shaders/textureMerger.fragment.js")]);
128
+ }
129
+ },
130
+ };
131
+ const proceduralTexture = new ProceduralTexture(name, outputSize, _ShaderName, scene, outputTextureOptions);
132
+ proceduralTexture.refreshRate = -1; // Do not auto-refresh
133
+ // Set the defines
134
+ proceduralTexture.defines = defines.length > 0 ? "#define " + defines.join("\n#define ") + "\n" : "";
135
+ // Set up texture inputs
136
+ for (let i = 0; i < textureInputs.length; i++) {
137
+ CopyTextureTransform(textureInputs[i], proceduralTexture);
138
+ proceduralTexture.setTexture(`inputTexture${i}`, textureInputs[i]);
139
+ }
140
+ // Set up channel configuration
141
+ for (let channelIndex = 0; channelIndex < 4; channelIndex++) {
142
+ const channel = channels[channelIndex];
143
+ const channelName = ["red", "green", "blue", "alpha"][channelIndex];
144
+ if (channel && IsTextureInput(channel)) {
145
+ const textureIndex = textureInputMap[channelIndex];
146
+ proceduralTexture.setInt(`${channelName}TextureIndex`, textureIndex);
147
+ proceduralTexture.setInt(`${channelName}SourceChannel`, channel.sourceChannel);
148
+ }
149
+ else {
150
+ // Use constant value (either provided or default)
151
+ let constantValue;
152
+ if (channel && IsConstantInput(channel)) {
153
+ constantValue = channel.value;
154
+ }
155
+ else {
156
+ // Use default values: 0 for RGB, 1 for alpha
157
+ constantValue = channelIndex === 3 ? 1.0 : 0.0;
158
+ }
159
+ proceduralTexture.setFloat(`${channelName}ConstantValue`, constantValue);
160
+ }
161
+ }
162
+ return await new Promise((resolve, reject) => {
163
+ // Compile and render
164
+ proceduralTexture.executeWhenReady(() => {
165
+ try {
166
+ proceduralTexture.render();
167
+ resolve(proceduralTexture);
168
+ }
169
+ catch (error) {
170
+ reject(error instanceof Error ? error : new Error(String(error)));
171
+ }
172
+ });
173
+ });
174
+ }
175
+ /**
176
+ * @internal
177
+ * Create a texture input configuration
178
+ * @param texture The texture to read from
179
+ * @param sourceChannel The channel to read (0=R, 1=G, 2=B, 3=A)
180
+ * @returns Texture channel input configuration
181
+ */
182
+ export function CreateTextureInput(texture, sourceChannel) {
183
+ return { texture, sourceChannel };
184
+ }
185
+ /**
186
+ * @internal
187
+ * Create a constant value input configuration
188
+ * @param value The constant value (0.0-1.0)
189
+ * @returns Constant channel input configuration
190
+ */
191
+ export function CreateConstantInput(value) {
192
+ return { value };
193
+ }
194
+ /**
195
+ * @internal
196
+ * Create a simple RGBA channel packing configuration
197
+ * @param red Input for red channel
198
+ * @param green Input for green channel (optional, defaults to 0)
199
+ * @param blue Input for blue channel (optional, defaults to 0)
200
+ * @param alpha Input for alpha channel (optional, defaults to 1)
201
+ * @returns Texture merge configuration
202
+ */
203
+ export function CreateRGBAConfiguration(red, green, blue, alpha) {
204
+ return { red, green, blue, alpha };
205
+ }
206
+ //# sourceMappingURL=textureMerger.js.map