super-three 0.161.0 → 0.163.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 (206) hide show
  1. package/build/three.cjs +822 -1332
  2. package/build/three.module.js +820 -1328
  3. package/build/three.module.min.js +1 -1
  4. package/examples/jsm/controls/DragControls.js +91 -30
  5. package/examples/jsm/controls/OrbitControls.js +32 -6
  6. package/examples/jsm/controls/TransformControls.js +9 -9
  7. package/examples/jsm/exporters/GLTFExporter.js +30 -3
  8. package/examples/jsm/exporters/USDZExporter.js +15 -0
  9. package/examples/jsm/geometries/TextGeometry.js +10 -2
  10. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  11. package/examples/jsm/interactive/InteractiveGroup.js +15 -25
  12. package/examples/jsm/libs/fflate.module.js +694 -496
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
  14. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
  15. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  16. package/examples/jsm/libs/tween.module.js +32 -14
  17. package/examples/jsm/lines/LineMaterial.js +0 -2
  18. package/examples/jsm/loaders/3DMLoader.js +13 -21
  19. package/examples/jsm/loaders/3MFLoader.js +2 -0
  20. package/examples/jsm/loaders/EXRLoader.js +89 -19
  21. package/examples/jsm/loaders/FBXLoader.js +1 -1
  22. package/examples/jsm/loaders/GLTFLoader.js +6 -0
  23. package/examples/jsm/loaders/KTX2Loader.js +2 -6
  24. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  25. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  26. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  27. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  28. package/examples/jsm/loaders/VOXLoader.js +9 -2
  29. package/examples/jsm/loaders/VRMLLoader.js +6 -2
  30. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  31. package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
  32. package/examples/jsm/nodes/Nodes.js +15 -8
  33. package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
  34. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  35. package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
  36. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  37. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
  39. package/examples/jsm/nodes/accessors/MorphNode.js +20 -10
  40. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  41. package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
  42. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +18 -0
  45. package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
  46. package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
  47. package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
  48. package/examples/jsm/nodes/code/CodeNode.js +6 -0
  49. package/examples/jsm/nodes/core/AssignNode.js +68 -12
  50. package/examples/jsm/nodes/core/Node.js +67 -6
  51. package/examples/jsm/nodes/core/NodeBuilder.js +23 -24
  52. package/examples/jsm/nodes/core/NodeFrame.js +8 -8
  53. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  54. package/examples/jsm/nodes/core/TempNode.js +1 -1
  55. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  56. package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
  57. package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
  58. package/examples/jsm/nodes/display/PassNode.js +17 -1
  59. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  60. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  61. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  62. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  63. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  64. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  65. package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
  66. package/examples/jsm/nodes/materials/NodeMaterial.js +70 -17
  67. package/examples/jsm/nodes/math/CondNode.js +42 -7
  68. package/examples/jsm/nodes/math/MathNode.js +20 -0
  69. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  70. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  71. package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
  72. package/examples/jsm/nodes/utils/ArrayElementNode.js +0 -6
  73. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  74. package/examples/jsm/nodes/utils/LoopNode.js +2 -0
  75. package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
  76. package/examples/jsm/objects/QuadMesh.js +7 -23
  77. package/examples/jsm/physics/RapierPhysics.js +4 -4
  78. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  79. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  80. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  81. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  82. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  83. package/examples/jsm/renderers/common/Animation.js +3 -0
  84. package/examples/jsm/renderers/common/Background.js +3 -3
  85. package/examples/jsm/renderers/common/ClippingContext.js +165 -0
  86. package/examples/jsm/renderers/common/Info.js +11 -19
  87. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  88. package/examples/jsm/renderers/common/RenderContext.js +3 -1
  89. package/examples/jsm/renderers/common/RenderContexts.js +2 -13
  90. package/examples/jsm/renderers/common/RenderObject.js +46 -3
  91. package/examples/jsm/renderers/common/RenderObjects.js +2 -0
  92. package/examples/jsm/renderers/common/Renderer.js +113 -39
  93. package/examples/jsm/renderers/common/StorageBufferAttribute.js +2 -2
  94. package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
  95. package/examples/jsm/renderers/common/Textures.js +3 -13
  96. package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
  97. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
  98. package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
  99. package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
  100. package/examples/jsm/renderers/common/nodes/Nodes.js +6 -18
  101. package/examples/jsm/renderers/webgl/WebGLBackend.js +174 -30
  102. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
  103. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +136 -11
  104. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +8 -2
  105. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  106. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +90 -0
  107. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -1
  108. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
  109. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
  110. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +67 -37
  111. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +20 -43
  112. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +32 -1
  113. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  114. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +94 -20
  115. package/examples/jsm/shaders/OutputShader.js +4 -0
  116. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  117. package/examples/jsm/utils/SkeletonUtils.js +14 -3
  118. package/examples/jsm/utils/TextureUtils.js +1 -1
  119. package/examples/jsm/webxr/VRButton.js +13 -5
  120. package/examples/jsm/webxr/XRButton.js +0 -1
  121. package/examples/jsm/webxr/XRControllerModelFactory.js +8 -0
  122. package/package.json +4 -3
  123. package/src/Three.Legacy.js +20 -0
  124. package/src/Three.js +0 -2
  125. package/src/animation/AnimationClip.js +1 -1
  126. package/src/constants.js +4 -7
  127. package/src/core/BufferAttribute.js +0 -11
  128. package/src/core/BufferGeometry.js +23 -29
  129. package/src/core/Object3D.js +21 -7
  130. package/src/core/Raycaster.js +18 -4
  131. package/src/core/RenderTarget.js +44 -21
  132. package/src/extras/PMREMGenerator.js +11 -0
  133. package/src/extras/curves/EllipseCurve.js +2 -2
  134. package/src/helpers/SpotLightHelper.js +18 -1
  135. package/src/loaders/DataTextureLoader.js +0 -4
  136. package/src/loaders/MaterialLoader.js +1 -0
  137. package/src/loaders/ObjectLoader.js +4 -1
  138. package/src/materials/Material.js +2 -1
  139. package/src/materials/MeshBasicMaterial.js +3 -0
  140. package/src/materials/MeshLambertMaterial.js +3 -0
  141. package/src/materials/MeshPhongMaterial.js +3 -0
  142. package/src/materials/MeshStandardMaterial.js +3 -0
  143. package/src/materials/ShaderMaterial.js +0 -4
  144. package/src/math/Quaternion.js +13 -12
  145. package/src/math/Spherical.js +4 -5
  146. package/src/math/Vector3.js +7 -7
  147. package/src/objects/BatchedMesh.js +4 -3
  148. package/src/objects/InstancedMesh.js +63 -0
  149. package/src/objects/Mesh.js +0 -1
  150. package/src/renderers/WebGLCubeRenderTarget.js +1 -10
  151. package/src/renderers/WebGLRenderer.js +70 -136
  152. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
  153. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  154. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  155. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  156. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  157. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  158. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  159. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
  160. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  161. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
  162. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  163. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +23 -0
  164. package/src/renderers/shaders/ShaderChunk.js +2 -0
  165. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
  166. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  167. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  168. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
  169. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -0
  170. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
  171. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -0
  172. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -0
  173. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
  174. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
  175. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
  176. package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
  177. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  178. package/src/renderers/shaders/ShaderLib.js +3 -2
  179. package/src/renderers/shaders/UniformsLib.js +1 -0
  180. package/src/renderers/shaders/UniformsUtils.js +10 -1
  181. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  182. package/src/renderers/webgl/WebGLBackground.js +18 -0
  183. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  184. package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
  185. package/src/renderers/webgl/WebGLCapabilities.js +2 -12
  186. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  187. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  188. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
  189. package/src/renderers/webgl/WebGLLights.js +6 -32
  190. package/src/renderers/webgl/WebGLMaterials.js +26 -4
  191. package/src/renderers/webgl/WebGLMorphtargets.js +79 -210
  192. package/src/renderers/webgl/WebGLProgram.js +30 -48
  193. package/src/renderers/webgl/WebGLPrograms.js +5 -14
  194. package/src/renderers/webgl/WebGLRenderStates.js +8 -6
  195. package/src/renderers/webgl/WebGLState.js +21 -75
  196. package/src/renderers/webgl/WebGLTextures.js +143 -275
  197. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  198. package/src/renderers/webgl/WebGLUtils.js +6 -57
  199. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  200. package/src/renderers/webxr/WebXRManager.js +2 -2
  201. package/src/scenes/Scene.js +14 -0
  202. package/src/textures/Texture.js +6 -24
  203. package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
  204. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  205. package/src/renderers/WebGL1Renderer.js +0 -7
  206. package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
