@babylonjs/core 7.22.2 → 7.22.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 (177) hide show
  1. package/Animations/animationGroup.js +1 -1
  2. package/Animations/animationGroup.js.map +1 -1
  3. package/Engines/abstractEngine.js +2 -2
  4. package/Engines/abstractEngine.js.map +1 -1
  5. package/Engines/constants.d.ts +21 -1
  6. package/Engines/constants.js +21 -1
  7. package/Engines/constants.js.map +1 -1
  8. package/Engines/engineFeatures.d.ts +2 -0
  9. package/Engines/engineFeatures.js.map +1 -1
  10. package/Engines/nativeEngine.js +7 -1
  11. package/Engines/nativeEngine.js.map +1 -1
  12. package/Engines/nullEngine.js +1 -0
  13. package/Engines/nullEngine.js.map +1 -1
  14. package/Engines/thinEngine.js +2 -0
  15. package/Engines/thinEngine.js.map +1 -1
  16. package/Engines/webgpuEngine.js +1 -0
  17. package/Engines/webgpuEngine.js.map +1 -1
  18. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.d.ts +12 -0
  19. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js +51 -0
  20. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js.map +1 -1
  21. package/Materials/Node/Blocks/Input/prePassTextureBlock.d.ts +27 -0
  22. package/Materials/Node/Blocks/Input/prePassTextureBlock.js +69 -0
  23. package/Materials/Node/Blocks/Input/prePassTextureBlock.js.map +1 -1
  24. package/Materials/Node/nodeMaterial.d.ts +12 -0
  25. package/Materials/Node/nodeMaterial.js +24 -0
  26. package/Materials/Node/nodeMaterial.js.map +1 -1
  27. package/Materials/PBR/pbrBaseMaterial.d.ts +8 -0
  28. package/Materials/PBR/pbrBaseMaterial.js +8 -0
  29. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  30. package/Materials/Textures/Procedurals/proceduralTexture.d.ts +4 -0
  31. package/Materials/Textures/Procedurals/proceduralTexture.js +19 -5
  32. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  33. package/Materials/materialHelper.functions.js +20 -0
  34. package/Materials/materialHelper.functions.js.map +1 -1
  35. package/Materials/prePassConfiguration.js +2 -1
  36. package/Materials/prePassConfiguration.js.map +1 -1
  37. package/Materials/standardMaterial.d.ts +8 -0
  38. package/Materials/standardMaterial.js +8 -0
  39. package/Materials/standardMaterial.js.map +1 -1
  40. package/Misc/fileTools.js +1 -1
  41. package/Misc/fileTools.js.map +1 -1
  42. package/PostProcesses/postProcessManager.d.ts +2 -0
  43. package/PostProcesses/postProcessManager.js +3 -0
  44. package/PostProcesses/postProcessManager.js.map +1 -1
  45. package/PostProcesses/volumetricLightScatteringPostProcess.js +79 -8
  46. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  47. package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +88 -0
  48. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +240 -0
  49. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -0
  50. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.d.ts +88 -0
  51. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js +231 -0
  52. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -0
  53. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +340 -0
  54. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +884 -0
  55. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -0
  56. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +67 -0
  57. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +139 -0
  58. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -0
  59. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +168 -0
  60. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +597 -0
  61. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -0
  62. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +151 -0
  63. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +291 -0
  64. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -0
  65. package/Rendering/depthRenderer.js +44 -23
  66. package/Rendering/depthRenderer.js.map +1 -1
  67. package/Rendering/index.d.ts +1 -0
  68. package/Rendering/index.js +1 -0
  69. package/Rendering/index.js.map +1 -1
  70. package/Rendering/outlineRenderer.js +3 -3
  71. package/Rendering/outlineRenderer.js.map +1 -1
  72. package/Rendering/prePassRenderer.js +25 -1
  73. package/Rendering/prePassRenderer.js.map +1 -1
  74. package/Shaders/ShadersInclude/instancesDeclaration.js +4 -2
  75. package/Shaders/ShadersInclude/instancesDeclaration.js.map +1 -1
  76. package/Shaders/ShadersInclude/instancesVertex.js +8 -4
  77. package/Shaders/ShadersInclude/instancesVertex.js.map +1 -1
  78. package/Shaders/ShadersInclude/prePassDeclaration.js +4 -1
  79. package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
  80. package/Shaders/ShadersInclude/prePassVertex.js +5 -1
  81. package/Shaders/ShadersInclude/prePassVertex.js.map +1 -1
  82. package/Shaders/ShadersInclude/prePassVertexDeclaration.js +4 -1
  83. package/Shaders/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
  84. package/Shaders/combineVoxelGrids.fragment.d.ts +5 -0
  85. package/Shaders/combineVoxelGrids.fragment.js +9 -0
  86. package/Shaders/combineVoxelGrids.fragment.js.map +1 -0
  87. package/Shaders/copyTexture3DLayerToTexture.fragment.d.ts +5 -0
  88. package/Shaders/copyTexture3DLayerToTexture.fragment.js +10 -0
  89. package/Shaders/copyTexture3DLayerToTexture.fragment.js.map +1 -0
  90. package/Shaders/default.fragment.js +31 -6
  91. package/Shaders/default.fragment.js.map +1 -1
  92. package/Shaders/default.vertex.js +6 -2
  93. package/Shaders/default.vertex.js.map +1 -1
  94. package/Shaders/generateVoxelMip.fragment.d.ts +5 -0
  95. package/Shaders/generateVoxelMip.fragment.js +25 -0
  96. package/Shaders/generateVoxelMip.fragment.js.map +1 -0
  97. package/Shaders/geometry.fragment.js +1 -1
  98. package/Shaders/geometry.fragment.js.map +1 -1
  99. package/Shaders/iblShadowAccumulation.fragment.d.ts +5 -0
  100. package/Shaders/iblShadowAccumulation.fragment.js +27 -0
  101. package/Shaders/iblShadowAccumulation.fragment.js.map +1 -0
  102. package/Shaders/iblShadowDebug.fragment.d.ts +5 -0
  103. package/Shaders/iblShadowDebug.fragment.js +18 -0
  104. package/Shaders/iblShadowDebug.fragment.js.map +1 -0
  105. package/Shaders/iblShadowGBufferDebug.fragment.d.ts +5 -0
  106. package/Shaders/iblShadowGBufferDebug.fragment.js +19 -0
  107. package/Shaders/iblShadowGBufferDebug.fragment.js.map +1 -0
  108. package/Shaders/iblShadowSpatialBlur.fragment.d.ts +5 -0
  109. package/Shaders/iblShadowSpatialBlur.fragment.js +21 -0
  110. package/Shaders/iblShadowSpatialBlur.fragment.js.map +1 -0
  111. package/Shaders/iblShadowVoxelTracing.fragment.d.ts +5 -0
  112. package/Shaders/iblShadowVoxelTracing.fragment.js +152 -0
  113. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -0
  114. package/Shaders/iblShadowsCdfx.fragment.d.ts +5 -0
  115. package/Shaders/iblShadowsCdfx.fragment.js +12 -0
  116. package/Shaders/iblShadowsCdfx.fragment.js.map +1 -0
  117. package/Shaders/iblShadowsCdfy.fragment.d.ts +5 -0
  118. package/Shaders/iblShadowsCdfy.fragment.js +33 -0
  119. package/Shaders/iblShadowsCdfy.fragment.js.map +1 -0
  120. package/Shaders/iblShadowsCombine.fragment.d.ts +5 -0
  121. package/Shaders/iblShadowsCombine.fragment.js +10 -0
  122. package/Shaders/iblShadowsCombine.fragment.js.map +1 -0
  123. package/Shaders/iblShadowsIcdfx.fragment.d.ts +5 -0
  124. package/Shaders/iblShadowsIcdfx.fragment.js +19 -0
  125. package/Shaders/iblShadowsIcdfx.fragment.js.map +1 -0
  126. package/Shaders/iblShadowsIcdfy.fragment.d.ts +5 -0
  127. package/Shaders/iblShadowsIcdfy.fragment.js +19 -0
  128. package/Shaders/iblShadowsIcdfy.fragment.js.map +1 -0
  129. package/Shaders/iblShadowsImportanceSamplingDebug.fragment.d.ts +5 -0
  130. package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js +48 -0
  131. package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js.map +1 -0
  132. package/Shaders/pbr.fragment.js +32 -7
  133. package/Shaders/pbr.fragment.js.map +1 -1
  134. package/Shaders/pbr.vertex.js +3 -1
  135. package/Shaders/pbr.vertex.js.map +1 -1
  136. package/Shaders/voxelGrid.fragment.d.ts +5 -0
  137. package/Shaders/voxelGrid.fragment.js +14 -0
  138. package/Shaders/voxelGrid.fragment.js.map +1 -0
  139. package/Shaders/voxelGrid.vertex.d.ts +5 -0
  140. package/Shaders/voxelGrid.vertex.js +9 -0
  141. package/Shaders/voxelGrid.vertex.js.map +1 -0
  142. package/Shaders/voxelGrid2dArrayDebug.fragment.d.ts +5 -0
  143. package/Shaders/voxelGrid2dArrayDebug.fragment.js +9 -0
  144. package/Shaders/voxelGrid2dArrayDebug.fragment.js.map +1 -0
  145. package/Shaders/voxelGrid3dDebug.fragment.d.ts +5 -0
  146. package/Shaders/voxelGrid3dDebug.fragment.js +22 -0
  147. package/Shaders/voxelGrid3dDebug.fragment.js.map +1 -0
  148. package/Shaders/voxelSlabDebug.fragment.d.ts +5 -0
  149. package/Shaders/voxelSlabDebug.fragment.js +11 -0
  150. package/Shaders/voxelSlabDebug.fragment.js.map +1 -0
  151. package/Shaders/voxelSlabDebug.vertex.d.ts +5 -0
  152. package/Shaders/voxelSlabDebug.vertex.js +9 -0
  153. package/Shaders/voxelSlabDebug.vertex.js.map +1 -0
  154. package/ShadersWGSL/ShadersInclude/instancesDeclaration.js +4 -2
  155. package/ShadersWGSL/ShadersInclude/instancesDeclaration.js.map +1 -1
  156. package/ShadersWGSL/ShadersInclude/instancesVertex.js +9 -4
  157. package/ShadersWGSL/ShadersInclude/instancesVertex.js.map +1 -1
  158. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +4 -1
  159. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
  160. package/ShadersWGSL/ShadersInclude/prePassVertex.js +5 -1
  161. package/ShadersWGSL/ShadersInclude/prePassVertex.js.map +1 -1
  162. package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js +4 -1
  163. package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
  164. package/ShadersWGSL/default.fragment.js +42 -16
  165. package/ShadersWGSL/default.fragment.js.map +1 -1
  166. package/ShadersWGSL/default.vertex.js +5 -2
  167. package/ShadersWGSL/default.vertex.js.map +1 -1
  168. package/ShadersWGSL/geometry.fragment.js +1 -1
  169. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  170. package/ShadersWGSL/pbr.fragment.js +37 -20
  171. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  172. package/ShadersWGSL/pbr.vertex.js +1 -1
  173. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  174. package/package.json +1 -1
  175. package/sceneComponent.d.ts +1 -0
  176. package/sceneComponent.js +1 -0
  177. package/sceneComponent.js.map +1 -1
