super-three 0.163.0 → 0.165.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 (197) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +1127 -452
  3. package/build/three.module.js +1127 -452
  4. package/build/three.module.min.js +2 -2
  5. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  6. package/examples/jsm/controls/TransformControls.js +1 -1
  7. package/examples/jsm/environments/RoomEnvironment.js +1 -5
  8. package/examples/jsm/exporters/GLTFExporter.js +45 -1
  9. package/examples/jsm/exporters/USDZExporter.js +13 -5
  10. package/examples/jsm/helpers/ViewHelper.js +32 -67
  11. package/examples/jsm/libs/draco/README.md +2 -2
  12. package/examples/jsm/libs/tween.module.js +75 -64
  13. package/examples/jsm/lines/LineMaterial.js +1 -15
  14. package/examples/jsm/lines/LineSegments2.js +15 -0
  15. package/examples/jsm/lines/Wireframe.js +16 -1
  16. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  17. package/examples/jsm/loaders/EXRLoader.js +283 -99
  18. package/examples/jsm/loaders/FBXLoader.js +24 -13
  19. package/examples/jsm/loaders/GLTFLoader.js +55 -0
  20. package/examples/jsm/loaders/KTX2Loader.js +3 -6
  21. package/examples/jsm/loaders/LDrawLoader.js +3 -2
  22. package/examples/jsm/loaders/MMDLoader.js +31 -12
  23. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  24. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  25. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  26. package/examples/jsm/math/Octree.js +26 -20
  27. package/examples/jsm/modifiers/CurveModifier.js +11 -9
  28. package/examples/jsm/nodes/Nodes.js +15 -13
  29. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  30. package/examples/jsm/nodes/accessors/BitangentNode.js +7 -83
  31. package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
  32. package/examples/jsm/nodes/accessors/CameraNode.js +12 -119
  33. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  34. package/examples/jsm/nodes/accessors/MaterialNode.js +109 -3
  35. package/examples/jsm/nodes/accessors/ModelNode.js +3 -0
  36. package/examples/jsm/nodes/accessors/NormalNode.js +9 -101
  37. package/examples/jsm/nodes/accessors/PositionNode.js +6 -100
  38. package/examples/jsm/nodes/accessors/ReferenceNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -31
  40. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  41. package/examples/jsm/nodes/accessors/{TextureStoreNode.js → StorageTextureNode.js} +19 -6
  42. package/examples/jsm/nodes/accessors/TangentNode.js +11 -97
  43. package/examples/jsm/nodes/accessors/Texture3DNode.js +100 -0
  44. package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
  45. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/UVNode.js +2 -46
  47. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  48. package/examples/jsm/nodes/core/AttributeNode.js +15 -3
  49. package/examples/jsm/nodes/core/ContextNode.js +6 -0
  50. package/examples/jsm/nodes/core/Node.js +23 -2
  51. package/examples/jsm/nodes/core/NodeBuilder.js +25 -18
  52. package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
  53. package/examples/jsm/nodes/core/OutputStructNode.js +3 -6
  54. package/examples/jsm/nodes/core/PropertyNode.js +11 -0
  55. package/examples/jsm/nodes/core/VaryingNode.js +40 -9
  56. package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
  57. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  58. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  59. package/examples/jsm/nodes/display/PassNode.js +3 -1
  60. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  61. package/examples/jsm/nodes/display/ViewportNode.js +5 -3
  62. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  63. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  64. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  65. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  66. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  67. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  68. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +210 -12
  69. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  70. package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +20 -5
  72. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
  74. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  75. package/examples/jsm/nodes/lighting/LightsNode.js +28 -1
  76. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  77. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  78. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +11 -7
  79. package/examples/jsm/nodes/materials/Materials.js +4 -0
  80. package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
  81. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  82. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  83. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +94 -6
  84. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  85. package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
  86. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -45
  87. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  88. package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
  89. package/examples/jsm/nodes/math/HashNode.js +2 -2
  90. package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
  91. package/examples/jsm/nodes/shadernode/ShaderNode.js +57 -41
  92. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  93. package/examples/jsm/nodes/utils/MatcapUVNode.js +1 -1
  94. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  95. package/examples/jsm/objects/Lensflare.js +2 -2
  96. package/examples/jsm/physics/JoltPhysics.js +281 -0
  97. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  98. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  99. package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
  100. package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
  101. package/examples/jsm/renderers/common/Attributes.js +2 -0
  102. package/examples/jsm/renderers/common/Background.js +3 -3
  103. package/examples/jsm/renderers/common/Bindings.js +17 -0
  104. package/examples/jsm/renderers/common/ChainMap.js +18 -48
  105. package/examples/jsm/renderers/common/ClippingContext.js +5 -5
  106. package/examples/jsm/renderers/common/Pipelines.js +2 -2
  107. package/examples/jsm/renderers/common/RenderBundle.js +18 -0
  108. package/examples/jsm/renderers/common/RenderBundles.js +38 -0
  109. package/examples/jsm/renderers/common/RenderList.js +10 -1
  110. package/examples/jsm/renderers/common/RenderObject.js +49 -1
  111. package/examples/jsm/renderers/common/Renderer.js +268 -25
  112. package/examples/jsm/renderers/common/Textures.js +1 -1
  113. package/examples/jsm/renderers/common/Uniform.js +1 -1
  114. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
  115. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
  116. package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
  117. package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
  118. package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
  119. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +23 -5
  121. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +114 -13
  122. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
  123. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +80 -46
  124. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +85 -12
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +10 -1
  127. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +6 -0
  128. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +62 -19
  129. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -3
  130. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  131. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  132. package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
  133. package/examples/jsm/utils/GPUStatsPanel.js +2 -0
  134. package/examples/jsm/utils/SceneUtils.js +60 -1
  135. package/examples/jsm/utils/SortUtils.js +8 -5
  136. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  137. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  138. package/package.json +3 -2
  139. package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
  140. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
  141. package/src/animation/tracks/StringKeyframeTrack.js +10 -1
  142. package/src/constants.js +1 -1
  143. package/src/core/Object3D.js +2 -0
  144. package/src/core/Raycaster.js +6 -2
  145. package/src/core/RenderTarget.js +8 -0
  146. package/src/extras/PMREMGenerator.js +12 -11
  147. package/src/loaders/FileLoader.js +5 -1
  148. package/src/loaders/LoaderUtils.js +3 -1
  149. package/src/loaders/MaterialLoader.js +1 -0
  150. package/src/loaders/ObjectLoader.js +1 -0
  151. package/src/materials/Material.js +2 -0
  152. package/src/materials/MeshPhysicalMaterial.js +20 -0
  153. package/src/objects/BatchedMesh.js +114 -1
  154. package/src/objects/Line.js +66 -43
  155. package/src/renderers/WebGLRenderer.js +371 -109
  156. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +15 -0
  157. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
  159. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
  160. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  161. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  162. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
  163. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
  164. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
  165. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
  166. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
  167. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  168. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  169. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  170. package/src/renderers/shaders/ShaderChunk.js +0 -2
  171. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  172. package/src/renderers/shaders/ShaderLib.js +1 -0
  173. package/src/renderers/webgl/WebGLBackground.js +24 -3
  174. package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
  175. package/src/renderers/webgl/WebGLCapabilities.js +33 -1
  176. package/src/renderers/webgl/WebGLExtensions.js +3 -1
  177. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
  178. package/src/renderers/webgl/WebGLLights.js +9 -12
  179. package/src/renderers/webgl/WebGLMaterials.js +7 -5
  180. package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
  181. package/src/renderers/webgl/WebGLProgram.js +5 -36
  182. package/src/renderers/webgl/WebGLPrograms.js +19 -14
  183. package/src/renderers/webgl/WebGLRenderStates.js +8 -4
  184. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  185. package/src/renderers/webgl/WebGLTextures.js +206 -129
  186. package/src/renderers/webgl/WebGLUtils.js +3 -21
  187. package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
  188. package/src/renderers/webxr/WebXRManager.js +8 -6
  189. package/src/textures/CompressedArrayTexture.js +14 -0
  190. package/src/textures/DataArrayTexture.js +14 -0
  191. package/src/textures/DepthTexture.js +1 -3
  192. package/src/utils.js +30 -1
  193. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
  194. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  195. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
  196. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  197. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -1,792 +0,0 @@
