提交 bc9f190e 编写于 作者: M Mr.doob

Projector: Basic Line BufferGeometry support.

上级 33424ab8
......@@ -213,6 +213,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 ];
......@@ -241,6 +255,7 @@ THREE.Projector = function () {
projectVertex: projectVertex,
checkTriangleVisibility: checkTriangleVisibility,
handleVertex: handleVertex,
handleLine: handleLine,
handleTriangle: handleTriangle
}
......@@ -274,6 +289,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 );
......@@ -283,8 +299,6 @@ THREE.Projector = function () {
if ( object instanceof THREE.Mesh ) {
geometry = object.geometry;
if ( geometry instanceof THREE.BufferGeometry ) {
var attributes = geometry.attributes;
......@@ -476,52 +490,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 ++ ) {
vertices = object.geometry.vertices;
renderState.handleLine( i, i + 1 );
v1 = getNextVertexInPool();
v1.positionScreen.copy( vertices[ 0 ] ).applyMatrix4( _modelViewProjectionMatrix );
}
// Handle LineStrip and LinePieces
var step = object.type === THREE.LinePieces ? 2 : 1;
}
for ( v = 1, vl = vertices.length; v < vl; v ++ ) {
}
} else if ( geometry instanceof THREE.Geometry ) {
_modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix );
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;
if ( object.material.vertexColors === THREE.VertexColors ) {
_renderData.elements.push( _line );
_line.vertexColors[ 0 ].copy( object.geometry.colors[ v ] );
_line.vertexColors[ 1 ].copy( object.geometry.colors[ v - 1 ] );
}
_renderData.elements.push( _line );
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册