super-three 0.133.5 → 0.135.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 (246) hide show
  1. package/build/three.js +617 -536
  2. package/build/three.min.js +1 -1
  3. package/build/three.module.js +760 -613
  4. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff +0 -0
  5. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  6. package/examples/fonts/open-sans/open-sans.css +9 -0
  7. package/examples/fonts/tabler-icons/fonts/tabler-icons.eot +0 -0
  8. package/examples/fonts/tabler-icons/fonts/tabler-icons.ttf +0 -0
  9. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff +0 -0
  10. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff2 +0 -0
  11. package/examples/fonts/tabler-icons/tabler-icons.min.css +4 -0
  12. package/examples/js/controls/ArcballControls.js +68 -27
  13. package/examples/js/controls/DragControls.js +7 -0
  14. package/examples/js/controls/OrbitControls.js +5 -36
  15. package/examples/js/controls/TrackballControls.js +3 -2
  16. package/examples/js/csm/CSM.js +2 -2
  17. package/examples/js/csm/CSMFrustum.js +133 -0
  18. package/examples/js/exporters/GLTFExporter.js +147 -63
  19. package/examples/js/exporters/USDZExporter.js +45 -26
  20. package/examples/js/lines/LineMaterial.js +58 -20
  21. package/examples/js/lines/LineSegments2.js +29 -24
  22. package/examples/js/loaders/3DMLoader.js +24 -11
  23. package/examples/js/loaders/3MFLoader.js +2 -2
  24. package/examples/js/loaders/ColladaLoader.js +61 -3
  25. package/examples/js/loaders/FBXLoader.js +1 -1
  26. package/examples/js/loaders/GLTFLoader.js +94 -31
  27. package/examples/js/loaders/KTX2Loader.js +12 -0
  28. package/examples/js/loaders/LWOLoader.js +8 -6
  29. package/examples/js/loaders/LogLuvLoader.js +766 -0
  30. package/examples/js/loaders/PLYLoader.js +32 -7
  31. package/examples/js/loaders/RGBELoader.js +2 -1
  32. package/examples/js/loaders/SVGLoader.js +7 -3
  33. package/examples/js/loaders/TDSLoader.js +237 -271
  34. package/examples/js/loaders/lwo/LWO2Parser.js +1 -0
  35. package/examples/js/loaders/lwo/LWO3Parser.js +4 -2
  36. package/examples/js/objects/MarchingCubes.js +42 -128
  37. package/examples/js/renderers/CSS2DRenderer.js +4 -4
  38. package/examples/js/renderers/CSS3DRenderer.js +4 -4
  39. package/examples/js/utils/RoughnessMipmapper.js +1 -0
  40. package/examples/jsm/controls/ArcballControls.js +61 -29
  41. package/examples/jsm/controls/DragControls.js +7 -0
  42. package/examples/jsm/controls/OrbitControls.js +9 -51
  43. package/examples/jsm/controls/TrackballControls.js +1 -1
  44. package/examples/jsm/csm/CSM.js +3 -3
  45. package/examples/jsm/csm/{Frustum.js → CSMFrustum.js} +3 -3
  46. package/examples/jsm/exporters/GLTFExporter.js +160 -74
  47. package/examples/jsm/exporters/USDZExporter.js +47 -26
  48. package/examples/jsm/libs/flow.module.js +3218 -0
  49. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  50. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  51. package/examples/jsm/lines/LineMaterial.js +59 -23
  52. package/examples/jsm/lines/LineSegments2.js +22 -18
  53. package/examples/jsm/loaders/3DMLoader.js +18 -12
  54. package/examples/jsm/loaders/3MFLoader.js +2 -2
  55. package/examples/jsm/loaders/ColladaLoader.js +61 -3
  56. package/examples/jsm/loaders/FBXLoader.js +1 -1
  57. package/examples/jsm/loaders/GLTFLoader.js +99 -35
  58. package/examples/jsm/loaders/KTX2Loader.js +19 -0
  59. package/examples/jsm/loaders/LWOLoader.js +8 -6
  60. package/examples/jsm/loaders/LogLuvLoader.js +606 -0
  61. package/examples/jsm/loaders/PLYLoader.js +33 -7
  62. package/examples/jsm/loaders/SVGLoader.js +7 -4
  63. package/examples/jsm/loaders/TDSLoader.js +225 -285
  64. package/examples/jsm/loaders/lwo/LWO2Parser.js +1 -0
  65. package/examples/jsm/loaders/lwo/LWO3Parser.js +2 -2
  66. package/examples/jsm/node-editor/NodeEditor.js +455 -0
  67. package/examples/jsm/node-editor/accessors/NormalEditor.js +30 -0
  68. package/examples/jsm/node-editor/accessors/PositionEditor.js +30 -0
  69. package/examples/jsm/node-editor/accessors/UVEditor.js +26 -0
  70. package/examples/jsm/node-editor/display/BlendEditor.js +43 -0
  71. package/examples/jsm/node-editor/examples/animate-uv.json +1 -0
  72. package/examples/jsm/node-editor/examples/fake-top-light.json +1 -0
  73. package/examples/jsm/node-editor/examples/oscillator-color.json +1 -0
  74. package/examples/jsm/node-editor/examples/rim.json +1 -0
  75. package/examples/jsm/node-editor/inputs/ColorEditor.js +91 -0
  76. package/examples/jsm/node-editor/inputs/FloatEditor.js +24 -0
  77. package/examples/jsm/node-editor/inputs/SliderEditor.js +68 -0
  78. package/examples/jsm/node-editor/inputs/Vector2Editor.js +28 -0
  79. package/examples/jsm/node-editor/inputs/Vector3Editor.js +30 -0
  80. package/examples/jsm/node-editor/inputs/Vector4Editor.js +37 -0
  81. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +69 -0
  82. package/examples/jsm/node-editor/math/DotEditor.js +36 -0
  83. package/examples/jsm/node-editor/math/InvertEditor.js +38 -0
  84. package/examples/jsm/node-editor/math/LimiterEditor.js +48 -0
  85. package/examples/jsm/node-editor/math/NormalizeEditor.js +26 -0
  86. package/examples/jsm/node-editor/math/OperatorEditor.js +50 -0
  87. package/examples/jsm/node-editor/math/PowerEditor.js +34 -0
  88. package/examples/jsm/node-editor/math/TrigonometryEditor.js +39 -0
  89. package/examples/jsm/node-editor/procedural/CheckerEditor.js +26 -0
  90. package/examples/jsm/node-editor/utils/OscillatorEditor.js +42 -0
  91. package/examples/jsm/node-editor/utils/TimerEditor.js +57 -0
  92. package/examples/jsm/nodes/materials/StandardNodeMaterial.js +1 -1
  93. package/examples/jsm/nodes/materials/nodes/StandardNode.js +6 -6
  94. package/examples/jsm/nodes/utils/ColorSpaceNode.js +1 -49
  95. package/examples/jsm/objects/MarchingCubes.js +46 -152
  96. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +1 -1
  97. package/examples/jsm/postprocessing/AfterimagePass.js +1 -1
  98. package/examples/jsm/postprocessing/BloomPass.js +1 -1
  99. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  100. package/examples/jsm/postprocessing/ClearPass.js +1 -1
  101. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -1
  102. package/examples/jsm/postprocessing/DotScreenPass.js +1 -1
  103. package/examples/jsm/postprocessing/EffectComposer.js +3 -3
  104. package/examples/jsm/postprocessing/FilmPass.js +1 -1
  105. package/examples/jsm/postprocessing/GlitchPass.js +1 -1
  106. package/examples/jsm/postprocessing/HalftonePass.js +1 -1
  107. package/examples/jsm/postprocessing/MaskPass.js +1 -1
  108. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  109. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  110. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  111. package/examples/jsm/postprocessing/SMAAPass.js +1 -1
  112. package/examples/jsm/postprocessing/SSAARenderPass.js +1 -1
  113. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  114. package/examples/jsm/postprocessing/SSRPass.js +1 -1
  115. package/examples/jsm/postprocessing/SSRrPass.js +1 -1
  116. package/examples/jsm/postprocessing/SavePass.js +1 -1
  117. package/examples/jsm/postprocessing/ShaderPass.js +1 -1
  118. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  119. package/examples/jsm/postprocessing/TexturePass.js +1 -1
  120. package/examples/jsm/postprocessing/UnrealBloomPass.js +1 -1
  121. package/examples/jsm/renderers/CSS2DRenderer.js +5 -4
  122. package/examples/jsm/renderers/CSS3DRenderer.js +5 -4
  123. package/examples/jsm/renderers/nodes/Nodes.js +14 -13
  124. package/examples/jsm/renderers/nodes/ShaderNode.js +193 -41
  125. package/examples/jsm/renderers/nodes/accessors/MaterialNode.js +6 -6
  126. package/examples/jsm/renderers/nodes/accessors/ModelViewProjectionNode.js +5 -5
  127. package/examples/jsm/renderers/nodes/accessors/NormalNode.js +14 -3
  128. package/examples/jsm/renderers/nodes/accessors/PointUVNode.js +3 -3
  129. package/examples/jsm/renderers/nodes/accessors/PositionNode.js +15 -5
  130. package/examples/jsm/renderers/nodes/accessors/SkinningNode.js +107 -0
  131. package/examples/jsm/renderers/nodes/accessors/UVNode.js +7 -5
  132. package/examples/jsm/renderers/nodes/core/ArrayInputNode.js +3 -3
  133. package/examples/jsm/renderers/nodes/core/AttributeNode.js +6 -0
  134. package/examples/jsm/renderers/nodes/core/BypassNode.js +38 -0
  135. package/examples/jsm/renderers/nodes/core/CodeNode.js +3 -3
  136. package/examples/jsm/renderers/nodes/core/ContextNode.js +4 -19
  137. package/examples/jsm/renderers/nodes/core/ExpressionNode.js +13 -2
  138. package/examples/jsm/renderers/nodes/core/FunctionNode.js +19 -132
  139. package/examples/jsm/renderers/nodes/core/InputNode.js +13 -3
  140. package/examples/jsm/renderers/nodes/core/Node.js +32 -10
  141. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +146 -128
  142. package/examples/jsm/renderers/nodes/core/NodeFunction.js +22 -0
  143. package/examples/jsm/renderers/nodes/core/NodeFunctionInput.js +4 -4
  144. package/examples/jsm/renderers/nodes/core/NodeKeywords.js +18 -179
  145. package/examples/jsm/renderers/nodes/core/NodeParser.js +11 -0
  146. package/examples/jsm/renderers/nodes/core/NodeVar.js +2 -2
  147. package/examples/jsm/renderers/nodes/core/PropertyNode.js +14 -2
  148. package/examples/jsm/renderers/nodes/core/TempNode.js +10 -13
  149. package/examples/jsm/renderers/nodes/core/VarNode.js +12 -7
  150. package/examples/jsm/renderers/nodes/core/VaryNode.js +23 -8
  151. package/examples/jsm/renderers/nodes/core/constants.js +2 -0
  152. package/examples/jsm/renderers/nodes/display/ColorSpaceNode.js +47 -25
  153. package/examples/jsm/renderers/nodes/display/NormalMapNode.js +21 -22
  154. package/examples/jsm/renderers/nodes/functions/BSDFs.js +64 -101
  155. package/examples/jsm/renderers/nodes/inputs/BufferNode.js +25 -0
  156. package/examples/jsm/renderers/nodes/inputs/IntNode.js +17 -0
  157. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +10 -2
  158. package/examples/jsm/renderers/nodes/lights/LightContextNode.js +20 -14
  159. package/examples/jsm/renderers/nodes/lights/LightNode.js +32 -36
  160. package/examples/jsm/renderers/nodes/math/CondNode.js +60 -0
  161. package/examples/jsm/renderers/nodes/math/MathNode.js +87 -36
  162. package/examples/jsm/renderers/nodes/math/OperatorNode.js +124 -31
  163. package/examples/jsm/renderers/nodes/parsers/GLSLNodeFunction.js +137 -0
  164. package/examples/jsm/renderers/nodes/parsers/GLSLNodeParser.js +14 -0
  165. package/examples/jsm/renderers/nodes/parsers/WGSLNodeFunction.js +89 -0
  166. package/examples/jsm/renderers/nodes/parsers/WGSLNodeParser.js +14 -0
  167. package/examples/jsm/renderers/nodes/procedural/CheckerNode.js +7 -9
  168. package/examples/jsm/renderers/nodes/utils/ArrayElementNode.js +31 -0
  169. package/examples/jsm/renderers/nodes/utils/ConvertNode.js +33 -0
  170. package/examples/jsm/renderers/nodes/utils/JoinNode.js +7 -7
  171. package/examples/jsm/renderers/nodes/utils/OscNode.js +58 -0
  172. package/examples/jsm/renderers/nodes/utils/SplitNode.js +18 -8
  173. package/examples/jsm/renderers/nodes/utils/SpriteSheetUVNode.js +7 -7
  174. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +22 -0
  175. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +191 -94
  176. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +2 -2
  177. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +2 -2
  178. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +1 -1
  179. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +3 -3
  180. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +2 -4
  181. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +2 -4
  182. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +15 -23
  183. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +3 -5
  184. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +11 -27
  185. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +62 -28
  186. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +34 -27
  187. package/examples/jsm/renderers/webgpu/constants.js +2 -2
  188. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +430 -98
  189. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  190. package/examples/jsm/utils/RoughnessMipmapper.js +1 -0
  191. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -6
  192. package/package.json +10 -10
  193. package/src/Three.Legacy.js +6 -0
  194. package/src/Three.js +0 -1
  195. package/src/cameras/StereoCamera.js +8 -7
  196. package/src/constants.js +1 -2
  197. package/src/core/Layers.js +7 -1
  198. package/src/core/Object3D.js +2 -0
  199. package/src/extras/PMREMGenerator.js +11 -6
  200. package/src/loaders/FileLoader.js +89 -152
  201. package/src/loaders/ImageLoader.js +9 -4
  202. package/src/loaders/LoaderUtils.js +26 -0
  203. package/src/loaders/MaterialLoader.js +7 -4
  204. package/src/loaders/ObjectLoader.js +2 -0
  205. package/src/materials/Material.js +4 -4
  206. package/src/materials/MeshPhysicalMaterial.js +20 -14
  207. package/src/math/MathUtils.js +5 -16
  208. package/src/renderers/WebGLMultisampleRenderTarget.js +7 -1
  209. package/src/renderers/WebGLRenderer.js +83 -117
  210. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +2 -2
  211. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +0 -27
  212. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  213. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +19 -6
  214. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
  215. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  216. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +1 -1
  217. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +13 -5
  218. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +2 -1
  219. package/src/renderers/shaders/ShaderLib.js +6 -4
  220. package/src/renderers/shaders/UniformsLib.js +1 -2
  221. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  222. package/src/renderers/webgl/WebGLMaterials.js +27 -15
  223. package/src/renderers/webgl/WebGLProgram.js +10 -6
  224. package/src/renderers/webgl/WebGLPrograms.js +17 -12
  225. package/src/renderers/webgl/WebGLShadowMap.js +14 -5
  226. package/src/renderers/webgl/WebGLState.js +31 -17
  227. package/src/renderers/webgl/WebGLTextures.js +188 -51
  228. package/src/renderers/webgl/WebGLUniforms.js +45 -1
  229. package/src/renderers/webxr/WebXRManager.js +68 -107
  230. package/src/textures/Texture.js +6 -0
  231. package/src/utils.js +37 -1
  232. package/examples/js/controls/DeviceOrientationControls.js +0 -147
  233. package/examples/js/libs/dat.gui.min.js +0 -14
  234. package/examples/jsm/controls/DeviceOrientationControls.js +0 -153
  235. package/examples/jsm/libs/dat.gui.module.js +0 -3575
  236. package/examples/jsm/libs/glslang.js +0 -78
  237. package/examples/jsm/libs/glslang.wasm +0 -0
  238. package/examples/jsm/renderers/nodes/consts/MathConsts.js +0 -7
  239. package/examples/jsm/renderers/nodes/core/ConstNode.js +0 -39
  240. package/examples/jsm/renderers/nodes/core/NodeSlot.js +0 -13
  241. package/examples/jsm/renderers/nodes/core/StructNode.js +0 -80
  242. package/examples/jsm/renderers/nodes/core/StructVarNode.js +0 -75
  243. package/examples/jsm/renderers/nodes/functions/EncodingFunctions.js +0 -99
  244. package/examples/jsm/renderers/nodes/functions/MathFunctions.js +0 -47
  245. package/examples/jsm/renderers/webgpu/nodes/ShaderLib.js +0 -152
  246. package/src/extras/objects/ImmediateRenderObject.js +0 -31