@@ -32,6 +32,18 @@ export declare class PrePassOutputBlock extends NodeMaterialBlock {
32
32
  * Gets the reflectivity component
33
33
  */
34
34
  get reflectivity(): NodeMaterialConnectionPoint;
35
+ /**
36
+ * Gets the world normal component
37
+ */
38
+ get worldNormal(): NodeMaterialConnectionPoint;
39
+ /**
40
+ * Gets the position in local space component
41
+ */
42
+ get localPosition(): NodeMaterialConnectionPoint;
43
+ /**
44
+ * Gets the linear depth component
45
+ */
46
+ get viewDepthNDC(): NodeMaterialConnectionPoint;
35
47
  private _getFragData;
36
48
  protected _buildBlock(state: NodeMaterialBuildState): this;
37
49
  }
@@ -14,8 +14,11 @@ export class PrePassOutputBlock extends NodeMaterialBlock {
14
14
  constructor(name) {
15
15
  super(name, NodeMaterialBlockTargets.Fragment, true);
16
16
  this.registerInput("viewDepth", NodeMaterialBlockConnectionPointTypes.Float, true);
17
+ this.registerInput("viewDepthLinear", NodeMaterialBlockConnectionPointTypes.Float, true);
17
18
  this.registerInput("worldPosition", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);
19
+ this.registerInput("localPosition", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);
18
20
  this.registerInput("viewNormal", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);
21
+ this.registerInput("worldNormal", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);
19
22
  this.registerInput("reflectivity", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);
20
23
  this.inputs[1].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4);
21
24
  this.inputs[2].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4);
