super-three 0.162.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 (187) hide show
  1. package/build/three.cjs +847 -1226
  2. package/build/three.module.js +846 -1225
  3. package/build/three.module.min.js +2 -2
  4. package/examples/jsm/animation/CCDIKSolver.js +4 -2
  5. package/examples/jsm/controls/TransformControls.js +3 -3
  6. package/examples/jsm/exporters/GLTFExporter.js +66 -5
  7. package/examples/jsm/exporters/USDZExporter.js +22 -1
  8. package/examples/jsm/geometries/TextGeometry.js +10 -2
  9. package/examples/jsm/interactive/HTMLMesh.js +7 -9
  10. package/examples/jsm/libs/draco/README.md +2 -2
  11. package/examples/jsm/libs/fflate.module.js +694 -496
  12. package/examples/jsm/lines/LineMaterial.js +0 -2
  13. package/examples/jsm/loaders/3MFLoader.js +2 -0
  14. package/examples/jsm/loaders/EXRLoader.js +351 -97
  15. package/examples/jsm/loaders/FBXLoader.js +1 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +59 -0
  17. package/examples/jsm/loaders/KTX2Loader.js +3 -10
  18. package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
  19. package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
  20. package/examples/jsm/loaders/LUTImageLoader.js +0 -14
  21. package/examples/jsm/loaders/RGBMLoader.js +16 -0
  22. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  23. package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
  24. package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
  25. package/examples/jsm/math/Octree.js +26 -20
  26. package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
  27. package/examples/jsm/nodes/Nodes.js +10 -4
  28. package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
  29. package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
  30. package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
  31. package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
  32. package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
  33. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
  35. package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
  36. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
  38. package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +51 -10
  40. package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
  41. package/examples/jsm/nodes/code/FunctionNode.js +0 -8
  42. package/examples/jsm/nodes/core/Node.js +63 -4
  43. package/examples/jsm/nodes/core/NodeBuilder.js +26 -25
  44. package/examples/jsm/nodes/core/NodeFrame.js +10 -10
  45. package/examples/jsm/nodes/core/NodeUtils.js +2 -2
  46. package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
  47. package/examples/jsm/nodes/core/PropertyNode.js +10 -0
  48. package/examples/jsm/nodes/core/UniformNode.js +20 -0
  49. package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
  50. package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
  51. package/examples/jsm/nodes/display/PassNode.js +17 -1
  52. package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
  53. package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
  54. package/examples/jsm/nodes/display/ViewportNode.js +4 -2
  55. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
  56. package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
  57. package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
  58. package/examples/jsm/nodes/fog/FogNode.js +13 -3
  59. package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
  60. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
  61. package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  62. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
  63. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  64. package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
  65. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +164 -10
  66. package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
  67. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  68. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
  69. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -70
  70. package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
  71. package/examples/jsm/nodes/lighting/LightsNode.js +11 -1
  72. package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
  73. package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +10 -6
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
  77. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  78. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +76 -5
  79. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
  80. package/examples/jsm/nodes/materials/NodeMaterial.js +55 -43
  81. package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
  82. package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
  83. package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +3 -9
  85. package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
  86. package/examples/jsm/objects/QuadMesh.js +7 -23
  87. package/examples/jsm/physics/JoltPhysics.js +281 -0
  88. package/examples/jsm/physics/RapierPhysics.js +4 -4
  89. package/examples/jsm/postprocessing/GlitchPass.js +0 -3
  90. package/examples/jsm/postprocessing/LUTPass.js +5 -71
  91. package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
  92. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  93. package/examples/jsm/postprocessing/SSAOPass.js +0 -3
  94. package/examples/jsm/renderers/common/Animation.js +3 -0
  95. package/examples/jsm/renderers/common/Background.js +8 -8
  96. package/examples/jsm/renderers/common/ClippingContext.js +1 -1
  97. package/examples/jsm/renderers/common/Info.js +11 -19
  98. package/examples/jsm/renderers/common/PostProcessing.js +12 -4
  99. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  100. package/examples/jsm/renderers/common/RenderList.js +1 -1
  101. package/examples/jsm/renderers/common/RenderObject.js +47 -5
  102. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  103. package/examples/jsm/renderers/common/Renderer.js +153 -21
  104. package/examples/jsm/renderers/common/Textures.js +1 -1
  105. package/examples/jsm/renderers/common/extras/PMREMGenerator.js +773 -0
  106. package/examples/jsm/renderers/common/nodes/Nodes.js +34 -63
  107. package/examples/jsm/renderers/webgl/WebGLBackend.js +146 -36
  108. package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +145 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +9 -3
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
  111. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +64 -7
  113. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +6 -23
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +77 -60
  115. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -4
  116. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +29 -1
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
  119. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  120. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  121. package/examples/jsm/utils/GPUStatsPanel.js +10 -45
  122. package/examples/jsm/utils/SceneUtils.js +60 -1
  123. package/examples/jsm/utils/TextureUtils.js +1 -1
  124. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  125. package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
  126. package/package.json +1 -1
  127. package/src/Three.js +0 -1
  128. package/src/animation/AnimationClip.js +1 -1
  129. package/src/constants.js +3 -3
  130. package/src/core/Object3D.js +10 -7
  131. package/src/core/RenderTarget.js +8 -0
  132. package/src/extras/PMREMGenerator.js +21 -11
  133. package/src/loaders/FileLoader.js +1 -1
  134. package/src/loaders/MaterialLoader.js +1 -0
  135. package/src/loaders/ObjectLoader.js +2 -0
  136. package/src/materials/Material.js +2 -0
  137. package/src/materials/MeshPhysicalMaterial.js +20 -0
  138. package/src/materials/ShaderMaterial.js +0 -4
  139. package/src/math/Spherical.js +4 -5
  140. package/src/objects/BatchedMesh.js +27 -3
  141. package/src/objects/InstancedMesh.js +10 -0
  142. package/src/objects/Line.js +66 -43
  143. package/src/renderers/WebGLRenderer.js +130 -158
  144. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  145. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
  146. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
  147. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  148. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
  149. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
  150. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
  151. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
  152. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  153. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
  154. package/src/renderers/shaders/ShaderChunk.js +0 -2
  155. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  156. package/src/renderers/shaders/ShaderLib.js +2 -1
  157. package/src/renderers/shaders/UniformsUtils.js +10 -1
  158. package/src/renderers/webgl/WebGLAttributes.js +6 -33
  159. package/src/renderers/webgl/WebGLBackground.js +18 -3
  160. package/src/renderers/webgl/WebGLBindingStates.js +14 -51
  161. package/src/renderers/webgl/WebGLBufferRenderer.js +35 -21
  162. package/src/renderers/webgl/WebGLCapabilities.js +35 -13
  163. package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
  164. package/src/renderers/webgl/WebGLExtensions.js +4 -19
  165. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +35 -21
  166. package/src/renderers/webgl/WebGLLights.js +6 -32
  167. package/src/renderers/webgl/WebGLMaterials.js +8 -3
  168. package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
  169. package/src/renderers/webgl/WebGLProgram.js +21 -52
  170. package/src/renderers/webgl/WebGLPrograms.js +24 -31
  171. package/src/renderers/webgl/WebGLRenderStates.js +13 -7
  172. package/src/renderers/webgl/WebGLShadowMap.js +25 -25
  173. package/src/renderers/webgl/WebGLState.js +15 -59
  174. package/src/renderers/webgl/WebGLTextures.js +138 -292
  175. package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
  176. package/src/renderers/webgl/WebGLUtils.js +9 -78
  177. package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
  178. package/src/renderers/webxr/WebXRManager.js +4 -6
  179. package/src/scenes/Scene.js +7 -1
  180. package/src/textures/Texture.js +11 -1
  181. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
  182. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -320
  183. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
  184. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -794
  185. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
  186. package/src/renderers/WebGL1Renderer.js +0 -7
  187. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
