super-three 0.158.0 → 0.160.1

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 (191) hide show
  1. package/build/three.cjs +1720 -380
  2. package/build/three.js +1720 -380
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +1719 -381
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/Addons.js +2 -1
  7. package/examples/jsm/controls/OrbitControls.js +50 -40
  8. package/examples/jsm/csm/CSMShader.js +52 -47
  9. package/examples/jsm/exporters/GLTFExporter.js +79 -1
  10. package/examples/jsm/exporters/USDZExporter.js +27 -19
  11. package/examples/jsm/helpers/TextureHelper.js +237 -0
  12. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  13. package/examples/jsm/lines/LineMaterial.js +16 -33
  14. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  15. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  16. package/examples/jsm/loaders/FBXLoader.js +294 -124
  17. package/examples/jsm/loaders/GLTFLoader.js +71 -3
  18. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  19. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  20. package/examples/jsm/loaders/SVGLoader.js +4 -4
  21. package/examples/jsm/loaders/USDZLoader.js +3 -17
  22. package/examples/jsm/math/Octree.js +15 -4
  23. package/examples/jsm/misc/Timer.js +119 -0
  24. package/examples/jsm/misc/TubePainter.js +3 -6
  25. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  26. package/examples/jsm/nodes/Nodes.js +11 -7
  27. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  28. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  29. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  30. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  31. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  32. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  33. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  34. package/examples/jsm/nodes/accessors/TextureNode.js +122 -36
  35. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  36. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  37. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  38. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  39. package/examples/jsm/nodes/core/Node.js +6 -3
  40. package/examples/jsm/nodes/core/NodeBuilder.js +84 -27
  41. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  42. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  43. package/examples/jsm/nodes/core/NodeUtils.js +3 -7
  44. package/examples/jsm/nodes/core/OutputStructNode.js +3 -3
  45. package/examples/jsm/nodes/core/PropertyNode.js +17 -2
  46. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  47. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  48. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  49. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  50. package/examples/jsm/nodes/core/VarNode.js +2 -0
  51. package/examples/jsm/nodes/core/VaryingNode.js +1 -7
  52. package/examples/jsm/nodes/display/BumpMapNode.js +1 -1
  53. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  54. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  55. package/examples/jsm/nodes/display/PassNode.js +182 -0
  56. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  57. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  58. package/examples/jsm/nodes/display/ViewportNode.js +5 -8
  59. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +52 -17
  61. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -12
  62. package/examples/jsm/nodes/lighting/LightsNode.js +34 -32
  63. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +1 -1
  64. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +12 -12
  65. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  66. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +1 -1
  67. package/examples/jsm/nodes/materials/NodeMaterial.js +66 -41
  68. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  69. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  70. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  71. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  72. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  73. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  74. package/examples/jsm/nodes/math/MathNode.js +2 -0
  75. package/examples/jsm/nodes/math/OperatorNode.js +19 -6
  76. package/examples/jsm/nodes/shadernode/ShaderNode.js +32 -3
  77. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  78. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  79. package/examples/jsm/nodes/utils/SplitNode.js +8 -2
  80. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  81. package/examples/jsm/objects/QuadMesh.js +60 -0
  82. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  83. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  84. package/examples/jsm/renderers/common/Animation.js +10 -21
  85. package/examples/jsm/renderers/common/Backend.js +19 -3
  86. package/examples/jsm/renderers/common/Background.js +20 -22
  87. package/examples/jsm/renderers/common/Bindings.js +30 -21
  88. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  89. package/examples/jsm/renderers/common/Color4.js +37 -0
  90. package/examples/jsm/renderers/common/Geometries.js +4 -4
  91. package/examples/jsm/renderers/common/Info.js +12 -2
  92. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  93. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  94. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  95. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  96. package/examples/jsm/renderers/common/RenderObject.js +13 -1
  97. package/examples/jsm/renderers/common/RenderObjects.js +4 -2
  98. package/examples/jsm/renderers/common/Renderer.js +137 -37
  99. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  100. package/examples/jsm/renderers/common/Textures.js +4 -1
  101. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  102. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  103. package/examples/jsm/renderers/common/nodes/Nodes.js +74 -7
  104. package/examples/jsm/renderers/webgl/WebGLBackend.js +91 -33
  105. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +100 -31
  106. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +57 -5
  107. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  108. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  109. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  110. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  111. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  112. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  113. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +186 -137
  115. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  116. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +209 -90
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  119. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  120. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  121. package/examples/jsm/shaders/FXAAShader.js +133 -133
  122. package/examples/jsm/shaders/GTAOShader.js +424 -0
  123. package/examples/jsm/shaders/OutputShader.js +4 -0
  124. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  125. package/examples/jsm/shaders/SAOShader.js +2 -3
  126. package/examples/jsm/shaders/SSAOShader.js +2 -3
  127. package/examples/jsm/transpiler/AST.js +40 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +50 -8
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +4 -4
  130. package/examples/jsm/transpiler/TSLEncoder.js +124 -20
  131. package/examples/jsm/utils/SortUtils.js +158 -0
  132. package/examples/jsm/utils/TextureUtils.js +33 -21
  133. package/examples/jsm/webxr/ARButton.js +14 -0
  134. package/examples/jsm/webxr/VRButton.js +23 -8
  135. package/examples/jsm/webxr/XRButton.js +25 -11
  136. package/package.json +5 -6
  137. package/src/Three.js +1 -0
  138. package/src/constants.js +2 -1
  139. package/src/core/BufferAttribute.js +21 -2
  140. package/src/core/InterleavedBuffer.js +21 -1
  141. package/src/core/Object3D.js +60 -12
  142. package/src/core/UniformsGroup.js +7 -1
  143. package/src/extras/curves/LineCurve3.js +4 -0
  144. package/src/loaders/AudioLoader.js +1 -1
  145. package/src/loaders/BufferGeometryLoader.js +0 -7
  146. package/src/loaders/ImageBitmapLoader.js +25 -1
  147. package/src/loaders/ObjectLoader.js +49 -0
  148. package/src/materials/ShaderMaterial.js +2 -1
  149. package/src/math/ColorManagement.js +0 -16
  150. package/src/math/Quaternion.js +5 -4
  151. package/src/math/Sphere.js +2 -0
  152. package/src/math/Triangle.js +17 -5
  153. package/src/objects/BatchedMesh.js +1020 -0
  154. package/src/objects/Skeleton.js +1 -3
  155. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  156. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  157. package/src/renderers/WebGLRenderer.js +24 -19
  158. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  159. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  160. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  161. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  162. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  163. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  164. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  165. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  166. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  167. package/src/renderers/shaders/ShaderChunk.js +4 -0
  168. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  169. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  170. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  171. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  172. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  173. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  174. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  175. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -0
  176. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  177. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  178. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  179. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  180. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  181. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  182. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  183. package/src/renderers/webgl/WebGLLights.js +11 -2
  184. package/src/renderers/webgl/WebGLProgram.js +20 -1
  185. package/src/renderers/webgl/WebGLPrograms.js +5 -0
  186. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  187. package/src/renderers/webgl/WebGLTextures.js +7 -11
  188. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  189. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  190. package/src/renderers/webxr/WebXRManager.js +16 -0
  191. package/examples/jsm/objects/BatchedMesh.js +0 -586
