@babylonjs/core 9.4.0 → 9.5.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.
- package/Cameras/Inputs/freeCameraTouchInput.js +5 -3
- package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraVirtualJoystickInput.js +11 -7
- package/Cameras/Inputs/freeCameraVirtualJoystickInput.js.map +1 -1
- package/Cameras/arcRotateCamera.js +2 -1
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Cameras/camera.js +1 -0
- package/Cameras/camera.js.map +1 -1
- package/Cameras/followCamera.js +1 -1
- package/Cameras/followCamera.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +12 -0
- package/Collisions/gpuPicker.js +51 -0
- package/Collisions/gpuPicker.js.map +1 -1
- package/Culling/ray.core.js +46 -2
- package/Culling/ray.core.js.map +1 -1
- package/Engines/Native/nativeHelpers.js +26 -0
- package/Engines/Native/nativeHelpers.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureHelper.js +26 -0
- package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +52 -0
- package/Engines/constants.js +52 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +13 -0
- package/Engines/thinEngine.js +52 -0
- package/Engines/thinEngine.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js +10 -3
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.d.ts +1 -0
- package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js +36 -3
- package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js.map +1 -1
- package/FlowGraph/flowGraphEventBlock.d.ts +13 -0
- package/FlowGraph/flowGraphEventBlock.js +21 -2
- package/FlowGraph/flowGraphEventBlock.js.map +1 -1
- package/FrameGraph/frameGraphTextureManager.js +26 -0
- package/FrameGraph/frameGraphTextureManager.js.map +1 -1
- package/Layers/layer.js +5 -1
- package/Layers/layer.js.map +1 -1
- package/LensFlares/lensFlareSystem.js +1 -0
- package/LensFlares/lensFlareSystem.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.js +11 -1
- package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js +14 -0
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.d.ts +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.js +6 -3
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +2 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +10 -3
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.d.ts +2 -1
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js +10 -4
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.d.ts +11 -0
- package/Materials/PBR/openpbrMaterial.js +59 -12
- package/Materials/PBR/openpbrMaterial.js.map +1 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.js +26 -0
- package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
- package/Materials/Textures/envCubeTexture.js +33 -15
- package/Materials/Textures/envCubeTexture.js.map +1 -1
- package/Materials/material.d.ts +16 -1
- package/Materials/material.js +16 -1
- package/Materials/material.js.map +1 -1
- package/Materials/standardMaterial.js +4 -2
- package/Materials/standardMaterial.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +16 -18
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.d.ts +24 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js +93 -18
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js.map +1 -1
- package/Meshes/abstractMesh.js +1 -0
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/mesh.js +3 -0
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/transformNode.d.ts +6 -0
- package/Meshes/transformNode.js +6 -0
- package/Meshes/transformNode.js.map +1 -1
- package/Misc/brdfTextureTools.d.ts +12 -0
- package/Misc/brdfTextureTools.js +22 -0
- package/Misc/brdfTextureTools.js.map +1 -1
- package/Misc/depthReducer.js +1 -1
- package/Misc/depthReducer.js.map +1 -1
- package/Misc/snapshotRenderingHelper.d.ts +7 -1
- package/Misc/snapshotRenderingHelper.js +7 -1
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Misc/textureTools.js +26 -0
- package/Misc/textureTools.js.map +1 -1
- package/Misc/tools.js +1 -1
- package/Misc/tools.js.map +1 -1
- package/Particles/Node/Blocks/Update/updateFlowMapBlock.js +17 -10
- package/Particles/Node/Blocks/Update/updateFlowMapBlock.js.map +1 -1
- package/Particles/Node/Blocks/Update/updateNoiseBlock.js +14 -0
- package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
- package/Particles/Node/Blocks/particleSourceTextureBlock.js +114 -12
- package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
- package/Particles/Node/nodeParticleBuildState.d.ts +11 -0
- package/Particles/Node/nodeParticleBuildState.js +15 -0
- package/Particles/Node/nodeParticleBuildState.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.js +23 -22
- package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
- package/Particles/gpuParticleSystem.js +1 -0
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.js +1 -0
- package/Particles/thinParticleSystem.js.map +1 -1
- package/PostProcesses/postProcessManager.d.ts +2 -0
- package/PostProcesses/postProcessManager.js +14 -8
- package/PostProcesses/postProcessManager.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +12 -9
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/depthRendererSceneComponent.js +6 -6
- package/Rendering/depthRendererSceneComponent.js.map +1 -1
- package/Rendering/iblCdfGeneratorSceneComponent.d.ts +6 -0
- package/Rendering/iblCdfGeneratorSceneComponent.js +16 -0
- package/Rendering/iblCdfGeneratorSceneComponent.js.map +1 -1
- package/Rendering/prePassRenderer.d.ts +4 -1
- package/Rendering/prePassRenderer.js +31 -9
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +18 -10
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +36 -14
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -5
- package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBRDFFunctions.js +10 -6
- package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
- package/Shaders/openpbr.fragment.js +14 -15
- package/Shaders/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +19 -11
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +3 -3
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +36 -14
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +5 -3
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +5 -6
- package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
- package/ShadersWGSL/openpbr.fragment.js +16 -17
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/Sprites/spriteManager.js +1 -0
- package/Sprites/spriteManager.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +16 -0
- package/scene.js +13 -0
- package/scene.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateFlowMapBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Particles/Node/Blocks/Update/updateFlowMapBlock.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,iBAAiB;IACrD;;;OAGG;IACH,YAAmB,IAAY;QAC3B,KAAK,CAAC,IAAI,CAAC,CAAC;QAEZ,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,qCAAqC,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,qCAAqC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,qCAAqC,CAAC,QAAQ,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,oBAAoB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACa,MAAM,CAAC,KAA6B;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAuB,CAAC;QAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"updateFlowMapBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Particles/Node/Blocks/Update/updateFlowMapBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { type ThinParticleSystem } from \"core/Particles/thinParticleSystem\";\r\nimport { type NodeParticleConnectionPoint } from \"../../nodeParticleBlockConnectionPoint\";\r\nimport { type NodeParticleBuildState } from \"../../nodeParticleBuildState\";\r\nimport { type Particle } from \"core/Particles/particle\";\r\nimport { type INodeParticleTextureData, type ParticleTextureSourceBlock } from \"../particleSourceTextureBlock\";\r\n\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"../../Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { NodeParticleBlock } from \"../../nodeParticleBlock\";\r\nimport { _ConnectAtTheEnd } from \"core/Particles/Queue/executionQueue\";\r\nimport { FlowMap } from \"core/Particles/flowMap\";\r\n\r\n/**\r\n * Block used to update particle position based on a flow map\r\n */\r\nexport class UpdateFlowMapBlock extends NodeParticleBlock {\r\n /**\r\n * Create a new UpdateFlowMapBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this.registerInput(\"particle\", NodeParticleBlockConnectionPointTypes.Particle);\r\n this.registerInput(\"flowMap\", NodeParticleBlockConnectionPointTypes.Texture);\r\n this.registerInput(\"strength\", NodeParticleBlockConnectionPointTypes.Float, true, 1);\r\n this.registerOutput(\"output\", NodeParticleBlockConnectionPointTypes.Particle);\r\n }\r\n\r\n /**\r\n * Gets the particle component\r\n */\r\n public get particle(): NodeParticleConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the flowMap input component\r\n */\r\n public get flowMap(): NodeParticleConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the strength input component\r\n */\r\n public get strength(): NodeParticleConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeParticleConnectionPoint {\r\n return this._outputs[0];\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 \"UpdateFlowMapBlock\";\r\n }\r\n\r\n /**\r\n * Builds the block\r\n * @param state defines the current build state\r\n */\r\n public override _build(state: NodeParticleBuildState) {\r\n const system = this.particle.getConnectedValue(state) as ThinParticleSystem;\r\n const scene = state.scene;\r\n\r\n const flowMapTexture = this.flowMap.connectedPoint?.ownerBlock as Nullable<ParticleTextureSourceBlock>;\r\n let flowMap: Nullable<FlowMap> = null;\r\n\r\n if (flowMapTexture) {\r\n state.registerBuildPromise(\r\n (async () => {\r\n let textureContent: Nullable<INodeParticleTextureData>;\r\n try {\r\n textureContent = await flowMapTexture.extractTextureContentAsync();\r\n } catch {\r\n return;\r\n }\r\n if (!textureContent) {\r\n return;\r\n }\r\n flowMap = new FlowMap(textureContent.width, textureContent.height, textureContent.data as Uint8ClampedArray);\r\n })()\r\n );\r\n }\r\n\r\n const processFlowMap = (particle: Particle) => {\r\n if (!flowMap) {\r\n return;\r\n }\r\n const matrix = scene.getTransformMatrix();\r\n const strength = this.strength.getConnectedValue(state) as number;\r\n flowMap._processParticle(particle, strength * system._tempScaledUpdateSpeed, matrix);\r\n };\r\n\r\n const flowMapProcessing = {\r\n process: processFlowMap,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n if (system._updateQueueStart) {\r\n _ConnectAtTheEnd(flowMapProcessing, system._updateQueueStart);\r\n } else {\r\n system._updateQueueStart = flowMapProcessing;\r\n }\r\n\r\n this.output._storedValue = system;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.UpdateFlowMapBlock\", UpdateFlowMapBlock);\r\n"]}
|
|
@@ -67,6 +67,20 @@ export class UpdateNoiseBlock extends NodeParticleBlock {
|
|
|
67
67
|
let noiseTextureData = null;
|
|
68
68
|
let noiseTextureSize = null;
|
|
69
69
|
let lastFrameId = -1;
|
|
70
|
+
state.registerBuildPromise((async () => {
|
|
71
|
+
try {
|
|
72
|
+
const textureContent = await noiseTextureBlock.extractTextureContentAsync();
|
|
73
|
+
if (!textureContent) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
noiseTextureData = textureContent.data;
|
|
77
|
+
noiseTextureSize = { width: textureContent.width, height: textureContent.height };
|
|
78
|
+
lastFrameId = noiseTextureBlock.textureOutput._storedValue?.getScene?.()?.getFrameId() ?? -1;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
})());
|
|
70
84
|
const processNoise = (particle) => {
|
|
71
85
|
// Get the texture directly from the block's stored value to support procedural textures
|
|
72
86
|
// (as the block caches the texture data)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateNoiseBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Particles/Node/Blocks/Update/updateNoiseBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { type ISize } from \"core/Maths/math.size\";\r\nimport { type ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { type Particle } from \"core/Particles/particle\";\r\nimport { type ThinParticleSystem } from \"core/Particles/thinParticleSystem\";\r\nimport { type NodeParticleConnectionPoint } from \"core/Particles/Node/nodeParticleBlockConnectionPoint\";\r\nimport { type NodeParticleBuildState } from \"core/Particles/Node/nodeParticleBuildState\";\r\nimport { type ParticleTextureSourceBlock } from \"core/Particles/Node/Blocks/particleSourceTextureBlock\";\r\n\r\nimport { TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { NodeParticleBlock } from \"core/Particles/Node/nodeParticleBlock\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"core/Particles/Node/Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { _ConnectAtTheEnd } from \"core/Particles/Queue/executionQueue\";\r\n\r\n/**\r\n * Block used to update particle position based on a noise texture\r\n */\r\nexport class UpdateNoiseBlock extends NodeParticleBlock {\r\n /**\r\n * Create a new UpdateNoiseBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this.registerInput(\"particle\", NodeParticleBlockConnectionPointTypes.Particle);\r\n this.registerInput(\"noiseTexture\", NodeParticleBlockConnectionPointTypes.Texture);\r\n this.registerInput(\"strength\", NodeParticleBlockConnectionPointTypes.Vector3, true, new Vector3(100, 100, 100));\r\n this.registerOutput(\"output\", NodeParticleBlockConnectionPointTypes.Particle);\r\n }\r\n\r\n /**\r\n * Gets the particle component\r\n */\r\n public get particle(): NodeParticleConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the noiseTexture input component\r\n */\r\n public get noiseTexture(): NodeParticleConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the strength input component\r\n */\r\n public get strength(): NodeParticleConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeParticleConnectionPoint {\r\n return this._outputs[0];\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 \"UpdateNoiseBlock\";\r\n }\r\n\r\n /**\r\n * Builds the block\r\n * @param state defines the current build state\r\n */\r\n public override _build(state: NodeParticleBuildState) {\r\n const system = this.particle.getConnectedValue(state) as ThinParticleSystem;\r\n\r\n const strength = this.strength.getConnectedValue(state) as Vector3;\r\n if (!strength) {\r\n return;\r\n }\r\n\r\n const noiseTextureBlock = this.noiseTexture.connectedPoint?.ownerBlock as ParticleTextureSourceBlock;\r\n if (!noiseTextureBlock) {\r\n return;\r\n }\r\n\r\n // These will be updated each frame for procedural textures\r\n let noiseTextureData: Nullable<Uint8Array | Uint8ClampedArray> = null;\r\n let noiseTextureSize: Nullable<ISize> = null;\r\n let lastFrameId = -1;\r\n\r\n const processNoise = (particle: Particle) => {\r\n // Get the texture directly from the block's stored value to support procedural textures\r\n // (as the block caches the texture data)\r\n const texture = noiseTextureBlock.textureOutput._storedValue as ProceduralTexture;\r\n if (!texture || !texture.isReady()) {\r\n return;\r\n }\r\n\r\n // Fetch fresh texture data once per frame (like in thinParticleSystem)\r\n const currentFrameId = texture.getScene()?.getFrameId() ?? -1;\r\n if (currentFrameId !== lastFrameId) {\r\n lastFrameId = currentFrameId;\r\n\r\n // Texture size only needs to be fetched once\r\n if (!noiseTextureSize) {\r\n noiseTextureSize = texture.getSize();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n texture.getContent()?.then((data) => {\r\n noiseTextureData = data as Uint8Array;\r\n });\r\n }\r\n\r\n // Skip if we don't have texture data yet\r\n if (!noiseTextureData || !noiseTextureSize) {\r\n return;\r\n }\r\n\r\n if (!particle._properties.randomNoiseCoordinates1) {\r\n particle._properties.randomNoiseCoordinates1 = new Vector3(Math.random(), Math.random(), Math.random());\r\n }\r\n\r\n if (!particle._properties.randomNoiseCoordinates2) {\r\n particle._properties.randomNoiseCoordinates2 = new Vector3(Math.random(), Math.random(), Math.random());\r\n }\r\n\r\n const fetchedColorR = system._fetchR(\r\n particle._properties.randomNoiseCoordinates1.x,\r\n particle._properties.randomNoiseCoordinates1.y,\r\n noiseTextureSize.width,\r\n noiseTextureSize.height,\r\n noiseTextureData\r\n );\r\n const fetchedColorG = system._fetchR(\r\n particle._properties.randomNoiseCoordinates1.z,\r\n particle._properties.randomNoiseCoordinates2.x,\r\n noiseTextureSize.width,\r\n noiseTextureSize.height,\r\n noiseTextureData\r\n );\r\n const fetchedColorB = system._fetchR(\r\n particle._properties.randomNoiseCoordinates2.y,\r\n particle._properties.randomNoiseCoordinates2.z,\r\n noiseTextureSize.width,\r\n noiseTextureSize.height,\r\n noiseTextureData\r\n );\r\n\r\n const force = TmpVectors.Vector3[0];\r\n const scaledForce = TmpVectors.Vector3[1];\r\n\r\n force.copyFromFloats((2 * fetchedColorR - 1) * strength.x, (2 * fetchedColorG - 1) * strength.y, (2 * fetchedColorB - 1) * strength.z);\r\n\r\n force.scaleToRef(system._tempScaledUpdateSpeed, scaledForce);\r\n particle.direction.addInPlace(scaledForce);\r\n };\r\n\r\n const noiseProcessing = {\r\n process: processNoise,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n if (system._updateQueueStart) {\r\n _ConnectAtTheEnd(noiseProcessing, system._updateQueueStart);\r\n } else {\r\n system._updateQueueStart = noiseProcessing;\r\n }\r\n\r\n this.output._storedValue = system;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.UpdateNoiseBlock\", UpdateNoiseBlock);\r\n"]}
|
|
1
|
+
{"version":3,"file":"updateNoiseBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Particles/Node/Blocks/Update/updateNoiseBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { type ISize } from \"core/Maths/math.size\";\r\nimport { type ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { type Particle } from \"core/Particles/particle\";\r\nimport { type ThinParticleSystem } from \"core/Particles/thinParticleSystem\";\r\nimport { type NodeParticleConnectionPoint } from \"core/Particles/Node/nodeParticleBlockConnectionPoint\";\r\nimport { type NodeParticleBuildState } from \"core/Particles/Node/nodeParticleBuildState\";\r\nimport { type ParticleTextureSourceBlock } from \"core/Particles/Node/Blocks/particleSourceTextureBlock\";\r\n\r\nimport { TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { NodeParticleBlock } from \"core/Particles/Node/nodeParticleBlock\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"core/Particles/Node/Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { _ConnectAtTheEnd } from \"core/Particles/Queue/executionQueue\";\r\n\r\n/**\r\n * Block used to update particle position based on a noise texture\r\n */\r\nexport class UpdateNoiseBlock extends NodeParticleBlock {\r\n /**\r\n * Create a new UpdateNoiseBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this.registerInput(\"particle\", NodeParticleBlockConnectionPointTypes.Particle);\r\n this.registerInput(\"noiseTexture\", NodeParticleBlockConnectionPointTypes.Texture);\r\n this.registerInput(\"strength\", NodeParticleBlockConnectionPointTypes.Vector3, true, new Vector3(100, 100, 100));\r\n this.registerOutput(\"output\", NodeParticleBlockConnectionPointTypes.Particle);\r\n }\r\n\r\n /**\r\n * Gets the particle component\r\n */\r\n public get particle(): NodeParticleConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the noiseTexture input component\r\n */\r\n public get noiseTexture(): NodeParticleConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the strength input component\r\n */\r\n public get strength(): NodeParticleConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeParticleConnectionPoint {\r\n return this._outputs[0];\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 \"UpdateNoiseBlock\";\r\n }\r\n\r\n /**\r\n * Builds the block\r\n * @param state defines the current build state\r\n */\r\n public override _build(state: NodeParticleBuildState) {\r\n const system = this.particle.getConnectedValue(state) as ThinParticleSystem;\r\n\r\n const strength = this.strength.getConnectedValue(state) as Vector3;\r\n if (!strength) {\r\n return;\r\n }\r\n\r\n const noiseTextureBlock = this.noiseTexture.connectedPoint?.ownerBlock as ParticleTextureSourceBlock;\r\n if (!noiseTextureBlock) {\r\n return;\r\n }\r\n\r\n // These will be updated each frame for procedural textures\r\n let noiseTextureData: Nullable<Uint8Array | Uint8ClampedArray> = null;\r\n let noiseTextureSize: Nullable<ISize> = null;\r\n let lastFrameId = -1;\r\n\r\n state.registerBuildPromise(\r\n (async () => {\r\n try {\r\n const textureContent = await noiseTextureBlock.extractTextureContentAsync();\r\n if (!textureContent) {\r\n return;\r\n }\r\n noiseTextureData = textureContent.data;\r\n noiseTextureSize = { width: textureContent.width, height: textureContent.height };\r\n lastFrameId = (noiseTextureBlock.textureOutput._storedValue as ProceduralTexture)?.getScene?.()?.getFrameId() ?? -1;\r\n } catch {\r\n return;\r\n }\r\n })()\r\n );\r\n\r\n const processNoise = (particle: Particle) => {\r\n // Get the texture directly from the block's stored value to support procedural textures\r\n // (as the block caches the texture data)\r\n const texture = noiseTextureBlock.textureOutput._storedValue as ProceduralTexture;\r\n if (!texture || !texture.isReady()) {\r\n return;\r\n }\r\n\r\n // Fetch fresh texture data once per frame (like in thinParticleSystem)\r\n const currentFrameId = texture.getScene()?.getFrameId() ?? -1;\r\n if (currentFrameId !== lastFrameId) {\r\n lastFrameId = currentFrameId;\r\n\r\n // Texture size only needs to be fetched once\r\n if (!noiseTextureSize) {\r\n noiseTextureSize = texture.getSize();\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n texture.getContent()?.then((data) => {\r\n noiseTextureData = data as Uint8Array;\r\n });\r\n }\r\n\r\n // Skip if we don't have texture data yet\r\n if (!noiseTextureData || !noiseTextureSize) {\r\n return;\r\n }\r\n\r\n if (!particle._properties.randomNoiseCoordinates1) {\r\n particle._properties.randomNoiseCoordinates1 = new Vector3(Math.random(), Math.random(), Math.random());\r\n }\r\n\r\n if (!particle._properties.randomNoiseCoordinates2) {\r\n particle._properties.randomNoiseCoordinates2 = new Vector3(Math.random(), Math.random(), Math.random());\r\n }\r\n\r\n const fetchedColorR = system._fetchR(\r\n particle._properties.randomNoiseCoordinates1.x,\r\n particle._properties.randomNoiseCoordinates1.y,\r\n noiseTextureSize.width,\r\n noiseTextureSize.height,\r\n noiseTextureData\r\n );\r\n const fetchedColorG = system._fetchR(\r\n particle._properties.randomNoiseCoordinates1.z,\r\n particle._properties.randomNoiseCoordinates2.x,\r\n noiseTextureSize.width,\r\n noiseTextureSize.height,\r\n noiseTextureData\r\n );\r\n const fetchedColorB = system._fetchR(\r\n particle._properties.randomNoiseCoordinates2.y,\r\n particle._properties.randomNoiseCoordinates2.z,\r\n noiseTextureSize.width,\r\n noiseTextureSize.height,\r\n noiseTextureData\r\n );\r\n\r\n const force = TmpVectors.Vector3[0];\r\n const scaledForce = TmpVectors.Vector3[1];\r\n\r\n force.copyFromFloats((2 * fetchedColorR - 1) * strength.x, (2 * fetchedColorG - 1) * strength.y, (2 * fetchedColorB - 1) * strength.z);\r\n\r\n force.scaleToRef(system._tempScaledUpdateSpeed, scaledForce);\r\n particle.direction.addInPlace(scaledForce);\r\n };\r\n\r\n const noiseProcessing = {\r\n process: processNoise,\r\n previousItem: null,\r\n nextItem: null,\r\n };\r\n\r\n if (system._updateQueueStart) {\r\n _ConnectAtTheEnd(noiseProcessing, system._updateQueueStart);\r\n } else {\r\n system._updateQueueStart = noiseProcessing;\r\n }\r\n\r\n this.output._storedValue = system;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.UpdateNoiseBlock\", UpdateNoiseBlock);\r\n"]}
|
|
@@ -119,31 +119,133 @@ export class ParticleTextureSourceBlock extends NodeParticleBlock {
|
|
|
119
119
|
}
|
|
120
120
|
const texture = this.textureOutput._storedValue || this._sourceTexture;
|
|
121
121
|
return await new Promise((resolve, reject) => {
|
|
122
|
+
const extractProceduralTextureContentAsync = async (proceduralTexture) => {
|
|
123
|
+
if (!proceduralTexture.isReady()) {
|
|
124
|
+
const effect = proceduralTexture.getEffect();
|
|
125
|
+
await new Promise((resolveReady) => {
|
|
126
|
+
let settled = false;
|
|
127
|
+
let errorObserver = null;
|
|
128
|
+
const settle = (ready) => {
|
|
129
|
+
if (settled) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
settled = true;
|
|
133
|
+
errorObserver?.remove();
|
|
134
|
+
resolveReady(ready);
|
|
135
|
+
};
|
|
136
|
+
errorObserver = effect.onErrorObservable.add(() => {
|
|
137
|
+
settle(false);
|
|
138
|
+
});
|
|
139
|
+
effect.executeWhenCompiled(() => {
|
|
140
|
+
settle(true);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (!proceduralTexture.isReady()) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
proceduralTexture.render();
|
|
148
|
+
const data = await proceduralTexture.getContent();
|
|
149
|
+
if (!data) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const size = proceduralTexture.getSize();
|
|
153
|
+
return {
|
|
154
|
+
width: size.width,
|
|
155
|
+
height: size.height,
|
|
156
|
+
data: new Uint8ClampedArray(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)),
|
|
157
|
+
};
|
|
158
|
+
};
|
|
122
159
|
if (!texture.isReady()) {
|
|
123
|
-
texture.
|
|
160
|
+
if (texture.getContent) {
|
|
161
|
+
void (async () => {
|
|
162
|
+
try {
|
|
163
|
+
this._cachedData = await extractProceduralTextureContentAsync(texture);
|
|
164
|
+
resolve(this._cachedData);
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
|
|
168
|
+
reject(e);
|
|
169
|
+
}
|
|
170
|
+
})();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
let settled = false;
|
|
174
|
+
let loadObserver = null;
|
|
175
|
+
let internalErrorObserver = null;
|
|
176
|
+
let textureErrorObserver = null;
|
|
177
|
+
const cleanup = () => {
|
|
178
|
+
loadObserver?.remove();
|
|
179
|
+
internalErrorObserver?.remove();
|
|
180
|
+
textureErrorObserver?.remove();
|
|
181
|
+
};
|
|
182
|
+
const settle = (textureContent) => {
|
|
183
|
+
if (settled) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
settled = true;
|
|
187
|
+
cleanup();
|
|
188
|
+
resolve(textureContent);
|
|
189
|
+
};
|
|
190
|
+
const fail = (error) => {
|
|
191
|
+
if (settled) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
settled = true;
|
|
195
|
+
cleanup();
|
|
196
|
+
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
|
|
197
|
+
reject(error);
|
|
198
|
+
};
|
|
199
|
+
if (texture.loadingError) {
|
|
200
|
+
settle(null);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const loadObservable = texture.onLoadObservable;
|
|
204
|
+
if (!loadObservable) {
|
|
205
|
+
settle(null);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
loadObserver = loadObservable.addOnce(async () => {
|
|
124
209
|
try {
|
|
125
210
|
this._cachedData = await this.extractTextureContentAsync();
|
|
126
|
-
|
|
211
|
+
settle(this._cachedData);
|
|
127
212
|
}
|
|
128
213
|
catch (e) {
|
|
129
|
-
|
|
130
|
-
|
|
214
|
+
fail(e);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
internalErrorObserver =
|
|
218
|
+
texture.getInternalTexture()?.onErrorObservable.addOnce(() => {
|
|
219
|
+
settle(null);
|
|
220
|
+
}) ?? null;
|
|
221
|
+
textureErrorObserver = Texture.OnTextureLoadErrorObservable.add((erroredTexture) => {
|
|
222
|
+
if (erroredTexture === texture) {
|
|
223
|
+
settle(null);
|
|
131
224
|
}
|
|
132
225
|
});
|
|
226
|
+
if (texture.loadingError) {
|
|
227
|
+
settle(null);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (texture.isReady()) {
|
|
231
|
+
void (async () => {
|
|
232
|
+
try {
|
|
233
|
+
this._cachedData = await this.extractTextureContentAsync();
|
|
234
|
+
settle(this._cachedData);
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
fail(e);
|
|
238
|
+
}
|
|
239
|
+
})();
|
|
240
|
+
}
|
|
133
241
|
return;
|
|
134
242
|
}
|
|
135
243
|
const size = texture.getSize();
|
|
136
244
|
if (texture.getContent) {
|
|
137
|
-
|
|
138
|
-
proceduralTexture
|
|
139
|
-
.getContent()
|
|
245
|
+
extractProceduralTextureContentAsync(texture)
|
|
140
246
|
// eslint-disable-next-line github/no-then
|
|
141
247
|
?.then((data) => {
|
|
142
|
-
this._cachedData =
|
|
143
|
-
width: size.width,
|
|
144
|
-
height: size.height,
|
|
145
|
-
data: new Uint8ClampedArray(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)),
|
|
146
|
-
};
|
|
248
|
+
this._cachedData = data;
|
|
147
249
|
resolve(this._cachedData);
|
|
148
250
|
})
|
|
149
251
|
// eslint-disable-next-line github/no-then
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"particleSourceTextureBlock.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Particles/Node/Blocks/particleSourceTextureBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { type NodeParticleConnectionPoint } from \"../nodeParticleBlockConnectionPoint\";\r\nimport { type NodeParticleBuildState } from \"../nodeParticleBuildState\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type BaseTexture } from \"../../../Materials/Textures/baseTexture\";\r\nimport { type ProceduralTexture } from \"../../../Materials/Textures/Procedurals/proceduralTexture\";\r\n\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"../Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { NodeParticleBlock } from \"../nodeParticleBlock\";\r\nimport { TextureTools } from \"core/Misc/textureTools\";\r\n\r\n/**\r\n * Interface used to define texture data\r\n */\r\nexport interface INodeParticleTextureData {\r\n /** Width of the texture in pixels */\r\n width: number;\r\n /** Height of the texture in pixels */\r\n height: number;\r\n /** RGBA pixel data */\r\n data: Uint8ClampedArray;\r\n}\r\n\r\n/**\r\n * Block used to provide a texture for particles in a particle system\r\n */\r\nexport class ParticleTextureSourceBlock extends NodeParticleBlock {\r\n private _url: string = \"\";\r\n private _textureDataUrl: string = \"\";\r\n private _sourceTexture: Nullable<BaseTexture> = null;\r\n private _cachedData: Nullable<INodeParticleTextureData> = null;\r\n private _clonedTextures: BaseTexture[] = [];\r\n\r\n /**\r\n * Gets or sets the strenght of the flow map effect\r\n */\r\n public invertY = true;\r\n\r\n /**\r\n * Indicates if the texture data should be serialized as a base64 string.\r\n */\r\n public serializedCachedData: boolean = false;\r\n\r\n /**\r\n * Gets or sets the URL of the texture to be used by this block.\r\n */\r\n public get url(): string {\r\n return this._url;\r\n }\r\n\r\n public set url(value: string) {\r\n if (this._url === value) {\r\n return;\r\n }\r\n this._cachedData = null;\r\n this._url = value;\r\n this._textureDataUrl = \"\";\r\n this._sourceTexture = null;\r\n }\r\n\r\n /**\r\n * Gets or sets the data URL of the texture to be used by this block.\r\n * This is a base64 encoded string representing the texture data.\r\n */\r\n public get textureDataUrl(): string {\r\n return this._textureDataUrl;\r\n }\r\n\r\n public set textureDataUrl(value: string) {\r\n if (this._textureDataUrl === value) {\r\n return;\r\n }\r\n\r\n this._cachedData = null;\r\n this._textureDataUrl = value;\r\n this._url = \"\";\r\n this._sourceTexture = null;\r\n }\r\n\r\n /**\r\n * Gets the texture directly set on this block.\r\n * This value will not be serialized.\r\n */\r\n public get sourceTexture(): Nullable<BaseTexture> {\r\n return this._sourceTexture;\r\n }\r\n\r\n /**\r\n * Directly sets the texture to be used by this block.\r\n * This value will not be serialized.\r\n */\r\n public set sourceTexture(value: Nullable<BaseTexture>) {\r\n if (this._sourceTexture === value) {\r\n return;\r\n }\r\n this._cachedData = null;\r\n this._sourceTexture = value;\r\n this._url = (value as Texture).url || \"\";\r\n this._textureDataUrl = \"\";\r\n }\r\n\r\n /**\r\n * Gets the texture set on this block.\r\n * This value will not be serialized.\r\n */\r\n public get texture(): Nullable<BaseTexture> {\r\n return this.sourceTexture;\r\n }\r\n\r\n /**\r\n * Sets the texture to be used by this block.\r\n * This value will not be serialized.\r\n */\r\n public set texture(value: Nullable<BaseTexture>) {\r\n this.sourceTexture = value;\r\n }\r\n\r\n /**\r\n * Create a new ParticleTextureSourceBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this.registerOutput(\"texture\", NodeParticleBlockConnectionPointTypes.Texture);\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 \"ParticleTextureSourceBlock\";\r\n }\r\n\r\n /**\r\n * Gets the texture output component\r\n */\r\n public get textureOutput(): NodeParticleConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the texture content as a promise\r\n * @returns a promise that resolves to the texture content, including width, height, and pixel data\r\n */\r\n async extractTextureContentAsync() {\r\n if (!this.textureOutput._storedValue && !this._sourceTexture) {\r\n return null;\r\n }\r\n\r\n if (this._cachedData) {\r\n return this._cachedData;\r\n }\r\n\r\n const texture = this.textureOutput._storedValue || this._sourceTexture;\r\n return await new Promise<\r\n Nullable<{\r\n width: number;\r\n height: number;\r\n data: Uint8ClampedArray;\r\n }>\r\n >((resolve, reject) => {\r\n if (!texture.isReady()) {\r\n texture.onLoadObservable.addOnce(async () => {\r\n try {\r\n this._cachedData = await this.extractTextureContentAsync();\r\n resolve(this._cachedData);\r\n } catch (e) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(e);\r\n }\r\n });\r\n return;\r\n }\r\n const size = texture.getSize();\r\n if (texture.getContent) {\r\n const proceduralTexture = texture as ProceduralTexture;\r\n proceduralTexture\r\n .getContent()\r\n // eslint-disable-next-line github/no-then\r\n ?.then((data) => {\r\n this._cachedData = {\r\n width: size.width,\r\n height: size.height,\r\n data: new Uint8ClampedArray(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)),\r\n };\r\n resolve(this._cachedData);\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(reject);\r\n } else {\r\n TextureTools.GetTextureDataAsync(texture, size.width, size.height)\r\n // eslint-disable-next-line github/no-then\r\n .then((data) => {\r\n this._cachedData = {\r\n width: size.width,\r\n height: size.height,\r\n data: new Uint8ClampedArray(data),\r\n };\r\n texture.dispose();\r\n resolve(this._cachedData);\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(reject);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Builds the block\r\n * @param state defines the current build state\r\n */\r\n public override _build(state: NodeParticleBuildState) {\r\n if (this._sourceTexture) {\r\n // The same NodeParticleSystemSet can be built into multiple scenes/engines\r\n // (original system scene, editor preview scene).\r\n // Textures are engine-specific, so we need to handle cross-engine cases.\r\n const sourceScene = this._sourceTexture.getScene?.();\r\n const sourceEngine = sourceScene?.getEngine?.();\r\n const targetEngine = state.scene.getEngine();\r\n\r\n if (sourceEngine && sourceEngine !== targetEngine) {\r\n // Cross-engine: recreate texture from URL if available, preserving invertY\r\n const url = (this._sourceTexture as Texture).url || this._url;\r\n if (url) {\r\n const invertY = (this._sourceTexture as Texture).invertY ?? this.invertY;\r\n const tex = new Texture(url, state.scene, undefined, invertY);\r\n this._copyTextureProperties(this._sourceTexture, tex);\r\n this._clonedTextures.push(tex);\r\n this.textureOutput._storedValue = tex;\r\n return;\r\n }\r\n // No URL available - use the source texture directly as fallback\r\n // This may not render correctly but avoids breaking completely\r\n this.textureOutput._storedValue = this._sourceTexture;\r\n return;\r\n }\r\n\r\n // Same engine: clone works correctly and preserves all properties\r\n const cloned = this._sourceTexture.clone();\r\n if (cloned) {\r\n this._clonedTextures.push(cloned);\r\n this.textureOutput._storedValue = cloned;\r\n } else {\r\n this.textureOutput._storedValue = this._sourceTexture;\r\n }\r\n return;\r\n }\r\n\r\n if (!this._textureDataUrl && !this._url) {\r\n this.textureOutput._storedValue = null;\r\n return;\r\n }\r\n\r\n if (this._textureDataUrl) {\r\n const tex = new Texture(this._textureDataUrl, state.scene, undefined, this.invertY);\r\n this._clonedTextures.push(tex);\r\n this.textureOutput._storedValue = tex;\r\n return;\r\n }\r\n\r\n const tex = new Texture(this._url, state.scene, undefined, this.invertY);\r\n this._clonedTextures.push(tex);\r\n this.textureOutput._storedValue = tex;\r\n }\r\n\r\n /**\r\n * Serializes this block\r\n * @returns the serialization object\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.url = this.url;\r\n serializationObject.serializedCachedData = this.serializedCachedData;\r\n serializationObject.invertY = this.invertY;\r\n\r\n if (this.serializedCachedData) {\r\n serializationObject.textureDataUrl = this.textureDataUrl;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Deserializes this block from a serialization object\r\n * @param serializationObject the serialization object\r\n */\r\n public override _deserialize(serializationObject: any) {\r\n super._deserialize(serializationObject);\r\n\r\n this.url = serializationObject.url;\r\n this.serializedCachedData = !!serializationObject.serializedCachedData;\r\n this.invertY = !!serializationObject.invertY;\r\n\r\n if (serializationObject.textureDataUrl) {\r\n this.textureDataUrl = serializationObject.textureDataUrl;\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the block and its associated resources\r\n */\r\n public override dispose(): void {\r\n // Dispose all cloned textures we created\r\n for (const tex of this._clonedTextures) {\r\n tex.dispose();\r\n }\r\n this._clonedTextures = [];\r\n this.textureOutput._storedValue = null;\r\n // Never dispose _sourceTexture - it's owned by the caller\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Copies texture properties from source to target texture\r\n * @param source - The source texture to copy properties from\r\n * @param target - The target texture to copy properties to\r\n */\r\n private _copyTextureProperties(source: BaseTexture, target: BaseTexture): void {\r\n // BaseTexture properties\r\n target.hasAlpha = source.hasAlpha;\r\n target.level = source.level;\r\n target.coordinatesIndex = source.coordinatesIndex;\r\n target.coordinatesMode = source.coordinatesMode;\r\n target.wrapU = source.wrapU;\r\n target.wrapV = source.wrapV;\r\n target.wrapR = source.wrapR;\r\n target.anisotropicFilteringLevel = source.anisotropicFilteringLevel;\r\n\r\n // Texture-specific properties (if both are Texture instances)\r\n const sourceTexture = source as Texture;\r\n const targetTexture = target as Texture;\r\n if (sourceTexture.uOffset !== undefined && targetTexture.uOffset !== undefined) {\r\n targetTexture.uOffset = sourceTexture.uOffset;\r\n targetTexture.vOffset = sourceTexture.vOffset;\r\n targetTexture.uScale = sourceTexture.uScale;\r\n targetTexture.vScale = sourceTexture.vScale;\r\n targetTexture.uAng = sourceTexture.uAng;\r\n targetTexture.vAng = sourceTexture.vAng;\r\n targetTexture.wAng = sourceTexture.wAng;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ParticleTextureSourceBlock\", ParticleTextureSourceBlock);\r\n"]}
|
|
1
|
+
{"version":3,"file":"particleSourceTextureBlock.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Particles/Node/Blocks/particleSourceTextureBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { type NodeParticleConnectionPoint } from \"../nodeParticleBlockConnectionPoint\";\r\nimport { type NodeParticleBuildState } from \"../nodeParticleBuildState\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type BaseTexture } from \"../../../Materials/Textures/baseTexture\";\r\nimport { type ProceduralTexture } from \"../../../Materials/Textures/Procedurals/proceduralTexture\";\r\n\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"../Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { NodeParticleBlock } from \"../nodeParticleBlock\";\r\nimport { TextureTools } from \"core/Misc/textureTools\";\r\n\r\n/**\r\n * Interface used to define texture data\r\n */\r\nexport interface INodeParticleTextureData {\r\n /** Width of the texture in pixels */\r\n width: number;\r\n /** Height of the texture in pixels */\r\n height: number;\r\n /** RGBA pixel data */\r\n data: Uint8ClampedArray;\r\n}\r\n\r\n/**\r\n * Block used to provide a texture for particles in a particle system\r\n */\r\nexport class ParticleTextureSourceBlock extends NodeParticleBlock {\r\n private _url: string = \"\";\r\n private _textureDataUrl: string = \"\";\r\n private _sourceTexture: Nullable<BaseTexture> = null;\r\n private _cachedData: Nullable<INodeParticleTextureData> = null;\r\n private _clonedTextures: BaseTexture[] = [];\r\n\r\n /**\r\n * Gets or sets the strenght of the flow map effect\r\n */\r\n public invertY = true;\r\n\r\n /**\r\n * Indicates if the texture data should be serialized as a base64 string.\r\n */\r\n public serializedCachedData: boolean = false;\r\n\r\n /**\r\n * Gets or sets the URL of the texture to be used by this block.\r\n */\r\n public get url(): string {\r\n return this._url;\r\n }\r\n\r\n public set url(value: string) {\r\n if (this._url === value) {\r\n return;\r\n }\r\n this._cachedData = null;\r\n this._url = value;\r\n this._textureDataUrl = \"\";\r\n this._sourceTexture = null;\r\n }\r\n\r\n /**\r\n * Gets or sets the data URL of the texture to be used by this block.\r\n * This is a base64 encoded string representing the texture data.\r\n */\r\n public get textureDataUrl(): string {\r\n return this._textureDataUrl;\r\n }\r\n\r\n public set textureDataUrl(value: string) {\r\n if (this._textureDataUrl === value) {\r\n return;\r\n }\r\n\r\n this._cachedData = null;\r\n this._textureDataUrl = value;\r\n this._url = \"\";\r\n this._sourceTexture = null;\r\n }\r\n\r\n /**\r\n * Gets the texture directly set on this block.\r\n * This value will not be serialized.\r\n */\r\n public get sourceTexture(): Nullable<BaseTexture> {\r\n return this._sourceTexture;\r\n }\r\n\r\n /**\r\n * Directly sets the texture to be used by this block.\r\n * This value will not be serialized.\r\n */\r\n public set sourceTexture(value: Nullable<BaseTexture>) {\r\n if (this._sourceTexture === value) {\r\n return;\r\n }\r\n this._cachedData = null;\r\n this._sourceTexture = value;\r\n this._url = (value as Texture).url || \"\";\r\n this._textureDataUrl = \"\";\r\n }\r\n\r\n /**\r\n * Gets the texture set on this block.\r\n * This value will not be serialized.\r\n */\r\n public get texture(): Nullable<BaseTexture> {\r\n return this.sourceTexture;\r\n }\r\n\r\n /**\r\n * Sets the texture to be used by this block.\r\n * This value will not be serialized.\r\n */\r\n public set texture(value: Nullable<BaseTexture>) {\r\n this.sourceTexture = value;\r\n }\r\n\r\n /**\r\n * Create a new ParticleTextureSourceBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this.registerOutput(\"texture\", NodeParticleBlockConnectionPointTypes.Texture);\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 \"ParticleTextureSourceBlock\";\r\n }\r\n\r\n /**\r\n * Gets the texture output component\r\n */\r\n public get textureOutput(): NodeParticleConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the texture content as a promise\r\n * @returns a promise that resolves to the texture content, including width, height, and pixel data\r\n */\r\n async extractTextureContentAsync() {\r\n if (!this.textureOutput._storedValue && !this._sourceTexture) {\r\n return null;\r\n }\r\n\r\n if (this._cachedData) {\r\n return this._cachedData;\r\n }\r\n\r\n const texture = this.textureOutput._storedValue || this._sourceTexture;\r\n return await new Promise<\r\n Nullable<{\r\n width: number;\r\n height: number;\r\n data: Uint8ClampedArray;\r\n }>\r\n >((resolve, reject) => {\r\n const extractProceduralTextureContentAsync = async (proceduralTexture: ProceduralTexture) => {\r\n if (!proceduralTexture.isReady()) {\r\n const effect = proceduralTexture.getEffect();\r\n await new Promise<boolean>((resolveReady) => {\r\n let settled = false;\r\n let errorObserver: Nullable<{ remove: () => void }> = null;\r\n const settle = (ready: boolean) => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n errorObserver?.remove();\r\n resolveReady(ready);\r\n };\r\n errorObserver = effect.onErrorObservable.add(() => {\r\n settle(false);\r\n });\r\n effect.executeWhenCompiled(() => {\r\n settle(true);\r\n });\r\n });\r\n }\r\n\r\n if (!proceduralTexture.isReady()) {\r\n return null;\r\n }\r\n\r\n proceduralTexture.render();\r\n const data = await proceduralTexture.getContent();\r\n if (!data) {\r\n return null;\r\n }\r\n\r\n const size = proceduralTexture.getSize();\r\n return {\r\n width: size.width,\r\n height: size.height,\r\n data: new Uint8ClampedArray(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)),\r\n };\r\n };\r\n\r\n if (!texture.isReady()) {\r\n if (texture.getContent) {\r\n void (async () => {\r\n try {\r\n this._cachedData = await extractProceduralTextureContentAsync(texture as ProceduralTexture);\r\n resolve(this._cachedData);\r\n } catch (e) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(e);\r\n }\r\n })();\r\n return;\r\n }\r\n\r\n let settled = false;\r\n let loadObserver: Nullable<{ remove: () => void }> = null;\r\n let internalErrorObserver: Nullable<{ remove: () => void }> = null;\r\n let textureErrorObserver: Nullable<{ remove: () => void }> = null;\r\n\r\n const cleanup = () => {\r\n loadObserver?.remove();\r\n internalErrorObserver?.remove();\r\n textureErrorObserver?.remove();\r\n };\r\n\r\n const settle = (textureContent: Nullable<INodeParticleTextureData>) => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n cleanup();\r\n resolve(textureContent);\r\n };\r\n\r\n const fail = (error: any) => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n cleanup();\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(error);\r\n };\r\n\r\n if (texture.loadingError) {\r\n settle(null);\r\n return;\r\n }\r\n\r\n const loadObservable = texture.onLoadObservable;\r\n if (!loadObservable) {\r\n settle(null);\r\n return;\r\n }\r\n\r\n loadObserver = loadObservable.addOnce(async () => {\r\n try {\r\n this._cachedData = await this.extractTextureContentAsync();\r\n settle(this._cachedData);\r\n } catch (e) {\r\n fail(e);\r\n }\r\n });\r\n\r\n internalErrorObserver =\r\n texture.getInternalTexture()?.onErrorObservable.addOnce(() => {\r\n settle(null);\r\n }) ?? null;\r\n\r\n textureErrorObserver = Texture.OnTextureLoadErrorObservable.add((erroredTexture) => {\r\n if (erroredTexture === texture) {\r\n settle(null);\r\n }\r\n });\r\n\r\n if (texture.loadingError) {\r\n settle(null);\r\n return;\r\n }\r\n\r\n if (texture.isReady()) {\r\n void (async () => {\r\n try {\r\n this._cachedData = await this.extractTextureContentAsync();\r\n settle(this._cachedData);\r\n } catch (e) {\r\n fail(e);\r\n }\r\n })();\r\n }\r\n return;\r\n }\r\n const size = texture.getSize();\r\n if (texture.getContent) {\r\n extractProceduralTextureContentAsync(texture as ProceduralTexture)\r\n // eslint-disable-next-line github/no-then\r\n ?.then((data) => {\r\n this._cachedData = data;\r\n resolve(this._cachedData);\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(reject);\r\n } else {\r\n TextureTools.GetTextureDataAsync(texture, size.width, size.height)\r\n // eslint-disable-next-line github/no-then\r\n .then((data) => {\r\n this._cachedData = {\r\n width: size.width,\r\n height: size.height,\r\n data: new Uint8ClampedArray(data),\r\n };\r\n texture.dispose();\r\n resolve(this._cachedData);\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch(reject);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Builds the block\r\n * @param state defines the current build state\r\n */\r\n public override _build(state: NodeParticleBuildState) {\r\n if (this._sourceTexture) {\r\n // The same NodeParticleSystemSet can be built into multiple scenes/engines\r\n // (original system scene, editor preview scene).\r\n // Textures are engine-specific, so we need to handle cross-engine cases.\r\n const sourceScene = this._sourceTexture.getScene?.();\r\n const sourceEngine = sourceScene?.getEngine?.();\r\n const targetEngine = state.scene.getEngine();\r\n\r\n if (sourceEngine && sourceEngine !== targetEngine) {\r\n // Cross-engine: recreate texture from URL if available, preserving invertY\r\n const url = (this._sourceTexture as Texture).url || this._url;\r\n if (url) {\r\n const invertY = (this._sourceTexture as Texture).invertY ?? this.invertY;\r\n const tex = new Texture(url, state.scene, undefined, invertY);\r\n this._copyTextureProperties(this._sourceTexture, tex);\r\n this._clonedTextures.push(tex);\r\n this.textureOutput._storedValue = tex;\r\n return;\r\n }\r\n // No URL available - use the source texture directly as fallback\r\n // This may not render correctly but avoids breaking completely\r\n this.textureOutput._storedValue = this._sourceTexture;\r\n return;\r\n }\r\n\r\n // Same engine: clone works correctly and preserves all properties\r\n const cloned = this._sourceTexture.clone();\r\n if (cloned) {\r\n this._clonedTextures.push(cloned);\r\n this.textureOutput._storedValue = cloned;\r\n } else {\r\n this.textureOutput._storedValue = this._sourceTexture;\r\n }\r\n return;\r\n }\r\n\r\n if (!this._textureDataUrl && !this._url) {\r\n this.textureOutput._storedValue = null;\r\n return;\r\n }\r\n\r\n if (this._textureDataUrl) {\r\n const tex = new Texture(this._textureDataUrl, state.scene, undefined, this.invertY);\r\n this._clonedTextures.push(tex);\r\n this.textureOutput._storedValue = tex;\r\n return;\r\n }\r\n\r\n const tex = new Texture(this._url, state.scene, undefined, this.invertY);\r\n this._clonedTextures.push(tex);\r\n this.textureOutput._storedValue = tex;\r\n }\r\n\r\n /**\r\n * Serializes this block\r\n * @returns the serialization object\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.url = this.url;\r\n serializationObject.serializedCachedData = this.serializedCachedData;\r\n serializationObject.invertY = this.invertY;\r\n\r\n if (this.serializedCachedData) {\r\n serializationObject.textureDataUrl = this.textureDataUrl;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Deserializes this block from a serialization object\r\n * @param serializationObject the serialization object\r\n */\r\n public override _deserialize(serializationObject: any) {\r\n super._deserialize(serializationObject);\r\n\r\n this.url = serializationObject.url;\r\n this.serializedCachedData = !!serializationObject.serializedCachedData;\r\n this.invertY = !!serializationObject.invertY;\r\n\r\n if (serializationObject.textureDataUrl) {\r\n this.textureDataUrl = serializationObject.textureDataUrl;\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the block and its associated resources\r\n */\r\n public override dispose(): void {\r\n // Dispose all cloned textures we created\r\n for (const tex of this._clonedTextures) {\r\n tex.dispose();\r\n }\r\n this._clonedTextures = [];\r\n this.textureOutput._storedValue = null;\r\n // Never dispose _sourceTexture - it's owned by the caller\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Copies texture properties from source to target texture\r\n * @param source - The source texture to copy properties from\r\n * @param target - The target texture to copy properties to\r\n */\r\n private _copyTextureProperties(source: BaseTexture, target: BaseTexture): void {\r\n // BaseTexture properties\r\n target.hasAlpha = source.hasAlpha;\r\n target.level = source.level;\r\n target.coordinatesIndex = source.coordinatesIndex;\r\n target.coordinatesMode = source.coordinatesMode;\r\n target.wrapU = source.wrapU;\r\n target.wrapV = source.wrapV;\r\n target.wrapR = source.wrapR;\r\n target.anisotropicFilteringLevel = source.anisotropicFilteringLevel;\r\n\r\n // Texture-specific properties (if both are Texture instances)\r\n const sourceTexture = source as Texture;\r\n const targetTexture = target as Texture;\r\n if (sourceTexture.uOffset !== undefined && targetTexture.uOffset !== undefined) {\r\n targetTexture.uOffset = sourceTexture.uOffset;\r\n targetTexture.vOffset = sourceTexture.vOffset;\r\n targetTexture.uScale = sourceTexture.uScale;\r\n targetTexture.vScale = sourceTexture.vScale;\r\n targetTexture.uAng = sourceTexture.uAng;\r\n targetTexture.vAng = sourceTexture.vAng;\r\n targetTexture.wAng = sourceTexture.wAng;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ParticleTextureSourceBlock\", ParticleTextureSourceBlock);\r\n"]}
|
|
@@ -12,6 +12,7 @@ import { NodeParticleSystemSources } from "./Enums/nodeParticleSystemSources.js"
|
|
|
12
12
|
* Class used to store node based geometry build state
|
|
13
13
|
*/
|
|
14
14
|
export declare class NodeParticleBuildState {
|
|
15
|
+
private _buildPromises;
|
|
15
16
|
/**
|
|
16
17
|
* Gets the capactity of the particle system to build
|
|
17
18
|
*/
|
|
@@ -50,6 +51,16 @@ export declare class NodeParticleBuildState {
|
|
|
50
51
|
* Emits errors if any
|
|
51
52
|
*/
|
|
52
53
|
emitErrors(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Registers an asynchronous operation that must complete before the node particle system is ready.
|
|
56
|
+
* @param promise defines the promise to wait for
|
|
57
|
+
*/
|
|
58
|
+
registerBuildPromise(promise: Promise<void>): void;
|
|
59
|
+
/**
|
|
60
|
+
* Waits for all asynchronous build operations to complete.
|
|
61
|
+
* @returns a promise that resolves when all registered build operations are complete
|
|
62
|
+
*/
|
|
63
|
+
waitForBuildPromisesAsync(): Promise<void>;
|
|
53
64
|
/**
|
|
54
65
|
* Adapt a value to a target type
|
|
55
66
|
* @param source defines the value to adapt
|
|
@@ -8,6 +8,7 @@ import { NodeParticleSystemSources } from "./Enums/nodeParticleSystemSources.js"
|
|
|
8
8
|
*/
|
|
9
9
|
export class NodeParticleBuildState {
|
|
10
10
|
constructor() {
|
|
11
|
+
this._buildPromises = new Array();
|
|
11
12
|
/** Gets or sets the list of non connected mandatory inputs */
|
|
12
13
|
this.notConnectedNonOptionalInputs = [];
|
|
13
14
|
/**
|
|
@@ -40,6 +41,20 @@ export class NodeParticleBuildState {
|
|
|
40
41
|
throw "Build of Node Particle System Set failed:\n" + errorMessage;
|
|
41
42
|
}
|
|
42
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Registers an asynchronous operation that must complete before the node particle system is ready.
|
|
46
|
+
* @param promise defines the promise to wait for
|
|
47
|
+
*/
|
|
48
|
+
registerBuildPromise(promise) {
|
|
49
|
+
this._buildPromises.push(promise);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Waits for all asynchronous build operations to complete.
|
|
53
|
+
* @returns a promise that resolves when all registered build operations are complete
|
|
54
|
+
*/
|
|
55
|
+
async waitForBuildPromisesAsync() {
|
|
56
|
+
await Promise.all(this._buildPromises);
|
|
57
|
+
}
|
|
43
58
|
/**
|
|
44
59
|
* Adapt a value to a target type
|
|
45
60
|
* @param source defines the value to adapt
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeParticleBuildState.js","sourceRoot":"","sources":["../../../../../dev/core/src/Particles/Node/nodeParticleBuildState.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type Particle } from \"core/Particles/particle\";\r\nimport { type ThinParticleSystem } from \"core/Particles/thinParticleSystem\";\r\nimport { type NodeParticleConnectionPoint } from \"core/Particles/Node/nodeParticleBlockConnectionPoint\";\r\n\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"core/Particles/Node/Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { NodeParticleContextualSources } from \"core/Particles/Node/Enums/nodeParticleContextualSources\";\r\nimport { NodeParticleSystemSources } from \"core/Particles/Node/Enums/nodeParticleSystemSources\";\r\n\r\n/**\r\n * Class used to store node based geometry build state\r\n */\r\nexport class NodeParticleBuildState {\r\n /**\r\n * Gets the capactity of the particle system to build\r\n */\r\n public capacity: number;\r\n\r\n /**\r\n * Gets the scene where the particle system is built\r\n */\r\n public scene: Scene;\r\n\r\n /** Gets or sets the build identifier */\r\n public buildId: number;\r\n\r\n /** Gets or sets the list of non connected mandatory inputs */\r\n public notConnectedNonOptionalInputs: NodeParticleConnectionPoint[] = [];\r\n\r\n /** Gets or sets a boolean indicating that verbose mode is on */\r\n public verbose: boolean;\r\n\r\n /**\r\n * Gets or sets the particle context for contextual data\r\n */\r\n public particleContext: Nullable<Particle> = null;\r\n\r\n /**\r\n * Gets or sets the system context for contextual data\r\n */\r\n public systemContext: Nullable<ThinParticleSystem> = null;\r\n\r\n /**\r\n * Gets or sets the index of the gradient to use\r\n */\r\n public gradientIndex: number = 0;\r\n /**\r\n * Gets or sets next gradient in line\r\n */\r\n public nextGradientIndex: number = 0;\r\n /**\r\n * Gets or sets the next gradient value\r\n */\r\n public nextGradientValue: any;\r\n\r\n /**\r\n * Emits errors if any\r\n */\r\n public emitErrors() {\r\n let errorMessage = \"\";\r\n\r\n for (const notConnectedInput of this.notConnectedNonOptionalInputs) {\r\n errorMessage += `input ${notConnectedInput.name} from block ${\r\n notConnectedInput.ownerBlock.name\r\n }[${notConnectedInput.ownerBlock.getClassName()}] is not connected and is not optional.\\n`;\r\n }\r\n\r\n if (errorMessage) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Build of Node Particle System Set failed:\\n\" + errorMessage;\r\n }\r\n }\r\n\r\n /**\r\n * Adapt a value to a target type\r\n * @param source defines the value to adapt\r\n * @param targetType defines the target type\r\n * @returns the adapted value\r\n */\r\n adapt(source: NodeParticleConnectionPoint, targetType: NodeParticleBlockConnectionPointTypes) {\r\n const value = source.getConnectedValue(this) || 0;\r\n\r\n if (source.type === targetType) {\r\n return value;\r\n }\r\n\r\n switch (targetType) {\r\n case NodeParticleBlockConnectionPointTypes.Vector2:\r\n return new Vector2(value, value);\r\n case NodeParticleBlockConnectionPointTypes.Vector3:\r\n return new Vector3(value, value, value);\r\n case NodeParticleBlockConnectionPointTypes.Color4:\r\n return new Color4(value, value, value, value);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the value associated with a contextual source\r\n * @param source Source of the contextual value\r\n * @returns the value associated with the source\r\n */\r\n public getContextualValue(source: NodeParticleContextualSources) {\r\n if (!this.particleContext || !this.systemContext) {\r\n return null;\r\n }\r\n\r\n switch (source) {\r\n case NodeParticleContextualSources.Position:\r\n return this.particleContext.position;\r\n case NodeParticleContextualSources.Direction:\r\n return this.particleContext.direction;\r\n case NodeParticleContextualSources.DirectionScale:\r\n return this.particleContext._properties.directionScale;\r\n case NodeParticleContextualSources.ScaledDirection:\r\n this.particleContext.direction.scaleToRef(this.particleContext._properties.directionScale, this.particleContext._properties.scaledDirection);\r\n return this.particleContext._properties.scaledDirection;\r\n case NodeParticleContextualSources.Color:\r\n return this.particleContext.color;\r\n case NodeParticleContextualSources.InitialColor:\r\n return this.particleContext.initialColor;\r\n case NodeParticleContextualSources.ColorDead:\r\n return this.particleContext.colorDead;\r\n case NodeParticleContextualSources.Age:\r\n return this.particleContext.age;\r\n case NodeParticleContextualSources.Lifetime:\r\n return this.particleContext.lifeTime;\r\n case NodeParticleContextualSources.Angle:\r\n return this.particleContext.angle;\r\n case NodeParticleContextualSources.Scale:\r\n return this.particleContext.scale;\r\n case NodeParticleContextualSources.Size:\r\n return this.particleContext.size;\r\n case NodeParticleContextualSources.AgeGradient:\r\n return this.particleContext.age / this.particleContext.lifeTime;\r\n case NodeParticleContextualSources.SpriteCellEnd:\r\n return this.systemContext.endSpriteCellID;\r\n case NodeParticleContextualSources.SpriteCellIndex:\r\n return this.particleContext.cellIndex;\r\n case NodeParticleContextualSources.SpriteCellStart:\r\n return this.systemContext.startSpriteCellID;\r\n case NodeParticleContextualSources.InitialDirection:\r\n return this.particleContext._properties.initialDirection;\r\n case NodeParticleContextualSources.ColorStep:\r\n return this.particleContext.colorStep;\r\n case NodeParticleContextualSources.ScaledColorStep:\r\n this.particleContext.colorStep.scaleToRef(this.systemContext._scaledUpdateSpeed, this.systemContext._scaledColorStep);\r\n return this.systemContext._scaledColorStep;\r\n case NodeParticleContextualSources.LocalPositionUpdated:\r\n this.particleContext.direction.scaleToRef(this.particleContext._properties.directionScale, this.particleContext._properties.scaledDirection);\r\n this.particleContext._properties.localPosition!.addInPlace(this.particleContext._properties.scaledDirection);\r\n Vector3.TransformCoordinatesToRef(this.particleContext._properties.localPosition!, this.systemContext._emitterWorldMatrix, this.particleContext.position);\r\n return this.particleContext.position;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the emitter world matrix\r\n */\r\n public get emitterWorldMatrix() {\r\n if (!this.systemContext) {\r\n return null;\r\n }\r\n return this.systemContext._emitterWorldMatrix;\r\n }\r\n\r\n /**\r\n * Gets the emitter inverse world matrix\r\n */\r\n public get emitterInverseWorldMatrix() {\r\n if (!this.systemContext) {\r\n return null;\r\n }\r\n return this.systemContext._emitterInverseWorldMatrix;\r\n }\r\n\r\n /**\r\n * Gets the emitter position\r\n */\r\n public get emitterPosition(): Nullable<Vector3> {\r\n if (!this.systemContext) {\r\n return null;\r\n }\r\n\r\n if (!this.systemContext.emitter) {\r\n return null;\r\n }\r\n\r\n if (this.systemContext.emitter instanceof Vector3) {\r\n return this.systemContext.emitter;\r\n }\r\n\r\n return (<AbstractMesh>this.systemContext.emitter).absolutePosition;\r\n }\r\n\r\n /**\r\n * Gets the value associated with a system source\r\n * @param source Source of the system value\r\n * @returns the value associated with the source\r\n */\r\n public getSystemValue(source: NodeParticleSystemSources) {\r\n if (!this.systemContext) {\r\n return null;\r\n }\r\n\r\n switch (source) {\r\n case NodeParticleSystemSources.Time:\r\n return this.systemContext._actualFrame;\r\n case NodeParticleSystemSources.Delta:\r\n return this.systemContext._scaledUpdateSpeed;\r\n case NodeParticleSystemSources.Emitter:\r\n return this.emitterPosition;\r\n case NodeParticleSystemSources.CameraPosition:\r\n return this.scene.activeCamera?.globalPosition || Vector3.Zero();\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"nodeParticleBuildState.js","sourceRoot":"","sources":["../../../../../dev/core/src/Particles/Node/nodeParticleBuildState.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type Particle } from \"core/Particles/particle\";\r\nimport { type ThinParticleSystem } from \"core/Particles/thinParticleSystem\";\r\nimport { type NodeParticleConnectionPoint } from \"core/Particles/Node/nodeParticleBlockConnectionPoint\";\r\n\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { NodeParticleBlockConnectionPointTypes } from \"core/Particles/Node/Enums/nodeParticleBlockConnectionPointTypes\";\r\nimport { NodeParticleContextualSources } from \"core/Particles/Node/Enums/nodeParticleContextualSources\";\r\nimport { NodeParticleSystemSources } from \"core/Particles/Node/Enums/nodeParticleSystemSources\";\r\n\r\n/**\r\n * Class used to store node based geometry build state\r\n */\r\nexport class NodeParticleBuildState {\r\n private _buildPromises = new Array<Promise<void>>();\r\n\r\n /**\r\n * Gets the capactity of the particle system to build\r\n */\r\n public capacity: number;\r\n\r\n /**\r\n * Gets the scene where the particle system is built\r\n */\r\n public scene: Scene;\r\n\r\n /** Gets or sets the build identifier */\r\n public buildId: number;\r\n\r\n /** Gets or sets the list of non connected mandatory inputs */\r\n public notConnectedNonOptionalInputs: NodeParticleConnectionPoint[] = [];\r\n\r\n /** Gets or sets a boolean indicating that verbose mode is on */\r\n public verbose: boolean;\r\n\r\n /**\r\n * Gets or sets the particle context for contextual data\r\n */\r\n public particleContext: Nullable<Particle> = null;\r\n\r\n /**\r\n * Gets or sets the system context for contextual data\r\n */\r\n public systemContext: Nullable<ThinParticleSystem> = null;\r\n\r\n /**\r\n * Gets or sets the index of the gradient to use\r\n */\r\n public gradientIndex: number = 0;\r\n /**\r\n * Gets or sets next gradient in line\r\n */\r\n public nextGradientIndex: number = 0;\r\n /**\r\n * Gets or sets the next gradient value\r\n */\r\n public nextGradientValue: any;\r\n\r\n /**\r\n * Emits errors if any\r\n */\r\n public emitErrors() {\r\n let errorMessage = \"\";\r\n\r\n for (const notConnectedInput of this.notConnectedNonOptionalInputs) {\r\n errorMessage += `input ${notConnectedInput.name} from block ${\r\n notConnectedInput.ownerBlock.name\r\n }[${notConnectedInput.ownerBlock.getClassName()}] is not connected and is not optional.\\n`;\r\n }\r\n\r\n if (errorMessage) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Build of Node Particle System Set failed:\\n\" + errorMessage;\r\n }\r\n }\r\n\r\n /**\r\n * Registers an asynchronous operation that must complete before the node particle system is ready.\r\n * @param promise defines the promise to wait for\r\n */\r\n public registerBuildPromise(promise: Promise<void>) {\r\n this._buildPromises.push(promise);\r\n }\r\n\r\n /**\r\n * Waits for all asynchronous build operations to complete.\r\n * @returns a promise that resolves when all registered build operations are complete\r\n */\r\n public async waitForBuildPromisesAsync(): Promise<void> {\r\n await Promise.all(this._buildPromises);\r\n }\r\n\r\n /**\r\n * Adapt a value to a target type\r\n * @param source defines the value to adapt\r\n * @param targetType defines the target type\r\n * @returns the adapted value\r\n */\r\n adapt(source: NodeParticleConnectionPoint, targetType: NodeParticleBlockConnectionPointTypes) {\r\n const value = source.getConnectedValue(this) || 0;\r\n\r\n if (source.type === targetType) {\r\n return value;\r\n }\r\n\r\n switch (targetType) {\r\n case NodeParticleBlockConnectionPointTypes.Vector2:\r\n return new Vector2(value, value);\r\n case NodeParticleBlockConnectionPointTypes.Vector3:\r\n return new Vector3(value, value, value);\r\n case NodeParticleBlockConnectionPointTypes.Color4:\r\n return new Color4(value, value, value, value);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the value associated with a contextual source\r\n * @param source Source of the contextual value\r\n * @returns the value associated with the source\r\n */\r\n public getContextualValue(source: NodeParticleContextualSources) {\r\n if (!this.particleContext || !this.systemContext) {\r\n return null;\r\n }\r\n\r\n switch (source) {\r\n case NodeParticleContextualSources.Position:\r\n return this.particleContext.position;\r\n case NodeParticleContextualSources.Direction:\r\n return this.particleContext.direction;\r\n case NodeParticleContextualSources.DirectionScale:\r\n return this.particleContext._properties.directionScale;\r\n case NodeParticleContextualSources.ScaledDirection:\r\n this.particleContext.direction.scaleToRef(this.particleContext._properties.directionScale, this.particleContext._properties.scaledDirection);\r\n return this.particleContext._properties.scaledDirection;\r\n case NodeParticleContextualSources.Color:\r\n return this.particleContext.color;\r\n case NodeParticleContextualSources.InitialColor:\r\n return this.particleContext.initialColor;\r\n case NodeParticleContextualSources.ColorDead:\r\n return this.particleContext.colorDead;\r\n case NodeParticleContextualSources.Age:\r\n return this.particleContext.age;\r\n case NodeParticleContextualSources.Lifetime:\r\n return this.particleContext.lifeTime;\r\n case NodeParticleContextualSources.Angle:\r\n return this.particleContext.angle;\r\n case NodeParticleContextualSources.Scale:\r\n return this.particleContext.scale;\r\n case NodeParticleContextualSources.Size:\r\n return this.particleContext.size;\r\n case NodeParticleContextualSources.AgeGradient:\r\n return this.particleContext.age / this.particleContext.lifeTime;\r\n case NodeParticleContextualSources.SpriteCellEnd:\r\n return this.systemContext.endSpriteCellID;\r\n case NodeParticleContextualSources.SpriteCellIndex:\r\n return this.particleContext.cellIndex;\r\n case NodeParticleContextualSources.SpriteCellStart:\r\n return this.systemContext.startSpriteCellID;\r\n case NodeParticleContextualSources.InitialDirection:\r\n return this.particleContext._properties.initialDirection;\r\n case NodeParticleContextualSources.ColorStep:\r\n return this.particleContext.colorStep;\r\n case NodeParticleContextualSources.ScaledColorStep:\r\n this.particleContext.colorStep.scaleToRef(this.systemContext._scaledUpdateSpeed, this.systemContext._scaledColorStep);\r\n return this.systemContext._scaledColorStep;\r\n case NodeParticleContextualSources.LocalPositionUpdated:\r\n this.particleContext.direction.scaleToRef(this.particleContext._properties.directionScale, this.particleContext._properties.scaledDirection);\r\n this.particleContext._properties.localPosition!.addInPlace(this.particleContext._properties.scaledDirection);\r\n Vector3.TransformCoordinatesToRef(this.particleContext._properties.localPosition!, this.systemContext._emitterWorldMatrix, this.particleContext.position);\r\n return this.particleContext.position;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the emitter world matrix\r\n */\r\n public get emitterWorldMatrix() {\r\n if (!this.systemContext) {\r\n return null;\r\n }\r\n return this.systemContext._emitterWorldMatrix;\r\n }\r\n\r\n /**\r\n * Gets the emitter inverse world matrix\r\n */\r\n public get emitterInverseWorldMatrix() {\r\n if (!this.systemContext) {\r\n return null;\r\n }\r\n return this.systemContext._emitterInverseWorldMatrix;\r\n }\r\n\r\n /**\r\n * Gets the emitter position\r\n */\r\n public get emitterPosition(): Nullable<Vector3> {\r\n if (!this.systemContext) {\r\n return null;\r\n }\r\n\r\n if (!this.systemContext.emitter) {\r\n return null;\r\n }\r\n\r\n if (this.systemContext.emitter instanceof Vector3) {\r\n return this.systemContext.emitter;\r\n }\r\n\r\n return (<AbstractMesh>this.systemContext.emitter).absolutePosition;\r\n }\r\n\r\n /**\r\n * Gets the value associated with a system source\r\n * @param source Source of the system value\r\n * @returns the value associated with the source\r\n */\r\n public getSystemValue(source: NodeParticleSystemSources) {\r\n if (!this.systemContext) {\r\n return null;\r\n }\r\n\r\n switch (source) {\r\n case NodeParticleSystemSources.Time:\r\n return this.systemContext._actualFrame;\r\n case NodeParticleSystemSources.Delta:\r\n return this.systemContext._scaledUpdateSpeed;\r\n case NodeParticleSystemSources.Emitter:\r\n return this.emitterPosition;\r\n case NodeParticleSystemSources.CameraPosition:\r\n return this.scene.activeCamera?.globalPosition || Vector3.Zero();\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n"]}
|
|
@@ -187,28 +187,29 @@ export class NodeParticleSystemSet {
|
|
|
187
187
|
* @returns a promise that resolves to the built particle system set
|
|
188
188
|
*/
|
|
189
189
|
async buildAsync(scene, verbose = false) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
190
|
+
const output = new ParticleSystemSet();
|
|
191
|
+
// Initialize all blocks
|
|
192
|
+
for (const block of this._systemBlocks) {
|
|
193
|
+
this._initializeBlock(block);
|
|
194
|
+
}
|
|
195
|
+
// Build the blocks
|
|
196
|
+
const buildPromises = new Array();
|
|
197
|
+
for (const block of this.systemBlocks) {
|
|
198
|
+
const state = new NodeParticleBuildState();
|
|
199
|
+
state.buildId = this._buildId++;
|
|
200
|
+
state.scene = scene;
|
|
201
|
+
state.verbose = verbose;
|
|
202
|
+
const system = block.createSystem(state);
|
|
203
|
+
system._source = this;
|
|
204
|
+
system._blockReference = block._internalId;
|
|
205
|
+
// Errors
|
|
206
|
+
state.emitErrors();
|
|
207
|
+
buildPromises.push(state.waitForBuildPromisesAsync());
|
|
208
|
+
output.systems.push(system);
|
|
209
|
+
}
|
|
210
|
+
await Promise.all(buildPromises);
|
|
211
|
+
this.onBuildObservable.notifyObservers(this);
|
|
212
|
+
return output;
|
|
212
213
|
}
|
|
213
214
|
/**
|
|
214
215
|
* Clear the current node particle set
|