@@ -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;
@@ -33,10 +33,6 @@ class ShaderMaterial extends Material {
33
33
  this.forceSinglePass = true;
34
34
 
35
35
  this.extensions = {
36
- derivatives: false, // set to use derivatives
37
- fragDepth: false, // set to use fragment depth values
38
- drawBuffers: false, // set to use draw buffers
39
- shaderTextureLOD: false, // set to use shader texture LOD
40
36
  clipCullDistance: false, // set to use vertex shader clipping
41
37
  multiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID
42
38
  };
@@ -1,12 +1,11 @@
1
+ import * as MathUtils from './MathUtils.js';
2
+
1
3
  /**
2
4
  * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system
3
5
  *
4
- * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.
5
- * The azimuthal angle (theta) is measured from the positive z-axis.
6
+ * phi (the polar angle) is measured from the positive y-axis. The positive y-axis is up.
7
+ * theta (the azimuthal angle) is measured from the positive z-axis.
6
8
  */
7
-
8
- import * as MathUtils from './MathUtils.js';
9
-
10
9
  class Spherical {
11
10
 
12
11
  constructor( radius = 1, phi = 0, theta = 0 ) {
@@ -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
@@ -195,8 +196,7 @@ class BatchedMesh extends Mesh {
195
196
  const { array, itemSize, normalized } = srcAttribute;
196
197
 
197
198
  const dstArray = new array.constructor( maxVertexCount * itemSize );
198
- const dstAttribute = new srcAttribute.constructor( dstArray, itemSize, normalized );
199
- dstAttribute.setUsage( srcAttribute.usage );
199
+ const dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );
200
200
 
201
201
  geometry.setAttribute( attributeName, dstAttribute );
202
202
 
@@ -223,7 +223,7 @@ class BatchedMesh extends Mesh {
223
223
 
224
224
  }
225
225
 
226
- // Make sure the geometry is compatible with the existing combined geometry atributes
226
+ // Make sure the geometry is compatible with the existing combined geometry attributes
227
227
  _validateGeometry( geometry ) {
228
228
 
229
229
  // check that the geometry doesn't have a version of our reserved id attribute
@@ -514,6 +514,7 @@ class BatchedMesh extends Mesh {
514
514
  }
515
515
 
516
516
  dstAttribute.needsUpdate = true;
517
+ dstAttribute.addUpdateRange( vertexStart * itemSize, vertexCount * itemSize );
517
518
 
518
519
  }
519
520
 
@@ -537,6 +538,7 @@ class BatchedMesh extends Mesh {
537
538
  }
538
539
 
539
540
  dstIndex.needsUpdate = true;
541
+ dstIndex.addUpdateRange( indexStart, reservedRange.indexCount );
540
542
 
541
543
  }
542
544
 
@@ -592,6 +594,28 @@ class BatchedMesh extends Mesh {
592
594
 
593
595
  }
594
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
+
595
619
  // get bounding box and compute it if it doesn't exist
596
620
  getBoundingBoxAt( id, target ) {
597
621
 
@@ -109,6 +109,7 @@ class InstancedMesh extends Mesh {
109
109
 
110
110
  this.instanceMatrix.copy( source.instanceMatrix );
111
111
 
112
+ if ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();
112
113
  if ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();
113
114
 
114
115
  this.count = source.count;
@@ -260,6 +261,15 @@ class InstancedMesh extends Mesh {
260
261
 
261
262
  this.dispatchEvent( { type: 'dispose' } );
262
263
 
264
+ if ( this.morphTexture !== null ) {
265
+
266
+ this.morphTexture.dispose();
267
+ this.morphTexture = null;
268
+
269
+ }
270
+
271
+ return this;
272
+
263
273
  }
264
274
 
265
275
  }
@@ -7,12 +7,16 @@ import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
7
7
  import { BufferGeometry } from '../core/BufferGeometry.js';
8
8
  import { Float32BufferAttribute } from '../core/BufferAttribute.js';
9
9
 
10
- const _start = /*@__PURE__*/ new Vector3();
11
- const _end = /*@__PURE__*/ new Vector3();
10
+ const _vStart = /*@__PURE__*/ new Vector3();
11
+ const _vEnd = /*@__PURE__*/ new Vector3();
12
+
12
13
  const _inverseMatrix = /*@__PURE__*/ new Matrix4();
13
14
  const _ray = /*@__PURE__*/ new Ray();
14
15
  const _sphere = /*@__PURE__*/ new Sphere();
15
16
 
17
+ const _intersectPointOnRay = /*@__PURE__*/ new Vector3();
18
+ const _intersectPointOnSegment = /*@__PURE__*/ new Vector3();
19
+
16
20
  class Line extends Object3D {
17
21
 
18
22
  constructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {
@@ -54,11 +58,11 @@ class Line extends Object3D {
54
58
 
55
59
  for ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {
56
60
 
57
- _start.fromBufferAttribute( positionAttribute, i - 1 );
58
- _end.fromBufferAttribute( positionAttribute, i );
61
+ _vStart.fromBufferAttribute( positionAttribute, i - 1 );
62
+ _vEnd.fromBufferAttribute( positionAttribute, i );
59
63
 
60
64
  lineDistances[ i ] = lineDistances[ i - 1 ];
61
- lineDistances[ i ] += _start.distanceTo( _end );
65
+ lineDistances[ i ] += _vStart.distanceTo( _vEnd );
62
66
 
63
67
  }
64
68
 
@@ -99,10 +103,6 @@ class Line extends Object3D {
99
103
  const localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );
100
104
  const localThresholdSq = localThreshold * localThreshold;
101
105
 
102
- const vStart = new Vector3();
103
- const vEnd = new Vector3();
104
- const interSegment = new Vector3();
105
- const interRay = new Vector3();
106
106
  const step = this.isLineSegments ? 2 : 1;
107
107
 
108
108
  const index = geometry.index;
@@ -119,31 +119,28 @@ class Line extends Object3D {
119
119
  const a = index.getX( i );
120
120
  const b = index.getX( i + 1 );
121
121
 
122
- vStart.fromBufferAttribute( positionAttribute, a );
123
- vEnd.fromBufferAttribute( positionAttribute, b );
122
+ const intersect = checkIntersection( this, raycaster, _ray, localThresholdSq, a, b );
123
+
124
+ if ( intersect ) {
124
125
 
125
- const distSq = _ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
126
+ intersects.push( intersect );
126
127
 
127
- if ( distSq > localThresholdSq ) continue;
128
+ }
129
+
130
+ }
128
131
 
129
- interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
132
+ if ( this.isLineLoop ) {
130
133
 
131
- const distance = raycaster.ray.origin.distanceTo( interRay );
134
+ const a = index.getX( end - 1 );
135
+ const b = index.getX( start );
132
136
 
133
- if ( distance < raycaster.near || distance > raycaster.far ) continue;
137
+ const intersect = checkIntersection( this, raycaster, _ray, localThresholdSq, a, b );
134
138
 
135
- intersects.push( {
139
+ if ( intersect ) {
136
140
 
137
- distance: distance,
138
- // What do we want? intersection point on the ray or on the segment??
139
- // point: raycaster.ray.at( distance ),
140
- point: interSegment.clone().applyMatrix4( this.matrixWorld ),
141
- index: i,
142
- face: null,
143
- faceIndex: null,
144
- object: this
141
+ intersects.push( intersect );
145
142
 
146
- } );
143
+ }
147
144
 
148
145
  }
149
146
 
@@ -154,31 +151,25 @@ class Line extends Object3D {
154
151
 
155
152
  for ( let i = start, l = end - 1; i < l; i += step ) {
156
153
 
157
- vStart.fromBufferAttribute( positionAttribute, i );
158
- vEnd.fromBufferAttribute( positionAttribute, i + 1 );
154
+ const intersect = checkIntersection( this, raycaster, _ray, localThresholdSq, i, i + 1 );
155
+
156
+ if ( intersect ) {
159
157
 
160
- const distSq = _ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );
158
+ intersects.push( intersect );
161
159
 
162
- if ( distSq > localThresholdSq ) continue;
160
+ }
163
161
 
164
- interRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation
162
+ }
165
163
 
166
- const distance = raycaster.ray.origin.distanceTo( interRay );
164
+ if ( this.isLineLoop ) {
167
165
 
168
- if ( distance < raycaster.near || distance > raycaster.far ) continue;
166
+ const intersect = checkIntersection( this, raycaster, _ray, localThresholdSq, end - 1, start );
169
167
 
170
- intersects.push( {
168
+ if ( intersect ) {
171
169
 
172
- distance: distance,
173
- // What do we want? intersection point on the ray or on the segment??
174
- // point: raycaster.ray.at( distance ),
175
- point: interSegment.clone().applyMatrix4( this.matrixWorld ),
176
- index: i,
177
- face: null,
178
- faceIndex: null,
179
- object: this
170
+ intersects.push( intersect );
180
171
 
181
- } );
172
+ }
182
173
 
183
174
  }
184
175
 
@@ -219,4 +210,36 @@ class Line extends Object3D {
219
210
 
220
211
  }
221
212
 
213
+ function checkIntersection( object, raycaster, ray, thresholdSq, a, b ) {
214
+
215
+ const positionAttribute = object.geometry.attributes.position;
216
+
217
+ _vStart.fromBufferAttribute( positionAttribute, a );
218
+ _vEnd.fromBufferAttribute( positionAttribute, b );
219
+
220
+ const distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );
221
+
222
+ if ( distSq > thresholdSq ) return;
223
+
224
+ _intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation
225
+
226
+ const distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );
227
+
228
+ if ( distance < raycaster.near || distance > raycaster.far ) return;
229
+
230
+ return {
231
+
232
+ distance: distance,
233
+ // What do we want? intersection point on the ray or on the segment??
234
+ // point: raycaster.ray.at( distance ),
235
+ point: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),
236
+ index: a,
237
+ face: null,
238
+ faceIndex: null,
239
+ object: object
240
+
241
+ };
242
+
243
+ }
244
+
222
245
  export { Line };