UNPKG

3.82 kBJavaScriptView Raw
1/**
2 * @author mrdoob / http://mrdoob.com/
3 * @author Mugen87 / https://github.com/Mugen87
4 */
5
6import { BufferGeometry } from '../core/BufferGeometry.js';
7import { Float32BufferAttribute } from '../core/BufferAttribute.js';
8import { Vector3 } from '../math/Vector3.js';
9
10function WireframeGeometry( geometry ) {
11
12 BufferGeometry.call( this );
13
14 this.type = 'WireframeGeometry';
15
16 // buffer
17
18 var vertices = [];
19
20 // helper variables
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 // different logic for Geometry and BufferGeometry
28
29 if ( geometry && geometry.isGeometry ) {
30
31 // create a data structure that contains all edges without duplicates
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 ); // sorting prevents duplicates
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 // generate vertices
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 // indexed BufferGeometry
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 // create a data structure that contains all eges without duplicates
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 ); // sorting prevents duplicates
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 // generate vertices
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 // non-indexed BufferGeometry
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 // three edges per triangle, an edge is represented as (index1, index2)
151 // e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)
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 // build geometry
170
171 this.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
172
173}
174
175WireframeGeometry.prototype = Object.create( BufferGeometry.prototype );
176WireframeGeometry.prototype.constructor = WireframeGeometry;
177
178
179export { WireframeGeometry };