@babylonjs/core 7.40.2 → 7.40.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/Audio/sound.js +5 -10
  2. package/Audio/sound.js.map +1 -1
  3. package/Compute/computeEffect.js +6 -14
  4. package/Compute/computeEffect.js.map +1 -1
  5. package/Compute/computeShader.js +2 -9
  6. package/Compute/computeShader.js.map +1 -1
  7. package/Culling/Helper/computeShaderBoundingHelper.js +5 -6
  8. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
  9. package/Engines/abstractEngine.d.ts +7 -0
  10. package/Engines/abstractEngine.js +7 -2
  11. package/Engines/abstractEngine.js.map +1 -1
  12. package/Engines/engine.js +6 -8
  13. package/Engines/engine.js.map +1 -1
  14. package/Engines/thinEngine.js +6 -1
  15. package/Engines/thinEngine.js.map +1 -1
  16. package/Engines/webgpuEngine.js +6 -1
  17. package/Engines/webgpuEngine.js.map +1 -1
  18. package/FrameGraph/frameGraph.js +4 -9
  19. package/FrameGraph/frameGraph.js.map +1 -1
  20. package/Layers/effectLayer.js +2 -0
  21. package/Layers/effectLayer.js.map +1 -1
  22. package/Layers/glowLayer.js +4 -0
  23. package/Layers/glowLayer.js.map +1 -1
  24. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +5 -0
  25. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +33 -0
  26. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  27. package/Materials/Node/Blocks/PBR/reflectionBlock.js +2 -4
  28. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  29. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.d.ts +10 -2
  30. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +48 -2
  31. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  32. package/Materials/Node/Blocks/meshAttributeExistsBlock.js +3 -0
  33. package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
  34. package/Materials/Node/nodeMaterial.d.ts +6 -0
  35. package/Materials/Node/nodeMaterial.js +17 -1
  36. package/Materials/Node/nodeMaterial.js.map +1 -1
  37. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
  38. package/Materials/PBR/pbrBaseMaterial.js +3 -4
  39. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  40. package/Materials/Textures/Procedurals/proceduralTexture.d.ts +3 -2
  41. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  42. package/Materials/Textures/colorGradingTexture.js +5 -2
  43. package/Materials/Textures/colorGradingTexture.js.map +1 -1
  44. package/Materials/effect.functions.d.ts +0 -1
  45. package/Materials/effect.functions.js +0 -19
  46. package/Materials/effect.functions.js.map +1 -1
  47. package/Materials/effect.js +3 -2
  48. package/Materials/effect.js.map +1 -1
  49. package/Materials/effect.webgl.functions.js +2 -1
  50. package/Materials/effect.webgl.functions.js.map +1 -1
  51. package/Materials/material.d.ts +4 -0
  52. package/Materials/material.js +8 -0
  53. package/Materials/material.js.map +1 -1
  54. package/Materials/materialHelper.functions.js +2 -0
  55. package/Materials/materialHelper.functions.js.map +1 -1
  56. package/Materials/shaderMaterial.js +4 -0
  57. package/Materials/shaderMaterial.js.map +1 -1
  58. package/Materials/standardMaterial.d.ts +1 -0
  59. package/Materials/standardMaterial.js +1 -0
  60. package/Materials/standardMaterial.js.map +1 -1
  61. package/Meshes/Compression/dracoCodec.d.ts +83 -0
  62. package/Meshes/Compression/dracoCodec.js +107 -0
  63. package/Meshes/Compression/dracoCodec.js.map +1 -0
  64. package/Meshes/Compression/dracoCompression.d.ts +17 -63
  65. package/Meshes/Compression/dracoCompression.js +22 -200
  66. package/Meshes/Compression/dracoCompression.js.map +1 -1
  67. package/Meshes/Compression/dracoDecoder.d.ts +103 -0
  68. package/Meshes/Compression/dracoDecoder.js +216 -0
  69. package/Meshes/Compression/dracoDecoder.js.map +1 -0
  70. package/Meshes/Compression/index.d.ts +1 -0
  71. package/Meshes/Compression/index.js +1 -0
  72. package/Meshes/Compression/index.js.map +1 -1
  73. package/Meshes/abstractMesh.d.ts +5 -0
  74. package/Meshes/abstractMesh.js +15 -0
  75. package/Meshes/abstractMesh.js.map +1 -1
  76. package/Meshes/index.d.ts +1 -0
  77. package/Meshes/index.js +1 -0
  78. package/Meshes/index.js.map +1 -1
  79. package/Meshes/mesh.js +23 -0
  80. package/Meshes/mesh.js.map +1 -1
  81. package/Meshes/mesh.vertexData.functions.d.ts +6 -0
  82. package/Meshes/mesh.vertexData.functions.js +65 -0
  83. package/Meshes/mesh.vertexData.functions.js.map +1 -0
  84. package/Misc/bitArray.d.ts +26 -0
  85. package/Misc/bitArray.js +53 -0
  86. package/Misc/bitArray.js.map +1 -0
  87. package/Misc/index.d.ts +1 -0
  88. package/Misc/index.js +1 -0
  89. package/Misc/index.js.map +1 -1
  90. package/Misc/screenshotTools.d.ts +3 -3
  91. package/Misc/screenshotTools.js +10 -12
  92. package/Misc/screenshotTools.js.map +1 -1
  93. package/Misc/timingTools.d.ts +4 -0
  94. package/Misc/timingTools.js +38 -0
  95. package/Misc/timingTools.js.map +1 -1
  96. package/Misc/webRequest.d.ts +1 -1
  97. package/Misc/webRequest.js +1 -1
  98. package/Misc/webRequest.js.map +1 -1
  99. package/Morph/morphTarget.d.ts +15 -0
  100. package/Morph/morphTarget.js +35 -0
  101. package/Morph/morphTarget.js.map +1 -1
  102. package/Morph/morphTargetManager.d.ts +9 -0
  103. package/Morph/morphTargetManager.js +23 -0
  104. package/Morph/morphTargetManager.js.map +1 -1
  105. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +7 -5
  106. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  107. package/Rendering/iblCdfGenerator.d.ts +14 -19
  108. package/Rendering/iblCdfGenerator.js +64 -57
  109. package/Rendering/iblCdfGenerator.js.map +1 -1
  110. package/Rendering/index.d.ts +6 -6
  111. package/Rendering/index.js +6 -6
  112. package/Rendering/index.js.map +1 -1
  113. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +6 -6
  114. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  115. package/Shaders/ShadersInclude/helperFunctions.js +1 -0
  116. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  117. package/Shaders/ShadersInclude/morphTargetsVertex.js +7 -1
  118. package/Shaders/ShadersInclude/morphTargetsVertex.js.map +1 -1
  119. package/Shaders/ShadersInclude/morphTargetsVertexDeclaration.js +3 -0
  120. package/Shaders/ShadersInclude/morphTargetsVertexDeclaration.js.map +1 -1
  121. package/Shaders/ShadersInclude/pbrBlockReflection.js +2 -3
  122. package/Shaders/ShadersInclude/pbrBlockReflection.js.map +1 -1
  123. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +2 -3
  124. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  125. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -1
  126. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  127. package/Shaders/ShadersInclude/samplerVertexImplementation.js +1 -1
  128. package/Shaders/ShadersInclude/samplerVertexImplementation.js.map +1 -1
  129. package/Shaders/default.vertex.js +10 -1
  130. package/Shaders/default.vertex.js.map +1 -1
  131. package/Shaders/depth.vertex.js +4 -1
  132. package/Shaders/depth.vertex.js.map +1 -1
  133. package/Shaders/geometry.vertex.js +9 -6
  134. package/Shaders/geometry.vertex.js.map +1 -1
  135. package/Shaders/glowMapGeneration.vertex.js +6 -3
  136. package/Shaders/glowMapGeneration.vertex.js.map +1 -1
  137. package/Shaders/{iblIcdfx.fragment.d.ts → iblCdfDebug.fragment.d.ts} +1 -1
  138. package/Shaders/{importanceSamplingDebug.fragment.js → iblCdfDebug.fragment.js} +12 -11
  139. package/Shaders/iblCdfDebug.fragment.js.map +1 -0
  140. package/Shaders/iblCdfy.fragment.d.ts +1 -0
  141. package/Shaders/iblCdfy.fragment.js +4 -4
  142. package/Shaders/iblCdfy.fragment.js.map +1 -1
  143. package/Shaders/iblIcdf.fragment.d.ts +6 -0
  144. package/Shaders/iblIcdf.fragment.js +43 -0
  145. package/Shaders/iblIcdf.fragment.js.map +1 -0
  146. package/Shaders/iblScaledLuminance.fragment.d.ts +6 -0
  147. package/Shaders/iblScaledLuminance.fragment.js +25 -0
  148. package/Shaders/iblScaledLuminance.fragment.js.map +1 -0
  149. package/Shaders/iblShadowVoxelTracing.fragment.js +2 -2
  150. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  151. package/Shaders/outline.vertex.js +4 -1
  152. package/Shaders/outline.vertex.js.map +1 -1
  153. package/Shaders/pbr.fragment.js +2 -4
  154. package/Shaders/pbr.fragment.js.map +1 -1
  155. package/Shaders/pbr.vertex.js +10 -1
  156. package/Shaders/pbr.vertex.js.map +1 -1
  157. package/Shaders/shadowMap.vertex.js +4 -1
  158. package/Shaders/shadowMap.vertex.js.map +1 -1
  159. package/Shaders/volumetricLightScatteringPass.vertex.js +4 -1
  160. package/Shaders/volumetricLightScatteringPass.vertex.js.map +1 -1
  161. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +8 -6
  162. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  163. package/ShadersWGSL/ShadersInclude/helperFunctions.js +1 -0
  164. package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
  165. package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js +7 -1
  166. package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js.map +1 -1
  167. package/ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration.js +3 -0
  168. package/ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration.js.map +1 -1
  169. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js +4 -8
  170. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js.map +1 -1
  171. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +4 -8
  172. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  173. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -1
  174. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  175. package/ShadersWGSL/ShadersInclude/samplerVertexImplementation.js +1 -1
  176. package/ShadersWGSL/ShadersInclude/samplerVertexImplementation.js.map +1 -1
  177. package/ShadersWGSL/default.vertex.js +10 -1
  178. package/ShadersWGSL/default.vertex.js.map +1 -1
  179. package/ShadersWGSL/depth.vertex.js +4 -1
  180. package/ShadersWGSL/depth.vertex.js.map +1 -1
  181. package/ShadersWGSL/geometry.vertex.js +9 -6
  182. package/ShadersWGSL/geometry.vertex.js.map +1 -1
  183. package/ShadersWGSL/glowMapGeneration.vertex.js +6 -3
  184. package/ShadersWGSL/glowMapGeneration.vertex.js.map +1 -1
  185. package/ShadersWGSL/glowMapMerge.fragment.js +3 -2
  186. package/ShadersWGSL/glowMapMerge.fragment.js.map +1 -1
  187. package/ShadersWGSL/{iblIcdfy.fragment.d.ts → iblCdfDebug.fragment.d.ts} +1 -1
  188. package/ShadersWGSL/{importanceSamplingDebug.fragment.js → iblCdfDebug.fragment.js} +11 -10
  189. package/ShadersWGSL/iblCdfDebug.fragment.js.map +1 -0
  190. package/ShadersWGSL/iblCdfy.fragment.js +8 -7
  191. package/ShadersWGSL/iblCdfy.fragment.js.map +1 -1
  192. package/ShadersWGSL/iblIcdf.fragment.d.ts +6 -0
  193. package/ShadersWGSL/iblIcdf.fragment.js +43 -0
  194. package/ShadersWGSL/iblIcdf.fragment.js.map +1 -0
  195. package/ShadersWGSL/iblScaledLuminance.fragment.d.ts +6 -0
  196. package/ShadersWGSL/iblScaledLuminance.fragment.js +24 -0
  197. package/ShadersWGSL/iblScaledLuminance.fragment.js.map +1 -0
  198. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +3 -3
  199. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  200. package/ShadersWGSL/outline.vertex.js +4 -1
  201. package/ShadersWGSL/outline.vertex.js.map +1 -1
  202. package/ShadersWGSL/pbr.fragment.js +4 -8
  203. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  204. package/ShadersWGSL/pbr.vertex.js +10 -1
  205. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  206. package/ShadersWGSL/shadowMap.vertex.js +4 -1
  207. package/ShadersWGSL/shadowMap.vertex.js.map +1 -1
  208. package/assets/Draco/draco_encoder.js +38 -0
  209. package/assets/Draco/draco_encoder.wasm +0 -0
  210. package/assets/Draco/draco_encoder_wasm_wrapper.js +96 -0
  211. package/package.json +1 -1
  212. package/Shaders/iblIcdfx.fragment.js +0 -19
  213. package/Shaders/iblIcdfx.fragment.js.map +0 -1
  214. package/Shaders/iblIcdfy.fragment.d.ts +0 -5
  215. package/Shaders/iblIcdfy.fragment.js +0 -19
  216. package/Shaders/iblIcdfy.fragment.js.map +0 -1
  217. package/Shaders/importanceSamplingDebug.fragment.d.ts +0 -5
  218. package/Shaders/importanceSamplingDebug.fragment.js.map +0 -1
  219. package/ShadersWGSL/iblIcdfx.fragment.d.ts +0 -5
  220. package/ShadersWGSL/iblIcdfx.fragment.js +0 -18
  221. package/ShadersWGSL/iblIcdfx.fragment.js.map +0 -1
  222. package/ShadersWGSL/iblIcdfy.fragment.js +0 -17
  223. package/ShadersWGSL/iblIcdfy.fragment.js.map +0 -1
  224. package/ShadersWGSL/importanceSamplingDebug.fragment.d.ts +0 -5
  225. package/ShadersWGSL/importanceSamplingDebug.fragment.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"reflectionBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/PBR/reflectionBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport { ReflectionTextureBaseBlock } from \"../Dual/reflectionTextureBaseBlock\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\r\nimport type { Mesh } from \"../../../../Meshes/mesh\";\r\nimport type { SubMesh } from \"../../../../Meshes/subMesh\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to implement the reflection module of the PBR material\r\n */\r\nexport class ReflectionBlock extends ReflectionTextureBaseBlock {\r\n /** @internal */\r\n public _defineLODReflectionAlpha: string;\r\n /** @internal */\r\n public _defineLinearSpecularReflection: string;\r\n private _vEnvironmentIrradianceName: string;\r\n /** @internal */\r\n public _vReflectionMicrosurfaceInfosName: string;\r\n /** @internal */\r\n public _vReflectionInfosName: string;\r\n /** @internal */\r\n public _vReflectionFilteringInfoName: string;\r\n private _scene: Scene;\r\n\r\n /**\r\n * The properties below are set by the main PBR block prior to calling methods of this class.\r\n * This is to avoid having to add them as inputs here whereas they are already inputs of the main block, so already known.\r\n * It's less burden on the user side in the editor part.\r\n */\r\n\r\n /** @internal */\r\n public worldPositionConnectionPoint: NodeMaterialConnectionPoint;\r\n /** @internal */\r\n public worldNormalConnectionPoint: NodeMaterialConnectionPoint;\r\n /** @internal */\r\n public cameraPositionConnectionPoint: NodeMaterialConnectionPoint;\r\n /** @internal */\r\n public viewConnectionPoint: NodeMaterialConnectionPoint;\r\n\r\n /**\r\n * Defines if the material uses spherical harmonics vs spherical polynomials for the\r\n * diffuse part of the IBL.\r\n */\r\n @editableInPropertyPage(\"Spherical Harmonics\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { embedded: true, notifiers: { update: true } })\r\n public useSphericalHarmonics: boolean = true;\r\n\r\n /**\r\n * Force the shader to compute irradiance in the fragment shader in order to take bump in account.\r\n */\r\n @editableInPropertyPage(\"Force irradiance in fragment\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { embedded: true, notifiers: { update: true } })\r\n public forceIrradianceInFragment: boolean = false;\r\n\r\n protected override _onGenerateOnlyFragmentCodeChanged(): boolean {\r\n if (this.position.isConnected) {\r\n this.generateOnlyFragmentCode = !this.generateOnlyFragmentCode;\r\n Logger.Error(\"The position input must not be connected to be able to switch!\");\r\n return false;\r\n }\r\n\r\n this._setTarget();\r\n\r\n return true;\r\n }\r\n\r\n protected override _setTarget(): void {\r\n super._setTarget();\r\n this.getInputByName(\"position\")!.target = this.generateOnlyFragmentCode ? NodeMaterialBlockTargets.Fragment : NodeMaterialBlockTargets.Vertex;\r\n if (this.generateOnlyFragmentCode) {\r\n this.forceIrradianceInFragment = true;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new ReflectionBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"position\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"world\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"color\", NodeMaterialBlockConnectionPointTypes.Color3, true, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\r\n \"reflection\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"reflection\", this, NodeMaterialConnectionPointDirection.Output, ReflectionBlock, \"ReflectionBlock\")\r\n );\r\n\r\n this.position.addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Color3 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4\r\n );\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 \"ReflectionBlock\";\r\n }\r\n\r\n /**\r\n * Gets the position input component\r\n */\r\n public get position(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the world position input component\r\n */\r\n public get worldPosition(): NodeMaterialConnectionPoint {\r\n return this.worldPositionConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the world normal input component\r\n */\r\n public get worldNormal(): NodeMaterialConnectionPoint {\r\n return this.worldNormalConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the world input component\r\n */\r\n public get world(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the camera (or eye) position component\r\n */\r\n public get cameraPosition(): NodeMaterialConnectionPoint {\r\n return this.cameraPositionConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the view input component\r\n */\r\n public get view(): NodeMaterialConnectionPoint {\r\n return this.viewConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the color input component\r\n */\r\n public get color(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the reflection object output component\r\n */\r\n public get reflection(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Returns true if the block has a texture (either its own texture or the environment texture from the scene, if set)\r\n */\r\n public get hasTexture(): boolean {\r\n return !!this._getTexture();\r\n }\r\n\r\n /**\r\n * Gets the reflection color (either the name of the variable if the color input is connected, else a default value)\r\n */\r\n public get reflectionColor(): string {\r\n return this.color.isConnected ? this.color.associatedVariableName : \"vec3(1., 1., 1.)\";\r\n }\r\n\r\n protected override _getTexture(): Nullable<BaseTexture> {\r\n if (this.texture) {\r\n return this.texture;\r\n }\r\n\r\n return this._scene.environmentTexture;\r\n }\r\n\r\n public override prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n super.prepareDefines(mesh, nodeMaterial, defines);\r\n\r\n const reflectionTexture = this._getTexture();\r\n const reflection = reflectionTexture && reflectionTexture.getTextureMatrix;\r\n\r\n defines.setValue(\"REFLECTION\", reflection, true);\r\n\r\n if (!reflection) {\r\n return;\r\n }\r\n\r\n defines.setValue(this._defineLODReflectionAlpha, reflectionTexture!.lodLevelInAlpha, true);\r\n defines.setValue(this._defineLinearSpecularReflection, reflectionTexture!.linearSpecularLOD, true);\r\n defines.setValue(this._defineOppositeZ, this._scene.useRightHandedSystem ? !reflectionTexture!.invertZ : reflectionTexture!.invertZ, true);\r\n\r\n defines.setValue(\"SPHERICAL_HARMONICS\", this.useSphericalHarmonics, true);\r\n defines.setValue(\"GAMMAREFLECTION\", reflectionTexture!.gammaSpace, true);\r\n defines.setValue(\"RGBDREFLECTION\", reflectionTexture!.isRGBD, true);\r\n\r\n if (reflectionTexture && reflectionTexture.coordinatesMode !== Texture.SKYBOX_MODE) {\r\n if (reflectionTexture.isCube) {\r\n defines.setValue(\"USESPHERICALFROMREFLECTIONMAP\", true);\r\n defines.setValue(\"USEIRRADIANCEMAP\", false);\r\n if (this.forceIrradianceInFragment || this._scene.getEngine().getCaps().maxVaryingVectors <= 8) {\r\n defines.setValue(\"USESPHERICALINVERTEX\", false);\r\n } else {\r\n defines.setValue(\"USESPHERICALINVERTEX\", true);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public override bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh) {\r\n super.bind(effect, nodeMaterial, mesh);\r\n\r\n const reflectionTexture = this._getTexture();\r\n\r\n if (!reflectionTexture || !subMesh) {\r\n return;\r\n }\r\n\r\n if (reflectionTexture.isCube) {\r\n effect.setTexture(this._cubeSamplerName, reflectionTexture);\r\n } else {\r\n effect.setTexture(this._2DSamplerName, reflectionTexture);\r\n }\r\n\r\n const width = reflectionTexture.getSize().width;\r\n\r\n effect.setFloat3(this._vReflectionMicrosurfaceInfosName, width, reflectionTexture.lodGenerationScale, reflectionTexture.lodGenerationOffset);\r\n effect.setFloat2(this._vReflectionFilteringInfoName, width, Math.log2(width));\r\n\r\n const defines = subMesh.materialDefines as NodeMaterialDefines;\r\n\r\n const polynomials = reflectionTexture.sphericalPolynomial;\r\n if (defines.USESPHERICALFROMREFLECTIONMAP && polynomials) {\r\n if (defines.SPHERICAL_HARMONICS) {\r\n const preScaledHarmonics = polynomials.preScaledHarmonics;\r\n effect.setVector3(\"vSphericalL00\", preScaledHarmonics.l00);\r\n effect.setVector3(\"vSphericalL1_1\", preScaledHarmonics.l1_1);\r\n effect.setVector3(\"vSphericalL10\", preScaledHarmonics.l10);\r\n effect.setVector3(\"vSphericalL11\", preScaledHarmonics.l11);\r\n effect.setVector3(\"vSphericalL2_2\", preScaledHarmonics.l2_2);\r\n effect.setVector3(\"vSphericalL2_1\", preScaledHarmonics.l2_1);\r\n effect.setVector3(\"vSphericalL20\", preScaledHarmonics.l20);\r\n effect.setVector3(\"vSphericalL21\", preScaledHarmonics.l21);\r\n effect.setVector3(\"vSphericalL22\", preScaledHarmonics.l22);\r\n } else {\r\n effect.setFloat3(\"vSphericalX\", polynomials.x.x, polynomials.x.y, polynomials.x.z);\r\n effect.setFloat3(\"vSphericalY\", polynomials.y.x, polynomials.y.y, polynomials.y.z);\r\n effect.setFloat3(\"vSphericalZ\", polynomials.z.x, polynomials.z.y, polynomials.z.z);\r\n effect.setFloat3(\"vSphericalXX_ZZ\", polynomials.xx.x - polynomials.zz.x, polynomials.xx.y - polynomials.zz.y, polynomials.xx.z - polynomials.zz.z);\r\n effect.setFloat3(\"vSphericalYY_ZZ\", polynomials.yy.x - polynomials.zz.x, polynomials.yy.y - polynomials.zz.y, polynomials.yy.z - polynomials.zz.z);\r\n effect.setFloat3(\"vSphericalZZ\", polynomials.zz.x, polynomials.zz.y, polynomials.zz.z);\r\n effect.setFloat3(\"vSphericalXY\", polynomials.xy.x, polynomials.xy.y, polynomials.xy.z);\r\n effect.setFloat3(\"vSphericalYZ\", polynomials.yz.x, polynomials.yz.y, polynomials.yz.z);\r\n effect.setFloat3(\"vSphericalZX\", polynomials.zx.x, polynomials.zx.y, polynomials.zx.z);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the code to inject in the vertex shader\r\n * @param state current state of the node material building\r\n * @returns the shader code\r\n */\r\n public override handleVertexSide(state: NodeMaterialBuildState): string {\r\n let code = super.handleVertexSide(state);\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n state._emitFunctionFromInclude(\"harmonicsFunctions\", `//${this.name}`, {\r\n replaceStrings: [\r\n { search: /uniform vec3 vSphericalL00;[\\s\\S]*?uniform vec3 vSphericalL22;/g, replace: \"\" },\r\n { search: /uniform vec3 vSphericalX;[\\s\\S]*?uniform vec3 vSphericalZX;/g, replace: \"\" },\r\n ],\r\n });\r\n\r\n const reflectionVectorName = state._getFreeVariableName(\"reflectionVector\");\r\n\r\n this._vEnvironmentIrradianceName = state._getFreeVariableName(\"vEnvironmentIrradiance\");\r\n\r\n state._emitVaryingFromString(\r\n this._vEnvironmentIrradianceName,\r\n NodeMaterialBlockConnectionPointTypes.Vector3,\r\n \"defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\"\r\n );\r\n\r\n state._emitUniformFromString(\"vSphericalL00\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL1_1\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL10\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL11\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL2_2\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL2_1\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL20\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL21\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL22\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n\r\n state._emitUniformFromString(\"vSphericalX\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalY\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalXX_ZZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalYY_ZZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalZZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalXY\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalYZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalZX\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n\r\n code += `#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\r\n ${state._declareLocalVar(reflectionVectorName, NodeMaterialBlockConnectionPointTypes.Vector3)} = (${(isWebGPU ? \"uniforms.\" : \"\") + this._reflectionMatrixName} * vec4${state.fSuffix}(normalize(${this.worldNormal.associatedVariableName}).xyz, 0)).xyz;\r\n #ifdef ${this._defineOppositeZ}\r\n ${reflectionVectorName}.z *= -1.0;\r\n #endif\r\n ${isWebGPU ? \"vertexOutputs.\" : \"\"}${this._vEnvironmentIrradianceName} = computeEnvironmentIrradiance(${reflectionVectorName});\r\n #endif\\n`;\r\n\r\n return code;\r\n }\r\n\r\n /**\r\n * Gets the main code of the block (fragment side)\r\n * @param state current state of the node material building\r\n * @param normalVarName name of the existing variable corresponding to the normal\r\n * @returns the shader code\r\n */\r\n public getCode(state: NodeMaterialBuildState, normalVarName: string): string {\r\n let code = \"\";\r\n\r\n this.handleFragmentSideInits(state);\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n state._emitFunctionFromInclude(\"harmonicsFunctions\", `//${this.name}`, {\r\n replaceStrings: [\r\n { search: /uniform vec3 vSphericalL00;[\\s\\S]*?uniform vec3 vSphericalL22;/g, replace: \"\" },\r\n { search: /uniform vec3 vSphericalX;[\\s\\S]*?uniform vec3 vSphericalZX;/g, replace: \"\" },\r\n ],\r\n });\r\n\r\n if (!isWebGPU) {\r\n state._emitFunction(\r\n \"sampleReflection\",\r\n `\r\n #ifdef ${this._define3DName}\r\n #define sampleReflection(s, c) textureCube(s, c)\r\n #else\r\n #define sampleReflection(s, c) texture2D(s, c)\r\n #endif\\n`,\r\n `//${this.name}`\r\n );\r\n\r\n state._emitFunction(\r\n \"sampleReflectionLod\",\r\n `\r\n #ifdef ${this._define3DName}\r\n #define sampleReflectionLod(s, c, l) textureCubeLodEXT(s, c, l)\r\n #else\r\n #define sampleReflectionLod(s, c, l) texture2DLodEXT(s, c, l)\r\n #endif\\n`,\r\n `//${this.name}`\r\n );\r\n }\r\n\r\n const computeReflectionCoordsFunc = isWebGPU\r\n ? `\r\n fn computeReflectionCoordsPBR(worldPos: vec4f, worldNormal: vec3f) -> vec3f {\r\n ${this.handleFragmentSideCodeReflectionCoords(state, \"worldNormal\", \"worldPos\", true, true)}\r\n return ${this._reflectionVectorName};\r\n }\\n`\r\n : `\r\n vec3 computeReflectionCoordsPBR(vec4 worldPos, vec3 worldNormal) {\r\n ${this.handleFragmentSideCodeReflectionCoords(state, \"worldNormal\", \"worldPos\", true, true)}\r\n return ${this._reflectionVectorName};\r\n }\\n`;\r\n\r\n state._emitFunction(\"computeReflectionCoordsPBR\", computeReflectionCoordsFunc, `//${this.name}`);\r\n\r\n this._vReflectionMicrosurfaceInfosName = state._getFreeVariableName(\"vReflectionMicrosurfaceInfos\");\r\n\r\n state._emitUniformFromString(this._vReflectionMicrosurfaceInfosName, NodeMaterialBlockConnectionPointTypes.Vector3);\r\n\r\n this._vReflectionInfosName = state._getFreeVariableName(\"vReflectionInfos\");\r\n\r\n this._vReflectionFilteringInfoName = state._getFreeVariableName(\"vReflectionFilteringInfo\");\r\n\r\n state._emitUniformFromString(this._vReflectionFilteringInfoName, NodeMaterialBlockConnectionPointTypes.Vector2);\r\n\r\n code += `#ifdef REFLECTION\r\n ${state._declareLocalVar(this._vReflectionInfosName, NodeMaterialBlockConnectionPointTypes.Vector2)} = vec2${state.fSuffix}(1., 0.);\r\n\r\n ${isWebGPU ? \"var reflectionOut: reflectionOutParams\" : \"reflectionOutParams reflectionOut\"};\r\n\r\n reflectionOut = reflectionBlock(\r\n ${this.generateOnlyFragmentCode ? this._worldPositionNameInFragmentOnlyMode : (isWebGPU ? \"input.\" : \"\") + \"v_\" + this.worldPosition.associatedVariableName}.xyz\r\n , ${normalVarName}\r\n , alphaG\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + this._vReflectionMicrosurfaceInfosName}\r\n , ${this._vReflectionInfosName}\r\n , ${this.reflectionColor}\r\n #ifdef ANISOTROPIC\r\n ,anisotropicOut\r\n #endif\r\n #if defined(${this._defineLODReflectionAlpha}) && !defined(${this._defineSkyboxName})\r\n ,NdotVUnclamped\r\n #endif\r\n #ifdef ${this._defineLinearSpecularReflection}\r\n , roughness\r\n #endif\r\n #ifdef ${this._define3DName}\r\n , ${this._cubeSamplerName}\r\n ${isWebGPU ? `, ${this._cubeSamplerName}Sampler` : \"\"}\r\n #else\r\n , ${this._2DSamplerName}\r\n ${isWebGPU ? `, ${this._2DSamplerName}Sampler` : \"\"}\r\n #endif\r\n #if defined(NORMAL) && defined(USESPHERICALINVERTEX)\r\n , ${isWebGPU ? \"input.\" : \"\"}${this._vEnvironmentIrradianceName}\r\n #endif\r\n #ifdef USESPHERICALFROMREFLECTIONMAP\r\n #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\r\n , ${this._reflectionMatrixName}\r\n #endif\r\n #endif\r\n #ifdef USEIRRADIANCEMAP\r\n , irradianceSampler // ** not handled **\r\n ${isWebGPU ? `, irradianceSamplerSampler` : \"\"}\r\n #endif\r\n #ifndef LODBASEDMICROSFURACE\r\n #ifdef ${this._define3DName}\r\n , ${this._cubeSamplerName}\r\n ${isWebGPU ? `, ${this._cubeSamplerName}Sampler` : \"\"}\r\n , ${this._cubeSamplerName}\r\n ${isWebGPU ? `, ${this._cubeSamplerName}Sampler` : \"\"}\r\n #else\r\n , ${this._2DSamplerName}\r\n ${isWebGPU ? `, ${this._2DSamplerName}Sampler` : \"\"}\r\n , ${this._2DSamplerName} \r\n ${isWebGPU ? `, ${this._2DSamplerName}Sampler` : \"\"}\r\n #endif\r\n #endif\r\n #ifdef REALTIME_FILTERING\r\n , ${this._vReflectionFilteringInfoName}\r\n #ifdef IBL_CDF_FILTERING\r\n , icdfxSampler // ** not handled **\r\n ${isWebGPU ? `, icdfxSamplerSampler` : \"\"}\r\n , icdfySampler // ** not handled **\r\n ${isWebGPU ? `, icdfySamplerSampler` : \"\"}\r\n #endif\r\n #endif\r\n );\r\n #endif\\n`;\r\n\r\n return code;\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n this._scene = state.sharedData.scene;\r\n\r\n if (state.target !== NodeMaterialBlockTargets.Fragment) {\r\n this._defineLODReflectionAlpha = state._getFreeDefineName(\"LODINREFLECTIONALPHA\");\r\n this._defineLinearSpecularReflection = state._getFreeDefineName(\"LINEARSPECULARREFLECTION\");\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 if (this.texture) {\r\n codeString += `${this._codeVariableName}.texture.gammaSpace = ${this.texture.gammaSpace};\\n`;\r\n }\r\n codeString += `${this._codeVariableName}.useSphericalHarmonics = ${this.useSphericalHarmonics};\\n`;\r\n codeString += `${this._codeVariableName}.forceIrradianceInFragment = ${this.forceIrradianceInFragment};\\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.useSphericalHarmonics = this.useSphericalHarmonics;\r\n serializationObject.forceIrradianceInFragment = this.forceIrradianceInFragment;\r\n serializationObject.gammaSpace = this.texture?.gammaSpace ?? true;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.useSphericalHarmonics = serializationObject.useSphericalHarmonics;\r\n this.forceIrradianceInFragment = serializationObject.forceIrradianceInFragment;\r\n if (this.texture) {\r\n this.texture.gammaSpace = serializationObject.gammaSpace;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ReflectionBlock\", ReflectionBlock);\r\n"]}
