|
@@ -8069,6 +8069,20 @@ THREE.Projector = function () {
|
|
|
|
|
|
};
|
|
|
|
|
|
+ var handleLine = function ( a, b ) {
|
|
|
+
|
|
|
+ _line = getNextLineInPool();
|
|
|
+
|
|
|
+ _line.id = object.id;
|
|
|
+ _line.v1.copy( _vertexPool[ a ] );
|
|
|
+ _line.v2.copy( _vertexPool[ b ] );
|
|
|
+
|
|
|
+ _line.material = object.material;
|
|
|
+
|
|
|
+ _renderData.elements.push( _line );
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
var handleTriangle = function ( a, b, c ) {
|
|
|
|
|
|
var v1 = _vertexPool[ a ];
|
|
@@ -8097,6 +8111,7 @@ THREE.Projector = function () {
|
|
|
projectVertex: projectVertex,
|
|
|
checkTriangleVisibility: checkTriangleVisibility,
|
|
|
handleVertex: handleVertex,
|
|
|
+ handleLine: handleLine,
|
|
|
handleTriangle: handleTriangle
|
|
|
}
|
|
|
|
|
@@ -8130,6 +8145,7 @@ THREE.Projector = function () {
|
|
|
for ( var o = 0, ol = _renderData.objects.length; o < ol; o ++ ) {
|
|
|
|
|
|
object = _renderData.objects[ o ].object;
|
|
|
+ geometry = object.geometry;
|
|
|
|
|
|
renderState.setObject( object );
|
|
|
|
|
@@ -8139,8 +8155,6 @@ THREE.Projector = function () {
|
|
|
|
|
|
if ( object instanceof THREE.Mesh ) {
|
|
|
|
|
|
- geometry = object.geometry;
|
|
|
-
|
|
|
if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
var attributes = geometry.attributes;
|
|
@@ -8332,52 +8346,92 @@ THREE.Projector = function () {
|
|
|
|
|
|
} else if ( object instanceof THREE.Line ) {
|
|
|
|
|
|
- _modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix );
|
|
|
+ if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
+
|
|
|
+ var attributes = geometry.attributes;
|
|
|
+
|
|
|
+ if ( attributes.position !== undefined ) {
|
|
|
+
|
|
|
+ var positions = attributes.position.array;
|
|
|
+
|
|
|
+ for ( var i = 0, l = positions.length; i < l; i += 3 ) {
|
|
|
+
|
|
|
+ renderState.handleVertex( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( attributes.index !== undefined ) {
|
|
|
+
|
|
|
+ var indices = attributes.index.array;
|
|
|
+
|
|
|
+ for ( var i = 0, l = indices.length; i < l; i += 2 ) {
|
|
|
+
|
|
|
+ renderState.handleLine( indices[ i ], indices[ i + 1 ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ for ( var i = 0, l = ( positions.length / 3 ) - 1; i < l; i ++ ) {
|
|
|
+
|
|
|
+ renderState.handleLine( i, i + 1 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- vertices = object.geometry.vertices;
|
|
|
+ }
|
|
|
|
|
|
- v1 = getNextVertexInPool();
|
|
|
- v1.positionScreen.copy( vertices[ 0 ] ).applyMatrix4( _modelViewProjectionMatrix );
|
|
|
+ } else if ( geometry instanceof THREE.Geometry ) {
|
|
|
|
|
|
- // Handle LineStrip and LinePieces
|
|
|
- var step = object.type === THREE.LinePieces ? 2 : 1;
|
|
|
+ _modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix );
|
|
|
|
|
|
- for ( v = 1, vl = vertices.length; v < vl; v ++ ) {
|
|
|
+ vertices = object.geometry.vertices;
|
|
|
|
|
|
v1 = getNextVertexInPool();
|
|
|
- v1.positionScreen.copy( vertices[ v ] ).applyMatrix4( _modelViewProjectionMatrix );
|
|
|
+ v1.positionScreen.copy( vertices[ 0 ] ).applyMatrix4( _modelViewProjectionMatrix );
|
|
|
|
|
|
- if ( ( v + 1 ) % step > 0 ) continue;
|
|
|
+ // Handle LineStrip and LinePieces
|
|
|
+ var step = object.type === THREE.LinePieces ? 2 : 1;
|
|
|
|
|
|
- v2 = _vertexPool[ _vertexCount - 2 ];
|
|
|
+ for ( v = 1, vl = vertices.length; v < vl; v ++ ) {
|
|
|
|
|
|
- _clippedVertex1PositionScreen.copy( v1.positionScreen );
|
|
|
- _clippedVertex2PositionScreen.copy( v2.positionScreen );
|
|
|
+ v1 = getNextVertexInPool();
|
|
|
+ v1.positionScreen.copy( vertices[ v ] ).applyMatrix4( _modelViewProjectionMatrix );
|
|
|
|
|
|
- if ( clipLine( _clippedVertex1PositionScreen, _clippedVertex2PositionScreen ) === true ) {
|
|
|
+ if ( ( v + 1 ) % step > 0 ) continue;
|
|
|
|
|
|
- // Perform the perspective divide
|
|
|
- _clippedVertex1PositionScreen.multiplyScalar( 1 / _clippedVertex1PositionScreen.w );
|
|
|
- _clippedVertex2PositionScreen.multiplyScalar( 1 / _clippedVertex2PositionScreen.w );
|
|
|
+ v2 = _vertexPool[ _vertexCount - 2 ];
|
|
|
|
|
|
- _line = getNextLineInPool();
|
|
|
+ _clippedVertex1PositionScreen.copy( v1.positionScreen );
|
|
|
+ _clippedVertex2PositionScreen.copy( v2.positionScreen );
|
|
|
|
|
|
- _line.id = object.id;
|
|
|
- _line.v1.positionScreen.copy( _clippedVertex1PositionScreen );
|
|
|
- _line.v2.positionScreen.copy( _clippedVertex2PositionScreen );
|
|
|
+ if ( clipLine( _clippedVertex1PositionScreen, _clippedVertex2PositionScreen ) === true ) {
|
|
|
|
|
|
- _line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z );
|
|
|
+ // Perform the perspective divide
|
|
|
+ _clippedVertex1PositionScreen.multiplyScalar( 1 / _clippedVertex1PositionScreen.w );
|
|
|
+ _clippedVertex2PositionScreen.multiplyScalar( 1 / _clippedVertex2PositionScreen.w );
|
|
|
|
|
|
- _line.material = object.material;
|
|
|
+ _line = getNextLineInPool();
|
|
|
|
|
|
- if ( object.material.vertexColors === THREE.VertexColors ) {
|
|
|
+ _line.id = object.id;
|
|
|
+ _line.v1.positionScreen.copy( _clippedVertex1PositionScreen );
|
|
|
+ _line.v2.positionScreen.copy( _clippedVertex2PositionScreen );
|
|
|
|
|
|
- _line.vertexColors[ 0 ].copy( object.geometry.colors[ v ] );
|
|
|
- _line.vertexColors[ 1 ].copy( object.geometry.colors[ v - 1 ] );
|
|
|
+ _line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z );
|
|
|
|
|
|
- }
|
|
|
+ _line.material = object.material;
|
|
|
|
|
|
- _renderData.elements.push( _line );
|
|
|
+ if ( object.material.vertexColors === THREE.VertexColors ) {
|
|
|
+
|
|
|
+ _line.vertexColors[ 0 ].copy( object.geometry.colors[ v ] );
|
|
|
+ _line.vertexColors[ 1 ].copy( object.geometry.colors[ v - 1 ] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ _renderData.elements.push( _line );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|