|
@@ -27318,6 +27318,13 @@ Bone.prototype = Object.assign( Object.create( Object3D.prototype ), {
|
|
* @author mrdoob / http://mrdoob.com/
|
|
* @author mrdoob / http://mrdoob.com/
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
+var _instanceLocalMatrix = new Matrix4();
|
|
|
|
+var _instanceWorldMatrix = new Matrix4();
|
|
|
|
+
|
|
|
|
+var _instanceIntersects = [];
|
|
|
|
+
|
|
|
|
+var _mesh = new Mesh();
|
|
|
|
+
|
|
function InstancedMesh( geometry, material, count ) {
|
|
function InstancedMesh( geometry, material, count ) {
|
|
|
|
|
|
Mesh.call( this, geometry, material );
|
|
Mesh.call( this, geometry, material );
|
|
@@ -27334,7 +27341,54 @@ InstancedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {
|
|
|
|
|
|
isInstancedMesh: true,
|
|
isInstancedMesh: true,
|
|
|
|
|
|
- raycast: function () {},
|
|
|
|
|
|
+ getMatrixAt: function ( index, matrix ) {
|
|
|
|
+
|
|
|
|
+ matrix.fromArray( this.instanceMatrix.array, index * 16 );
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ raycast: function ( raycaster, intersects ) {
|
|
|
|
+
|
|
|
|
+ var matrixWorld = this.matrixWorld;
|
|
|
|
+ var raycastTimes = this.count;
|
|
|
|
+
|
|
|
|
+ _mesh.geometry = this.geometry;
|
|
|
|
+ _mesh.material = this.material;
|
|
|
|
+
|
|
|
|
+ if ( _mesh.material === undefined ) return;
|
|
|
|
+
|
|
|
|
+ for ( var instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {
|
|
|
|
+
|
|
|
|
+ //Calculate the world matrix for each instance
|
|
|
|
+
|
|
|
|
+ this.getMatrixAt( instanceId, _instanceLocalMatrix );
|
|
|
|
+
|
|
|
|
+ _instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //The mesh represents this single instance
|
|
|
|
+
|
|
|
|
+ _mesh.matrixWorld = _instanceWorldMatrix;
|
|
|
|
+
|
|
|
|
+ _mesh.raycast( raycaster, _instanceIntersects );
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //Process the result of raycast
|
|
|
|
+
|
|
|
|
+ if ( _instanceIntersects.length > 0 ) {
|
|
|
|
+
|
|
|
|
+ _instanceIntersects[ 0 ].instanceId = instanceId;
|
|
|
|
+ _instanceIntersects[ 0 ].object = this;
|
|
|
|
+
|
|
|
|
+ intersects.push( _instanceIntersects[ 0 ] );
|
|
|
|
+
|
|
|
|
+ _instanceIntersects.length = 0;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
|
|
setMatrixAt: function ( index, matrix ) {
|
|
setMatrixAt: function ( index, matrix ) {
|
|
|
|
|
|
@@ -27342,7 +27396,9 @@ InstancedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {
|
|
|
|
|
|
},
|
|
},
|
|
|
|
|
|
- updateMorphTargets: function () {}
|
|
|
|
|
|
+ updateMorphTargets: function () {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
} );
|
|
} );
|
|
|
|
|