1
+ {"version":3,"file":"reflectionBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/PBR/reflectionBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport { ReflectionTextureBaseBlock } from \"../Dual/reflectionTextureBaseBlock\";\r\nimport type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { Nullable } from \"../../../../types\";\r\nimport { Texture } from \"../../../Textures/texture\";\r\nimport type { BaseTexture } from \"../../../Textures/baseTexture\";\r\nimport type { Mesh } from \"../../../../Meshes/mesh\";\r\nimport type { SubMesh } from \"../../../../Meshes/subMesh\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport type { Scene } from \"../../../../scene\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to implement the reflection module of the PBR material\r\n */\r\nexport class ReflectionBlock extends ReflectionTextureBaseBlock {\r\n /** @internal */\r\n public _defineLODReflectionAlpha: string;\r\n /** @internal */\r\n public _defineLinearSpecularReflection: string;\r\n private _vEnvironmentIrradianceName: string;\r\n /** @internal */\r\n public _vReflectionMicrosurfaceInfosName: string;\r\n /** @internal */\r\n public _vReflectionInfosName: string;\r\n /** @internal */\r\n public _vReflectionFilteringInfoName: string;\r\n private _scene: Scene;\r\n\r\n /**\r\n * The properties below are set by the main PBR block prior to calling methods of this class.\r\n * This is to avoid having to add them as inputs here whereas they are already inputs of the main block, so already known.\r\n * It's less burden on the user side in the editor part.\r\n */\r\n\r\n /** @internal */\r\n public worldPositionConnectionPoint: NodeMaterialConnectionPoint;\r\n /** @internal */\r\n public worldNormalConnectionPoint: NodeMaterialConnectionPoint;\r\n /** @internal */\r\n public cameraPositionConnectionPoint: NodeMaterialConnectionPoint;\r\n /** @internal */\r\n public viewConnectionPoint: NodeMaterialConnectionPoint;\r\n\r\n /**\r\n * Defines if the material uses spherical harmonics vs spherical polynomials for the\r\n * diffuse part of the IBL.\r\n */\r\n @editableInPropertyPage(\"Spherical Harmonics\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { embedded: true, notifiers: { update: true } })\r\n public useSphericalHarmonics: boolean = true;\r\n\r\n /**\r\n * Force the shader to compute irradiance in the fragment shader in order to take bump in account.\r\n */\r\n @editableInPropertyPage(\"Force irradiance in fragment\", PropertyTypeForEdition.Boolean, \"ADVANCED\", { embedded: true, notifiers: { update: true } })\r\n public forceIrradianceInFragment: boolean = false;\r\n\r\n protected override _onGenerateOnlyFragmentCodeChanged(): boolean {\r\n if (this.position.isConnected) {\r\n this.generateOnlyFragmentCode = !this.generateOnlyFragmentCode;\r\n Logger.Error(\"The position input must not be connected to be able to switch!\");\r\n return false;\r\n }\r\n\r\n this._setTarget();\r\n\r\n return true;\r\n }\r\n\r\n protected override _setTarget(): void {\r\n super._setTarget();\r\n this.getInputByName(\"position\")!.target = this.generateOnlyFragmentCode ? NodeMaterialBlockTargets.Fragment : NodeMaterialBlockTargets.Vertex;\r\n if (this.generateOnlyFragmentCode) {\r\n this.forceIrradianceInFragment = true;\r\n }\r\n }\r\n\r\n /**\r\n * Create a new ReflectionBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name);\r\n\r\n this._isUnique = true;\r\n\r\n this.registerInput(\"position\", NodeMaterialBlockConnectionPointTypes.AutoDetect, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"world\", NodeMaterialBlockConnectionPointTypes.Matrix, false, NodeMaterialBlockTargets.Vertex);\r\n this.registerInput(\"color\", NodeMaterialBlockConnectionPointTypes.Color3, true, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerOutput(\r\n \"reflection\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.Fragment,\r\n new NodeMaterialConnectionPointCustomObject(\"reflection\", this, NodeMaterialConnectionPointDirection.Output, ReflectionBlock, \"ReflectionBlock\")\r\n );\r\n\r\n this.position.addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Color3 | NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4\r\n );\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 \"ReflectionBlock\";\r\n }\r\n\r\n /**\r\n * Gets the position input component\r\n */\r\n public get position(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the world position input component\r\n */\r\n public get worldPosition(): NodeMaterialConnectionPoint {\r\n return this.worldPositionConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the world normal input component\r\n */\r\n public get worldNormal(): NodeMaterialConnectionPoint {\r\n return this.worldNormalConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the world input component\r\n */\r\n public get world(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the camera (or eye) position component\r\n */\r\n public get cameraPosition(): NodeMaterialConnectionPoint {\r\n return this.cameraPositionConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the view input component\r\n */\r\n public get view(): NodeMaterialConnectionPoint {\r\n return this.viewConnectionPoint;\r\n }\r\n\r\n /**\r\n * Gets the color input component\r\n */\r\n public get color(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the reflection object output component\r\n */\r\n public get reflection(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Returns true if the block has a texture (either its own texture or the environment texture from the scene, if set)\r\n */\r\n public get hasTexture(): boolean {\r\n return !!this._getTexture();\r\n }\r\n\r\n /**\r\n * Gets the reflection color (either the name of the variable if the color input is connected, else a default value)\r\n */\r\n public get reflectionColor(): string {\r\n return this.color.isConnected ? this.color.associatedVariableName : \"vec3(1., 1., 1.)\";\r\n }\r\n\r\n protected override _getTexture(): Nullable<BaseTexture> {\r\n if (this.texture) {\r\n return this.texture;\r\n }\r\n\r\n return this._scene.environmentTexture;\r\n }\r\n\r\n public override prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n super.prepareDefines(mesh, nodeMaterial, defines);\r\n\r\n const reflectionTexture = this._getTexture();\r\n const reflection = reflectionTexture && reflectionTexture.getTextureMatrix;\r\n\r\n defines.setValue(\"REFLECTION\", reflection, true);\r\n\r\n if (!reflection) {\r\n return;\r\n }\r\n\r\n defines.setValue(this._defineLODReflectionAlpha, reflectionTexture!.lodLevelInAlpha, true);\r\n defines.setValue(this._defineLinearSpecularReflection, reflectionTexture!.linearSpecularLOD, true);\r\n defines.setValue(this._defineOppositeZ, this._scene.useRightHandedSystem ? !reflectionTexture!.invertZ : reflectionTexture!.invertZ, true);\r\n\r\n defines.setValue(\"SPHERICAL_HARMONICS\", this.useSphericalHarmonics, true);\r\n defines.setValue(\"GAMMAREFLECTION\", reflectionTexture!.gammaSpace, true);\r\n defines.setValue(\"RGBDREFLECTION\", reflectionTexture!.isRGBD, true);\r\n\r\n if (reflectionTexture && reflectionTexture.coordinatesMode !== Texture.SKYBOX_MODE) {\r\n if (reflectionTexture.isCube) {\r\n defines.setValue(\"USESPHERICALFROMREFLECTIONMAP\", true);\r\n defines.setValue(\"USEIRRADIANCEMAP\", false);\r\n if (this.forceIrradianceInFragment || this._scene.getEngine().getCaps().maxVaryingVectors <= 8) {\r\n defines.setValue(\"USESPHERICALINVERTEX\", false);\r\n } else {\r\n defines.setValue(\"USESPHERICALINVERTEX\", true);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public override bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh) {\r\n super.bind(effect, nodeMaterial, mesh);\r\n\r\n const reflectionTexture = this._getTexture();\r\n\r\n if (!reflectionTexture || !subMesh) {\r\n return;\r\n }\r\n\r\n if (reflectionTexture.isCube) {\r\n effect.setTexture(this._cubeSamplerName, reflectionTexture);\r\n } else {\r\n effect.setTexture(this._2DSamplerName, reflectionTexture);\r\n }\r\n\r\n const width = reflectionTexture.getSize().width;\r\n\r\n effect.setFloat3(this._vReflectionMicrosurfaceInfosName, width, reflectionTexture.lodGenerationScale, reflectionTexture.lodGenerationOffset);\r\n effect.setFloat2(this._vReflectionFilteringInfoName, width, Math.log2(width));\r\n\r\n const defines = subMesh.materialDefines as NodeMaterialDefines;\r\n\r\n const polynomials = reflectionTexture.sphericalPolynomial;\r\n if (defines.USESPHERICALFROMREFLECTIONMAP && polynomials) {\r\n if (defines.SPHERICAL_HARMONICS) {\r\n const preScaledHarmonics = polynomials.preScaledHarmonics;\r\n effect.setVector3(\"vSphericalL00\", preScaledHarmonics.l00);\r\n effect.setVector3(\"vSphericalL1_1\", preScaledHarmonics.l1_1);\r\n effect.setVector3(\"vSphericalL10\", preScaledHarmonics.l10);\r\n effect.setVector3(\"vSphericalL11\", preScaledHarmonics.l11);\r\n effect.setVector3(\"vSphericalL2_2\", preScaledHarmonics.l2_2);\r\n effect.setVector3(\"vSphericalL2_1\", preScaledHarmonics.l2_1);\r\n effect.setVector3(\"vSphericalL20\", preScaledHarmonics.l20);\r\n effect.setVector3(\"vSphericalL21\", preScaledHarmonics.l21);\r\n effect.setVector3(\"vSphericalL22\", preScaledHarmonics.l22);\r\n } else {\r\n effect.setFloat3(\"vSphericalX\", polynomials.x.x, polynomials.x.y, polynomials.x.z);\r\n effect.setFloat3(\"vSphericalY\", polynomials.y.x, polynomials.y.y, polynomials.y.z);\r\n effect.setFloat3(\"vSphericalZ\", polynomials.z.x, polynomials.z.y, polynomials.z.z);\r\n effect.setFloat3(\"vSphericalXX_ZZ\", polynomials.xx.x - polynomials.zz.x, polynomials.xx.y - polynomials.zz.y, polynomials.xx.z - polynomials.zz.z);\r\n effect.setFloat3(\"vSphericalYY_ZZ\", polynomials.yy.x - polynomials.zz.x, polynomials.yy.y - polynomials.zz.y, polynomials.yy.z - polynomials.zz.z);\r\n effect.setFloat3(\"vSphericalZZ\", polynomials.zz.x, polynomials.zz.y, polynomials.zz.z);\r\n effect.setFloat3(\"vSphericalXY\", polynomials.xy.x, polynomials.xy.y, polynomials.xy.z);\r\n effect.setFloat3(\"vSphericalYZ\", polynomials.yz.x, polynomials.yz.y, polynomials.yz.z);\r\n effect.setFloat3(\"vSphericalZX\", polynomials.zx.x, polynomials.zx.y, polynomials.zx.z);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the code to inject in the vertex shader\r\n * @param state current state of the node material building\r\n * @returns the shader code\r\n */\r\n public override handleVertexSide(state: NodeMaterialBuildState): string {\r\n let code = super.handleVertexSide(state);\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n state._emitFunctionFromInclude(\"harmonicsFunctions\", `//${this.name}`, {\r\n replaceStrings: [\r\n { search: /uniform vec3 vSphericalL00;[\\s\\S]*?uniform vec3 vSphericalL22;/g, replace: \"\" },\r\n { search: /uniform vec3 vSphericalX;[\\s\\S]*?uniform vec3 vSphericalZX;/g, replace: \"\" },\r\n ],\r\n });\r\n\r\n const reflectionVectorName = state._getFreeVariableName(\"reflectionVector\");\r\n\r\n this._vEnvironmentIrradianceName = state._getFreeVariableName(\"vEnvironmentIrradiance\");\r\n\r\n state._emitVaryingFromString(\r\n this._vEnvironmentIrradianceName,\r\n NodeMaterialBlockConnectionPointTypes.Vector3,\r\n \"defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\"\r\n );\r\n\r\n state._emitUniformFromString(\"vSphericalL00\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL1_1\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL10\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL11\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL2_2\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL2_1\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL20\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL21\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n state._emitUniformFromString(\"vSphericalL22\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\");\r\n\r\n state._emitUniformFromString(\"vSphericalX\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalY\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalXX_ZZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalYY_ZZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalZZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalXY\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalYZ\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n state._emitUniformFromString(\"vSphericalZX\", NodeMaterialBlockConnectionPointTypes.Vector3, \"SPHERICAL_HARMONICS\", true);\r\n\r\n code += `#if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)\r\n ${state._declareLocalVar(reflectionVectorName, NodeMaterialBlockConnectionPointTypes.Vector3)} = (${(isWebGPU ? \"uniforms.\" : \"\") + this._reflectionMatrixName} * vec4${state.fSuffix}(normalize(${this.worldNormal.associatedVariableName}).xyz, 0)).xyz;\r\n #ifdef ${this._defineOppositeZ}\r\n ${reflectionVectorName}.z *= -1.0;\r\n #endif\r\n ${isWebGPU ? \"vertexOutputs.\" : \"\"}${this._vEnvironmentIrradianceName} = computeEnvironmentIrradiance(${reflectionVectorName});\r\n #endif\\n`;\r\n\r\n return code;\r\n }\r\n\r\n /**\r\n * Gets the main code of the block (fragment side)\r\n * @param state current state of the node material building\r\n * @param normalVarName name of the existing variable corresponding to the normal\r\n * @returns the shader code\r\n */\r\n public getCode(state: NodeMaterialBuildState, normalVarName: string): string {\r\n let code = \"\";\r\n\r\n this.handleFragmentSideInits(state);\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n\r\n state._emitFunctionFromInclude(\"harmonicsFunctions\", `//${this.name}`, {\r\n replaceStrings: [\r\n { search: /uniform vec3 vSphericalL00;[\\s\\S]*?uniform vec3 vSphericalL22;/g, replace: \"\" },\r\n { search: /uniform vec3 vSphericalX;[\\s\\S]*?uniform vec3 vSphericalZX;/g, replace: \"\" },\r\n ],\r\n });\r\n\r\n if (!isWebGPU) {\r\n state._emitFunction(\r\n \"sampleReflection\",\r\n `\r\n #ifdef ${this._define3DName}\r\n #define sampleReflection(s, c) textureCube(s, c)\r\n #else\r\n #define sampleReflection(s, c) texture2D(s, c)\r\n #endif\\n`,\r\n `//${this.name}`\r\n );\r\n\r\n state._emitFunction(\r\n \"sampleReflectionLod\",\r\n `\r\n #ifdef ${this._define3DName}\r\n #define sampleReflectionLod(s, c, l) textureCubeLodEXT(s, c, l)\r\n #else\r\n #define sampleReflectionLod(s, c, l) texture2DLodEXT(s, c, l)\r\n #endif\\n`,\r\n `//${this.name}`\r\n );\r\n }\r\n\r\n const computeReflectionCoordsFunc = isWebGPU\r\n ? `\r\n fn computeReflectionCoordsPBR(worldPos: vec4f, worldNormal: vec3f) -> vec3f {\r\n ${this.handleFragmentSideCodeReflectionCoords(state, \"worldNormal\", \"worldPos\", true, true)}\r\n return ${this._reflectionVectorName};\r\n }\\n`\r\n : `\r\n vec3 computeReflectionCoordsPBR(vec4 worldPos, vec3 worldNormal) {\r\n ${this.handleFragmentSideCodeReflectionCoords(state, \"worldNormal\", \"worldPos\", true, true)}\r\n return ${this._reflectionVectorName};\r\n }\\n`;\r\n\r\n state._emitFunction(\"computeReflectionCoordsPBR\", computeReflectionCoordsFunc, `//${this.name}`);\r\n\r\n this._vReflectionMicrosurfaceInfosName = state._getFreeVariableName(\"vReflectionMicrosurfaceInfos\");\r\n\r\n state._emitUniformFromString(this._vReflectionMicrosurfaceInfosName, NodeMaterialBlockConnectionPointTypes.Vector3);\r\n\r\n this._vReflectionInfosName = state._getFreeVariableName(\"vReflectionInfos\");\r\n\r\n this._vReflectionFilteringInfoName = state._getFreeVariableName(\"vReflectionFilteringInfo\");\r\n\r\n state._emitUniformFromString(this._vReflectionFilteringInfoName, NodeMaterialBlockConnectionPointTypes.Vector2);\r\n\r\n code += `#ifdef REFLECTION\r\n ${state._declareLocalVar(this._vReflectionInfosName, NodeMaterialBlockConnectionPointTypes.Vector2)} = vec2${state.fSuffix}(1., 0.);\r\n\r\n ${isWebGPU ? \"var reflectionOut: reflectionOutParams\" : \"reflectionOutParams reflectionOut\"};\r\n\r\n reflectionOut = reflectionBlock(\r\n ${this.generateOnlyFragmentCode ? this._worldPositionNameInFragmentOnlyMode : (isWebGPU ? \"input.\" : \"\") + \"v_\" + this.worldPosition.associatedVariableName}.xyz\r\n , ${normalVarName}\r\n , alphaG\r\n , ${(isWebGPU ? \"uniforms.\" : \"\") + this._vReflectionMicrosurfaceInfosName}\r\n , ${this._vReflectionInfosName}\r\n , ${this.reflectionColor}\r\n #ifdef ANISOTROPIC\r\n ,anisotropicOut\r\n #endif\r\n #if defined(${this._defineLODReflectionAlpha}) && !defined(${this._defineSkyboxName})\r\n ,NdotVUnclamped\r\n #endif\r\n #ifdef ${this._defineLinearSpecularReflection}\r\n , roughness\r\n #endif\r\n #ifdef ${this._define3DName}\r\n , ${this._cubeSamplerName}\r\n ${isWebGPU ? `, ${this._cubeSamplerName}Sampler` : \"\"}\r\n #else\r\n , ${this._2DSamplerName}\r\n ${isWebGPU ? `, ${this._2DSamplerName}Sampler` : \"\"}\r\n #endif\r\n #if defined(NORMAL) && defined(USESPHERICALINVERTEX)\r\n , ${isWebGPU ? \"input.\" : \"\"}${this._vEnvironmentIrradianceName}\r\n #endif\r\n #ifdef USESPHERICALFROMREFLECTIONMAP\r\n #if !defined(NORMAL) || !defined(USESPHERICALINVERTEX)\r\n , ${this._reflectionMatrixName}\r\n #endif\r\n #endif\r\n #ifdef USEIRRADIANCEMAP\r\n , irradianceSampler // ** not handled **\r\n ${isWebGPU ? `, irradianceSamplerSampler` : \"\"}\r\n #endif\r\n #ifndef LODBASEDMICROSFURACE\r\n #ifdef ${this._define3DName}\r\n , ${this._cubeSamplerName}\r\n ${isWebGPU ? `, ${this._cubeSamplerName}Sampler` : \"\"}\r\n , ${this._cubeSamplerName}\r\n ${isWebGPU ? `, ${this._cubeSamplerName}Sampler` : \"\"}\r\n #else\r\n , ${this._2DSamplerName}\r\n ${isWebGPU ? `, ${this._2DSamplerName}Sampler` : \"\"}\r\n , ${this._2DSamplerName} \r\n ${isWebGPU ? `, ${this._2DSamplerName}Sampler` : \"\"}\r\n #endif\r\n #endif\r\n #ifdef REALTIME_FILTERING\r\n , ${this._vReflectionFilteringInfoName}\r\n #ifdef IBL_CDF_FILTERING\r\n , icdfSampler // ** not handled **\r\n ${isWebGPU ? `, icdfSamplerSampler` : \"\"}\r\n #endif\r\n #endif\r\n );\r\n #endif\\n`;\r\n\r\n return code;\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n this._scene = state.sharedData.scene;\r\n\r\n if (state.target !== NodeMaterialBlockTargets.Fragment) {\r\n this._defineLODReflectionAlpha = state._getFreeDefineName(\"LODINREFLECTIONALPHA\");\r\n this._defineLinearSpecularReflection = state._getFreeDefineName(\"LINEARSPECULARREFLECTION\");\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 if (this.texture) {\r\n codeString += `${this._codeVariableName}.texture.gammaSpace = ${this.texture.gammaSpace};\\n`;\r\n }\r\n codeString += `${this._codeVariableName}.useSphericalHarmonics = ${this.useSphericalHarmonics};\\n`;\r\n codeString += `${this._codeVariableName}.forceIrradianceInFragment = ${this.forceIrradianceInFragment};\\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.useSphericalHarmonics = this.useSphericalHarmonics;\r\n serializationObject.forceIrradianceInFragment = this.forceIrradianceInFragment;\r\n serializationObject.gammaSpace = this.texture?.gammaSpace ?? true;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.useSphericalHarmonics = serializationObject.useSphericalHarmonics;\r\n this.forceIrradianceInFragment = serializationObject.forceIrradianceInFragment;\r\n if (this.texture) {\r\n this.texture.gammaSpace = serializationObject.gammaSpace;\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.ReflectionBlock\", ReflectionBlock);\r\n"]}
@@ -33,9 +33,13 @@ export declare class MorphTargetsBlock extends NodeMaterialBlock {
33
33
  */
34
34
  get tangent(): NodeMaterialConnectionPoint;
35
35
  /**
36
- * Gets the tangent input component
36
+ * Gets the uv input component
37
37
  */
38
38
  get uv(): NodeMaterialConnectionPoint;
39
+ /**
40
+ * Gets the uv2 input component
41
+ */
42
+ get uv2(): NodeMaterialConnectionPoint;
39
43
  /**
40
44
  * Gets the position output component
41
45
  */
@@ -49,9 +53,13 @@ export declare class MorphTargetsBlock extends NodeMaterialBlock {
49
53
  */
50
54
  get tangentOutput(): NodeMaterialConnectionPoint;
51
55
  /**
52
- * Gets the tangent output component
56
+ * Gets the uv output component
53
57
  */
54
58
  get uvOutput(): NodeMaterialConnectionPoint;
59
+ /**
60
+ * Gets the uv2 output component
61
+ */
62
+ get uv2Output(): NodeMaterialConnectionPoint;
55
63
  initialize(state: NodeMaterialBuildState): void;
56
64
  private _initShaderSourceAsync;
57
65
  autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
@@ -20,10 +20,12 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
20
20
  this.registerInput("tangent", NodeMaterialBlockConnectionPointTypes.AutoDetect);
21
21
  this.tangent.addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Color4 | NodeMaterialBlockConnectionPointTypes.Vector4 | NodeMaterialBlockConnectionPointTypes.Vector3);
22
22
  this.registerInput("uv", NodeMaterialBlockConnectionPointTypes.Vector2);
23
+ this.registerInput("uv2", NodeMaterialBlockConnectionPointTypes.Vector2);
23
24
  this.registerOutput("positionOutput", NodeMaterialBlockConnectionPointTypes.Vector3);
24
25
  this.registerOutput("normalOutput", NodeMaterialBlockConnectionPointTypes.Vector3);
25
26
  this.registerOutput("tangentOutput", NodeMaterialBlockConnectionPointTypes.Vector4);
26
27
  this.registerOutput("uvOutput", NodeMaterialBlockConnectionPointTypes.Vector2);
28
+ this.registerOutput("uv2Output", NodeMaterialBlockConnectionPointTypes.Vector2);
27
29
  }
