@onerjs/core 8.41.6 → 8.41.7
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/Animations/animation.d.ts +6 -2
- package/Animations/animation.js +28 -4
- package/Animations/animation.js.map +1 -1
- package/Animations/animationGroup.d.ts +2 -1
- package/Animations/animationGroup.js +3 -2
- package/Animations/animationGroup.js.map +1 -1
- package/Animations/animatorAvatar.d.ts +161 -0
- package/Animations/animatorAvatar.js +573 -0
- package/Animations/animatorAvatar.js.map +1 -0
- package/Animations/index.d.ts +1 -0
- package/Animations/index.js +1 -0
- package/Animations/index.js.map +1 -1
- package/AudioV2/webAudio/webAudioSoundSource.d.ts +2 -2
- package/AudioV2/webAudio/webAudioSoundSource.js +12 -2
- package/AudioV2/webAudio/webAudioSoundSource.js.map +1 -1
- package/Bones/index.d.ts +1 -0
- package/Bones/index.js +1 -0
- package/Bones/index.js.map +1 -1
- package/Bones/skeleton.d.ts +13 -0
- package/Bones/skeleton.functions.d.ts +26 -0
- package/Bones/skeleton.functions.js +91 -0
- package/Bones/skeleton.functions.js.map +1 -0
- package/Bones/skeleton.js +26 -0
- package/Bones/skeleton.js.map +1 -1
- package/Cameras/geospatialCamera.js +21 -20
- package/Cameras/geospatialCamera.js.map +1 -1
- package/Cameras/geospatialCameraMovement.d.ts +8 -1
- package/Cameras/geospatialCameraMovement.js +29 -8
- package/Cameras/geospatialCameraMovement.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +11 -0
- package/Collisions/gpuPicker.js +148 -19
- package/Collisions/gpuPicker.js.map +1 -1
- package/Debug/skeletonViewer.d.ts +4 -8
- package/Debug/skeletonViewer.js +13 -22
- package/Debug/skeletonViewer.js.map +1 -1
- package/Engines/Extensions/engine.multiview.d.ts +2 -0
- package/Engines/Extensions/engine.multiview.js +7 -3
- package/Engines/Extensions/engine.multiview.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +4 -0
- package/Engines/constants.js +4 -0
- package/Engines/constants.js.map +1 -1
- package/Instrumentation/engineInstrumentation.js +2 -1
- package/Instrumentation/engineInstrumentation.js.map +1 -1
- package/Layers/effectLayer.js +1 -3
- package/Layers/effectLayer.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.js +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +2 -3
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Materials/Background/backgroundMaterial.js +37 -2
- package/Materials/Background/backgroundMaterial.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.d.ts +109 -0
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.js +210 -0
- package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.js.map +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +1 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +71 -15
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.d.ts +86 -0
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js +161 -0
- package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js.map +1 -0
- package/Materials/GreasedLine/greasedLinePluginMaterial.js +0 -6
- package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js +0 -1
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersGLSL.js.map +1 -1
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js +0 -1
- package/Materials/GreasedLine/greasedLinePluginMaterialShadersWGSL.js.map +1 -1
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.d.ts +14 -0
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +14 -0
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/currentScreenBlock.d.ts +20 -1
- package/Materials/Node/Blocks/Dual/currentScreenBlock.js +20 -1
- package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/depthSourceBlock.d.ts +13 -0
- package/Materials/Node/Blocks/Dual/depthSourceBlock.js +13 -0
- package/Materials/Node/Blocks/Dual/depthSourceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/fogBlock.d.ts +21 -0
- package/Materials/Node/Blocks/Dual/fogBlock.js +21 -0
- package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.d.ts +21 -0
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js +21 -0
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.d.ts +38 -0
- package/Materials/Node/Blocks/Dual/lightBlock.js +38 -0
- package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.d.ts +29 -0
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +29 -0
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/reflectionTextureBlock.d.ts +5 -0
- package/Materials/Node/Blocks/Dual/reflectionTextureBlock.js +5 -0
- package/Materials/Node/Blocks/Dual/reflectionTextureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.d.ts +16 -0
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +16 -0
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.d.ts +16 -0
- package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js +16 -0
- package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.d.ts +34 -0
- package/Materials/Node/Blocks/Dual/textureBlock.js +34 -0
- package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/TBNBlock.d.ts +17 -0
- package/Materials/Node/Blocks/Fragment/TBNBlock.js +17 -2
- package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/ambientOcclusionBlock.d.ts +7 -0
- package/Materials/Node/Blocks/Fragment/ambientOcclusionBlock.js +7 -0
- package/Materials/Node/Blocks/Fragment/ambientOcclusionBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +21 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +21 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/heightToNormalBlock.d.ts +10 -0
- package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +10 -0
- package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.d.ts +28 -0
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +28 -0
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.d.ts +30 -0
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +30 -1
- package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/screenSizeBlock.d.ts +4 -0
- package/Materials/Node/Blocks/Fragment/screenSizeBlock.js +4 -0
- package/Materials/Node/Blocks/Fragment/screenSizeBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/screenSpaceBlock.d.ts +5 -0
- package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +5 -0
- package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/twirlBlock.d.ts +3 -0
- package/Materials/Node/Blocks/Fragment/twirlBlock.js +3 -0
- package/Materials/Node/Blocks/Fragment/twirlBlock.js.map +1 -1
- package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.d.ts +6 -0
- package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js +6 -0
- package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.d.ts +16 -0
- package/Materials/Node/Blocks/Input/inputBlock.js +16 -1
- package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/prePassTextureBlock.d.ts +5 -0
- package/Materials/Node/Blocks/Input/prePassTextureBlock.js +5 -0
- package/Materials/Node/Blocks/Input/prePassTextureBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/anisotropyBlock.d.ts +10 -0
- package/Materials/Node/Blocks/PBR/anisotropyBlock.js +10 -1
- package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/clearCoatBlock.d.ts +23 -0
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js +23 -1
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/iridescenceBlock.d.ts +17 -0
- package/Materials/Node/Blocks/PBR/iridescenceBlock.js +17 -0
- package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.d.ts +41 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +41 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/reflectionBlock.d.ts +21 -0
- package/Materials/Node/Blocks/PBR/reflectionBlock.js +21 -0
- package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/refractionBlock.d.ts +29 -0
- package/Materials/Node/Blocks/PBR/refractionBlock.js +29 -0
- package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/sheenBlock.d.ts +14 -0
- package/Materials/Node/Blocks/PBR/sheenBlock.js +14 -0
- package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.d.ts +7 -0
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +7 -0
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Particle/particleTextureBlock.d.ts +23 -0
- package/Materials/Node/Blocks/Particle/particleTextureBlock.js +23 -0
- package/Materials/Node/Blocks/Particle/particleTextureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Teleport/teleportInBlock.d.ts +6 -0
- package/Materials/Node/Blocks/Teleport/teleportInBlock.js +6 -0
- package/Materials/Node/Blocks/Teleport/teleportInBlock.js.map +1 -1
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.d.ts +17 -0
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js +17 -0
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/bonesBlock.d.ts +22 -0
- package/Materials/Node/Blocks/Vertex/bonesBlock.js +22 -0
- package/Materials/Node/Blocks/Vertex/bonesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/instancesBlock.d.ts +13 -0
- package/Materials/Node/Blocks/Vertex/instancesBlock.js +13 -0
- package/Materials/Node/Blocks/Vertex/instancesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/lightInformationBlock.d.ts +20 -0
- package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +20 -0
- package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.d.ts +27 -0
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +27 -0
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
- package/Materials/Node/Blocks/clampBlock.d.ts +10 -0
- package/Materials/Node/Blocks/clampBlock.js +10 -0
- package/Materials/Node/Blocks/clampBlock.js.map +1 -1
- package/Materials/Node/Blocks/cloudBlock.d.ts +10 -0
- package/Materials/Node/Blocks/cloudBlock.js +10 -0
- package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
- package/Materials/Node/Blocks/colorMergerBlock.d.ts +10 -0
- package/Materials/Node/Blocks/colorMergerBlock.js +10 -0
- package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
- package/Materials/Node/Blocks/conditionalBlock.d.ts +14 -0
- package/Materials/Node/Blocks/conditionalBlock.js +14 -0
- package/Materials/Node/Blocks/conditionalBlock.js.map +1 -1
- package/Materials/Node/Blocks/curveBlock.d.ts +10 -0
- package/Materials/Node/Blocks/curveBlock.js +10 -0
- package/Materials/Node/Blocks/curveBlock.js.map +1 -1
- package/Materials/Node/Blocks/customBlock.d.ts +10 -0
- package/Materials/Node/Blocks/customBlock.js +10 -0
- package/Materials/Node/Blocks/customBlock.js.map +1 -1
- package/Materials/Node/Blocks/debugBlock.d.ts +10 -0
- package/Materials/Node/Blocks/debugBlock.js +10 -0
- package/Materials/Node/Blocks/debugBlock.js.map +1 -1
- package/Materials/Node/Blocks/fresnelBlock.d.ts +4 -0
- package/Materials/Node/Blocks/fresnelBlock.js +4 -0
- package/Materials/Node/Blocks/fresnelBlock.js.map +1 -1
- package/Materials/Node/Blocks/gradientBlock.d.ts +10 -0
- package/Materials/Node/Blocks/gradientBlock.js +10 -0
- package/Materials/Node/Blocks/gradientBlock.js.map +1 -1
- package/Materials/Node/Blocks/loopBlock.d.ts +10 -0
- package/Materials/Node/Blocks/loopBlock.js +10 -0
- package/Materials/Node/Blocks/loopBlock.js.map +1 -1
- package/Materials/Node/Blocks/matrixBuilderBlock.d.ts +1 -0
- package/Materials/Node/Blocks/matrixBuilderBlock.js +1 -0
- package/Materials/Node/Blocks/matrixBuilderBlock.js.map +1 -1
- package/Materials/Node/Blocks/meshAttributeExistsBlock.d.ts +10 -0
- package/Materials/Node/Blocks/meshAttributeExistsBlock.js +10 -0
- package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
- package/Materials/Node/Blocks/pannerBlock.d.ts +5 -0
- package/Materials/Node/Blocks/pannerBlock.js +5 -0
- package/Materials/Node/Blocks/pannerBlock.js.map +1 -1
- package/Materials/Node/Blocks/remapBlock.d.ts +10 -0
- package/Materials/Node/Blocks/remapBlock.js +10 -0
- package/Materials/Node/Blocks/remapBlock.js.map +1 -1
- package/Materials/Node/Blocks/rotate2dBlock.d.ts +1 -0
- package/Materials/Node/Blocks/rotate2dBlock.js +1 -0
- package/Materials/Node/Blocks/rotate2dBlock.js.map +1 -1
- package/Materials/Node/Blocks/transformBlock.d.ts +10 -0
- package/Materials/Node/Blocks/transformBlock.js +10 -0
- package/Materials/Node/Blocks/transformBlock.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.d.ts +22 -0
- package/Materials/Node/Blocks/triPlanarBlock.js +22 -0
- package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
- package/Materials/Node/Blocks/trigonometryBlock.d.ts +10 -0
- package/Materials/Node/Blocks/trigonometryBlock.js +10 -0
- package/Materials/Node/Blocks/trigonometryBlock.js.map +1 -1
- package/Materials/Node/Blocks/vectorMergerBlock.d.ts +10 -0
- package/Materials/Node/Blocks/vectorMergerBlock.js +10 -0
- package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
- package/Materials/Node/Blocks/viewDirectionBlock.d.ts +5 -0
- package/Materials/Node/Blocks/viewDirectionBlock.js +5 -0
- package/Materials/Node/Blocks/viewDirectionBlock.js.map +1 -1
- package/Materials/Node/Blocks/waveBlock.d.ts +10 -0
- package/Materials/Node/Blocks/waveBlock.js +10 -0
- package/Materials/Node/Blocks/waveBlock.js.map +1 -1
- package/Materials/Node/Blocks/worleyNoise3DBlock.d.ts +1 -0
- package/Materials/Node/Blocks/worleyNoise3DBlock.js +1 -0
- package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +13 -0
- package/Materials/Node/nodeMaterial.js +14 -2
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBlock.d.ts +0 -3
- package/Materials/Node/nodeMaterialBlock.js +1 -6
- package/Materials/Node/nodeMaterialBlock.js.map +1 -1
- package/Materials/Node/nodeMaterialBlockConnectionPoint.js +1 -2
- package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
- package/Materials/Textures/mirrorTexture.js +1 -1
- package/Materials/Textures/mirrorTexture.js.map +1 -1
- package/Materials/index.d.ts +2 -0
- package/Materials/index.js +2 -0
- package/Materials/index.js.map +1 -1
- package/Maths/math.constants.d.ts +2 -1
- package/Maths/math.constants.js +3 -2
- package/Maths/math.constants.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +17 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/instancedMesh.js +1 -0
- package/Meshes/instancedMesh.js.map +1 -1
- package/Meshes/mesh.d.ts +5 -0
- package/Meshes/mesh.js +39 -16
- package/Meshes/mesh.js.map +1 -1
- package/Misc/dataStorage.d.ts +13 -0
- package/Misc/dataStorage.js +25 -0
- package/Misc/dataStorage.js.map +1 -1
- package/Morph/morphTarget.d.ts +9 -5
- package/Morph/morphTarget.js +15 -7
- package/Morph/morphTarget.js.map +1 -1
- package/Morph/morphTargetManager.d.ts +3 -1
- package/Morph/morphTargetManager.js +5 -2
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/boxShapeBlock.js +1 -1
- package/Particles/Node/Blocks/Emitters/boxShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/coneShapeBlock.js +1 -1
- package/Particles/Node/Blocks/Emitters/coneShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/customShapeBlock.js +1 -1
- package/Particles/Node/Blocks/Emitters/customShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/cylinderShapeBlock.js +1 -1
- package/Particles/Node/Blocks/Emitters/cylinderShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/emitters.functions.js +3 -3
- package/Particles/Node/Blocks/Emitters/emitters.functions.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/meshShapeBlock.js +1 -1
- package/Particles/Node/Blocks/Emitters/meshShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/pointShapeBlock.js +1 -1
- package/Particles/Node/Blocks/Emitters/pointShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/Emitters/sphereShapeBlock.js +1 -1
- package/Particles/Node/Blocks/Emitters/sphereShapeBlock.js.map +1 -1
- package/Particles/Node/Blocks/Update/basicPositionUpdateBlock.js +2 -2
- package/Particles/Node/Blocks/Update/basicPositionUpdateBlock.js.map +1 -1
- package/Particles/Node/Blocks/Update/updateNoiseBlock.js +7 -7
- package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
- package/Particles/Node/Blocks/particleLocalVariableBlock.js +2 -2
- package/Particles/Node/Blocks/particleLocalVariableBlock.js.map +1 -1
- package/Particles/Node/nodeParticleBuildState.js +7 -7
- package/Particles/Node/nodeParticleBuildState.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.helper.js +9 -4
- package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
- package/Particles/particle.d.ts +73 -61
- package/Particles/particle.js +106 -91
- package/Particles/particle.js.map +1 -1
- package/Particles/particleSystem.js +5 -5
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.function.js +83 -83
- package/Particles/thinParticleSystem.function.js.map +1 -1
- package/Particles/thinParticleSystem.js +8 -8
- package/Particles/thinParticleSystem.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.d.ts +14 -1
- package/Physics/v2/Plugins/havokPlugin.js +154 -10
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Probes/reflectionProbe.js +9 -6
- package/Probes/reflectionProbe.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +3 -1
- package/Rendering/objectRenderer.js +28 -8
- package/Rendering/objectRenderer.js.map +1 -1
- package/Rendering/reflectiveShadowMap.js +1 -1
- package/Rendering/reflectiveShadowMap.js.map +1 -1
- package/Rendering/thinDepthPeelingRenderer.js +8 -0
- package/Rendering/thinDepthPeelingRenderer.js.map +1 -1
- package/Shaders/gaussianSplatting.fragment.js +8 -2
- package/Shaders/gaussianSplatting.fragment.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +8 -2
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.fragment.js +7 -1
- package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +8 -2
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +22 -1
- package/scene.js +15 -15
- package/scene.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smartFilterTextureBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Dual/smartFilterTextureBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\nimport { CurrentScreenBlock } from \"./currentScreenBlock\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\nimport { InputBlock } from \"../Input/inputBlock\";\nimport type { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\nimport type { NodeMaterial } from \"../../nodeMaterial\";\nimport type { Scene } from \"core/scene\";\nimport { SfeModeDefine } from \"../Fragment/smartFilterFragmentOutputBlock\";\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\nimport type { Nullable } from \"../../../../types\";\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\nimport { ImageSourceBlock } from \"./imageSourceBlock\";\n\n/**\n * Base block used for creating Smart Filter shader blocks for the SFE framework.\n * This block extends the functionality of CurrentScreenBlock, as both are used\n * to represent arbitrary 2D textures to compose, and work similarly.\n */\nexport class SmartFilterTextureBlock extends CurrentScreenBlock {\n private _firstInit: boolean = true;\n\n /**\n * A boolean indicating whether this block should be the main input for the SFE pipeline.\n * If true, it can be used in SFE for auto-disabling.\n */\n public isMainInput: boolean = false;\n\n /**\n * Gets the sampler name associated with this texture\n */\n public override get samplerName(): string {\n if (this.source.connectedPoint) {\n return (this.source.connectedPoint.ownerBlock as ImageSourceBlock).samplerName;\n }\n return this._samplerName;\n }\n\n /**\n * Gets or sets the texture associated with this block\n */\n public override get texture(): Nullable<BaseTexture> {\n if (this.source.connectedPoint) {\n return (this.source.connectedPoint.ownerBlock as ImageSourceBlock).texture;\n }\n return this._texture;\n }\n public override set texture(value: Nullable<BaseTexture>) {\n this._texture = value;\n }\n\n /**\n * Create a new SmartFilterTextureBlock\n * @param name defines the block name\n */\n public constructor(name: string) {\n super(name);\n\n this.registerInput(\n \"source\",\n NodeMaterialBlockConnectionPointTypes.Object,\n true,\n NodeMaterialBlockTargets.VertexAndFragment,\n new NodeMaterialConnectionPointCustomObject(\"source\", this, NodeMaterialConnectionPointDirection.Input, ImageSourceBlock, \"ImageSourceBlock\")\n );\n }\n\n /**\n * Gets the source input component\n */\n public get source(): NodeMaterialConnectionPoint {\n return this._inputs[1];\n }\n\n /**\n * Gets a boolean indicating that this block is linked to an ImageSourceBlock\n */\n public get hasImageSource(): boolean {\n return this.source.isConnected;\n }\n\n /**\n * Gets the current class name\n * @returns the class name\n */\n public override getClassName() {\n return \"SmartFilterTextureBlock\";\n }\n\n /**\n * Initialize the block and prepare the context for build\n * @param state defines the state that will be used for the build\n */\n public override initialize(state: NodeMaterialBuildState) {\n if (this._firstInit) {\n this._samplerName = state._getFreeVariableName(this.name);\n this._firstInit = false;\n }\n }\n\n protected override _getMainUvName(state: NodeMaterialBuildState): string {\n // Get the ScreenUVBlock's name, which is required for SFE and should be vUV.\n // NOTE: In the future, when we move to vertex shaders, update this to check for the nearest vec2 varying output.\n const screenUv = state.sharedData.nodeMaterial.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"postprocess_uv\");\n if (!screenUv || !screenUv.isAnAncestorOf(this)) {\n state.sharedData.raiseBuildError(\"SmartFilterTextureBlock: 'postprocess_uv' attribute from ScreenUVBlock is required.\");\n return \"\";\n }\n return screenUv.associatedVariableName;\n }\n\n protected override _emitUvAndSampler(state: NodeMaterialBuildState): void {\n if (state.target === NodeMaterialBlockTargets.Fragment) {\n // Wrap the varying in a define, as it won't be needed in SFE.\n state._emitVaryingFromString(this._mainUVName, NodeMaterialBlockConnectionPointTypes.Vector2, SfeModeDefine, true);\n\n if (!this.hasImageSource) {\n // Append `// main` to denote this as the main input texture to composite\n const annotation = this.isMainInput ? \"// main\" : undefined;\n state._emit2DSampler(this._samplerName, undefined, undefined, annotation);\n }\n }\n }\n\n public override autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\n if (!this.uv.isConnected) {\n let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"postprocess_uv\" && additionalFilteringInfo(b));\n\n if (!uvInput) {\n uvInput = new InputBlock(\"uv\");\n uvInput.setAsAttribute(\"postprocess_uv\");\n }\n uvInput.output.connectTo(this.uv);\n }\n }\n\n public override _postBuildBlock(): void {\n this._firstInit = true;\n }\n\n public override serialize(): any {\n const serializationObject = super.serialize();\n serializationObject.isMainInput = this.isMainInput;\n return serializationObject;\n }\n\n public override _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\n super._deserialize(serializationObject, scene, rootUrl);\n this.isMainInput = serializationObject.isMainInput;\n }\n}\n\nRegisterClass(\"BABYLON.SmartFilterTextureBlock\", SmartFilterTextureBlock);\n"]}
|
|
1
|
+
{"version":3,"file":"smartFilterTextureBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Dual/smartFilterTextureBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\nimport { CurrentScreenBlock } from \"./currentScreenBlock\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\nimport { InputBlock } from \"../Input/inputBlock\";\nimport type { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\nimport type { NodeMaterial } from \"../../nodeMaterial\";\nimport type { Scene } from \"core/scene\";\nimport { SfeModeDefine } from \"../Fragment/smartFilterFragmentOutputBlock\";\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\nimport type { Nullable } from \"../../../../types\";\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\nimport { ImageSourceBlock } from \"./imageSourceBlock\";\n\n/**\n * Base block used for creating Smart Filter shader blocks for the SFE framework.\n * This block extends the functionality of CurrentScreenBlock, as both are used\n * to represent arbitrary 2D textures to compose, and work similarly.\n */\nexport class SmartFilterTextureBlock extends CurrentScreenBlock {\n private _firstInit: boolean = true;\n\n /**\n * A boolean indicating whether this block should be the main input for the SFE pipeline.\n * If true, it can be used in SFE for auto-disabling.\n */\n public isMainInput: boolean = false;\n\n /**\n * Gets the sampler name associated with this texture\n */\n public override get samplerName(): string {\n if (this.source.connectedPoint) {\n return (this.source.connectedPoint.ownerBlock as ImageSourceBlock).samplerName;\n }\n return this._samplerName;\n }\n\n /**\n * Gets or sets the texture associated with this block\n */\n public override get texture(): Nullable<BaseTexture> {\n if (this.source.connectedPoint) {\n return (this.source.connectedPoint.ownerBlock as ImageSourceBlock).texture;\n }\n return this._texture;\n }\n public override set texture(value: Nullable<BaseTexture>) {\n this._texture = value;\n }\n\n /**\n * Create a new SmartFilterTextureBlock\n * @param name defines the block name\n */\n public constructor(name: string) {\n super(name);\n\n this.registerInput(\n \"source\",\n NodeMaterialBlockConnectionPointTypes.Object,\n true,\n NodeMaterialBlockTargets.VertexAndFragment,\n new NodeMaterialConnectionPointCustomObject(\"source\", this, NodeMaterialConnectionPointDirection.Input, ImageSourceBlock, \"ImageSourceBlock\")\n );\n }\n\n /**\n * Gets the source input component\n */\n public get source(): NodeMaterialConnectionPoint {\n return this._inputs[1];\n }\n\n /**\n * Gets a boolean indicating that this block is linked to an ImageSourceBlock\n */\n public get hasImageSource(): boolean {\n return this.source.isConnected;\n }\n\n /**\n * Gets the current class name\n * @returns the class name\n */\n public override getClassName() {\n return \"SmartFilterTextureBlock\";\n }\n\n /**\n * Initialize the block and prepare the context for build\n * @param state defines the state that will be used for the build\n */\n public override initialize(state: NodeMaterialBuildState) {\n if (this._firstInit) {\n this._samplerName = state._getFreeVariableName(this.name);\n this._firstInit = false;\n }\n }\n\n protected override _getMainUvName(state: NodeMaterialBuildState): string {\n // Get the ScreenUVBlock's name, which is required for SFE and should be vUV.\n // NOTE: In the future, when we move to vertex shaders, update this to check for the nearest vec2 varying output.\n const screenUv = state.sharedData.nodeMaterial.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"postprocess_uv\");\n if (!screenUv || !screenUv.isAnAncestorOf(this)) {\n state.sharedData.raiseBuildError(\"SmartFilterTextureBlock: 'postprocess_uv' attribute from ScreenUVBlock is required.\");\n return \"\";\n }\n return screenUv.associatedVariableName;\n }\n\n protected override _emitUvAndSampler(state: NodeMaterialBuildState): void {\n if (state.target === NodeMaterialBlockTargets.Fragment) {\n // Wrap the varying in a define, as it won't be needed in SFE.\n state._emitVaryingFromString(this._mainUVName, NodeMaterialBlockConnectionPointTypes.Vector2, SfeModeDefine, true);\n\n if (!this.hasImageSource) {\n // Append `// main` to denote this as the main input texture to composite\n const annotation = this.isMainInput ? \"// main\" : undefined;\n state._emit2DSampler(this._samplerName, undefined, undefined, annotation);\n }\n }\n }\n\n /**\n * Auto configure the block based on the material\n * @param material - the node material\n * @param additionalFilteringInfo - optional filtering info\n */\n public override autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\n if (!this.uv.isConnected) {\n let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"postprocess_uv\" && additionalFilteringInfo(b));\n\n if (!uvInput) {\n uvInput = new InputBlock(\"uv\");\n uvInput.setAsAttribute(\"postprocess_uv\");\n }\n uvInput.output.connectTo(this.uv);\n }\n }\n\n /** {@inheritDoc} */\n public override _postBuildBlock(): void {\n this._firstInit = true;\n }\n\n /**\n * Serializes the block\n * @returns the serialized object\n */\n public override serialize(): any {\n const serializationObject = super.serialize();\n serializationObject.isMainInput = this.isMainInput;\n return serializationObject;\n }\n\n /**\n * Deserializes the block\n * @param serializationObject - the serialization object\n * @param scene - the scene\n * @param rootUrl - the root url\n */\n public override _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\n super._deserialize(serializationObject, scene, rootUrl);\n this.isMainInput = serializationObject.isMainInput;\n }\n}\n\nRegisterClass(\"BABYLON.SmartFilterTextureBlock\", SmartFilterTextureBlock);\n"]}
|
|
@@ -120,12 +120,35 @@ export declare class TextureBlock extends NodeMaterialBlock {
|
|
|
120
120
|
get level(): NodeMaterialConnectionPoint;
|
|
121
121
|
private _isTiedToFragment;
|
|
122
122
|
private _getEffectiveTarget;
|
|
123
|
+
/** {@inheritDoc} */
|
|
123
124
|
get target(): NodeMaterialBlockTargets;
|
|
125
|
+
/** {@inheritDoc} */
|
|
124
126
|
set target(value: NodeMaterialBlockTargets);
|
|
127
|
+
/**
|
|
128
|
+
* Auto configure the block based on the material
|
|
129
|
+
* @param material - the node material
|
|
130
|
+
* @param additionalFilteringInfo - optional filtering info
|
|
131
|
+
*/
|
|
125
132
|
autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
|
|
133
|
+
/**
|
|
134
|
+
* Initialize the list of defines
|
|
135
|
+
* @param defines - the material defines
|
|
136
|
+
*/
|
|
126
137
|
initializeDefines(defines: NodeMaterialDefines): void;
|
|
138
|
+
/**
|
|
139
|
+
* Prepare the list of defines
|
|
140
|
+
* @param defines - the material defines
|
|
141
|
+
*/
|
|
127
142
|
prepareDefines(defines: NodeMaterialDefines): void;
|
|
143
|
+
/**
|
|
144
|
+
* Checks if the block is ready
|
|
145
|
+
* @returns true if ready
|
|
146
|
+
*/
|
|
128
147
|
isReady(): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Bind data to effect
|
|
150
|
+
* @param effect - the effect to bind to
|
|
151
|
+
*/
|
|
129
152
|
bind(effect: Effect): void;
|
|
130
153
|
private get _isMixed();
|
|
131
154
|
private _injectVertexCode;
|
|
@@ -139,6 +162,17 @@ export declare class TextureBlock extends NodeMaterialBlock {
|
|
|
139
162
|
private _writeOutput;
|
|
140
163
|
protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
|
|
141
164
|
protected _dumpPropertiesCode(): string;
|
|
165
|
+
/**
|
|
166
|
+
* Serializes the block
|
|
167
|
+
* @returns the serialized object
|
|
168
|
+
*/
|
|
142
169
|
serialize(): any;
|
|
170
|
+
/**
|
|
171
|
+
* Deserializes the block
|
|
172
|
+
* @param serializationObject - the serialization object
|
|
173
|
+
* @param scene - the scene
|
|
174
|
+
* @param rootUrl - the root url
|
|
175
|
+
* @param urlRewriter - optional url rewriter
|
|
176
|
+
*/
|
|
143
177
|
_deserialize(serializationObject: any, scene: Scene, rootUrl: string, urlRewriter?: (url: string) => string): void;
|
|
144
178
|
}
|
|
@@ -254,10 +254,17 @@ export class TextureBlock extends NodeMaterialBlock {
|
|
|
254
254
|
}
|
|
255
255
|
return NodeMaterialBlockTargets.VertexAndFragment;
|
|
256
256
|
}
|
|
257
|
+
/** {@inheritDoc} */
|
|
257
258
|
get target() {
|
|
258
259
|
return this._getEffectiveTarget();
|
|
259
260
|
}
|
|
261
|
+
/** {@inheritDoc} */
|
|
260
262
|
set target(value) { }
|
|
263
|
+
/**
|
|
264
|
+
* Auto configure the block based on the material
|
|
265
|
+
* @param material - the node material
|
|
266
|
+
* @param additionalFilteringInfo - optional filtering info
|
|
267
|
+
*/
|
|
261
268
|
autoConfigure(material, additionalFilteringInfo = () => true) {
|
|
262
269
|
if (!this.uv.isConnected) {
|
|
263
270
|
if (material.mode === NodeMaterialModes.PostProcess) {
|
|
@@ -277,6 +284,10 @@ export class TextureBlock extends NodeMaterialBlock {
|
|
|
277
284
|
}
|
|
278
285
|
}
|
|
279
286
|
}
|
|
287
|
+
/**
|
|
288
|
+
* Initialize the list of defines
|
|
289
|
+
* @param defines - the material defines
|
|
290
|
+
*/
|
|
280
291
|
initializeDefines(defines) {
|
|
281
292
|
if (!defines._areTexturesDirty) {
|
|
282
293
|
return;
|
|
@@ -285,6 +296,10 @@ export class TextureBlock extends NodeMaterialBlock {
|
|
|
285
296
|
defines.setValue(this._mainUVDefineName, false, true);
|
|
286
297
|
}
|
|
287
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Prepare the list of defines
|
|
301
|
+
* @param defines - the material defines
|
|
302
|
+
*/
|
|
288
303
|
prepareDefines(defines) {
|
|
289
304
|
if (!defines._areTexturesDirty) {
|
|
290
305
|
return;
|
|
@@ -314,6 +329,10 @@ export class TextureBlock extends NodeMaterialBlock {
|
|
|
314
329
|
}
|
|
315
330
|
}
|
|
316
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* Checks if the block is ready
|
|
334
|
+
* @returns true if ready
|
|
335
|
+
*/
|
|
317
336
|
isReady() {
|
|
318
337
|
if (this._isSourcePrePass) {
|
|
319
338
|
return true;
|
|
@@ -323,6 +342,10 @@ export class TextureBlock extends NodeMaterialBlock {
|
|
|
323
342
|
}
|
|
324
343
|
return true;
|
|
325
344
|
}
|
|
345
|
+
/**
|
|
346
|
+
* Bind data to effect
|
|
347
|
+
* @param effect - the effect to bind to
|
|
348
|
+
*/
|
|
326
349
|
bind(effect) {
|
|
327
350
|
if (this._isSourcePrePass) {
|
|
328
351
|
effect.setFloat(this._textureInfoName, 1);
|
|
@@ -547,6 +570,10 @@ export class TextureBlock extends NodeMaterialBlock {
|
|
|
547
570
|
codeString += `${this._codeVariableName}.texture.coordinatesMode = ${this.texture.coordinatesMode};\n`;
|
|
548
571
|
return codeString;
|
|
549
572
|
}
|
|
573
|
+
/**
|
|
574
|
+
* Serializes the block
|
|
575
|
+
* @returns the serialized object
|
|
576
|
+
*/
|
|
550
577
|
serialize() {
|
|
551
578
|
const serializationObject = super.serialize();
|
|
552
579
|
serializationObject.convertToGammaSpace = this.convertToGammaSpace;
|
|
@@ -561,6 +588,13 @@ export class TextureBlock extends NodeMaterialBlock {
|
|
|
561
588
|
}
|
|
562
589
|
return serializationObject;
|
|
563
590
|
}
|
|
591
|
+
/**
|
|
592
|
+
* Deserializes the block
|
|
593
|
+
* @param serializationObject - the serialization object
|
|
594
|
+
* @param scene - the scene
|
|
595
|
+
* @param rootUrl - the root url
|
|
596
|
+
* @param urlRewriter - optional url rewriter
|
|
597
|
+
*/
|
|
564
598
|
_deserialize(serializationObject, scene, rootUrl, urlRewriter) {
|
|
565
599
|
super._deserialize(serializationObject, scene, rootUrl);
|
|
566
600
|
this.convertToGammaSpace = serializationObject.convertToGammaSpace;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textureBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Dual/textureBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { NodeMaterial } from \"../../nodeMaterial\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport { NodeMaterialModes } from \"../../Enums/nodeMaterialModes\";\r\nimport { Constants } from \"../../../../Engines/constants\";\r\nimport \"../../../../Shaders/ShadersInclude/helperFunctions\";\r\nimport { ImageSourceBlock } from \"./imageSourceBlock\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport { EngineStore } from \"../../../../Engines/engineStore\";\r\nimport type { PrePassTextureBlock } from \"../Input/prePassTextureBlock\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to read a texture from a sampler\r\n */\r\nexport class TextureBlock extends NodeMaterialBlock {\r\n private _defineName: string;\r\n private _linearDefineName: string;\r\n private _gammaDefineName: string;\r\n private _tempTextureRead: string;\r\n private _samplerName: string;\r\n private _transformedUVName: string;\r\n private _textureTransformName: string;\r\n private _textureInfoName: string;\r\n private _mainUVName: string;\r\n private _mainUVDefineName: string;\r\n private _fragmentOnly: boolean;\r\n private _imageSource: Nullable<ImageSourceBlock | PrePassTextureBlock>;\r\n\r\n protected _texture: Nullable<Texture>;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the block is used in fragment shader only\r\n * If false the system will allow optimizations to use it in vertex shader when possible for the uv computation\r\n */\r\n public get fragmentOnly(): boolean {\r\n return this._fragmentOnly;\r\n }\r\n\r\n public set fragmentOnly(value: boolean) {\r\n this._fragmentOnly = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the texture associated with the node\r\n */\r\n public get texture(): Nullable<Texture> {\r\n if (this.source.isConnected) {\r\n return (this.source.connectedPoint?.ownerBlock as ImageSourceBlock).texture;\r\n }\r\n return this._texture;\r\n }\r\n\r\n public set texture(texture: Nullable<Texture>) {\r\n if (this._texture === texture) {\r\n return;\r\n }\r\n\r\n const scene = texture?.getScene() ?? EngineStore.LastCreatedScene;\r\n\r\n if (!texture && scene) {\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this._texture!);\r\n });\r\n }\r\n\r\n this._texture = texture;\r\n\r\n if (texture && scene) {\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(texture);\r\n });\r\n }\r\n }\r\n\r\n private static _IsPrePassTextureBlock(block: Nullable<ImageSourceBlock | PrePassTextureBlock>): block is PrePassTextureBlock {\r\n return block?.getClassName() === \"PrePassTextureBlock\";\r\n }\r\n\r\n private get _isSourcePrePass() {\r\n return TextureBlock._IsPrePassTextureBlock(this._imageSource);\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this texture\r\n */\r\n public get samplerName(): string {\r\n if (this._imageSource) {\r\n if (!TextureBlock._IsPrePassTextureBlock(this._imageSource)) {\r\n return this._imageSource.samplerName;\r\n }\r\n if (this.source.connectedPoint) {\r\n return this._imageSource.getSamplerName(this.source.connectedPoint);\r\n }\r\n }\r\n return this._samplerName;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is linked to an ImageSourceBlock\r\n */\r\n public get hasImageSource(): boolean {\r\n return this.source.isConnected;\r\n }\r\n\r\n private _convertToGammaSpace = false;\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to gamma space\r\n */\r\n public set convertToGammaSpace(value: boolean) {\r\n if (value === this._convertToGammaSpace) {\r\n return;\r\n }\r\n\r\n this._convertToGammaSpace = value;\r\n if (this.texture) {\r\n const scene = this.texture.getScene() ?? EngineStore.LastCreatedScene;\r\n scene?.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this.texture!);\r\n });\r\n }\r\n }\r\n public get convertToGammaSpace(): boolean {\r\n return this._convertToGammaSpace;\r\n }\r\n\r\n private _convertToLinearSpace = false;\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to linear space\r\n */\r\n public set convertToLinearSpace(value: boolean) {\r\n if (value === this._convertToLinearSpace) {\r\n return;\r\n }\r\n\r\n this._convertToLinearSpace = value;\r\n if (this.texture) {\r\n const scene = this.texture.getScene() ?? EngineStore.LastCreatedScene;\r\n scene?.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this.texture!);\r\n });\r\n }\r\n }\r\n public get convertToLinearSpace(): boolean {\r\n return this._convertToLinearSpace;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if multiplication of texture with level should be disabled\r\n */\r\n public disableLevelMultiplication = false;\r\n\r\n /**\r\n * Create a new TextureBlock\r\n * @param name defines the block name\r\n * @param fragmentOnly\r\n */\r\n public constructor(name: string, fragmentOnly = false) {\r\n super(name, fragmentOnly ? NodeMaterialBlockTargets.Fragment : NodeMaterialBlockTargets.VertexAndFragment);\r\n\r\n this._fragmentOnly = fragmentOnly;\r\n\r\n this.registerInput(\"uv\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment);\r\n this.registerInput(\r\n \"source\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n true,\r\n NodeMaterialBlockTargets.VertexAndFragment,\r\n new NodeMaterialConnectionPointCustomObject(\"source\", this, NodeMaterialConnectionPointDirection.Input, ImageSourceBlock, \"ImageSourceBlock\")\r\n );\r\n this.registerInput(\"layer\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"lod\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n\r\n this.registerOutput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"r\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"g\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"b\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"a\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerOutput(\"level\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n\r\n this._inputs[0].addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4\r\n );\r\n\r\n this._inputs[0]._prioritizeVertex = !fragmentOnly;\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 \"TextureBlock\";\r\n }\r\n\r\n /**\r\n * Gets the uv input component\r\n */\r\n public get uv(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the source input component\r\n */\r\n public get source(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the layer input component\r\n */\r\n public get layer(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the LOD input component\r\n */\r\n public get lod(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the rgba output component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb output component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the r output component\r\n */\r\n public get r(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the g output component\r\n */\r\n public get g(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the b output component\r\n */\r\n public get b(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n /**\r\n * Gets the a output component\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._outputs[5];\r\n }\r\n\r\n /**\r\n * Gets the level output component\r\n */\r\n public get level(): NodeMaterialConnectionPoint {\r\n return this._outputs[6];\r\n }\r\n\r\n private _isTiedToFragment(input: NodeMaterialConnectionPoint) {\r\n if (input.target === NodeMaterialBlockTargets.Fragment) {\r\n return true;\r\n }\r\n\r\n if (input.target === NodeMaterialBlockTargets.Vertex) {\r\n return false;\r\n }\r\n\r\n if (input.target === NodeMaterialBlockTargets.Neutral || input.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n const parentBlock = input.ownerBlock;\r\n\r\n if (parentBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n return true;\r\n }\r\n\r\n for (const input of parentBlock.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n if (this._isTiedToFragment(input.connectedPoint!)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getEffectiveTarget() {\r\n if (this._fragmentOnly) {\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n // TextureBlock has a special optimizations for uvs that come from the vertex shaders as they can be packed into a single varyings.\r\n // But we need to detect uvs coming from fragment then\r\n if (!this.uv.isConnected) {\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n if (this.uv.sourceBlock!.isInput) {\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n if (this._isTiedToFragment(this.uv.connectedPoint!)) {\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n public override get target() {\r\n return this._getEffectiveTarget();\r\n }\r\n\r\n public override set target(value: NodeMaterialBlockTargets) {}\r\n\r\n public override autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n if (!this.uv.isConnected) {\r\n if (material.mode === NodeMaterialModes.PostProcess) {\r\n const uvInput = material.getBlockByPredicate((b) => b.name === \"uv\" && additionalFilteringInfo(b));\r\n\r\n if (uvInput) {\r\n uvInput.connectTo(this);\r\n }\r\n } else if (material.mode !== NodeMaterialModes.ProceduralTexture) {\r\n const attributeName = material.mode === NodeMaterialModes.Particle ? \"particle_uv\" : \"uv\";\r\n\r\n let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === attributeName && additionalFilteringInfo(b));\r\n\r\n if (!uvInput) {\r\n uvInput = new InputBlock(\"uv\");\r\n uvInput.setAsAttribute(attributeName);\r\n }\r\n uvInput.output.connectTo(this.uv);\r\n }\r\n }\r\n }\r\n\r\n public override initializeDefines(defines: NodeMaterialDefines) {\r\n if (!defines._areTexturesDirty) {\r\n return;\r\n }\r\n\r\n if (this._mainUVDefineName !== undefined) {\r\n defines.setValue(this._mainUVDefineName, false, true);\r\n }\r\n }\r\n\r\n public override prepareDefines(defines: NodeMaterialDefines) {\r\n if (!defines._areTexturesDirty) {\r\n return;\r\n }\r\n\r\n if (!this.texture || !this.texture.getTextureMatrix) {\r\n if (this._isMixed) {\r\n defines.setValue(this._defineName, false, true);\r\n defines.setValue(this._mainUVDefineName, true, true);\r\n }\r\n return;\r\n }\r\n\r\n const toGamma = this.convertToGammaSpace && this.texture && !this.texture.gammaSpace;\r\n const toLinear = this.convertToLinearSpace && this.texture && this.texture.gammaSpace;\r\n\r\n // Not a bug... Name defines the texture space not the required conversion\r\n defines.setValue(this._linearDefineName, toGamma, true);\r\n defines.setValue(this._gammaDefineName, toLinear, true);\r\n\r\n if (this._isMixed) {\r\n if (!this.texture.getTextureMatrix().isIdentityAs3x2()) {\r\n defines.setValue(this._defineName, true);\r\n if (defines[this._mainUVDefineName] == undefined) {\r\n defines.setValue(this._mainUVDefineName, false, true);\r\n }\r\n } else {\r\n defines.setValue(this._defineName, false, true);\r\n defines.setValue(this._mainUVDefineName, true, true);\r\n }\r\n }\r\n }\r\n\r\n public override isReady() {\r\n if (this._isSourcePrePass) {\r\n return true;\r\n }\r\n\r\n if (this.texture && !this.texture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public override bind(effect: Effect) {\r\n if (this._isSourcePrePass) {\r\n effect.setFloat(this._textureInfoName, 1);\r\n }\r\n\r\n if (!this.texture) {\r\n return;\r\n }\r\n\r\n if (this._isMixed) {\r\n effect.setFloat(this._textureInfoName, this.texture.level);\r\n effect.setMatrix(this._textureTransformName, this.texture.getTextureMatrix());\r\n }\r\n\r\n if (!this._imageSource) {\r\n effect.setTexture(this._samplerName, this.texture);\r\n }\r\n }\r\n\r\n private get _isMixed() {\r\n return this.target !== NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n private _injectVertexCode(state: NodeMaterialBuildState) {\r\n const uvInput = this.uv;\r\n\r\n // Inject code in vertex\r\n this._defineName = state._getFreeDefineName(\"UVTRANSFORM\");\r\n this._mainUVDefineName = \"VMAIN\" + uvInput.declarationVariableName.toUpperCase();\r\n\r\n this._mainUVName = \"vMain\" + uvInput.declarationVariableName;\r\n this._transformedUVName = state._getFreeVariableName(\"transformedUV\");\r\n this._textureTransformName = state._getFreeVariableName(\"textureTransform\");\r\n this._textureInfoName = state._getFreeVariableName(\"textureInfoName\");\r\n\r\n this.level.associatedVariableName = this._textureInfoName;\r\n\r\n state._emitVaryingFromString(this._transformedUVName, NodeMaterialBlockConnectionPointTypes.Vector2, this._defineName);\r\n state._emitVaryingFromString(this._mainUVName, NodeMaterialBlockConnectionPointTypes.Vector2, this._mainUVDefineName);\r\n\r\n state._emitUniformFromString(this._textureTransformName, NodeMaterialBlockConnectionPointTypes.Matrix, this._defineName);\r\n\r\n const vec4 = state._getShaderType(NodeMaterialBlockConnectionPointTypes.Vector4);\r\n const vec2 = state._getShaderType(NodeMaterialBlockConnectionPointTypes.Vector2);\r\n\r\n state.compilationString += `#ifdef ${this._defineName}\\n`;\r\n state.compilationString += `${state._getVaryingName(this._transformedUVName)} = ${vec2}(${this._textureTransformName} * ${vec4}(${uvInput.associatedVariableName}.xy, 1.0, 0.0));\\n`;\r\n state.compilationString += `#elif defined(${this._mainUVDefineName})\\n`;\r\n\r\n let automaticPrefix = \"\";\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n if (uvInput.isConnectedToInputBlock && uvInput.associatedVariableName.indexOf(\"vertexInputs.\") === -1) {\r\n automaticPrefix = \"vertexInputs.\"; // Force the prefix\r\n }\r\n }\r\n\r\n state.compilationString += `${state._getVaryingName(this._mainUVName)} = ${automaticPrefix}${uvInput.associatedVariableName}.xy;\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n if (!this._outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return;\r\n }\r\n\r\n this._writeTextureRead(state, true);\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints && output.name !== \"level\") {\r\n this._writeOutput(state, output, output.name, true);\r\n }\r\n }\r\n }\r\n\r\n private _getUVW(uvName: string): string {\r\n let coords = uvName;\r\n\r\n const is2DArrayTexture = this._texture?._texture?.is2DArray ?? false;\r\n const is3D = this._texture?._texture?.is3D ?? false;\r\n\r\n if (is2DArrayTexture) {\r\n const layerValue = this.layer.isConnected ? this.layer.associatedVariableName : \"0\";\r\n coords = `vec3(${uvName}, ${layerValue})`;\r\n } else if (is3D) {\r\n const layerValue = this.layer.isConnected ? this.layer.associatedVariableName : \"0\";\r\n coords = `vec3(${uvName}, ${layerValue})`;\r\n }\r\n\r\n return coords;\r\n }\r\n\r\n private _samplerFunc(state: NodeMaterialBuildState) {\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n return state.target === NodeMaterialBlockTargets.Vertex ? \"textureSampleLevel\" : \"textureSample\";\r\n }\r\n return this.lod.isConnected ? \"texture2DLodEXT\" : \"texture2D\";\r\n }\r\n\r\n private get _samplerLodSuffix() {\r\n return this.lod.isConnected ? `, ${this.lod.associatedVariableName}` : \"\";\r\n }\r\n\r\n private _generateTextureSample(uv: string, state: NodeMaterialBuildState) {\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n const isVertex = state.target === NodeMaterialBlockTargets.Vertex;\r\n return `${this._samplerFunc(state)}(${this.samplerName},${this.samplerName + Constants.AUTOSAMPLERSUFFIX}, ${this._getUVW(uv)}${this._samplerLodSuffix}${isVertex ? \", 0\" : \"\"})`;\r\n }\r\n return `${this._samplerFunc(state)}(${this.samplerName}, ${this._getUVW(uv)}${this._samplerLodSuffix})`;\r\n }\r\n\r\n private _generateTextureLookup(state: NodeMaterialBuildState): void {\r\n state.compilationString += `#ifdef ${this._defineName}\\n`;\r\n state.compilationString += `${state._declareLocalVar(this._tempTextureRead, NodeMaterialBlockConnectionPointTypes.Vector4)} = ${this._generateTextureSample(state._getVaryingName(this._transformedUVName), state)};\\n`;\r\n state.compilationString += `#elif defined(${this._mainUVDefineName})\\n`;\r\n state.compilationString += `${state._declareLocalVar(this._tempTextureRead, NodeMaterialBlockConnectionPointTypes.Vector4)} = ${this._generateTextureSample(this._mainUVName ? state._getVaryingName(this._mainUVName) : this.uv.associatedVariableName, state)}${this._samplerLodSuffix};\\n`;\r\n state.compilationString += `#endif\\n`;\r\n }\r\n\r\n private _writeTextureRead(state: NodeMaterialBuildState, vertexMode = false) {\r\n const uvInput = this.uv;\r\n\r\n if (vertexMode) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n this._generateTextureLookup(state);\r\n return;\r\n }\r\n\r\n if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `${state._declareLocalVar(this._tempTextureRead, NodeMaterialBlockConnectionPointTypes.Vector4)} = ${this._generateTextureSample(uvInput.associatedVariableName, state)}${this._samplerLodSuffix};\\n`;\r\n return;\r\n }\r\n\r\n this._generateTextureLookup(state);\r\n }\r\n\r\n private _generateConversionCode(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string): void {\r\n if (swizzle !== \"a\") {\r\n // no conversion if the output is \"a\" (alpha)\r\n if (!this.texture || !this.texture.gammaSpace) {\r\n state.compilationString += `#ifdef ${this._linearDefineName}\r\n ${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName});\r\n #endif\r\n `;\r\n }\r\n\r\n state.compilationString += `#ifdef ${this._gammaDefineName}\r\n ${output.associatedVariableName} = ${state._toLinearSpace(output)};\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n private _writeOutput(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string, vertexMode = false) {\r\n if (vertexMode) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(output)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n this._generateConversionCode(state, output, swizzle);\r\n return;\r\n }\r\n\r\n if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `${state._declareOutput(output)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n this._generateConversionCode(state, output, swizzle);\r\n return;\r\n }\r\n let complement = \"\";\r\n\r\n if (!this.disableLevelMultiplication) {\r\n complement = ` * ${(state.shaderLanguage === ShaderLanguage.WGSL ? \"uniforms.\" : \"\") + this._textureInfoName}`;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(output)} = ${this._tempTextureRead}.${swizzle}${complement};\\n`;\r\n this._generateConversionCode(state, output, swizzle);\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (this.source.isConnected) {\r\n this._imageSource = this.source.connectedPoint!.ownerBlock as ImageSourceBlock;\r\n } else {\r\n this._imageSource = null;\r\n }\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex || this._fragmentOnly || state.target === NodeMaterialBlockTargets.Fragment) {\r\n this._tempTextureRead = state._getFreeVariableName(\"tempTextureRead\");\r\n this._linearDefineName = state._getFreeDefineName(\"ISLINEAR\");\r\n this._gammaDefineName = state._getFreeDefineName(\"ISGAMMA\");\r\n }\r\n\r\n if ((!this._isMixed && state.target === NodeMaterialBlockTargets.Fragment) || (this._isMixed && state.target === NodeMaterialBlockTargets.Vertex)) {\r\n if (!this._imageSource) {\r\n const varName = state._getFreeVariableName(this.name);\r\n this._samplerName = varName + \"Texture\";\r\n\r\n if (this._texture?._texture?.is2DArray) {\r\n state._emit2DArraySampler(this._samplerName);\r\n } else {\r\n state._emit2DSampler(this._samplerName);\r\n }\r\n }\r\n\r\n // Declarations\r\n state.sharedData.blockingBlocks.push(this);\r\n state.sharedData.textureBlocks.push(this);\r\n state.sharedData.blocksWithDefines.push(this);\r\n state.sharedData.bindableBlocks.push(this);\r\n }\r\n\r\n if (state.target !== NodeMaterialBlockTargets.Fragment) {\r\n // Vertex\r\n this._injectVertexCode(state);\r\n return;\r\n }\r\n\r\n // Fragment\r\n if (!this._outputs.some((o) => o.isConnectedInFragmentShader)) {\r\n return;\r\n }\r\n\r\n if (this._isMixed && !this._imageSource) {\r\n // Reexport the sampler\r\n if (this._texture?._texture?.is2DArray) {\r\n state._emit2DArraySampler(this._samplerName);\r\n } else {\r\n state._emit2DSampler(this._samplerName);\r\n }\r\n }\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n if (this._isMixed) {\r\n state._emitUniformFromString(this._textureInfoName, NodeMaterialBlockConnectionPointTypes.Float);\r\n }\r\n\r\n this._writeTextureRead(state);\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints && output.name !== \"level\") {\r\n this._writeOutput(state, output, output.name);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n\r\n codeString += `${this._codeVariableName}.convertToGammaSpace = ${this.convertToGammaSpace};\\n`;\r\n codeString += `${this._codeVariableName}.convertToLinearSpace = ${this.convertToLinearSpace};\\n`;\r\n codeString += `${this._codeVariableName}.disableLevelMultiplication = ${this.disableLevelMultiplication};\\n`;\r\n\r\n if (!this.texture) {\r\n return codeString;\r\n }\r\n\r\n codeString += `${this._codeVariableName}.texture = new BABYLON.Texture(\"${this.texture.name}\", null, ${this.texture.noMipmap}, ${this.texture.invertY}, ${this.texture.samplingMode});\\n`;\r\n codeString += `${this._codeVariableName}.texture.wrapU = ${this.texture.wrapU};\\n`;\r\n codeString += `${this._codeVariableName}.texture.wrapV = ${this.texture.wrapV};\\n`;\r\n codeString += `${this._codeVariableName}.texture.uAng = ${this.texture.uAng};\\n`;\r\n codeString += `${this._codeVariableName}.texture.vAng = ${this.texture.vAng};\\n`;\r\n codeString += `${this._codeVariableName}.texture.wAng = ${this.texture.wAng};\\n`;\r\n codeString += `${this._codeVariableName}.texture.uOffset = ${this.texture.uOffset};\\n`;\r\n codeString += `${this._codeVariableName}.texture.vOffset = ${this.texture.vOffset};\\n`;\r\n codeString += `${this._codeVariableName}.texture.uScale = ${this.texture.uScale};\\n`;\r\n codeString += `${this._codeVariableName}.texture.vScale = ${this.texture.vScale};\\n`;\r\n codeString += `${this._codeVariableName}.texture.coordinatesMode = ${this.texture.coordinatesMode};\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n serializationObject.fragmentOnly = this._fragmentOnly;\r\n serializationObject.disableLevelMultiplication = this.disableLevelMultiplication;\r\n if (\r\n !this.hasImageSource &&\r\n this.texture &&\r\n (NodeMaterial.AllowSerializationOfRenderTargetTextures || !this.texture.isRenderTarget) &&\r\n this.texture.getClassName() !== \"VideoTexture\"\r\n ) {\r\n serializationObject.texture = this.texture.serialize();\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any, scene: Scene, rootUrl: string, urlRewriter?: (url: string) => string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.convertToGammaSpace = serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;\r\n this._fragmentOnly = !!serializationObject.fragmentOnly;\r\n this.disableLevelMultiplication = !!serializationObject.disableLevelMultiplication;\r\n\r\n if (serializationObject.texture && !NodeMaterial.IgnoreTexturesAtLoadTime) {\r\n if (serializationObject.texture.url !== undefined) {\r\n if (serializationObject.texture.url.indexOf(\"data:\") === 0) {\r\n rootUrl = \"\";\r\n } else if (urlRewriter) {\r\n serializationObject.texture.url = urlRewriter(serializationObject.texture.url);\r\n serializationObject.texture.name = serializationObject.texture.url;\r\n }\r\n }\r\n if (serializationObject.texture.base64String || serializationObject.texture.url !== undefined) {\r\n this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl) as Texture;\r\n }\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TextureBlock\", TextureBlock);\r\n"]}
|
|
1
|
+
{"version":3,"file":"textureBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Dual/textureBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { NodeMaterial } from \"../../nodeMaterial\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport { NodeMaterialModes } from \"../../Enums/nodeMaterialModes\";\r\nimport { Constants } from \"../../../../Engines/constants\";\r\nimport \"../../../../Shaders/ShadersInclude/helperFunctions\";\r\nimport { ImageSourceBlock } from \"./imageSourceBlock\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport { EngineStore } from \"../../../../Engines/engineStore\";\r\nimport type { PrePassTextureBlock } from \"../Input/prePassTextureBlock\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to read a texture from a sampler\r\n */\r\nexport class TextureBlock extends NodeMaterialBlock {\r\n private _defineName: string;\r\n private _linearDefineName: string;\r\n private _gammaDefineName: string;\r\n private _tempTextureRead: string;\r\n private _samplerName: string;\r\n private _transformedUVName: string;\r\n private _textureTransformName: string;\r\n private _textureInfoName: string;\r\n private _mainUVName: string;\r\n private _mainUVDefineName: string;\r\n private _fragmentOnly: boolean;\r\n private _imageSource: Nullable<ImageSourceBlock | PrePassTextureBlock>;\r\n\r\n protected _texture: Nullable<Texture>;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the block is used in fragment shader only\r\n * If false the system will allow optimizations to use it in vertex shader when possible for the uv computation\r\n */\r\n public get fragmentOnly(): boolean {\r\n return this._fragmentOnly;\r\n }\r\n\r\n public set fragmentOnly(value: boolean) {\r\n this._fragmentOnly = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the texture associated with the node\r\n */\r\n public get texture(): Nullable<Texture> {\r\n if (this.source.isConnected) {\r\n return (this.source.connectedPoint?.ownerBlock as ImageSourceBlock).texture;\r\n }\r\n return this._texture;\r\n }\r\n\r\n public set texture(texture: Nullable<Texture>) {\r\n if (this._texture === texture) {\r\n return;\r\n }\r\n\r\n const scene = texture?.getScene() ?? EngineStore.LastCreatedScene;\r\n\r\n if (!texture && scene) {\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this._texture!);\r\n });\r\n }\r\n\r\n this._texture = texture;\r\n\r\n if (texture && scene) {\r\n scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(texture);\r\n });\r\n }\r\n }\r\n\r\n private static _IsPrePassTextureBlock(block: Nullable<ImageSourceBlock | PrePassTextureBlock>): block is PrePassTextureBlock {\r\n return block?.getClassName() === \"PrePassTextureBlock\";\r\n }\r\n\r\n private get _isSourcePrePass() {\r\n return TextureBlock._IsPrePassTextureBlock(this._imageSource);\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this texture\r\n */\r\n public get samplerName(): string {\r\n if (this._imageSource) {\r\n if (!TextureBlock._IsPrePassTextureBlock(this._imageSource)) {\r\n return this._imageSource.samplerName;\r\n }\r\n if (this.source.connectedPoint) {\r\n return this._imageSource.getSamplerName(this.source.connectedPoint);\r\n }\r\n }\r\n return this._samplerName;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is linked to an ImageSourceBlock\r\n */\r\n public get hasImageSource(): boolean {\r\n return this.source.isConnected;\r\n }\r\n\r\n private _convertToGammaSpace = false;\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to gamma space\r\n */\r\n public set convertToGammaSpace(value: boolean) {\r\n if (value === this._convertToGammaSpace) {\r\n return;\r\n }\r\n\r\n this._convertToGammaSpace = value;\r\n if (this.texture) {\r\n const scene = this.texture.getScene() ?? EngineStore.LastCreatedScene;\r\n scene?.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this.texture!);\r\n });\r\n }\r\n }\r\n public get convertToGammaSpace(): boolean {\r\n return this._convertToGammaSpace;\r\n }\r\n\r\n private _convertToLinearSpace = false;\r\n /**\r\n * Gets or sets a boolean indicating if content needs to be converted to linear space\r\n */\r\n public set convertToLinearSpace(value: boolean) {\r\n if (value === this._convertToLinearSpace) {\r\n return;\r\n }\r\n\r\n this._convertToLinearSpace = value;\r\n if (this.texture) {\r\n const scene = this.texture.getScene() ?? EngineStore.LastCreatedScene;\r\n scene?.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag, (mat) => {\r\n return mat.hasTexture(this.texture!);\r\n });\r\n }\r\n }\r\n public get convertToLinearSpace(): boolean {\r\n return this._convertToLinearSpace;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if multiplication of texture with level should be disabled\r\n */\r\n public disableLevelMultiplication = false;\r\n\r\n /**\r\n * Create a new TextureBlock\r\n * @param name defines the block name\r\n * @param fragmentOnly\r\n */\r\n public constructor(name: string, fragmentOnly = false) {\r\n super(name, fragmentOnly ? NodeMaterialBlockTargets.Fragment : NodeMaterialBlockTargets.VertexAndFragment);\r\n\r\n this._fragmentOnly = fragmentOnly;\r\n\r\n this.registerInput(\"uv\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.VertexAndFragment);\r\n this.registerInput(\r\n \"source\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n true,\r\n NodeMaterialBlockTargets.VertexAndFragment,\r\n new NodeMaterialConnectionPointCustomObject(\"source\", this, NodeMaterialConnectionPointDirection.Input, ImageSourceBlock, \"ImageSourceBlock\")\r\n );\r\n this.registerInput(\"layer\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"lod\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n\r\n this.registerOutput(\"rgba\", NodeMaterialBlockConnectionPointTypes.Color4, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"rgb\", NodeMaterialBlockConnectionPointTypes.Color3, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"r\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"g\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"b\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n this.registerOutput(\"a\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerOutput(\"level\", NodeMaterialBlockConnectionPointTypes.Float, NodeMaterialBlockTargets.Neutral);\r\n\r\n this._inputs[0].addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Vector2 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4\r\n );\r\n\r\n this._inputs[0]._prioritizeVertex = !fragmentOnly;\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 \"TextureBlock\";\r\n }\r\n\r\n /**\r\n * Gets the uv input component\r\n */\r\n public get uv(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the source input component\r\n */\r\n public get source(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the layer input component\r\n */\r\n public get layer(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the LOD input component\r\n */\r\n public get lod(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the rgba output component\r\n */\r\n public get rgba(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the rgb output component\r\n */\r\n public get rgb(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the r output component\r\n */\r\n public get r(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the g output component\r\n */\r\n public get g(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the b output component\r\n */\r\n public get b(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n /**\r\n * Gets the a output component\r\n */\r\n public get a(): NodeMaterialConnectionPoint {\r\n return this._outputs[5];\r\n }\r\n\r\n /**\r\n * Gets the level output component\r\n */\r\n public get level(): NodeMaterialConnectionPoint {\r\n return this._outputs[6];\r\n }\r\n\r\n private _isTiedToFragment(input: NodeMaterialConnectionPoint) {\r\n if (input.target === NodeMaterialBlockTargets.Fragment) {\r\n return true;\r\n }\r\n\r\n if (input.target === NodeMaterialBlockTargets.Vertex) {\r\n return false;\r\n }\r\n\r\n if (input.target === NodeMaterialBlockTargets.Neutral || input.target === NodeMaterialBlockTargets.VertexAndFragment) {\r\n const parentBlock = input.ownerBlock;\r\n\r\n if (parentBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n return true;\r\n }\r\n\r\n for (const input of parentBlock.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n if (this._isTiedToFragment(input.connectedPoint!)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getEffectiveTarget() {\r\n if (this._fragmentOnly) {\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n // TextureBlock has a special optimizations for uvs that come from the vertex shaders as they can be packed into a single varyings.\r\n // But we need to detect uvs coming from fragment then\r\n if (!this.uv.isConnected) {\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n if (this.uv.sourceBlock!.isInput) {\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n if (this._isTiedToFragment(this.uv.connectedPoint!)) {\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n return NodeMaterialBlockTargets.VertexAndFragment;\r\n }\r\n\r\n /** {@inheritDoc} */\r\n public override get target() {\r\n return this._getEffectiveTarget();\r\n }\r\n\r\n /** {@inheritDoc} */\r\n public override set target(value: NodeMaterialBlockTargets) {}\r\n\r\n /**\r\n * Auto configure the block based on the material\r\n * @param material - the node material\r\n * @param additionalFilteringInfo - optional filtering info\r\n */\r\n public override autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n if (!this.uv.isConnected) {\r\n if (material.mode === NodeMaterialModes.PostProcess) {\r\n const uvInput = material.getBlockByPredicate((b) => b.name === \"uv\" && additionalFilteringInfo(b));\r\n\r\n if (uvInput) {\r\n uvInput.connectTo(this);\r\n }\r\n } else if (material.mode !== NodeMaterialModes.ProceduralTexture) {\r\n const attributeName = material.mode === NodeMaterialModes.Particle ? \"particle_uv\" : \"uv\";\r\n\r\n let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === attributeName && additionalFilteringInfo(b));\r\n\r\n if (!uvInput) {\r\n uvInput = new InputBlock(\"uv\");\r\n uvInput.setAsAttribute(attributeName);\r\n }\r\n uvInput.output.connectTo(this.uv);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Initialize the list of defines\r\n * @param defines - the material defines\r\n */\r\n public override initializeDefines(defines: NodeMaterialDefines) {\r\n if (!defines._areTexturesDirty) {\r\n return;\r\n }\r\n\r\n if (this._mainUVDefineName !== undefined) {\r\n defines.setValue(this._mainUVDefineName, false, true);\r\n }\r\n }\r\n\r\n /**\r\n * Prepare the list of defines\r\n * @param defines - the material defines\r\n */\r\n public override prepareDefines(defines: NodeMaterialDefines) {\r\n if (!defines._areTexturesDirty) {\r\n return;\r\n }\r\n\r\n if (!this.texture || !this.texture.getTextureMatrix) {\r\n if (this._isMixed) {\r\n defines.setValue(this._defineName, false, true);\r\n defines.setValue(this._mainUVDefineName, true, true);\r\n }\r\n return;\r\n }\r\n\r\n const toGamma = this.convertToGammaSpace && this.texture && !this.texture.gammaSpace;\r\n const toLinear = this.convertToLinearSpace && this.texture && this.texture.gammaSpace;\r\n\r\n // Not a bug... Name defines the texture space not the required conversion\r\n defines.setValue(this._linearDefineName, toGamma, true);\r\n defines.setValue(this._gammaDefineName, toLinear, true);\r\n\r\n if (this._isMixed) {\r\n if (!this.texture.getTextureMatrix().isIdentityAs3x2()) {\r\n defines.setValue(this._defineName, true);\r\n if (defines[this._mainUVDefineName] == undefined) {\r\n defines.setValue(this._mainUVDefineName, false, true);\r\n }\r\n } else {\r\n defines.setValue(this._defineName, false, true);\r\n defines.setValue(this._mainUVDefineName, true, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the block is ready\r\n * @returns true if ready\r\n */\r\n public override isReady() {\r\n if (this._isSourcePrePass) {\r\n return true;\r\n }\r\n\r\n if (this.texture && !this.texture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Bind data to effect\r\n * @param effect - the effect to bind to\r\n */\r\n public override bind(effect: Effect) {\r\n if (this._isSourcePrePass) {\r\n effect.setFloat(this._textureInfoName, 1);\r\n }\r\n\r\n if (!this.texture) {\r\n return;\r\n }\r\n\r\n if (this._isMixed) {\r\n effect.setFloat(this._textureInfoName, this.texture.level);\r\n effect.setMatrix(this._textureTransformName, this.texture.getTextureMatrix());\r\n }\r\n\r\n if (!this._imageSource) {\r\n effect.setTexture(this._samplerName, this.texture);\r\n }\r\n }\r\n\r\n private get _isMixed() {\r\n return this.target !== NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n private _injectVertexCode(state: NodeMaterialBuildState) {\r\n const uvInput = this.uv;\r\n\r\n // Inject code in vertex\r\n this._defineName = state._getFreeDefineName(\"UVTRANSFORM\");\r\n this._mainUVDefineName = \"VMAIN\" + uvInput.declarationVariableName.toUpperCase();\r\n\r\n this._mainUVName = \"vMain\" + uvInput.declarationVariableName;\r\n this._transformedUVName = state._getFreeVariableName(\"transformedUV\");\r\n this._textureTransformName = state._getFreeVariableName(\"textureTransform\");\r\n this._textureInfoName = state._getFreeVariableName(\"textureInfoName\");\r\n\r\n this.level.associatedVariableName = this._textureInfoName;\r\n\r\n state._emitVaryingFromString(this._transformedUVName, NodeMaterialBlockConnectionPointTypes.Vector2, this._defineName);\r\n state._emitVaryingFromString(this._mainUVName, NodeMaterialBlockConnectionPointTypes.Vector2, this._mainUVDefineName);\r\n\r\n state._emitUniformFromString(this._textureTransformName, NodeMaterialBlockConnectionPointTypes.Matrix, this._defineName);\r\n\r\n const vec4 = state._getShaderType(NodeMaterialBlockConnectionPointTypes.Vector4);\r\n const vec2 = state._getShaderType(NodeMaterialBlockConnectionPointTypes.Vector2);\r\n\r\n state.compilationString += `#ifdef ${this._defineName}\\n`;\r\n state.compilationString += `${state._getVaryingName(this._transformedUVName)} = ${vec2}(${this._textureTransformName} * ${vec4}(${uvInput.associatedVariableName}.xy, 1.0, 0.0));\\n`;\r\n state.compilationString += `#elif defined(${this._mainUVDefineName})\\n`;\r\n\r\n let automaticPrefix = \"\";\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n if (uvInput.isConnectedToInputBlock && uvInput.associatedVariableName.indexOf(\"vertexInputs.\") === -1) {\r\n automaticPrefix = \"vertexInputs.\"; // Force the prefix\r\n }\r\n }\r\n\r\n state.compilationString += `${state._getVaryingName(this._mainUVName)} = ${automaticPrefix}${uvInput.associatedVariableName}.xy;\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n if (!this._outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return;\r\n }\r\n\r\n this._writeTextureRead(state, true);\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints && output.name !== \"level\") {\r\n this._writeOutput(state, output, output.name, true);\r\n }\r\n }\r\n }\r\n\r\n private _getUVW(uvName: string): string {\r\n let coords = uvName;\r\n\r\n const is2DArrayTexture = this._texture?._texture?.is2DArray ?? false;\r\n const is3D = this._texture?._texture?.is3D ?? false;\r\n\r\n if (is2DArrayTexture) {\r\n const layerValue = this.layer.isConnected ? this.layer.associatedVariableName : \"0\";\r\n coords = `vec3(${uvName}, ${layerValue})`;\r\n } else if (is3D) {\r\n const layerValue = this.layer.isConnected ? this.layer.associatedVariableName : \"0\";\r\n coords = `vec3(${uvName}, ${layerValue})`;\r\n }\r\n\r\n return coords;\r\n }\r\n\r\n private _samplerFunc(state: NodeMaterialBuildState) {\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n return state.target === NodeMaterialBlockTargets.Vertex ? \"textureSampleLevel\" : \"textureSample\";\r\n }\r\n return this.lod.isConnected ? \"texture2DLodEXT\" : \"texture2D\";\r\n }\r\n\r\n private get _samplerLodSuffix() {\r\n return this.lod.isConnected ? `, ${this.lod.associatedVariableName}` : \"\";\r\n }\r\n\r\n private _generateTextureSample(uv: string, state: NodeMaterialBuildState) {\r\n if (state.shaderLanguage === ShaderLanguage.WGSL) {\r\n const isVertex = state.target === NodeMaterialBlockTargets.Vertex;\r\n return `${this._samplerFunc(state)}(${this.samplerName},${this.samplerName + Constants.AUTOSAMPLERSUFFIX}, ${this._getUVW(uv)}${this._samplerLodSuffix}${isVertex ? \", 0\" : \"\"})`;\r\n }\r\n return `${this._samplerFunc(state)}(${this.samplerName}, ${this._getUVW(uv)}${this._samplerLodSuffix})`;\r\n }\r\n\r\n private _generateTextureLookup(state: NodeMaterialBuildState): void {\r\n state.compilationString += `#ifdef ${this._defineName}\\n`;\r\n state.compilationString += `${state._declareLocalVar(this._tempTextureRead, NodeMaterialBlockConnectionPointTypes.Vector4)} = ${this._generateTextureSample(state._getVaryingName(this._transformedUVName), state)};\\n`;\r\n state.compilationString += `#elif defined(${this._mainUVDefineName})\\n`;\r\n state.compilationString += `${state._declareLocalVar(this._tempTextureRead, NodeMaterialBlockConnectionPointTypes.Vector4)} = ${this._generateTextureSample(this._mainUVName ? state._getVaryingName(this._mainUVName) : this.uv.associatedVariableName, state)}${this._samplerLodSuffix};\\n`;\r\n state.compilationString += `#endif\\n`;\r\n }\r\n\r\n private _writeTextureRead(state: NodeMaterialBuildState, vertexMode = false) {\r\n const uvInput = this.uv;\r\n\r\n if (vertexMode) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n this._generateTextureLookup(state);\r\n return;\r\n }\r\n\r\n if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `${state._declareLocalVar(this._tempTextureRead, NodeMaterialBlockConnectionPointTypes.Vector4)} = ${this._generateTextureSample(uvInput.associatedVariableName, state)}${this._samplerLodSuffix};\\n`;\r\n return;\r\n }\r\n\r\n this._generateTextureLookup(state);\r\n }\r\n\r\n private _generateConversionCode(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string): void {\r\n if (swizzle !== \"a\") {\r\n // no conversion if the output is \"a\" (alpha)\r\n if (!this.texture || !this.texture.gammaSpace) {\r\n state.compilationString += `#ifdef ${this._linearDefineName}\r\n ${output.associatedVariableName} = toGammaSpace(${output.associatedVariableName});\r\n #endif\r\n `;\r\n }\r\n\r\n state.compilationString += `#ifdef ${this._gammaDefineName}\r\n ${output.associatedVariableName} = ${state._toLinearSpace(output)};\r\n #endif\r\n `;\r\n }\r\n }\r\n\r\n private _writeOutput(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string, vertexMode = false) {\r\n if (vertexMode) {\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n return;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(output)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n this._generateConversionCode(state, output, swizzle);\r\n return;\r\n }\r\n\r\n if (this.uv.ownerBlock.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `${state._declareOutput(output)} = ${this._tempTextureRead}.${swizzle};\\n`;\r\n this._generateConversionCode(state, output, swizzle);\r\n return;\r\n }\r\n let complement = \"\";\r\n\r\n if (!this.disableLevelMultiplication) {\r\n complement = ` * ${(state.shaderLanguage === ShaderLanguage.WGSL ? \"uniforms.\" : \"\") + this._textureInfoName}`;\r\n }\r\n\r\n state.compilationString += `${state._declareOutput(output)} = ${this._tempTextureRead}.${swizzle}${complement};\\n`;\r\n this._generateConversionCode(state, output, swizzle);\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (this.source.isConnected) {\r\n this._imageSource = this.source.connectedPoint!.ownerBlock as ImageSourceBlock;\r\n } else {\r\n this._imageSource = null;\r\n }\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex || this._fragmentOnly || state.target === NodeMaterialBlockTargets.Fragment) {\r\n this._tempTextureRead = state._getFreeVariableName(\"tempTextureRead\");\r\n this._linearDefineName = state._getFreeDefineName(\"ISLINEAR\");\r\n this._gammaDefineName = state._getFreeDefineName(\"ISGAMMA\");\r\n }\r\n\r\n if ((!this._isMixed && state.target === NodeMaterialBlockTargets.Fragment) || (this._isMixed && state.target === NodeMaterialBlockTargets.Vertex)) {\r\n if (!this._imageSource) {\r\n const varName = state._getFreeVariableName(this.name);\r\n this._samplerName = varName + \"Texture\";\r\n\r\n if (this._texture?._texture?.is2DArray) {\r\n state._emit2DArraySampler(this._samplerName);\r\n } else {\r\n state._emit2DSampler(this._samplerName);\r\n }\r\n }\r\n\r\n // Declarations\r\n state.sharedData.blockingBlocks.push(this);\r\n state.sharedData.textureBlocks.push(this);\r\n state.sharedData.blocksWithDefines.push(this);\r\n state.sharedData.bindableBlocks.push(this);\r\n }\r\n\r\n if (state.target !== NodeMaterialBlockTargets.Fragment) {\r\n // Vertex\r\n this._injectVertexCode(state);\r\n return;\r\n }\r\n\r\n // Fragment\r\n if (!this._outputs.some((o) => o.isConnectedInFragmentShader)) {\r\n return;\r\n }\r\n\r\n if (this._isMixed && !this._imageSource) {\r\n // Reexport the sampler\r\n if (this._texture?._texture?.is2DArray) {\r\n state._emit2DArraySampler(this._samplerName);\r\n } else {\r\n state._emit2DSampler(this._samplerName);\r\n }\r\n }\r\n\r\n const comments = `//${this.name}`;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n if (this._isMixed) {\r\n state._emitUniformFromString(this._textureInfoName, NodeMaterialBlockConnectionPointTypes.Float);\r\n }\r\n\r\n this._writeTextureRead(state);\r\n\r\n for (const output of this._outputs) {\r\n if (output.hasEndpoints && output.name !== \"level\") {\r\n this._writeOutput(state, output, output.name);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n\r\n codeString += `${this._codeVariableName}.convertToGammaSpace = ${this.convertToGammaSpace};\\n`;\r\n codeString += `${this._codeVariableName}.convertToLinearSpace = ${this.convertToLinearSpace};\\n`;\r\n codeString += `${this._codeVariableName}.disableLevelMultiplication = ${this.disableLevelMultiplication};\\n`;\r\n\r\n if (!this.texture) {\r\n return codeString;\r\n }\r\n\r\n codeString += `${this._codeVariableName}.texture = new BABYLON.Texture(\"${this.texture.name}\", null, ${this.texture.noMipmap}, ${this.texture.invertY}, ${this.texture.samplingMode});\\n`;\r\n codeString += `${this._codeVariableName}.texture.wrapU = ${this.texture.wrapU};\\n`;\r\n codeString += `${this._codeVariableName}.texture.wrapV = ${this.texture.wrapV};\\n`;\r\n codeString += `${this._codeVariableName}.texture.uAng = ${this.texture.uAng};\\n`;\r\n codeString += `${this._codeVariableName}.texture.vAng = ${this.texture.vAng};\\n`;\r\n codeString += `${this._codeVariableName}.texture.wAng = ${this.texture.wAng};\\n`;\r\n codeString += `${this._codeVariableName}.texture.uOffset = ${this.texture.uOffset};\\n`;\r\n codeString += `${this._codeVariableName}.texture.vOffset = ${this.texture.vOffset};\\n`;\r\n codeString += `${this._codeVariableName}.texture.uScale = ${this.texture.uScale};\\n`;\r\n codeString += `${this._codeVariableName}.texture.vScale = ${this.texture.vScale};\\n`;\r\n codeString += `${this._codeVariableName}.texture.coordinatesMode = ${this.texture.coordinatesMode};\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Serializes the block\r\n * @returns the serialized object\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.convertToGammaSpace = this.convertToGammaSpace;\r\n serializationObject.convertToLinearSpace = this.convertToLinearSpace;\r\n serializationObject.fragmentOnly = this._fragmentOnly;\r\n serializationObject.disableLevelMultiplication = this.disableLevelMultiplication;\r\n if (\r\n !this.hasImageSource &&\r\n this.texture &&\r\n (NodeMaterial.AllowSerializationOfRenderTargetTextures || !this.texture.isRenderTarget) &&\r\n this.texture.getClassName() !== \"VideoTexture\"\r\n ) {\r\n serializationObject.texture = this.texture.serialize();\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Deserializes the block\r\n * @param serializationObject - the serialization object\r\n * @param scene - the scene\r\n * @param rootUrl - the root url\r\n * @param urlRewriter - optional url rewriter\r\n */\r\n public override _deserialize(serializationObject: any, scene: Scene, rootUrl: string, urlRewriter?: (url: string) => string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.convertToGammaSpace = serializationObject.convertToGammaSpace;\r\n this.convertToLinearSpace = !!serializationObject.convertToLinearSpace;\r\n this._fragmentOnly = !!serializationObject.fragmentOnly;\r\n this.disableLevelMultiplication = !!serializationObject.disableLevelMultiplication;\r\n\r\n if (serializationObject.texture && !NodeMaterial.IgnoreTexturesAtLoadTime) {\r\n if (serializationObject.texture.url !== undefined) {\r\n if (serializationObject.texture.url.indexOf(\"data:\") === 0) {\r\n rootUrl = \"\";\r\n } else if (urlRewriter) {\r\n serializationObject.texture.url = urlRewriter(serializationObject.texture.url);\r\n serializationObject.texture.name = serializationObject.texture.url;\r\n }\r\n }\r\n if (serializationObject.texture.base64String || serializationObject.texture.url !== undefined) {\r\n this.texture = Texture.Parse(serializationObject.texture, scene, rootUrl) as Texture;\r\n }\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TextureBlock\", TextureBlock);\r\n"]}
|
|
@@ -51,9 +51,26 @@ export declare class TBNBlock extends NodeMaterialBlock {
|
|
|
51
51
|
* Gets the row2 of the output matrix
|
|
52
52
|
*/
|
|
53
53
|
get row2(): NodeMaterialConnectionPoint;
|
|
54
|
+
/**
|
|
55
|
+
* Gets the block target
|
|
56
|
+
*/
|
|
54
57
|
get target(): NodeMaterialBlockTargets;
|
|
58
|
+
/**
|
|
59
|
+
* Sets the block target
|
|
60
|
+
*/
|
|
55
61
|
set target(value: NodeMaterialBlockTargets);
|
|
62
|
+
/**
|
|
63
|
+
* Auto configure the block based on the material
|
|
64
|
+
* @param material - defines the hosting NodeMaterial
|
|
65
|
+
* @param additionalFilteringInfo - defines additional filtering info
|
|
66
|
+
*/
|
|
56
67
|
autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
|
|
68
|
+
/**
|
|
69
|
+
* Prepare the list of defines
|
|
70
|
+
* @param defines - defines the list of defines to update
|
|
71
|
+
* @param nodeMaterial - defines the node material requesting the update
|
|
72
|
+
* @param mesh - defines the mesh to bind data for
|
|
73
|
+
*/
|
|
57
74
|
prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
|
|
58
75
|
protected _buildBlock(state: NodeMaterialBuildState): this;
|
|
59
76
|
}
|
|
@@ -8,7 +8,6 @@ import { InputBlock } from "../Input/inputBlock.js";
|
|
|
8
8
|
/**
|
|
9
9
|
* Block used to implement TBN matrix
|
|
10
10
|
*/
|
|
11
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
12
11
|
export class TBNBlock extends NodeMaterialBlock {
|
|
13
12
|
/**
|
|
14
13
|
* Create a new TBNBlock
|
|
@@ -63,7 +62,6 @@ export class TBNBlock extends NodeMaterialBlock {
|
|
|
63
62
|
/**
|
|
64
63
|
* Gets the TBN output component
|
|
65
64
|
*/
|
|
66
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
67
65
|
get TBN() {
|
|
68
66
|
return this._outputs[0];
|
|
69
67
|
}
|
|
@@ -85,10 +83,21 @@ export class TBNBlock extends NodeMaterialBlock {
|
|
|
85
83
|
get row2() {
|
|
86
84
|
return this._outputs[3];
|
|
87
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Gets the block target
|
|
88
|
+
*/
|
|
88
89
|
get target() {
|
|
89
90
|
return NodeMaterialBlockTargets.Fragment;
|
|
90
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Sets the block target
|
|
94
|
+
*/
|
|
91
95
|
set target(value) { }
|
|
96
|
+
/**
|
|
97
|
+
* Auto configure the block based on the material
|
|
98
|
+
* @param material - defines the hosting NodeMaterial
|
|
99
|
+
* @param additionalFilteringInfo - defines additional filtering info
|
|
100
|
+
*/
|
|
92
101
|
autoConfigure(material, additionalFilteringInfo = () => true) {
|
|
93
102
|
if (!this.world.isConnected) {
|
|
94
103
|
let worldInput = material.getInputBlockByPredicate((b) => b.isSystemValue && b.systemValue === NodeMaterialSystemValues.World && additionalFilteringInfo(b));
|
|
@@ -115,6 +124,12 @@ export class TBNBlock extends NodeMaterialBlock {
|
|
|
115
124
|
tangentInput.output.connectTo(this.tangent);
|
|
116
125
|
}
|
|
117
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Prepare the list of defines
|
|
129
|
+
* @param defines - defines the list of defines to update
|
|
130
|
+
* @param nodeMaterial - defines the node material requesting the update
|
|
131
|
+
* @param mesh - defines the mesh to bind data for
|
|
132
|
+
*/
|
|
118
133
|
prepareDefines(defines, nodeMaterial, mesh) {
|
|
119
134
|
if (!mesh) {
|
|
120
135
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TBNBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Fragment/TBNBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { NodeMaterialSystemValues } from \"../../Enums/nodeMaterialSystemValues\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport { ShaderLanguage } from \"../../../../Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to implement TBN matrix\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class TBNBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new TBNBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment, true);\r\n\r\n this.registerInput(\"normal\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false);\r\n this.normal.addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Color4 | NodeMaterialBlockConnectionPointTypes.Vector4 | NodeMaterialBlockConnectionPointTypes.Vector3\r\n );\r\n this.registerInput(\"tangent\", NodeMaterialBlockConnectionPointTypes.Vector4, false);\r\n this.registerInput(\"world\", NodeMaterialBlockConnectionPointTypes.Matrix, false);\r\n\r\n this.registerOutput(\r\n \"TBN\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"TBN\", this, NodeMaterialConnectionPointDirection.Output, TBNBlock, \"TBNBlock\")\r\n );\r\n\r\n this.registerOutput(\"row0\", NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockTargets.Fragment);\r\n this.registerOutput(\"row1\", NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockTargets.Fragment);\r\n this.registerOutput(\"row2\", NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockTargets.Fragment);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"TBNBlock\";\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"tbnNormal\");\r\n state._excludeVariableName(\"tbnTangent\");\r\n state._excludeVariableName(\"tbnBitangent\");\r\n state._excludeVariableName(\"TBN\");\r\n }\r\n\r\n /**\r\n * Gets the normal input component\r\n */\r\n public get normal(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the tangent input component\r\n */\r\n public get tangent(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the world matrix input component\r\n */\r\n public get world(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the TBN output component\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get TBN(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the row0 of the output matrix\r\n */\r\n public get row0(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the row1 of the output matrix\r\n */\r\n public get row1(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the row2 of the output matrix\r\n */\r\n public get row2(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n public override get target() {\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n public override set target(value: NodeMaterialBlockTargets) {}\r\n\r\n public override autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n if (!this.world.isConnected) {\r\n let worldInput = material.getInputBlockByPredicate((b) => b.isSystemValue && b.systemValue === NodeMaterialSystemValues.World && additionalFilteringInfo(b));\r\n\r\n if (!worldInput) {\r\n worldInput = new InputBlock(\"world\");\r\n worldInput.setAsSystemValue(NodeMaterialSystemValues.World);\r\n }\r\n worldInput.output.connectTo(this.world);\r\n }\r\n\r\n if (!this.normal.isConnected) {\r\n let normalInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"normal\" && additionalFilteringInfo(b));\r\n\r\n if (!normalInput) {\r\n normalInput = new InputBlock(\"normal\");\r\n normalInput.setAsAttribute(\"normal\");\r\n }\r\n normalInput.output.connectTo(this.normal);\r\n }\r\n\r\n if (!this.tangent.isConnected) {\r\n let tangentInput = material.getInputBlockByPredicate(\r\n (b) => b.isAttribute && b.name === \"tangent\" && b.type === NodeMaterialBlockConnectionPointTypes.Vector4 && additionalFilteringInfo(b)\r\n );\r\n\r\n if (!tangentInput) {\r\n tangentInput = new InputBlock(\"tangent\");\r\n tangentInput.setAsAttribute(\"tangent\");\r\n }\r\n tangentInput.output.connectTo(this.tangent);\r\n }\r\n }\r\n\r\n public override prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const normal = this.normal;\r\n const tangent = this.tangent;\r\n\r\n let normalAvailable = normal.isConnected;\r\n if (normal.connectInputBlock?.isAttribute && !mesh.isVerticesDataPresent(normal.connectInputBlock?.name)) {\r\n normalAvailable = false;\r\n }\r\n\r\n let tangentAvailable = tangent.isConnected;\r\n if (tangent.connectInputBlock?.isAttribute && !mesh.isVerticesDataPresent(tangent.connectInputBlock?.name)) {\r\n tangentAvailable = false;\r\n }\r\n\r\n const useTBNBlock = normalAvailable && tangentAvailable;\r\n\r\n defines.setValue(\"TBNBLOCK\", useTBNBlock, true);\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const normal = this.normal;\r\n const tangent = this.tangent;\r\n const world = this.world;\r\n const tbn = this.TBN;\r\n const row0 = this.row0;\r\n const row1 = this.row1;\r\n const row2 = this.row2;\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n const mat3 = isWebGPU ? \"mat3x3f\" : \"mat3\";\r\n const fSuffix = isWebGPU ? \"f\" : \"\";\r\n\r\n // Fragment\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `\r\n // ${this.name}\r\n ${state._declareLocalVar(\"tbnNormal\", NodeMaterialBlockConnectionPointTypes.Vector3)} = normalize(${normal.associatedVariableName}).xyz;\r\n ${state._declareLocalVar(\"tbnTangent\", NodeMaterialBlockConnectionPointTypes.Vector3)} = normalize(${tangent.associatedVariableName}.xyz);\r\n ${state._declareLocalVar(\"tbnBitangent\", NodeMaterialBlockConnectionPointTypes.Vector3)} = cross(tbnNormal, tbnTangent) * ${tangent.associatedVariableName}.w;\r\n ${isWebGPU ? \"var\" : \"mat3\"} ${tbn.associatedVariableName} = ${mat3}(${world.associatedVariableName}[0].xyz, ${world.associatedVariableName}[1].xyz, ${world.associatedVariableName}[2].xyz) * ${mat3}(tbnTangent, tbnBitangent, tbnNormal);\r\n `;\r\n\r\n if (row0.hasEndpoints) {\r\n state.compilationString +=\r\n state._declareOutput(row0) +\r\n ` = vec3${fSuffix}(${tbn.associatedVariableName}[0][0], ${tbn.associatedVariableName}[0][1], ${tbn.associatedVariableName}[0][2]);\\n`;\r\n }\r\n if (row1.hasEndpoints) {\r\n state.compilationString +=\r\n state._declareOutput(row1) +\r\n ` = vec3${fSuffix}(${tbn.associatedVariableName}[1[0], ${tbn.associatedVariableName}[1][1], ${tbn.associatedVariableName}[1][2]);\\n`;\r\n }\r\n if (row2.hasEndpoints) {\r\n state.compilationString +=\r\n state._declareOutput(row2) +\r\n ` = vec3${fSuffix}(${tbn.associatedVariableName}[2][0], ${tbn.associatedVariableName}[2][1], ${tbn.associatedVariableName}[2][2]);\\n`;\r\n }\r\n\r\n state.sharedData.blocksWithDefines.push(this);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TBNBlock\", TBNBlock);\r\n"]}
|
|
1
|
+
{"version":3,"file":"TBNBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Fragment/TBNBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { NodeMaterialSystemValues } from \"../../Enums/nodeMaterialSystemValues\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport { ShaderLanguage } from \"../../../../Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to implement TBN matrix\r\n */\r\nexport class TBNBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new TBNBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment, true);\r\n\r\n this.registerInput(\"normal\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false);\r\n this.normal.addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Color4 | NodeMaterialBlockConnectionPointTypes.Vector4 | NodeMaterialBlockConnectionPointTypes.Vector3\r\n );\r\n this.registerInput(\"tangent\", NodeMaterialBlockConnectionPointTypes.Vector4, false);\r\n this.registerInput(\"world\", NodeMaterialBlockConnectionPointTypes.Matrix, false);\r\n\r\n this.registerOutput(\r\n \"TBN\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"TBN\", this, NodeMaterialConnectionPointDirection.Output, TBNBlock, \"TBNBlock\")\r\n );\r\n\r\n this.registerOutput(\"row0\", NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockTargets.Fragment);\r\n this.registerOutput(\"row1\", NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockTargets.Fragment);\r\n this.registerOutput(\"row2\", NodeMaterialBlockConnectionPointTypes.Vector3, NodeMaterialBlockTargets.Fragment);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"TBNBlock\";\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"tbnNormal\");\r\n state._excludeVariableName(\"tbnTangent\");\r\n state._excludeVariableName(\"tbnBitangent\");\r\n state._excludeVariableName(\"TBN\");\r\n }\r\n\r\n /**\r\n * Gets the normal input component\r\n */\r\n public get normal(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the tangent input component\r\n */\r\n public get tangent(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the world matrix input component\r\n */\r\n public get world(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the TBN output component\r\n */\r\n public get TBN(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the row0 of the output matrix\r\n */\r\n public get row0(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the row1 of the output matrix\r\n */\r\n public get row1(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the row2 of the output matrix\r\n */\r\n public get row2(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the block target\r\n */\r\n public override get target() {\r\n return NodeMaterialBlockTargets.Fragment;\r\n }\r\n\r\n /**\r\n * Sets the block target\r\n */\r\n public override set target(value: NodeMaterialBlockTargets) {}\r\n\r\n /**\r\n * Auto configure the block based on the material\r\n * @param material - defines the hosting NodeMaterial\r\n * @param additionalFilteringInfo - defines additional filtering info\r\n */\r\n public override autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n if (!this.world.isConnected) {\r\n let worldInput = material.getInputBlockByPredicate((b) => b.isSystemValue && b.systemValue === NodeMaterialSystemValues.World && additionalFilteringInfo(b));\r\n\r\n if (!worldInput) {\r\n worldInput = new InputBlock(\"world\");\r\n worldInput.setAsSystemValue(NodeMaterialSystemValues.World);\r\n }\r\n worldInput.output.connectTo(this.world);\r\n }\r\n\r\n if (!this.normal.isConnected) {\r\n let normalInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"normal\" && additionalFilteringInfo(b));\r\n\r\n if (!normalInput) {\r\n normalInput = new InputBlock(\"normal\");\r\n normalInput.setAsAttribute(\"normal\");\r\n }\r\n normalInput.output.connectTo(this.normal);\r\n }\r\n\r\n if (!this.tangent.isConnected) {\r\n let tangentInput = material.getInputBlockByPredicate(\r\n (b) => b.isAttribute && b.name === \"tangent\" && b.type === NodeMaterialBlockConnectionPointTypes.Vector4 && additionalFilteringInfo(b)\r\n );\r\n\r\n if (!tangentInput) {\r\n tangentInput = new InputBlock(\"tangent\");\r\n tangentInput.setAsAttribute(\"tangent\");\r\n }\r\n tangentInput.output.connectTo(this.tangent);\r\n }\r\n }\r\n\r\n /**\r\n * Prepare the list of defines\r\n * @param defines - defines the list of defines to update\r\n * @param nodeMaterial - defines the node material requesting the update\r\n * @param mesh - defines the mesh to bind data for\r\n */\r\n public override prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh) {\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const normal = this.normal;\r\n const tangent = this.tangent;\r\n\r\n let normalAvailable = normal.isConnected;\r\n if (normal.connectInputBlock?.isAttribute && !mesh.isVerticesDataPresent(normal.connectInputBlock?.name)) {\r\n normalAvailable = false;\r\n }\r\n\r\n let tangentAvailable = tangent.isConnected;\r\n if (tangent.connectInputBlock?.isAttribute && !mesh.isVerticesDataPresent(tangent.connectInputBlock?.name)) {\r\n tangentAvailable = false;\r\n }\r\n\r\n const useTBNBlock = normalAvailable && tangentAvailable;\r\n\r\n defines.setValue(\"TBNBLOCK\", useTBNBlock, true);\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const normal = this.normal;\r\n const tangent = this.tangent;\r\n const world = this.world;\r\n const tbn = this.TBN;\r\n const row0 = this.row0;\r\n const row1 = this.row1;\r\n const row2 = this.row2;\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n const mat3 = isWebGPU ? \"mat3x3f\" : \"mat3\";\r\n const fSuffix = isWebGPU ? \"f\" : \"\";\r\n\r\n // Fragment\r\n if (state.target === NodeMaterialBlockTargets.Fragment) {\r\n state.compilationString += `\r\n // ${this.name}\r\n ${state._declareLocalVar(\"tbnNormal\", NodeMaterialBlockConnectionPointTypes.Vector3)} = normalize(${normal.associatedVariableName}).xyz;\r\n ${state._declareLocalVar(\"tbnTangent\", NodeMaterialBlockConnectionPointTypes.Vector3)} = normalize(${tangent.associatedVariableName}.xyz);\r\n ${state._declareLocalVar(\"tbnBitangent\", NodeMaterialBlockConnectionPointTypes.Vector3)} = cross(tbnNormal, tbnTangent) * ${tangent.associatedVariableName}.w;\r\n ${isWebGPU ? \"var\" : \"mat3\"} ${tbn.associatedVariableName} = ${mat3}(${world.associatedVariableName}[0].xyz, ${world.associatedVariableName}[1].xyz, ${world.associatedVariableName}[2].xyz) * ${mat3}(tbnTangent, tbnBitangent, tbnNormal);\r\n `;\r\n\r\n if (row0.hasEndpoints) {\r\n state.compilationString +=\r\n state._declareOutput(row0) +\r\n ` = vec3${fSuffix}(${tbn.associatedVariableName}[0][0], ${tbn.associatedVariableName}[0][1], ${tbn.associatedVariableName}[0][2]);\\n`;\r\n }\r\n if (row1.hasEndpoints) {\r\n state.compilationString +=\r\n state._declareOutput(row1) +\r\n ` = vec3${fSuffix}(${tbn.associatedVariableName}[1[0], ${tbn.associatedVariableName}[1][1], ${tbn.associatedVariableName}[1][2]);\\n`;\r\n }\r\n if (row2.hasEndpoints) {\r\n state.compilationString +=\r\n state._declareOutput(row2) +\r\n ` = vec3${fSuffix}(${tbn.associatedVariableName}[2][0], ${tbn.associatedVariableName}[2][1], ${tbn.associatedVariableName}[2][2]);\\n`;\r\n }\r\n\r\n state.sharedData.blocksWithDefines.push(this);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.TBNBlock\", TBNBlock);\r\n"]}
|