super-three 0.163.0 → 0.164.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 (114) hide show
  1. package/build/three.cjs +473 -245
  2. package/build/three.module.js +473 -245
  3. package/build/three.module.min.js +2 -2
  4. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  5. package/examples/jsm/exporters/GLTFExporter.js +45 -1
  6. package/examples/jsm/exporters/USDZExporter.js +7 -1
  7. package/examples/jsm/libs/draco/README.md +2 -2
  8. package/examples/jsm/loaders/EXRLoader.js +283 -99
  9. package/examples/jsm/loaders/GLTFLoader.js +53 -0
  10. package/examples/jsm/loaders/KTX2Loader.js +3 -6
  11. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  12. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  13. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  14. package/examples/jsm/math/Octree.js +26 -20
  15. package/examples/jsm/nodes/Nodes.js +4 -3
  16. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  17. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  18. package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
  19. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  20. package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
  21. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  22. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  23. package/examples/jsm/nodes/core/Node.js +8 -0
  24. package/examples/jsm/nodes/core/NodeBuilder.js +5 -9
  25. package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
  26. package/examples/jsm/nodes/core/PropertyNode.js +10 -0
  27. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  28. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  29. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  30. package/examples/jsm/nodes/display/ViewportNode.js +4 -2
  31. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  32. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  33. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  34. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  35. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  36. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  37. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
  38. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  39. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +18 -4
  40. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  41. package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
  42. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  43. package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
  44. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  45. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  46. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
  47. package/examples/jsm/nodes/materials/Materials.js +1 -0
  48. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  49. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  50. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
  51. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  52. package/examples/jsm/nodes/materials/NodeMaterial.js +31 -41
  53. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  54. package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
  55. package/examples/jsm/nodes/shadernode/ShaderNode.js +2 -8
  56. package/examples/jsm/physics/JoltPhysics.js +281 -0
  57. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  58. package/examples/jsm/renderers/common/Background.js +3 -3
  59. package/examples/jsm/renderers/common/ClippingContext.js +1 -1
  60. package/examples/jsm/renderers/common/RenderList.js +1 -1
  61. package/examples/jsm/renderers/common/RenderObject.js +43 -1
  62. package/examples/jsm/renderers/common/Renderer.js +129 -14
  63. package/examples/jsm/renderers/common/Textures.js +1 -1
  64. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
  65. package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
  66. package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
  67. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
  68. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +6 -0
  69. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +21 -7
  70. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
  71. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +33 -45
  72. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +16 -1
  73. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
  74. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  75. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  76. package/examples/jsm/utils/SceneUtils.js +60 -1
  77. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  78. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  79. package/package.json +1 -1
  80. package/src/constants.js +1 -1
  81. package/src/core/RenderTarget.js +8 -0
  82. package/src/extras/PMREMGenerator.js +12 -11
  83. package/src/loaders/FileLoader.js +1 -1
  84. package/src/loaders/MaterialLoader.js +1 -0
  85. package/src/materials/Material.js +2 -0
  86. package/src/materials/MeshPhysicalMaterial.js +20 -0
  87. package/src/objects/BatchedMesh.js +23 -0
  88. package/src/objects/Line.js +66 -43
  89. package/src/renderers/WebGLRenderer.js +92 -61
  90. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  91. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  92. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  93. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  94. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  95. package/src/renderers/shaders/ShaderChunk.js +0 -2
  96. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  97. package/src/renderers/shaders/ShaderLib.js +1 -0
  98. package/src/renderers/webgl/WebGLBackground.js +18 -3
  99. package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
  100. package/src/renderers/webgl/WebGLCapabilities.js +33 -1
  101. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
  102. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  103. package/src/renderers/webgl/WebGLProgram.js +3 -5
  104. package/src/renderers/webgl/WebGLPrograms.js +5 -0
  105. package/src/renderers/webgl/WebGLRenderStates.js +6 -2
  106. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  107. package/src/renderers/webgl/WebGLTextures.js +68 -60
  108. package/src/renderers/webgl/WebGLUtils.js +3 -21
  109. package/src/renderers/webxr/WebXRManager.js +2 -4
  110. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
  111. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  112. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
  113. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  114. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -14,7 +14,6 @@ import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js';