28
30
  /**
29
31
  * Gets the current class name
@@ -51,11 +53,17 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
51
53
  return this._inputs[2];
52
54
  }
53
55
  /**
54
- * Gets the tangent input component
56
+ * Gets the uv input component
55
57
  */
56
58
  get uv() {
57
59
  return this._inputs[3];
58
60
  }
61
+ /**
62
+ * Gets the uv2 input component
63
+ */
64
+ get uv2() {
65
+ return this._inputs[4];
66
+ }
59
67
  /**
60
68
  * Gets the position output component
61
69
  */
@@ -75,11 +83,17 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
75
83
  return this._outputs[2];
76
84
  }
77
85
  /**
78
- * Gets the tangent output component
86
+ * Gets the uv output component
79
87
  */
80
88
  get uvOutput() {
81
89
  return this._outputs[3];
82
90
  }
91
+ /**
92
+ * Gets the uv2 output component
93
+ */
94
+ get uv2Output() {
95
+ return this._outputs[4];
96
+ }
83
97
  initialize(state) {
84
98
  state._excludeVariableName("morphTargetInfluences");
85
99
  this._initShaderSourceAsync(state.shaderLanguage);
@@ -138,6 +152,14 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
138
152
  }
139
153
  uvInput.output.connectTo(this.uv);
