@plastic-software/three 0.178.0 → 0.180.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 (245) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +950 -230
  3. package/build/three.core.js +754 -138
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +197 -96
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +99 -25
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4586 -1499
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +4544 -1499
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +2 -3
  14. package/examples/jsm/capabilities/WebGPU.js +1 -1
  15. package/examples/jsm/controls/ArcballControls.js +7 -7
  16. package/examples/jsm/controls/DragControls.js +6 -56
  17. package/examples/jsm/controls/FirstPersonControls.js +2 -2
  18. package/examples/jsm/controls/PointerLockControls.js +0 -8
  19. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  20. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  21. package/examples/jsm/exporters/GLTFExporter.js +30 -22
  22. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  23. package/examples/jsm/exporters/PLYExporter.js +1 -1
  24. package/examples/jsm/exporters/USDZExporter.js +676 -299
  25. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  26. package/examples/jsm/interactive/HTMLMesh.js +5 -3
  27. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  28. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  29. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  30. package/examples/jsm/lines/Line2.js +3 -3
  31. package/examples/jsm/lines/LineGeometry.js +1 -1
  32. package/examples/jsm/lines/LineSegments2.js +2 -2
  33. package/examples/jsm/lines/Wireframe.js +2 -2
  34. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  35. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  36. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  37. package/examples/jsm/loaders/ColladaLoader.js +1 -1
  38. package/examples/jsm/loaders/EXRLoader.js +210 -22
  39. package/examples/jsm/loaders/FBXLoader.js +1 -1
  40. package/examples/jsm/loaders/GLTFLoader.js +9 -5
  41. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  42. package/examples/jsm/loaders/HDRLoader.js +486 -0
  43. package/examples/jsm/loaders/KTX2Loader.js +112 -32
  44. package/examples/jsm/loaders/MaterialXLoader.js +212 -30
  45. package/examples/jsm/loaders/RGBELoader.js +7 -473
  46. package/examples/jsm/loaders/TTFLoader.js +13 -1
  47. package/examples/jsm/loaders/USDLoader.js +219 -0
  48. package/examples/jsm/loaders/USDZLoader.js +4 -892
  49. package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
  50. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  51. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  52. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  53. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  54. package/examples/jsm/math/ColorSpaces.js +19 -1
  55. package/examples/jsm/math/ConvexHull.js +2 -2
  56. package/examples/jsm/math/Lut.js +2 -2
  57. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  58. package/examples/jsm/misc/ProgressiveLightMap.js +1 -1
  59. package/examples/jsm/misc/Volume.js +1 -1
  60. package/examples/jsm/objects/LensflareMesh.js +3 -3
  61. package/examples/jsm/objects/SkyMesh.js +2 -2
  62. package/examples/jsm/physics/RapierPhysics.js +14 -5
  63. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  64. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  65. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  66. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  67. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  68. package/examples/jsm/transpiler/GLSLDecoder.js +23 -20
  69. package/examples/jsm/transpiler/TSLEncoder.js +2 -10
  70. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  71. package/examples/jsm/tsl/display/AnamorphicNode.js +27 -4
  72. package/examples/jsm/tsl/display/BloomNode.js +7 -6
  73. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  74. package/examples/jsm/tsl/display/DepthOfFieldNode.js +439 -90
  75. package/examples/jsm/tsl/display/GTAONode.js +8 -0
  76. package/examples/jsm/tsl/display/GaussianBlurNode.js +51 -41
  77. package/examples/jsm/tsl/display/OutlineNode.js +2 -2
  78. package/examples/jsm/tsl/display/SSRNode.js +180 -65
  79. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +181 -172
  80. package/examples/jsm/tsl/display/boxBlur.js +64 -0
  81. package/examples/jsm/tsl/display/hashBlur.js +15 -18
  82. package/examples/jsm/tsl/lighting/TiledLightsNode.js +1 -1
  83. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  84. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  85. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  86. package/package.json +1 -1
  87. package/src/Three.Core.js +2 -0
  88. package/src/Three.TSL.js +98 -24
  89. package/src/animation/AnimationClip.js +17 -2
  90. package/src/animation/KeyframeTrack.js +1 -1
  91. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  92. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  93. package/src/cameras/Camera.js +14 -0
  94. package/src/cameras/OrthographicCamera.js +1 -1
  95. package/src/cameras/PerspectiveCamera.js +1 -1
  96. package/src/constants.js +11 -3
  97. package/src/core/BufferGeometry.js +2 -2
  98. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  99. package/src/extras/PMREMGenerator.js +11 -0
  100. package/src/extras/TextureUtils.js +2 -1
  101. package/src/extras/lib/earcut.js +1 -1
  102. package/src/helpers/CameraHelper.js +41 -11
  103. package/src/helpers/SkeletonHelper.js +35 -6
  104. package/src/lights/LightShadow.js +21 -8
  105. package/src/lights/PointLightShadow.js +1 -1
  106. package/src/lights/webgpu/ProjectorLight.js +1 -1
  107. package/src/loaders/FileLoader.js +25 -2
  108. package/src/loaders/ImageBitmapLoader.js +23 -0
  109. package/src/loaders/Loader.js +14 -0
  110. package/src/loaders/LoadingManager.js +23 -0
  111. package/src/materials/Material.js +12 -0
  112. package/src/materials/MeshBasicMaterial.js +1 -1
  113. package/src/materials/MeshDistanceMaterial.js +1 -1
  114. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  115. package/src/materials/nodes/NodeMaterial.js +1 -1
  116. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  117. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  118. package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -2
  119. package/src/math/ColorManagement.js +7 -1
  120. package/src/math/Frustum.js +19 -8
  121. package/src/math/FrustumArray.js +10 -5
  122. package/src/math/Line3.js +129 -2
  123. package/src/math/Matrix4.js +48 -27
  124. package/src/math/Spherical.js +2 -2
  125. package/src/nodes/Nodes.js +4 -0
  126. package/src/nodes/TSL.js +4 -0
  127. package/src/nodes/accessors/BufferNode.js +1 -1
  128. package/src/nodes/accessors/Camera.js +142 -16
  129. package/src/nodes/accessors/ClippingNode.js +6 -5
  130. package/src/nodes/accessors/CubeTextureNode.js +2 -2
  131. package/src/nodes/accessors/InstanceNode.js +3 -1
  132. package/src/nodes/accessors/Normal.js +11 -11
  133. package/src/nodes/accessors/Object3DNode.js +1 -1
  134. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  135. package/src/nodes/accessors/ReferenceNode.js +19 -4
  136. package/src/nodes/accessors/SceneNode.js +1 -1
  137. package/src/nodes/accessors/StorageTextureNode.js +1 -1
  138. package/src/nodes/accessors/Texture3DNode.js +13 -0
  139. package/src/nodes/accessors/TextureNode.js +83 -19
  140. package/src/nodes/code/FunctionCallNode.js +19 -0
  141. package/src/nodes/code/FunctionNode.js +23 -0
  142. package/src/nodes/core/ArrayNode.js +12 -0
  143. package/src/nodes/core/AssignNode.js +6 -2
  144. package/src/nodes/core/ContextNode.js +44 -1
  145. package/src/nodes/core/Node.js +30 -22
  146. package/src/nodes/core/NodeBuilder.js +71 -32
  147. package/src/nodes/core/NodeFrame.js +1 -1
  148. package/src/nodes/core/NodeUniform.js +1 -1
  149. package/src/nodes/core/NodeUtils.js +5 -3
  150. package/src/nodes/core/StackNode.js +71 -4
  151. package/src/nodes/core/StructNode.js +5 -5
  152. package/src/nodes/core/StructTypeNode.js +1 -0
  153. package/src/nodes/core/SubBuildNode.js +2 -2
  154. package/src/nodes/core/UniformNode.js +79 -14
  155. package/src/nodes/core/VarNode.js +83 -15
  156. package/src/nodes/display/FrontFacingNode.js +4 -8
  157. package/src/nodes/display/PassNode.js +148 -2
  158. package/src/nodes/display/ScreenNode.js +42 -13
  159. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  160. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  161. package/src/nodes/display/ViewportTextureNode.js +94 -4
  162. package/src/nodes/functions/PhysicalLightingModel.js +2 -2
  163. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  164. package/src/nodes/gpgpu/ComputeNode.js +67 -23
  165. package/src/nodes/gpgpu/SubgroupFunctionNode.js +430 -0
  166. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  167. package/src/nodes/lighting/LightsNode.js +1 -1
  168. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  169. package/src/nodes/lighting/ShadowFilterNode.js +1 -1
  170. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  171. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  172. package/src/nodes/math/BitcastNode.js +156 -0
  173. package/src/nodes/math/ConditionalNode.js +19 -3
  174. package/src/nodes/math/MathNode.js +72 -60
  175. package/src/nodes/math/OperatorNode.js +26 -25
  176. package/src/nodes/tsl/TSLCore.js +477 -142
  177. package/src/nodes/utils/DebugNode.js +1 -1
  178. package/src/nodes/utils/EventNode.js +83 -0
  179. package/src/nodes/utils/JoinNode.js +3 -1
  180. package/src/nodes/utils/MemberNode.js +58 -7
  181. package/src/nodes/utils/RTTNode.js +10 -1
  182. package/src/nodes/utils/ReflectorNode.js +51 -7
  183. package/src/nodes/utils/SampleNode.js +12 -2
  184. package/src/nodes/utils/SplitNode.js +11 -0
  185. package/src/nodes/utils/Timer.js +0 -47
  186. package/src/objects/BatchedMesh.js +6 -4
  187. package/src/objects/LOD.js +1 -1
  188. package/src/objects/Sprite.js +2 -2
  189. package/src/renderers/WebGLRenderer.js +21 -31
  190. package/src/renderers/common/Attributes.js +1 -1
  191. package/src/renderers/common/Backend.js +19 -1
  192. package/src/renderers/common/Bindings.js +21 -18
  193. package/src/renderers/common/ChainMap.js +1 -1
  194. package/src/renderers/common/Color4.js +2 -2
  195. package/src/renderers/common/DataMap.js +1 -1
  196. package/src/renderers/common/Pipelines.js +1 -1
  197. package/src/renderers/common/PostProcessing.js +60 -5
  198. package/src/renderers/common/RenderContext.js +2 -2
  199. package/src/renderers/common/RenderObject.js +14 -2
  200. package/src/renderers/common/Renderer.js +55 -32
  201. package/src/renderers/common/SampledTexture.js +4 -72
  202. package/src/renderers/common/Sampler.js +91 -0
  203. package/src/renderers/common/Storage3DTexture.js +21 -0
  204. package/src/renderers/common/StorageArrayTexture.js +21 -0
  205. package/src/renderers/common/StorageTexture.js +19 -0
  206. package/src/renderers/common/Textures.js +52 -14
  207. package/src/renderers/common/TimestampQueryPool.js +3 -3
  208. package/src/renderers/common/XRManager.js +51 -17
  209. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  210. package/src/renderers/common/nodes/NodeLibrary.js +5 -5
  211. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  212. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  213. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  214. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  215. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  216. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  217. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  218. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  219. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  220. package/src/renderers/webgl/WebGLProgram.js +24 -18
  221. package/src/renderers/webgl/WebGLPrograms.js +4 -4
  222. package/src/renderers/webgl/WebGLShadowMap.js +11 -1
  223. package/src/renderers/webgl/WebGLTextures.js +20 -7
  224. package/src/renderers/webgl/WebGLUtils.js +3 -2
  225. package/src/renderers/webgl-fallback/WebGLBackend.js +207 -146
  226. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +112 -19
  227. package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -1
  228. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +52 -3
  229. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -10
  230. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  231. package/src/renderers/webgpu/WebGPUBackend.js +87 -44
  232. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +169 -99
  233. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +35 -31
  234. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -2
  235. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +10 -19
  236. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +120 -84
  237. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +3 -3
  238. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  239. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  240. package/src/renderers/webxr/WebXRManager.js +86 -11
  241. package/src/textures/ExternalTexture.js +56 -0
  242. package/src/textures/FramebufferTexture.js +2 -2
  243. package/src/textures/Source.js +12 -2
  244. package/src/textures/VideoTexture.js +27 -2
  245. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -0,0 +1,17 @@
