|
@@ -1,3 +1,5 @@
|
|
|
+import { Matrix4, Vector3, Vector2, PositionalAudio, Line } from "../../../build/three.module.js";
|
|
|
+
|
|
|
/**
|
|
|
* @author WestLangley / http://github.com/WestLangley
|
|
|
*
|
|
@@ -52,6 +54,103 @@ THREE.LineSegments2.prototype = Object.assign( Object.create( THREE.Mesh.prototy
|
|
|
|
|
|
};
|
|
|
|
|
|
- }() )
|
|
|
+ }() ),
|
|
|
+
|
|
|
+ raycast: ( function () {
|
|
|
+
|
|
|
+ var start = new Vector4();
|
|
|
+ var end = new Vector4();
|
|
|
+
|
|
|
+ var origin = new Vector4();
|
|
|
+ var mvMatrix = new Matrix4();
|
|
|
+ var line = new Line();
|
|
|
+ var closestPoint = new Vector3();
|
|
|
+
|
|
|
+ return function raycast( raycaster, insterescts ) {
|
|
|
+
|
|
|
+ if ( raycaster.camera === null ) {
|
|
|
+
|
|
|
+ console.error( 'THREE.LineSegments2: "Raycaster.camera" needs to be set in order to raycast against sprites.' );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var ray = raycaster.ray;
|
|
|
+ var camera = raycaster.camera;
|
|
|
+ var projectionMatrix = camera.projectionMatrix;
|
|
|
+
|
|
|
+ var geometry = this.geometry;
|
|
|
+ var material = this.material;
|
|
|
+ var resolution = material.resolution;
|
|
|
+ var lineWidth = material.lineWidth;
|
|
|
+
|
|
|
+ var instanceStart = geometry.attributes.instanceStart;
|
|
|
+ var instanceEnd = geometry.attributes.instanceEnd;
|
|
|
+
|
|
|
+ var isPerspective = projectionMatrix[ 2 ][ 3 ] === -1;
|
|
|
+ var aspect = resolution.x / resolution.y;
|
|
|
+
|
|
|
+ // ndc space [ - 0.5, 0.5 ]
|
|
|
+ origin.copy( ray.origin );
|
|
|
+ origin.w = 1;
|
|
|
+ origin.applyMatrix4( camera.matrixWorldInverse );
|
|
|
+ origin.applyMatrix4( projectionMatrix );
|
|
|
+ origin.multiplyScalar( 1 / origin.w );
|
|
|
+
|
|
|
+ // screen space
|
|
|
+ origin.x *= resolution.x;
|
|
|
+ origin.y *= resolution.y;
|
|
|
+ origin.z = 0;
|
|
|
+
|
|
|
+ mvMatrix.multiplyMatrices( camera.matrixWorldInverse, this.matrixWorld );
|
|
|
+
|
|
|
+ for ( var i = 0, l = instanceStart.count; i < l; i ++ ) {
|
|
|
+
|
|
|
+ // TODO: Maybe have to clip the line based on the camera?
|
|
|
+
|
|
|
+ start.fromBufferAttribute( instanceStart, i );
|
|
|
+ end.fromBufferAttribute( instanceEnd, i );
|
|
|
+
|
|
|
+ start.w = 1;
|
|
|
+ end.w = 1;
|
|
|
+
|
|
|
+ // camera space
|
|
|
+ start.applyMatrix4( mvMatrix );
|
|
|
+ end.applyMatrix4( mvMatrix );
|
|
|
+
|
|
|
+ // clip space
|
|
|
+ start.applyMatrix4( projectionMatrix );
|
|
|
+ end.applyMatrix4( projectionMatrix );
|
|
|
+
|
|
|
+ // ndc space [ - 0.5, 0.5 ]
|
|
|
+ start.multiplyScalar( 1 / start.w );
|
|
|
+ end.multiplyScalar( 1 / end.w );
|
|
|
+
|
|
|
+ // screen space
|
|
|
+ start.x *= resolution.x;
|
|
|
+ start.y *= resolution.y;
|
|
|
+
|
|
|
+ end.y *= resolution.y;
|
|
|
+ end.y *= resolution.y;
|
|
|
+
|
|
|
+ line.start.copy( start );
|
|
|
+ line.start.z = 0;
|
|
|
+
|
|
|
+ line.end.copy( end );
|
|
|
+ line.end.z = 0;
|
|
|
+
|
|
|
+ var param = line.closestPointToPointParameter( origin, true );
|
|
|
+ line.at( param, closestPoint );
|
|
|
+
|
|
|
+ if ( origin.distanceTo( closestPoint ) < lineWidth * 0.5 ) {
|
|
|
+
|
|
|
+ // intersected! output a hit
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } () )
|
|
|
|
|
|
} );
|