super-three 0.156.0 → 0.157.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 (223) hide show
  1. package/build/three.cjs +753 -277
  2. package/build/three.js +753 -277
  3. package/build/three.min.js +2 -2
  4. package/build/three.module.js +750 -276
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/capabilities/WebGL.js +17 -0
  7. package/examples/jsm/controls/DragControls.js +3 -2
  8. package/examples/jsm/csm/CSMShader.js +25 -21
  9. package/examples/jsm/exporters/EXRExporter.js +102 -24
  10. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  11. package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
  12. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  14. package/examples/jsm/lights/LightProbeGenerator.js +37 -3
  15. package/examples/jsm/lines/LineMaterial.js +90 -156
  16. package/examples/jsm/loaders/3DMLoader.js +378 -104
  17. package/examples/jsm/loaders/GLTFLoader.js +1 -1
  18. package/examples/jsm/loaders/LDrawLoader.js +22 -16
  19. package/examples/jsm/loaders/RGBELoader.js +1 -1
  20. package/examples/jsm/loaders/USDZLoader.js +215 -12
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
  22. package/examples/jsm/nodes/Nodes.js +5 -1
  23. package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
  24. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +2 -2
  25. package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
  26. package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +2 -2
  28. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +6 -5
  29. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
  30. package/examples/jsm/nodes/accessors/LineMaterialNode.js +7 -9
  31. package/examples/jsm/nodes/accessors/MaterialNode.js +34 -46
  32. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +9 -9
  33. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
  35. package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
  36. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  38. package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
  39. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  40. package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
  41. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
  42. package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
  45. package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
  47. package/examples/jsm/nodes/accessors/TextureNode.js +12 -6
  48. package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
  49. package/examples/jsm/nodes/accessors/TextureStoreNode.js +1 -1
  50. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  51. package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
  52. package/examples/jsm/nodes/code/CodeNode.js +1 -1
  53. package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
  54. package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
  55. package/examples/jsm/nodes/code/FunctionNode.js +18 -7
  56. package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
  57. package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
  58. package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
  59. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  60. package/examples/jsm/nodes/core/BypassNode.js +1 -1
  61. package/examples/jsm/nodes/core/CacheNode.js +1 -1
  62. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  63. package/examples/jsm/nodes/core/ContextNode.js +2 -2
  64. package/examples/jsm/nodes/core/IndexNode.js +1 -1
  65. package/examples/jsm/nodes/core/InputNode.js +1 -1
  66. package/examples/jsm/nodes/core/Node.js +28 -13
  67. package/examples/jsm/nodes/core/NodeBuilder.js +3 -17
  68. package/examples/jsm/nodes/core/NodeFrame.js +37 -14
  69. package/examples/jsm/nodes/core/OutputStructNode.js +8 -4
  70. package/examples/jsm/nodes/core/PropertyNode.js +3 -3
  71. package/examples/jsm/nodes/core/StackNode.js +1 -1
  72. package/examples/jsm/nodes/core/StructTypeNode.js +1 -1
  73. package/examples/jsm/nodes/core/TempNode.js +1 -1
  74. package/examples/jsm/nodes/core/UniformNode.js +3 -1
  75. package/examples/jsm/nodes/core/VarNode.js +1 -1
  76. package/examples/jsm/nodes/core/VaryingNode.js +1 -1
  77. package/examples/jsm/nodes/core/constants.js +1 -1
  78. package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
  79. package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
  80. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
  81. package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
  82. package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
  83. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  84. package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
  85. package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
  86. package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
  87. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
  88. package/examples/jsm/nodes/display/ViewportNode.js +2 -2
  89. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
  90. package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
  91. package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
  92. package/examples/jsm/nodes/fog/FogNode.js +2 -2
  93. package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
  94. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  95. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  96. package/examples/jsm/nodes/lighting/AONode.js +2 -2
  97. package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
  98. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
  99. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
  100. package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
  101. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
  102. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
  103. package/examples/jsm/nodes/lighting/LightNode.js +2 -2
  104. package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
  105. package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
  106. package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
  107. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  108. package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
  109. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
  110. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
  111. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +2 -2
  112. package/examples/jsm/nodes/materials/Materials.js +1 -0
  113. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
  114. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
  115. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  116. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  117. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
  118. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
  119. package/examples/jsm/nodes/materials/NodeMaterial.js +27 -26
  120. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
  121. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  122. package/examples/jsm/nodes/math/CondNode.js +1 -1
  123. package/examples/jsm/nodes/math/HashNode.js +8 -9
  124. package/examples/jsm/nodes/math/MathNode.js +2 -2
  125. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  126. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  127. package/examples/jsm/nodes/shadernode/ShaderNode.js +81 -28
  128. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  129. package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
  130. package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
  131. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
  132. package/examples/jsm/nodes/utils/JoinNode.js +1 -1
  133. package/examples/jsm/nodes/utils/LoopNode.js +11 -11
  134. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
  135. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  136. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  137. package/examples/jsm/nodes/utils/PackingNode.js +2 -2
  138. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  139. package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
  140. package/examples/jsm/nodes/utils/SetNode.js +62 -0
  141. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
  142. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  143. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
  144. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  145. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
  146. package/examples/jsm/objects/Sky.js +1 -3
  147. package/examples/jsm/postprocessing/OutputPass.js +3 -2
  148. package/examples/jsm/renderers/common/Background.js +2 -2
  149. package/examples/jsm/renderers/common/Bindings.js +3 -5
  150. package/examples/jsm/renderers/common/Pipelines.js +7 -7
  151. package/examples/jsm/renderers/common/RenderContext.js +3 -0
  152. package/examples/jsm/renderers/common/RenderObject.js +40 -16
  153. package/examples/jsm/renderers/common/RenderObjects.js +8 -14
  154. package/examples/jsm/renderers/common/Renderer.js +40 -13
  155. package/examples/jsm/renderers/common/SampledTexture.js +4 -2
  156. package/examples/jsm/renderers/common/StorageTexture.js +19 -0
  157. package/examples/jsm/renderers/common/Textures.js +14 -9
  158. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
  159. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +20 -10
  160. package/examples/jsm/renderers/common/nodes/NodeSampler.js +0 -6
  161. package/examples/jsm/renderers/common/nodes/Nodes.js +51 -24
  162. package/examples/jsm/renderers/webgl/WebGLBackend.js +100 -5
  163. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +92 -6
  164. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +13 -0
  165. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +3 -3
  166. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +14 -2
  167. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +5 -5
  168. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +6 -3
  169. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +5 -5
  170. package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
  171. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +197 -167
  172. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  173. package/examples/jsm/shaders/MMDToonShader.js +4 -4
  174. package/examples/jsm/shaders/OutputShader.js +2 -2
  175. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
  176. package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
  177. package/package.json +1 -1
  178. package/src/Three.js +0 -2
  179. package/src/animation/AnimationUtils.js +3 -20
  180. package/src/animation/KeyframeTrack.js +8 -8
  181. package/src/cameras/Camera.js +1 -5
  182. package/src/cameras/CubeCamera.js +14 -8
  183. package/src/constants.js +7 -1
  184. package/src/core/RenderTarget.js +16 -7
  185. package/src/extras/core/CurvePath.js +4 -1
  186. package/src/loaders/MaterialLoader.js +1 -1
  187. package/src/loaders/ObjectLoader.js +6 -0
  188. package/src/materials/Material.js +8 -8
  189. package/src/math/Color.js +1 -5
  190. package/src/math/ColorManagement.js +82 -60
  191. package/src/objects/Sprite.js +2 -2
  192. package/src/renderers/WebGLMultiviewRenderTarget.js +35 -0
  193. package/src/renderers/WebGLRenderer.js +78 -22
  194. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  195. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
  196. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
  197. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
  198. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
  199. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
  200. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
  201. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
  202. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
  203. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
  204. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
  205. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
  206. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
  207. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
  208. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  209. package/src/renderers/shaders/UniformsUtils.js +2 -2
  210. package/src/renderers/webgl/WebGLBackground.js +5 -4
  211. package/src/renderers/webgl/WebGLLights.js +14 -3
  212. package/src/renderers/webgl/WebGLMultiview.js +100 -0
  213. package/src/renderers/webgl/WebGLProgram.js +84 -5
  214. package/src/renderers/webgl/WebGLPrograms.js +11 -2
  215. package/src/renderers/webgl/WebGLTextures.js +214 -26
  216. package/src/renderers/webgl/WebGLUtils.js +21 -23
  217. package/src/renderers/webxr/WebXRManager.js +36 -12
  218. package/src/scenes/Fog.js +1 -0
  219. package/src/scenes/FogExp2.js +1 -0
  220. package/src/textures/Source.js +2 -2
  221. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
  222. package/src/lights/AmbientLightProbe.js +0 -21
  223. package/src/lights/HemisphereLightProbe.js +0 -30