1
+ import {
2
+ Group
3
+ } from 'three';
4
+
5
+ class USDCParser {
6
+
7
+ parse( buffer ) {
8
+
9
+ // TODO
10
+
11
+ return new Group();
12
+
13
+ }
14
+
15
+ }
16
+
17
+ export { USDCParser };
@@ -0,0 +1,533 @@
1
+ import * as THREE from 'three';
2
+ import * as TSL from 'three/tsl';
3
+
4
+ // some helpers below are ported from Blender and converted to TSL
5
+
6
+ const mapRange = TSL.Fn( ( [ x, fromMin, fromMax, toMin, toMax, clmp ] ) => {
7
+
8
+ const factor = x.sub( fromMin ).div( fromMax.sub( fromMin ) );
9
+ const result = toMin.add( factor.mul( toMax.sub( toMin ) ) );
10
+
11
+ return TSL.select( clmp, TSL.max( TSL.min( result, toMax ), toMin ), result );
12
+
13
+ } );
14
+
15
+ const voronoi3d = TSL.wgslFn( `
16
+ fn voronoi3d(x: vec3<f32>, smoothness: f32, randomness: f32) -> f32
17
+ {
18
+ let p = floor(x);
19
+ let f = fract(x);
20
+
21
+ var res = 0.0;
22
+ var totalWeight = 0.0;
23
+
24
+ for (var k = -1; k <= 1; k++)
25
+ {
26
+ for (var j = -1; j <= 1; j++)
27
+ {
28
+ for (var i = -1; i <= 1; i++)
29
+ {
30
+ let b = vec3<f32>(f32(i), f32(j), f32(k));
31
+ let hashOffset = hash3d(p + b) * randomness;
32
+ let r = b - f + hashOffset;
33
+ let d = length(r);
34
+
35
+ let weight = exp(-d * d / max(smoothness * smoothness, 0.001));
36
+ res += d * weight;
37
+ totalWeight += weight;
38
+ }
39
+ }
40
+ }
41
+
42
+ if (totalWeight > 0.0)
43
+ {
44
+ res /= totalWeight;
45
+ }
46
+
47
+ return smoothstep(0.0, 1.0, res);
48
+ }
49
+
50
+ fn hash3d(p: vec3<f32>) -> vec3<f32>
51
+ {
52
+ var p3 = fract(p * vec3<f32>(0.1031, 0.1030, 0.0973));
53
+ p3 += dot(p3, p3.yzx + 33.33);
54
+ return fract((p3.xxy + p3.yzz) * p3.zyx);
55
+ }
56
+ ` );
57
+
58
+ // const hash3d = TSL.Fn( ( [ p ] ) => {
59
+
60
+ // const p3 = p.mul( TSL.vec3( 0.1031, 0.1030, 0.0973 ) ).fract();
61
+ // const dotProduct = p3.dot( p3.yzx.add( 33.33 ) );
62
+ // p3.addAssign( dotProduct );
63
+
64
+ // return p3.xxy.add( p3.yzz ).mul( p3.zyx ).fract();
65
+
66
+ // } );
67
+
68
+ // const voronoi3d = TSL.Fn( ( [ x, smoothness, randomness ] ) => {
69
+ // let p = TSL.floor(x);
70
+ // let f = TSL.fract(x);
71
+
72
+ // var res = TSL.float(0.0);
73
+ // var totalWeight = TSL.float(0.0);
74
+
75
+ // TSL.Loop( 3, 3, 3, ( { k, j, i } ) => {
76
+ // let b = TSL.vec3(TSL.float(i).sub(1), TSL.float(j).sub(1), TSL.float(k).sub(1));
77
+ // let hashOffset = hash3d(p.add(b)).mul(randomness);
78
+ // let r = b.sub(f).add(hashOffset);
79
+ // let d = TSL.length(r);
80
+
81
+ // let weight = TSL.exp(d.negate().mul(d).div(TSL.max(smoothness.mul(smoothness), 0.001)));
82
+ // res.addAssign(d.mul(weight));
83
+ // totalWeight.addAssign(weight);
84
+ // } );
85
+
86
+ // res.assign(TSL.select(totalWeight.greaterThan(0.0), res.div(totalWeight), res));
87
+
88
+ // return TSL.smoothstep(0.0, 1.0, res);
89
+ // } );
90
+
91
+ const softLightMix = TSL.Fn( ( [ t, col1, col2 ] ) => {
92
+
93
+ const tm = TSL.float( 1.0 ).sub( t );
94
+
95
+ const one = TSL.vec3( 1.0 );
96
+ const scr = one.sub( one.sub( col2 ).mul( one.sub( col1 ) ) );
97
+
98
+ return tm.mul( col1 ).add( t.mul( one.sub( col1 ).mul( col2 ).mul( col1 ).add( col1.mul( scr ) ) ) );
99
+
100
+ } );
101
+
102
+ const noiseFbm = TSL.Fn( ( [ p, detail, roughness, lacunarity, useNormalize ] ) => {
103
+
104
+ const fscale = TSL.float( 1.0 ).toVar();
105
+ const amp = TSL.float( 1.0 ).toVar();
106
+ const maxamp = TSL.float( 0.0 ).toVar();
107
+ const sum = TSL.float( 0.0 ).toVar();
108
+
109
+ const iterations = detail.floor();
110
+
111
+ TSL.Loop( iterations, () => {
112
+
113
+ const t = TSL.mx_noise_float( p.mul( fscale ) );
114
+ sum.addAssign( t.mul( amp ) );
115
+ maxamp.addAssign( amp );
116
+ amp.mulAssign( roughness );
117
+ fscale.mulAssign( lacunarity );
118
+
119
+ } );
120
+
121
+ const rmd = detail.sub( iterations );
122
+ const hasRemainder = rmd.greaterThan( 0.001 );
123
+
124
+ return TSL.select(
125
+ hasRemainder,
126
+ TSL.select(
127
+ useNormalize.equal( 1 ),
128
+ ( () => {
129
+
130
+ const t = TSL.mx_noise_float( p.mul( fscale ) );
131
+ const sum2 = sum.add( t.mul( amp ) );
132
+ const maxamp2 = maxamp.add( amp );
133
+ const normalizedSum = sum.div( maxamp ).mul( 0.5 ).add( 0.5 );
134
+ const normalizedSum2 = sum2.div( maxamp2 ).mul( 0.5 ).add( 0.5 );
135
+ return TSL.mix( normalizedSum, normalizedSum2, rmd );
136
+
137
+ } )(),
138
+ ( () => {
139
+
140
+ const t = TSL.mx_noise_float( p.mul( fscale ) );
141
+ const sum2 = sum.add( t.mul( amp ) );
142
+ return TSL.mix( sum, sum2, rmd );
143
+
144
+ } )()
145
+ ),
146
+ TSL.select(
147
+ useNormalize.equal( 1 ),
148
+ sum.div( maxamp ).mul( 0.5 ).add( 0.5 ),
149
+ sum
150
+ )
151
+ );
152
+
153
+ } );
154
+
155
+ const noiseFbm3d = TSL.Fn( ( [ p, detail, roughness, lacunarity, useNormalize ] ) => {
156
+
157
+ const fscale = TSL.float( 1.0 ).toVar();
158
+
159
+ const amp = TSL.float( 1.0 ).toVar();
160
+ const maxamp = TSL.float( 0.0 ).toVar();
161
+ const sum = TSL.vec3( 0.0 ).toVar();
162
+
163
+ const iterations = detail.floor();
164
+
165
+ TSL.Loop( iterations, () => {
166
+
167
+ const t = TSL.mx_noise_vec3( p.mul( fscale ) );
168
+ sum.addAssign( t.mul( amp ) );
169
+ maxamp.addAssign( amp );
170
+ amp.mulAssign( roughness );
171
+ fscale.mulAssign( lacunarity );
172
+
173
+ } );
174
+
175
+ const rmd = detail.sub( iterations );
176
+ const hasRemainder = rmd.greaterThan( 0.001 );
177
+
178
+ return TSL.select(
179
+ hasRemainder,
180
+ TSL.select(
181
+ useNormalize.equal( 1 ),
182
+ ( () => {
183
+
184
+ const t = TSL.mx_noise_vec3( p.mul( fscale ) );
185
+ const sum2 = sum.add( t.mul( amp ) );
186
+ const maxamp2 = maxamp.add( amp );
187
+ const normalizedSum = sum.div( maxamp ).mul( 0.5 ).add( 0.5 );
188
+ const normalizedSum2 = sum2.div( maxamp2 ).mul( 0.5 ).add( 0.5 );
189
+ return TSL.mix( normalizedSum, normalizedSum2, rmd );
190
+
191
+ } )(),
192
+ ( () => {
193
+
194
+ const t = TSL.mx_noise_vec3( p.mul( fscale ) );
195
+ const sum2 = sum.add( t.mul( amp ) );
196
+ return TSL.mix( sum, sum2, rmd );
197
+
198
+ } )()
199
+ ),
200
+ TSL.select(
201
+ useNormalize.equal( 1 ),
202
+ sum.div( maxamp ).mul( 0.5 ).add( 0.5 ),
203
+ sum
204
+ )
205
+ );
206
+
207
+ } );
208
+
209
+ const woodCenter = TSL.Fn( ( [ p, centerSize ] ) => {
210
+
211
+ const pxyCenter = p.mul( TSL.vec3( 1, 1, 0 ) ).length();
212
+ const center = mapRange( pxyCenter, 0, 1, 0, centerSize, true );
213
+
214
+ return center;
215
+
216
+ } );
217
+
218
+ const spaceWarp = TSL.Fn( ( [ p, warpStrength, xyScale, zScale ] ) => {
219
+
220
+ const combinedXyz = TSL.vec3( xyScale, xyScale, zScale ).mul( p );
221
+ const noise = noiseFbm3d( combinedXyz.mul( 1.6 * 1.5 ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 2 ), TSL.int( 1 ) ).sub( 0.5 ).mul( warpStrength );
222
+ const pXy = p.mul( TSL.vec3( 1, 1, 0 ) );
223
+ const normalizedXy = pXy.normalize();
224
+ const warp = noise.mul( normalizedXy ).add( pXy );
225
+
226
+ return warp;
227
+
228
+ } );
229
+
230
+ const woodRings = TSL.Fn( ( [ w, ringThickness, ringBias, ringSizeVariance, ringVarianceScale, barkThickness ] ) => {
231
+
232
+ const rings = noiseFbm( w.mul( ringVarianceScale ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 1 ), TSL.int( 1 ) ).mul( ringSizeVariance ).add( w ).mul( ringThickness ).fract().mul( barkThickness );
233
+
234
+ const sharpRings = TSL.min( mapRange( rings, 0, ringBias, 0, 1, TSL.bool( true ) ), mapRange( rings, ringBias, 1, 1, 0, TSL.bool( true ) ) );
235
+
236
+ const blurAmount = TSL.max( TSL.positionView.length().div( 10 ), 1 );
237
+ const blurredRings = TSL.smoothstep( blurAmount.negate(), blurAmount, sharpRings.sub( 0.5 ) ).mul( 0.5 ).add( 0.5 );
238
+
239
+ return blurredRings;
240
+
241
+ } );
242
+
243
+ const woodDetail = TSL.Fn( ( [ warp, p, y, splotchScale ] ) => {
244
+
245
+ const radialCoords = TSL.clamp( TSL.atan( warp.y, warp.x ).div( TSL.PI2 ).add( 0.5 ), 0, 1 ).mul( TSL.PI2.mul( 3 ) );
246
+ const combinedXyz = TSL.vec3( radialCoords.sin(), y, radialCoords.cos().mul( p.z ) );
247
+ const scaled = TSL.vec3( 0.1, 1.19, 0.05 ).mul( combinedXyz );
248
+
249
+ return noiseFbm( scaled.mul( splotchScale ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 2 ), TSL.bool( true ) );
250
+
251
+ } );
252
+
253
+ const cellStructure = TSL.Fn( ( [ p, cellScale, cellSize ] ) => {
254
+
255
+ const warp = spaceWarp( p.mul( cellScale.div( 50 ) ), cellScale.div( 1000 ), 0.1, 1.77 );
256
+ const cells = voronoi3d( warp.xy.mul( 75 ), 0.5, 1 );
257
+
258
+ return mapRange( cells, cellSize, cellSize.add( 0.21 ), 0, 1, TSL.bool( true ) );
259
+
260
+ } );
261
+
262
+ const wood = TSL.Fn( ( [
263
+ p,
264
+ centerSize,
265
+ largeWarpScale,
266
+ largeGrainStretch,
267
+ smallWarpStrength,
268
+ smallWarpScale,
269
+ fineWarpStrength,
270
+ fineWarpScale,
271
+ ringThickness,
272
+ ringBias,
273
+ ringSizeVariance,
274
+ ringVarianceScale,
275
+ barkThickness,
276
+ splotchScale,
277
+ splotchIntensity,
278
+ cellScale,
279
+ cellSize,
280
+ darkGrainColor,
281
+ lightGrainColor
282
+ ] ) => {
283
+
284
+ const center = woodCenter( p, centerSize );
285
+ const mainWarp = spaceWarp( spaceWarp( p, center, largeWarpScale, largeGrainStretch ), smallWarpStrength, smallWarpScale, 0.17 );
286
+ const detailWarp = spaceWarp( mainWarp, fineWarpStrength, fineWarpScale, 0.17 );
287
+ const rings = woodRings( detailWarp.length(), TSL.float( 1 ).div( ringThickness ), ringBias, ringSizeVariance, ringVarianceScale, barkThickness );
288
+ const detail = woodDetail( detailWarp, p, detailWarp.length(), splotchScale );
289
+ const cells = cellStructure( mainWarp, cellScale, cellSize.div( TSL.max( TSL.positionView.length().mul( 10 ), 1 ) ) );
290
+ const baseColor = TSL.mix( darkGrainColor, lightGrainColor, rings );
291
+
292
+ return softLightMix( splotchIntensity, softLightMix( 0.407, baseColor, cells ), detail );
293
+
294
+ } );
295
+
296
+ const woodParams = {
297
+ teak: {
298
+ transformationMatrix: new THREE.Matrix4().identity(),
299
+ centerSize: 1.11, largeWarpScale: 0.32, largeGrainStretch: 0.24, smallWarpStrength: 0.059,
300
+ smallWarpScale: 2, fineWarpStrength: 0.006, fineWarpScale: 32.8, ringThickness: 1/34,
301
+ ringBias: 0.03, ringSizeVariance: 0.03, ringVarianceScale: 4.4, barkThickness: 0.3,
302
+ splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 910, cellSize: 0.1,
303
+ darkGrainColor: '#0c0504', lightGrainColor: '#926c50'
304
+ },
305
+ walnut: {
306
+ transformationMatrix: new THREE.Matrix4().identity(),
307
+ centerSize: 1.07, largeWarpScale: 0.42, largeGrainStretch: 0.34, smallWarpStrength: 0.016,
308
+ smallWarpScale: 10.3, fineWarpStrength: 0.028, fineWarpScale: 12.7, ringThickness: 1/32,
309
+ ringBias: 0.08, ringSizeVariance: 0.03, ringVarianceScale: 5.5, barkThickness: 0.98,
310
+ splotchScale: 1.84, splotchIntensity: 0.97, cellScale: 710, cellSize: 0.31,
311
+ darkGrainColor: '#311e13', lightGrainColor: '#523424'
312
+ },
313
+ white_oak: {
314
+ transformationMatrix: new THREE.Matrix4().identity(),
315
+ centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.21, smallWarpStrength: 0.034,
316
+ smallWarpScale: 2.44, fineWarpStrength: 0.01, fineWarpScale: 14.3, ringThickness: 1/34,
317
+ ringBias: 0.82, ringSizeVariance: 0.16, ringVarianceScale: 1.4, barkThickness: 0.7,
318
+ splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 800, cellSize: 0.28,
319
+ darkGrainColor: '#8b4c21', lightGrainColor: '#c57e43'
320
+ },
321
+ pine: {
322
+ transformationMatrix: new THREE.Matrix4().identity(),
323
+ centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.18, smallWarpStrength: 0.041,
324
+ smallWarpScale: 2.44, fineWarpStrength: 0.006, fineWarpScale: 23.2, ringThickness: 1/24,
325
+ ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 5, barkThickness: 0.35,
326
+ splotchScale: 0.51, splotchIntensity: 3.32, cellScale: 1480, cellSize: 0.07,
327
+ darkGrainColor: '#c58355', lightGrainColor: '#d19d61'
328
+ },
329
+ poplar: {
330
+ transformationMatrix: new THREE.Matrix4().identity(),
331
+ centerSize: 1.43, largeWarpScale: 0.33, largeGrainStretch: 0.18, smallWarpStrength: 0.04,
332
+ smallWarpScale: 4.3, fineWarpStrength: 0.004, fineWarpScale: 33.6, ringThickness: 1/37,
333
+ ringBias: 0.07, ringSizeVariance: 0.03, ringVarianceScale: 3.8, barkThickness: 0.3,
334
+ splotchScale: 1.92, splotchIntensity: 0.71, cellScale: 830, cellSize: 0.04,
335
+ darkGrainColor: '#716347', lightGrainColor: '#998966'
336
+ },
337
+ maple: {
338
+ transformationMatrix: new THREE.Matrix4().identity(),
339
+ centerSize: 1.4, largeWarpScale: 0.38, largeGrainStretch: 0.25, smallWarpStrength: 0.067,
340
+ smallWarpScale: 2.5, fineWarpStrength: 0.005, fineWarpScale: 33.6, ringThickness: 1/35,
341
+ ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 4.6, barkThickness: 0.61,
342
+ splotchScale: 0.46, splotchIntensity: 1.49, cellScale: 800, cellSize: 0.03,
343
+ darkGrainColor: '#b08969', lightGrainColor: '#bc9d7d'
344
+ },
345
+ red_oak: {
346
+ transformationMatrix: new THREE.Matrix4().identity(),
347
+ centerSize: 1.21, largeWarpScale: 0.24, largeGrainStretch: 0.25, smallWarpStrength: 0.044,
348
+ smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 14.5, ringThickness: 1/34,
349
+ ringBias: 0.92, ringSizeVariance: 0.03, ringVarianceScale: 5.6, barkThickness: 1.01,
350
+ splotchScale: 0.28, splotchIntensity: 3.48, cellScale: 800, cellSize: 0.25,
351
+ darkGrainColor: '#af613b', lightGrainColor: '#e0a27a'
352
+ },
353
+ cherry: {
354
+ transformationMatrix: new THREE.Matrix4().identity(),
355
+ centerSize: 1.33, largeWarpScale: 0.11, largeGrainStretch: 0.33, smallWarpStrength: 0.024,
356
+ smallWarpScale: 2.48, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/36,
357
+ ringBias: 0.02, ringSizeVariance: 0.04, ringVarianceScale: 6.5, barkThickness: 0.09,
358
+ splotchScale: 1.27, splotchIntensity: 1.24, cellScale: 1530, cellSize: 0.15,
359
+ darkGrainColor: '#913f27', lightGrainColor: '#b45837'
360
+ },
361
+ cedar: {
362
+ transformationMatrix: new THREE.Matrix4().identity(),
363
+ centerSize: 1.11, largeWarpScale: 0.39, largeGrainStretch: 0.12, smallWarpStrength: 0.061,
364
+ smallWarpScale: 1.9, fineWarpStrength: 0.006, fineWarpScale: 4.8, ringThickness: 1/25,
365
+ ringBias: 0.01, ringSizeVariance: 0.07, ringVarianceScale: 6.7, barkThickness: 0.1,
366
+ splotchScale: 0.61, splotchIntensity: 2.54, cellScale: 630, cellSize: 0.19,
367
+ darkGrainColor: '#9a5b49', lightGrainColor: '#ae745e'
368
+ },
369
+ mahogany: {
370
+ transformationMatrix: new THREE.Matrix4().identity(),
371
+ centerSize: 1.25, largeWarpScale: 0.26, largeGrainStretch: 0.29, smallWarpStrength: 0.044,
372
+ smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/38,
373
+ ringBias: 0.01, ringSizeVariance: 0.33, ringVarianceScale: 1.2, barkThickness: 0.07,
374
+ splotchScale: 0.77, splotchIntensity: 1.39, cellScale: 1400, cellSize: 0.23,
375
+ darkGrainColor: '#501d12', lightGrainColor: '#6d3722'
376
+ }
377
+ };
378
+
379
+ export const WoodGenuses = [ 'teak', 'walnut', 'white_oak', 'pine', 'poplar', 'maple', 'red_oak', 'cherry', 'cedar', 'mahogany' ];
380
+ export const Finishes = [ 'raw', 'matte', 'semigloss', 'gloss' ];
381
+
382
+ export function GetWoodPreset( genus, finish ) {
383
+
384
+ const params = woodParams[ genus ];
385
+
386
+ let clearcoat, clearcoatRoughness, clearcoatDarken;
387
+
388
+ switch ( finish ) {
389
+
390
+ case 'gloss':
391
+ clearcoatDarken = 0.2; clearcoatRoughness = 0.1; clearcoat = 1;
392
+ break;
393
+
394
+ case 'semigloss':
395
+ clearcoatDarken = 0.4; clearcoatRoughness = 0.4; clearcoat = 1;
396
+ break;
397
+
398
+ case 'matte':
399
+ clearcoatDarken = 0.6; clearcoatRoughness = 1; clearcoat = 1;
400
+ break;
401
+
402
+ case 'raw':
403
+ default:
404
+ clearcoatDarken = 1; clearcoatRoughness = 0; clearcoat = 0;
405
+
406
+ }
407
+
408
+ return { ...params, transformationMatrix: new THREE.Matrix4().copy( params.transformationMatrix ), genus, finish, clearcoat, clearcoatRoughness, clearcoatDarken };
409
+
410
+ }
411
+
412
+ const params = GetWoodPreset( WoodGenuses[ 0 ], Finishes[ 0 ] );
413
+ const uniforms = {};
414
+
415
+ uniforms.centerSize = TSL.uniform( params.centerSize ).onObjectUpdate( ( { material } ) => material.centerSize );
416
+ uniforms.largeWarpScale = TSL.uniform( params.largeWarpScale ).onObjectUpdate( ( { material } ) => material.largeWarpScale );
417
+ uniforms.largeGrainStretch = TSL.uniform( params.largeGrainStretch ).onObjectUpdate( ( { material } ) => material.largeGrainStretch );
418
+ uniforms.smallWarpStrength = TSL.uniform( params.smallWarpStrength ).onObjectUpdate( ( { material } ) => material.smallWarpStrength );
419
+ uniforms.smallWarpScale = TSL.uniform( params.smallWarpScale ).onObjectUpdate( ( { material } ) => material.smallWarpScale );
420
+ uniforms.fineWarpStrength = TSL.uniform( params.fineWarpStrength ).onObjectUpdate( ( { material } ) => material.fineWarpStrength );
421
+ uniforms.fineWarpScale = TSL.uniform( params.fineWarpScale ).onObjectUpdate( ( { material } ) => material.fineWarpScale );
422
+ uniforms.ringThickness = TSL.uniform( params.ringThickness ).onObjectUpdate( ( { material } ) => material.ringThickness );
423
+ uniforms.ringBias = TSL.uniform( params.ringBias ).onObjectUpdate( ( { material } ) => material.ringBias );
424
+ uniforms.ringSizeVariance = TSL.uniform( params.ringSizeVariance ).onObjectUpdate( ( { material } ) => material.ringSizeVariance );
425
+ uniforms.ringVarianceScale = TSL.uniform( params.ringVarianceScale ).onObjectUpdate( ( { material } ) => material.ringVarianceScale );
426
+ uniforms.barkThickness = TSL.uniform( params.barkThickness ).onObjectUpdate( ( { material } ) => material.barkThickness );
427
+ uniforms.splotchScale = TSL.uniform( params.splotchScale ).onObjectUpdate( ( { material } ) => material.splotchScale );
428
+ uniforms.splotchIntensity = TSL.uniform( params.splotchIntensity ).onObjectUpdate( ( { material } ) => material.splotchIntensity );
429
+ uniforms.cellScale = TSL.uniform( params.cellScale ).onObjectUpdate( ( { material } ) => material.cellScale );
430
+ uniforms.cellSize = TSL.uniform( params.cellSize ).onObjectUpdate( ( { material } ) => material.cellSize );
431
+ uniforms.darkGrainColor = TSL.uniform( new THREE.Color( params.darkGrainColor ) ).onObjectUpdate( ( { material }, self ) => self.value.set( material.darkGrainColor ) );
432
+ uniforms.lightGrainColor = TSL.uniform( new THREE.Color( params.lightGrainColor ) ).onObjectUpdate( ( { material }, self ) => self.value.set( material.lightGrainColor ) );
433
+ uniforms.transformationMatrix = TSL.uniform( new THREE.Matrix4().copy( params.transformationMatrix ) ).onObjectUpdate( ( { material } ) => material.transformationMatrix );
434
+
435
+ const colorNode = wood(
436
+ uniforms.transformationMatrix.mul( TSL.vec4(TSL.positionLocal, 1) ).xyz,
437
+ uniforms.centerSize,
438
+ uniforms.largeWarpScale,
439
+ uniforms.largeGrainStretch,
440
+ uniforms.smallWarpStrength,
441
+ uniforms.smallWarpScale,
442
+ uniforms.fineWarpStrength,
443
+ uniforms.fineWarpScale,
444
+ uniforms.ringThickness,
445
+ uniforms.ringBias,
446
+ uniforms.ringSizeVariance,
447
+ uniforms.ringVarianceScale,
448
+ uniforms.barkThickness,
449
+ uniforms.splotchScale,
450
+ uniforms.splotchIntensity,
451
+ uniforms.cellScale,
452
+ uniforms.cellSize,
453
+ uniforms.darkGrainColor,
454
+ uniforms.lightGrainColor
455
+ ).mul( params.clearcoatDarken );
456
+
457
+ /**
458
+ * Procedural wood material using TSL (Three.js Shading Language).
459
+ *
460
+ * Usage examples:
461
+ *
462
+ * // Using presets (recommended for common wood types)
463
+ * const material = WoodNodeMaterial.fromPreset('walnut', 'gloss');
464
+ *
465
+ * // Using custom parameters (for advanced customization)
466
+ * const material = new WoodNodeMaterial({
467
+ * centerSize: 1.2,
468
+ * ringThickness: 1/40,
469
+ * darkGrainColor: new THREE.Color('#2a1a0a'),
470
+ * lightGrainColor: new THREE.Color('#8b4513'),
471
+ * clearcoat: 1,
472
+ * clearcoatRoughness: 0.3
473
+ * });
474
+ *
475
+ * // Mixing presets with custom overrides
476
+ * const walnutParams = GetWoodPreset('walnut', 'raw');
477
+ * const material = new WoodNodeMaterial({
478
+ * ...walnutParams,
479
+ * ringThickness: 1/50, // Override specific parameter
480
+ * clearcoat: 1 // Add finish
481
+ * });
482
+ */
483
+ export class WoodNodeMaterial extends THREE.MeshPhysicalMaterial {
484
+
485
+ static get type() {
486
+
487
+ return 'WoodNodeMaterial';
488
+
489
+ }
490
+
491
+ constructor( params = {} ) {
492
+
493
+ super();
494
+
495
+ this.isWoodNodeMaterial = true;
496
+
497
+ // Get default parameters from teak/raw preset
498
+ const defaultParams = GetWoodPreset( 'teak', 'raw' );
499
+
500
+ // Merge default params with provided params
501
+ const finalParams = { ...defaultParams, ...params };
502
+
503
+ for ( const key in finalParams ) {
504
+
505
+ if ( key === 'genus' || key === 'finish' ) continue;
506
+
507
+ if ( typeof finalParams[ key ] === 'string' ) {
508
+
509
+ this[ key ] = new THREE.Color( finalParams[ key ] );
510
+
511
+ } else {
512
+
513
+ this[ key ] = finalParams[ key ];
514
+
515
+ }
516
+
517
+ }
518
+
519
+ this.colorNode = colorNode;
520
+ this.clearcoatNode = finalParams.clearcoat;
521
+ this.clearcoatRoughness = finalParams.clearcoatRoughness;
522
+
523
+ }
524
+
525
+ // Static method to create material from preset
526
+ static fromPreset( genus = 'teak', finish = 'raw' ) {
527
+
528
+ const params = GetWoodPreset( genus, finish );
529
+ return new WoodNodeMaterial( params );
530
+
531
+ }
532
+
533
+ }
@@ -1,4 +1,4 @@
1
- import { LinearTransfer, Matrix3, SRGBTransfer } from 'three';
1
+ import { LinearTransfer, Matrix3, SRGBTransfer, SRGBColorSpace, ColorManagement } from 'three';
2
2
 