1
- import { defaultShaderStages, NodeFrame, MathNode, GLSLNodeParser, NodeBuilder, normalView } from '../../../nodes/Nodes.js';
2
- import SlotNode from './SlotNode.js';
3
- import { PerspectiveCamera, ShaderChunk, ShaderLib, UniformsUtils, UniformsLib } from 'three';
4
-
5
- const nodeFrame = new NodeFrame();
6
- nodeFrame.camera = new PerspectiveCamera();
7
-
8
- const nodeShaderLib = {
9
- LineBasicNodeMaterial: ShaderLib.basic,
10
- MeshBasicNodeMaterial: ShaderLib.basic,
11
- PointsNodeMaterial: ShaderLib.points,
12
- MeshStandardNodeMaterial: ShaderLib.standard,
13
- MeshPhysicalNodeMaterial: ShaderLib.physical,
14
- MeshPhongNodeMaterial: ShaderLib.phong
15
- };
16
-
17
- const glslMethods = {
18
- [ MathNode.ATAN2 ]: 'atan'
19
- };
20
-
21
- const precisionLib = {
22
- low: 'lowp',
23
- medium: 'mediump',
24
- high: 'highp'
25
- };
26
-
27
- function getIncludeSnippet( name ) {
28
-
29
- return `#include <${name}>`;
30
-
31
- }
32
-
33
- function getShaderStageProperty( shaderStage ) {
34
-
35
- return `${shaderStage}Shader`;
36
-
37
- }
38
-
39
- class WebGLNodeBuilder extends NodeBuilder {
40
-
41
- constructor( object, renderer, shader, material = null ) {
42
-
43
- super( object, renderer, new GLSLNodeParser(), null, material );
44
-
45
- this.shader = shader;
46
- this.slots = { vertex: [], fragment: [] };
47
-
48
- this._parseShaderLib();
49
- this._parseInclude( 'fragment', 'lights_physical_fragment', 'clearcoat_normal_fragment_begin', 'transmission_fragment' );
50
- this._parseObject();
51
-
52
- this._sortSlotsToFlow();
53
-
54
- }
55
-
56
- getMethod( method ) {
57
-
58
- return glslMethods[ method ] || method;
59
-
60
- }
61
-
62
- addSlot( shaderStage, slotNode ) {
63
-
64
- this.slots[ shaderStage ].push( slotNode );
65
-
66
- }
67
-
68
- _parseShaderLib() {
69
-
70
- const material = this.material;
71
-
72
- let type = material.type;
73
-
74
- // see https://github.com/mrdoob/three.js/issues/23707
75
-
76
- if ( material.isMeshPhysicalNodeMaterial ) type = 'MeshPhysicalNodeMaterial';
77
- else if ( material.isMeshStandardNodeMaterial ) type = 'MeshStandardNodeMaterial';
78
- else if ( material.isMeshPhongNodeMaterial ) type = 'MeshPhongNodeMaterial';
79
- else if ( material.isMeshBasicNodeMaterial ) type = 'MeshBasicNodeMaterial';
80
- else if ( material.isPointsNodeMaterial ) type = 'PointsNodeMaterial';
81
- else if ( material.isLineBasicNodeMaterial ) type = 'LineBasicNodeMaterial';
82
-
83
- // shader lib
84
-
85
- if ( nodeShaderLib[ type ] !== undefined ) {
86
-
87
- const shaderLib = nodeShaderLib[ type ];
88
- const shader = this.shader;
89
-
90
- shader.vertexShader = shaderLib.vertexShader;
91
- shader.fragmentShader = shaderLib.fragmentShader;
92
- shader.uniforms = UniformsUtils.merge( [ shaderLib.uniforms, UniformsLib.lights ] );
93
-
94
- }
95
-
96
- }
97
-
98
- _parseObject() {
99
-
100
- const { material, renderer } = this;
101
-
102
- this.addSlot( 'fragment', new SlotNode( {
103
- node: normalView,
104
- nodeType: 'vec3',
105
- source: 'void main() {',
106
- target: 'vec3 TransformedNormalView = %RESULT%;',
107
- inclusionType: 'append'
108
- } ) );
109
-
110
- if ( renderer.toneMappingNode && renderer.toneMappingNode.isNode === true ) {
111
-
112
- this.addSlot( 'fragment', new SlotNode( {
113
- node: material.colorNode,
114
- nodeType: 'vec4',
115
- source: getIncludeSnippet( 'tonemapping_fragment' ),
116
- target: ''
117
- } ) );
118
-
119
- }
120
-
121
- // parse inputs
122
-
123
- if ( material.colorNode && material.colorNode.isNode ) {
124
-
125
- this.addSlot( 'fragment', new SlotNode( {
126
- node: material.colorNode,
127
- nodeType: 'vec4',
128
- source: 'vec4 diffuseColor = vec4( diffuse, opacity );',
129
- target: 'vec4 diffuseColor = %RESULT%; diffuseColor.a *= opacity;',
130
- } ) );
131
-
132
- }
133
-
134
- if ( material.opacityNode && material.opacityNode.isNode ) {
135
-
136
- this.addSlot( 'fragment', new SlotNode( {
137
- node: material.opacityNode,
138
- nodeType: 'float',
139
- source: getIncludeSnippet( 'alphatest_fragment' ),
140
- target: 'diffuseColor.a = %RESULT%;',
141
- inclusionType: 'append'
142
- } ) );
143
-
144
- }
145
-
146
- if ( material.normalNode && material.normalNode.isNode ) {
147
-
148
- this.addSlot( 'fragment', new SlotNode( {
149
- node: material.normalNode,
150
- nodeType: 'vec3',
151
- source: getIncludeSnippet( 'normal_fragment_begin' ),
152
- target: 'normal = %RESULT%;',
153
- inclusionType: 'append'
154
- } ) );
155
-
156
- }
157
-
158
- if ( material.emissiveNode && material.emissiveNode.isNode ) {
159
-
160
- this.addSlot( 'fragment', new SlotNode( {
161
- node: material.emissiveNode,
162
- nodeType: 'vec3',
163
- source: getIncludeSnippet( 'emissivemap_fragment' ),
164
- target: 'totalEmissiveRadiance = %RESULT%;',
165
- inclusionType: 'append'
166
- } ) );
167
-
168
- }
169
-
170
- if ( material.isMeshStandardNodeMaterial ) {
171
-
172
- if ( material.metalnessNode && material.metalnessNode.isNode ) {
173
-
174
- this.addSlot( 'fragment', new SlotNode( {
175
- node: material.metalnessNode,
176
- nodeType: 'float',
177
- source: getIncludeSnippet( 'metalnessmap_fragment' ),
178
- target: 'metalnessFactor = %RESULT%;',
179
- inclusionType: 'append'
180
- } ) );
181
-
182
- }
183
-
184
- if ( material.roughnessNode && material.roughnessNode.isNode ) {
185
-
186
- this.addSlot( 'fragment', new SlotNode( {
187
- node: material.roughnessNode,
188
- nodeType: 'float',
189
- source: getIncludeSnippet( 'roughnessmap_fragment' ),
190
- target: 'roughnessFactor = %RESULT%;',
191
- inclusionType: 'append'
192
- } ) );
193
-
194
- }
195
-
196
- if ( material.isMeshPhysicalNodeMaterial ) {
197
-
198
- if ( material.clearcoatNode && material.clearcoatNode.isNode ) {
199
-
200
- this.addSlot( 'fragment', new SlotNode( {
201
- node: material.clearcoatNode,
202
- nodeType: 'float',
203
- source: 'material.clearcoat = clearcoat;',
204
- target: 'material.clearcoat = %RESULT%;'
205
- } ) );
206
-
207
- if ( material.clearcoatRoughnessNode && material.clearcoatRoughnessNode.isNode ) {
208
-
209
- this.addSlot( 'fragment', new SlotNode( {
210
- node: material.clearcoatRoughnessNode,
211
- nodeType: 'float',
212
- source: 'material.clearcoatRoughness = clearcoatRoughness;',
213
- target: 'material.clearcoatRoughness = %RESULT%;'
214
- } ) );
215
-
216
- }
217
-
218
- if ( material.clearcoatNormalNode && material.clearcoatNormalNode.isNode ) {
219
-
220
- this.addSlot( 'fragment', new SlotNode( {
221
- node: material.clearcoatNormalNode,
222
- nodeType: 'vec3',
223
- source: 'vec3 clearcoatNormal = nonPerturbedNormal;',
224
- target: 'vec3 clearcoatNormal = %RESULT%;'
225
- } ) );
226
-
227
- }
228
-
229
- material.defines.USE_CLEARCOAT = '';
230
-
231
- } else {
232
-
233
- delete material.defines.USE_CLEARCOAT;
234
-
235
- }
236
-
237
- if ( material.sheenNode && material.sheenNode.isNode ) {
238
-
239
- this.addSlot( 'fragment', new SlotNode( {
240
- node: material.sheenNode,
241
- nodeType: 'vec3',
242
- source: 'material.sheenColor = sheenColor;',
243
- target: 'material.sheenColor = %RESULT%;'
244
- } ) );
245
-
246
- if ( material.sheenRoughnessNode && material.sheenRoughnessNode.isNode ) {
247
-
248
- this.addSlot( 'fragment', new SlotNode( {
249
- node: material.sheenRoughnessNode,
250
- nodeType: 'float',
251
- source: 'material.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );',
252
- target: 'material.sheenRoughness = clamp( %RESULT%, 0.07, 1.0 );'
253
- } ) );
254
-
255
- }
256
-
257
- material.defines.USE_SHEEN = '';
258
-
259
- } else {
260
-
261
- delete material.defines.USE_SHEEN;
262
-
263
- }
264
-
265
- if ( material.iridescenceNode && material.iridescenceNode.isNode ) {
266
-
267
- this.addSlot( 'fragment', new SlotNode( {
268
- node: material.iridescenceNode,
269
- nodeType: 'float',
270
- source: 'material.iridescence = iridescence;',
271
- target: 'material.iridescence = %RESULT%;'
272
- } ) );
273
-
274
- if ( material.iridescenceIORNode && material.iridescenceIORNode.isNode ) {
275
-
276
- this.addSlot( 'fragment', new SlotNode( {
277
- node: material.iridescenceIORNode,
278
- nodeType: 'float',
279
- source: 'material.iridescenceIOR = iridescenceIOR;',
280
- target: 'material.iridescenceIOR = %RESULT%;'
281
- } ) );
282
-
283
- }
284
-
285
- if ( material.iridescenceThicknessNode && material.iridescenceThicknessNode.isNode ) {
286
-
287
- this.addSlot( 'fragment', new SlotNode( {
288
- node: material.iridescenceThicknessNode,
289
- nodeType: 'float',
290
- source: 'material.iridescenceThickness = iridescenceThicknessMaximum;',
291
- target: 'material.iridescenceThickness = %RESULT%;'
292
- } ) );
293
-
294
- }
295
-
296
- material.defines.USE_IRIDESCENCE = '';
297
-
298
- } else {
299
-
300
- delete material.defines.USE_IRIDESCENCE;
301
-
302
- }
303
-
304
- if ( material.iorNode && material.iorNode.isNode ) {
305
-
306
- this.addSlot( 'fragment', new SlotNode( {
307
- node: material.iorNode,
308
- nodeType: 'float',
309
- source: 'material.ior = ior;',
310
- target: 'material.ior = %RESULT%;'
311
- } ) );
312
-
313
- }
314
-
315
- if ( material.specularColorNode && material.specularColorNode.isNode ) {
316
-
317
- this.addSlot( 'fragment', new SlotNode( {
318
- node: material.specularColorNode,
319
- nodeType: 'vec3',
320
- source: 'vec3 specularColorFactor = specularColor;',
321
- target: 'vec3 specularColorFactor = %RESULT%;'
322
- } ) );
323
-
324
- }
325
-
326
- if ( material.specularIntensityNode && material.specularIntensityNode.isNode ) {
327
-
328
- this.addSlot( 'fragment', new SlotNode( {
329
- node: material.specularIntensityNode,
330
- nodeType: 'float',
331
- source: 'float specularIntensityFactor = specularIntensity;',
332
- target: 'float specularIntensityFactor = %RESULT%;'
333
- } ) );
334
-
335
- }
336
-
337
- if ( material.transmissionNode && material.transmissionNode.isNode ) {
338
-
339
- this.addSlot( 'fragment', new SlotNode( {
340
- node: material.transmissionNode,
341
- nodeType: 'float',
342
- source: 'material.transmission = transmission;',
343
- target: 'material.transmission = %RESULT%;'
344
- } ) );
345
-
346
- if ( material.thicknessNode && material.thicknessNode.isNode ) {
347
-
348
- this.addSlot( 'fragment', new SlotNode( {
349
- node: material.thicknessNode,
350
- nodeType: 'float',
351
- source: 'material.thickness = thickness;',
352
- target: 'material.thickness = %RESULT%;'
353
- } ) );
354
-
355
- }
356
-
357
- if ( material.attenuationDistanceNode && material.attenuationDistanceNode.isNode ) {
358
-
359
- this.addSlot( 'fragment', new SlotNode( {
360
- node: material.attenuationDistanceNode,
361
- nodeType: 'float',
362
- source: 'material.attenuationDistance = attenuationDistance;',
363
- target: 'material.attenuationDistance = %RESULT%;'
364
- } ) );
365
-
366
- }
367
-
368
- if ( material.attenuationColorNode && material.attenuationColorNode.isNode ) {
369
-
370
- this.addSlot( 'fragment', new SlotNode( {
371
- node: material.attenuationColorNode,
372
- nodeType: 'vec3',
373
- source: 'material.attenuationColor = attenuationColor;',
374
- target: 'material.attenuationColor = %RESULT%;'
375
- } ) );
376
-
377
- }
378
-
379
- material.transmission = 1;
380
- material.defines.USE_TRANSMISSION = '';
381
-
382
- } else {
383
-
384
- material.transmission = 0;
385
- delete material.defines.USE_TRANSMISSION;
386
-
387
- }
388
-
389
- }
390
-
391
- }
392
-
393
- //
394
-
395
- if ( material.positionNode && material.positionNode.isNode ) {
396
-
397
- this.addSlot( 'vertex', new SlotNode( {
398
- node: material.positionNode,
399
- nodeType: 'vec3',
400
- source: getIncludeSnippet( 'begin_vertex' ),
401
- target: 'transformed = %RESULT%;',
402
- inclusionType: 'append'
403
- } ) );
404
-
405
- }
406
-
407
- if ( material.sizeNode && material.sizeNode.isNode ) {
408
-
409
- this.addSlot( 'vertex', new SlotNode( {
410
- node: material.sizeNode,
411
- nodeType: 'float',
412
- source: 'gl_PointSize = size;',
413
- target: 'gl_PointSize = %RESULT%;'
414
- } ) );
415
-
416
- }
417
-
418
- }
419
-
420
- generateTexture( texture, textureProperty, uvSnippet ) {
421
-
422
- if ( texture.isTextureCube ) {
423
-
424
- return `textureCube( ${textureProperty}, ${uvSnippet} )`;
425
-
426
- } else {
427
-
428
- return `texture2D( ${textureProperty}, ${uvSnippet} )`;
429
-
430
- }
431
-
432
- }
433
-
434
- generateTextureLevel( texture, textureProperty, uvSnippet, biasSnippet ) {
435
-
436
- return `textureLod( ${textureProperty}, ${uvSnippet}, ${biasSnippet} )`;
437
-
438
- }
439
-
440
- buildFunctionCode( shaderNode ) {
441
-
442
- const layout = shaderNode.layout;
443
- const flowData = this.flowShaderNode( shaderNode );
444
-
445
- const parameters = [];
446
-
447
- for ( const input of layout.inputs ) {
448
-
449
- parameters.push( this.getType( input.type ) + ' ' + input.name );
450
-
451
- }
452
-
453
- //
454
-
455
- const code = `${ this.getType( layout.type ) } ${ layout.name }( ${ parameters.join( ', ' ) } ) {
456
-
457
- ${ flowData.vars }
458
-
459
- ${ flowData.code }
460
- return ${ flowData.result };
461
-
462
- }`;
463
-
464
- //
465
-
466
- return code;
467
-
468
- }
469
-
470
- getUniforms( shaderStage ) {
471
-
472
- const uniforms = this.uniforms[ shaderStage ];
473
-
474
- let output = '';
475
-
476
- for ( const uniform of uniforms ) {
477
-
478
- if ( /^(modelViewMatrix|projectionMatrix)$/.test( uniform.name ) )
479
- continue;
480
-
481
- let snippet = null;
482
-
483
- if ( uniform.type === 'texture' ) {
484
-
485
- snippet = `sampler2D ${uniform.name}; `;
486
-
487
- } else if ( uniform.type === 'cubeTexture' ) {
488
-
489
- snippet = `samplerCube ${uniform.name}; `;
490
-
491
- } else {
492
-
493
- const vectorType = this.getVectorType( uniform.type );
494
-
495
- snippet = `${vectorType} ${uniform.name}; `;
496
-
497
- }
498
-
499
- const precision = uniform.node.precision;
500
-
501
- if ( precision !== null ) {
502
-
503
- snippet = 'uniform ' + precisionLib[ precision ] + ' ' + snippet;
504
-
505
- } else {
506
-
507
- snippet = 'uniform ' + snippet;
508
-
509
- }
510
-
511
- output += snippet;
512
-
513
- }
514
-
515
- return output;
516
-
517
- }
518
-
519
- getAttributes( shaderStage ) {
520
-
521
- let snippet = '';
522
-
523
- if ( shaderStage === 'vertex' ) {
524
-
525
- const attributes = this.attributes;
526
-
527
- for ( const attribute of attributes ) {
528
-
529
- // ignore common attributes to prevent redefinitions
530
- if ( /^(position|normal|uv[1-3]?)$/.test( attribute.name ) )
531
- continue;
532
-
533
- snippet += `attribute ${attribute.type} ${attribute.name}; `;
534
-
535
- }
536
-
537
- }
538
-
539
- return snippet;
540
-
541
- }
542
-
543
- getVaryings( shaderStage ) {
544
-
545
- let snippet = '';
546
-
547
- const varyings = this.varyings;
548
-
549
- if ( shaderStage === 'vertex' ) {
550
-
551
- for ( const varying of varyings ) {
552
-
553
- snippet += `${varying.needsInterpolation ? 'varying' : '/*varying*/'} ${varying.type} ${varying.name}; `;
554
-
555
- }
556
-
557
- } else if ( shaderStage === 'fragment' ) {
558
-
559
- for ( const varying of varyings ) {
560
-
561
- if ( varying.needsInterpolation ) {
562
-
563
- snippet += `varying ${varying.type} ${varying.name}; `;
564
-
565
- }
566
-
567
- }
568
-
569
- }
570
-
571
- return snippet;
572
-
573
- }
574
-
575
- addCode( shaderStage, source, code, scope = this ) {
576
-
577
- const shaderProperty = getShaderStageProperty( shaderStage );
578
-
579
- let snippet = scope[ shaderProperty ];
580
-
581
- const index = snippet.indexOf( source );
582
-
583
- if ( index !== - 1 ) {
584
-
585
- const start = snippet.substring( 0, index + source.length );
586
- const end = snippet.substring( index + source.length );
587
-
588
- snippet = `${start}\n${code}\n${end}`;
589
-
590
- }
591
-
592
- scope[ shaderProperty ] = snippet;
593
-
594
- }
595
-
596
- replaceCode( shaderStage, source, target, scope = this ) {
597
-
598
- const shaderProperty = getShaderStageProperty( shaderStage );
599
-
600
- scope[ shaderProperty ] = scope[ shaderProperty ].replaceAll( source, target );
601
-
602
- }
603
-
604
- getVertexIndex() {
605
-
606
- return 'gl_VertexID';
607
-
608
- }
609
-
610
- getFrontFacing() {
611
-
612
- return 'gl_FrontFacing';
613
-
614
- }
615
-
616
- getFragCoord() {
617
-
618
- return 'gl_FragCoord';
619
-
620
- }
621
-
622
- isFlipY() {
623
-
624
- return true;
625
-
626
- }
627
-
628
- buildCode() {
629
-
630
- const shaderData = {};
631
-
632
- for ( const shaderStage of defaultShaderStages ) {
633
-
634
- const uniforms = this.getUniforms( shaderStage );
635
- const attributes = this.getAttributes( shaderStage );
636
- const varyings = this.getVaryings( shaderStage );
637
- const vars = this.getVars( shaderStage );
638
- const codes = this.getCodes( shaderStage );
639
-
640
- shaderData[ shaderStage ] = `${this.getSignature()}
641
- // <node_builder>
642
-
643
- // uniforms
644
- ${uniforms}
645
-
646
- // attributes
647
- ${attributes}
648
-
649
- // varyings
650
- ${varyings}
651
-
652
- // vars
653
- ${vars}
654
-
655
- // codes
656
- ${codes}
657
-
658
- // </node_builder>
659
-
660
- ${this.shader[ getShaderStageProperty( shaderStage ) ]}
661
- `;
662
-
663
- }
664
-
665
- this.vertexShader = shaderData.vertex;
666
- this.fragmentShader = shaderData.fragment;
667
-
668
- }
669
-
670
- build() {
671
-
672
- super.build( false );
673
-
674
- this._addSnippets();
675
- this._addUniforms();
676
-
677
- this._updateUniforms();
678
-
679
- this.shader.vertexShader = this.vertexShader;
680
- this.shader.fragmentShader = this.fragmentShader;
681
-
682
- return this;
683
-
684
- }
685
-
686
- _parseInclude( shaderStage, ...includes ) {
687
-
688
- for ( const name of includes ) {
689
-
690
- const includeSnippet = getIncludeSnippet( name );
691
- const code = ShaderChunk[ name ];
692
-
693
- const shaderProperty = getShaderStageProperty( shaderStage );
694
-
695
- this.shader[ shaderProperty ] = this.shader[ shaderProperty ].replaceAll( includeSnippet, code );
696
-
697
- }
698
-
699
- }
700
-
701
- _sortSlotsToFlow() {
702
-
703
- for ( const shaderStage of defaultShaderStages ) {
704
-
705
- const sourceCode = this.shader[ getShaderStageProperty( shaderStage ) ];
706
-
707
- const slots = this.slots[ shaderStage ].sort( ( slotA, slotB ) => {
708
-
709
- return sourceCode.indexOf( slotA.source ) > sourceCode.indexOf( slotB.source ) ? 1 : - 1;
710
-
711
- } );
712
-
713
- for ( const slotNode of slots ) {
714
-
715
- this.addFlow( shaderStage, slotNode );
716
-
717
- }
718
-
719
- }
720
-
721
- }
722
-
723
- _addSnippets() {
724
-
725
- for ( const shaderStage of defaultShaderStages ) {
726
-
727
- for ( const slotNode of this.slots[ shaderStage ] ) {
728
-
729
- const flowData = this.getFlowData( slotNode/*, shaderStage*/ );
730
-
731
- const inclusionType = slotNode.inclusionType;
732
- const source = slotNode.source;
733
- const target = flowData.code + '\n\t' + slotNode.target.replace( '%RESULT%', flowData.result );
734
-
735
- if ( inclusionType === 'append' ) {
736
-
737
- this.addCode( shaderStage, source, target );
738
-
739
- } else if ( inclusionType === 'replace' ) {
740
-
741
- this.replaceCode( shaderStage, source, target );
742
-
743
- } else {
744
-
745
- console.warn( `Inclusion type "${ inclusionType }" not compatible.` );
746
-
747
- }
748
-
749
- }
750
-
751
- this.addCode(
752
- shaderStage,
753
- 'main() {',
754
- '\n\t' + this.flowCode[ shaderStage ]
755
- );
756
-
757
- }
758
-
759
- }
760
-
761
- _addUniforms() {
762
-
763
- for ( const shaderStage of defaultShaderStages ) {
764
-
765
- // uniforms
766
-
767
- for ( const uniform of this.uniforms[ shaderStage ] ) {
768
-
769
- this.shader.uniforms[ uniform.name ] = uniform;
770
-
771
- }
772
-
773
- }
774
-
775
- }
776
-
777
- _updateUniforms() {
778
-
779
- nodeFrame.object = this.object;
780
- nodeFrame.renderer = this.renderer;
781
-
782
- for ( const node of this.updateNodes ) {
783
-
784
- nodeFrame.updateNode( node );
785
-
786
- }
787
-
788
- }
789
-
790
- }
791
-
792
- export { WebGLNodeBuilder };