@babylonjs/core 5.29.0 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/Collisions/pickingInfo.d.ts +1 -0
  2. package/Collisions/pickingInfo.js +7 -2
  3. package/Collisions/pickingInfo.js.map +1 -1
  4. package/Culling/ray.d.ts +1 -1
  5. package/Culling/ray.js +0 -6
  6. package/Culling/ray.js.map +1 -1
  7. package/Debug/debugLayer.d.ts +5 -0
  8. package/Debug/debugLayer.js.map +1 -1
  9. package/Engines/Extensions/engine.renderTarget.js +5 -1
  10. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  11. package/Engines/WebGPU/Extensions/engine.renderTarget.js +4 -1
  12. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  13. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +2 -0
  14. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  15. package/Engines/WebGPU/webgpuShaderProcessor.js +3 -7
  16. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  17. package/Engines/WebGPU/webgpuTextureHelper.js +2 -0
  18. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  19. package/Engines/WebGPU/webgpuTintWASM.d.ts +1 -0
  20. package/Engines/WebGPU/webgpuTintWASM.js +7 -1
  21. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  22. package/Engines/constants.d.ts +4 -0
  23. package/Engines/constants.js +4 -0
  24. package/Engines/constants.js.map +1 -1
  25. package/Engines/engine.d.ts +45 -12
  26. package/Engines/thinEngine.js +6 -3
  27. package/Engines/thinEngine.js.map +1 -1
  28. package/Engines/webgpuEngine.d.ts +0 -2
  29. package/Engines/webgpuEngine.js +15 -14
  30. package/Engines/webgpuEngine.js.map +1 -1
  31. package/IAccessibilityTag.d.ts +29 -0
  32. package/IAccessibilityTag.js +2 -0
  33. package/IAccessibilityTag.js.map +1 -0
  34. package/Inputs/scene.inputManager.d.ts +1 -1
  35. package/Inputs/scene.inputManager.js +9 -2
  36. package/Inputs/scene.inputManager.js.map +1 -1
  37. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.d.ts +24 -3
  38. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +92 -21
  39. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  40. package/Maths/math.vector.d.ts +72 -20
  41. package/Maths/math.vector.js +72 -31
  42. package/Maths/math.vector.js.map +1 -1
  43. package/Meshes/mesh.d.ts +1 -1
  44. package/Meshes/mesh.js +2 -1
  45. package/Meshes/mesh.js.map +1 -1
  46. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.d.ts +17 -4
  47. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +49 -9
  48. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
  49. package/Misc/iInspectable.d.ts +5 -1
  50. package/Misc/iInspectable.js +4 -0
  51. package/Misc/iInspectable.js.map +1 -1
  52. package/Misc/index.d.ts +1 -1
  53. package/Misc/index.js +1 -1
  54. package/Misc/index.js.map +1 -1
  55. package/Misc/khronosTextureContainer2.js +41 -46
  56. package/Misc/khronosTextureContainer2.js.map +1 -1
  57. package/Misc/observable.js +4 -4
  58. package/Misc/observable.js.map +1 -1
  59. package/Misc/pressureObserverWrapper.d.ts +36 -0
  60. package/Misc/pressureObserverWrapper.js +68 -0
  61. package/Misc/pressureObserverWrapper.js.map +1 -0
  62. package/Misc/screenshotTools.js +0 -1
  63. package/Misc/screenshotTools.js.map +1 -1
  64. package/Particles/particleSystem.d.ts +4 -0
  65. package/Particles/particleSystem.js +12 -4
  66. package/Particles/particleSystem.js.map +1 -1
  67. package/PostProcesses/postProcess.js +4 -4
  68. package/PostProcesses/postProcess.js.map +1 -1
  69. package/Rendering/depthPeelingRenderer.js +4 -0
  70. package/Rendering/depthPeelingRenderer.js.map +1 -1
  71. package/Rendering/renderingManager.d.ts +3 -0
  72. package/Rendering/renderingManager.js +3 -0
  73. package/Rendering/renderingManager.js.map +1 -1
  74. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +18 -13
  75. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  76. package/Shaders/fxaa.fragment.js +10 -5
  77. package/Shaders/fxaa.fragment.js.map +1 -1
  78. package/Shaders/particles.vertex.js +4 -1
  79. package/Shaders/particles.vertex.js.map +1 -1
  80. package/Shaders/spriteMap.fragment.js +7 -2
  81. package/Shaders/spriteMap.fragment.js.map +1 -1
  82. package/XR/features/WebXRControllerPointerSelection.js +1 -0
  83. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  84. package/XR/features/WebXRNearInteraction.js.map +1 -1
  85. package/node.d.ts +8 -0
  86. package/node.js +13 -1
  87. package/node.js.map +1 -1
  88. package/package.json +1 -1
  89. package/scene.d.ts +1 -8
  90. package/scene.js +1 -24
  91. package/scene.js.map +1 -1
  92. package/Misc/computePressure.d.ts +0 -57
  93. package/Misc/computePressure.js +0 -48
  94. package/Misc/computePressure.js.map +0 -1
