@onerjs/core 8.55.9 → 8.56.2
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/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
- package/AudioV2/webAudio/webAudioEngine.js +6 -5
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/Cameras/arcRotateCamera.pure.js +24 -0
- package/Cameras/arcRotateCamera.pure.js.map +1 -1
- package/Culling/Helper/boundingInfoHelper.js +8 -4
- package/Culling/Helper/boundingInfoHelper.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.d.ts +5 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.js +7 -3
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.d.ts +6 -0
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js +16 -0
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js.map +1 -0
- package/Engines/AbstractEngine/pure.d.ts +1 -0
- package/Engines/AbstractEngine/pure.js +1 -0
- package/Engines/AbstractEngine/pure.js.map +1 -1
- package/Engines/IDrawContext.d.ts +2 -0
- package/Engines/IDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.d.ts +8 -0
- package/Engines/WebGPU/webgpuDrawContext.js +15 -0
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/abstractEngine.pure.js +2 -2
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +5 -0
- package/Engines/constants.js +5 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +11 -3
- package/Engines/webgpuEngine.d.ts +1 -0
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +10 -0
- package/Engines/webgpuEngine.pure.js +15 -1
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +4 -0
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +12 -0
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
- package/FrameGraph/Node/Blocks/inputBlock.pure.js +2 -1
- package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +2 -0
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +2 -0
- package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +21 -0
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +45 -0
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +2 -5
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.d.ts +1 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +18 -3
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js +2 -0
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +5 -21
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +1 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/powBlock.pure.js +2 -1
- package/Materials/Node/Blocks/powBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.pure.js +14 -12
- package/Materials/Node/Blocks/triPlanarBlock.pure.js.map +1 -1
- package/Materials/Node/nodeMaterial.pure.d.ts +11 -0
- package/Materials/Node/nodeMaterial.pure.js +11 -0
- package/Materials/Node/nodeMaterial.pure.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.d.ts +4 -3
- package/Materials/Node/nodeMaterialBuildState.js +7 -1
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.pure.d.ts +4 -0
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +4 -0
- package/Materials/Textures/index.d.ts +1 -0
- package/Materials/Textures/index.js +1 -0
- package/Materials/Textures/index.js.map +1 -1
- package/Materials/Textures/textureProcessor.d.ts +29 -6
- package/Materials/Textures/textureProcessor.js +22 -16
- package/Materials/Textures/textureProcessor.js.map +1 -1
- package/Materials/drawWrapper.js +3 -0
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/imageProcessingConfiguration.defines.d.ts +3 -0
- package/Materials/imageProcessingConfiguration.defines.js +2 -0
- package/Materials/imageProcessingConfiguration.defines.js.map +1 -1
- package/Materials/imageProcessingConfiguration.functions.js +3 -0
- package/Materials/imageProcessingConfiguration.functions.js.map +1 -1
- package/Materials/imageProcessingConfiguration.pure.d.ts +58 -0
- package/Materials/imageProcessingConfiguration.pure.js +123 -2
- package/Materials/imageProcessingConfiguration.pure.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.d.ts +19 -0
- package/Materials/materialHelper.geometryrendering.js +29 -1
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Materials/prepass.defines.d.ts +3 -0
- package/Materials/prepass.defines.js +3 -0
- package/Materials/prepass.defines.js.map +1 -1
- package/Materials/standardMaterial.pure.d.ts +4 -0
- package/Materials/uniformBuffer.d.ts +29 -0
- package/Materials/uniformBuffer.js +146 -0
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/colorTemperature.functions.d.ts +29 -0
- package/Maths/colorTemperature.functions.js +196 -0
- package/Maths/colorTemperature.functions.js.map +1 -0
- package/Maths/index.d.ts +1 -0
- package/Maths/index.js +1 -0
- package/Maths/index.js.map +1 -1
- package/Maths/math.vector.pure.d.ts +1 -5
- package/Maths/math.vector.pure.js.map +1 -1
- package/Maths/pure.d.ts +1 -0
- package/Maths/pure.js +1 -0
- package/Maths/pure.js.map +1 -1
- package/Misc/filesInput.d.ts +15 -0
- package/Misc/filesInput.js +156 -74
- package/Misc/filesInput.js.map +1 -1
- package/Misc/observable.pure.js +1 -3
- package/Misc/observable.pure.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.d.ts +41 -1
- package/PostProcesses/imageProcessingPostProcess.js +41 -1
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/thinImageProcessingPostProcess.d.ts +50 -0
- package/PostProcesses/thinImageProcessingPostProcess.js +65 -0
- package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.d.ts +12 -0
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js +22 -0
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.d.ts +1 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js +39 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +2 -4
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
- package/Rendering/IBLShadows/pure.d.ts +1 -0
- package/Rendering/IBLShadows/pure.js +1 -0
- package/Rendering/IBLShadows/pure.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +11 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js +36 -14
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +5 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +16 -3
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +5 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +12 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/geometryBufferRenderer.pure.d.ts +30 -0
- package/Rendering/geometryBufferRenderer.pure.js +84 -0
- package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
- package/Rendering/iblCdfGenerator.js +10 -1
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +2 -2
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/imageProcessingDeclaration.js +3 -0
- package/Shaders/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/imageProcessingFunctions.js +3 -0
- package/Shaders/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/objectIdFunctions.d.ts +5 -0
- package/Shaders/ShadersInclude/objectIdFunctions.js +22 -0
- package/Shaders/ShadersInclude/objectIdFunctions.js.map +1 -0
- package/Shaders/ShadersInclude/openpbrBlockPrePass.js +3 -0
- package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +34 -4
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -2
- package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockPrePass.js +3 -0
- package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/prePassDeclaration.d.ts +1 -0
- package/Shaders/ShadersInclude/prePassDeclaration.js +5 -0
- package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/Shaders/default.fragment.js +5 -1
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleDiffuse.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/Shaders/geometry.fragment.js +9 -1
- package/Shaders/geometry.fragment.js.map +1 -1
- package/Shaders/openpbr.fragment.js +2 -1
- package/Shaders/openpbr.fragment.js.map +1 -1
- package/Shaders/pbr.fragment.js +2 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js +3 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +3 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/objectIdFunctions.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/objectIdFunctions.js +22 -0
- package/ShadersWGSL/ShadersInclude/objectIdFunctions.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +3 -0
- package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +35 -5
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +8 -2
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +3 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.d.ts +1 -0
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +5 -0
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +5 -1
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +16 -4
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +15 -3
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -3
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/ShadersWGSL/geometry.fragment.js +9 -1
- package/ShadersWGSL/geometry.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.fragment.js +2 -1
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +2 -1
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/XR/features/Layers/WebXRCompositionLayer.d.ts +52 -0
- package/XR/features/Layers/WebXRCompositionLayer.js +80 -0
- package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.pure.js +2 -1
- package/XR/features/WebXRControllerPointerSelection.pure.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.pure.js +2 -1
- package/XR/features/WebXRControllerTeleportation.pure.js.map +1 -1
- package/XR/features/WebXRDepthSensing.pure.d.ts +21 -0
- package/XR/features/WebXRDepthSensing.pure.js +42 -0
- package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
- package/XR/features/WebXRHandTracking.pure.js +2 -0
- package/XR/features/WebXRHandTracking.pure.js.map +1 -1
- package/XR/features/WebXRLayers.pure.d.ts +12 -0
- package/XR/features/WebXRLayers.pure.js +31 -1
- package/XR/features/WebXRLayers.pure.js.map +1 -1
- package/XR/features/WebXRTrackedSources.d.ts +5 -0
- package/XR/features/WebXRTrackedSources.js +8 -0
- package/XR/features/WebXRTrackedSources.js.map +1 -0
- package/XR/features/WebXRTrackedSources.pure.d.ts +70 -0
- package/XR/features/WebXRTrackedSources.pure.js +153 -0
- package/XR/features/WebXRTrackedSources.pure.js.map +1 -0
- package/XR/features/index.d.ts +1 -0
- package/XR/features/index.js +1 -0
- package/XR/features/index.js.map +1 -1
- package/XR/features/pure.d.ts +1 -0
- package/XR/features/pure.js +1 -0
- package/XR/features/pure.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.d.ts +53 -1
- package/XR/motionController/webXRAbstractMotionController.js +61 -0
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/webXRDefaultExperience.js +8 -4
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +86 -44
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.d.ts +9 -0
- package/XR/webXRFeaturesManager.js +4 -0
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRGraphicsBinding.d.ts +29 -0
- package/XR/webXRGraphicsBinding.js +40 -0
- package/XR/webXRGraphicsBinding.js.map +1 -1
- package/XR/webXRInputSource.js +1 -1
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRLayerWrapper.d.ts +7 -5
- package/XR/webXRLayerWrapper.js +10 -7
- package/XR/webXRLayerWrapper.js.map +1 -1
- package/XR/webXRSessionManager.d.ts +45 -0
- package/XR/webXRSessionManager.js +174 -29
- package/XR/webXRSessionManager.js.map +1 -1
- package/package.json +1 -1
|
@@ -59,6 +59,7 @@ export class FluidRenderingObject {
|
|
|
59
59
|
* @param shaderLanguage The shader language to use
|
|
60
60
|
*/
|
|
61
61
|
constructor(scene, shaderLanguage) {
|
|
62
|
+
this._usesPerParticleSizeAttribute = false;
|
|
62
63
|
/** Defines the priority of the object. Objects will be rendered in ascending order of priority */
|
|
63
64
|
this.priority = 0;
|
|
64
65
|
this._particleSize = 0.1;
|
|
@@ -76,27 +77,39 @@ export class FluidRenderingObject {
|
|
|
76
77
|
this._thicknessEffectWrapper = null;
|
|
77
78
|
this._shaderLanguage = shaderLanguage ?? (this._engine.isWebGPU ? 1 /* ShaderLanguage.WGSL */ : 0 /* ShaderLanguage.GLSL */);
|
|
78
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Override to return false if this object's buffers have an incompatible "size" layout.
|
|
82
|
+
* @returns true if the per-particle size attribute is supported
|
|
83
|
+
*/
|
|
84
|
+
_supportsPerParticleSizeAttribute() {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
79
87
|
_createEffects() {
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
88
|
+
// "size" is a uniform, or a per-particle attribute when UsePerParticleSizeAttribute is set (and supported).
|
|
89
|
+
const perParticleSize = FluidRenderingObject.UsePerParticleSizeAttribute && this._supportsPerParticleSizeAttribute();
|
|
90
|
+
this._usesPerParticleSizeAttribute = perParticleSize;
|
|
91
|
+
const baseAttributeNames = perParticleSize ? ["position", "offset", "size"] : ["position", "offset"];
|
|
92
|
+
const baseUniformNames = perParticleSize ? ["view", "projection", "particleRadius"] : ["view", "projection", "particleRadius", "size"];
|
|
93
|
+
const defines = perParticleSize ? ["#define FLUIDRENDERING_PER_PARTICLE_SIZE"] : [];
|
|
83
94
|
this._effectsAreDirty = false;
|
|
95
|
+
const depthAttributeNames = baseAttributeNames.slice();
|
|
96
|
+
const depthDefines = defines.slice();
|
|
84
97
|
if (this.useVelocity) {
|
|
85
|
-
|
|
86
|
-
|
|
98
|
+
depthAttributeNames.push("velocity");
|
|
99
|
+
depthDefines.push("#define FLUIDRENDERING_VELOCITY");
|
|
87
100
|
}
|
|
88
101
|
if (this._scene.useRightHandedSystem) {
|
|
89
|
-
|
|
102
|
+
depthDefines.push("#define FLUIDRENDERING_RHS");
|
|
90
103
|
}
|
|
91
104
|
this._depthEffectWrapper = new EffectWrapper({
|
|
92
105
|
engine: this._engine,
|
|
93
106
|
useShaderStore: true,
|
|
94
107
|
vertexShader: "fluidRenderingParticleDepth",
|
|
95
108
|
fragmentShader: "fluidRenderingParticleDepth",
|
|
96
|
-
attributeNames,
|
|
97
|
-
uniformNames,
|
|
109
|
+
attributeNames: depthAttributeNames,
|
|
110
|
+
uniformNames: baseUniformNames.slice(),
|
|
98
111
|
samplerNames: [],
|
|
99
|
-
defines,
|
|
112
|
+
defines: depthDefines,
|
|
100
113
|
shaderLanguage: this._shaderLanguage,
|
|
101
114
|
extraInitializationsAsync: async () => {
|
|
102
115
|
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
@@ -107,15 +120,15 @@ export class FluidRenderingObject {
|
|
|
107
120
|
}
|
|
108
121
|
},
|
|
109
122
|
});
|
|
110
|
-
uniformNames.push("particleAlpha");
|
|
111
123
|
this._thicknessEffectWrapper = new EffectWrapper({
|
|
112
124
|
engine: this._engine,
|
|
113
125
|
useShaderStore: true,
|
|
114
126
|
vertexShader: "fluidRenderingParticleThickness",
|
|
115
127
|
fragmentShader: "fluidRenderingParticleThickness",
|
|
116
|
-
attributeNames:
|
|
117
|
-
uniformNames,
|
|
128
|
+
attributeNames: baseAttributeNames.slice(),
|
|
129
|
+
uniformNames: [...baseUniformNames, "particleAlpha"],
|
|
118
130
|
samplerNames: [],
|
|
131
|
+
defines: defines.slice(),
|
|
119
132
|
shaderLanguage: this._shaderLanguage,
|
|
120
133
|
extraInitializationsAsync: async () => {
|
|
121
134
|
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
@@ -156,7 +169,9 @@ export class FluidRenderingObject {
|
|
|
156
169
|
this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, depthEffect);
|
|
157
170
|
depthEffect.setMatrix("view", this._scene.getViewMatrix());
|
|
158
171
|
depthEffect.setMatrix("projection", this._scene.getProjectionMatrix());
|
|
159
|
-
|
|
172
|
+
if (!this._usesPerParticleSizeAttribute) {
|
|
173
|
+
depthEffect.setFloat2("size", this._particleSize, this._particleSize);
|
|
174
|
+
}
|
|
160
175
|
depthEffect.setFloat("particleRadius", this._particleSize / 2);
|
|
161
176
|
if (this.useInstancing) {
|
|
162
177
|
this._engine.drawArraysType(7, 0, 4, numParticles);
|
|
@@ -182,7 +197,9 @@ export class FluidRenderingObject {
|
|
|
182
197
|
thicknessEffect.setMatrix("view", this._scene.getViewMatrix());
|
|
183
198
|
thicknessEffect.setMatrix("projection", this._scene.getProjectionMatrix());
|
|
184
199
|
thicknessEffect.setFloat("particleAlpha", this.particleThicknessAlpha);
|
|
185
|
-
|
|
200
|
+
if (!this._usesPerParticleSizeAttribute) {
|
|
201
|
+
thicknessEffect.setFloat2("size", this._particleSize, this._particleSize);
|
|
202
|
+
}
|
|
186
203
|
if (this.useInstancing) {
|
|
187
204
|
this._engine.drawArraysType(7, 0, 4, numParticles);
|
|
188
205
|
}
|
|
@@ -207,4 +224,9 @@ export class FluidRenderingObject {
|
|
|
207
224
|
this.onParticleSizeChanged.clear();
|
|
208
225
|
}
|
|
209
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Uses each particle's own "size" vertex attribute instead
|
|
229
|
+
* of a single uniform size for all particles (default: false, opt-in).
|
|
230
|
+
*/
|
|
231
|
+
FluidRenderingObject.UsePerParticleSizeAttribute = false;
|
|
210
232
|
//# sourceMappingURL=fluidRenderingObject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingObject.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObject.ts"],"names":[],"mappings":"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","sourcesContent":["import { type VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer.pure\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines the base object used for fluid rendering.\r\n * It is based on a list of vertices (particles)\r\n */\r\nexport abstract class FluidRenderingObject {\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n protected _effectsAreDirty: boolean;\r\n protected _depthEffectWrapper: Nullable<EffectWrapper>;\r\n protected _thicknessEffectWrapper: Nullable<EffectWrapper>;\r\n\r\n /** Defines the priority of the object. Objects will be rendered in ascending order of priority */\r\n public priority = 0;\r\n\r\n protected _particleSize = 0.1;\r\n\r\n /** Observable triggered when the size of the particle is changed */\r\n public onParticleSizeChanged = new Observable<FluidRenderingObject>();\r\n\r\n /** Gets or sets the size of the particle */\r\n public get particleSize() {\r\n return this._particleSize;\r\n }\r\n\r\n public set particleSize(size: number) {\r\n if (size === this._particleSize) {\r\n return;\r\n }\r\n\r\n this._particleSize = size;\r\n this.onParticleSizeChanged.notifyObservers(this);\r\n }\r\n\r\n /** Defines the alpha value of a particle */\r\n public particleThicknessAlpha = 0.05;\r\n\r\n /** Indicates if the object uses instancing or not */\r\n public get useInstancing() {\r\n return !this.indexBuffer;\r\n }\r\n\r\n private _useVelocity = false;\r\n\r\n /** Indicates if velocity of particles should be used when rendering the object. The vertex buffer set must contain a \"velocity\" buffer for this to work! */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use || !this._hasVelocity()) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._effectsAreDirty = true;\r\n }\r\n\r\n private _hasVelocity() {\r\n return !!this.vertexBuffers?.velocity;\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public abstract get vertexBuffers(): { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return null;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public getClassName(): string {\r\n return \"FluidRenderingObject\";\r\n }\r\n\r\n /** Shader language used by the object */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this object\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a fluid rendering object\r\n * @param scene The scene the object is part of\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, shaderLanguage?: ShaderLanguage) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._effectsAreDirty = true;\r\n this._depthEffectWrapper = null;\r\n this._thicknessEffectWrapper = null;\r\n this._shaderLanguage = shaderLanguage ?? (this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL);\r\n }\r\n\r\n protected _createEffects(): void {\r\n const uniformNames = [\"view\", \"projection\", \"particleRadius\", \"size\"];\r\n const attributeNames = [\"position\", \"offset\"];\r\n const defines: string[] = [];\r\n\r\n this._effectsAreDirty = false;\r\n\r\n if (this.useVelocity) {\r\n attributeNames.push(\"velocity\");\r\n defines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n defines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n this._depthEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDepth\",\r\n fragmentShader: \"fluidRenderingParticleDepth\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n defines,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleDepth.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleDepth.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleDepth.vertex\"), import(\"../../Shaders/fluidRenderingParticleDepth.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n uniformNames.push(\"particleAlpha\");\r\n\r\n this._thicknessEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleThickness\",\r\n fragmentShader: \"fluidRenderingParticleThickness\",\r\n attributeNames: [\"position\", \"offset\"],\r\n uniformNames,\r\n samplerNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleThickness.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleThickness.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleThickness.vertex\"), import(\"../../Shaders/fluidRenderingParticleThickness.fragment\")]);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public isReady(): boolean {\r\n if (this._effectsAreDirty) {\r\n this._createEffects();\r\n }\r\n\r\n if (!this._depthEffectWrapper || !this._thicknessEffectWrapper) {\r\n return false;\r\n }\r\n\r\n const depthEffect = this._depthEffectWrapper.drawWrapper.effect!;\r\n const thicknessEffect = this._thicknessEffectWrapper.drawWrapper.effect!;\r\n\r\n return depthEffect.isReady() && thicknessEffect.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles (vertices) of this object\r\n * @returns The number of particles\r\n */\r\n public abstract get numParticles(): number;\r\n\r\n /**\r\n * Render the depth texture for this object\r\n */\r\n public renderDepthTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._depthEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const depthDrawWrapper = this._depthEffectWrapper.drawWrapper;\r\n const depthEffect = depthDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(depthDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, depthEffect);\r\n\r\n depthEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n depthEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n depthEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n depthEffect.setFloat(\"particleRadius\", this._particleSize / 2);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Render the thickness texture for this object\r\n */\r\n public renderThicknessTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._thicknessEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const thicknessDrawWrapper = this._thicknessEffectWrapper.drawWrapper;\r\n const thicknessEffect = thicknessDrawWrapper.effect!;\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE);\r\n this._engine.setDepthWrite(false);\r\n\r\n this._engine.enableEffect(thicknessDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, thicknessEffect);\r\n\r\n thicknessEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n thicknessEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n thicknessEffect.setFloat(\"particleAlpha\", this.particleThicknessAlpha);\r\n thicknessEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public renderDiffuseTexture(): void {\r\n // do nothing by default\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public dispose(): void {\r\n this._depthEffectWrapper?.dispose(false);\r\n this._thicknessEffectWrapper?.dispose(false);\r\n this.onParticleSizeChanged.clear();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"fluidRenderingObject.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObject.ts"],"names":[],"mappings":"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","sourcesContent":["import { type VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer.pure\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines the base object used for fluid rendering.\r\n * It is based on a list of vertices (particles)\r\n */\r\nexport abstract class FluidRenderingObject {\r\n /**\r\n * Uses each particle's own \"size\" vertex attribute instead\r\n * of a single uniform size for all particles (default: false, opt-in).\r\n */\r\n public static UsePerParticleSizeAttribute = false;\r\n protected _usesPerParticleSizeAttribute = false;\r\n\r\n protected _scene: Scene;\r\n protected _engine: AbstractEngine;\r\n protected _effectsAreDirty: boolean;\r\n protected _depthEffectWrapper: Nullable<EffectWrapper>;\r\n protected _thicknessEffectWrapper: Nullable<EffectWrapper>;\r\n\r\n /** Defines the priority of the object. Objects will be rendered in ascending order of priority */\r\n public priority = 0;\r\n\r\n protected _particleSize = 0.1;\r\n\r\n /** Observable triggered when the size of the particle is changed */\r\n public onParticleSizeChanged = new Observable<FluidRenderingObject>();\r\n\r\n /** Gets or sets the size of the particle */\r\n public get particleSize() {\r\n return this._particleSize;\r\n }\r\n\r\n public set particleSize(size: number) {\r\n if (size === this._particleSize) {\r\n return;\r\n }\r\n\r\n this._particleSize = size;\r\n this.onParticleSizeChanged.notifyObservers(this);\r\n }\r\n\r\n /** Defines the alpha value of a particle */\r\n public particleThicknessAlpha = 0.05;\r\n\r\n /** Indicates if the object uses instancing or not */\r\n public get useInstancing() {\r\n return !this.indexBuffer;\r\n }\r\n\r\n private _useVelocity = false;\r\n\r\n /** Indicates if velocity of particles should be used when rendering the object. The vertex buffer set must contain a \"velocity\" buffer for this to work! */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use || !this._hasVelocity()) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._effectsAreDirty = true;\r\n }\r\n\r\n private _hasVelocity() {\r\n return !!this.vertexBuffers?.velocity;\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public abstract get vertexBuffers(): { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public get indexBuffer(): Nullable<DataBuffer> {\r\n return null;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public getClassName(): string {\r\n return \"FluidRenderingObject\";\r\n }\r\n\r\n /** Shader language used by the object */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this object\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a fluid rendering object\r\n * @param scene The scene the object is part of\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, shaderLanguage?: ShaderLanguage) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._effectsAreDirty = true;\r\n this._depthEffectWrapper = null;\r\n this._thicknessEffectWrapper = null;\r\n this._shaderLanguage = shaderLanguage ?? (this._engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL);\r\n }\r\n\r\n /**\r\n * Override to return false if this object's buffers have an incompatible \"size\" layout.\r\n * @returns true if the per-particle size attribute is supported\r\n */\r\n protected _supportsPerParticleSizeAttribute(): boolean {\r\n return true;\r\n }\r\n\r\n protected _createEffects(): void {\r\n // \"size\" is a uniform, or a per-particle attribute when UsePerParticleSizeAttribute is set (and supported).\r\n const perParticleSize = FluidRenderingObject.UsePerParticleSizeAttribute && this._supportsPerParticleSizeAttribute();\r\n this._usesPerParticleSizeAttribute = perParticleSize;\r\n\r\n const baseAttributeNames = perParticleSize ? [\"position\", \"offset\", \"size\"] : [\"position\", \"offset\"];\r\n const baseUniformNames = perParticleSize ? [\"view\", \"projection\", \"particleRadius\"] : [\"view\", \"projection\", \"particleRadius\", \"size\"];\r\n const defines: string[] = perParticleSize ? [\"#define FLUIDRENDERING_PER_PARTICLE_SIZE\"] : [];\r\n\r\n this._effectsAreDirty = false;\r\n\r\n const depthAttributeNames = baseAttributeNames.slice();\r\n const depthDefines = defines.slice();\r\n\r\n if (this.useVelocity) {\r\n depthAttributeNames.push(\"velocity\");\r\n depthDefines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n depthDefines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n this._depthEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDepth\",\r\n fragmentShader: \"fluidRenderingParticleDepth\",\r\n attributeNames: depthAttributeNames,\r\n uniformNames: baseUniformNames.slice(),\r\n samplerNames: [],\r\n defines: depthDefines,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleDepth.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleDepth.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleDepth.vertex\"), import(\"../../Shaders/fluidRenderingParticleDepth.fragment\")]);\r\n }\r\n },\r\n });\r\n\r\n this._thicknessEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleThickness\",\r\n fragmentShader: \"fluidRenderingParticleThickness\",\r\n attributeNames: baseAttributeNames.slice(),\r\n uniformNames: [...baseUniformNames, \"particleAlpha\"],\r\n samplerNames: [],\r\n defines: defines.slice(),\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/fluidRenderingParticleThickness.vertex\"), import(\"../../ShadersWGSL/fluidRenderingParticleThickness.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/fluidRenderingParticleThickness.vertex\"), import(\"../../Shaders/fluidRenderingParticleThickness.fragment\")]);\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public isReady(): boolean {\r\n if (this._effectsAreDirty) {\r\n this._createEffects();\r\n }\r\n\r\n if (!this._depthEffectWrapper || !this._thicknessEffectWrapper) {\r\n return false;\r\n }\r\n\r\n const depthEffect = this._depthEffectWrapper.drawWrapper.effect!;\r\n const thicknessEffect = this._thicknessEffectWrapper.drawWrapper.effect!;\r\n\r\n return depthEffect.isReady() && thicknessEffect.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles (vertices) of this object\r\n * @returns The number of particles\r\n */\r\n public abstract get numParticles(): number;\r\n\r\n /**\r\n * Render the depth texture for this object\r\n */\r\n public renderDepthTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._depthEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const depthDrawWrapper = this._depthEffectWrapper.drawWrapper;\r\n const depthEffect = depthDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(depthDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, depthEffect);\r\n\r\n depthEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n depthEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n if (!this._usesPerParticleSizeAttribute) {\r\n depthEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n depthEffect.setFloat(\"particleRadius\", this._particleSize / 2);\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Render the thickness texture for this object\r\n */\r\n public renderThicknessTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._thicknessEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const thicknessDrawWrapper = this._thicknessEffectWrapper.drawWrapper;\r\n const thicknessEffect = thicknessDrawWrapper.effect!;\r\n\r\n this._engine.setAlphaMode(Constants.ALPHA_ONEONE);\r\n this._engine.setDepthWrite(false);\r\n\r\n this._engine.enableEffect(thicknessDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, thicknessEffect);\r\n\r\n thicknessEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n thicknessEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n thicknessEffect.setFloat(\"particleAlpha\", this.particleThicknessAlpha);\r\n if (!this._usesPerParticleSizeAttribute) {\r\n thicknessEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public renderDiffuseTexture(): void {\r\n // do nothing by default\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public dispose(): void {\r\n this._depthEffectWrapper?.dispose(false);\r\n this._thicknessEffectWrapper?.dispose(false);\r\n this.onParticleSizeChanged.clear();\r\n }\r\n}\r\n"]}
|
|
@@ -38,6 +38,11 @@ export declare class FluidRenderingObjectCustomParticles extends FluidRenderingO
|
|
|
38
38
|
addBuffers(buffers: {
|
|
39
39
|
[key: string]: FloatArray;
|
|
40
40
|
}): void;
|
|
41
|
+
/**
|
|
42
|
+
* Per-particle sizing needs an actual "size" buffer; custom buffers are optional.
|
|
43
|
+
* @returns true if a "size" buffer was supplied
|
|
44
|
+
*/
|
|
45
|
+
protected _supportsPerParticleSizeAttribute(): boolean;
|
|
41
46
|
protected _createEffects(): void;
|
|
42
47
|
/**
|
|
43
48
|
* Indicates if the object is ready to be rendered
|
|
@@ -45,6 +45,10 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
|
|
|
45
45
|
case "velocity":
|
|
46
46
|
stride = 3;
|
|
47
47
|
break;
|
|
48
|
+
case "size":
|
|
49
|
+
stride = 2;
|
|
50
|
+
this._effectsAreDirty = true;
|
|
51
|
+
break;
|
|
48
52
|
case "offset":
|
|
49
53
|
instanced = false;
|
|
50
54
|
break;
|
|
@@ -52,10 +56,18 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
|
|
|
52
56
|
this._vertexBuffers[name] = new VertexBuffer(this._engine, buffers[name], name, true, false, stride, instanced);
|
|
53
57
|
}
|
|
54
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Per-particle sizing needs an actual "size" buffer; custom buffers are optional.
|
|
61
|
+
* @returns true if a "size" buffer was supplied
|
|
62
|
+
*/
|
|
63
|
+
_supportsPerParticleSizeAttribute() {
|
|
64
|
+
return !!this._vertexBuffers["size"];
|
|
65
|
+
}
|
|
55
66
|
_createEffects() {
|
|
56
67
|
super._createEffects();
|
|
57
|
-
const uniformNames = ["view", "projection", "size"];
|
|
58
|
-
const attributeNames = ["position", "offset", "color"];
|
|
68
|
+
const uniformNames = this._usesPerParticleSizeAttribute ? ["view", "projection"] : ["view", "projection", "size"];
|
|
69
|
+
const attributeNames = this._usesPerParticleSizeAttribute ? ["position", "offset", "color", "size"] : ["position", "offset", "color"];
|
|
70
|
+
const defines = this._usesPerParticleSizeAttribute ? ["#define FLUIDRENDERING_PER_PARTICLE_SIZE"] : [];
|
|
59
71
|
this._diffuseEffectWrapper = new EffectWrapper({
|
|
60
72
|
engine: this._engine,
|
|
61
73
|
useShaderStore: true,
|
|
@@ -64,6 +76,7 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
|
|
|
64
76
|
attributeNames,
|
|
65
77
|
uniformNames,
|
|
66
78
|
samplerNames: [],
|
|
79
|
+
defines,
|
|
67
80
|
shaderLanguage: this._shaderLanguage,
|
|
68
81
|
extraInitializationsAsync: async () => {
|
|
69
82
|
if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
|
|
@@ -113,7 +126,7 @@ export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
|
|
|
113
126
|
this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, diffuseEffect);
|
|
114
127
|
diffuseEffect.setMatrix("view", this._scene.getViewMatrix());
|
|
115
128
|
diffuseEffect.setMatrix("projection", this._scene.getProjectionMatrix());
|
|
116
|
-
if (this.
|
|
129
|
+
if (!this._usesPerParticleSizeAttribute) {
|
|
117
130
|
diffuseEffect.setFloat2("size", this._particleSize, this._particleSize);
|
|
118
131
|
}
|
|
119
132
|
if (this.useInstancing) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingObjectCustomParticles.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"core/Buffers/buffer.pure\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer.pure\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type FloatArray, type Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a list of custom buffers\r\n * The list must contain at least a \"position\" buffer!\r\n */\r\nexport class FluidRenderingObjectCustomParticles extends FluidRenderingObject {\r\n private _numParticles: number;\r\n private _diffuseEffectWrapper: Nullable<EffectWrapper>;\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectCustomParticles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particles should be rendered into\r\n * @param buffers The list of buffers (must contain at least one \"position\" buffer!). Note that you don't have to pass all (or any!) buffers at once in the constructor, you can use the addBuffers method to add more later.\r\n * @param numParticles Number of vertices to take into account from the buffers\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, buffers: { [key: string]: FloatArray }, numParticles: number, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._numParticles = numParticles;\r\n this._diffuseEffectWrapper = null;\r\n this._vertexBuffers = {};\r\n\r\n this.addBuffers(buffers);\r\n }\r\n\r\n /**\r\n * Add some new buffers\r\n * @param buffers List of buffers\r\n */\r\n public addBuffers(buffers: { [key: string]: FloatArray }) {\r\n for (const name in buffers) {\r\n let stride: number | undefined;\r\n let instanced = true;\r\n\r\n switch (name) {\r\n case \"velocity\":\r\n stride = 3;\r\n break;\r\n case \"offset\":\r\n instanced = false;\r\n break;\r\n }\r\n\r\n this._vertexBuffers[name] = new VertexBuffer(this._engine, buffers[name], name, true, false, stride, instanced);\r\n }\r\n }\r\n\r\n protected override _createEffects(): void {\r\n super._createEffects();\r\n\r\n const uniformNames = [\"view\", \"projection\", \"size\"];\r\n const attributeNames = [\"position\", \"offset\", \"color\"];\r\n\r\n this._diffuseEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDiffuse\",\r\n fragmentShader: \"fluidRenderingParticleDiffuse\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await import(\"../../ShadersWGSL/fluidRenderingParticleDiffuse.fragment\");\r\n } else {\r\n await import(\"../../Shaders/fluidRenderingParticleDiffuse.fragment\");\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n if (!this._vertexBuffers[\"offset\"]) {\r\n this._vertexBuffers[\"offset\"] = new VertexBuffer(this._engine, [0, 0, 1, 0, 0, 1, 1, 1], \"offset\", false, false, 2);\r\n }\r\n\r\n return super.isReady() && (this._diffuseEffectWrapper?.effect!.isReady() ?? false);\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this object\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._numParticles;\r\n }\r\n\r\n /**\r\n * Sets the number of particles in this object\r\n * @param num The number of particles to take into account\r\n */\r\n public setNumParticles(num: number) {\r\n this._numParticles = num;\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._diffuseEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const diffuseDrawWrapper = this._diffuseEffectWrapper.drawWrapper;\r\n const diffuseEffect = diffuseDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(diffuseDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, diffuseEffect);\r\n\r\n diffuseEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n diffuseEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n if (this._particleSize !== null) {\r\n diffuseEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n\r\n this._diffuseEffectWrapper?.dispose();\r\n\r\n for (const name in this._vertexBuffers) {\r\n this._vertexBuffers[name].dispose();\r\n }\r\n\r\n this._vertexBuffers = {};\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"fluidRenderingObjectCustomParticles.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"core/Buffers/buffer.pure\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer.pure\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type FloatArray, type Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a list of custom buffers\r\n * The list must contain at least a \"position\" buffer!\r\n */\r\nexport class FluidRenderingObjectCustomParticles extends FluidRenderingObject {\r\n private _numParticles: number;\r\n private _diffuseEffectWrapper: Nullable<EffectWrapper>;\r\n private _vertexBuffers: { [key: string]: VertexBuffer };\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectCustomParticles\";\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._vertexBuffers;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particles should be rendered into\r\n * @param buffers The list of buffers (must contain at least one \"position\" buffer!). Note that you don't have to pass all (or any!) buffers at once in the constructor, you can use the addBuffers method to add more later.\r\n * @param numParticles Number of vertices to take into account from the buffers\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, buffers: { [key: string]: FloatArray }, numParticles: number, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._numParticles = numParticles;\r\n this._diffuseEffectWrapper = null;\r\n this._vertexBuffers = {};\r\n\r\n this.addBuffers(buffers);\r\n }\r\n\r\n /**\r\n * Add some new buffers\r\n * @param buffers List of buffers\r\n */\r\n public addBuffers(buffers: { [key: string]: FloatArray }) {\r\n for (const name in buffers) {\r\n let stride: number | undefined;\r\n let instanced = true;\r\n\r\n switch (name) {\r\n case \"velocity\":\r\n stride = 3;\r\n break;\r\n case \"size\":\r\n stride = 2;\r\n this._effectsAreDirty = true;\r\n break;\r\n case \"offset\":\r\n instanced = false;\r\n break;\r\n }\r\n\r\n this._vertexBuffers[name] = new VertexBuffer(this._engine, buffers[name], name, true, false, stride, instanced);\r\n }\r\n }\r\n\r\n /**\r\n * Per-particle sizing needs an actual \"size\" buffer; custom buffers are optional.\r\n * @returns true if a \"size\" buffer was supplied\r\n */\r\n protected override _supportsPerParticleSizeAttribute(): boolean {\r\n return !!this._vertexBuffers[\"size\"];\r\n }\r\n\r\n protected override _createEffects(): void {\r\n super._createEffects();\r\n\r\n const uniformNames = this._usesPerParticleSizeAttribute ? [\"view\", \"projection\"] : [\"view\", \"projection\", \"size\"];\r\n const attributeNames = this._usesPerParticleSizeAttribute ? [\"position\", \"offset\", \"color\", \"size\"] : [\"position\", \"offset\", \"color\"];\r\n const defines = this._usesPerParticleSizeAttribute ? [\"#define FLUIDRENDERING_PER_PARTICLE_SIZE\"] : [];\r\n\r\n this._diffuseEffectWrapper = new EffectWrapper({\r\n engine: this._engine,\r\n useShaderStore: true,\r\n vertexShader: \"fluidRenderingParticleDiffuse\",\r\n fragmentShader: \"fluidRenderingParticleDiffuse\",\r\n attributeNames,\r\n uniformNames,\r\n samplerNames: [],\r\n defines,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await import(\"../../ShadersWGSL/fluidRenderingParticleDiffuse.fragment\");\r\n } else {\r\n await import(\"../../Shaders/fluidRenderingParticleDiffuse.fragment\");\r\n }\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n if (!this._vertexBuffers[\"offset\"]) {\r\n this._vertexBuffers[\"offset\"] = new VertexBuffer(this._engine, [0, 0, 1, 0, 0, 1, 1, 1], \"offset\", false, false, 2);\r\n }\r\n\r\n return super.isReady() && (this._diffuseEffectWrapper?.effect!.isReady() ?? false);\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this object\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._numParticles;\r\n }\r\n\r\n /**\r\n * Sets the number of particles in this object\r\n * @param num The number of particles to take into account\r\n */\r\n public setNumParticles(num: number) {\r\n this._numParticles = num;\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n const numParticles = this.numParticles;\r\n\r\n if (!this._diffuseEffectWrapper || numParticles === 0) {\r\n return;\r\n }\r\n\r\n const diffuseDrawWrapper = this._diffuseEffectWrapper.drawWrapper;\r\n const diffuseEffect = diffuseDrawWrapper.effect!;\r\n\r\n this._engine.enableEffect(diffuseDrawWrapper);\r\n this._engine.bindBuffers(this.vertexBuffers, this.indexBuffer, diffuseEffect);\r\n\r\n diffuseEffect.setMatrix(\"view\", this._scene.getViewMatrix());\r\n diffuseEffect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n if (!this._usesPerParticleSizeAttribute) {\r\n diffuseEffect.setFloat2(\"size\", this._particleSize, this._particleSize);\r\n }\r\n\r\n if (this.useInstancing) {\r\n this._engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, numParticles);\r\n } else {\r\n this._engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, numParticles);\r\n }\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n\r\n this._diffuseEffectWrapper?.dispose();\r\n\r\n for (const name in this._vertexBuffers) {\r\n this._vertexBuffers[name].dispose();\r\n }\r\n\r\n this._vertexBuffers = {};\r\n }\r\n}\r\n"]}
|
|
@@ -45,6 +45,11 @@ export declare class FluidRenderingObjectParticleSystem extends FluidRenderingOb
|
|
|
45
45
|
* @param shaderLanguage The shader language to use
|
|
46
46
|
*/
|
|
47
47
|
constructor(scene: Scene, ps: IParticleSystem, shaderLanguage?: ShaderLanguage);
|
|
48
|
+
/**
|
|
49
|
+
* GPUParticleSystem's "size" buffer layout (baseSize, scaleX, scaleY) is incompatible with this feature.
|
|
50
|
+
* @returns true if the per-particle size attribute is supported
|
|
51
|
+
*/
|
|
52
|
+
protected _supportsPerParticleSizeAttribute(): boolean;
|
|
48
53
|
/**
|
|
49
54
|
* Indicates if the object is ready to be rendered
|
|
50
55
|
* @returns True if everything is ready for the object to be rendered, otherwise false
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
|
|
2
|
+
import { Logger } from "../../Misc/logger.js";
|
|
2
3
|
import { FluidRenderingObject } from "./fluidRenderingObject.js";
|
|
3
4
|
/**
|
|
4
5
|
* Defines a rendering object based on a particle system
|
|
@@ -70,6 +71,17 @@ export class FluidRenderingObjectParticleSystem extends FluidRenderingObject {
|
|
|
70
71
|
this.particleSize = (ps.minSize + ps.maxSize) / 2;
|
|
71
72
|
this.useTrueRenderingForDiffuseTexture = false;
|
|
72
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* GPUParticleSystem's "size" buffer layout (baseSize, scaleX, scaleY) is incompatible with this feature.
|
|
76
|
+
* @returns true if the per-particle size attribute is supported
|
|
77
|
+
*/
|
|
78
|
+
_supportsPerParticleSizeAttribute() {
|
|
79
|
+
if (this._particleSystem.getClassName() === "GPUParticleSystem") {
|
|
80
|
+
Logger.Warn("UsePerParticleSizeAttribute is not supported with GPUParticleSystem; falling back to uniform size.");
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
73
85
|
/**
|
|
74
86
|
* Indicates if the object is ready to be rendered
|
|
75
87
|
* @returns True if everything is ready for the object to be rendered, otherwise false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingObjectParticleSystem.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"fluidRenderingObjectParticleSystem.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D;;GAEG;AACH,MAAM,OAAO,kCAAmC,SAAQ,oBAAoB;IAOxE,+BAA+B;IAC/B,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED;;OAEG;IACa,YAAY;QACxB,OAAO,oCAAoC,CAAC;IAChD,CAAC;IAID;;;;OAIG;IACH,IAAW,iCAAiC;QACxC,OAAO,IAAI,CAAC,kCAAkC,CAAC;IACnD,CAAC;IAED,IAAW,iCAAiC,CAAC,GAAY;QACrD,IAAI,IAAI,CAAC,kCAAkC,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,kCAAkC,GAAG,GAAG,CAAC;QAE9C,IAAI,GAAG,EAAE,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,+BAA+B,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAChG,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,eAAe,CAAC,+BAA+B,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC/F,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,eAAe,CAAC,aAAgD,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,IAAoB,WAAW;QAC3B,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,YAAY,KAAY,EAAE,EAAmB,EAAE,cAA+B;QAC1E,KAAK,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAnDzB,uCAAkC,GAAG,IAAI,CAAC;QAqD9C,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAE1B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC;QAC7D,IAAI,CAAC,eAAe,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAEtC,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAElD,IAAI,CAAC,iCAAiC,GAAG,KAAK,CAAC;IACnD,CAAC;IAED;;;OAGG;IACgB,iCAAiC;QAChD,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,KAAK,mBAAmB,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,oGAAoG,CAAC,CAAC;YAClH,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACa,OAAO;QACnB,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACa,oBAAoB;QAChC,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACa,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,IAAI,CAAC,eAAe,CAAC,+BAA+B,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAChG,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACnD,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACjE,CAAC;CACJ","sourcesContent":["import { type VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type DataBuffer } from \"core/Buffers/dataBuffer\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type Effect } from \"core/Materials/effect\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { type IParticleSystem } from \"core/Particles/IParticleSystem\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\n\r\nimport { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { type ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Defines a rendering object based on a particle system\r\n */\r\nexport class FluidRenderingObjectParticleSystem extends FluidRenderingObject {\r\n private _particleSystem: IParticleSystem;\r\n private _originalRender: () => number;\r\n private _blendMode: number;\r\n private _onBeforeDrawParticleObserver: Nullable<Observer<Nullable<Effect>>>;\r\n private _updateInAnimate: boolean;\r\n\r\n /** Gets the particle system */\r\n public get particleSystem() {\r\n return this._particleSystem;\r\n }\r\n\r\n /**\r\n * @returns the name of the class\r\n */\r\n public override getClassName(): string {\r\n return \"FluidRenderingObjectParticleSystem\";\r\n }\r\n\r\n private _useTrueRenderingForDiffuseTexture = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the diffuse texture should be generated based on the regular rendering of the particle system (default: true).\r\n * Sometimes, generating the diffuse texture this way may be sub-optimal. In that case, you can disable this property, in which case the particle system will be\r\n * rendered using a ALPHA_COMBINE mode instead of the one used by the particle system.\r\n */\r\n public get useTrueRenderingForDiffuseTexture() {\r\n return this._useTrueRenderingForDiffuseTexture;\r\n }\r\n\r\n public set useTrueRenderingForDiffuseTexture(use: boolean) {\r\n if (this._useTrueRenderingForDiffuseTexture === use) {\r\n return;\r\n }\r\n\r\n this._useTrueRenderingForDiffuseTexture = use;\r\n\r\n if (use) {\r\n this._particleSystem.blendMode = this._blendMode;\r\n this._particleSystem.onBeforeDrawParticlesObservable.remove(this._onBeforeDrawParticleObserver);\r\n this._onBeforeDrawParticleObserver = null;\r\n } else {\r\n this._particleSystem.blendMode = -1;\r\n this._onBeforeDrawParticleObserver = this._particleSystem.onBeforeDrawParticlesObservable.add(() => {\r\n this._engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the vertex buffers\r\n */\r\n public get vertexBuffers(): { [key: string]: VertexBuffer } {\r\n return this._particleSystem.vertexBuffers as { [key: string]: VertexBuffer };\r\n }\r\n\r\n /**\r\n * Gets the index buffer (or null if the object is using instancing)\r\n */\r\n public override get indexBuffer(): Nullable<DataBuffer> {\r\n return this._particleSystem.indexBuffer;\r\n }\r\n\r\n /**\r\n * Creates a new instance of the class\r\n * @param scene The scene the particle system is part of\r\n * @param ps The particle system\r\n * @param shaderLanguage The shader language to use\r\n */\r\n constructor(scene: Scene, ps: IParticleSystem, shaderLanguage?: ShaderLanguage) {\r\n super(scene, shaderLanguage);\r\n\r\n this._particleSystem = ps;\r\n\r\n this._originalRender = ps.render.bind(ps);\r\n this._blendMode = ps.blendMode;\r\n this._onBeforeDrawParticleObserver = null;\r\n this._updateInAnimate = this._particleSystem.updateInAnimate;\r\n this._particleSystem.updateInAnimate = true;\r\n this._particleSystem.render = () => 0;\r\n\r\n this.particleSize = (ps.minSize + ps.maxSize) / 2;\r\n\r\n this.useTrueRenderingForDiffuseTexture = false;\r\n }\r\n\r\n /**\r\n * GPUParticleSystem's \"size\" buffer layout (baseSize, scaleX, scaleY) is incompatible with this feature.\r\n * @returns true if the per-particle size attribute is supported\r\n */\r\n protected override _supportsPerParticleSizeAttribute(): boolean {\r\n if (this._particleSystem.getClassName() === \"GPUParticleSystem\") {\r\n Logger.Warn(\"UsePerParticleSizeAttribute is not supported with GPUParticleSystem; falling back to uniform size.\");\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Indicates if the object is ready to be rendered\r\n * @returns True if everything is ready for the object to be rendered, otherwise false\r\n */\r\n public override isReady(): boolean {\r\n return super.isReady() && this._particleSystem.isReady();\r\n }\r\n\r\n /**\r\n * Gets the number of particles in this particle system\r\n * @returns The number of particles\r\n */\r\n public get numParticles(): number {\r\n return this._particleSystem.getActiveCount();\r\n }\r\n\r\n /**\r\n * Render the diffuse texture for this object\r\n */\r\n public override renderDiffuseTexture(): void {\r\n this._originalRender();\r\n }\r\n\r\n /**\r\n * Releases the resources used by the class\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this._particleSystem.onBeforeDrawParticlesObservable.remove(this._onBeforeDrawParticleObserver);\r\n this._onBeforeDrawParticleObserver = null;\r\n this._particleSystem.render = this._originalRender;\r\n this._particleSystem.blendMode = this._blendMode;\r\n this._particleSystem.updateInAnimate = this._updateInAnimate;\r\n }\r\n}\r\n"]}
|
|
@@ -8,6 +8,7 @@ import { type Scene } from "../scene.pure.js";
|
|
|
8
8
|
import { type AbstractMesh } from "../Meshes/abstractMesh.pure.js";
|
|
9
9
|
import { type Nullable } from "../types.js";
|
|
10
10
|
import { ShaderLanguage } from "../Materials/shaderLanguage.js";
|
|
11
|
+
import { type GeometryRenderingObjectIdProvider } from "../Materials/materialHelper.geometryrendering.js";
|
|
11
12
|
/** @internal */
|
|
12
13
|
interface ISavedTransformationMatrix {
|
|
13
14
|
world: Matrix;
|
|
@@ -76,6 +77,11 @@ export declare class GeometryBufferRenderer {
|
|
|
76
77
|
* using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
|
|
77
78
|
*/
|
|
78
79
|
static readonly IRRADIANCE_TEXTURE_TYPE = 7;
|
|
80
|
+
/**
|
|
81
|
+
* Constant used to retrieve the object ID texture index in the G-Buffer textures array.
|
|
82
|
+
* Object IDs are stored as 24-bit unsigned integers encoded in the RGB channels.
|
|
83
|
+
*/
|
|
84
|
+
static readonly OBJECT_ID_TEXTURE_TYPE = 8;
|
|
79
85
|
/**
|
|
80
86
|
* Dictionary used to store the previous transformation matrices of each rendered mesh
|
|
81
87
|
* in order to compute objects velocities when enableVelocity is set to "true"
|
|
@@ -99,6 +105,16 @@ export declare class GeometryBufferRenderer {
|
|
|
99
105
|
excludedSkinnedMeshesFromVelocity: AbstractMesh[];
|
|
100
106
|
/** Gets or sets a boolean indicating if transparent meshes should be rendered */
|
|
101
107
|
renderTransparentMeshes: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Provides the object ID written for each rendered mesh.
|
|
110
|
+
*
|
|
111
|
+
* IDs must be integers between 0 and 0xFFFFFF. ID 0 is reserved for background or excluded meshes.
|
|
112
|
+
* Instances use the ID of their source mesh. The default is the mesh unique ID.
|
|
113
|
+
* Default IDs are only stable for the lifetime of the current scene and should not be persisted.
|
|
114
|
+
* The provider runs in the render hot path and may be called multiple times for the same mesh in a frame.
|
|
115
|
+
* @see https://playground.babylonjs.com/#REC26C#0
|
|
116
|
+
*/
|
|
117
|
+
objectIdProvider?: GeometryRenderingObjectIdProvider;
|
|
102
118
|
/**
|
|
103
119
|
* Gets or sets a boolean indicating if normals should be generated in world space (default: false, meaning normals are generated in view space)
|
|
104
120
|
*/
|
|
@@ -121,6 +137,7 @@ export declare class GeometryBufferRenderer {
|
|
|
121
137
|
private _enableReflectivity;
|
|
122
138
|
private _enableScreenspaceDepth;
|
|
123
139
|
private _enableIrradiance;
|
|
140
|
+
private _enableObjectId;
|
|
124
141
|
private _depthFormat;
|
|
125
142
|
private _clearColor;
|
|
126
143
|
private _clearDepthColor;
|
|
@@ -132,6 +149,7 @@ export declare class GeometryBufferRenderer {
|
|
|
132
149
|
private _normalIndex;
|
|
133
150
|
private _screenspaceDepthIndex;
|
|
134
151
|
private _irradianceIndex;
|
|
152
|
+
private _objectIdIndex;
|
|
135
153
|
private _linkedWithPrePass;
|
|
136
154
|
private _prePassRenderer;
|
|
137
155
|
private _attachmentsFromPrePass;
|
|
@@ -256,6 +274,18 @@ export declare class GeometryBufferRenderer {
|
|
|
256
274
|
* Sets whether or not objects irradiance are enabled for the G buffer.
|
|
257
275
|
*/
|
|
258
276
|
set enableIrradiance(enable: boolean);
|
|
277
|
+
/**
|
|
278
|
+
* Gets whether object IDs are enabled for the G buffer.
|
|
279
|
+
*/
|
|
280
|
+
get enableObjectId(): boolean;
|
|
281
|
+
/**
|
|
282
|
+
* Sets whether object IDs are enabled for the G buffer.
|
|
283
|
+
*
|
|
284
|
+
* Object ID rendering currently requires a single-sample G buffer.
|
|
285
|
+
* Object ID rendering is not supported when the G buffer is linked to the PrePassRenderer.
|
|
286
|
+
* @see https://playground.babylonjs.com/#REC26C#0
|
|
287
|
+
*/
|
|
288
|
+
set enableObjectId(enable: boolean);
|
|
259
289
|
/**
|
|
260
290
|
* This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
|
|
261
291
|
* scattering and should be taken into account when applying image-based lighting.
|
|
@@ -12,6 +12,7 @@ import { BindClipPlane, PrepareStringDefinesForClipPlanes, AddClipPlaneUniforms
|
|
|
12
12
|
import { BindMorphTargetParameters, BindSceneUniformBuffer, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances, PrepareDefinesForIBL, PrepareUniformsAndSamplersForIBL, } from "../Materials/materialHelper.functions.js";
|
|
13
13
|
import { RegisterGeometryBufferRendererSceneComponent } from "./geometryBufferRendererSceneComponent.pure.js";
|
|
14
14
|
import { IsGaussianSplattingClassName } from "../Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js";
|
|
15
|
+
import { _GetGeometryRenderingObjectId } from "../Materials/materialHelper.geometryrendering.js";
|
|
15
16
|
export const Samplers = [
|
|
16
17
|
"diffuseSampler",
|
|
17
18
|
"bumpSampler",
|
|
@@ -54,6 +55,7 @@ export const Uniforms = [
|
|
|
54
55
|
"morphTargetTextureInfo",
|
|
55
56
|
"morphTargetTextureIndices",
|
|
56
57
|
"boneTextureInfo",
|
|
58
|
+
"objectId",
|
|
57
59
|
];
|
|
58
60
|
/**
|
|
59
61
|
* This renderer is helpful to fill one of the render target with a geometry buffer.
|
|
@@ -103,6 +105,7 @@ export class GeometryBufferRenderer {
|
|
|
103
105
|
this._enableVelocityLinear = false;
|
|
104
106
|
this._enableScreenspaceDepth = false;
|
|
105
107
|
this._enableIrradiance = false;
|
|
108
|
+
this._enableObjectId = false;
|
|
106
109
|
this._attachmentsFromPrePass = [];
|
|
107
110
|
}
|
|
108
111
|
/**
|
|
@@ -143,6 +146,10 @@ export class GeometryBufferRenderer {
|
|
|
143
146
|
this._irradianceIndex = index;
|
|
144
147
|
this._enableIrradiance = true;
|
|
145
148
|
}
|
|
149
|
+
else if (geometryBufferType === GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE) {
|
|
150
|
+
this._objectIdIndex = index;
|
|
151
|
+
this._enableObjectId = true;
|
|
152
|
+
}
|
|
146
153
|
}
|
|
147
154
|
/**
|
|
148
155
|
* @internal
|
|
@@ -202,6 +209,8 @@ export class GeometryBufferRenderer {
|
|
|
202
209
|
return this._screenspaceDepthIndex;
|
|
203
210
|
case GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE:
|
|
204
211
|
return this._irradianceIndex;
|
|
212
|
+
case GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE:
|
|
213
|
+
return this._objectIdIndex;
|
|
205
214
|
default:
|
|
206
215
|
return -1;
|
|
207
216
|
}
|
|
@@ -340,6 +349,43 @@ export class GeometryBufferRenderer {
|
|
|
340
349
|
this._createRenderTargets();
|
|
341
350
|
}
|
|
342
351
|
}
|
|
352
|
+
/**
|
|
353
|
+
* Gets whether object IDs are enabled for the G buffer.
|
|
354
|
+
*/
|
|
355
|
+
get enableObjectId() {
|
|
356
|
+
return this._enableObjectId;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Sets whether object IDs are enabled for the G buffer.
|
|
360
|
+
*
|
|
361
|
+
* Object ID rendering currently requires a single-sample G buffer.
|
|
362
|
+
* Object ID rendering is not supported when the G buffer is linked to the PrePassRenderer.
|
|
363
|
+
* @see https://playground.babylonjs.com/#REC26C#0
|
|
364
|
+
*/
|
|
365
|
+
set enableObjectId(enable) {
|
|
366
|
+
if (enable && this._linkedWithPrePass) {
|
|
367
|
+
throw new Error("GeometryBufferRenderer: object ID textures are not supported when linked to the PrePassRenderer");
|
|
368
|
+
}
|
|
369
|
+
if (enable && this.samples !== 1) {
|
|
370
|
+
throw new Error("GeometryBufferRenderer: object ID textures currently require samples to be 1");
|
|
371
|
+
}
|
|
372
|
+
if (enable && !this._enableObjectId && !this._linkedWithPrePass) {
|
|
373
|
+
const engine = this._scene.getEngine();
|
|
374
|
+
const maxDrawBuffers = Math.min(engine.getCaps().maxDrawBuffers ?? 1, 8);
|
|
375
|
+
const attachmentCount = this._assignRenderTargetIndices()[0] + 1;
|
|
376
|
+
if (engine.getCaps().drawBuffersExtension && attachmentCount > maxDrawBuffers) {
|
|
377
|
+
throw new Error(`GeometryBufferRenderer: ${attachmentCount} color attachments were requested, but this engine supports at most ${maxDrawBuffers}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
this._enableObjectId = enable;
|
|
381
|
+
if (!enable) {
|
|
382
|
+
this._objectIdIndex = -1;
|
|
383
|
+
}
|
|
384
|
+
if (!this._linkedWithPrePass) {
|
|
385
|
+
this.dispose();
|
|
386
|
+
this._createRenderTargets();
|
|
387
|
+
}
|
|
388
|
+
}
|
|
343
389
|
/**
|
|
344
390
|
* Gets the scene associated with the buffer.
|
|
345
391
|
*/
|
|
@@ -401,6 +447,7 @@ export class GeometryBufferRenderer {
|
|
|
401
447
|
this._enableReflectivity = false;
|
|
402
448
|
this._enableScreenspaceDepth = false;
|
|
403
449
|
this._enableIrradiance = false;
|
|
450
|
+
this._enableObjectId = false;
|
|
404
451
|
this._clearColor = new Color4(0, 0, 0, 0);
|
|
405
452
|
this._clearDepthColor = new Color4(0, 0, 0, 1); // sets an invalid value by default - depth in the depth texture is view.z, so 0 is not possible because view.z can't be less than camera.minZ
|
|
406
453
|
this._positionIndex = -1;
|
|
@@ -411,6 +458,7 @@ export class GeometryBufferRenderer {
|
|
|
411
458
|
this._normalIndex = -1;
|
|
412
459
|
this._screenspaceDepthIndex = -1;
|
|
413
460
|
this._irradianceIndex = -1;
|
|
461
|
+
this._objectIdIndex = -1;
|
|
414
462
|
this._linkedWithPrePass = false;
|
|
415
463
|
/**
|
|
416
464
|
* This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
|
|
@@ -764,6 +812,10 @@ export class GeometryBufferRenderer {
|
|
|
764
812
|
}
|
|
765
813
|
}
|
|
766
814
|
}
|
|
815
|
+
if (this._enableObjectId) {
|
|
816
|
+
defines.push("#define OBJECT_ID");
|
|
817
|
+
defines.push("#define OBJECT_ID_INDEX " + this._objectIdIndex);
|
|
818
|
+
}
|
|
767
819
|
if (this.generateNormalsInWorldSpace) {
|
|
768
820
|
defines.push("#define NORMAL_WORLDSPACE");
|
|
769
821
|
}
|
|
@@ -851,6 +903,9 @@ export class GeometryBufferRenderer {
|
|
|
851
903
|
* Sets the number of samples used to render the buffer (anti aliasing).
|
|
852
904
|
*/
|
|
853
905
|
set samples(value) {
|
|
906
|
+
if (this._enableObjectId && value !== 1) {
|
|
907
|
+
throw new Error("GeometryBufferRenderer: object ID textures currently require samples to be 1");
|
|
908
|
+
}
|
|
854
909
|
this._multiRenderTarget.samples = value;
|
|
855
910
|
}
|
|
856
911
|
/**
|
|
@@ -919,11 +974,25 @@ export class GeometryBufferRenderer {
|
|
|
919
974
|
textureNames.push("gBuffer_Irradiance");
|
|
920
975
|
textureTypesAndFormats.push(this._textureTypesAndFormats[GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE]);
|
|
921
976
|
}
|
|
977
|
+
if (this._enableObjectId) {
|
|
978
|
+
this._objectIdIndex = count;
|
|
979
|
+
count++;
|
|
980
|
+
textureNames.push("gBuffer_ObjectId");
|
|
981
|
+
textureTypesAndFormats.push({
|
|
982
|
+
textureType: 0,
|
|
983
|
+
textureFormat: 5,
|
|
984
|
+
samplingMode: 1,
|
|
985
|
+
});
|
|
986
|
+
}
|
|
922
987
|
return [count, textureNames, textureTypesAndFormats];
|
|
923
988
|
}
|
|
924
989
|
_createRenderTargets() {
|
|
925
990
|
const engine = this._scene.getEngine();
|
|
926
991
|
const [count, textureNames, textureTypesAndFormat] = this._assignRenderTargetIndices();
|
|
992
|
+
const maxDrawBuffers = Math.min(engine.getCaps().maxDrawBuffers ?? 1, 8);
|
|
993
|
+
if (engine.getCaps().drawBuffersExtension && count > maxDrawBuffers) {
|
|
994
|
+
throw new Error(`GeometryBufferRenderer: ${count} color attachments were requested, but this engine supports at most ${maxDrawBuffers}`);
|
|
995
|
+
}
|
|
927
996
|
let type = 0;
|
|
928
997
|
if (engine._caps.textureFloat && engine._caps.textureFloatLinearFiltering) {
|
|
929
998
|
type = 1;
|
|
@@ -1274,6 +1343,16 @@ export class GeometryBufferRenderer {
|
|
|
1274
1343
|
effect.setMatrix("previousWorld", this._previousTransformationMatrices[effectiveMesh.uniqueId].world);
|
|
1275
1344
|
effect.setMatrix("previousViewProjection", this._previousTransformationMatrices[effectiveMesh.uniqueId].viewProjection);
|
|
1276
1345
|
}
|
|
1346
|
+
if (this._enableObjectId) {
|
|
1347
|
+
let objectId = renderingMesh.uniqueId;
|
|
1348
|
+
if (this.objectIdProvider) {
|
|
1349
|
+
objectId = _GetGeometryRenderingObjectId(renderingMesh, this.objectIdProvider);
|
|
1350
|
+
}
|
|
1351
|
+
else if (objectId > 0xffffff) {
|
|
1352
|
+
throw new Error(`Invalid geometry object ID ${objectId} for mesh "${renderingMesh.name}". Object IDs must be integers between 0 and 0xFFFFFF.`);
|
|
1353
|
+
}
|
|
1354
|
+
effect.setFloat("objectId", objectId);
|
|
1355
|
+
}
|
|
1277
1356
|
if (hardwareInstancedRendering && renderingMesh.hasThinInstances) {
|
|
1278
1357
|
effect.setMatrix("world", world);
|
|
1279
1358
|
}
|
|
@@ -1394,6 +1473,11 @@ GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE = 6;
|
|
|
1394
1473
|
* using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
|
|
1395
1474
|
*/
|
|
1396
1475
|
GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE = 7;
|
|
1476
|
+
/**
|
|
1477
|
+
* Constant used to retrieve the object ID texture index in the G-Buffer textures array.
|
|
1478
|
+
* Object IDs are stored as 24-bit unsigned integers encoded in the RGB channels.
|
|
1479
|
+
*/
|
|
1480
|
+
GeometryBufferRenderer.OBJECT_ID_TEXTURE_TYPE = 8;
|
|
1397
1481
|
/**
|
|
1398
1482
|
* @internal
|
|
1399
1483
|
*/
|