@@ -0,0 +1,133 @@
1
+ ( function () {
2
+
3
+ const inverseProjectionMatrix = new THREE.Matrix4();
4
+
5
+ class CSMFrustum {
6
+
7
+ constructor( data ) {
8
+
9
+ data = data || {};
10
+ this.vertices = {
11
+ near: [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ],
12
+ far: [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ]
13
+ };
14
+
15
+ if ( data.projectionMatrix !== undefined ) {
16
+
17
+ this.setFromProjectionMatrix( data.projectionMatrix, data.maxFar || 10000 );
18
+
19
+ }
20
+
21
+ }
22
+
23
+ setFromProjectionMatrix( projectionMatrix, maxFar ) {
24
+
25
+ const isOrthographic = projectionMatrix.elements[ 2 * 4 + 3 ] === 0;
26
+ inverseProjectionMatrix.copy( projectionMatrix ).invert(); // 3 --- 0 vertices.near/far order
27
+ // | |
28
+ // 2 --- 1
29
+ // clip space spans from [-1, 1]
30
+
31
+ this.vertices.near[ 0 ].set( 1, 1, - 1 );
32
+ this.vertices.near[ 1 ].set( 1, - 1, - 1 );
33
+ this.vertices.near[ 2 ].set( - 1, - 1, - 1 );
34
+ this.vertices.near[ 3 ].set( - 1, 1, - 1 );
35
+ this.vertices.near.forEach( function ( v ) {
36
+
37
+ v.applyMatrix4( inverseProjectionMatrix );
38
+
39
+ } );
40
+ this.vertices.far[ 0 ].set( 1, 1, 1 );
41
+ this.vertices.far[ 1 ].set( 1, - 1, 1 );
42
+ this.vertices.far[ 2 ].set( - 1, - 1, 1 );
43
+ this.vertices.far[ 3 ].set( - 1, 1, 1 );
44
+ this.vertices.far.forEach( function ( v ) {
45
+
46
+ v.applyMatrix4( inverseProjectionMatrix );
47
+ const absZ = Math.abs( v.z );
48
+
49
+ if ( isOrthographic ) {
50
+
51
+ v.z *= Math.min( maxFar / absZ, 1.0 );
52
+
53
+ } else {
54
+
55
+ v.multiplyScalar( Math.min( maxFar / absZ, 1.0 ) );
56
+
57
+ }
58
+
59
+ } );
60
+ return this.vertices;
61
+
62
+ }
63
+
64
+ split( breaks, target ) {
65
+
66
+ while ( breaks.length > target.length ) {
67
+
68
+ target.push( new CSMFrustum() );
69
+
70
+ }
71
+
72
+ target.length = breaks.length;
73
+
74
+ for ( let i = 0; i < breaks.length; i ++ ) {
75
+
76
+ const cascade = target[ i ];
77
+
78
+ if ( i === 0 ) {
79
+
80
+ for ( let j = 0; j < 4; j ++ ) {
81
+
82
+ cascade.vertices.near[ j ].copy( this.vertices.near[ j ] );
83
+
84
+ }
85
+
86
+ } else {
87
+
88
+ for ( let j = 0; j < 4; j ++ ) {
89
+
90
+ cascade.vertices.near[ j ].lerpVectors( this.vertices.near[ j ], this.vertices.far[ j ], breaks[ i - 1 ] );
91
+
92
+ }
93
+
94
+ }
95
+
96
+ if ( i === breaks.length - 1 ) {
97
+
98
+ for ( let j = 0; j < 4; j ++ ) {
99
+
100
+ cascade.vertices.far[ j ].copy( this.vertices.far[ j ] );
101
+
102
+ }
103
+
104
+ } else {
105
+
106
+ for ( let j = 0; j < 4; j ++ ) {
107
+
108
+ cascade.vertices.far[ j ].lerpVectors( this.vertices.near[ j ], this.vertices.far[ j ], breaks[ i ] );
109
+
110
+ }
111
+
112
+ }
113
+
114
+ }
115
+
116
+ }
117
+
118
+ toSpace( cameraMatrix, target ) {
119
+
120
+ for ( var i = 0; i < 4; i ++ ) {
121
+
122
+ target.vertices.near[ i ].copy( this.vertices.near[ i ] ).applyMatrix4( cameraMatrix );
123
+ target.vertices.far[ i ].copy( this.vertices.far[ i ] ).applyMatrix4( cameraMatrix );
124
+
125
+ }
126
+
127
+ }
128
+
129
+ }
130
+
131
+ THREE.CSMFrustum = CSMFrustum;
132
+
133
+ } )();
@@ -30,6 +30,11 @@
30
30
  return new GLTFMaterialsVolumeExtension( writer );