@@ -1,7 +1,9 @@
1
+ import { __decorate } from "../../../../tslib.es6.js";
1
2
  import { NodeMaterialBlock } from "../../nodeMaterialBlock.js";
2
3
  import { NodeMaterialBlockConnectionPointTypes } from "../../Enums/nodeMaterialBlockConnectionPointTypes.js";
3
4
  import { NodeMaterialBlockTargets } from "../../Enums/nodeMaterialBlockTargets.js";
4
5
  import { RegisterClass } from "../../../../Misc/typeStore.js";
6
+ import { editableInPropertyPage, PropertyTypeForEdition } from "../../nodeMaterialDecorator.js";
5
7
  /**
6
8
  * Block used to convert a height vector to a normal
7
9
  */
@@ -12,11 +14,25 @@ export class HeightToNormalBlock extends NodeMaterialBlock {
12
14
  */
13
15
  constructor(name) {
14
16
  super(name, NodeMaterialBlockTargets.Fragment);
17
+ /**
18
+ * Defines if the output should be generated in world or tangent space.
19
+ * Note that in tangent space the result is also scaled by 0.5 and offsetted by 0.5 so that it can directly be used as a PerturbNormal.normalMapColor input
20
+ */
21
+ this.generateInWorldSpace = false;
22
+ /**
23
+ * Defines that the worldNormal input will be normalized by the HeightToNormal block before being used
24
+ */
25
+ this.automaticNormalizationNormal = true;
26
+ /**
27
+ * Defines that the worldTangent input will be normalized by the HeightToNormal block before being used
28
+ */
29
+ this.automaticNormalizationTangent = true;
15
30
  this.registerInput("input", NodeMaterialBlockConnectionPointTypes.Float);
16
- this.registerInput("position", NodeMaterialBlockConnectionPointTypes.Vector3);
17
- this.registerInput("normal", NodeMaterialBlockConnectionPointTypes.Vector3);
18
- this.registerInput("tangent", NodeMaterialBlockConnectionPointTypes.Vector3);
19
- this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.Vector3);
31
+ this.registerInput("worldPosition", NodeMaterialBlockConnectionPointTypes.Vector3);
32
+ this.registerInput("worldNormal", NodeMaterialBlockConnectionPointTypes.Vector3);
33
+ this.registerInput("worldTangent", NodeMaterialBlockConnectionPointTypes.Vector3, true);
34
+ this.registerOutput("output", NodeMaterialBlockConnectionPointTypes.Vector4);
35
+ this.registerOutput("xyz", NodeMaterialBlockConnectionPointTypes.Vector3);
20
36
  this._inputs[3].acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Vector4);
21
37
  }
22
38
  /**
@@ -35,19 +51,19 @@ export class HeightToNormalBlock extends NodeMaterialBlock {
35
51
  /**
36
52
  * Gets the position component
37
53
  */