140
154
  }
155
+ if (!this.uv2.isConnected) {
156
+ let uv2Input = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === "uv2" && additionalFilteringInfo(b));
157
+ if (!uv2Input) {
158
+ uv2Input = new InputBlock("uv2");
159
+ uv2Input.setAsAttribute("uv2");
160
+ }
161
+ uv2Input.output.connectTo(this.uv2);
162
+ }
141
163
  }
142
164
  prepareDefines(mesh, nodeMaterial, defines) {
143
165
  if (mesh.morphTargetManager) {
@@ -164,16 +186,19 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
164
186
  const normal = this.normal;
165
187
  const tangent = this.tangent;
166
188
  const uv = this.uv;
189
+ const uv2 = this.uv2;
167
190
  const positionOutput = this.positionOutput;
168
191
  const normalOutput = this.normalOutput;
169
192
  const tangentOutput = this.tangentOutput;
170
193
  const uvOutput = this.uvOutput;
194
+ const uv2Output = this.uv2Output;
171
195
  const state = vertexShaderState;
172
196
  const repeatCount = defines.NUM_MORPH_INFLUENCERS;
173
197
  const manager = mesh.morphTargetManager;
174
198
  const hasNormals = manager && manager.supportsNormals && defines["NORMAL"];
175
199
  const hasTangents = manager && manager.supportsTangents && defines["TANGENT"];
176
200
  const hasUVs = manager && manager.supportsUVs && defines["UV1"];
201
+ const hasUV2s = manager && manager.supportsUV2s && defines["UV2"];
177
202
  let injectionCode = "";
178
203
  if (manager?.isUsingTextureForTargets && repeatCount > 0) {
179
204
  injectionCode += `${state._declareLocalVar("vertexID", NodeMaterialBlockConnectionPointTypes.Float)};\n`;
@@ -208,6 +233,12 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
208
233
  else {
209
234
  injectionCode += `${tangentOutput.associatedVariableName}.w = 1.;\n`;
210
235
  }
236
+ injectionCode += `vertexID += 1.0;\n`;
237
+ injectionCode += `#endif\n`;
238
+ }
239
+ if (hasUV2s) {
240
+ injectionCode += `#ifdef MORPHTARGETS_UV2\n`;
241
+ injectionCode += `${uv2Output.associatedVariableName} += (readVector3FromRawSampler(i, vertexID).xy - ${uv2.associatedVariableName}) * morphTargetInfluences[i];\n`;
211
242
  injectionCode += `#endif\n`;
212
243
  }
213
244
  injectionCode += "}\n";
@@ -236,6 +267,11 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
236
267
  }
237
268
  injectionCode += `#endif\n`;
238
269
  }