31
31
 
32
32
  } );
33
+ this.register( function ( writer ) {
34
+
35
+ return new GLTFMaterialsClearcoatExtension( writer );
36
+
37
+ } );
33
38
 
34
39
  }
35
40
 
@@ -60,11 +65,19 @@
60
65
  * Parse scenes and generate GLTF output
61
66
  * @param {Scene or [THREE.Scenes]} input THREE.Scene or Array of THREE.Scenes
62
67
  * @param {Function} onDone Callback on completed
68
+ * @param {Function} onError Callback on errors
63
69
  * @param {Object} options options
64
70
  */
65
71
 
66
72
 
67
- parse( input, onDone, options ) {
73
+ parse( input, onDone, onError, options ) {
74
+
75
+ if ( typeof onError === 'object' ) {
76
+
77
+ console.warn( 'THREE.GLTFExporter: parse() expects options as the fourth argument now.' );
78
+ options = onError;
79
+
80
+ }
68
81
 
69
82
  const writer = new GLTFWriter();
70
83
  const plugins = [];
@@ -76,7 +89,18 @@
76
89
  }
77
90
 
78
91
  writer.setPlugins( plugins );
79
- writer.write( input, onDone, options );
92
+ writer.write( input, onDone, options ).catch( onError );
93
+
94
+ }
95
+
96
+ parseAsync( input, options ) {
97
+
98
+ const scope = this;
99
+ return new Promise( function ( resolve, reject ) {
100
+
101
+ scope.parse( input, resolve, reject, options );
102
+
103
+ } );
80
104
 
81
105
  }
