1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | import { BufferGeometry } from '../core/BufferGeometry.js';
|
7 | import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
8 | import { Vector3 } from '../math/Vector3.js';
|
9 |
|
10 | function WireframeGeometry( geometry ) {
|
11 |
|
12 | BufferGeometry.call( this );
|
13 |
|
14 | this.type = 'WireframeGeometry';
|
15 |
|
16 |
|
17 |
|
18 | var vertices = [];
|
19 |
|
20 |
|
21 |
|
22 | var i, j, l, o, ol;
|
23 | var edge = [ 0, 0 ], edges = {}, e, edge1, edge2;
|
24 | var key, keys = [ 'a', 'b', 'c' ];
|
25 | var vertex;
|
26 |
|
27 |
|
28 |
|
29 | if ( geometry && geometry.isGeometry ) {
|
30 |
|
31 |
|
32 |
|
33 | var faces = geometry.faces;
|
34 |
|
35 | for ( i = 0, l = faces.length; i < l; i ++ ) {
|
36 |
|
37 | var face = faces[ i ];
|
38 |
|
39 | for ( j = 0; j < 3; j ++ ) {
|
40 |
|
41 | edge1 = face[ keys[ j ] ];
|
42 | edge2 = face[ keys[ ( j + 1 ) % 3 ] ];
|
43 | edge[ 0 ] = Math.min( edge1, edge2 );
|
44 | edge[ 1 ] = Math.max( edge1, edge2 );
|
45 |
|
46 | key = edge[ 0 ] + ',' + edge[ 1 ];
|
47 |
|
48 | if ( edges[ key ] === undefined ) {
|
49 |
|
50 | edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };
|
51 |
|
52 | }
|
53 |
|
54 | }
|
55 |
|
56 | }
|
57 |
|
58 |
|
59 |
|
60 | for ( key in edges ) {
|
61 |
|
62 | e = edges[ key ];
|
63 |
|
64 | vertex = geometry.vertices[ e.index1 ];
|
65 | vertices.push( vertex.x, vertex.y, vertex.z );
|
66 |
|
67 | vertex = geometry.vertices[ e.index2 ];
|
68 | vertices.push( vertex.x, vertex.y, vertex.z );
|
69 |
|
70 | }
|
71 |
|
72 | } else if ( geometry && geometry.isBufferGeometry ) {
|
73 |
|
74 | var position, indices, groups;
|
75 | var group, start, count;
|
76 | var index1, index2;
|
77 |
|
78 | vertex = new Vector3();
|
79 |
|
80 | if ( geometry.index !== null ) {
|
81 |
|
82 |
|
83 |
|
84 | position = geometry.attributes.position;
|
85 | indices = geometry.index;
|
86 | groups = geometry.groups;
|
87 |
|
88 | if ( groups.length === 0 ) {
|
89 |
|
90 | groups = [ { start: 0, count: indices.count, materialIndex: 0 } ];
|
91 |
|
92 | }
|
93 |
|
94 |
|
95 |
|
96 | for ( o = 0, ol = groups.length; o < ol; ++ o ) {
|
97 |
|
98 | group = groups[ o ];
|
99 |
|
100 | start = group.start;
|
101 | count = group.count;
|
102 |
|
103 | for ( i = start, l = ( start + count ); i < l; i += 3 ) {
|
104 |
|
105 | for ( j = 0; j < 3; j ++ ) {
|
106 |
|
107 | edge1 = indices.getX( i + j );
|
108 | edge2 = indices.getX( i + ( j + 1 ) % 3 );
|
109 | edge[ 0 ] = Math.min( edge1, edge2 );
|
110 | edge[ 1 ] = Math.max( edge1, edge2 );
|
111 |
|
112 | key = edge[ 0 ] + ',' + edge[ 1 ];
|
113 |
|
114 | if ( edges[ key ] === undefined ) {
|
115 |
|
116 | edges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };
|
117 |
|
118 | }
|
119 |
|
120 | }
|
121 |
|
122 | }
|
123 |
|
124 | }
|
125 |
|
126 |
|
127 |
|
128 | for ( key in edges ) {
|
129 |
|
130 | e = edges[ key ];
|
131 |
|
132 | vertex.fromBufferAttribute( position, e.index1 );
|
133 | vertices.push( vertex.x, vertex.y, vertex.z );
|
134 |
|
135 | vertex.fromBufferAttribute( position, e.index2 );
|
136 | vertices.push( vertex.x, vertex.y, vertex.z );
|
137 |
|
138 | }
|
139 |
|
140 | } else {
|
141 |
|
142 |
|
143 |
|
144 | position = geometry.attributes.position;
|
145 |
|
146 | for ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {
|
147 |
|
148 | for ( j = 0; j < 3; j ++ ) {
|
149 |
|
150 |
|
151 |
|
152 |
|
153 | index1 = 3 * i + j;
|
154 | vertex.fromBufferAttribute( position, index1 );
|
155 | vertices.push( vertex.x, vertex.y, vertex.z );
|
156 |
|
157 | index2 = 3 * i + ( ( j + 1 ) % 3 );
|
158 | vertex.fromBufferAttribute( position, index2 );
|
159 | vertices.push( vertex.x, vertex.y, vertex.z );
|
160 |
|
161 | }
|
162 |
|
163 | }
|
164 |
|
165 | }
|
166 |
|
167 | }
|
168 |
|
169 |
|
170 |
|
171 | this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
172 |
|
173 | }
|
174 |
|
175 | WireframeGeometry.prototype = Object.create( BufferGeometry.prototype );
|
176 | WireframeGeometry.prototype.constructor = WireframeGeometry;
|
177 |
|
178 |
|
179 | export { WireframeGeometry };
|