Skip to content

Commit 53fbc5d

Browse files
committed
Merge pull request mrdoob#8427 from Mugen87/exporter
OBJExporter: Use BufferGeometry instead of Geometry
2 parents 9ff8468 + c745c3b commit 53fbc5d

2 files changed

Lines changed: 181 additions & 130 deletions

File tree

examples/js/exporters/OBJExporter.js

Lines changed: 92 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)