@@ -55,15 +58,36 @@ export class PrePassOutputBlock extends NodeMaterialBlock {
55
58
  get reflectivity() {
56
59
  return this._inputs[3];
57
60
  }
61
+ /**
62
+ * Gets the world normal component
63
+ */
64
+ get worldNormal() {
65
+ return this._inputs[4];
66
+ }
67
+ /**
68
+ * Gets the position in local space component
69
+ */
70
+ get localPosition() {
71
+ return this._inputs[5];
72
+ }
73
+ /**
74
+ * Gets the linear depth component
75
+ */
76
+ get viewDepthNDC() {
77
+ return this._inputs[6];
78
+ }
58
79
  _getFragData(isWebGPU, index) {
59
80
  return isWebGPU ? `fragmentOutputs.fragData${index}` : `gl_FragData[${index}]`;
60
81
  }
61
82
  _buildBlock(state) {
62
83
  super._buildBlock(state);
63
84
  const worldPosition = this.worldPosition;
85
+ const localPosition = this.localPosition;
64
86
  const viewNormal = this.viewNormal;
87
+ const worldNormal = this.worldNormal;
65
88
  const viewDepth = this.viewDepth;
66
89
  const reflectivity = this.reflectivity;
90
+ const viewDepthNDC = this.viewDepthNDC;
67
91
  state.sharedData.blocksWithDefines.push(this);
68
92
  const comments = `//${this.name}`;
69
93
  const vec4 = state._getShaderType(NodeMaterialBlockConnectionPointTypes.Vector4);
@@ -80,6 +104,15 @@ export class PrePassOutputBlock extends NodeMaterialBlock {
80
104
  state.compilationString += ` fragData[PREPASS_DEPTH_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\r\n`;
81
105
  }
82
106
  state.compilationString += `#endif\r\n`;
107
+ state.compilationString += `#ifdef PREPASS_NDC_DEPTH\r\n`;
108
+ if (viewDepthNDC.connectedPoint) {
109
+ state.compilationString += ` gl_FragData[PREPASS_NDC_DEPTH_INDEX] = vec4(${viewDepthNDC.associatedVariableName}, 0.0, 0.0, 1.0);\r\n`;
110
+ }
111
+ else {
112
+ // We have to write something on the viewDepth output or it will raise a gl error
113
+ state.compilationString += ` gl_FragData[PREPASS_NDC_DEPTH_INDEX] = vec4(0.0, 0.0, 0.0, 0.0);\r\n`;
114
+ }
115
+ state.compilationString += `#endif\r\n`;
83
116
  state.compilationString += `#ifdef PREPASS_POSITION\r\n`;
84
117
  if (worldPosition.connectedPoint) {
85
118
  state.compilationString += `fragData[PREPASS_POSITION_INDEX] = ${vec4}(${worldPosition.associatedVariableName}.rgb, ${worldPosition.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? worldPosition.associatedVariableName + ".a" : "1.0"});\r\n`;
@@ -89,6 +122,15 @@ export class PrePassOutputBlock extends NodeMaterialBlock {
89
122
  state.compilationString += ` fragData[PREPASS_POSITION_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\r\n`;
90
123
  }
91
124
  state.compilationString += `#endif\r\n`;
125
+ state.compilationString += `#ifdef PREPASS_LOCAL_POSITION\r\n`;
126
+ if (localPosition.connectedPoint) {
127
+ state.compilationString += ` gl_FragData[PREPASS_LOCAL_POSITION_INDEX] = vec4(${localPosition.associatedVariableName}.rgb, ${localPosition.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? localPosition.associatedVariableName + ".a" : "1.0"});\r\n`;
128
+ }
129
+ else {
130
+ // We have to write something on the position output or it will raise a gl error
131
+ state.compilationString += ` gl_FragData[PREPASS_LOCAL_POSITION_INDEX] = vec4(0.0, 0.0, 0.0, 0.0);\r\n`;
132
+ }
133
+ state.compilationString += `#endif\r\n`;
92
134
  state.compilationString += `#ifdef PREPASS_NORMAL\r\n`;
93
135
  if (viewNormal.connectedPoint) {
94
136
  state.compilationString += ` fragData[PREPASS_NORMAL_INDEX] = ${vec4}(${viewNormal.associatedVariableName}.rgb, ${viewNormal.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? viewNormal.associatedVariableName + ".a" : "1.0"});\r\n`;
@@ -98,6 +140,15 @@ export class PrePassOutputBlock extends NodeMaterialBlock {
98
140
  state.compilationString += ` fragData[PREPASS_NORMAL_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\r\n`;
99
141
  }
100
142
  state.compilationString += `#endif\r\n`;
143
+ state.compilationString += `#ifdef PREPASS_WORLD_NORMAL\r\n`;
144
+ if (worldNormal.connectedPoint) {
145
+ state.compilationString += ` gl_FragData[PREPASS_WORLD_NORMAL_INDEX] = vec4(${worldNormal.associatedVariableName}.rgb, ${worldNormal.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? worldNormal.associatedVariableName + ".a" : "1.0"});\r\n`;
146
+ }
147
+ else {
148
+ // We have to write something on the normal output or it will raise a gl error
149
+ state.compilationString += ` gl_FragData[PREPASS_WORLD_NORMAL_INDEX] = vec4(0.0, 0.0, 0.0, 0.0);\r\n`;
150
+ }
151
+ state.compilationString += `#endif\r\n`;
101
152
  state.compilationString += `#ifdef PREPASS_REFLECTIVITY\r\n`;
102
153
  if (reflectivity.connectedPoint) {
103
154
  state.compilationString += ` fragData[PREPASS_REFLECTIVITY_INDEX] = ${vec4}(${reflectivity.associatedVariableName}.rgb, ${reflectivity.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? reflectivity.associatedVariableName + ".a" : "1.0"});\r\n`;
@@ -1 +1 @@
1
- {"version":3,"file":"prePassOutputBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Fragment/prePassOutputBlock.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 { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to output values on the prepass textures\r\n * #WW65SN#9\r\n */\r\nexport class PrePassOutputBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new PrePassOutputBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment, true);\r\n\r\n this.registerInput(\"viewDepth\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"worldPosition\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"viewNormal\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"reflectivity\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n\r\n this.inputs[1].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.inputs[2].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.inputs[3].addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Vector3 |\r\n NodeMaterialBlockConnectionPointTypes.Vector4 |\r\n NodeMaterialBlockConnectionPointTypes.Color3 |\r\n NodeMaterialBlockConnectionPointTypes.Color4\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 \"PrePassOutputBlock\";\r\n }\r\n\r\n /**\r\n * Gets the view depth component\r\n */\r\n public get viewDepth(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the world position component\r\n */\r\n public get worldPosition(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the view normal component\r\n */\r\n public get viewNormal(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the reflectivity component\r\n */\r\n public get reflectivity(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n private _getFragData(isWebGPU: boolean, index: number) {\r\n return isWebGPU ? `fragmentOutputs.fragData${index}` : `gl_FragData[${index}]`;\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const worldPosition = this.worldPosition;\r\n const viewNormal = this.viewNormal;\r\n const viewDepth = this.viewDepth;\r\n const reflectivity = this.reflectivity;\r\n\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n const comments = `//${this.name}`;\r\n const vec4 = state._getShaderType(NodeMaterialBlockConnectionPointTypes.Vector4);\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n state.compilationString += `#if defined(PREPASS)\\r\\n`;\r\n state.compilationString += isWebGPU ? `var fragData: array<vec4<f32>, SCENE_MRT_COUNT>;\\r\\n` : `vec4 fragData[SCENE_MRT_COUNT];\\r\\n`;\r\n\r\n state.compilationString += `#ifdef PREPASS_DEPTH\\r\\n`;\r\n if (viewDepth.connectedPoint) {\r\n state.compilationString += ` fragData[PREPASS_DEPTH_INDEX] = ${vec4}(${viewDepth.associatedVariableName}, 0.0, 0.0, 1.0);\\r\\n`;\r\n } else {\r\n // We have to write something on the viewDepth output or it will raise a gl error\r\n state.compilationString += ` fragData[PREPASS_DEPTH_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_POSITION\\r\\n`;\r\n if (worldPosition.connectedPoint) {\r\n state.compilationString += `fragData[PREPASS_POSITION_INDEX] = ${vec4}(${worldPosition.associatedVariableName}.rgb, ${\r\n worldPosition.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? worldPosition.associatedVariableName + \".a\" : \"1.0\"\r\n });\\r\\n`;\r\n } else {\r\n // We have to write something on the position output or it will raise a gl error\r\n state.compilationString += ` fragData[PREPASS_POSITION_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_NORMAL\\r\\n`;\r\n if (viewNormal.connectedPoint) {\r\n state.compilationString += ` fragData[PREPASS_NORMAL_INDEX] = ${vec4}(${viewNormal.associatedVariableName}.rgb, ${\r\n viewNormal.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? viewNormal.associatedVariableName + \".a\" : \"1.0\"\r\n });\\r\\n`;\r\n } else {\r\n // We have to write something on the normal output or it will raise a gl error\r\n state.compilationString += ` fragData[PREPASS_NORMAL_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_REFLECTIVITY\\r\\n`;\r\n if (reflectivity.connectedPoint) {\r\n state.compilationString += ` fragData[PREPASS_REFLECTIVITY_INDEX] = ${vec4}(${reflectivity.associatedVariableName}.rgb, ${\r\n reflectivity.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? reflectivity.associatedVariableName + \".a\" : \"1.0\"\r\n });\\r\\n`;\r\n } else {\r\n // We have to write something on the reflectivity output or it will raise a gl error\r\n state.compilationString += ` fragData[PREPASS_REFLECTIVITY_INDEX] = ${vec4}(0.0, 0.0, 0.0, 1.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n\r\n state.compilationString += `#if SCENE_MRT_COUNT > 1\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 1)} = fragData[1];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 2\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 2)} = fragData[2];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 3\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 3)} = fragData[3];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 4\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 4)} = fragData[4];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 5\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 5)} = fragData[5];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 6\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 6)} = fragData[6];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 7\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 7)} = fragData[7];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n\r\n state.compilationString += `#endif\\r\\n`;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.PrePassOutputBlock\", PrePassOutputBlock);\r\n"]}
1
+ {"version":3,"file":"prePassOutputBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Fragment/prePassOutputBlock.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 { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Block used to output values on the prepass textures\r\n * #WW65SN#9\r\n */\r\nexport class PrePassOutputBlock extends NodeMaterialBlock {\r\n /**\r\n * Create a new PrePassOutputBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment, true);\r\n\r\n this.registerInput(\"viewDepth\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"viewDepthLinear\", NodeMaterialBlockConnectionPointTypes.Float, true);\r\n this.registerInput(\"worldPosition\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"localPosition\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"viewNormal\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"worldNormal\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"reflectivity\", NodeMaterialBlockConnectionPointTypes.AutoDetect, true);\r\n\r\n this.inputs[1].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.inputs[2].addExcludedConnectionPointFromAllowedTypes(NodeMaterialBlockConnectionPointTypes.Vector3 | NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.inputs[3].addExcludedConnectionPointFromAllowedTypes(\r\n NodeMaterialBlockConnectionPointTypes.Vector3 |\r\n NodeMaterialBlockConnectionPointTypes.Vector4 |\r\n NodeMaterialBlockConnectionPointTypes.Color3 |\r\n NodeMaterialBlockConnectionPointTypes.Color4\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 \"PrePassOutputBlock\";\r\n }\r\n\r\n /**\r\n * Gets the view depth component\r\n */\r\n public get viewDepth(): NodeMaterialConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the world position component\r\n */\r\n public get worldPosition(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the view normal component\r\n */\r\n public get viewNormal(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the reflectivity component\r\n */\r\n public get reflectivity(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the world normal component\r\n */\r\n public get worldNormal(): NodeMaterialConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the position in local space component\r\n */\r\n public get localPosition(): NodeMaterialConnectionPoint {\r\n return this._inputs[5];\r\n }\r\n\r\n /**\r\n * Gets the linear depth component\r\n */\r\n public get viewDepthNDC(): NodeMaterialConnectionPoint {\r\n return this._inputs[6];\r\n }\r\n\r\n private _getFragData(isWebGPU: boolean, index: number) {\r\n return isWebGPU ? `fragmentOutputs.fragData${index}` : `gl_FragData[${index}]`;\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const worldPosition = this.worldPosition;\r\n const localPosition = this.localPosition;\r\n const viewNormal = this.viewNormal;\r\n const worldNormal = this.worldNormal;\r\n const viewDepth = this.viewDepth;\r\n const reflectivity = this.reflectivity;\r\n const viewDepthNDC = this.viewDepthNDC;\r\n\r\n state.sharedData.blocksWithDefines.push(this);\r\n\r\n const comments = `//${this.name}`;\r\n const vec4 = state._getShaderType(NodeMaterialBlockConnectionPointTypes.Vector4);\r\n const isWebGPU = state.shaderLanguage === ShaderLanguage.WGSL;\r\n state._emitFunctionFromInclude(\"helperFunctions\", comments);\r\n\r\n state.compilationString += `#if defined(PREPASS)\\r\\n`;\r\n state.compilationString += isWebGPU ? `var fragData: array<vec4<f32>, SCENE_MRT_COUNT>;\\r\\n` : `vec4 fragData[SCENE_MRT_COUNT];\\r\\n`;\r\n\r\n state.compilationString += `#ifdef PREPASS_DEPTH\\r\\n`;\r\n if (viewDepth.connectedPoint) {\r\n state.compilationString += ` fragData[PREPASS_DEPTH_INDEX] = ${vec4}(${viewDepth.associatedVariableName}, 0.0, 0.0, 1.0);\\r\\n`;\r\n } else {\r\n // We have to write something on the viewDepth output or it will raise a gl error\r\n state.compilationString += ` fragData[PREPASS_DEPTH_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_NDC_DEPTH\\r\\n`;\r\n if (viewDepthNDC.connectedPoint) {\r\n state.compilationString += ` gl_FragData[PREPASS_NDC_DEPTH_INDEX] = vec4(${viewDepthNDC.associatedVariableName}, 0.0, 0.0, 1.0);\\r\\n`;\r\n } else {\r\n // We have to write something on the viewDepth output or it will raise a gl error\r\n state.compilationString += ` gl_FragData[PREPASS_NDC_DEPTH_INDEX] = vec4(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_POSITION\\r\\n`;\r\n if (worldPosition.connectedPoint) {\r\n state.compilationString += `fragData[PREPASS_POSITION_INDEX] = ${vec4}(${worldPosition.associatedVariableName}.rgb, ${\r\n worldPosition.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? worldPosition.associatedVariableName + \".a\" : \"1.0\"\r\n });\\r\\n`;\r\n } else {\r\n // We have to write something on the position output or it will raise a gl error\r\n state.compilationString += ` fragData[PREPASS_POSITION_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_LOCAL_POSITION\\r\\n`;\r\n if (localPosition.connectedPoint) {\r\n state.compilationString += ` gl_FragData[PREPASS_LOCAL_POSITION_INDEX] = vec4(${localPosition.associatedVariableName}.rgb, ${\r\n localPosition.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? localPosition.associatedVariableName + \".a\" : \"1.0\"\r\n });\\r\\n`;\r\n } else {\r\n // We have to write something on the position output or it will raise a gl error\r\n state.compilationString += ` gl_FragData[PREPASS_LOCAL_POSITION_INDEX] = vec4(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_NORMAL\\r\\n`;\r\n if (viewNormal.connectedPoint) {\r\n state.compilationString += ` fragData[PREPASS_NORMAL_INDEX] = ${vec4}(${viewNormal.associatedVariableName}.rgb, ${\r\n viewNormal.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? viewNormal.associatedVariableName + \".a\" : \"1.0\"\r\n });\\r\\n`;\r\n } else {\r\n // We have to write something on the normal output or it will raise a gl error\r\n state.compilationString += ` fragData[PREPASS_NORMAL_INDEX] = ${vec4}(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_WORLD_NORMAL\\r\\n`;\r\n if (worldNormal.connectedPoint) {\r\n state.compilationString += ` gl_FragData[PREPASS_WORLD_NORMAL_INDEX] = vec4(${worldNormal.associatedVariableName}.rgb, ${\r\n worldNormal.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? worldNormal.associatedVariableName + \".a\" : \"1.0\"\r\n });\\r\\n`;\r\n } else {\r\n // We have to write something on the normal output or it will raise a gl error\r\n state.compilationString += ` gl_FragData[PREPASS_WORLD_NORMAL_INDEX] = vec4(0.0, 0.0, 0.0, 0.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#ifdef PREPASS_REFLECTIVITY\\r\\n`;\r\n if (reflectivity.connectedPoint) {\r\n state.compilationString += ` fragData[PREPASS_REFLECTIVITY_INDEX] = ${vec4}(${reflectivity.associatedVariableName}.rgb, ${\r\n reflectivity.connectedPoint.type === NodeMaterialBlockConnectionPointTypes.Vector4 ? reflectivity.associatedVariableName + \".a\" : \"1.0\"\r\n });\\r\\n`;\r\n } else {\r\n // We have to write something on the reflectivity output or it will raise a gl error\r\n state.compilationString += ` fragData[PREPASS_REFLECTIVITY_INDEX] = ${vec4}(0.0, 0.0, 0.0, 1.0);\\r\\n`;\r\n }\r\n state.compilationString += `#endif\\r\\n`;\r\n\r\n state.compilationString += `#if SCENE_MRT_COUNT > 1\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 1)} = fragData[1];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 2\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 2)} = fragData[2];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 3\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 3)} = fragData[3];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 4\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 4)} = fragData[4];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 5\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 5)} = fragData[5];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 6\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 6)} = fragData[6];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n state.compilationString += `#if SCENE_MRT_COUNT > 7\\r\\n`;\r\n state.compilationString += `${this._getFragData(isWebGPU, 7)} = fragData[7];\\r\\n`;\r\n state.compilationString += `#endif\\r\\n`;\r\n\r\n state.compilationString += `#endif\\r\\n`;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.PrePassOutputBlock\", PrePassOutputBlock);\r\n"]}
@@ -9,8 +9,11 @@ import type { NodeMaterial } from "../../nodeMaterial";
9
9
  */
10
10
  export declare class PrePassTextureBlock extends NodeMaterialBlock {
11
11
  private _positionSamplerName;
12
+ private _localPositionSamplerName;
12
13
  private _depthSamplerName;
14
+ private _clipSpaceDepthSamplerName;
13
15
  private _normalSamplerName;
16
+ private _worldNormalSamplerName;
14
17
  /**
15
18
  * The texture associated with the node is the prepass texture
16
19
  */
@@ -40,18 +43,42 @@ export declare class PrePassTextureBlock extends NodeMaterialBlock {
40
43
  * Gets the normal texture
41
44
  */
42
45
  get normal(): NodeMaterialConnectionPoint;
46
+ /**
47
+ * Gets the world normal texture
48
+ */
49
+ get worldNormal(): NodeMaterialConnectionPoint;
50
+ /**
51
+ * Gets the local position texture
52
+ */
53
+ get localPosition(): NodeMaterialConnectionPoint;
54
+ /**
55
+ * Gets the depth texture
56
+ */
57
+ get clipSpaceDepth(): NodeMaterialConnectionPoint;
43
58
  /**
44
59
  * Gets the sampler name associated with this image source
45
60
  */
46
61
  get positionSamplerName(): string;
62
+ /**
63
+ * Gets the sampler name associated with this image source
64
+ */
65
+ get localPositionSamplerName(): string;
47
66
  /**
48
67
  * Gets the sampler name associated with this image source
49
68
  */
50
69
  get normalSamplerName(): string;
70
+ /**
71
+ * Gets the sampler name associated with this image source
72
+ */
73
+ get worldNormalSamplerName(): string;
51
74
  /**
52
75
  * Gets the sampler name associated with this image source
53
76
  */
54
77
  get depthSamplerName(): string;
78
+ /**
79
+ * Gets the sampler name associated with this image source
80
+ */
81
+ get linearDepthSamplerName(): string;
55
82
  /**
56
83
  * Gets the current class name
57
84
  * @returns the class name
@@ -44,6 +44,15 @@ export class PrePassTextureBlock extends NodeMaterialBlock {
44
44
  if (output === this._outputs[2]) {
45
45
  return this._normalSamplerName;
46
46
  }
47
+ if (output === this._outputs[3]) {
48
+ return this._worldNormalSamplerName;
49
+ }
50
+ if (output === this._outputs[4]) {
51
+ return this._localPositionSamplerName;
52
+ }
53
+ if (output === this._outputs[5]) {
54
+ return this._clipSpaceDepthSamplerName;
55
+ }
47
56
  return "";
48
57
  }
49
58
  /**
@@ -64,24 +73,60 @@ export class PrePassTextureBlock extends NodeMaterialBlock {
64
73
  get normal() {
65
74
  return this._outputs[2];
66
75
  }
76
+ /**
77
+ * Gets the world normal texture
78
+ */
79
+ get worldNormal() {
80
+ return this._outputs[3];
81
+ }
82
+ /**
83
+ * Gets the local position texture
84
+ */
85
+ get localPosition() {
86
+ return this._outputs[4];
87
+ }
88
+ /**
89
+ * Gets the depth texture
90
+ */
91
+ get clipSpaceDepth() {
92
+ return this._outputs[5];
93
+ }
67
94
  /**
68
95
  * Gets the sampler name associated with this image source
69
96
  */
70
97
  get positionSamplerName() {
71
98
  return this._positionSamplerName;
72
99
  }
100
+ /**
101
+ * Gets the sampler name associated with this image source
102
+ */
103
+ get localPositionSamplerName() {
104
+ return this._localPositionSamplerName;
105
+ }
73
106
  /**
74
107
  * Gets the sampler name associated with this image source
75
108
  */
76
109
  get normalSamplerName() {
77
110
  return this._normalSamplerName;
78
111
  }
112
+ /**
113
+ * Gets the sampler name associated with this image source
114
+ */
115
+ get worldNormalSamplerName() {
116
+ return this._worldNormalSamplerName;
117
+ }
79
118
  /**
80
119
  * Gets the sampler name associated with this image source
81
120
  */
82
121
  get depthSamplerName() {
83
122
  return this._depthSamplerName;
84
123
  }
124
+ /**
125
+ * Gets the sampler name associated with this image source
126
+ */
127
+ get linearDepthSamplerName() {
128
+ return this._clipSpaceDepthSamplerName;
129
+ }
85
130
  /**
86
131
  * Gets the current class name
87
132
  * @returns the class name
@@ -97,16 +142,25 @@ export class PrePassTextureBlock extends NodeMaterialBlock {
97
142
  this._positionSamplerName = "prepassPositionSampler";
98
143
  this._depthSamplerName = "prepassDepthSampler";
99
144
  this._normalSamplerName = "prepassNormalSampler";
145
+ this._worldNormalSamplerName = "prepassWorldNormalSampler";
146
+ this._localPositionSamplerName = "prepassLocalPositionSampler";
147
+ this._clipSpaceDepthSamplerName = "prepassClipSpaceDepthSampler";
100
148
  // Unique sampler names for every prepasstexture block
101
149
  state.sharedData.variableNames.prepassPositionSampler = 0;
102
150
  state.sharedData.variableNames.prepassDepthSampler = 0;
103
151
  state.sharedData.variableNames.prepassNormalSampler = 0;
152
+ state.sharedData.variableNames.prepassWorldNormalSampler = 0;
153
+ state.sharedData.variableNames.prepassLocalPositionSampler = 0;
154
+ state.sharedData.variableNames.prepassClipSpaceDepthSampler = 0;
104
155
  // Declarations
105
156
  state.sharedData.textureBlocks.push(this);
106
157
  state.sharedData.bindableBlocks.push(this);
107
158
  state._emit2DSampler(this._positionSamplerName);
108
159
  state._emit2DSampler(this._depthSamplerName);
109
160
  state._emit2DSampler(this._normalSamplerName);
161
+ state._emit2DSampler(this._worldNormalSamplerName);
162
+ state._emit2DSampler(this._localPositionSamplerName);
163
+ state._emit2DSampler(this._clipSpaceDepthSamplerName);
110
164
  return this;
111
165
  }
112
166
  bind(effect, nodeMaterial) {
@@ -122,12 +176,27 @@ export class PrePassTextureBlock extends NodeMaterialBlock {
122
176
  if (this.position.isConnected) {
123
177
  effect.setTexture(this._positionSamplerName, sceneRT.textures[prePassRenderer.getIndex(1)]);
124
178
  }
179
+ if (this.localPosition.isConnected) {
180
+ effect.setTexture(this._localPositionSamplerName, sceneRT.textures[prePassRenderer.getIndex(9)]);
181
+ }
125
182
  if (this.depth.isConnected) {
126
183
  effect.setTexture(this._depthSamplerName, sceneRT.textures[prePassRenderer.getIndex(5)]);
127
184
  }
185
+ if (this.clipSpaceDepth.isConnected) {
186
+ effect.setTexture(this._clipSpaceDepthSamplerName, sceneRT.textures[prePassRenderer.getIndex(10)]);
187
+ }
128
188
  if (this.normal.isConnected) {
129
189
  effect.setTexture(this._normalSamplerName, sceneRT.textures[prePassRenderer.getIndex(6)]);
130
190
  }
191
+ if (this.worldNormal.isConnected) {
192
+ effect.setTexture(this._worldNormalSamplerName, sceneRT.textures[prePassRenderer.getIndex(8)]);
193
+ }
194
+ if (this.localPosition.isConnected) {
195
+ effect.setTexture(this._localPositionSamplerName, sceneRT.textures[prePassRenderer.getIndex(9)]);
196
+ }
197
+ if (this.clipSpaceDepth.isConnected) {
198
+ effect.setTexture(this._clipSpaceDepthSamplerName, sceneRT.textures[prePassRenderer.getIndex(10)]);
199
+ }
131
200
  }
132
201
  }
133
202
  RegisterClass("BABYLON.PrePassTextureBlock", PrePassTextureBlock);
@@ -1 +1 @@
1
- {"version":3,"file":"prePassTextureBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Input/prePassTextureBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { Effect } from \"../../../../Materials/effect\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport { Constants } from \"../../../../Engines/constants\";\r\nimport { ImageSourceBlock } from \"../Dual/imageSourceBlock\";\r\n\r\n/**\r\n * Block used to read from prepass textures\r\n */\r\nexport class PrePassTextureBlock extends NodeMaterialBlock {\r\n private _positionSamplerName: string;\r\n private _depthSamplerName: string;\r\n private _normalSamplerName: string;\r\n\r\n /**\r\n * The texture associated with the node is the prepass texture\r\n */\r\n public get texture() {\r\n return null;\r\n }\r\n\r\n public set texture(value: any) {\r\n return;\r\n }\r\n\r\n /**\r\n * Creates a new PrePassTextureBlock\r\n * @param name defines the block name\r\n * @param target defines the target of that block (VertexAndFragment by default)\r\n */\r\n public constructor(name: string, target = NodeMaterialBlockTargets.VertexAndFragment) {\r\n super(name, target, false);\r\n\r\n this.registerOutput(\r\n \"position\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.VertexAndFragment,\r\n new NodeMaterialConnectionPointCustomObject(\"position\", this, NodeMaterialConnectionPointDirection.Output, ImageSourceBlock, \"ImageSourceBlock\")\r\n );\r\n this.registerOutput(\r\n \"depth\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.VertexAndFragment,\r\n new NodeMaterialConnectionPointCustomObject(\"depth\", this, NodeMaterialConnectionPointDirection.Output, ImageSourceBlock, \"ImageSourceBlock\")\r\n );\r\n this.registerOutput(\r\n \"normal\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.VertexAndFragment,\r\n new NodeMaterialConnectionPointCustomObject(\"normal\", this, NodeMaterialConnectionPointDirection.Output, ImageSourceBlock, \"ImageSourceBlock\")\r\n );\r\n }\r\n\r\n /**\r\n * Returns the sampler name associated with the node connection point\r\n * @param output defines the connection point to get the associated sampler name\r\n * @returns\r\n */\r\n public getSamplerName(output: NodeMaterialConnectionPoint): string {\r\n if (output === this._outputs[0]) {\r\n return this._positionSamplerName;\r\n }\r\n\r\n if (output === this._outputs[1]) {\r\n return this._depthSamplerName;\r\n }\r\n\r\n if (output === this._outputs[2]) {\r\n return this._normalSamplerName;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Gets the position texture\r\n */\r\n public get position(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the depth texture\r\n */\r\n public get depth(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the normal texture\r\n */\r\n public get normal(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get positionSamplerName(): string {\r\n return this._positionSamplerName;\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get normalSamplerName(): string {\r\n return this._normalSamplerName;\r\n }\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get depthSamplerName(): string {\r\n return this._depthSamplerName;\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 \"PrePassTextureBlock\";\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n this._positionSamplerName = \"prepassPositionSampler\";\r\n this._depthSamplerName = \"prepassDepthSampler\";\r\n this._normalSamplerName = \"prepassNormalSampler\";\r\n\r\n // Unique sampler names for every prepasstexture block\r\n state.sharedData.variableNames.prepassPositionSampler = 0;\r\n state.sharedData.variableNames.prepassDepthSampler = 0;\r\n state.sharedData.variableNames.prepassNormalSampler = 0;\r\n\r\n // Declarations\r\n state.sharedData.textureBlocks.push(this);\r\n state.sharedData.bindableBlocks.push(this);\r\n\r\n state._emit2DSampler(this._positionSamplerName);\r\n state._emit2DSampler(this._depthSamplerName);\r\n state._emit2DSampler(this._normalSamplerName);\r\n\r\n return this;\r\n }\r\n\r\n public override bind(effect: Effect, nodeMaterial: NodeMaterial) {\r\n const scene = nodeMaterial.getScene();\r\n const prePassRenderer = scene.enablePrePassRenderer();\r\n if (!prePassRenderer) {\r\n return;\r\n }\r\n\r\n const sceneRT = prePassRenderer.defaultRT;\r\n if (!sceneRT.textures) {\r\n return;\r\n }\r\n\r\n if (this.position.isConnected) {\r\n effect.setTexture(this._positionSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_POSITION_TEXTURE_TYPE)]);\r\n }\r\n if (this.depth.isConnected) {\r\n effect.setTexture(this._depthSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);\r\n }\r\n if (this.normal.isConnected) {\r\n effect.setTexture(this._normalSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE)]);\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.PrePassTextureBlock\", PrePassTextureBlock);\r\n"]}
1
+ {"version":3,"file":"prePassTextureBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/Materials/Node/Blocks/Input/prePassTextureBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlock } from \"../../nodeMaterialBlock\";\r\nimport { NodeMaterialBlockConnectionPointTypes } from \"../../Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { Effect } from \"../../../../Materials/effect\";\r\nimport { NodeMaterialConnectionPointDirection } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialConnectionPoint } from \"../../nodeMaterialBlockConnectionPoint\";\r\nimport type { NodeMaterialBuildState } from \"../../nodeMaterialBuildState\";\r\nimport { NodeMaterialBlockTargets } from \"../../Enums/nodeMaterialBlockTargets\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\nimport type { NodeMaterial } from \"../../nodeMaterial\";\r\nimport { NodeMaterialConnectionPointCustomObject } from \"../../nodeMaterialConnectionPointCustomObject\";\r\nimport { Constants } from \"../../../../Engines/constants\";\r\nimport { ImageSourceBlock } from \"../Dual/imageSourceBlock\";\r\n\r\n/**\r\n * Block used to read from prepass textures\r\n */\r\nexport class PrePassTextureBlock extends NodeMaterialBlock {\r\n private _positionSamplerName: string;\r\n private _localPositionSamplerName: string;\r\n private _depthSamplerName: string;\r\n private _clipSpaceDepthSamplerName: string;\r\n private _normalSamplerName: string;\r\n private _worldNormalSamplerName: string;\r\n\r\n /**\r\n * The texture associated with the node is the prepass texture\r\n */\r\n public get texture() {\r\n return null;\r\n }\r\n\r\n public set texture(value: any) {\r\n return;\r\n }\r\n\r\n /**\r\n * Creates a new PrePassTextureBlock\r\n * @param name defines the block name\r\n * @param target defines the target of that block (VertexAndFragment by default)\r\n */\r\n public constructor(name: string, target = NodeMaterialBlockTargets.VertexAndFragment) {\r\n super(name, target, false);\r\n\r\n this.registerOutput(\r\n \"position\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.VertexAndFragment,\r\n new NodeMaterialConnectionPointCustomObject(\"position\", this, NodeMaterialConnectionPointDirection.Output, ImageSourceBlock, \"ImageSourceBlock\")\r\n );\r\n this.registerOutput(\r\n \"depth\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.VertexAndFragment,\r\n new NodeMaterialConnectionPointCustomObject(\"depth\", this, NodeMaterialConnectionPointDirection.Output, ImageSourceBlock, \"ImageSourceBlock\")\r\n );\r\n this.registerOutput(\r\n \"normal\",\r\n NodeMaterialBlockConnectionPointTypes.Object,\r\n NodeMaterialBlockTargets.VertexAndFragment,\r\n new NodeMaterialConnectionPointCustomObject(\"normal\", this, NodeMaterialConnectionPointDirection.Output, ImageSourceBlock, \"ImageSourceBlock\")\r\n );\r\n }\r\n\r\n /**\r\n * Returns the sampler name associated with the node connection point\r\n * @param output defines the connection point to get the associated sampler name\r\n * @returns\r\n */\r\n public getSamplerName(output: NodeMaterialConnectionPoint): string {\r\n if (output === this._outputs[0]) {\r\n return this._positionSamplerName;\r\n }\r\n\r\n if (output === this._outputs[1]) {\r\n return this._depthSamplerName;\r\n }\r\n\r\n if (output === this._outputs[2]) {\r\n return this._normalSamplerName;\r\n }\r\n\r\n if (output === this._outputs[3]) {\r\n return this._worldNormalSamplerName;\r\n }\r\n\r\n if (output === this._outputs[4]) {\r\n return this._localPositionSamplerName;\r\n }\r\n\r\n if (output === this._outputs[5]) {\r\n return this._clipSpaceDepthSamplerName;\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Gets the position texture\r\n */\r\n public get position(): NodeMaterialConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the depth texture\r\n */\r\n public get depth(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the normal texture\r\n */\r\n public get normal(): NodeMaterialConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n /**\r\n * Gets the world normal texture\r\n */\r\n public get worldNormal(): NodeMaterialConnectionPoint {\r\n return this._outputs[3];\r\n }\r\n\r\n /**\r\n * Gets the local position texture\r\n */\r\n public get localPosition(): NodeMaterialConnectionPoint {\r\n return this._outputs[4];\r\n }\r\n\r\n /**\r\n * Gets the depth texture\r\n */\r\n public get clipSpaceDepth(): NodeMaterialConnectionPoint {\r\n return this._outputs[5];\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get positionSamplerName(): string {\r\n return this._positionSamplerName;\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get localPositionSamplerName(): string {\r\n return this._localPositionSamplerName;\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get normalSamplerName(): string {\r\n return this._normalSamplerName;\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get worldNormalSamplerName(): string {\r\n return this._worldNormalSamplerName;\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get depthSamplerName(): string {\r\n return this._depthSamplerName;\r\n }\r\n\r\n /**\r\n * Gets the sampler name associated with this image source\r\n */\r\n public get linearDepthSamplerName(): string {\r\n return this._clipSpaceDepthSamplerName;\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 \"PrePassTextureBlock\";\r\n }\r\n\r\n protected override _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n if (state.target === NodeMaterialBlockTargets.Vertex) {\r\n return;\r\n }\r\n\r\n this._positionSamplerName = \"prepassPositionSampler\";\r\n this._depthSamplerName = \"prepassDepthSampler\";\r\n this._normalSamplerName = \"prepassNormalSampler\";\r\n this._worldNormalSamplerName = \"prepassWorldNormalSampler\";\r\n this._localPositionSamplerName = \"prepassLocalPositionSampler\";\r\n this._clipSpaceDepthSamplerName = \"prepassClipSpaceDepthSampler\";\r\n\r\n // Unique sampler names for every prepasstexture block\r\n state.sharedData.variableNames.prepassPositionSampler = 0;\r\n state.sharedData.variableNames.prepassDepthSampler = 0;\r\n state.sharedData.variableNames.prepassNormalSampler = 0;\r\n state.sharedData.variableNames.prepassWorldNormalSampler = 0;\r\n state.sharedData.variableNames.prepassLocalPositionSampler = 0;\r\n state.sharedData.variableNames.prepassClipSpaceDepthSampler = 0;\r\n\r\n // Declarations\r\n state.sharedData.textureBlocks.push(this);\r\n state.sharedData.bindableBlocks.push(this);\r\n\r\n state._emit2DSampler(this._positionSamplerName);\r\n state._emit2DSampler(this._depthSamplerName);\r\n state._emit2DSampler(this._normalSamplerName);\r\n state._emit2DSampler(this._worldNormalSamplerName);\r\n state._emit2DSampler(this._localPositionSamplerName);\r\n state._emit2DSampler(this._clipSpaceDepthSamplerName);\r\n\r\n return this;\r\n }\r\n\r\n public override bind(effect: Effect, nodeMaterial: NodeMaterial) {\r\n const scene = nodeMaterial.getScene();\r\n const prePassRenderer = scene.enablePrePassRenderer();\r\n if (!prePassRenderer) {\r\n return;\r\n }\r\n\r\n const sceneRT = prePassRenderer.defaultRT;\r\n if (!sceneRT.textures) {\r\n return;\r\n }\r\n\r\n if (this.position.isConnected) {\r\n effect.setTexture(this._positionSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_POSITION_TEXTURE_TYPE)]);\r\n }\r\n if (this.localPosition.isConnected) {\r\n effect.setTexture(this._localPositionSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_LOCAL_POSITION_TEXTURE_TYPE)]);\r\n }\r\n if (this.depth.isConnected) {\r\n effect.setTexture(this._depthSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);\r\n }\r\n if (this.clipSpaceDepth.isConnected) {\r\n effect.setTexture(this._clipSpaceDepthSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_NDC_DEPTH_TEXTURE_TYPE)]);\r\n }\r\n if (this.normal.isConnected) {\r\n effect.setTexture(this._normalSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE)]);\r\n }\r\n if (this.worldNormal.isConnected) {\r\n effect.setTexture(this._worldNormalSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_WORLD_NORMAL_TEXTURE_TYPE)]);\r\n }\r\n if (this.localPosition.isConnected) {\r\n effect.setTexture(this._localPositionSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_LOCAL_POSITION_TEXTURE_TYPE)]);\r\n }\r\n if (this.clipSpaceDepth.isConnected) {\r\n effect.setTexture(this._clipSpaceDepthSamplerName, sceneRT.textures[prePassRenderer.getIndex(Constants.PREPASS_NDC_DEPTH_TEXTURE_TYPE)]);\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.PrePassTextureBlock\", PrePassTextureBlock);\r\n"]}
@@ -71,14 +71,26 @@ export declare class NodeMaterialDefines extends MaterialDefines implements IIma
71
71
  PREPASS_NORMAL: boolean;
72
72
  /** Prepass normal index */
73
73
  PREPASS_NORMAL_INDEX: number;
74
+ /** Prepass world normal */
75
+ PREPASS_WORLD_NORMAL: boolean;
76
+ /** Prepass world normal index */
77
+ PREPASS_WORLD_NORMAL_INDEX: number;
74
78
  /** Prepass position */
75
79
  PREPASS_POSITION: boolean;
76
80
  /** Prepass position index */
77
81
  PREPASS_POSITION_INDEX: number;
82
+ /** Prepass local position */
83
+ PREPASS_LOCAL_POSITION: boolean;
84
+ /** Prepass local position index */
85
+ PREPASS_LOCAL_POSITION_INDEX: number;
78
86
  /** Prepass depth */
79
87
  PREPASS_DEPTH: boolean;
80
88
  /** Prepass depth index */
81
89
  PREPASS_DEPTH_INDEX: number;
90
+ /** Clip-space depth */
91
+ PREPASS_NDC_DEPTH: boolean;
92
+ /** Clip-space depth index */
93
+ PREPASS_NDC_DEPTH_INDEX: number;
82
94
  /** Scene MRT count */
83
95
  SCENE_MRT_COUNT: number;
84
96
  /** BONES */
@@ -74,14 +74,26 @@ export class NodeMaterialDefines extends MaterialDefines {
74
74
  this.PREPASS_NORMAL = false;
75
75
  /** Prepass normal index */
76
76
  this.PREPASS_NORMAL_INDEX = -1;
77
+ /** Prepass world normal */
78
+ this.PREPASS_WORLD_NORMAL = false;
79
+ /** Prepass world normal index */
80
+ this.PREPASS_WORLD_NORMAL_INDEX = -1;
77
81
  /** Prepass position */
78
82
  this.PREPASS_POSITION = false;
79
83
  /** Prepass position index */
80
84
  this.PREPASS_POSITION_INDEX = -1;
85
+ /** Prepass local position */
86
+ this.PREPASS_LOCAL_POSITION = false;
87
+ /** Prepass local position index */
88
+ this.PREPASS_LOCAL_POSITION_INDEX = -1;
81
89
  /** Prepass depth */
82
90
  this.PREPASS_DEPTH = false;
83
91
  /** Prepass depth index */
84
92
  this.PREPASS_DEPTH_INDEX = -1;
93
+ /** Clip-space depth */
94
+ this.PREPASS_NDC_DEPTH = false;
95
+ /** Clip-space depth index */
96
+ this.PREPASS_NDC_DEPTH_INDEX = -1;
85
97
  /** Scene MRT count */
86
98
  this.SCENE_MRT_COUNT = 0;
87
99
  /** BONES */
@@ -773,9 +785,15 @@ export class NodeMaterial extends PushMaterial {
773
785
  if (prePassOutputBlock.viewDepth.isConnected) {
774
786
  result.push(5);
775
787
  }
788
+ if (prePassOutputBlock.viewDepthNDC.isConnected) {
789
+ result.push(10);
790
+ }
776
791
  if (prePassOutputBlock.viewNormal.isConnected) {
777
792
  result.push(6);
778
793
  }
794
+ if (prePassOutputBlock.worldNormal.isConnected) {
795
+ result.push(8);
796
+ }
779
797
  if (prePassOutputBlock.worldPosition.isConnected) {
780
798
  result.push(1);
781
799
  }
@@ -794,9 +812,15 @@ export class NodeMaterial extends PushMaterial {
794
812
  if (block.depth.isConnected && !result.includes(5)) {
795
813
  result.push(5);
796
814
  }
815
+ if (block.clipSpaceDepth.isConnected && !result.includes(10)) {
816
+ result.push(10);
817
+ }
797
818
  if (block.normal.isConnected && !result.includes(6)) {
798
819
  result.push(6);
799
820
  }
821
+ if (block.worldNormal.isConnected && !result.includes(8)) {
822
+ result.push(8);
823
+ }
800
824
  }
801
825
  return result;
802
826
  }