82
106
 
@@ -337,7 +361,7 @@
337
361
  */
338
362
 
339
363
 
340
- write( input, onDone, options ) {
364
+ async write( input, onDone, options ) {
341
365
 
342
366
  this.options = Object.assign( {}, {
343
367
  // default options
@@ -359,86 +383,83 @@
359
383
  }
360
384
 
361
385
  this.processInput( input );
386
+ await Promise.all( this.pending );
362
387
  const writer = this;
363
- Promise.all( this.pending ).then( function () {
364
-
365
- const buffers = writer.buffers;
366
- const json = writer.json;
367
- const options = writer.options;
368
- const extensionsUsed = writer.extensionsUsed; // Merge buffers.
369
-
370
- const blob = new Blob( buffers, {
371
- type: 'application/octet-stream'
372
- } ); // Declare extensions.
373
-
374
- const extensionsUsedList = Object.keys( extensionsUsed );
375
- if ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList; // Update bytelength of the single buffer.
376
-
377
- if ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;
378
-
379
- if ( options.binary === true ) {
380
-
381
- // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification
382
- const reader = new window.FileReader();
383
- reader.readAsArrayBuffer( blob );
388
+ const buffers = writer.buffers;
389
+ const json = writer.json;
390
+ options = writer.options;
391
+ const extensionsUsed = writer.extensionsUsed; // Merge buffers.
384
392
 
385
- reader.onloadend = function () {
393
+ const blob = new Blob( buffers, {
394
+ type: 'application/octet-stream'
395
+ } ); // Declare extensions.
386
396
 
387
- // Binary chunk.
388
- const binaryChunk = getPaddedArrayBuffer( reader.result );
389
- const binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
390
- binaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );
391
- binaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true ); // JSON chunk.
397
+ const extensionsUsedList = Object.keys( extensionsUsed );
398
+ if ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList; // Update bytelength of the single buffer.
392
399
 
393
- const jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );
394
- const jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
395
- jsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );
396
- jsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true ); // GLB header.
400
+ if ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;
397
401
 
398
- const header = new ArrayBuffer( GLB_HEADER_BYTES );
399
- const headerView = new DataView( header );
400
- headerView.setUint32( 0, GLB_HEADER_MAGIC, true );
401
- headerView.setUint32( 4, GLB_VERSION, true );
402
- const totalByteLength = GLB_HEADER_BYTES + jsonChunkPrefix.byteLength + jsonChunk.byteLength + binaryChunkPrefix.byteLength + binaryChunk.byteLength;
403
- headerView.setUint32( 8, totalByteLength, true );
404
- const glbBlob = new Blob( [ header, jsonChunkPrefix, jsonChunk, binaryChunkPrefix, binaryChunk ], {
405
- type: 'application/octet-stream'
406
- } );
407
- const glbReader = new window.FileReader();
408
- glbReader.readAsArrayBuffer( glbBlob );
402
+ if ( options.binary === true ) {
409
403
 
410
- glbReader.onloadend = function () {
404
+ // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification
405
+ const reader = new window.FileReader();
406
+ reader.readAsArrayBuffer( blob );
411
407
 
412
- onDone( glbReader.result );
408
+ reader.onloadend = function () {
413
409
 
414
- };
410
+ // Binary chunk.
411
+ const binaryChunk = getPaddedArrayBuffer( reader.result );
412
+ const binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
413
+ binaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );
414
+ binaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true ); // JSON chunk.
415
+
416
+ const jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );
417
+ const jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
418
+ jsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );
419
+ jsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true ); // GLB header.
420
+
421
+ const header = new ArrayBuffer( GLB_HEADER_BYTES );
422
+ const headerView = new DataView( header );
423
+ headerView.setUint32( 0, GLB_HEADER_MAGIC, true );
424
+ headerView.setUint32( 4, GLB_VERSION, true );
425
+ const totalByteLength = GLB_HEADER_BYTES + jsonChunkPrefix.byteLength + jsonChunk.byteLength + binaryChunkPrefix.byteLength + binaryChunk.byteLength;
426
+ headerView.setUint32( 8, totalByteLength, true );
427
+ const glbBlob = new Blob( [ header, jsonChunkPrefix, jsonChunk, binaryChunkPrefix, binaryChunk ], {
428
+ type: 'application/octet-stream'
429
+ } );
430
+ const glbReader = new window.FileReader();
431
+ glbReader.readAsArrayBuffer( glbBlob );
432
+
433
+ glbReader.onloadend = function () {
434
+
435
+ onDone( glbReader.result );
415
436
 
416
437
  };