270
+ if (hasUV2s) {
271
+ injectionCode += `#ifdef MORPHTARGETS_UV2\n`;
272
+ injectionCode += `${uv2Output.associatedVariableName}.xy += (uv2_${index} - ${uv2.associatedVariableName}.xy) * morphTargetInfluences[${index}];\n`;
273
+ injectionCode += `#endif\n`;
274
+ }
239
275
  }
240
276
  }
241
277
  injectionCode += `#endif\n`;
@@ -252,6 +288,9 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
252
288
  if (hasUVs) {
253
289
  state.attributes.push(VertexBuffer.UVKind + "_" + index);
254
290
  }
291
+ if (hasUV2s) {
292
+ state.attributes.push(VertexBuffer.UV2Kind + "_" + index);
293
+ }
255
294
  }
256
295
  }
257
296
  }
@@ -268,10 +307,12 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
268
307
  const normal = this.normal;
269
308
  const tangent = this.tangent;
270
309
  const uv = this.uv;
310
+ const uv2 = this.uv2;
271
311
  const positionOutput = this.positionOutput;
272
312
  const normalOutput = this.normalOutput;
273
313
  const tangentOutput = this.tangentOutput;
274
314
  const uvOutput = this.uvOutput;
315
+ const uv2Output = this.uv2Output;
275
316
  const comments = `//${this.name}`;
276
317
  state.uniforms.push("morphTargetInfluences");
277
318
  state.uniforms.push("morphTargetCount");