38
- get position() {
54
+ get worldPosition() {
39
55
  return this._inputs[1];
40
56
  }
41
57
  /**
42
58
  * Gets the normal component
43
59
  */
44
- get normal() {
60
+ get worldNormal() {
45
61
  return this._inputs[2];
46
62
  }
47
63
  /**
48
64
  * Gets the tangent component
49
65
  */
50
- get tangent() {
66
+ get worldTangent() {
51
67
  return this._inputs[3];
52
68
  }
53
69
  /**
@@ -56,30 +72,85 @@ export class HeightToNormalBlock extends NodeMaterialBlock {
56
72
  get output() {
57
73
  return this._outputs[0];
58
74
  }
75
+ /**
76
+ * Gets the xyz component
77
+ */
78
+ get xyz() {
79
+ return this._outputs[1];
80
+ }
59
81
  _buildBlock(state) {
60
82
  super._buildBlock(state);
61
83
  const output = this._outputs[0];
62
- const heightToNormal = `
63
- vec3 heightToNormal(in float height, in vec3 position, in vec3 tangent, in vec3 normal) {
64
- vec3 biTangent = cross(tangent, normal);
84
+ if (!this.generateInWorldSpace && !this.worldTangent.isConnected) {
85
+ console.error(`You must connect the 'worldTangent' input of the ${this.name} block!`);
86
+ }
87
+ const startCode = this.generateInWorldSpace
88
+ ? ""
89
+ : `
90
+ vec3 biTangent = cross(normal, tangent);
65
91
  mat3 TBN = mat3(tangent, biTangent, normal);
66
- vec3 worlddX = dFdx(position * 100.0);
67
- vec3 worlddY = dFdy(position * 100.0);
68
- vec3 crossX = cross(normal, worlddX);
69
- vec3 crossY = cross(normal, worlddY);
70
- float d = abs(dot(crossY, worlddX));
71
- vec3 inToNormal = vec3(((((height + dFdx(height)) - height) * crossY) + (((height + dFdy(height)) - height) * crossX)) * sign(d));
72
- inToNormal.y *= -1.0;
73
- vec3 result = normalize((d * normal) - inToNormal);
74
- return TBN * result;
75
- }`;
92
+ `;
93
+ const endCode = this.generateInWorldSpace
94
+ ? ""
95
+ : `
96
+ result = TBN * result;
97
+ result = result * vec3(0.5) + vec3(0.5);
98
+ `;
99
+ const heightToNormal = `
100
+ vec4 heightToNormal(in float height, in vec3 position, in vec3 tangent, in vec3 normal) {
101
+ ${startCode}
102
+ ${this.automaticNormalizationTangent ? "tangent = normalize(tangent);" : ""}
103
+ ${this.automaticNormalizationNormal ? "normal = normalize(normal);" : ""}
104
+ vec3 worlddX = dFdx(position);
105
+ vec3 worlddY = dFdy(position);
106
+ vec3 crossX = cross(normal, worlddX);
107
+ vec3 crossY = cross(normal, worlddY);
108
+ float d = abs(dot(crossY, worlddX));
109
+ vec3 inToNormal = vec3(((((height + dFdx(height)) - height) * crossY) + (((height + dFdy(height)) - height) * crossX)) * sign(d));
110
+ inToNormal.y *= -1.0;
111
+ vec3 result = normalize((d * normal) - inToNormal);
112
+ ${endCode}
113
+ return vec4(result, 0.);
114
+ }`;
76
115
  state._emitExtension("derivatives", "#extension GL_OES_standard_derivatives : enable");
77
116
  state._emitFunction("heightToNormal", heightToNormal, "// heightToNormal");
78
117
  state.compilationString +=
79
118
  this._declareOutput(output, state) +
80
- ` = heightToNormal(${this.input.associatedVariableName}, ${this.position.associatedVariableName}, ${this.tangent.associatedVariableName}.xyz, ${this.normal.associatedVariableName});\r\n`;
119
+ ` = heightToNormal(${this.input.associatedVariableName}, ${this.worldPosition.associatedVariableName}, ${this.worldTangent.isConnected ? this.worldTangent.associatedVariableName : "vec3(0.)"}.xyz, ${this.worldNormal.associatedVariableName});\r\n`;
120
+ if (this.xyz.hasEndpoints) {
121
+ state.compilationString += this._declareOutput(this.xyz, state) + ` = ${this.output.associatedVariableName}.xyz;\r\n`;
122
+ }
81
123
  return this;
82
124
  }
125
+ _dumpPropertiesCode() {
126
+ let codeString = super._dumpPropertiesCode();
127
+ codeString += `${this._codeVariableName}.generateInWorldSpace = ${this.generateInWorldSpace};\r\n`;
128
+ codeString += `${this._codeVariableName}.automaticNormalizationNormal = ${this.automaticNormalizationNormal};\r\n`;
129
+ codeString += `${this._codeVariableName}.automaticNormalizationTangent = ${this.automaticNormalizationTangent};\r\n`;
130
+ return codeString;
131
+ }
132
+ serialize() {
133
+ const serializationObject = super.serialize();
134
+ serializationObject.generateInWorldSpace = this.generateInWorldSpace;
135
+ serializationObject.automaticNormalizationNormal = this.automaticNormalizationNormal;
136
+ serializationObject.automaticNormalizationTangent = this.automaticNormalizationTangent;
137
+ return serializationObject;
138
+ }
139
+ _deserialize(serializationObject, scene, rootUrl) {
140
+ super._deserialize(serializationObject, scene, rootUrl);
141
+ this.generateInWorldSpace = serializationObject.generateInWorldSpace;
142
+ this.automaticNormalizationNormal = serializationObject.automaticNormalizationNormal;
143
+ this.automaticNormalizationTangent = serializationObject.automaticNormalizationTangent;
144
+ }
83
145
  }
146
+ __decorate([
147
+ editableInPropertyPage("Generate in world space instead of tangent space", PropertyTypeForEdition.Boolean, "PROPERTIES", { notifiers: { update: true } })
148
+ ], HeightToNormalBlock.prototype, "generateInWorldSpace", void 0);
149
+ __decorate([
150
+ editableInPropertyPage("Force normalization for the worldNormal input", PropertyTypeForEdition.Boolean, "PROPERTIES", { notifiers: { update: true } })
151
+ ], HeightToNormalBlock.prototype, "automaticNormalizationNormal", void 0);
152
+ __decorate([
153
+ editableInPropertyPage("Force normalization for the worldTangent input", PropertyTypeForEdition.Boolean, "PROPERTIES", { notifiers: { update: true } })
154
+ ], HeightToNormalBlock.prototype, "automaticNormalizationTangent", void 0);
84
155
  RegisterClass("BABYLON.HeightToNormalBlock", HeightToNormalBlock);
85
156
  //# sourceMappingURL=heightToNormalBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"heightToNormalBlock.js","sourceRoot":"","sources":["../../../../../../../../lts/core/generated/Materials/Node/Blocks/Fragment/heightToNormalBlock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,qCAAqC,EAAE,MAAM,mDAAmD,CAAC;AAG1G,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,iBAAiB;IACtD;;;OAGG;IACH,YAAmB,IAAY;QAC3B,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,qCAAqC,CAAC,KAAK,CAAC,CAAC;QACzE,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,OAAO,CAAC,CAAC;QAC7E,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,qCAAqC,CAAC,OAAO,CAAC,CAAC;QAE7E,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,qCAAqC,CAAC,OAAO,CAAC,CAAC;IACrG,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,qBAAqB,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,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,MAAM;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAES,WAAW,CAAC,KAA6B;QAC/C,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEhC,MAAM,cAAc,GAAG;;;;;;;;;;;;;UAarB,CAAC;QAEH,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,iDAAiD,CAAC,CAAC;QACvF,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;QAC3E,KAAK,CAAC,iBAAiB;YACnB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC;gBAClC,qBAAqB,IAAI,CAAC,KAAK,CAAC,sBAAsB,KAAK,IAAI,CAAC,QAAQ,CAAC,sBAAsB,KAAK,IAAI,CAAC,OAAO,CAAC,sBAAsB,SAAS,IAAI,CAAC,MAAM,CAAC,sBAAsB,QAAQ,CAAC;QAE/L,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED,aAAa,CAAC,6BAA6B,EAAE,mBAAmB,CAAC,CAAC","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\n/**\r\n * Block used to convert a height vector to a normal\r\n */\r\nexport class HeightToNormalBlock extends NodeMaterialBlock {\r\n /**\r\n * Creates a new HeightToNormalBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerInput(\"input\", NodeMaterialBlockConnectionPointTypes.Float);\r\n this.registerInput(\"position\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerInput(\"normal\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerInput(\"tangent\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n\r\n this._inputs[3].acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Vector4);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"HeightToNormalBlock\";\r\n }\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 position component\r\n */\r\n public get position(): NodeMaterialConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the normal component\r\n */\r\n public get normal(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the tangent component\r\n */\r\n public get tangent(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\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 _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const output = this._outputs[0];\r\n\r\n const heightToNormal = `\r\n vec3 heightToNormal(in float height, in vec3 position, in vec3 tangent, in vec3 normal) {\r\n vec3 biTangent = cross(tangent, normal);\r\n mat3 TBN = mat3(tangent, biTangent, normal);\r\n vec3 worlddX = dFdx(position * 100.0);\r\n vec3 worlddY = dFdy(position * 100.0);\r\n vec3 crossX = cross(normal, worlddX);\r\n vec3 crossY = cross(normal, worlddY);\r\n float d = abs(dot(crossY, worlddX));\r\n vec3 inToNormal = vec3(((((height + dFdx(height)) - height) * crossY) + (((height + dFdy(height)) - height) * crossX)) * sign(d));\r\n inToNormal.y *= -1.0;\r\n vec3 result = normalize((d * normal) - inToNormal);\r\n return TBN * result;\r\n }`;\r\n\r\n state._emitExtension(\"derivatives\", \"#extension GL_OES_standard_derivatives : enable\");\r\n state._emitFunction(\"heightToNormal\", heightToNormal, \"// heightToNormal\");\r\n state.compilationString +=\r\n this._declareOutput(output, state) +\r\n ` = heightToNormal(${this.input.associatedVariableName}, ${this.position.associatedVariableName}, ${this.tangent.associatedVariableName}.xyz, ${this.normal.associatedVariableName});\\r\\n`;\r\n\r\n return this;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.HeightToNormalBlock\", HeightToNormalBlock);\r\n"]}
1
+ {"version":3,"file":"heightToNormalBlock.js","sourceRoot":"","sources":["../../../../../../../../lts/core/generated/Materials/Node/Blocks/Fragment/heightToNormalBlock.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 { editableInPropertyPage, PropertyTypeForEdition } from \"../../nodeMaterialDecorator\";\r\nimport type { Scene } from \"../../../../scene\";\r\n\r\n/**\r\n * Block used to convert a height vector to a normal\r\n */\r\nexport class HeightToNormalBlock extends NodeMaterialBlock {\r\n /**\r\n * Creates a new HeightToNormalBlock\r\n * @param name defines the block name\r\n */\r\n public constructor(name: string) {\r\n super(name, NodeMaterialBlockTargets.Fragment);\r\n\r\n this.registerInput(\"input\", NodeMaterialBlockConnectionPointTypes.Float);\r\n this.registerInput(\"worldPosition\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerInput(\"worldNormal\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n this.registerInput(\"worldTangent\", NodeMaterialBlockConnectionPointTypes.Vector3, true);\r\n this.registerOutput(\"output\", NodeMaterialBlockConnectionPointTypes.Vector4);\r\n this.registerOutput(\"xyz\", NodeMaterialBlockConnectionPointTypes.Vector3);\r\n\r\n this._inputs[3].acceptedConnectionPointTypes.push(NodeMaterialBlockConnectionPointTypes.Vector4);\r\n }\r\n\r\n /**\r\n * Defines if the output should be generated in world or tangent space.\r\n * Note that in tangent space the result is also scaled by 0.5 and offsetted by 0.5 so that it can directly be used as a PerturbNormal.normalMapColor input\r\n */\r\n @editableInPropertyPage(\"Generate in world space instead of tangent space\", PropertyTypeForEdition.Boolean, \"PROPERTIES\", { notifiers: { update: true } })\r\n public generateInWorldSpace: boolean = false;\r\n\r\n /**\r\n * Defines that the worldNormal input will be normalized by the HeightToNormal block before being used\r\n */\r\n @editableInPropertyPage(\"Force normalization for the worldNormal input\", PropertyTypeForEdition.Boolean, \"PROPERTIES\", { notifiers: { update: true } })\r\n public automaticNormalizationNormal: boolean = true;\r\n\r\n /**\r\n * Defines that the worldTangent input will be normalized by the HeightToNormal block before being used\r\n */\r\n @editableInPropertyPage(\"Force normalization for the worldTangent input\", PropertyTypeForEdition.Boolean, \"PROPERTIES\", { notifiers: { update: true } })\r\n public automaticNormalizationTangent: boolean = true;\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"HeightToNormalBlock\";\r\n }\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 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 normal component\r\n */\r\n public get worldNormal(): NodeMaterialConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the tangent component\r\n */\r\n public get worldTangent(): NodeMaterialConnectionPoint {\r\n return this._inputs[3];\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 /**\r\n * Gets the xyz component\r\n */\r\n public get xyz(): NodeMaterialConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n super._buildBlock(state);\r\n\r\n const output = this._outputs[0];\r\n\r\n if (!this.generateInWorldSpace && !this.worldTangent.isConnected) {\r\n console.error(`You must connect the 'worldTangent' input of the ${this.name} block!`);\r\n }\r\n\r\n const startCode = this.generateInWorldSpace\r\n ? \"\"\r\n : `\r\n vec3 biTangent = cross(normal, tangent);\r\n mat3 TBN = mat3(tangent, biTangent, normal);\r\n `;\r\n\r\n const endCode = this.generateInWorldSpace\r\n ? \"\"\r\n : `\r\n result = TBN * result;\r\n result = result * vec3(0.5) + vec3(0.5);\r\n `;\r\n\r\n const heightToNormal = `\r\n vec4 heightToNormal(in float height, in vec3 position, in vec3 tangent, in vec3 normal) {\r\n ${startCode}\r\n ${this.automaticNormalizationTangent ? \"tangent = normalize(tangent);\" : \"\"}\r\n ${this.automaticNormalizationNormal ? \"normal = normalize(normal);\" : \"\"}\r\n vec3 worlddX = dFdx(position);\r\n vec3 worlddY = dFdy(position);\r\n vec3 crossX = cross(normal, worlddX);\r\n vec3 crossY = cross(normal, worlddY);\r\n float d = abs(dot(crossY, worlddX));\r\n vec3 inToNormal = vec3(((((height + dFdx(height)) - height) * crossY) + (((height + dFdy(height)) - height) * crossX)) * sign(d));\r\n inToNormal.y *= -1.0;\r\n vec3 result = normalize((d * normal) - inToNormal);\r\n ${endCode}\r\n return vec4(result, 0.);\r\n }`;\r\n\r\n state._emitExtension(\"derivatives\", \"#extension GL_OES_standard_derivatives : enable\");\r\n state._emitFunction(\"heightToNormal\", heightToNormal, \"// heightToNormal\");\r\n state.compilationString +=\r\n this._declareOutput(output, state) +\r\n ` = heightToNormal(${this.input.associatedVariableName}, ${this.worldPosition.associatedVariableName}, ${\r\n this.worldTangent.isConnected ? this.worldTangent.associatedVariableName : \"vec3(0.)\"\r\n }.xyz, ${this.worldNormal.associatedVariableName});\\r\\n`;\r\n\r\n if (this.xyz.hasEndpoints) {\r\n state.compilationString += this._declareOutput(this.xyz, state) + ` = ${this.output.associatedVariableName}.xyz;\\r\\n`;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n let codeString = super._dumpPropertiesCode();\r\n codeString += `${this._codeVariableName}.generateInWorldSpace = ${this.generateInWorldSpace};\\r\\n`;\r\n codeString += `${this._codeVariableName}.automaticNormalizationNormal = ${this.automaticNormalizationNormal};\\r\\n`;\r\n codeString += `${this._codeVariableName}.automaticNormalizationTangent = ${this.automaticNormalizationTangent};\\r\\n`;\r\n\r\n return codeString;\r\n }\r\n\r\n public serialize(): any {\r\n const serializationObject = super.serialize();\r\n\r\n serializationObject.generateInWorldSpace = this.generateInWorldSpace;\r\n serializationObject.automaticNormalizationNormal = this.automaticNormalizationNormal;\r\n serializationObject.automaticNormalizationTangent = this.automaticNormalizationTangent;\r\n\r\n return serializationObject;\r\n }\r\n\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n super._deserialize(serializationObject, scene, rootUrl);\r\n\r\n this.generateInWorldSpace = serializationObject.generateInWorldSpace;\r\n this.automaticNormalizationNormal = serializationObject.automaticNormalizationNormal;\r\n this.automaticNormalizationTangent = serializationObject.automaticNormalizationTangent;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.HeightToNormalBlock\", HeightToNormalBlock);\r\n"]}