@@ -16,125 +16,138 @@ THREE.OBJExporter.prototype = {
1616 var indexVertexUvs = 0 ;
1717 var indexNormals = 0 ;
1818
19- var faceVertexKeys = [ "a" , "b" , "c" ] ;
19+ var vertex = new THREE . Vector3 ( ) ;
20+ var normal = new THREE . Vector3 ( ) ;
21+ var uv = new THREE . Vector2 ( ) ;
22+
23+ var i , j , m , face = [ ] ;
2024
2125 var parseMesh = function ( mesh ) {
2226
2327 var nbVertex = 0 ;
24- var nbVertexUvs = 0 ;
2528 var nbNormals = 0 ;
29+ var nbVertexUvs = 0 ;
2630
2731 var geometry = mesh . geometry ;
2832
29- if ( geometry instanceof THREE . BufferGeometry ) {
30-
31- geometry = new THREE . Geometry ( ) . fromBufferGeometry ( geometry ) ;
32-
33- }
33+ var normalMatrixWorld = new THREE . Matrix3 ( ) ;
3434
3535 if ( geometry instanceof THREE . Geometry ) {
3636
37- output += 'o ' + mesh . name + '\n' ;
37+ geometry = new THREE . BufferGeometry ( ) . setFromObject ( mesh ) ;
38+
39+ }
3840
39- var vertices = geometry . vertices ;
41+ if ( geometry instanceof THREE . BufferGeometry ) {
4042
41- for ( var i = 0 , l = vertices . length ; i < l ; i ++ ) {
43+ // shortcuts
44+ var vertices = geometry . getAttribute ( 'position' ) ;
45+ var normals = geometry . getAttribute ( 'normal' ) ;
46+ var uvs = geometry . getAttribute ( 'uv' ) ;
47+ var indices = geometry . getIndex ( ) ;
4248
43- var vertex = vertices [ i ] . clone ( ) ;
44- vertex . applyMatrix4 ( mesh . matrixWorld ) ;
49+ // name of the mesh object
50+ output += 'o ' + mesh . name + '\n' ;
4551
46- output += 'v ' + vertex . x + ' ' + vertex . y + ' ' + vertex . z + '\n' ;
52+ // vertices
4753
48- nbVertex ++ ;
54+ if ( vertices !== undefined ) {
4955
50- }
56+ for ( i = 0 ; i < vertices . count ; i ++ , nbVertex ++ ) {
5157
52- // uvs
58+ vertex . x = vertices . getX ( i ) ;
59+ vertex . y = vertices . getY ( i ) ;
60+ vertex . z = vertices . getZ ( i ) ;
5361
54- var faces = geometry . faces ;
55- var faceVertexUvs = geometry . faceVertexUvs [ 0 ] ;
56- var hasVertexUvs = faces . length === faceVertexUvs . length ;
62+ // transfrom the vertex to world space
63+ vertex . applyMatrix4 ( mesh . matrixWorld ) ;
5764
58- if ( hasVertexUvs ) {
65+ // transform the vertex to export format
66+ output += 'v ' + vertex . x + ' ' + vertex . y + ' ' + vertex . z + '\n' ;
5967
60- for ( var i = 0 , l = faceVertexUvs . length ; i < l ; i ++ ) {
68+ }
6169
62- var vertexUvs = faceVertexUvs [ i ] ;
70+ }
6371
64- for ( var j = 0 , jl = vertexUvs . length ; j < jl ; j ++ ) {
72+ // uvs
6573
66- var uv = vertexUvs [ j ] ;
74+ if ( uvs !== undefined ) {
6775
68- output += 'vt ' + uv . x + ' ' + uv . y + '\n' ;
76+ for ( i = 0 ; i < uvs . count ; i ++ , nbVertexUvs ++ ) {
6977
70- nbVertexUvs ++ ;
78+ uv . x = uvs . getX ( i ) ;
79+ uv . y = uvs . getY ( i ) ;
7180
72- }
81+ // transform the uv to export format
82+ output += 'vt ' + uv . x + ' ' + uv . y + '\n' ;
7383
7484 }
7585
7686 }
7787
7888 // normals
7989
80- var normalMatrixWorld = new THREE . Matrix3 ( ) ;
81- normalMatrixWorld . getNormalMatrix ( mesh . matrixWorld ) ;
90+ if ( normals !== undefined ) {
8291
83- for ( var i = 0 , l = faces . length ; i < l ; i ++ ) {
92+ normalMatrixWorld . getNormalMatrix ( mesh . matrixWorld ) ;
8493
85- var face = faces [ i ] ;
86- var vertexNormals = face . vertexNormals ;
94+ for ( i = 0 ; i < normals . count ; i ++ , nbNormals ++ ) {
8795
88- if ( vertexNormals . length === 3 ) {
96+ normal . x = normals . getX ( i ) ;
97+ normal . y = normals . getY ( i ) ;
98+ normal . z = normals . getZ ( i ) ;
8999
90- for ( var j = 0 , jl = vertexNormals . length ; j < jl ; j ++ ) {
100+ // transfrom the normal to world space
101+ normal . applyMatrix3 ( normalMatrixWorld ) ;
91102
92- var normal = vertexNormals [ j ] . clone ( ) ;
93- normal . applyMatrix3 ( normalMatrixWorld ) ;
103+ // transform the normal to export format
104+ output += 'vn ' + normal . x + ' ' + normal . y + ' ' + normal . z + '\n' ;
94105
95- output += 'vn ' + normal . x + ' ' + normal . y + ' ' + normal . z + '\n' ;
106+ }
96107
97- nbNormals ++ ;
108+ }
98109
99- }
110+ // faces
100111
101- } else {
112+ if ( indices !== null ) {
102113
103- var normal = face . normal . clone ( ) ;
104- normal . applyMatrix3 ( normalMatrixWorld ) ;
114+ for ( i = 0 ; i < indices . count ; i += 3 ) {
105115
106- for ( var j = 0 ; j < 3 ; j ++ ) {
116+ for ( m = 0 ; m < 3 ; m ++ ) {
107117
108- output += 'vn ' + normal . x + ' ' + normal . y + ' ' + normal . z + '\n' ;
118+ j = indices . getX ( i + m ) + 1 ;
109119
110- nbNormals ++ ;
120+ face [ m ] = ( indexVertex + j ) + '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + '/' + ( indexNormals + j ) ;
111121
112122 }
113123
124+ // transform the face to export format
125+ output += 'f ' + face . join ( ' ' ) + "\n" ;
126+
114127 }
115128
116- }
129+ } else {
117130
118- // faces
119- var indices = [ ] ;
131+ for ( i = 0 ; i < vertices . count ; i += 3 ) {
120132
121- for ( var i = 0 , j = 1 , l = faces . length ; i < l ; i ++ , j += 3 ) {
133+ for ( m = 0 ; m < 3 ; m ++ ) {
122134
123- var face = faces [ i ] ;
135+ j = i + m + 1 ;
124136
125- for ( var m = 0 ; m < 3 ; m ++ ) {
137+ face [ m ] = ( indexVertex + j ) + '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + '/' + ( indexNormals + j ) ;
126138
127- indices [ m ] = ( indexVertex + face [ faceVertexKeys [ m ] ] + 1 ) + '/' + ( hasVertexUvs ? ( indexVertexUvs + j + m + 1 ) : '' ) + '/' + ( indexNormals + j + m + 1 ) ;
139+ }
128140
129- }
141+ // transform the face to export format
142+ output += 'f ' + face . join ( ' ' ) + "\n" ;
130143
131- output += 'f ' + indices . join ( ' ' ) + "\n" ;
144+ }
132145
133146 }
134147
135148 } else {
136149
137- console . warn ( 'THREE.OBJExporter.parseMesh(): geometry type unsupported' , mesh ) ;
150+ console . warn ( 'THREE.OBJExporter.parseMesh(): geometry type unsupported' , geometry ) ;
138151
139152 }
140153
@@ -150,32 +163,44 @@ THREE.OBJExporter.prototype = {
150163 var geometry = line . geometry ;
151164 var type = line . type ;
152165
153- if ( geometry instanceof THREE . BufferGeometry ) {
166+ if ( geometry instanceof THREE . Geometry ) {
154167
155- geometry = new THREE . Geometry ( ) . fromBufferGeometry ( geometry ) ;
168+ geometry = new THREE . BufferGeometry ( ) . setFromObject ( line ) ;
156169
157170 }
158171
159- if ( geometry instanceof THREE . Geometry ) {
172+ if ( geometry instanceof THREE . BufferGeometry ) {
173+
174+ // shortcuts
175+ var vertices = geometry . getAttribute ( 'position' ) ;
176+ var indices = geometry . getIndex ( ) ;
160177
178+ // name of the line object
161179 output += 'o ' + line . name + '\n' ;
162180
163- var vertices = geometry . vertices ;
181+ if ( vertices !== undefined ) {
164182
165- for ( var i = 0 , l = vertices . length ; i < l ; i ++ ) {
183+ for ( i = 0 ; i < vertices . count ; i ++ ) {
166184
167- var vertex = vertices [ i ] . clone ( ) ;
168- vertex . applyMatrix4 ( line . matrixWorld ) ;
185+ vertex . x = vertices . getX ( i ) ;
186+ vertex . y = vertices . getY ( i ) ;
187+ vertex . z = vertices . getZ ( i ) ;
169188
170- output += 'v ' + vertex . x + ' ' + vertex . y + ' ' + vertex . z + '\n' ;
189+ // transfrom the vertex to world space
190+ vertex . applyMatrix4 ( line . matrixWorld ) ;
191+
192+ // transform the vertex to export format
193+ output += 'v ' + vertex . x + ' ' + vertex . y + ' ' + vertex . z + '\n' ;
194+
195+ }
171196
172197 }
173198
174199 if ( type === 'Line' ) {
175200
176201 output += 'l ' ;
177202
178- for ( var j = 1 , m = vertices . length ; j <= m ; j ++ ) {
203+ for ( j = 1 ; j <= vertices . count ; j ++ ) {
179204
180205 output += j + ' ' ;
181206
@@ -187,7 +212,7 @@ THREE.OBJExporter.prototype = {
187212
188213 if ( type === 'LineSegments' ) {
189214
190- for ( var j = 1 , k = j + 1 , m = vertices . length ; j < m ; j += 2 , k = j + 1 ) {
215+ for ( j = 1 , k = j + 1 ; j < vertices . count ; j += 2 , k = j + 1 ) {
191216
192217 output += 'l ' + j + ' ' + k + '\n' ;
193218
@@ -197,9 +222,10 @@ THREE.OBJExporter.prototype = {
197222
198223 } else {
199224
200- console . warn ( 'THREE.OBJExporter.parseLine(): geometry type unsupported' , line ) ;
225+ console . warn ( 'THREE.OBJExporter.parseLine(): geometry type unsupported' , geometry ) ;
201226
202227 }
228+
203229 } ;
204230
205231 object . traverse ( function ( child ) {
0 commit comments