@@ -298,6 +339,11 @@ export class MorphTargetsBlock extends NodeMaterialBlock {
298
339
  state.compilationString += `#else\n`;
299
340
  state.compilationString += `${state._declareOutput(uvOutput)} = vec2(0., 0.);\n`;
300
341
  state.compilationString += `#endif\n`;
342
+ state.compilationString += `#ifdef UV2\n`;
343
+ state.compilationString += `${state._declareOutput(uv2Output)} = ${uv2.associatedVariableName};\n`;
344
+ state.compilationString += `#else\n`;
345
+ state.compilationString += `${state._declareOutput(uv2Output)} = vec2(0., 0.);\n`;
346
+ state.compilationString += `#endif\n`;
301
347
  // Repeatable content
302
348
  this._repeatableContentAnchor = state._repeatableContentAnchor;
303
349
  state.compilationString += this._repeatableContentAnchor;
@@ -1 +1 @@
1
- {"version":3,"file":"morphTargetsBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAE1G,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAMhF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAG7G;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,iBAAiB;IAGpD;;;OAGG;IACH,YAAmB,IAAY;QAC3B,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAE7C,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QAC9E,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QAC5E,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,qCAAqC,CAAC,UAAU,CAAC,CAAC;QAChF,IAAI,CAAC,OAAO,CAAC,0CAA0C,CACnD,qCAAqC,CAAC,MAAM,GAAG,qCAAqC,CAAC,OAAO,GAAG,qCAAqC,CAAC,OAAO,CAC/I,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QACrF,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QACnF,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QACpF,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;IACnF,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,EAAE;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAEe,UAAU,CAAC,KAA6B;QACpD,KAAK,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,CAAC;QAEpD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,cAA8B;QAC/D,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,IAAI,cAAc,gCAAwB,EAAE,CAAC;YACzC,MAAM,OAAO,CAAC,GAAG,CAAC;gBACd,MAAM,CAAC,2DAA2D,CAAC;gBACnE,MAAM,CAAC,sEAAsE,CAAC;gBAC9E,MAAM,CAAC,iEAAiE,CAAC;gBACzE,MAAM,CAAC,4EAA4E,CAAC;aACvF,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,CAAC,GAAG,CAAC;gBACd,MAAM,CAAC,uDAAuD,CAAC;gBAC/D,MAAM,CAAC,kEAAkE,CAAC;gBAC1E,MAAM,CAAC,6DAA6D,CAAC;gBACrE,MAAM,CAAC,wEAAwE,CAAC;aACnF,CAAC,CAAC;QACP,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAEe,aAAa,CAAC,QAAsB,EAAE,0BAAgE,GAAG,EAAE,CAAC,IAAI;QAC5H,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC7B,IAAI,aAAa,GAAG,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,aAAa,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC3C,aAAa,CAAC,cAAc,EAAE,CAAC;YACnC,CAAC;YACD,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,WAAW,GAAG,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/H,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,WAAW,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACvC,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YACD,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5B,IAAI,YAAY,GAAG,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,YAAY,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;gBACzC,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC;YACD,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;YACvB,IAAI,OAAO,GAAG,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YAEvH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;IACL,CAAC;IAEe,cAAc,CAAC,IAAkB,EAAE,YAA0B,EAAE,OAA4B;QACvG,IAAW,IAAK,CAAC,kBAAkB,EAAE,CAAC;YAClC,MAAM,kBAAkB,GAAU,IAAK,CAAC,kBAAkB,CAAC;YAE3D,IAAI,kBAAkB,EAAE,wBAAwB,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,IAAI,kBAAkB,CAAC,cAAc,CAAC,KAAK,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACnK,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACpC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC/B,OAAO;QACX,CAAC;QAED,6BAA6B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAEe,IAAI,CAAC,MAAc,EAAE,YAA0B,EAAE,IAAW;QACxE,IAAI,IAAI,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAChF,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAExC,IAAI,IAAI,CAAC,kBAAkB,CAAC,wBAAwB,EAAE,CAAC;gBACnD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;IACL,CAAC;IAEe,wBAAwB,CACpC,iBAAyC,EACzC,mBAA2C,EAC3C,IAAkB,EAClB,OAA4B;QAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAChC,MAAM,WAAW,GAAG,OAAO,CAAC,qBAA+B,CAAC;QAE5D,MAAM,OAAO,GAAU,IAAK,CAAC,kBAAkB,CAAC;QAChD,MAAM,UAAU,GAAG,OAAO,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,OAAO,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,OAAO,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QAEhE,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,IAAI,OAAO,EAAE,wBAAwB,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACvD,aAAa,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,qCAAqC,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7G,CAAC;QAED,aAAa,IAAI,uBAAuB,CAAC;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,gCAAwB,CAAC;QAC9D,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,EAAE,wBAAwB,EAAE,CAAC;YACpC,aAAa,IAAI,QAAQ,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,6CAA6C,CAAC;YAC/F,aAAa,IAAI,YAAY,cAAc,gCAAgC,CAAC;YAE5E,aAAa,IAAI,cAAc,QAAQ,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,mBAAmB,OAAO,cAAc,6BAA6B,CAAC;YACjJ,aAAa,IAAI,GAAG,cAAc,CAAC,sBAAsB,iDAAiD,QAAQ,CAAC,sBAAsB,OAAO,cAAc,6BAA6B,CAAC;YAC5L,aAAa,IAAI,oBAAoB,CAAC;YAEtC,IAAI,UAAU,EAAE,CAAC;gBACb,aAAa,IAAI,8BAA8B,CAAC;gBAChD,aAAa,IAAI,GAAG,YAAY,CAAC,sBAAsB,iDAAiD,MAAM,CAAC,sBAAsB,OAAO,cAAc,6BAA6B,CAAC;gBACxL,aAAa,IAAI,oBAAoB,CAAC;gBACtC,aAAa,IAAI,UAAU,CAAC;YAChC,CAAC;YAED,IAAI,MAAM,EAAE,CAAC;gBACT,aAAa,IAAI,0BAA0B,CAAC;gBAC5C,aAAa,IAAI,GAAG,QAAQ,CAAC,sBAAsB,oDAAoD,EAAE,CAAC,sBAAsB,OAAO,cAAc,6BAA6B,CAAC;gBACnL,aAAa,IAAI,oBAAoB,CAAC;gBACtC,aAAa,IAAI,UAAU,CAAC;YAChC,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBACd,aAAa,IAAI,+BAA+B,CAAC;gBACjD,aAAa,IAAI,GAAG,aAAa,CAAC,sBAAsB,qDAAqD,OAAO,CAAC,sBAAsB,WAAW,cAAc,6BAA6B,CAAC;gBAElM,IAAI,OAAO,CAAC,IAAI,KAAK,qCAAqC,CAAC,OAAO,EAAE,CAAC;oBACjE,aAAa,IAAI,GAAG,aAAa,CAAC,sBAAsB,QAAQ,OAAO,CAAC,sBAAsB,OAAO,CAAC;gBAC1G,CAAC;qBAAM,CAAC;oBACJ,aAAa,IAAI,GAAG,aAAa,CAAC,sBAAsB,YAAY,CAAC;gBACzE,CAAC;gBACD,aAAa,IAAI,UAAU,CAAC;YAChC,CAAC;YAED,aAAa,IAAI,KAAK,CAAC;QAC3B,CAAC;aAAM,CAAC;YACJ,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/C,aAAa,IAAI,GAAG,cAAc,CAAC,sBAAsB,gBAAgB,KAAK,MAAM,QAAQ,CAAC,sBAAsB,OAAO,cAAc,yBAAyB,KAAK,MAAM,CAAC;gBAE7K,IAAI,UAAU,EAAE,CAAC;oBACb,aAAa,IAAI,8BAA8B,CAAC;oBAChD,aAAa,IAAI,GAAG,YAAY,CAAC,sBAAsB,cAAc,KAAK,MAAM,MAAM,CAAC,sBAAsB,OAAO,cAAc,yBAAyB,KAAK,MAAM,CAAC;oBACvK,aAAa,IAAI,UAAU,CAAC;gBAChC,CAAC;gBAED,IAAI,MAAM,EAAE,CAAC;oBACT,aAAa,IAAI,0BAA0B,CAAC;oBAC5C,aAAa,IAAI,GAAG,QAAQ,CAAC,sBAAsB,cAAc,KAAK,MAAM,EAAE,CAAC,sBAAsB,UAAU,cAAc,yBAAyB,KAAK,MAAM,CAAC;oBAClK,aAAa,IAAI,UAAU,CAAC;gBAChC,CAAC;gBAED,IAAI,WAAW,EAAE,CAAC;oBACd,aAAa,IAAI,+BAA+B,CAAC;oBACjD,aAAa,IAAI,GAAG,aAAa,CAAC,sBAAsB,mBAAmB,KAAK,MAAM,OAAO,CAAC,sBAAsB,WAAW,cAAc,yBAAyB,KAAK,MAAM,CAAC;oBAElL,IAAI,OAAO,CAAC,IAAI,KAAK,qCAAqC,CAAC,OAAO,EAAE,CAAC;wBACjE,aAAa,IAAI,GAAG,aAAa,CAAC,sBAAsB,QAAQ,OAAO,CAAC,sBAAsB,OAAO,CAAC;oBAC1G,CAAC;yBAAM,CAAC;wBACJ,aAAa,IAAI,GAAG,aAAa,CAAC,sBAAsB,YAAY,CAAC;oBACzE,CAAC;oBACD,aAAa,IAAI,UAAU,CAAC;gBAChC,CAAC;YACL,CAAC;QACL,CAAC;QACD,aAAa,IAAI,UAAU,CAAC;QAE5B,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;QAExG,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAClB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC/C,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC;gBAEzD,IAAI,UAAU,EAAE,CAAC;oBACb,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC;gBAC3D,CAAC;gBAED,IAAI,WAAW,EAAE,CAAC;oBACd,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC;gBAC5D,CAAC;gBAED,IAAI,MAAM,EAAE,CAAC;oBACT,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;gBAC7D,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAEkB,WAAW,CAAC,KAA6B;QACxD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzB,uBAAuB;QACvB,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9C,uBAAuB;QACvB,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3C,6CAA6C;QAC7C,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpD,YAAY;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAElC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC7C,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACxC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC9C,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACjD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEpC,KAAK,CAAC,wBAAwB,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC;QAChF,KAAK,CAAC,wBAAwB,CAAC,+BAA+B,EAAE,QAAQ,EAAE;YACtE,SAAS,EAAE,6BAA6B;SAC3C,CAAC,CAAC;QAEH,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,QAAQ,CAAC,sBAAsB,KAAK,CAAC;QAC7G,KAAK,CAAC,iBAAiB,IAAI,iBAAiB,CAAC;QAC7C,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,MAAM,CAAC,sBAAsB,KAAK,CAAC;QACzG,KAAK,CAAC,iBAAiB,IAAI,SAAS,CAAC;QACrC,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,wBAAwB,CAAC;QACzF,KAAK,CAAC,iBAAiB,IAAI,UAAU,CAAC;QACtC,KAAK,CAAC,iBAAiB,IAAI,kBAAkB,CAAC;QAC9C,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,OAAO,CAAC,sBAAsB,KAAK,CAAC;QAC3G,KAAK,CAAC,iBAAiB,IAAI,SAAS,CAAC;QACrC,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,4BAA4B,CAAC;QAC9F,KAAK,CAAC,iBAAiB,IAAI,UAAU,CAAC;QACtC,KAAK,CAAC,iBAAiB,IAAI,cAAc,CAAC;QAC1C,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,sBAAsB,KAAK,CAAC;QACjG,KAAK,CAAC,iBAAiB,IAAI,SAAS,CAAC;QACrC,KAAK,CAAC,iBAAiB,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACjF,KAAK,CAAC,iBAAiB,IAAI,UAAU,CAAC;QAEtC,qBAAqB;QACrB,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC,wBAAwB,CAAC;QAC/D,KAAK,CAAC,iBAAiB,IAAI,IAAI,CAAC,wBAAwB,CAAC;QAEzD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED,aAAa,CAAC,2BAA2B,EAAE,iBAAiB,CAAC,CAAC","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 type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport type { Mesh } from \"../../../../Meshes/mesh\";\r\nimport { VertexBuffer } from \"../../../../Buffers/buffer\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\nimport { BindMorphTargetParameters, PrepareDefinesForMorphTargets } from \"../../../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to add morph targets support to vertex shader\r\n */\r\nexport class MorphTargetsBlock extends NodeMaterialBlock {\r\n private _repeatableContentAnchor: string;\r\n\r\n /**\r\n * Create a new MorphTargetsBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex);\r\n\r\n this.registerInput(\"position\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerInput(\"normal\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerInput(\"tangent\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.tangent.addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Color4 | NodeMaterialBlockConnectionPointTypes.Vector4 | NodeMaterialBlockConnectionPointTypes.Vector3\r\n );\r\n this.registerInput(\"uv\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n this.registerOutput(\"positionOutput\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerOutput(\"normalOutput\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerOutput(\"tangentOutput\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.registerOutput(\"uvOutput\", NodeMaterialBlockConnectionPointTypes.Vector2);\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 \"MorphTargetsBlock\";\r\n }\r\n\r\n /**\r\n * Gets the position input component\r\n */\r\n public get position(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\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[1];\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[2];\r\n }\r\n\r\n /**\r\n * Gets the tangent input component\r\n */\r\n public get uv(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the position output component\r\n */\r\n public get positionOutput(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the normal output component\r\n */\r\n public get normalOutput(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the tangent output component\r\n */\r\n public get tangentOutput(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the tangent output component\r\n */\r\n public get uvOutput(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"morphTargetInfluences\");\r\n\r\n this._initShaderSourceAsync(state.shaderLanguage);\r\n }\r\n\r\n private async _initShaderSourceAsync(shaderLanguage: ShaderLanguage) {\r\n this._codeIsReady = false;\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([\r\n import(\"../../../../ShadersWGSL/ShadersInclude/morphTargetsVertex\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobal\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobalDeclaration\"),\r\n ]);\r\n } else {\r\n await Promise.all([\r\n import(\"../../../../Shaders/ShadersInclude/morphTargetsVertex\"),\r\n import(\"../../../../Shaders/ShadersInclude/morphTargetsVertexDeclaration\"),\r\n import(\"../../../../Shaders/ShadersInclude/morphTargetsVertexGlobal\"),\r\n import(\"../../../../Shaders/ShadersInclude/morphTargetsVertexGlobalDeclaration\"),\r\n ]);\r\n }\r\n\r\n this._codeIsReady = true;\r\n this.onCodeIsReadyObservable.notifyObservers(this);\r\n }\r\n\r\n public override autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n if (!this.position.isConnected) {\r\n let positionInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"position\" && additionalFilteringInfo(b));\r\n\r\n if (!positionInput) {\r\n positionInput = new InputBlock(\"position\");\r\n positionInput.setAsAttribute();\r\n }\r\n positionInput.output.connectTo(this.position);\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 if (!this.tangent.isConnected) {\r\n let tangentInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"tangent\" && additionalFilteringInfo(b));\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 if (!this.uv.isConnected) {\r\n let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"uv\" && additionalFilteringInfo(b));\r\n\r\n if (!uvInput) {\r\n uvInput = new InputBlock(\"uv\");\r\n uvInput.setAsAttribute(\"uv\");\r\n }\r\n uvInput.output.connectTo(this.uv);\r\n }\r\n }\r\n\r\n public override prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n if ((<Mesh>mesh).morphTargetManager) {\r\n const morphTargetManager = (<Mesh>mesh).morphTargetManager;\r\n\r\n if (morphTargetManager?.isUsingTextureForTargets && (morphTargetManager.numMaxInfluencers || morphTargetManager.numInfluencers) !== defines[\"NUM_MORPH_INFLUENCERS\"]) {\r\n defines.markAsAttributesDirty();\r\n }\r\n }\r\n\r\n if (!defines._areAttributesDirty) {\r\n return;\r\n }\r\n\r\n PrepareDefinesForMorphTargets(mesh, defines);\r\n }\r\n\r\n public override bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh) {\r\n if (mesh && mesh.morphTargetManager && mesh.morphTargetManager.numInfluencers > 0) {\r\n BindMorphTargetParameters(mesh, effect);\r\n\r\n if (mesh.morphTargetManager.isUsingTextureForTargets) {\r\n mesh.morphTargetManager._bind(effect);\r\n }\r\n }\r\n }\r\n\r\n public override replaceRepeatableContent(\r\n vertexShaderState: NodeMaterialBuildState,\r\n fragmentShaderState: NodeMaterialBuildState,\r\n mesh: AbstractMesh,\r\n defines: NodeMaterialDefines\r\n ) {\r\n const position = this.position;\r\n const normal = this.normal;\r\n const tangent = this.tangent;\r\n const uv = this.uv;\r\n const positionOutput = this.positionOutput;\r\n const normalOutput = this.normalOutput;\r\n const tangentOutput = this.tangentOutput;\r\n const uvOutput = this.uvOutput;\r\n const state = vertexShaderState;\r\n const repeatCount = defines.NUM_MORPH_INFLUENCERS as number;\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n const hasNormals = manager && manager.supportsNormals && defines[\"NORMAL\"];\r\n const hasTangents = manager && manager.supportsTangents && defines[\"TANGENT\"];\r\n const hasUVs = manager && manager.supportsUVs && defines[\"UV1\"];\r\n\r\n let injectionCode = \"\";\r\n\r\n if (manager?.isUsingTextureForTargets && repeatCount > 0) {\r\n injectionCode += `${state._declareLocalVar(\"vertexID\", NodeMaterialBlockConnectionPointTypes.Float)};\\n`;\r\n }\r\n\r\n injectionCode += `#ifdef MORPHTARGETS\\n`;\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n const uniformsPrefix = isWebGPU ? \"uniforms.\" : \"\";\r\n if (manager?.isUsingTextureForTargets) {\r\n injectionCode += `for (${isWebGPU ? \"var\" : \"int\"} i = 0; i < NUM_MORPH_INFLUENCERS; i++) {\\n`;\r\n injectionCode += `if (i >= ${uniformsPrefix}morphTargetCount) { break; }\\n`;\r\n\r\n injectionCode += `vertexID = ${isWebGPU ? \"f32(vertexInputs.vertexIndex\" : \"float(gl_VertexID\"}) * ${uniformsPrefix}morphTargetTextureInfo.x;\\n`;\r\n injectionCode += `${positionOutput.associatedVariableName} += (readVector3FromRawSampler(i, vertexID) - ${position.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[i];\\n`;\r\n injectionCode += `vertexID += 1.0;\\n`;\r\n\r\n if (hasNormals) {\r\n injectionCode += `#ifdef MORPHTARGETS_NORMAL\\n`;\r\n injectionCode += `${normalOutput.associatedVariableName} += (readVector3FromRawSampler(i, vertexID) - ${normal.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[i];\\n`;\r\n injectionCode += `vertexID += 1.0;\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasUVs) {\r\n injectionCode += `#ifdef MORPHTARGETS_UV\\n`;\r\n injectionCode += `${uvOutput.associatedVariableName} += (readVector3FromRawSampler(i, vertexID).xy - ${uv.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[i];\\n`;\r\n injectionCode += `vertexID += 1.0;\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasTangents) {\r\n injectionCode += `#ifdef MORPHTARGETS_TANGENT\\n`;\r\n injectionCode += `${tangentOutput.associatedVariableName}.xyz += (readVector3FromRawSampler(i, vertexID) - ${tangent.associatedVariableName}.xyz) * ${uniformsPrefix}morphTargetInfluences[i];\\n`;\r\n\r\n if (tangent.type === NodeMaterialBlockConnectionPointTypes.Vector4) {\r\n injectionCode += `${tangentOutput.associatedVariableName}.w = ${tangent.associatedVariableName}.w;\\n`;\r\n } else {\r\n injectionCode += `${tangentOutput.associatedVariableName}.w = 1.;\\n`;\r\n }\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n injectionCode += \"}\\n\";\r\n } else {\r\n for (let index = 0; index < repeatCount; index++) {\r\n injectionCode += `${positionOutput.associatedVariableName} += (position${index} - ${position.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[${index}];\\n`;\r\n\r\n if (hasNormals) {\r\n injectionCode += `#ifdef MORPHTARGETS_NORMAL\\n`;\r\n injectionCode += `${normalOutput.associatedVariableName} += (normal${index} - ${normal.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[${index}];\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasUVs) {\r\n injectionCode += `#ifdef MORPHTARGETS_UV\\n`;\r\n injectionCode += `${uvOutput.associatedVariableName}.xy += (uv_${index} - ${uv.associatedVariableName}.xy) * ${uniformsPrefix}morphTargetInfluences[${index}];\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasTangents) {\r\n injectionCode += `#ifdef MORPHTARGETS_TANGENT\\n`;\r\n injectionCode += `${tangentOutput.associatedVariableName}.xyz += (tangent${index} - ${tangent.associatedVariableName}.xyz) * ${uniformsPrefix}morphTargetInfluences[${index}];\\n`;\r\n\r\n if (tangent.type === NodeMaterialBlockConnectionPointTypes.Vector4) {\r\n injectionCode += `${tangentOutput.associatedVariableName}.w = ${tangent.associatedVariableName}.w;\\n`;\r\n } else {\r\n injectionCode += `${tangentOutput.associatedVariableName}.w = 1.;\\n`;\r\n }\r\n injectionCode += `#endif\\n`;\r\n }\r\n }\r\n }\r\n injectionCode += `#endif\\n`;\r\n\r\n state.compilationString = state.compilationString.replace(this._repeatableContentAnchor, injectionCode);\r\n\r\n if (repeatCount > 0) {\r\n for (let index = 0; index < repeatCount; index++) {\r\n state.attributes.push(VertexBuffer.PositionKind + index);\r\n\r\n if (hasNormals) {\r\n state.attributes.push(VertexBuffer.NormalKind + index);\r\n }\r\n\r\n if (hasTangents) {\r\n state.attributes.push(VertexBuffer.TangentKind + index);\r\n }\r\n\r\n if (hasUVs) {\r\n state.attributes.push(VertexBuffer.UVKind + \"_\" + index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n // Register for defines\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n // Register for binding\r\n state.sharedData.bindableBlocks.push(this);\r\n\r\n // Register for repeatable content generation\r\n state.sharedData.repeatableContentBlocks.push(this);\r\n\r\n // Emit code\r\n const position = this.position;\r\n const normal = this.normal;\r\n const tangent = this.tangent;\r\n const uv = this.uv;\r\n const positionOutput = this.positionOutput;\r\n const normalOutput = this.normalOutput;\r\n const tangentOutput = this.tangentOutput;\r\n const uvOutput = this.uvOutput;\r\n const comments = `//${this.name}`;\r\n\r\n state.uniforms.push(\"morphTargetInfluences\");\r\n state.uniforms.push(\"morphTargetCount\");\r\n state.uniforms.push(\"morphTargetTextureInfo\");\r\n state.uniforms.push(\"morphTargetTextureIndices\");\r\n state.samplers.push(\"morphTargets\");\r\n\r\n state._emitFunctionFromInclude(\"morphTargetsVertexGlobalDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"morphTargetsVertexDeclaration\", comments, {\r\n repeatKey: \"maxSimultaneousMorphTargets\",\r\n });\r\n\r\n state.compilationString += `${state._declareOutput(positionOutput)} = ${position.associatedVariableName};\\n`;\r\n state.compilationString += `#ifdef NORMAL\\n`;\r\n state.compilationString += `${state._declareOutput(normalOutput)} = ${normal.associatedVariableName};\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(normalOutput)} = vec3(0., 0., 0.);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n state.compilationString += `#ifdef TANGENT\\n`;\r\n state.compilationString += `${state._declareOutput(tangentOutput)} = ${tangent.associatedVariableName};\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(tangentOutput)} = vec4(0., 0., 0., 0.);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n state.compilationString += `#ifdef UV1\\n`;\r\n state.compilationString += `${state._declareOutput(uvOutput)} = ${uv.associatedVariableName};\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(uvOutput)} = vec2(0., 0.);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n // Repeatable content\r\n this._repeatableContentAnchor = state._repeatableContentAnchor;\r\n state.compilationString += this._repeatableContentAnchor;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.MorphTargetsBlock\", MorphTargetsBlock);\r\n"]}
1
+ {"version":3,"file":"morphTargetsBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.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 type { AbstractMesh } from \"../../../../Meshes/abstractMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"../../nodeMaterial\";\r\nimport type { Effect } from \"../../../effect\";\r\nimport type { Mesh } from \"../../../../Meshes/mesh\";\r\nimport { VertexBuffer } from \"../../../../Buffers/buffer\";\r\nimport { InputBlock } from \"../Input/inputBlock\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\nimport { BindMorphTargetParameters, PrepareDefinesForMorphTargets } from \"../../../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to add morph targets support to vertex shader\r\n */\r\nexport class MorphTargetsBlock extends NodeMaterialBlock {\r\n private _repeatableContentAnchor: string;\r\n\r\n /**\r\n * Create a new MorphTargetsBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Vertex);\r\n\r\n this.registerInput(\"position\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerInput(\"normal\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerInput(\"tangent\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.tangent.addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Color4 | NodeMaterialBlockConnectionPointTypes.Vector4 | NodeMaterialBlockConnectionPointTypes.Vector3\r\n );\r\n this.registerInput(\"uv\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n this.registerInput(\"uv2\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n this.registerOutput(\"positionOutput\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerOutput(\"normalOutput\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerOutput(\"tangentOutput\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.registerOutput(\"uvOutput\", NodeMaterialBlockConnectionPointTypes.Vector2);\r\n this.registerOutput(\"uv2Output\", NodeMaterialBlockConnectionPointTypes.Vector2);\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 \"MorphTargetsBlock\";\r\n }\r\n\r\n /**\r\n * Gets the position input component\r\n */\r\n public get position(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\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[1];\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[2];\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[3];\r\n }\r\n\r\n /**\r\n * Gets the uv2 input component\r\n */\r\n public get uv2(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the position output component\r\n */\r\n public get positionOutput(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the normal output component\r\n */\r\n public get normalOutput(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the tangent output component\r\n */\r\n public get tangentOutput(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the uv output component\r\n */\r\n public get uvOutput(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the uv2 output component\r\n */\r\n public get uv2Output(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n public override initialize(state: NodeMaterialBuildState) {\r\n state._excludeVariableName(\"morphTargetInfluences\");\r\n\r\n this._initShaderSourceAsync(state.shaderLanguage);\r\n }\r\n\r\n private async _initShaderSourceAsync(shaderLanguage: ShaderLanguage) {\r\n this._codeIsReady = false;\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([\r\n import(\"../../../../ShadersWGSL/ShadersInclude/morphTargetsVertex\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobal\"),\r\n import(\"../../../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobalDeclaration\"),\r\n ]);\r\n } else {\r\n await Promise.all([\r\n import(\"../../../../Shaders/ShadersInclude/morphTargetsVertex\"),\r\n import(\"../../../../Shaders/ShadersInclude/morphTargetsVertexDeclaration\"),\r\n import(\"../../../../Shaders/ShadersInclude/morphTargetsVertexGlobal\"),\r\n import(\"../../../../Shaders/ShadersInclude/morphTargetsVertexGlobalDeclaration\"),\r\n ]);\r\n }\r\n\r\n this._codeIsReady = true;\r\n this.onCodeIsReadyObservable.notifyObservers(this);\r\n }\r\n\r\n public override autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n if (!this.position.isConnected) {\r\n let positionInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"position\" && additionalFilteringInfo(b));\r\n\r\n if (!positionInput) {\r\n positionInput = new InputBlock(\"position\");\r\n positionInput.setAsAttribute();\r\n }\r\n positionInput.output.connectTo(this.position);\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 if (!this.tangent.isConnected) {\r\n let tangentInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"tangent\" && additionalFilteringInfo(b));\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 if (!this.uv.isConnected) {\r\n let uvInput = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"uv\" && additionalFilteringInfo(b));\r\n\r\n if (!uvInput) {\r\n uvInput = new InputBlock(\"uv\");\r\n uvInput.setAsAttribute(\"uv\");\r\n }\r\n uvInput.output.connectTo(this.uv);\r\n }\r\n if (!this.uv2.isConnected) {\r\n let uv2Input = material.getInputBlockByPredicate((b) => b.isAttribute && b.name === \"uv2\" && additionalFilteringInfo(b));\r\n\r\n if (!uv2Input) {\r\n uv2Input = new InputBlock(\"uv2\");\r\n uv2Input.setAsAttribute(\"uv2\");\r\n }\r\n uv2Input.output.connectTo(this.uv2);\r\n }\r\n }\r\n\r\n public override prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines) {\r\n if ((<Mesh>mesh).morphTargetManager) {\r\n const morphTargetManager = (<Mesh>mesh).morphTargetManager;\r\n\r\n if (morphTargetManager?.isUsingTextureForTargets && (morphTargetManager.numMaxInfluencers || morphTargetManager.numInfluencers) !== defines[\"NUM_MORPH_INFLUENCERS\"]) {\r\n defines.markAsAttributesDirty();\r\n }\r\n }\r\n\r\n if (!defines._areAttributesDirty) {\r\n return;\r\n }\r\n\r\n PrepareDefinesForMorphTargets(mesh, defines);\r\n }\r\n\r\n public override bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh) {\r\n if (mesh && mesh.morphTargetManager && mesh.morphTargetManager.numInfluencers > 0) {\r\n BindMorphTargetParameters(mesh, effect);\r\n\r\n if (mesh.morphTargetManager.isUsingTextureForTargets) {\r\n mesh.morphTargetManager._bind(effect);\r\n }\r\n }\r\n }\r\n\r\n public override replaceRepeatableContent(\r\n vertexShaderState: NodeMaterialBuildState,\r\n fragmentShaderState: NodeMaterialBuildState,\r\n mesh: AbstractMesh,\r\n defines: NodeMaterialDefines\r\n ) {\r\n const position = this.position;\r\n const normal = this.normal;\r\n const tangent = this.tangent;\r\n const uv = this.uv;\r\n const uv2 = this.uv2;\r\n const positionOutput = this.positionOutput;\r\n const normalOutput = this.normalOutput;\r\n const tangentOutput = this.tangentOutput;\r\n const uvOutput = this.uvOutput;\r\n const uv2Output = this.uv2Output;\r\n const state = vertexShaderState;\r\n const repeatCount = defines.NUM_MORPH_INFLUENCERS as number;\r\n\r\n const manager = (<Mesh>mesh).morphTargetManager;\r\n const hasNormals = manager && manager.supportsNormals && defines[\"NORMAL\"];\r\n const hasTangents = manager && manager.supportsTangents && defines[\"TANGENT\"];\r\n const hasUVs = manager && manager.supportsUVs && defines[\"UV1\"];\r\n const hasUV2s = manager && manager.supportsUV2s && defines[\"UV2\"];\r\n\r\n let injectionCode = \"\";\r\n\r\n if (manager?.isUsingTextureForTargets && repeatCount > 0) {\r\n injectionCode += `${state._declareLocalVar(\"vertexID\", NodeMaterialBlockConnectionPointTypes.Float)};\\n`;\r\n }\r\n\r\n injectionCode += `#ifdef MORPHTARGETS\\n`;\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n const uniformsPrefix = isWebGPU ? \"uniforms.\" : \"\";\r\n if (manager?.isUsingTextureForTargets) {\r\n injectionCode += `for (${isWebGPU ? \"var\" : \"int\"} i = 0; i < NUM_MORPH_INFLUENCERS; i++) {\\n`;\r\n injectionCode += `if (i >= ${uniformsPrefix}morphTargetCount) { break; }\\n`;\r\n\r\n injectionCode += `vertexID = ${isWebGPU ? \"f32(vertexInputs.vertexIndex\" : \"float(gl_VertexID\"}) * ${uniformsPrefix}morphTargetTextureInfo.x;\\n`;\r\n injectionCode += `${positionOutput.associatedVariableName} += (readVector3FromRawSampler(i, vertexID) - ${position.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[i];\\n`;\r\n injectionCode += `vertexID += 1.0;\\n`;\r\n\r\n if (hasNormals) {\r\n injectionCode += `#ifdef MORPHTARGETS_NORMAL\\n`;\r\n injectionCode += `${normalOutput.associatedVariableName} += (readVector3FromRawSampler(i, vertexID) - ${normal.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[i];\\n`;\r\n injectionCode += `vertexID += 1.0;\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasUVs) {\r\n injectionCode += `#ifdef MORPHTARGETS_UV\\n`;\r\n injectionCode += `${uvOutput.associatedVariableName} += (readVector3FromRawSampler(i, vertexID).xy - ${uv.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[i];\\n`;\r\n injectionCode += `vertexID += 1.0;\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasTangents) {\r\n injectionCode += `#ifdef MORPHTARGETS_TANGENT\\n`;\r\n injectionCode += `${tangentOutput.associatedVariableName}.xyz += (readVector3FromRawSampler(i, vertexID) - ${tangent.associatedVariableName}.xyz) * ${uniformsPrefix}morphTargetInfluences[i];\\n`;\r\n\r\n if (tangent.type === NodeMaterialBlockConnectionPointTypes.Vector4) {\r\n injectionCode += `${tangentOutput.associatedVariableName}.w = ${tangent.associatedVariableName}.w;\\n`;\r\n } else {\r\n injectionCode += `${tangentOutput.associatedVariableName}.w = 1.;\\n`;\r\n }\r\n injectionCode += `vertexID += 1.0;\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasUV2s) {\r\n injectionCode += `#ifdef MORPHTARGETS_UV2\\n`;\r\n injectionCode += `${uv2Output.associatedVariableName} += (readVector3FromRawSampler(i, vertexID).xy - ${uv2.associatedVariableName}) * morphTargetInfluences[i];\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n injectionCode += \"}\\n\";\r\n } else {\r\n for (let index = 0; index < repeatCount; index++) {\r\n injectionCode += `${positionOutput.associatedVariableName} += (position${index} - ${position.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[${index}];\\n`;\r\n\r\n if (hasNormals) {\r\n injectionCode += `#ifdef MORPHTARGETS_NORMAL\\n`;\r\n injectionCode += `${normalOutput.associatedVariableName} += (normal${index} - ${normal.associatedVariableName}) * ${uniformsPrefix}morphTargetInfluences[${index}];\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasUVs) {\r\n injectionCode += `#ifdef MORPHTARGETS_UV\\n`;\r\n injectionCode += `${uvOutput.associatedVariableName}.xy += (uv_${index} - ${uv.associatedVariableName}.xy) * ${uniformsPrefix}morphTargetInfluences[${index}];\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasTangents) {\r\n injectionCode += `#ifdef MORPHTARGETS_TANGENT\\n`;\r\n injectionCode += `${tangentOutput.associatedVariableName}.xyz += (tangent${index} - ${tangent.associatedVariableName}.xyz) * ${uniformsPrefix}morphTargetInfluences[${index}];\\n`;\r\n\r\n if (tangent.type === NodeMaterialBlockConnectionPointTypes.Vector4) {\r\n injectionCode += `${tangentOutput.associatedVariableName}.w = ${tangent.associatedVariableName}.w;\\n`;\r\n } else {\r\n injectionCode += `${tangentOutput.associatedVariableName}.w = 1.;\\n`;\r\n }\r\n injectionCode += `#endif\\n`;\r\n }\r\n\r\n if (hasUV2s) {\r\n injectionCode += `#ifdef MORPHTARGETS_UV2\\n`;\r\n injectionCode += `${uv2Output.associatedVariableName}.xy += (uv2_${index} - ${uv2.associatedVariableName}.xy) * morphTargetInfluences[${index}];\\n`;\r\n injectionCode += `#endif\\n`;\r\n }\r\n }\r\n }\r\n injectionCode += `#endif\\n`;\r\n\r\n state.compilationString = state.compilationString.replace(this._repeatableContentAnchor, injectionCode);\r\n\r\n if (repeatCount > 0) {\r\n for (let index = 0; index < repeatCount; index++) {\r\n state.attributes.push(VertexBuffer.PositionKind + index);\r\n\r\n if (hasNormals) {\r\n state.attributes.push(VertexBuffer.NormalKind + index);\r\n }\r\n\r\n if (hasTangents) {\r\n state.attributes.push(VertexBuffer.TangentKind + index);\r\n }\r\n\r\n if (hasUVs) {\r\n state.attributes.push(VertexBuffer.UVKind + \"_\" + index);\r\n }\r\n\r\n if (hasUV2s) {\r\n state.attributes.push(VertexBuffer.UV2Kind + \"_\" + index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n // Register for defines\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n // Register for binding\r\n state.sharedData.bindableBlocks.push(this);\r\n\r\n // Register for repeatable content generation\r\n state.sharedData.repeatableContentBlocks.push(this);\r\n\r\n // Emit code\r\n const position = this.position;\r\n const normal = this.normal;\r\n const tangent = this.tangent;\r\n const uv = this.uv;\r\n const uv2 = this.uv2;\r\n const positionOutput = this.positionOutput;\r\n const normalOutput = this.normalOutput;\r\n const tangentOutput = this.tangentOutput;\r\n const uvOutput = this.uvOutput;\r\n const uv2Output = this.uv2Output;\r\n const comments = `//${this.name}`;\r\n\r\n state.uniforms.push(\"morphTargetInfluences\");\r\n state.uniforms.push(\"morphTargetCount\");\r\n state.uniforms.push(\"morphTargetTextureInfo\");\r\n state.uniforms.push(\"morphTargetTextureIndices\");\r\n state.samplers.push(\"morphTargets\");\r\n\r\n state._emitFunctionFromInclude(\"morphTargetsVertexGlobalDeclaration\", comments);\r\n state._emitFunctionFromInclude(\"morphTargetsVertexDeclaration\", comments, {\r\n repeatKey: \"maxSimultaneousMorphTargets\",\r\n });\r\n\r\n state.compilationString += `${state._declareOutput(positionOutput)} = ${position.associatedVariableName};\\n`;\r\n state.compilationString += `#ifdef NORMAL\\n`;\r\n state.compilationString += `${state._declareOutput(normalOutput)} = ${normal.associatedVariableName};\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(normalOutput)} = vec3(0., 0., 0.);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n state.compilationString += `#ifdef TANGENT\\n`;\r\n state.compilationString += `${state._declareOutput(tangentOutput)} = ${tangent.associatedVariableName};\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(tangentOutput)} = vec4(0., 0., 0., 0.);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n state.compilationString += `#ifdef UV1\\n`;\r\n state.compilationString += `${state._declareOutput(uvOutput)} = ${uv.associatedVariableName};\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(uvOutput)} = vec2(0., 0.);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n state.compilationString += `#ifdef UV2\\n`;\r\n state.compilationString += `${state._declareOutput(uv2Output)} = ${uv2.associatedVariableName};\\n`;\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${state._declareOutput(uv2Output)} = vec2(0., 0.);\\n`;\r\n state.compilationString += `#endif\\n`;\r\n\r\n // Repeatable content\r\n this._repeatableContentAnchor = state._repeatableContentAnchor;\r\n state.compilationString += this._repeatableContentAnchor;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.MorphTargetsBlock\", MorphTargetsBlock);\r\n"]}
@@ -88,6 +88,9 @@ export class MeshAttributeExistsBlock extends NodeMaterialBlock {
88
88
  case "uvOutput":
89
89
  this.attributeType = 4 /* MeshAttributeExistsBlockTypes.UV1 */;
90
90
  break;
91
+ case "uv2Output":
92
+ this.attributeType = 5 /* MeshAttributeExistsBlockTypes.UV2 */;
93
+ break;
91
94
  }