@@ -4,6 +4,7 @@ import {
4
4
  Loader,
5
5
  Object3D,
6
6
  MeshStandardMaterial,
7
+ MeshPhysicalMaterial,
7
8
  Mesh,
8
9
  Color,
9
10
  Points,
@@ -25,6 +26,8 @@ import {
25
26
  DoubleSide
26
27
  } from 'three';
27
28
 
29
+ import { EXRLoader } from '../loaders/EXRLoader.js';
30
+
28
31
  const _taskCache = new WeakMap();
29
32
 
30
33
  class Rhino3dmLoader extends Loader {
@@ -217,7 +220,7 @@ class Rhino3dmLoader extends Loader {
217
220
 
218
221
  }
219
222
 
220
- _createMaterial( material ) {
223
+ _createMaterial( material, renderEnvironment ) {
221
224
 
222
225
  if ( material === undefined ) {
223
226
 
@@ -230,27 +233,51 @@ class Rhino3dmLoader extends Loader {
230
233
 
231
234
  }
232
235
 
233
- const _diffuseColor = material.diffuseColor;
236
+ //console.log(material)
237
+
238
+ let mat = new MeshPhysicalMaterial( {
239
+
240
+ color: new Color( material.diffuseColor.r / 255.0, material.diffuseColor.g / 255.0, material.diffuseColor.b / 255.0 ),
241
+ emissive: new Color( material.emissionColor.r, material.emissionColor.g, material.emissionColor.b ),
242
+ flatShading: material.disableLighting,
243
+ ior: material.indexOfRefraction,
244
+ name: material.name,
245
+ reflectivity: material.reflectivity,
246
+ opacity: 1.0 - material.transparency,
247
+ side: DoubleSide,
248
+ specularColor: material.specularColor,
249
+ transparent: material.transparency > 0 ? true : false
250
+
251
+ } );
252
+
253
+ mat.userData.id = material.id;
234
254
 
235
- const diffusecolor = new Color( _diffuseColor.r / 255.0, _diffuseColor.g / 255.0, _diffuseColor.b / 255.0 );
255
+ if ( material.pbrSupported ) {
236
256
 
237
- if ( _diffuseColor.r === 0 && _diffuseColor.g === 0 && _diffuseColor.b === 0 ) {
257
+ const pbr = material.pbr;
238
258
 
239
- diffusecolor.r = 1;
240
- diffusecolor.g = 1;
241
- diffusecolor.b = 1;
259
+ mat.anisotropy = pbr.anisotropy;
260
+ mat.anisotropyRotation = pbr.anisotropicRotation;
261
+ mat.color = new Color( pbr.baseColor.r, pbr.baseColor.g, pbr.baseColor.b );
262
+ mat.clearCoat = pbr.clearCoat;
263
+ mat.clearCoatRoughness = pbr.clearCoatRoughness;
264
+ mat.metalness = pbr.metallic;
265
+ mat.transmission = 1 - pbr.opacity;
266
+ mat.roughness = pbr.roughness;
267
+ mat.sheen = pbr.sheen;
268
+ mat.specularIntensity = pbr.specular;
269
+ mat.thickness = pbr.subsurface;
242
270
 
243
271
  }
244
272
 
245
- // console.log( material );
273
+ if ( material.pbrSupported && material.pbr.opacity === 0 && material.transparency === 1 ) {
246
274
 
247
- const mat = new MeshStandardMaterial( {
248
- color: diffusecolor,
249
- name: material.name,
250
- side: DoubleSide,
251
- transparent: material.transparency > 0 ? true : false,
252
- opacity: 1.0 - material.transparency
253
- } );
275
+ //some compromises
276
+
277
+ mat.opacity = 0.2;
278
+ mat.transmission = 1.00;
279
+
280
+ }
254
281
 
255
282
  const textureLoader = new TextureLoader();
256
283
 
@@ -262,17 +289,31 @@ class Rhino3dmLoader extends Loader {
262
289
 
263
290
  const map = textureLoader.load( texture.image );
264
291
 
292
+ //console.log(texture.type )
293
+
265
294
  switch ( texture.type ) {
266
295
 
296
+ case 'Bump':
297
+
298
+ mat.bumpMap = map;
299
+
300
+ break;
301
+
267
302
  case 'Diffuse':
268
303
 
269
304
  mat.map = map;
270
305
 
271
306
  break;
272
307
 
273
- case 'Bump':
308
+ case 'Emap':
274
309
 
275
- mat.bumpMap = map;
310
+ mat.envMap = map;
311
+
312
+ break;
313
+
314
+ case 'Opacity':
315
+
316
+ mat.transmissionMap = map;
276
317
 
277
318
  break;
278
319
 
@@ -283,9 +324,97 @@ class Rhino3dmLoader extends Loader {
283
324
 
284
325
  break;
285
326
 
286
- case 'Emap':
327
+ case 'PBR_Alpha':
287
328
 
288
- mat.envMap = map;
329
+ mat.alphaMap = map;
330
+ mat.transparent = true;
331
+
332
+ break;
333
+
334
+ case 'PBR_AmbientOcclusion':
335
+
336
+ mat.aoMap = map;
337
+
338
+ break;
339
+
340
+ case 'PBR_Anisotropic':
341
+
342
+ mat.anisotropyMap = map;
343
+
344
+ break;
345
+
346
+ case 'PBR_BaseColor':
347
+
348
+ mat.map = map;
349
+
350
+ break;
351
+
352
+ case 'PBR_Clearcoat':
353
+
354
+ mat.clearcoatMap = map;
355
+
356
+ break;
357
+
358
+ case 'PBR_ClearcoatBump':
359
+
360
+ mat.clearcoatNormalMap = map;
361
+
362
+ break;
363
+
364
+ case 'PBR_ClearcoatRoughness':
365
+
366
+ mat.clearcoatRoughnessMap = map;
367
+
368
+ break;
369
+
370
+ case 'PBR_Displacement':
371
+
372
+ mat.displacementMap = map;
373
+
374
+ break;
375
+
376
+ case 'PBR_Emission':
377
+
378
+ mat.emissiveMap = map;
379
+
380
+ break;
381
+
382
+ case 'PBR_Metallic':
383
+
384
+ mat.metalnessMap = map;
385
+
386
+ break;
387
+
388
+ case 'PBR_Roughness':
389
+
390
+ mat.roughnessMap = map;
391
+
392
+ break;
393
+
394
+ case 'PBR_Sheen':
395
+
396
+ mat.sheenColorMap = map;
397
+
398
+ break;
399
+
400
+ case 'PBR_Specular':
401
+
402
+ mat.specularColorMap = map;
403
+
404
+ break;
405
+
406
+ case 'PBR_Subsurface':
407
+
408
+ mat.thicknessMap = map;
409
+
410
+ break;
411
+
412
+ default:
413
+
414
+ this.warnings.push( {
415
+ message: `THREE.3DMLoader: No conversion exists for 3dm ${texture.type}.`,
416
+ type: 'no conversion'
417
+ } );
289
418
 
290
419
  break;
291
420
 
@@ -293,20 +422,34 @@ class Rhino3dmLoader extends Loader {
293
422
 
294
423
  map.wrapS = texture.wrapU === 0 ? RepeatWrapping : ClampToEdgeWrapping;
295
424
  map.wrapT = texture.wrapV === 0 ? RepeatWrapping : ClampToEdgeWrapping;
296
- map.repeat.set( texture.repeat[ 0 ], texture.repeat[ 1 ] );
425
+
426
+ if ( texture.repeat ) {
427
+
428
+ map.repeat.set( texture.repeat[ 0 ], texture.repeat[ 1 ] );
429
+
430
+ }
297
431
 
298
432
  }
299
433
 
300
434
  }
301
435
 
436
+ if ( renderEnvironment ) {
437
+
438
+ new EXRLoader().load( renderEnvironment.image, function ( texture ) {
439
+
440
+ texture.mapping = THREE.EquirectangularReflectionMapping;
441
+ mat.envMap = texture;
442
+
443
+ } );
444
+
445
+ }
446
+
302
447
  return mat;
303
448
 
304
449
  }
305
450
 
306
451
  _createGeometry( data ) {
307
452
 
308
- // console.log(data);
309
-
310
453
  const object = new Object3D();
311
454
  const instanceDefinitionObjects = [];
312
455
  const instanceDefinitions = [];
@@ -315,8 +458,10 @@ class Rhino3dmLoader extends Loader {
315
458
  object.userData[ 'layers' ] = data.layers;
316
459
  object.userData[ 'groups' ] = data.groups;
317
460
  object.userData[ 'settings' ] = data.settings;
461
+ object.userData.settings[ 'renderSettings' ] = data.renderSettings;
318
462
  object.userData[ 'objectType' ] = 'File3dm';
319
463
  object.userData[ 'materials' ] = null;
464
+
320
465
  object.name = this.url;
321
466
 
322
467
  let objects = data.objects;
@@ -343,22 +488,56 @@ class Rhino3dmLoader extends Loader {
343
488
 
344
489
  default:
345
490
 
346
- let _object;
491
+ let matId;
492
+
493
+ switch( attributes.materialSource.name ) {
494
+ case 'ObjectMaterialSource_MaterialFromLayer':
495
+ //check layer index
496
+ if ( attributes.layerIndex >= 0 ) {
497
+
498
+ matId = data.layers[ attributes.layerIndex ].renderMaterialIndex;
499
+
500
+ } else {
501
+
502
+ matId = null;
503
+
504
+ }
505
+
506
+ break;
507
+
508
+ case 'ObjectMaterialSource_MaterialFromObject':
347
509
 
348
- if ( attributes.materialIndex >= 0 ) {
510
+ if ( attributes.materialIndex >= 0 ) {
511
+
512
+ matId = attributes.materialIndex;
513
+
514
+ } else {
515
+
516
+ matId = null;
517
+
518
+ }
519
+
520
+ break;
521
+
522
+ }
523
+
524
+ let material;
525
+
526
+ if ( matId >= 0 ) {
527
+
528
+ const rMaterial = materials[ matId ];
529
+ material = this._createMaterial( rMaterial, data.renderEnvironment );
349
530
 
350
- const rMaterial = materials[ attributes.materialIndex ];
351
- let material = this._createMaterial( rMaterial );
352
- material = this._compareMaterials( material );
353
- _object = this._createObject( obj, material );
354
531
 
355
532
  } else {
356
533
 
357
- const material = this._createMaterial();
358
- _object = this._createObject( obj, material );
534
+ material = this._createMaterial();
359
535
 
360
536
  }
361
537
 
538
+ material = this._compareMaterials( material );
539
+ const _object = this._createObject( obj, material );
540
+
362
541
  if ( _object === undefined ) {
363
542
 
364
543
  continue;
@@ -440,6 +619,7 @@ class Rhino3dmLoader extends Loader {
440
619
  }
441
620
 
442
621
  object.userData[ 'materials' ] = this.materials;
622
+ object.name = '';
443
623
  return object;
444
624
 
445
625
  }
@@ -642,7 +822,7 @@ class Rhino3dmLoader extends Loader {
642
822
  break;
643
823
 
644
824
  case 'LightStyle_WorldLinear':
645
- // not conversion exists, warning has already been printed to the console
825
+ // no conversion exists, warning has already been printed to the console
646
826
  break;
647
827
 
648
828
  default:
@@ -821,7 +1001,6 @@ function Rhino3dmWorker() {
821
1001
 
822
1002
  case 'init':
823
1003
 
824
- // console.log(message)
825
1004
  libraryConfig = message.libraryConfig;
826
1005
  const wasmBinary = libraryConfig.wasmBinary;
827
1006
  let RhinoModule;
@@ -902,7 +1081,7 @@ function Rhino3dmWorker() {
902
1081
  // Handle instance definitions
903
1082
  // console.log( `Instance Definitions Count: ${doc.instanceDefinitions().count()}` );
904
1083
 
905
- for ( let i = 0; i < doc.instanceDefinitions().count(); i ++ ) {
1084
+ for ( let i = 0; i < doc.instanceDefinitions().count; i ++ ) {
906
1085
 
907
1086
  const idef = doc.instanceDefinitions().get( i );
908
1087
  const idefAttributes = extractProperties( idef );
@@ -946,94 +1125,36 @@ function Rhino3dmWorker() {
946
1125
  rhino.TextureType.PBR_Displacement
947
1126
  ];
948
1127
 
949
- for ( let i = 0; i < doc.materials().count(); i ++ ) {
1128
+ for ( let i = 0; i < doc.materials().count; i ++ ) {
950
1129
 
951
1130
  const _material = doc.materials().get( i );
952
- const _pbrMaterial = _material.physicallyBased();
953
1131
 
954
1132
  let material = extractProperties( _material );
955
1133
 
956
1134
  const textures = [];
957
1135
 
958
- for ( let j = 0; j < textureTypes.length; j ++ ) {
959
-
960
- const _texture = _material.getTexture( textureTypes[ j ] );
961
- if ( _texture ) {
962
-
963
- let textureType = textureTypes[ j ].constructor.name;
964
- textureType = textureType.substring( 12, textureType.length );
965
- const texture = { type: textureType };
1136
+ textures.push( ...extractTextures( _material, textureTypes, doc ) );
966
1137
 
967
- const image = doc.getEmbeddedFileAsBase64( _texture.fileName );
1138
+ material.pbrSupported = _material.physicallyBased().supported;
968
1139
 
969
- texture.wrapU = _texture.wrapU;
970
- texture.wrapV = _texture.wrapV;
971
- texture.wrapW = _texture.wrapW;
972
- const uvw = _texture.uvwTransform.toFloatArray( true );
973
- texture.repeat = [ uvw[ 0 ], uvw[ 5 ] ];
1140
+ if ( material.pbrSupported ) {
974
1141
 
975
- if ( image ) {
976
-
977
- texture.image = 'data:image/png;base64,' + image;
978
-
979
- } else {
980
-
981
- self.postMessage( { type: 'warning', id: taskID, data: {
982
- message: `THREE.3DMLoader: Image for ${textureType} texture not embedded in file.`,
983
- type: 'missing resource'
984
- }
985
-
986
- } );
987
-
988
- texture.image = null;
989
-
990
- }
991
-
992
- textures.push( texture );
993
-
994
- _texture.delete();
995
-
996
- }
1142
+ textures.push( ...extractTextures( _material, pbrTextureTypes, doc ) );
1143
+ material.pbr = extractProperties( _material.physicallyBased() );
997
1144
 
998
1145
  }
999
1146
 
1000
1147
  material.textures = textures;
1001
1148
 
1002
- if ( _pbrMaterial.supported ) {
1003
-
1004
- for ( let j = 0; j < pbrTextureTypes.length; j ++ ) {
1005
-
1006
- const _texture = _material.getTexture( pbrTextureTypes[ j ] );
1007
- if ( _texture ) {
1008
-
1009
- const image = doc.getEmbeddedFileAsBase64( _texture.fileName );
1010
- let textureType = pbrTextureTypes[ j ].constructor.name;
1011
- textureType = textureType.substring( 12, textureType.length );
1012
- const texture = { type: textureType, image: 'data:image/png;base64,' + image };
1013
- textures.push( texture );
1014
-
1015
- _texture.delete();
1016
-
1017
- }
1018
-
1019
- }
1020
-
1021
- const pbMaterialProperties = extractProperties( _material.physicallyBased() );
1022
-
1023
- material = Object.assign( pbMaterialProperties, material );
1024
-
1025
- }
1026
-
1027
1149
  materials.push( material );
1028
1150
 
1029
1151
  _material.delete();
1030
- _pbrMaterial.delete();
1031
1152
 
1032
1153
  }
1033
1154
 
1034
1155
  // Handle layers
1035
1156
 
1036
- for ( let i = 0; i < doc.layers().count(); i ++ ) {
1157
+ for ( let i = 0; i < doc.layers().count; i ++ ) {
1037
1158
 
1038
1159
  const _layer = doc.layers().get( i );
1039
1160
  const layer = extractProperties( _layer );
@@ -1046,7 +1167,7 @@ function Rhino3dmWorker() {
1046
1167
 
1047
1168
  // Handle views
1048
1169
 
1049
- for ( let i = 0; i < doc.views().count(); i ++ ) {
1170
+ for ( let i = 0; i < doc.views().count; i ++ ) {
1050
1171
 
1051
1172
  const _view = doc.views().get( i );
1052
1173
  const view = extractProperties( _view );
@@ -1059,7 +1180,7 @@ function Rhino3dmWorker() {
1059
1180
 
1060
1181
  // Handle named views
1061
1182
 
1062
- for ( let i = 0; i < doc.namedViews().count(); i ++ ) {
1183
+ for ( let i = 0; i < doc.namedViews().count; i ++ ) {
1063
1184
 
1064
1185
  const _namedView = doc.namedViews().get( i );
1065
1186
  const namedView = extractProperties( _namedView );
@@ -1072,7 +1193,7 @@ function Rhino3dmWorker() {
1072
1193
 
1073
1194
  // Handle groups
1074
1195
 
1075
- for ( let i = 0; i < doc.groups().count(); i ++ ) {
1196
+ for ( let i = 0; i < doc.groups().count; i ++ ) {
1076
1197
 
1077
1198
  const _group = doc.groups().get( i );
1078
1199
  const group = extractProperties( _group );
@@ -1098,9 +1219,9 @@ function Rhino3dmWorker() {
1098
1219
  // Handle strings
1099
1220
  // console.log( `Document Strings Count: ${doc.strings().count()}` );
1100
1221
  // Note: doc.strings().documentUserTextCount() counts any doc.strings defined in a section
1101
- //console.log( `Document User Text Count: ${doc.strings().documentUserTextCount()}` );
1222
+ // console.log( `Document User Text Count: ${doc.strings().documentUserTextCount()}` );
1102
1223
 
1103
- const strings_count = doc.strings().count();
1224
+ const strings_count = doc.strings().count;
1104
1225
 
1105
1226
  for ( let i = 0; i < strings_count; i ++ ) {
1106
1227
 
@@ -1108,9 +1229,146 @@ function Rhino3dmWorker() {
1108
1229
 
1109
1230
  }
1110
1231
 
1232
+ // Handle Render Environments for Material Environment
1233
+
1234
+ // get the id of the active render environment skylight, which we'll use for environment texture
1235
+ const reflectionId = doc.settings().renderSettings().renderEnvironments.reflectionId
1236
+
1237
+ const rc = doc.renderContent()
1238
+
1239
+ let renderEnvironment = null
1240
+
1241
+ for( let i = 0; i < rc.count; i++ ) {
1242
+
1243
+ const content = rc.get(i)
1244
+
1245
+ switch( content.kind ) {
1246
+
1247
+ case 'environment':
1248
+
1249
+ const id = content.id
1250
+
1251
+ // there could be multiple render environments in a 3dm file
1252
+ if ( id !== reflectionId ) break;
1253
+
1254
+ const renderTexture = content.findChild( 'texture' )
1255
+ const fileName = renderTexture.fileName
1256
+
1257
+ for ( let j = 0; j < doc.embeddedFiles().count; j ++ ) {
1258
+
1259
+ const _fileName = doc.embeddedFiles().get( j ).fileName
1260
+
1261
+ if ( fileName === _fileName ) {
1262
+
1263
+ const background = doc.getEmbeddedFileAsBase64( fileName )
1264
+ const backgroundImage = 'data:image/png;base64,' + background
1265
+ renderEnvironment = { type: 'renderEnvironment', image: backgroundImage, name: fileName };
1266
+
1267
+ }
1268
+
1269
+ }
1270
+
1271
+ break;
1272
+
1273
+ }
1274
+
1275
+ }
1276
+
1277
+ // Handle Render Settings
1278
+
1279
+ const renderSettings = {
1280
+ ambientLight: doc.settings().renderSettings().ambientLight,
1281
+ backgroundColorTop: doc.settings().renderSettings().backgroundColorTop,
1282
+ backgroundColorBottom: doc.settings().renderSettings().backgroundColorBottom,
1283
+ useHiddenLights: doc.settings().renderSettings().useHiddenLights,
1284
+ depthCue: doc.settings().renderSettings().depthCue,
1285
+ flatShade: doc.settings().renderSettings().flatShade,
1286
+ renderBackFaces: doc.settings().renderSettings().renderBackFaces,
1287
+ renderPoints: doc.settings().renderSettings().renderPoints,
1288
+ renderCurves: doc.settings().renderSettings().renderCurves,
1289
+ renderIsoParams: doc.settings().renderSettings().renderIsoParams,
1290
+ renderMeshEdges: doc.settings().renderSettings().renderMeshEdges,
1291
+ renderAnnotations: doc.settings().renderSettings().renderAnnotations,
1292
+ useViewportSize: doc.settings().renderSettings().useViewportSize,
1293
+ scaleBackgroundToFit: doc.settings().renderSettings().scaleBackgroundToFit,
1294
+ transparentBackground: doc.settings().renderSettings().transparentBackground,
1295
+ imageDpi: doc.settings().renderSettings().imageDpi,
1296
+ shadowMapLevel: doc.settings().renderSettings().shadowMapLevel,
1297
+ namedView: doc.settings().renderSettings().namedView,
1298
+ snapShot: doc.settings().renderSettings().snapShot,
1299
+ specificViewport: doc.settings().renderSettings().specificViewport,
1300
+ groundPlane: extractProperties( doc.settings().renderSettings().groundPlane ),
1301
+ safeFrame: extractProperties( doc.settings().renderSettings().safeFrame ),
1302
+ dithering: extractProperties( doc.settings().renderSettings().dithering ),
1303
+ skylight: extractProperties( doc.settings().renderSettings().skylight ),
1304
+ linearWorkflow: extractProperties( doc.settings().renderSettings().linearWorkflow ),
1305
+ renderChannels: extractProperties( doc.settings().renderSettings().renderChannels ),
1306
+ sun: extractProperties( doc.settings().renderSettings().sun ),
1307
+ renderEnvironments: extractProperties( doc.settings().renderSettings().renderEnvironments ),
1308
+ postEffects: extractProperties( doc.settings().renderSettings().postEffects ),
1309
+
1310
+ }
1311
+
1111
1312
  doc.delete();
1112
1313
 
1113
- return { objects, materials, layers, views, namedViews, groups, strings, settings };
1314
+ return { objects, materials, layers, views, namedViews, groups, strings, settings, renderSettings, renderEnvironment };
1315
+
1316
+ }
1317
+
1318
+ function extractTextures( m, tTypes, d ) {
1319
+
1320
+ const textures = []
1321
+
1322
+ for ( let i = 0; i < tTypes.length; i ++ ) {
1323
+
1324
+ const _texture = m.getTexture( tTypes[ i ] );
1325
+ if ( _texture ) {
1326
+
1327
+ let textureType = tTypes[ i ].constructor.name;
1328
+ textureType = textureType.substring( 12, textureType.length );
1329
+ const texture = extractTextureData( _texture, textureType, d );
1330
+ textures.push( texture );
1331
+ _texture.delete();
1332
+
1333
+ }
1334
+
1335
+ }
1336
+
1337
+ return textures;
1338
+
1339
+ }
1340
+
1341
+ function extractTextureData( t, tType, d ) {
1342
+
1343
+ const texture = { type: tType };
1344
+
1345
+ const image = d.getEmbeddedFileAsBase64( t.fileName );
1346
+
1347
+ texture.wrapU = t.wrapU;
1348
+ texture.wrapV = t.wrapV;
1349
+ texture.wrapW = t.wrapW;
1350
+ const uvw = t.uvwTransform.toFloatArray( true );
1351
+
1352
+ texture.repeat = [ uvw[ 0 ], uvw[ 5 ] ];
1353
+
1354
+ if ( image ) {
1355
+
1356
+ texture.image = 'data:image/png;base64,' + image;
1357
+
1358
+ } else {
1359
+
1360
+ self.postMessage( { type: 'warning', id: taskID, data: {
1361
+ message: `THREE.3DMLoader: Image for ${tType} texture not embedded in file.`,
1362
+ type: 'missing resource'
1363
+ }
1364
+
1365
+ } );
1366
+
1367
+ texture.image = null;
1368
+
1369
+ }
1370
+
1371
+ return texture;
1114
1372
 
1115
1373
  }
1116
1374
 
@@ -1323,6 +1581,18 @@ function Rhino3dmWorker() {
1323
1581
 
1324
1582
  }
1325
1583
 
1584
+ if ( _attributes.decals().count > 0 ) {
1585
+
1586
+ self.postMessage( { type: 'warning', id: taskID, data: {
1587
+ message: `THREE.3DMLoader: No conversion exists for the decals associated with this object.`,
1588
+ type: 'no conversion',
1589
+ guid: _attributes.id
1590
+ }
1591
+
1592
+ } );
1593
+
1594
+ }
1595
+
1326
1596
  attributes.drawColor = _attributes.drawColor( doc );
1327
1597
 
1328
1598
  objectType = objectType.constructor.name;
@@ -1358,6 +1628,10 @@ function Rhino3dmWorker() {
1358
1628
 
1359
1629
  result[ property ] = { name: value.constructor.name, value: value.value };
1360
1630
 
1631
+ } else if ( typeof value === 'object' && value !== null ) {
1632
+
1633
+ result[ property ] = extractProperties( value );
1634
+
1361
1635
  } else {
1362
1636
 
1363
1637
  result[ property ] = value;
@@ -2544,7 +2544,7 @@ class GLTFParser {
2544
2544
 
2545
2545
  assignExtrasToUserData( result, json );
2546
2546
 
2547
- Promise.all( parser._invokeAll( function ( ext ) {
2547
+ return Promise.all( parser._invokeAll( function ( ext ) {
2548
2548
 
2549
2549
  return ext.afterRoot && ext.afterRoot( result );
2550
2550