417
438
 
418
- } else {
439
+ };
419
440
 
420
- if ( json.buffers && json.buffers.length > 0 ) {
441
+ } else {
421
442
 
422
- const reader = new window.FileReader();
423
- reader.readAsDataURL( blob );
443
+ if ( json.buffers && json.buffers.length > 0 ) {
424
444
 
425
- reader.onloadend = function () {
445
+ const reader = new window.FileReader();
446
+ reader.readAsDataURL( blob );
426
447
 
427
- const base64data = reader.result;
428
- json.buffers[ 0 ].uri = base64data;
429
- onDone( json );
448
+ reader.onloadend = function () {
430
449
 
431
- };
450
+ const base64data = reader.result;
451
+ json.buffers[ 0 ].uri = base64data;
452
+ onDone( json );
432
453
 
433
- } else {
454
+ };
434
455
 
435
- onDone( json );
456
+ } else {
436
457
 
437
- }
458
+ onDone( json );
438
459
 
439
460
  }
440
461
 
441
- } );
462
+ }
442
463
 
443
464
  }
444
465
  /**
@@ -2066,6 +2087,69 @@
2066
2087
 
2067
2088
  }
2068
2089
 
2090
+ }
2091
+ /**
2092
+ * Clearcoat Materials Extension
2093
+ *
2094
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat
2095
+ */
2096
+
2097
+
2098
+ class GLTFMaterialsClearcoatExtension {
2099
+
2100
+ constructor( writer ) {
2101
+
2102
+ this.writer = writer;
2103
+ this.name = 'KHR_materials_clearcoat';
2104
+
2105
+ }
2106
+
2107
+ writeMaterial( material, materialDef ) {
2108
+
2109
+ if ( ! material.isMeshPhysicalMaterial ) return;
2110
+ const writer = this.writer;
2111
+ const extensionsUsed = writer.extensionsUsed;
2112
+ const extensionDef = {};
2113
+ extensionDef.clearcoatFactor = material.clearcoat;
2114
+
2115
+ if ( material.clearcoatMap ) {
2116
+
2117
+ const clearcoatMapDef = {
2118
+ index: writer.processTexture( material.clearcoatMap )
2119
+ };
2120
+ writer.applyTextureTransform( clearcoatMapDef, material.clearcoatMap );
2121
+ extensionDef.clearcoatTexture = clearcoatMapDef;
2122
+
2123
+ }
2124
+
2125
+ extensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness;
2126
+
2127
+ if ( material.clearcoatRoughnessMap ) {
2128
+
2129
+ const clearcoatRoughnessMapDef = {
2130
+ index: writer.processTexture( material.clearcoatRoughnessMap )
2131
+ };
2132
+ writer.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap );
2133
+ extensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef;
2134
+
2135
+ }
2136
+
2137
+ if ( material.clearcoatNormalMap ) {
2138
+
2139
+ const clearcoatNormalMapDef = {
2140
+ index: writer.processTexture( material.clearcoatNormalMap )
2141
+ };
2142
+ writer.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap );
2143
+ extensionDef.clearcoatNormalTexture = clearcoatNormalMapDef;
2144
+
2145
+ }
2146
+
2147
+ materialDef.extensions = materialDef.extensions || {};
2148
+ materialDef.extensions[ this.name ] = extensionDef;
2149
+ extensionsUsed[ this.name ] = true;
2150
+
2151
+ }
2152
+
2069
2153
  }