3
3
  /** @module ColorSpaces */
4
4
 
@@ -114,6 +114,24 @@ export const LinearRec2020ColorSpaceImpl = {
114
114
  luminanceCoefficients: REC2020_LUMINANCE_COEFFICIENTS,
115
115
  };
116
116
 
117
+ /**
118
+ * Extended-sRGB color space.
119
+ *
120
+ * @type {string}
121
+ * @constant
122
+ */
123
+ export const ExtendedSRGBColorSpace = 'extended-srgb';
124
+
125
+ /**
126
+ * Implementation object for the Extended-sRGB color space.
127
+ *
128
+ * @type {module:ColorSpaces~ColorSpaceImpl}
129
+ * @constant
130
+ */
131
+ export const ExtendedSRGBColorSpaceImpl = {
132
+ ...ColorManagement.spaces[ SRGBColorSpace ],
133
+ outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace, toneMappingMode: 'extended' }
134
+ };
117
135
 
118
136
  /**
119
137
  * An object holding the color space implementation.
@@ -152,7 +152,7 @@ class ConvexHull {
152
152
  *
153
153
  * @param {Ray} ray - The ray to test.
154
154
  * @param {Vector3} target - The target vector that is used to store the method's result.
155
- * @return {Vector3|null} The intersection point. Returns `null` if not intersection was detected.
155
+ * @return {?Vector3} The intersection point. Returns `null` if not intersection was detected.
156
156
  */