@@ -151,6 +151,12 @@ class GLTFLoader extends Loader {
151
151
 
152
152
  } );
153
153
 
154
+ this.register( function ( parser ) {
155
+
156
+ return new GLTFMaterialsBumpExtension( parser );
157
+
158
+ } );
159
+
154
160
  this.register( function ( parser ) {
155
161
 
156
162
  return new GLTFLightsExtension( parser );
@@ -183,7 +189,13 @@ class GLTFLoader extends Loader {
183
189
 
184
190
  } else if ( this.path !== '' ) {
185
191
 
186
- resourcePath = this.path;
192
+ // If a base path is set, resources will be relative paths from that plus the relative path of the gltf file
193
+ // Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'
194
+ // resourcePath = 'https://my-cnd-server.com/assets/models/'
195
+ // referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'
196
+ // referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'
197
+ const relativeUrl = LoaderUtils.extractUrlBase( url );
198
+ resourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );
187
199
 
188
200
  } else {
189
201
 
@@ -491,6 +503,7 @@ const EXTENSIONS = {
491
503
  KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',
492
504
  KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',
493
505
  KHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',
506
+ EXT_MATERIALS_BUMP: 'EXT_materials_bump',
494
507
  EXT_TEXTURE_WEBP: 'EXT_texture_webp',
495
508
  EXT_TEXTURE_AVIF: 'EXT_texture_avif',
496
509
  EXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',
@@ -1201,6 +1214,61 @@ class GLTFMaterialsSpecularExtension {
1201
1214
 
1202
1215
  }
1203
1216
 
1217
+
1218
+ /**
1219
+ * Materials bump Extension
1220
+ *
1221
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump
1222
+ */
1223
+ class GLTFMaterialsBumpExtension {
1224
+
1225
+ constructor( parser ) {
1226
+
1227
+ this.parser = parser;
1228
+ this.name = EXTENSIONS.EXT_MATERIALS_BUMP;
1229
+
1230
+ }
1231
+
1232
+ getMaterialType( materialIndex ) {
1233
+
1234
+ const parser = this.parser;
1235
+ const materialDef = parser.json.materials[ materialIndex ];
1236
+
1237
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
1238
+
1239
+ return MeshPhysicalMaterial;
1240
+
1241
+ }
1242
+
1243
+ extendMaterialParams( materialIndex, materialParams ) {
1244
+
1245
+ const parser = this.parser;
1246
+ const materialDef = parser.json.materials[ materialIndex ];
1247
+
1248
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
1249
+
1250
+ return Promise.resolve();
1251
+
1252
+ }
1253
+
1254
+ const pending = [];
1255
+
1256
+ const extension = materialDef.extensions[ this.name ];
1257
+
1258
+ materialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;
1259
+
1260
+ if ( extension.bumpTexture !== undefined ) {
1261
+
1262
+ pending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );
1263
+
1264
+ }
1265
+
1266
+ return Promise.all( pending );
1267
+
1268
+ }
1269
+
1270
+ }
1271
+
1204
1272
  /**
1205
1273
  * Materials anisotropy Extension
1206
1274
  *
@@ -1855,7 +1923,7 @@ class GLTFDracoMeshCompressionExtension {
1855
1923
 
1856
1924
  return parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {
1857
1925
 
1858
- return new Promise( function ( resolve ) {
1926
+ return new Promise( function ( resolve, reject ) {
1859
1927
 
1860
1928
  dracoLoader.decodeDracoFile( bufferView, function ( geometry ) {
1861
1929
 
@@ -1870,7 +1938,7 @@ class GLTFDracoMeshCompressionExtension {
1870
1938
 
1871
1939
  resolve( geometry );
1872
1940
 
1873
- }, threeAttributeMap, attributeTypeMap );
1941
+ }, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );
1874
1942
 
1875
1943
  } );
1876
1944
 
@@ -19,13 +19,13 @@ import {
19
19
  mx_safepower, mx_contrast,
20
20
  mx_srgb_texture_to_lin_rec709,
21
21
  saturation
22
- } from 'three/nodes';
22
+ } from '../nodes/Nodes.js';
23
23
 
24
24
  const colorSpaceLib = {
25
25
  mx_srgb_texture_to_lin_rec709
26
26
  };
27
27
 
28
- class MtlXElement {
28
+ class MXElement {
29
29
 
30
30
  constructor( name, nodeFunc, params = null ) {
31
31
 
@@ -39,41 +39,41 @@ class MtlXElement {
39
39
 
40
40
  // Ref: https://github.com/mrdoob/three.js/issues/24674
41
41
 
42
- const MtlXElements = [
42
+ const MXElements = [
43
43
 
44
44
  // << Math >>
45
- new MtlXElement( 'add', add, [ 'in1', 'in2' ] ),
46
- new MtlXElement( 'subtract', sub, [ 'in1', 'in2' ] ),
47
- new MtlXElement( 'multiply', mul, [ 'in1', 'in2' ] ),
48
- new MtlXElement( 'divide', div, [ 'in1', 'in2' ] ),
49
- new MtlXElement( 'modulo', mod, [ 'in1', 'in2' ] ),
50
- new MtlXElement( 'absval', abs, [ 'in1', 'in2' ] ),
51
- new MtlXElement( 'sign', sign, [ 'in1', 'in2' ] ),
52
- new MtlXElement( 'floor', floor, [ 'in1', 'in2' ] ),
53
- new MtlXElement( 'ceil', ceil, [ 'in1', 'in2' ] ),
54
- new MtlXElement( 'round', round, [ 'in1', 'in2' ] ),
55
- new MtlXElement( 'power', pow, [ 'in1', 'in2' ] ),
56
- new MtlXElement( 'sin', sin, [ 'in' ] ),
57
- new MtlXElement( 'cos', cos, [ 'in' ] ),
58
- new MtlXElement( 'tan', tan, [ 'in' ] ),
59
- new MtlXElement( 'asin', asin, [ 'in' ] ),
60
- new MtlXElement( 'acos', acos, [ 'in' ] ),
61
- new MtlXElement( 'atan2', atan2, [ 'in1', 'in2' ] ),
62
- new MtlXElement( 'sqrt', sqrt, [ 'in' ] ),
45
+ new MXElement( 'add', add, [ 'in1', 'in2' ] ),
46
+ new MXElement( 'subtract', sub, [ 'in1', 'in2' ] ),
47
+ new MXElement( 'multiply', mul, [ 'in1', 'in2' ] ),
48
+ new MXElement( 'divide', div, [ 'in1', 'in2' ] ),
49
+ new MXElement( 'modulo', mod, [ 'in1', 'in2' ] ),
50
+ new MXElement( 'absval', abs, [ 'in1', 'in2' ] ),
51
+ new MXElement( 'sign', sign, [ 'in1', 'in2' ] ),
52
+ new MXElement( 'floor', floor, [ 'in1', 'in2' ] ),
53
+ new MXElement( 'ceil', ceil, [ 'in1', 'in2' ] ),
54
+ new MXElement( 'round', round, [ 'in1', 'in2' ] ),
55
+ new MXElement( 'power', pow, [ 'in1', 'in2' ] ),
56
+ new MXElement( 'sin', sin, [ 'in' ] ),
57
+ new MXElement( 'cos', cos, [ 'in' ] ),
58
+ new MXElement( 'tan', tan, [ 'in' ] ),
59
+ new MXElement( 'asin', asin, [ 'in' ] ),
60
+ new MXElement( 'acos', acos, [ 'in' ] ),
61
+ new MXElement( 'atan2', atan2, [ 'in1', 'in2' ] ),
62
+ new MXElement( 'sqrt', sqrt, [ 'in' ] ),
63
63
  //new MtlXElement( 'ln', ... ),
64
- new MtlXElement( 'exp', exp, [ 'in' ] ),
65
- new MtlXElement( 'clamp', clamp, [ 'in', 'low', 'high' ] ),
66
- new MtlXElement( 'min', min, [ 'in1', 'in2' ] ),
67
- new MtlXElement( 'max', max, [ 'in1', 'in2' ] ),
68
- new MtlXElement( 'normalize', normalize, [ 'in' ] ),
69
- new MtlXElement( 'magnitude', length, [ 'in1', 'in2' ] ),
70
- new MtlXElement( 'dotproduct', dot, [ 'in1', 'in2' ] ),
71
- new MtlXElement( 'crossproduct', cross, [ 'in' ] ),
64
+ new MXElement( 'exp', exp, [ 'in' ] ),
65
+ new MXElement( 'clamp', clamp, [ 'in', 'low', 'high' ] ),
66
+ new MXElement( 'min', min, [ 'in1', 'in2' ] ),
67
+ new MXElement( 'max', max, [ 'in1', 'in2' ] ),
68
+ new MXElement( 'normalize', normalize, [ 'in' ] ),
69
+ new MXElement( 'magnitude', length, [ 'in1', 'in2' ] ),
70
+ new MXElement( 'dotproduct', dot, [ 'in1', 'in2' ] ),
71
+ new MXElement( 'crossproduct', cross, [ 'in' ] ),
72
72
  //new MtlXElement( 'transformpoint', ... ),
73
73
  //new MtlXElement( 'transformvector', ... ),
74
74
  //new MtlXElement( 'transformnormal', ... ),
75
75
  //new MtlXElement( 'transformmatrix', ... ),
76
- new MtlXElement( 'normalmap', normalMap, [ 'in', 'scale' ] ),
76
+ new MXElement( 'normalmap', normalMap, [ 'in', 'scale' ] ),
77
77
  //new MtlXElement( 'transpose', ... ),
78
78
  //new MtlXElement( 'determinant', ... ),
79
79
  //new MtlXElement( 'invertmatrix', ... ),
@@ -83,44 +83,44 @@ const MtlXElements = [
83
83
  //new MtlXElement( 'dot', ... ),
84
84
 
85
85
  // << Adjustment >>
86
- new MtlXElement( 'remap', remap, [ 'in', 'inlow', 'inhigh', 'outlow', 'outhigh' ] ),
87
- new MtlXElement( 'smoothstep', smoothstep, [ 'in', 'low', 'high' ] ),
86
+ new MXElement( 'remap', remap, [ 'in', 'inlow', 'inhigh', 'outlow', 'outhigh' ] ),
87
+ new MXElement( 'smoothstep', smoothstep, [ 'in', 'low', 'high' ] ),
88
88
  //new MtlXElement( 'curveadjust', ... ),
89
89
  //new MtlXElement( 'curvelookup', ... ),
90
- new MtlXElement( 'luminance', luminance, [ 'in', 'lumacoeffs' ] ),
91
- new MtlXElement( 'rgbtohsv', mx_rgbtohsv, [ 'in' ] ),
92
- new MtlXElement( 'hsvtorgb', mx_hsvtorgb, [ 'in' ] ),
90
+ new MXElement( 'luminance', luminance, [ 'in', 'lumacoeffs' ] ),
91
+ new MXElement( 'rgbtohsv', mx_rgbtohsv, [ 'in' ] ),
92
+ new MXElement( 'hsvtorgb', mx_hsvtorgb, [ 'in' ] ),
93
93
 
94
94
  // << Mix >>
95
- new MtlXElement( 'mix', mix, [ 'bg', 'fg', 'mix' ] ),
95
+ new MXElement( 'mix', mix, [ 'bg', 'fg', 'mix' ] ),
96
96
 
97
97
  // << Channel >>
98
- new MtlXElement( 'combine2', vec2, [ 'in1', 'in2' ] ),
99
- new MtlXElement( 'combine3', vec3, [ 'in1', 'in2', 'in3' ] ),
100
- new MtlXElement( 'combine4', vec4, [ 'in1', 'in2', 'in3', 'in4' ] ),
98
+ new MXElement( 'combine2', vec2, [ 'in1', 'in2' ] ),
99
+ new MXElement( 'combine3', vec3, [ 'in1', 'in2', 'in3' ] ),
100
+ new MXElement( 'combine4', vec4, [ 'in1', 'in2', 'in3', 'in4' ] ),
101
101
 
102
102
  // << Procedural >>
103
- new MtlXElement( 'ramplr', mx_ramplr, [ 'valuel', 'valuer', 'texcoord' ] ),
104
- new MtlXElement( 'ramptb', mx_ramptb, [ 'valuet', 'valueb', 'texcoord' ] ),
105
- new MtlXElement( 'splitlr', mx_splitlr, [ 'valuel', 'valuer', 'texcoord' ] ),
106
- new MtlXElement( 'splittb', mx_splittb, [ 'valuet', 'valueb', 'texcoord' ] ),
107
- new MtlXElement( 'noise2d', mx_noise_float, [ 'texcoord', 'amplitude', 'pivot' ] ),
108
- new MtlXElement( 'noise3d', mx_noise_float, [ 'texcoord', 'amplitude', 'pivot' ] ),
109
- new MtlXElement( 'fractal3d', mx_fractal_noise_float, [ 'position', 'octaves', 'lacunarity', 'diminish', 'amplitude' ] ),
110
- new MtlXElement( 'cellnoise2d', mx_cell_noise_float, [ 'texcoord' ] ),
111
- new MtlXElement( 'cellnoise3d', mx_cell_noise_float, [ 'texcoord' ] ),
112
- new MtlXElement( 'worleynoise2d', mx_worley_noise_float, [ 'texcoord', 'jitter' ] ),
113
- new MtlXElement( 'worleynoise3d', mx_worley_noise_float, [ 'texcoord', 'jitter' ] ),
103
+ new MXElement( 'ramplr', mx_ramplr, [ 'valuel', 'valuer', 'texcoord' ] ),
104
+ new MXElement( 'ramptb', mx_ramptb, [ 'valuet', 'valueb', 'texcoord' ] ),
105
+ new MXElement( 'splitlr', mx_splitlr, [ 'valuel', 'valuer', 'texcoord' ] ),
106
+ new MXElement( 'splittb', mx_splittb, [ 'valuet', 'valueb', 'texcoord' ] ),
107
+ new MXElement( 'noise2d', mx_noise_float, [ 'texcoord', 'amplitude', 'pivot' ] ),
108
+ new MXElement( 'noise3d', mx_noise_float, [ 'texcoord', 'amplitude', 'pivot' ] ),
109
+ new MXElement( 'fractal3d', mx_fractal_noise_float, [ 'position', 'octaves', 'lacunarity', 'diminish', 'amplitude' ] ),
110
+ new MXElement( 'cellnoise2d', mx_cell_noise_float, [ 'texcoord' ] ),
111
+ new MXElement( 'cellnoise3d', mx_cell_noise_float, [ 'texcoord' ] ),
112
+ new MXElement( 'worleynoise2d', mx_worley_noise_float, [ 'texcoord', 'jitter' ] ),
113
+ new MXElement( 'worleynoise3d', mx_worley_noise_float, [ 'texcoord', 'jitter' ] ),
114
114
 
115
115
  // << Supplemental >>
116
116
  //new MtlXElement( 'tiledimage', ... ),
117
117
  //new MtlXElement( 'triplanarprojection', triplanarTextures, [ 'filex', 'filey', 'filez' ] ),
118
118
  //new MtlXElement( 'ramp4', ... ),
119
119
  //new MtlXElement( 'place2d', mx_place2d, [ 'texcoord', 'pivot', 'scale', 'rotate', 'offset' ] ),
120
- new MtlXElement( 'safepower', mx_safepower, [ 'in1', 'in2' ] ),
121
- new MtlXElement( 'contrast', mx_contrast, [ 'in', 'amount', 'pivot' ] ),
120
+ new MXElement( 'safepower', mx_safepower, [ 'in1', 'in2' ] ),
121
+ new MXElement( 'contrast', mx_contrast, [ 'in', 'amount', 'pivot' ] ),
122
122
  //new MtlXElement( 'hsvadjust', ... ),
123
- new MtlXElement( 'saturate', saturation, [ 'in', 'amount' ] ),
123
+ new MXElement( 'saturate', saturation, [ 'in', 'amount' ] ),
124
124
  //new MtlXElement( 'extract', ... ),
125
125
  //new MtlXElement( 'separate2', ... ),
126
126
  //new MtlXElement( 'separate3', ... ),
@@ -129,7 +129,7 @@ const MtlXElements = [
129
129
  ];
130
130
 
131
131
  const MtlXLibrary = {};
132
- MtlXElements.forEach( element => MtlXLibrary[ element.name ] = element );
132
+ MXElements.forEach( element => MtlXLibrary[ element.name ] = element );
133
133
 
134
134
  class MaterialXLoader extends Loader {
135
135
 
@@ -588,11 +588,30 @@ class MaterialXNode {
588
588
 
589
589
  //
590
590
 
591
+ let normalNode = null;
592
+
593
+ if ( inputs.normal ) normalNode = inputs.normal;
594
+
595
+ //
596
+
597
+ let emissiveNode = null;
598
+
599
+ if ( inputs.emission ) emissiveNode = inputs.emission;
600
+ if ( inputs.emissionColor ) {
601
+
602
+ emissiveNode = emissiveNode ? mul( emissiveNode, inputs.emissionColor ) : emissiveNode;
603
+
604
+ }
605
+
606
+ //
607
+
591
608
  material.colorNode = colorNode || color( 0.8, 0.8, 0.8 );
592
609
  material.roughnessNode = roughnessNode || float( 0.2 );
593
610
  material.metalnessNode = metalnessNode || float( 0 );
594
611
  material.clearcoatNode = clearcoatNode || float( 0 );
595
612
  material.clearcoatRoughnessNode = clearcoatRoughnessNode || float( 0 );
613
+ if ( normalNode ) material.normalNode = normalNode;
614
+ if ( emissiveNode ) material.emissiveNode = emissiveNode;
596
615
 
597
616
  }
598
617
 
@@ -76,12 +76,6 @@ class NRRDLoader extends Loader {
76
76
 
77
77
  function scan( type, chunks ) {
78
78
 
79
- if ( chunks === undefined || chunks === null ) {
80
-
81
- chunks = 1;
82
-
83
- }
84
-
85
79
  let _chunkSize = 1;
86
80
  let _array_type = Uint8Array;
87
81
 
@@ -138,13 +132,6 @@ class NRRDLoader extends Loader {
138
132
 
139
133
  }
140
134
 
141
- if ( chunks == 1 ) {
142
-
143
- // if only one chunk was requested, just return one value
144
- return _bytes[ 0 ];
145
-
146
- }
147
-
148
135
  // return the byte array
149
136
  return _bytes;
150
137
 
@@ -2968,8 +2968,8 @@ class SVGLoader extends Loader {
2968
2968
  // Bevel join triangle
2969
2969
 
2970
2970
  addVertex( currentPointR, u, 1 );
2971
- addVertex( nextPointR, u, 0 );
2972
- addVertex( innerPoint, u, 0.5 );
2971
+ addVertex( innerPoint, u, 0 );
2972
+ addVertex( nextPointR, u, 1 );
2973
2973
 
2974
2974
  }
2975
2975
 
@@ -3106,8 +3106,8 @@ class SVGLoader extends Loader {
3106
3106
 
3107
3107
  } else {
3108
3108
 
3109
- tempV2_3.toArray( vertices, vl - 2 * 3 );
3110
- tempV2_4.toArray( vertices, vl - 1 * 3 );
3109
+ tempV2_4.toArray( vertices, vl - 2 * 3 );
3110
+ tempV2_3.toArray( vertices, vl - 1 * 3 );
3111
3111
  tempV2_4.toArray( vertices, vl - 4 * 3 );
3112
3112
 
3113
3113
  }
@@ -25,9 +25,7 @@ class USDAParser {
25
25
  const data = {};
26
26
 
27
27
  const lines = text.split( '\n' );
28
- const length = lines.length;
29
28
 
30
- let current = 0;
31
29
  let string = null;
32
30
  let target = data;
33
31
 
@@ -35,9 +33,7 @@ class USDAParser {
35
33
 
36
34
  // debugger;
37
35
 
38
- function parseNextLine() {
39
-
40
- const line = lines[ current ];
36
+ for ( const line of lines ) {
41
37
 
42
38
  // console.log( line );
43
39
 
@@ -74,7 +70,7 @@ class USDAParser {
74
70
 
75
71
  stack.pop();
76
72
 
77
- if ( stack.length === 0 ) return;
73
+ if ( stack.length === 0 ) continue;
78
74
 
79
75
  target = stack[ stack.length - 1 ];
80
76
 
@@ -100,18 +96,8 @@ class USDAParser {
100
96
 
101
97
  }
102
98
 
103
- current ++;
104
-
105
- if ( current < length ) {
106
-
107
- parseNextLine();
108
-
109
- }
110
-
111
99
  }
112
100
 
113
- parseNextLine();
114
-
115
101
  return data;
116
102
 
117
103
  }
@@ -640,7 +626,7 @@ class USDZLoader extends Loader {
640
626
 
641
627
  }
642
628
 
643
- } else if ( 'float inputs:clearcoat' in surface ) {
629
+ } else if ( 'float inputs:clearcoat' in surface ) {
644
630
 
645
631
  material.clearcoat = parseFloat( surface[ 'float inputs:clearcoat' ] );
646
632
 
@@ -82,19 +82,18 @@ function lineToLineClosestPoints( line1, line2, target1 = null, target2 = null )
82
82
 
83
83
  class Octree {
84
84
 
85
-
86
85
  constructor( box ) {
87
86
 
88
- this.triangles = [];
89
87
  this.box = box;
88
+ this.bounds = new Box3();
89
+
90
90
  this.subTrees = [];
91
+ this.triangles = [];
91
92
 
92
93
  }
93
94
 
94
95
  addTriangle( triangle ) {
95
96
 
96
- if ( ! this.bounds ) this.bounds = new Box3();
97
-
98
97
  this.bounds.min.x = Math.min( this.bounds.min.x, triangle.a.x, triangle.b.x, triangle.c.x );
99
98
  this.bounds.min.y = Math.min( this.bounds.min.y, triangle.a.y, triangle.b.y, triangle.c.y );
100
99
  this.bounds.min.z = Math.min( this.bounds.min.z, triangle.a.z, triangle.b.z, triangle.c.z );
@@ -524,6 +523,18 @@ class Octree {
524
523
 
525
524
  }
526
525
 
526
+ clear() {
527
+
528
+ this.box = null;
529
+ this.bounds.makeEmpty();
530
+
531
+ this.subTrees.length = 0;
532
+ this.triangles.length = 0;
533
+
534
+ return this;
535
+
536
+ }
537
+
527
538
  }
528
539
 
529
540
  export { Octree };
@@ -0,0 +1,119 @@
1
+ class Timer {
2
+
3
+ constructor() {
4
+
5
+ this._previousTime = 0;
6
+ this._currentTime = 0;
7
+ this._startTime = now();
8
+
9
+ this._delta = 0;
10
+ this._elapsed = 0;
11
+
12
+ this._timescale = 1;
13
+
14
+ // use Page Visibility API to avoid large time delta values
15
+
16
+ this._usePageVisibilityAPI = ( typeof document !== 'undefined' && document.hidden !== undefined );
17
+
18
+ if ( this._usePageVisibilityAPI === true ) {
19
+
20
+ this._pageVisibilityHandler = handleVisibilityChange.bind( this );
21
+
22
+ document.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );
23
+
24
+ }
25
+
26
+ }
27
+
28
+ getDelta() {
29
+
30
+ return this._delta / 1000;
31
+
32
+ }
33
+
34
+ getElapsed() {
35
+
36
+ return this._elapsed / 1000;
37
+
38
+ }
39
+
40
+ getTimescale() {
41
+
42
+ return this._timescale;
43
+
44
+ }
45
+
46
+ setTimescale( timescale ) {
47
+
48
+ this._timescale = timescale;
49
+
50
+ return this;
51
+
52
+ }
53
+
54
+ reset() {
55
+
56
+ this._currentTime = now() - this._startTime;
57
+
58
+ return this;
59
+
60
+ }
61
+
62
+ dispose() {
63
+
64
+ if ( this._usePageVisibilityAPI === true ) {
65
+
66
+ document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );
67
+
68
+ }
69
+
70
+ return this;
71
+
72
+ }
73
+
74
+ update( timestamp ) {
75
+
76
+ this._previousTime = this._currentTime;
77
+ this._currentTime = ( timestamp !== undefined ? timestamp : now() ) - this._startTime;
78
+
79
+ this._delta = ( this._currentTime - this._previousTime ) * this._timescale;
80
+ this._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas
81
+
82
+ return this;
83
+
84
+ }
85
+
86
+ }
87
+
88
+ class FixedTimer extends Timer {
89
+
90
+ constructor( fps = 60 ) {
91
+
92
+ super();
93
+ this._delta = ( 1 / fps ) * 1000;
94
+
95
+ }
96
+
97
+ update() {
98
+
99
+ this._elapsed += ( this._delta * this._timescale ); // _elapsed is the accumulation of all previous deltas
100
+
101
+ return this;
102
+
103
+ }
104
+
105
+ }
106
+
107
+ function now() {
108
+
109
+ return ( typeof performance === 'undefined' ? Date : performance ).now();
110
+
111
+ }
112
+
113
+ function handleVisibilityChange() {
114
+
115
+ if ( document.hidden === false ) this.reset();
116
+
117
+ }
118
+
119
+ export { Timer, FixedTimer };
@@ -176,16 +176,13 @@ function TubePainter() {
176
176
 
177
177
  if ( start === end ) return;
178
178
 
179
- positions.updateRange.offset = start * 3;
180
- positions.updateRange.count = ( end - start ) * 3;
179
+ positions.addUpdateRange( start * 3, ( end - start ) * 3 );
181
180
  positions.needsUpdate = true;
182
181
 
183
- normals.updateRange.offset = start * 3;
184
- normals.updateRange.count = ( end - start ) * 3;
182
+ normals.addUpdateRange( start * 3, ( end - start ) * 3 );
185
183
  normals.needsUpdate = true;
186
184
 
187
- colors.updateRange.offset = start * 3;
188
- colors.updateRange.count = ( end - start ) * 3;
185
+ colors.addUpdateRange( start * 3, ( end - start ) * 3 );
189
186
  colors.needsUpdate = true;
190
187
 
191
188
  count = geometry.drawRange.count;
@@ -214,8 +214,26 @@ export class Flow {
214
214
  child instanceof InstancedMesh
215
215
  ) {
216
216
 
217
- child.material = child.material.clone();
218
- modifyShader( child.material, uniforms, numberOfCurves );
217
+ if ( Array.isArray( child.material ) ) {
218
+
219
+ const materials = [];
220
+
221
+ for ( const material of child.material ) {
222
+
223
+ const newMaterial = material.clone();
224
+ modifyShader( newMaterial, uniforms, numberOfCurves );
225
+ materials.push( newMaterial );
226
+
227
+ }
228
+
229
+ child.material = materials;
230
+
231
+ } else {
232
+
233
+ child.material = child.material.clone();
234
+ modifyShader( child.material, uniforms, numberOfCurves );
235
+
236
+ }
219
237
 
220
238
  }
221
239