2070
2154
  /**
2071
2155
  * Transmission Materials Extension
@@ -2126,7 +2210,7 @@
2126
2210
 
2127
2211
  writeMaterial( material, materialDef ) {
2128
2212
 
2129
- if ( ! material.isMeshPhysicalMaterial || material.thickness === 0 ) return;
2213
+ if ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;
2130
2214
  const writer = this.writer;
2131
2215
  const extensionsUsed = writer.extensionsUsed;
2132
2216
  const extensionDef = {};
@@ -2143,7 +2227,7 @@
2143
2227
  }
2144
2228
 
2145
2229
  extensionDef.attenuationDistance = material.attenuationDistance;
2146
- extensionDef.attenuationColor = material.attenuationTint.toArray();
2230
+ extensionDef.attenuationColor = material.attenuationColor.toArray();
2147
2231
  materialDef.extensions = materialDef.extensions || {};
2148
2232
  materialDef.extensions[ this.name ] = extensionDef;
2149
2233
  extensionsUsed[ this.name ] = true;
@@ -13,26 +13,34 @@
13
13
  const textures = {};
14
14
  scene.traverseVisible( object => {
15
15
 
16
- if ( object.isMesh && object.material.isMeshStandardMaterial ) {
16
+ if ( object.isMesh ) {
17
17
 
18
- const geometry = object.geometry;
19
- const material = object.material;
20
- const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd';
18
+ if ( object.material.isMeshStandardMaterial ) {
21
19
 
22
- if ( ! ( geometryFileName in files ) ) {
20
+ const geometry = object.geometry;
21
+ const material = object.material;
22
+ const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd';
23
23
 
24
- const meshObject = buildMeshObject( geometry );
25
- files[ geometryFileName ] = buildUSDFileAsString( meshObject );
24
+ if ( ! ( geometryFileName in files ) ) {
26
25
 
27
- }
26
+ const meshObject = buildMeshObject( geometry );
27
+ files[ geometryFileName ] = buildUSDFileAsString( meshObject );
28
28
 
29
- if ( ! ( material.uuid in materials ) ) {
29
+ }
30
30
 
31
- materials[ material.uuid ] = material;
31
+ if ( ! ( material.uuid in materials ) ) {
32
32
 
33
- }
33
+ materials[ material.uuid ] = material;
34
+
35
+ }
34
36
 
35
- output += buildXform( object, geometry, material );
37
+ output += buildXform( object, geometry, material );
38
+
39
+ } else {
40
+
41
+ console.warn( 'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)', object );
42
+
43
+ }
36
44
 
37
45
  }
38
46
 
@@ -228,25 +236,33 @@ def "Geometry"
228
236
 
229
237
  function buildMeshVertexCount( geometry ) {
230
238
 
231
- const count = geometry.index !== null ? geometry.index.array.length : geometry.attributes.position.count;
239
+ const count = geometry.index !== null ? geometry.index.count : geometry.attributes.position.count;
232
240
  return Array( count / 3 ).fill( 3 ).join( ', ' );
233
241
 
234
242
  }
235
243
 
236
244
  function buildMeshVertexIndices( geometry ) {
237
245
 
238
- if ( geometry.index !== null ) {
246
+ const index = geometry.index;
247
+ const array = [];
239
248
 
240
- return geometry.index.array.join( ', ' );
249
+ if ( index !== null ) {
241
250
 
242
- }
251
+ for ( let i = 0; i < index.count; i ++ ) {
243
252
 
244
- const array = [];
245
- const length = geometry.attributes.position.count;
253
+ array.push( index.getX( i ) );
246
254
 
247
- for ( let i = 0; i < length; i ++ ) {
255
+ }
256
+
257
+ } else {
248
258
 
249
- array.push( i );
259
+ const length = geometry.attributes.position.count;
260
+
261
+ for ( let i = 0; i < length; i ++ ) {
262
+
263
+ array.push( i );
264
+
265
+ }
250
266
 
251
267
  }
252
268
 
@@ -264,11 +280,13 @@ def "Geometry"
264
280
  }
265
281
 
266
282
  const array = [];
267
- const data = attribute.array;
268
283
 
269
- for ( let i = 0; i < data.length; i += 3 ) {
284
+ for ( let i = 0; i < attribute.count; i ++ ) {
270
285
 
271
- array.push( `(${data[ i + 0 ].toPrecision( PRECISION )}, ${data[ i + 1 ].toPrecision( PRECISION )}, ${data[ i + 2 ].toPrecision( PRECISION )})` );
286
+ const x = attribute.getX( i );
287
+ const y = attribute.getY( i );
288
+ const z = attribute.getZ( i );
289
+ array.push( `(${x.toPrecision( PRECISION )}, ${y.toPrecision( PRECISION )}, ${z.toPrecision( PRECISION )})` );
272
290
 
273
291
  }
274
292
 
@@ -286,11 +304,12 @@ def "Geometry"
286
304
  }
287
305
 
288
306
  const array = [];
289
- const data = attribute.array;
290
307
 
291
- for ( let i = 0; i < data.length; i += 2 ) {
308
+ for ( let i = 0; i < attribute.count; i ++ ) {
292
309
 
293
- array.push( `(${data[ i + 0 ].toPrecision( PRECISION )}, ${1 - data[ i + 1 ].toPrecision( PRECISION )})` );
310
+ const x = attribute.getX( i );
311
+ const y = attribute.getY( i );
312
+ array.push( `(${x.toPrecision( PRECISION )}, ${1 - y.toPrecision( PRECISION )})` );
294
313
 
295
314
  }
296
315