157
157
  intersectRay( ray, target ) {
158
158
 
@@ -1298,7 +1298,7 @@ class HalfEdge {
1298
1298
  * Returns the origin vertex.
1299
1299
  *
1300
1300
  * @private
1301
- * @return {VertexNode} The destination vertex.
1301
+ * @return {?VertexNode} The destination vertex.
1302
1302
  */
1303
1303
  tail() {
1304
1304
 
@@ -45,7 +45,7 @@ class Lut {
45
45
  /**
46
46
  * The currently selected color map.
47
47
  *
48
- * @type {Array}
48
+ * @type {Array<Array<number>>}
49
49
  */
50
50
  this.map = [];
51
51
 
@@ -219,7 +219,7 @@ class Lut {
219
219
  * Adds a color map to this Lut instance.
220
220
  *
221
221
  * @param {string} name - The name of the color map.
222
- * @param {Array} arrayOfColors - An array of color values. Each value is an array
222
+ * @param {Array<Array<number>>} arrayOfColors - An array of color values. Each value is an array
223
223
  * holding a threshold and the actual color value as a hexadecimal number.
224
224
  * @return {Lut} A reference to this LUT.
225
225
  */
@@ -121,7 +121,7 @@ class MD2CharacterComplex {
121
121
  /**
122
122
  * The movement controls.
123
123
  *
124
- * @type {Object}
124
+ * @type {?Object}
125
125
  * @default null
126
126
  */
127
127
  this.controls = null;
@@ -280,7 +280,7 @@ class ProgressiveLightMap {
280
280
  *
281
281
  * @private
282
282
  * @param {number} res - The square resolution of this object's lightMap.
283
- * @param {WebGLRenderTarget} [lightMap] - The lightmap to initialize the plane with.
283
+ * @param {?WebGLRenderTarget} [lightMap] - The lightmap to initialize the plane with.
284
284
  */
285
285
  _initializeBlurPlane( res, lightMap = null ) {
286
286
 
@@ -234,7 +234,7 @@ class Volume {
234
234
  /**
235
235
  * The list of all the slices associated to this volume
236
236
  *
237
- * @type {Array}
237
+ * @type {Array<VolumeSlice>}
238
238
  */
239
239
  this.sliceList = [];
240
240
 
@@ -110,7 +110,7 @@ class LensflareMesh extends Mesh {
110
110
  material1a.type = 'Lensflare-1a';
111
111
 
112
112
  material1a.vertexNode = vertexNode;
113
- material1a.fragmentNode = vec4( 1.0, 0.0, 1.0, 1.0 );
113
+ material1a.colorNode = vec4( 1.0, 0.0, 1.0, 1.0 );
114
114
 
115
115
  const material1b = new NodeMaterial();
116
116
 
@@ -121,7 +121,7 @@ class LensflareMesh extends Mesh {
121
121
  material1b.type = 'Lensflare-1b';
122
122
 
123
123
  material1b.vertexNode = vertexNode;
124
- material1b.fragmentNode = texture( tempMap, vec2( uv().flipY() ) );
124
+ material1b.colorNode = texture( tempMap, vec2( uv().flipY() ) );
125
125
 
126
126
  // the following object is used for occlusionMap generation
127
127
 
@@ -174,7 +174,7 @@ class LensflareMesh extends Mesh {
174
174
 
175
175
  } )();
176
176
 
177
- material2.fragmentNode = Fn( () => {
177
+ material2.colorNode = Fn( () => {
178
178
 
179
179
  const color = reference( 'color', 'color' );
180
180
  const map = reference( 'map', 'texture' );
@@ -165,7 +165,7 @@ class SkyMesh extends Mesh {
165
165
 
166
166
  } )();
167
167
 
168
- const fragmentNode = /*@__PURE__*/ Fn( () => {
168
+ const colorNode = /*@__PURE__*/ Fn( () => {
169
169
 
170
170
  // constants for atmospheric scattering
171
171
  const pi = float( 3.141592653589793238462643383279502884197169 );
@@ -234,7 +234,7 @@ class SkyMesh extends Mesh {
234
234
  material.depthWrite = false;
235
235
 
236
236
  material.vertexNode = vertexNode;
237
- material.fragmentNode = fragmentNode;
237
+ material.colorNode = colorNode;
238
238
 
239
239
  }
240
240