14
14
  import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
15
15
  import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
16
16
  import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
17
- import WebGPU from '../../capabilities/WebGPU.js';
18
17
 
19
18
  //
20
19
 
@@ -45,7 +44,6 @@ class WebGPUBackend extends Backend {
45
44
 
46
45
  this.trackTimestamp = ( parameters.trackTimestamp === true );
47
46
 
48
- this.adapter = null;
49
47
  this.device = null;
50
48
  this.context = null;
51
49
  this.colorBuffer = null;
@@ -68,44 +66,55 @@ class WebGPUBackend extends Backend {
68
66
 
69
67
  const parameters = this.parameters;
70
68
 
71
- const adapterOptions = {
72
- powerPreference: parameters.powerPreference
73
- };
69
+ // create the device if it is not passed with parameters
70
+
71
+ let device;
74
72
 
75
- const adapter = await navigator.gpu.requestAdapter( adapterOptions );
73
+ if ( parameters.device === undefined ) {
76
74
 
77
- if ( adapter === null ) {
75
+ const adapterOptions = {
76
+ powerPreference: parameters.powerPreference
77
+ };
78
78
 
79
- throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' );
79
+ const adapter = await navigator.gpu.requestAdapter( adapterOptions );
80
80
 
81
- }
81
+ if ( adapter === null ) {
82
+
83
+ throw new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' );
84
+
85
+ }
86
+
87
+ // feature support
82
88
 
83
- // feature support
89
+ const features = Object.values( GPUFeatureName );
84
90
 
85
- const features = Object.values( GPUFeatureName );
91
+ const supportedFeatures = [];
86
92
 
87
- const supportedFeatures = [];
93
+ for ( const name of features ) {
88
94
 
89
- for ( const name of features ) {
95
+ if ( adapter.features.has( name ) ) {
90
96
 
91
- if ( adapter.features.has( name ) ) {
97
+ supportedFeatures.push( name );
92
98
 
93
- supportedFeatures.push( name );
99
+ }
94
100
 
95
101
  }
96
102
 
97
- }
103
+ const deviceDescriptor = {
104
+ requiredFeatures: supportedFeatures,
105
+ requiredLimits: parameters.requiredLimits
106
+ };
98
107
 
99
- const deviceDescriptor = {
100
- requiredFeatures: supportedFeatures,
101
- requiredLimits: parameters.requiredLimits
102
- };
108
+ device = await adapter.requestDevice( deviceDescriptor );
103
109
 
104
- const device = await adapter.requestDevice( deviceDescriptor );
110
+ } else {
111
+
112
+ device = parameters.device;
113
+
114
+ }
105
115
 
106
116
  const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' );
107
117
 
108
- this.adapter = adapter;
109
118
  this.device = device;
110
119
  this.context = context;
111
120
 
@@ -871,7 +880,7 @@ class WebGPUBackend extends Backend {
871
880
 
872
881
  // draw
873
882
 
874
- const drawRange = geometry.drawRange;
883
+ const drawRange = renderObject.drawRange;
875
884
  const firstVertex = drawRange.start;
876
885
 
877
886
  const instanceCount = this.getInstanceCount( renderObject );
@@ -1220,27 +1229,9 @@ class WebGPUBackend extends Backend {
1220
1229
 
1221
1230
  }
1222
1231
 
1223
- async hasFeatureAsync( name ) {
1224
-
1225
- const adapter = this.adapter || await WebGPU.getStaticAdapter();
1226
-
1227
- //
1228
-
1229
- return adapter.features.has( name );
1230
-
1231
- }
1232
-
1233
1232
  hasFeature( name ) {
1234
1233
 
1235
- if ( ! this.adapter ) {
1236
-
1237
- console.warn( 'WebGPUBackend: WebGPU adapter has not been initialized yet. Please use hasFeatureAsync instead' );
1238
-
1239
- return false;
1240
-
1241
- }
1242
-
1243
- return this.adapter.features.has( name );
1234
+ return this.device.features.has( name );
1244
1235
 
1245
1236
  }
1246
1237
 
@@ -1272,9 +1263,6 @@ class WebGPUBackend extends Backend {
1272
1263
 
1273
1264
  }
1274
1265
 
1275
-
1276
-
1277
-
1278
1266
  copyFramebufferToTexture( texture, renderContext ) {
1279
1267
 
1280
1268
  const renderContextData = this.get( renderContext );
@@ -254,6 +254,21 @@ class WGSLNodeBuilder extends NodeBuilder {
254
254
 
255
255
  }
256
256
 
257
+ generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, shaderStage = this.shaderStage ) {
258
+
259
+ if ( shaderStage === 'fragment' ) {
260
+
261
+ // TODO handle i32 or u32 --> uvSnippet, array_index: A, ddx, ddy
262
+ return `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;
263
+
264
+ } else {
265
+
266
+ console.error( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );
267
+
268
+ }
269
+
270
+ }
271
+
257
272
  generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
258
273
 
259
274
  if ( shaderStage === 'fragment' ) {
@@ -522,7 +537,7 @@ ${ flowData.code }
522
537
 
523
538
  getFragCoord() {
524
539
 
525
- return this.getBuiltin( 'position', 'fragCoord', 'vec4<f32>' ) + '.xy';
540
+ return this.getBuiltin( 'position', 'fragCoord', 'vec4<f32>' ) + '.xyz';
526
541
 
527
542
  }
528
543
 
@@ -64,7 +64,6 @@ class WebGPUAttributeUtils {
64
64
 
65
65
  if ( ( bufferAttribute.isStorageBufferAttribute || bufferAttribute.isStorageInstancedBufferAttribute ) && bufferAttribute.itemSize === 3 ) {
66
66
 
67
- bufferAttribute.itemSize = 4;
68
67
  array = new array.constructor( bufferAttribute.count * 4 );
69
68
 
70
69
  for ( let i = 0; i < bufferAttribute.count; i ++ ) {
@@ -73,6 +72,10 @@ class WebGPUAttributeUtils {
73
72
 
74
73
  }
75
74
 
75
+ // Update BufferAttribute
76
+ bufferAttribute.itemSize = 4;
77
+ bufferAttribute.array = array;
78
+
76
79
  }
77
80
 
78
81
  const size = array.byteLength + ( ( 4 - ( array.byteLength % 4 ) ) % 4 ); // ensure 4 byte alignment, see #20441
@@ -218,7 +218,7 @@ class GLSLDecoder {
218
218
 
219
219
  this._currentFunction = null;
220
220
 
221
- this.addPolyfill( 'gl_FragCoord', 'vec2 gl_FragCoord = vec2( viewportCoordinate.x, viewportCoordinate.y.oneMinus() );' );
221
+ this.addPolyfill( 'gl_FragCoord', 'vec3 gl_FragCoord = vec3( viewportCoordinate.x, viewportCoordinate.y.oneMinus(), viewportCoordinate.z );' );
222
222
 
223
223
  }
224
224
 
@@ -9,7 +9,7 @@ class ShaderToyDecoder extends GLSLDecoder {
9
9
 
10
10
  this.addPolyfill( 'iTime', 'float iTime = timerGlobal();' );
11
11
  this.addPolyfill( 'iResolution', 'vec2 iResolution = viewportResolution;' );
12
- this.addPolyfill( 'fragCoord', 'vec2 fragCoord = vec2( viewportCoordinate.x, viewportResolution.y - viewportCoordinate.y );' );
12
+ this.addPolyfill( 'fragCoord', 'vec3 fragCoord = vec3( viewportCoordinate.x, viewportResolution.y - viewportCoordinate.y, viewportCoordinate.z );' );
13
13
 
14
14
  }
15
15
 
@@ -245,10 +245,69 @@ function sortInstancedMesh( mesh, compareFn ) {
245
245
 
246
246
  }
247
247
 
248
+ /**
249
+ * @param {Object3D} object Object to traverse.
250
+ * @yields {Object3D} Objects that passed the filter condition.
251
+ */
252
+ function* traverseGenerator( object ) {
253
+
254
+ yield object;
255
+
256
+ const children = object.children;
257
+
258
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
259
+
260
+ yield* traverseGenerator( children[ i ] );
261
+
262
+ }
263
+
264
+ }
265
+
266
+ /**
267
+ * @param {Object3D} object Object to traverse.
268
+ * @yields {Object3D} Objects that passed the filter condition.
269
+ */
270
+ function* traverseVisibleGenerator( object ) {
271
+
272
+ if ( object.visible === false ) return;
273
+
274
+ yield object;
275
+
276
+ const children = object.children;
277
+
278
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
279
+
280
+ yield* traverseVisibleGenerator( children[ i ] );
281
+
282
+ }
283
+
284
+ }
285
+
286
+ /**
287
+ * @param {Object3D} object Object to traverse.
288
+ * @yields {Object3D} Objects that passed the filter condition.
289
+ */
290
+ function* traverseAncestorsGenerator( object ) {
291
+
292
+ const parent = object.parent;
293
+
294
+ if ( parent !== null ) {
295
+
296
+ yield parent;
297
+
298
+ yield* traverseAncestorsGenerator( parent );
299
+
300
+ }
301
+
302
+ }
303
+
248
304
  export {
249
305
  createMeshesFromInstancedMesh,
250
306
  createMeshesFromMultiMaterialMesh,
251
307
  createMultiMaterialObject,
252
308
  reduceVertices,
253
- sortInstancedMesh
309
+ sortInstancedMesh,
310
+ traverseGenerator,
311
+ traverseVisibleGenerator,
312
+ traverseAncestorsGenerator
254
313
  };
@@ -6,7 +6,7 @@ const POINTING_JOINT = 'index-finger-tip';
6
6
 
7
7
  class OculusHandModel extends Object3D {
8
8
 
9
- constructor( controller, loader = null ) {
9
+ constructor( controller, loader = null, onLoad = null ) {
10
10
 
11
11
  super();
12
12
 
@@ -14,6 +14,7 @@ class OculusHandModel extends Object3D {
14
14
  this.motionController = null;
15
15
  this.envMap = null;
16
16
  this.loader = loader;
17
+ this.onLoad = onLoad;
17
18
 
18
19
  this.mesh = null;
19
20
 
@@ -25,7 +26,7 @@ class OculusHandModel extends Object3D {
25
26
 
26
27
  this.xrInputSource = xrInputSource;
27
28
 
28
- this.motionController = new XRHandMeshModel( this, controller, this.path, xrInputSource.handedness, this.loader );
29
+ this.motionController = new XRHandMeshModel( this, controller, this.path, xrInputSource.handedness, this.loader, this.onLoad );
29
30
 
30
31
  }
31
32
 
@@ -40,9 +40,11 @@ class XRHandModel extends Object3D {
40
40
 
41
41
  class XRHandModelFactory {
42
42
 
43
- constructor() {
43
+ constructor( gltfLoader = null, onLoad = null ) {
44
44
 
45
+ this.gltfLoader = gltfLoader;
45
46
  this.path = null;
47
+ this.onLoad = onLoad;
46
48
 
47
49
  }
48
50
 
@@ -77,7 +79,7 @@ class XRHandModelFactory {
77
79
 
78
80
  } else if ( profile === 'mesh' ) {
79
81
 
80
- handModel.motionController = new XRHandMeshModel( handModel, controller, this.path, xrInputSource.handedness );
82
+ handModel.motionController = new XRHandMeshModel( handModel, controller, this.path, xrInputSource.handedness, this.gltfLoader, this.onLoad );
81
83
 
82
84
  }
83
85
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "super-three",
3
- "version": "0.163.0",
3
+ "version": "0.164.0",
4
4
  "description": "JavaScript 3D library",
5
5
  "type": "module",
6
6
  "main": "./build/three.cjs",
package/src/constants.js CHANGED
@@ -1,4 +1,4 @@
1
- export const REVISION = '163';
1
+ export const REVISION = '164';
2
2
 
3
3
  export const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };
4
4
  export const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };
@@ -34,6 +34,8 @@ class RenderTarget extends EventDispatcher {
34
34
  minFilter: LinearFilter,
35
35
  depthBuffer: true,
36
36
  stencilBuffer: false,
37
+ resolveDepthBuffer: true,
38
+ resolveStencilBuffer: true,
37
39
  depthTexture: null,
38
40
  samples: 0,
39
41
  count: 1
@@ -58,6 +60,9 @@ class RenderTarget extends EventDispatcher {
58
60
  this.depthBuffer = options.depthBuffer;
59
61
  this.stencilBuffer = options.stencilBuffer;
60
62
 
63
+ this.resolveDepthBuffer = options.resolveDepthBuffer;
64
+ this.resolveStencilBuffer = options.resolveStencilBuffer;
65
+
61
66
  this.depthTexture = options.depthTexture;
62
67
 
63
68
  this.samples = options.samples;
@@ -135,6 +140,9 @@ class RenderTarget extends EventDispatcher {
135
140
  this.depthBuffer = source.depthBuffer;
136
141
  this.stencilBuffer = source.stencilBuffer;
137
142
 
143
+ this.resolveDepthBuffer = source.resolveDepthBuffer;
144
+ this.resolveStencilBuffer = source.resolveStencilBuffer;
145
+
138
146
  if ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();
139
147
 
140
148
  this.samples = source.samples;
@@ -49,16 +49,16 @@ const INV_PHI = 1 / PHI;
49
49
  // Vertices of a dodecahedron (except the opposites, which represent the
50
50
  // same axis), used as axis directions evenly spread on a sphere.
51
51
  const _axisDirections = [
52
- /*@__PURE__*/ new Vector3( 1, 1, 1 ),
53
- /*@__PURE__*/ new Vector3( - 1, 1, 1 ),
54
- /*@__PURE__*/ new Vector3( 1, 1, - 1 ),
55
- /*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
56
- /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
57
- /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
58
- /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
59
- /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
52
+ /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ),
60
53
  /*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),
61
- /*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];
54
+ /*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
55
+ /*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
56
+ /*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
57
+ /*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
58
+ /*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
59
+ /*@__PURE__*/ new Vector3( 1, 1, - 1 ),
60
+ /*@__PURE__*/ new Vector3( - 1, 1, 1 ),
61
+ /*@__PURE__*/ new Vector3( 1, 1, 1 ) ];
62
62
 
63
63
  /**
64
64
  * This class generates a Prefiltered, Mipmapped Radiance Environment Map
@@ -444,12 +444,13 @@ class PMREMGenerator {
444
444
  const renderer = this._renderer;
445
445
  const autoClear = renderer.autoClear;
446
446
  renderer.autoClear = false;
447
+ const n = this._lodPlanes.length;
447
448
 
448
- for ( let i = 1; i < this._lodPlanes.length; i ++ ) {
449
+ for ( let i = 1; i < n; i ++ ) {
449
450
 
450
451
  const sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );
451
452
 
452
- const poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];
453
+ const poleAxis = _axisDirections[ ( n - i - 1 ) % _axisDirections.length ];
453
454
 
454
455
  this._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );
455
456
 
@@ -112,7 +112,7 @@ class FileLoader extends Loader {
112
112
 
113
113
  // Nginx needs X-File-Size check
114
114
  // https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content
115
- const contentLength = response.headers.get( 'Content-Length' ) || response.headers.get( 'X-File-Size' );
115
+ const contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );
116
116
  const total = contentLength ? parseInt( contentLength ) : 0;
117
117
  const lengthComputable = total !== 0;
118
118
  let loaded = 0;
@@ -103,6 +103,7 @@ class MaterialLoader extends Loader {
103
103
  if ( json.shininess !== undefined ) material.shininess = json.shininess;
104
104
  if ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;
105
105
  if ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;
106
+ if ( json.dispersion !== undefined ) material.dispersion = json.dispersion;
106
107
  if ( json.iridescence !== undefined ) material.iridescence = json.iridescence;
107
108
  if ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;
108
109
  if ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;
@@ -218,6 +218,8 @@ class Material extends EventDispatcher {
218
218
 
219
219
  }
220
220
 
221
+ if ( this.dispersion !== undefined ) data.dispersion = this.dispersion;
222
+
221
223
  if ( this.iridescence !== undefined ) data.iridescence = this.iridescence;
222
224
  if ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;
223
225
  if ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;
@@ -68,6 +68,7 @@ class MeshPhysicalMaterial extends MeshStandardMaterial {
68
68
 
69
69
  this._anisotropy = 0;
70
70
  this._clearcoat = 0;
71
+ this._dispersion = 0;
71
72
  this._iridescence = 0;
72
73
  this._sheen = 0.0;
73
74
  this._transmission = 0;
@@ -130,6 +131,24 @@ class MeshPhysicalMaterial extends MeshStandardMaterial {
130
131
 
131
132
  }
132
133
 
134
+ get dispersion() {
135
+
136
+ return this._dispersion;
137
+
138
+ }
139
+
140
+ set dispersion( value ) {
141
+
142
+ if ( this._dispersion > 0 !== value > 0 ) {
143
+
144
+ this.version ++;
145
+
146
+ }
147
+
148
+ this._dispersion = value;
149
+
150
+ }
151
+
133
152
  get sheen() {
134
153
 
135
154
  return this._sheen;
@@ -188,6 +207,7 @@ class MeshPhysicalMaterial extends MeshStandardMaterial {
188
207
  this.clearcoatNormalMap = source.clearcoatNormalMap;
189
208
  this.clearcoatNormalScale.copy( source.clearcoatNormalScale );
190
209
 
210
+ this.dispersion = source.dispersion;
191
211
  this.ior = source.ior;
192
212
 
193
213
  this.iridescence = source.iridescence;
@@ -152,6 +152,7 @@ class BatchedMesh extends Mesh {
152
152
  this._multiDrawCounts = new Int32Array( maxGeometryCount );
153
153
  this._multiDrawStarts = new Int32Array( maxGeometryCount );
154
154
  this._multiDrawCount = 0;
155
+ this._multiDrawInstances = null;
155
156
  this._visibilityChanged = true;
156
157
 
157
158
  // Local matrix per geometry by using data texture
@@ -593,6 +594,28 @@ class BatchedMesh extends Mesh {
593
594
 
594
595
  }
595
596
 
597
+ getInstanceCountAt( id ) {
598
+
599
+ if ( this._multiDrawInstances === null ) return null;
600
+
601
+ return this._multiDrawInstances[ id ];
602
+
603
+ }
604
+
605
+ setInstanceCountAt( id, instanceCount ) {
606
+
607
+ if ( this._multiDrawInstances === null ) {
608
+
609
+ this._multiDrawInstances = new Int32Array( this._maxGeometryCount ).fill( 1 );
610
+
611
+ }
612
+
613
+ this._multiDrawInstances[ id ] = instanceCount;
614
+
615
+ return id;
616
+
617
+ }
618
+
596
619
  // get bounding box and compute it if it doesn't exist
597
620
  getBoundingBoxAt( id, target ) {
598
621