1 | /**
|
---|
2 | * @author mrdoob / http://mrdoob.com/
|
---|
3 | */
|
---|
4 |
|
---|
5 | THREE.WireframeHelper = function ( object, hex ) {
|
---|
6 |
|
---|
7 | var color = ( hex !== undefined ) ? hex : 0xffffff;
|
---|
8 |
|
---|
9 | var edge = [ 0, 0 ], hash = {};
|
---|
10 | var sortFunction = function ( a, b ) { return a - b };
|
---|
11 |
|
---|
12 | var keys = [ 'a', 'b', 'c' ];
|
---|
13 | var geometry = new THREE.BufferGeometry();
|
---|
14 |
|
---|
15 | if ( object.geometry instanceof THREE.Geometry ) {
|
---|
16 |
|
---|
17 | var vertices = object.geometry.vertices;
|
---|
18 | var faces = object.geometry.faces;
|
---|
19 | var numEdges = 0;
|
---|
20 |
|
---|
21 | // allocate maximal size
|
---|
22 | var edges = new Uint32Array( 6 * faces.length );
|
---|
23 |
|
---|
24 | for ( var i = 0, l = faces.length; i < l; i ++ ) {
|
---|
25 |
|
---|
26 | var face = faces[ i ];
|
---|
27 |
|
---|
28 | for ( var j = 0; j < 3; j ++ ) {
|
---|
29 |
|
---|
30 | edge[ 0 ] = face[ keys[ j ] ];
|
---|
31 | edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];
|
---|
32 | edge.sort( sortFunction );
|
---|
33 |
|
---|
34 | var key = edge.toString();
|
---|
35 |
|
---|
36 | if ( hash[ key ] === undefined ) {
|
---|
37 |
|
---|
38 | edges[ 2 * numEdges ] = edge[ 0 ];
|
---|
39 | edges[ 2 * numEdges + 1 ] = edge[ 1 ];
|
---|
40 | hash[ key ] = true;
|
---|
41 | numEdges ++;
|
---|
42 |
|
---|
43 | }
|
---|
44 |
|
---|
45 | }
|
---|
46 |
|
---|
47 | }
|
---|
48 |
|
---|
49 | geometry.addAttribute( 'position', Float32Array, 2 * numEdges, 3 );
|
---|
50 |
|
---|
51 | var coords = geometry.attributes.position.array;
|
---|
52 |
|
---|
53 | for ( var i = 0, l = numEdges; i < l; i ++ ) {
|
---|
54 |
|
---|
55 | for ( var j = 0; j < 2; j ++ ) {
|
---|
56 |
|
---|
57 | var vertex = vertices[ edges [ 2 * i + j] ];
|
---|
58 |
|
---|
59 | var index = 6 * i + 3 * j;
|
---|
60 | coords[ index + 0 ] = vertex.x;
|
---|
61 | coords[ index + 1 ] = vertex.y;
|
---|
62 | coords[ index + 2 ] = vertex.z;
|
---|
63 |
|
---|
64 | }
|
---|
65 |
|
---|
66 | }
|
---|
67 |
|
---|
68 | } else if ( object.geometry instanceof THREE.BufferGeometry && object.geometry.attributes.index !== undefined ) { // indexed BufferGeometry
|
---|
69 |
|
---|
70 | var vertices = object.geometry.attributes.position.array;
|
---|
71 | var indices = object.geometry.attributes.index.array;
|
---|
72 | var offsets = object.geometry.offsets;
|
---|
73 | var numEdges = 0;
|
---|
74 |
|
---|
75 | // allocate maximal size
|
---|
76 | var edges = new Uint32Array( 2 * indices.length );
|
---|
77 |
|
---|
78 | for ( var o = 0, ol = offsets.length; o < ol; ++ o ) {
|
---|
79 |
|
---|
80 | var start = offsets[ o ].start;
|
---|
81 | var count = offsets[ o ].count;
|
---|
82 | var index = offsets[ o ].index;
|
---|
83 |
|
---|
84 | for ( var i = start, il = start + count; i < il; i += 3 ) {
|
---|
85 |
|
---|
86 | for ( var j = 0; j < 3; j ++ ) {
|
---|
87 |
|
---|
88 | edge[ 0 ] = index + indices[ i + j ];
|
---|
89 | edge[ 1 ] = index + indices[ i + ( j + 1 ) % 3 ];
|
---|
90 | edge.sort( sortFunction );
|
---|
91 |
|
---|
92 | var key = edge.toString();
|
---|
93 |
|
---|
94 | if ( hash[ key ] === undefined ) {
|
---|
95 |
|
---|
96 | edges[ 2 * numEdges ] = edge[ 0 ];
|
---|
97 | edges[ 2 * numEdges + 1 ] = edge[ 1 ];
|
---|
98 | hash[ key ] = true;
|
---|
99 | numEdges ++;
|
---|
100 |
|
---|
101 | }
|
---|
102 |
|
---|
103 | }
|
---|
104 |
|
---|
105 | }
|
---|
106 |
|
---|
107 | }
|
---|
108 |
|
---|
109 | geometry.addAttribute( 'position', Float32Array, 2 * numEdges, 3 );
|
---|
110 |
|
---|
111 | var coords = geometry.attributes.position.array;
|
---|
112 |
|
---|
113 | for ( var i = 0, l = numEdges; i < l; i ++ ) {
|
---|
114 |
|
---|
115 | for ( var j = 0; j < 2; j ++ ) {
|
---|
116 |
|
---|
117 | var index = 6 * i + 3 * j;
|
---|
118 | var index2 = 3 * edges[ 2 * i + j];
|
---|
119 | coords[ index + 0 ] = vertices[ index2 ];
|
---|
120 | coords[ index + 1 ] = vertices[ index2 + 1 ];
|
---|
121 | coords[ index + 2 ] = vertices[ index2 + 2 ];
|
---|
122 |
|
---|
123 | }
|
---|
124 |
|
---|
125 | }
|
---|
126 |
|
---|
127 | } else if ( object.geometry instanceof THREE.BufferGeometry ) { // non-indexed BufferGeometry
|
---|
128 |
|
---|
129 | var vertices = object.geometry.attributes.position.array;
|
---|
130 | var numEdges = vertices.length / 3;
|
---|
131 | var numTris = numEdges / 3;
|
---|
132 |
|
---|
133 | geometry.addAttribute( 'position', Float32Array, 2 * numEdges, 3 );
|
---|
134 |
|
---|
135 | var coords = geometry.attributes.position.array;
|
---|
136 |
|
---|
137 | for ( var i = 0, l = numTris; i < l; i ++ ) {
|
---|
138 |
|
---|
139 | for ( var j = 0; j < 3; j ++ ) {
|
---|
140 |
|
---|
141 | var index = 18 * i + 6 * j;
|
---|
142 |
|
---|
143 | var index1 = 9 * i + 3 * j;
|
---|
144 | coords[ index + 0 ] = vertices[ index1 ];
|
---|
145 | coords[ index + 1 ] = vertices[ index1 + 1 ];
|
---|
146 | coords[ index + 2 ] = vertices[ index1 + 2 ];
|
---|
147 |
|
---|
148 | var index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );
|
---|
149 | coords[ index + 3 ] = vertices[ index2 ];
|
---|
150 | coords[ index + 4 ] = vertices[ index2 + 1 ];
|
---|
151 | coords[ index + 5 ] = vertices[ index2 + 2 ];
|
---|
152 |
|
---|
153 | }
|
---|
154 |
|
---|
155 | }
|
---|
156 |
|
---|
157 | }
|
---|
158 |
|
---|
159 | THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: color } ), THREE.LinePieces );
|
---|
160 |
|
---|
161 | this.matrixAutoUpdate = false;
|
---|
162 | this.matrixWorld = object.matrixWorld;
|
---|
163 |
|
---|
164 | };
|
---|
165 |
|
---|
166 | THREE.WireframeHelper.prototype = Object.create( THREE.Line.prototype );
|
---|