92
95
  }
93
96
  });
@@ -1 +1 @@
1
- {"version":3,"file":"meshAttributeExistsBlock.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Materials/Node/Blocks/meshAttributeExistsBlock.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 type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { InputBlock } from \"./Input/inputBlock\";\r\nimport { MorphTargetsBlock } from \"./Vertex/morphTargetsBlock\";\r\nimport { PropertyTypeForEdition, editableInPropertyPage } from \"../../../Decorators/nodeDecorator\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nexport const enum MeshAttributeExistsBlockTypes {\r\n None,\r\n Normal,\r\n Tangent,\r\n VertexColor,\r\n UV1,\r\n UV2,\r\n UV3,\r\n UV4,\r\n UV5,\r\n UV6,\r\n}\r\n\r\n/**\r\n * Block used to check if Mesh attribute of specified type exists\r\n * and provide an alternative fallback input for to use in such case\r\n */\r\nexport class MeshAttributeExistsBlock extends NodeMaterialBlock {\r\n /**\r\n * Creates a new MeshAttributeExistsBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"input\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"fallback\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this._outputs[0]._typeConnectionSource = this._inputs[0];\r\n this._linkConnectionTypes(0, 1);\r\n\r\n // Try to auto determine attributeType\r\n this._inputs[0].onConnectionObservable.add((other) => {\r\n if (this.attributeType) {\r\n // But only if not already specified\r\n return;\r\n }\r\n const sourceBlock = other.ownerBlock;\r\n if (sourceBlock instanceof InputBlock && sourceBlock.isAttribute) {\r\n switch (sourceBlock.name) {\r\n case \"color\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.VertexColor;\r\n break;\r\n case \"normal\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.Normal;\r\n break;\r\n case \"tangent\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.Tangent;\r\n break;\r\n case \"uv\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV1;\r\n break;\r\n case \"uv2\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV2;\r\n break;\r\n case \"uv3\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV3;\r\n break;\r\n case \"uv4\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV4;\r\n break;\r\n case \"uv5\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV5;\r\n break;\r\n case \"uv6\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV6;\r\n break;\r\n }\r\n } else if (sourceBlock instanceof MorphTargetsBlock) {\r\n switch (this.input.connectedPoint?.name) {\r\n case \"normalOutput\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.Normal;\r\n break;\r\n case \"tangentOutput\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.Tangent;\r\n break;\r\n case \"uvOutput\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV1;\r\n break;\r\n }\r\n }\r\n });\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 \"MeshAttributeExistsBlock\";\r\n }\r\n\r\n /**\r\n * Defines which mesh attribute to use\r\n */\r\n @editableInPropertyPage(\"Attribute lookup\", PropertyTypeForEdition.List, undefined, {\r\n notifiers: { update: true },\r\n embedded: true,\r\n options: [\r\n { label: \"(None)\", value: MeshAttributeExistsBlockTypes.None },\r\n { label: \"Normal\", value: MeshAttributeExistsBlockTypes.Normal },\r\n { label: \"Tangent\", value: MeshAttributeExistsBlockTypes.Tangent },\r\n { label: \"Vertex Color\", value: MeshAttributeExistsBlockTypes.VertexColor },\r\n { label: \"UV1\", value: MeshAttributeExistsBlockTypes.UV1 },\r\n { label: \"UV2\", value: MeshAttributeExistsBlockTypes.UV2 },\r\n { label: \"UV3\", value: MeshAttributeExistsBlockTypes.UV3 },\r\n { label: \"UV4\", value: MeshAttributeExistsBlockTypes.UV4 },\r\n { label: \"UV5\", value: MeshAttributeExistsBlockTypes.UV5 },\r\n { label: \"UV6\", value: MeshAttributeExistsBlockTypes.UV6 },\r\n ],\r\n })\r\n public attributeType = MeshAttributeExistsBlockTypes.None;\r\n\r\n /**\r\n * Gets the input component\r\n */\r\n public get input(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the fallback component when speciefied attribute doesn't exist\r\n */\r\n public get fallback(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n let attributeDefine: null | string = null;\r\n switch (this.attributeType) {\r\n case MeshAttributeExistsBlockTypes.VertexColor:\r\n attributeDefine = \"VERTEXCOLOR_NME\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.Normal:\r\n attributeDefine = \"NORMAL\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.Tangent:\r\n attributeDefine = \"TANGENT\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV1:\r\n attributeDefine = \"UV1\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV2:\r\n attributeDefine = \"UV2\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV3:\r\n attributeDefine = \"UV3\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV4:\r\n attributeDefine = \"UV4\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV5:\r\n attributeDefine = \"UV5\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV6:\r\n attributeDefine = \"UV6\";\r\n break;\r\n }\r\n\r\n const output = state._declareOutput(this.output);\r\n if (attributeDefine) {\r\n state.compilationString += `#ifdef ${attributeDefine}\\n`;\r\n }\r\n\r\n state.compilationString += `${output} = ${this.input.associatedVariableName};\\n`;\r\n\r\n if (attributeDefine) {\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${output} = ${this.fallback.associatedVariableName};\\n`;\r\n state.compilationString += `#endif\\n`;\r\n }\r\n return this;\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.attributeType = this.attributeType;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.attributeType = serializationObject.attributeType ?? MeshAttributeExistsBlockTypes.None;\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n\r\n codeString += `${this._codeVariableName}.attributeType = ${this.attributeType};\\n`;\r\n\r\n return codeString;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.MeshAttributeExistsBlock\", MeshAttributeExistsBlock);\r\n"]}
1
+ {"version":3,"file":"meshAttributeExistsBlock.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Materials/Node/Blocks/meshAttributeExistsBlock.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 type { NodeMaterialConnectionPoint } from \"../nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { InputBlock } from \"./Input/inputBlock\";\r\nimport { MorphTargetsBlock } from \"./Vertex/morphTargetsBlock\";\r\nimport { PropertyTypeForEdition, editableInPropertyPage } from \"../../../Decorators/nodeDecorator\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nexport const enum MeshAttributeExistsBlockTypes {\r\n None,\r\n Normal,\r\n Tangent,\r\n VertexColor,\r\n UV1,\r\n UV2,\r\n UV3,\r\n UV4,\r\n UV5,\r\n UV6,\r\n}\r\n\r\n/**\r\n * Block used to check if Mesh attribute of specified type exists\r\n * and provide an alternative fallback input for to use in such case\r\n */\r\nexport class MeshAttributeExistsBlock extends NodeMaterialBlock {\r\n /**\r\n * Creates a new MeshAttributeExistsBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Neutral);\r\n\r\n this.registerInput(\"input\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"fallback\", NodeMaterialBlockConnectionPointTypes.AutoDetect);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this._outputs[0]._typeConnectionSource = this._inputs[0];\r\n this._linkConnectionTypes(0, 1);\r\n\r\n // Try to auto determine attributeType\r\n this._inputs[0].onConnectionObservable.add((other) => {\r\n if (this.attributeType) {\r\n // But only if not already specified\r\n return;\r\n }\r\n const sourceBlock = other.ownerBlock;\r\n if (sourceBlock instanceof InputBlock && sourceBlock.isAttribute) {\r\n switch (sourceBlock.name) {\r\n case \"color\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.VertexColor;\r\n break;\r\n case \"normal\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.Normal;\r\n break;\r\n case \"tangent\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.Tangent;\r\n break;\r\n case \"uv\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV1;\r\n break;\r\n case \"uv2\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV2;\r\n break;\r\n case \"uv3\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV3;\r\n break;\r\n case \"uv4\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV4;\r\n break;\r\n case \"uv5\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV5;\r\n break;\r\n case \"uv6\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV6;\r\n break;\r\n }\r\n } else if (sourceBlock instanceof MorphTargetsBlock) {\r\n switch (this.input.connectedPoint?.name) {\r\n case \"normalOutput\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.Normal;\r\n break;\r\n case \"tangentOutput\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.Tangent;\r\n break;\r\n case \"uvOutput\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV1;\r\n break;\r\n case \"uv2Output\":\r\n this.attributeType = MeshAttributeExistsBlockTypes.UV2;\r\n break;\r\n }\r\n }\r\n });\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 \"MeshAttributeExistsBlock\";\r\n }\r\n\r\n /**\r\n * Defines which mesh attribute to use\r\n */\r\n @editableInPropertyPage(\"Attribute lookup\", PropertyTypeForEdition.List, undefined, {\r\n notifiers: { update: true },\r\n embedded: true,\r\n options: [\r\n { label: \"(None)\", value: MeshAttributeExistsBlockTypes.None },\r\n { label: \"Normal\", value: MeshAttributeExistsBlockTypes.Normal },\r\n { label: \"Tangent\", value: MeshAttributeExistsBlockTypes.Tangent },\r\n { label: \"Vertex Color\", value: MeshAttributeExistsBlockTypes.VertexColor },\r\n { label: \"UV1\", value: MeshAttributeExistsBlockTypes.UV1 },\r\n { label: \"UV2\", value: MeshAttributeExistsBlockTypes.UV2 },\r\n { label: \"UV3\", value: MeshAttributeExistsBlockTypes.UV3 },\r\n { label: \"UV4\", value: MeshAttributeExistsBlockTypes.UV4 },\r\n { label: \"UV5\", value: MeshAttributeExistsBlockTypes.UV5 },\r\n { label: \"UV6\", value: MeshAttributeExistsBlockTypes.UV6 },\r\n ],\r\n })\r\n public attributeType = MeshAttributeExistsBlockTypes.None;\r\n\r\n /**\r\n * Gets the input component\r\n */\r\n public get input(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the fallback component when speciefied attribute doesn't exist\r\n */\r\n public get fallback(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n let attributeDefine: null | string = null;\r\n switch (this.attributeType) {\r\n case MeshAttributeExistsBlockTypes.VertexColor:\r\n attributeDefine = \"VERTEXCOLOR_NME\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.Normal:\r\n attributeDefine = \"NORMAL\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.Tangent:\r\n attributeDefine = \"TANGENT\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV1:\r\n attributeDefine = \"UV1\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV2:\r\n attributeDefine = \"UV2\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV3:\r\n attributeDefine = \"UV3\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV4:\r\n attributeDefine = \"UV4\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV5:\r\n attributeDefine = \"UV5\";\r\n break;\r\n case MeshAttributeExistsBlockTypes.UV6:\r\n attributeDefine = \"UV6\";\r\n break;\r\n }\r\n\r\n const output = state._declareOutput(this.output);\r\n if (attributeDefine) {\r\n state.compilationString += `#ifdef ${attributeDefine}\\n`;\r\n }\r\n\r\n state.compilationString += `${output} = ${this.input.associatedVariableName};\\n`;\r\n\r\n if (attributeDefine) {\r\n state.compilationString += `#else\\n`;\r\n state.compilationString += `${output} = ${this.fallback.associatedVariableName};\\n`;\r\n state.compilationString += `#endif\\n`;\r\n }\r\n return this;\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.attributeType = this.attributeType;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.attributeType = serializationObject.attributeType ?? MeshAttributeExistsBlockTypes.None;\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n\r\n codeString += `${this._codeVariableName}.attributeType = ${this.attributeType};\\n`;\r\n\r\n return codeString;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.MeshAttributeExistsBlock\", MeshAttributeExistsBlock);\r\n"]}