@@ -20,24 +20,26 @@ function WebGLCubeUVMaps( renderer ) {
20
20
 
21
21
  if ( isEquirectMap || isCubeMap ) {
22
22
 
23
- if ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {
23
+ let renderTarget = cubeUVmaps.get( texture );
24
24
 
25
- texture.needsPMREMUpdate = false;
25
+ const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;
26
26
 
27
- let renderTarget = cubeUVmaps.get( texture );
27
+ if ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {
28
28
 
29
29
  if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );
30
30
 
31
31
  renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );
32
+ renderTarget.texture.pmremVersion = texture.pmremVersion;
33
+
32
34
  cubeUVmaps.set( texture, renderTarget );
33
35
 
34
36
  return renderTarget.texture;
35
37
 
36
38
  } else {
37
39
 
38
- if ( cubeUVmaps.has( texture ) ) {
40
+ if ( renderTarget !== undefined ) {
39
41
 
40
- return cubeUVmaps.get( texture ).texture;
42
+ return renderTarget.texture;
41
43
 
42
44
  } else {
43
45
 
@@ -47,7 +49,9 @@ function WebGLCubeUVMaps( renderer ) {
47
49
 
48
50
  if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );
49
51
 
50
- const renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );
52
+ renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );
53
+ renderTarget.texture.pmremVersion = texture.pmremVersion;
54
+
51
55
  cubeUVmaps.set( texture, renderTarget );
52
56
 
53
57
  texture.addEventListener( 'dispose', onTextureDispose );
@@ -49,29 +49,14 @@ function WebGLExtensions( gl ) {
49
49
 
50
50
  },
51
51
 
52
- init: function ( capabilities ) {
53
-
54
- if ( capabilities.isWebGL2 ) {
55
-
56
- getExtension( 'EXT_color_buffer_float' );
57
- getExtension( 'WEBGL_clip_cull_distance' );
58
-
59
- } else {
60
-
61
- getExtension( 'WEBGL_depth_texture' );
62
- getExtension( 'OES_texture_float' );
63
- getExtension( 'OES_texture_half_float' );
64
- getExtension( 'OES_texture_half_float_linear' );
65
- getExtension( 'OES_standard_derivatives' );
66
- getExtension( 'OES_element_index_uint' );
67
- getExtension( 'OES_vertex_array_object' );
68
- getExtension( 'ANGLE_instanced_arrays' );
69
-
70
- }
52
+ init: function () {
71
53
 
54
+ getExtension( 'EXT_color_buffer_float' );
55
+ getExtension( 'WEBGL_clip_cull_distance' );
72
56
  getExtension( 'OES_texture_float_linear' );
73
57
  getExtension( 'EXT_color_buffer_half_float' );
74
58
  getExtension( 'WEBGL_multisampled_render_to_texture' );
59
+ getExtension( 'WEBGL_render_shared_exponent' );
75
60
 
76
61
  },
77
62
 
@@ -1,6 +1,4 @@
1
- function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
2
-
3
- const isWebGL2 = capabilities.isWebGL2;
1
+ function WebGLIndexedBufferRenderer( gl, extensions, info ) {
4
2
 
5
3
  let mode;
6
4
 
@@ -31,28 +29,7 @@ function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
31
29
 
32
30
  if ( primcount === 0 ) return;
33
31
 
34
- let extension, methodName;
35
-
36
- if ( isWebGL2 ) {
37
-
38
- extension = gl;
39
- methodName = 'drawElementsInstanced';
40
-
41
- } else {
42
-
43
- extension = extensions.get( 'ANGLE_instanced_arrays' );
44
- methodName = 'drawElementsInstancedANGLE';
45
-
46
- if ( extension === null ) {
47
-
48
- console.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );
49
- return;
50
-
51
- }
52
-
53
- }
54
-
55
- extension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );
32
+ gl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );
56
33
 
57
34
  info.update( count, mode, primcount );
58
35
 
@@ -63,6 +40,7 @@ function WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {
63
40
  if ( drawCount === 0 ) return;
64
41
 
65
42
  const extension = extensions.get( 'WEBGL_multi_draw' );
43
+
66
44
  if ( extension === null ) {
67
45
 
68
46
  for ( let i = 0; i < drawCount; i ++ ) {
@@ -150,7 +150,7 @@ function shadowCastingAndTexturingLightsFirst( lightA, lightB ) {
150
150
 
151
151
  }
152
152
 
153
- function WebGLLights( extensions, capabilities ) {
153
+ function WebGLLights( extensions ) {
154
154
 
155
155
  const cache = new UniformsCache();
156
156
 
@@ -399,41 +399,15 @@ function WebGLLights( extensions, capabilities ) {
399
399
 
400
400
  if ( rectAreaLength > 0 ) {
401
401
 
402
- if ( capabilities.isWebGL2 ) {
402
+ if ( extensions.has( 'OES_texture_float_linear' ) === true ) {
403
403
 
404
- // WebGL 2
405
-
406
- if ( extensions.has( 'OES_texture_float_linear' ) === true ) {
407
-
408
- state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
409
- state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
410
-
411
- } else {
412
-
413
- state.rectAreaLTC1 = UniformsLib.LTC_HALF_1;
414
- state.rectAreaLTC2 = UniformsLib.LTC_HALF_2;
415
-
416
- }
404
+ state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
405
+ state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
417
406
 
418
407
  } else {
419
408
 
420
- // WebGL 1
421
-
422
- if ( extensions.has( 'OES_texture_float_linear' ) === true ) {
423
-
424
- state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
425
- state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
426
-
427
- } else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {
428
-
429
- state.rectAreaLTC1 = UniformsLib.LTC_HALF_1;
430
- state.rectAreaLTC2 = UniformsLib.LTC_HALF_2;
431
-
432
- } else {
433
-
434
- console.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );
435
-
436
- }
409
+ state.rectAreaLTC1 = UniformsLib.LTC_HALF_1;
410
+ state.rectAreaLTC2 = UniformsLib.LTC_HALF_2;
437
411
 
438
412
  }
439
413
 
@@ -1,5 +1,10 @@
1
1
  import { BackSide } from '../../constants.js';
2
2
  import { getUnlitUniformColorSpace } from '../shaders/UniformsUtils.js';
3
+ import { Euler } from '../../math/Euler.js';
4
+ import { Matrix4 } from '../../math/Matrix4.js';
5
+
6
+ const _e1 = /*@__PURE__*/ new Euler();
7
+ const _m1 = /*@__PURE__*/ new Matrix4();
3
8
 
4
9
  function WebGLMaterials( renderer, properties ) {
5
10
 
@@ -209,12 +214,30 @@ function WebGLMaterials( renderer, properties ) {
209
214
 
210
215
  }
211
216
 
212
- const envMap = properties.get( material ).envMap;
217
+ const materialProperties = properties.get( material );
218
+
219
+ const envMap = materialProperties.envMap;
220
+ const envMapRotation = materialProperties.envMapRotation;
213
221
 
214
222
  if ( envMap ) {
215
223
 
216
224
  uniforms.envMap.value = envMap;
217
225
 
226
+ _e1.copy( envMapRotation );
227
+
228
+ // accommodate left-handed frame
229
+ _e1.x *= - 1; _e1.y *= - 1; _e1.z *= - 1;
230
+
231
+ if ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {
232
+
233
+ // environment maps which are not cube render targets or PMREMs follow a different convention
234
+ _e1.y *= - 1;
235
+ _e1.z *= - 1;
236
+
237
+ }
238
+
239
+ uniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );
240
+
218
241
  uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;
219
242
 
220
243
  uniforms.reflectivity.value = material.reflectivity;
@@ -370,11 +393,10 @@ function WebGLMaterials( renderer, properties ) {
370
393
 
371
394
  }
372
395
 
373
- const envMap = properties.get( material ).envMap;
374
-
375
- if ( envMap ) {
396
+ if ( material.envMap ) {
376
397
 
377
398
  //uniforms.envMap.value = material.envMap; // part of uniforms common
399
+
378
400
  uniforms.envMapIntensity.value = material.envMapIntensity;
379
401
 
380
402
  }
@@ -3,289 +3,158 @@ import { DataArrayTexture } from '../../textures/DataArrayTexture.js';
3
3
  import { Vector4 } from '../../math/Vector4.js';
4
4
  import { Vector2 } from '../../math/Vector2.js';
5
5
 
6
- function numericalSort( a, b ) {
7
-
8
- return a[ 0 ] - b[ 0 ];
9
-
10
- }
11
-
12
- function absNumericalSort( a, b ) {
13
-
14
- return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
15
-
16
- }
17
-
18
6
  function WebGLMorphtargets( gl, capabilities, textures ) {
19
7
 
20
- const influencesList = {};
21
- const morphInfluences = new Float32Array( 8 );
22
8
  const morphTextures = new WeakMap();
23
9
  const morph = new Vector4();
24
10
 
25
- const workInfluences = [];
26
-
27
- for ( let i = 0; i < 8; i ++ ) {
28
-
29
- workInfluences[ i ] = [ i, 0 ];
30
-
31
- }
32
-
33
11
  function update( object, geometry, program ) {
34
12
 
35
13
  const objectInfluences = object.morphTargetInfluences;
36
14
 
37
- if ( capabilities.isWebGL2 === true ) {
38
-
39
- // instead of using attributes, the WebGL 2 code path encodes morph targets
40
- // into an array of data textures. Each layer represents a single morph target.
41
-
42
- const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
43
- const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
44
-
45
- let entry = morphTextures.get( geometry );
46
-
47
- if ( entry === undefined || entry.count !== morphTargetsCount ) {
48
-
49
- if ( entry !== undefined ) entry.texture.dispose();
15
+ // instead of using attributes, the WebGL 2 code path encodes morph targets
16
+ // into an array of data textures. Each layer represents a single morph target.
50
17
 
51
- const hasMorphPosition = geometry.morphAttributes.position !== undefined;
52
- const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
53
- const hasMorphColors = geometry.morphAttributes.color !== undefined;
18
+ const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
19
+ const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
54
20
 
55
- const morphTargets = geometry.morphAttributes.position || [];
56
- const morphNormals = geometry.morphAttributes.normal || [];
57
- const morphColors = geometry.morphAttributes.color || [];
21
+ let entry = morphTextures.get( geometry );
58
22
 
59
- let vertexDataCount = 0;
23
+ if ( entry === undefined || entry.count !== morphTargetsCount ) {
60
24
 
61
- if ( hasMorphPosition === true ) vertexDataCount = 1;
62
- if ( hasMorphNormals === true ) vertexDataCount = 2;
63
- if ( hasMorphColors === true ) vertexDataCount = 3;
25
+ if ( entry !== undefined ) entry.texture.dispose();
64
26
 
65
- let width = geometry.attributes.position.count * vertexDataCount;
66
- let height = 1;
27
+ const hasMorphPosition = geometry.morphAttributes.position !== undefined;
28
+ const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
29
+ const hasMorphColors = geometry.morphAttributes.color !== undefined;
67
30
 
68
- if ( width > capabilities.maxTextureSize ) {
31
+ const morphTargets = geometry.morphAttributes.position || [];
32
+ const morphNormals = geometry.morphAttributes.normal || [];
33
+ const morphColors = geometry.morphAttributes.color || [];
69
34
 
70
- height = Math.ceil( width / capabilities.maxTextureSize );
71
- width = capabilities.maxTextureSize;
35
+ let vertexDataCount = 0;
72
36
 
73
- }
74
-
75
- const buffer = new Float32Array( width * height * 4 * morphTargetsCount );
37
+ if ( hasMorphPosition === true ) vertexDataCount = 1;
38
+ if ( hasMorphNormals === true ) vertexDataCount = 2;
39
+ if ( hasMorphColors === true ) vertexDataCount = 3;
76
40
 
77
- const texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );
78
- texture.type = FloatType;
79
- texture.needsUpdate = true;
41
+ let width = geometry.attributes.position.count * vertexDataCount;
42
+ let height = 1;
80
43
 
81
- // fill buffer
44
+ if ( width > capabilities.maxTextureSize ) {
82
45
 
83
- const vertexDataStride = vertexDataCount * 4;
46
+ height = Math.ceil( width / capabilities.maxTextureSize );
47
+ width = capabilities.maxTextureSize;
84
48
 
85
- for ( let i = 0; i < morphTargetsCount; i ++ ) {
49
+ }
86
50
 
87
- const morphTarget = morphTargets[ i ];
88
- const morphNormal = morphNormals[ i ];
89
- const morphColor = morphColors[ i ];
51
+ const buffer = new Float32Array( width * height * 4 * morphTargetsCount );
90
52
 
91
- const offset = width * height * 4 * i;
53
+ const texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );
54
+ texture.type = FloatType;
55
+ texture.needsUpdate = true;
92
56
 
93
- for ( let j = 0; j < morphTarget.count; j ++ ) {
57
+ // fill buffer
94
58
 
95
- const stride = j * vertexDataStride;
59
+ const vertexDataStride = vertexDataCount * 4;
96
60
 
97
- if ( hasMorphPosition === true ) {
61
+ for ( let i = 0; i < morphTargetsCount; i ++ ) {
98
62
 
99
- morph.fromBufferAttribute( morphTarget, j );
63
+ const morphTarget = morphTargets[ i ];
64
+ const morphNormal = morphNormals[ i ];
65
+ const morphColor = morphColors[ i ];
100
66
 
101
- buffer[ offset + stride + 0 ] = morph.x;
102
- buffer[ offset + stride + 1 ] = morph.y;
103
- buffer[ offset + stride + 2 ] = morph.z;
104
- buffer[ offset + stride + 3 ] = 0;
67
+ const offset = width * height * 4 * i;
105
68
 
106
- }
69
+ for ( let j = 0; j < morphTarget.count; j ++ ) {
107
70
 
108
- if ( hasMorphNormals === true ) {
71
+ const stride = j * vertexDataStride;
109
72
 
110
- morph.fromBufferAttribute( morphNormal, j );
73
+ if ( hasMorphPosition === true ) {
111
74
 
112
- buffer[ offset + stride + 4 ] = morph.x;
113
- buffer[ offset + stride + 5 ] = morph.y;
114
- buffer[ offset + stride + 6 ] = morph.z;
115
- buffer[ offset + stride + 7 ] = 0;
75
+ morph.fromBufferAttribute( morphTarget, j );
116
76
 
117
- }
77
+ buffer[ offset + stride + 0 ] = morph.x;
78
+ buffer[ offset + stride + 1 ] = morph.y;
79
+ buffer[ offset + stride + 2 ] = morph.z;
80
+ buffer[ offset + stride + 3 ] = 0;
118
81
 
119
- if ( hasMorphColors === true ) {
82
+ }
120
83
 
121
- morph.fromBufferAttribute( morphColor, j );
84
+ if ( hasMorphNormals === true ) {
122
85
 
123
- buffer[ offset + stride + 8 ] = morph.x;
124
- buffer[ offset + stride + 9 ] = morph.y;
125
- buffer[ offset + stride + 10 ] = morph.z;
126
- buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;
86
+ morph.fromBufferAttribute( morphNormal, j );
127
87
 
128
- }
88
+ buffer[ offset + stride + 4 ] = morph.x;
89
+ buffer[ offset + stride + 5 ] = morph.y;
90
+ buffer[ offset + stride + 6 ] = morph.z;
91
+ buffer[ offset + stride + 7 ] = 0;
129
92
 
130
93
  }
131
94
 
132
- }
133
-
134
- entry = {
135
- count: morphTargetsCount,
136
- texture: texture,
137
- size: new Vector2( width, height )
138
- };
95
+ if ( hasMorphColors === true ) {
139
96
 
140
- morphTextures.set( geometry, entry );
97
+ morph.fromBufferAttribute( morphColor, j );
141
98
 
142
- function disposeTexture() {
99
+ buffer[ offset + stride + 8 ] = morph.x;
100
+ buffer[ offset + stride + 9 ] = morph.y;
101
+ buffer[ offset + stride + 10 ] = morph.z;
102
+ buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;
143
103
 
144
- texture.dispose();
145
-
146
- morphTextures.delete( geometry );
147
-
148
- geometry.removeEventListener( 'dispose', disposeTexture );
104
+ }
149
105
 
150
106
  }
151
107
 
152
- geometry.addEventListener( 'dispose', disposeTexture );
153
-
154
108
  }
155
109
 
156
- //
157
-
158
- let morphInfluencesSum = 0;
159
-
160
- for ( let i = 0; i < objectInfluences.length; i ++ ) {
161
-
162
- morphInfluencesSum += objectInfluences[ i ];
163
-
164
- }
165
-
166
- const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
167
-
168
- program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
169
- program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
170
-
171
- program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );
172
- program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );
173
-
174
-
175
- } else {
176
-
177
- // When object doesn't have morph target influences defined, we treat it as a 0-length array
178
- // This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences
179
-
180
- const length = objectInfluences === undefined ? 0 : objectInfluences.length;
110
+ entry = {
111
+ count: morphTargetsCount,
112
+ texture: texture,
113
+ size: new Vector2( width, height )
114
+ };
181
115
 
182
- let influences = influencesList[ geometry.id ];
116
+ morphTextures.set( geometry, entry );
183
117
 
184
- if ( influences === undefined || influences.length !== length ) {
118
+ function disposeTexture() {
185
119
 
186
- // initialise list
120
+ texture.dispose();
187
121
 
188
- influences = [];
122
+ morphTextures.delete( geometry );
189
123
 
190
- for ( let i = 0; i < length; i ++ ) {
191
-
192
- influences[ i ] = [ i, 0 ];
193
-
194
- }
195
-
196
- influencesList[ geometry.id ] = influences;
197
-
198
- }
199
-
200
- // Collect influences
201
-
202
- for ( let i = 0; i < length; i ++ ) {
203
-
204
- const influence = influences[ i ];
205
-
206
- influence[ 0 ] = i;
207
- influence[ 1 ] = objectInfluences[ i ];
124
+ geometry.removeEventListener( 'dispose', disposeTexture );
208
125
 
209
126
  }
210
127
 
211
- influences.sort( absNumericalSort );
212
-
213
- for ( let i = 0; i < 8; i ++ ) {
214
-
215
- if ( i < length && influences[ i ][ 1 ] ) {
128
+ geometry.addEventListener( 'dispose', disposeTexture );
216
129
 
217
- workInfluences[ i ][ 0 ] = influences[ i ][ 0 ];
218
- workInfluences[ i ][ 1 ] = influences[ i ][ 1 ];
219
-
220
- } else {
221
-
222
- workInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;
223
- workInfluences[ i ][ 1 ] = 0;
224
-
225
- }
130
+ }
226
131
 
227
- }
132
+ //
133
+ if ( object.isInstancedMesh === true && object.morphTexture !== null ) {
228
134
 
229
- workInfluences.sort( numericalSort );
135
+ program.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );
230
136
 
231
- const morphTargets = geometry.morphAttributes.position;
232
- const morphNormals = geometry.morphAttributes.normal;
137
+ } else {
233
138
 
234
139
  let morphInfluencesSum = 0;
235
140
 
236
- for ( let i = 0; i < 8; i ++ ) {
237
-
238
- const influence = workInfluences[ i ];
239
- const index = influence[ 0 ];
240
- const value = influence[ 1 ];
241
-
242
- if ( index !== Number.MAX_SAFE_INTEGER && value ) {
243
-
244
- if ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {
245
-
246
- geometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );
247
-
248
- }
249
-
250
- if ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {
251
-
252
- geometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );
253
-
254
- }
255
-
256
- morphInfluences[ i ] = value;
257
- morphInfluencesSum += value;
258
-
259
- } else {
260
-
261
- if ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {
262
-
263
- geometry.deleteAttribute( 'morphTarget' + i );
264
-
265
- }
266
-
267
- if ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {
268
-
269
- geometry.deleteAttribute( 'morphNormal' + i );
270
-
271
- }
272
-
273
- morphInfluences[ i ] = 0;
141
+ for ( let i = 0; i < objectInfluences.length; i ++ ) {
274
142
 
275
- }
143
+ morphInfluencesSum += objectInfluences[ i ];
276
144
 
277
145
  }
278
146
 
279
- // GLSL shader uses formula baseinfluence * base + sum(target * influence)
280
- // This allows us to switch between absolute morphs and relative morphs without changing shader code
281
- // When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)
282
147
  const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
283
148
 
149
+
284
150
  program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
285
- program.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );
151
+ program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
286
152
 
287
153
  }
288
154
 
155
+ program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );
156
+ program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );
157
+
289
158
  }
290
159
 
291
160
  return {