| |
| |
| |
| |
|
|
| import { BufferGeometry } from '../core/BufferGeometry.js'; |
| import { Float32BufferAttribute } from '../core/BufferAttribute.js'; |
| import { Vector3 } from '../math/Vector3.js'; |
|
|
| function WireframeGeometry( geometry ) { |
|
|
| BufferGeometry.call( this ); |
|
|
| this.type = 'WireframeGeometry'; |
|
|
| |
|
|
| var vertices = []; |
|
|
| |
|
|
| var i, j, l, o, ol; |
| var edge = [ 0, 0 ], edges = {}, e, edge1, edge2; |
| var key, keys = [ 'a', 'b', 'c' ]; |
| var vertex; |
|
|
| |
|
|
| if ( geometry && geometry.isGeometry ) { |
|
|
| |
|
|
| var faces = geometry.faces; |
|
|
| for ( i = 0, l = faces.length; i < l; i ++ ) { |
|
|
| var face = faces[ i ]; |
|
|
| for ( j = 0; j < 3; j ++ ) { |
|
|
| edge1 = face[ keys[ j ] ]; |
| edge2 = face[ keys[ ( j + 1 ) % 3 ] ]; |
| edge[ 0 ] = Math.min( edge1, edge2 ); |
| edge[ 1 ] = Math.max( edge1, edge2 ); |
|
|
| key = edge[ 0 ] + ',' + edge[ 1 ]; |
|
|
| if ( edges[ key ] === undefined ) { |
|
|
| edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; |
|
|
| } |
|
|
| } |
|
|
| } |
|
|
| |
|
|
| for ( key in edges ) { |
|
|
| e = edges[ key ]; |
|
|
| vertex = geometry.vertices[ e.index1 ]; |
| vertices.push( vertex.x, vertex.y, vertex.z ); |
|
|
| vertex = geometry.vertices[ e.index2 ]; |
| vertices.push( vertex.x, vertex.y, vertex.z ); |
|
|
| } |
|
|
| } else if ( geometry && geometry.isBufferGeometry ) { |
|
|
| var position, indices, groups; |
| var group, start, count; |
| var index1, index2; |
|
|
| vertex = new Vector3(); |
|
|
| if ( geometry.index !== null ) { |
|
|
| |
|
|
| position = geometry.attributes.position; |
| indices = geometry.index; |
| groups = geometry.groups; |
|
|
| if ( groups.length === 0 ) { |
|
|
| groups = [ { start: 0, count: indices.count, materialIndex: 0 } ]; |
|
|
| } |
|
|
| |
|
|
| for ( o = 0, ol = groups.length; o < ol; ++ o ) { |
|
|
| group = groups[ o ]; |
|
|
| start = group.start; |
| count = group.count; |
|
|
| for ( i = start, l = ( start + count ); i < l; i += 3 ) { |
|
|
| for ( j = 0; j < 3; j ++ ) { |
|
|
| edge1 = indices.getX( i + j ); |
| edge2 = indices.getX( i + ( j + 1 ) % 3 ); |
| edge[ 0 ] = Math.min( edge1, edge2 ); |
| edge[ 1 ] = Math.max( edge1, edge2 ); |
|
|
| key = edge[ 0 ] + ',' + edge[ 1 ]; |
|
|
| if ( edges[ key ] === undefined ) { |
|
|
| edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] }; |
|
|
| } |
|
|
| } |
|
|
| } |
|
|
| } |
|
|
| |
|
|
| for ( key in edges ) { |
|
|
| e = edges[ key ]; |
|
|
| vertex.fromBufferAttribute( position, e.index1 ); |
| vertices.push( vertex.x, vertex.y, vertex.z ); |
|
|
| vertex.fromBufferAttribute( position, e.index2 ); |
| vertices.push( vertex.x, vertex.y, vertex.z ); |
|
|
| } |
|
|
| } else { |
|
|
| |
|
|
| position = geometry.attributes.position; |
|
|
| for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) { |
|
|
| for ( j = 0; j < 3; j ++ ) { |
|
|
| |
| |
|
|
| index1 = 3 * i + j; |
| vertex.fromBufferAttribute( position, index1 ); |
| vertices.push( vertex.x, vertex.y, vertex.z ); |
|
|
| index2 = 3 * i + ( ( j + 1 ) % 3 ); |
| vertex.fromBufferAttribute( position, index2 ); |
| vertices.push( vertex.x, vertex.y, vertex.z ); |
|
|
| } |
|
|
| } |
|
|
| } |
|
|
| } |
|
|
| |
|
|
| this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); |
|
|
| } |
|
|
| WireframeGeometry.prototype = Object.create( BufferGeometry.prototype ); |
| WireframeGeometry.prototype.constructor = WireframeGeometry; |
|
|
|
|
| export { WireframeGeometry }; |
|
|