@@ -73,6 +73,7 @@ extensionCodec.register({
73
73
return to_return
74
74
} ,
75
75
} ) ;
76
+
76
77
// Float32Array
77
78
extensionCodec . register ( {
78
79
type : 0x17 ,
@@ -111,20 +112,32 @@ function merge_geometries(object, preserve_materials = false) {
111
112
}
112
113
collectGeometries ( object , root_transform ) ;
113
114
let result = null ;
115
+ let material ;
114
116
if ( geometries . length == 1 ) {
115
117
result = geometries [ 0 ] ;
116
118
if ( preserve_materials ) {
117
- result . material = materials [ 0 ] ;
119
+ material = materials [ 0 ] ;
118
120
}
119
121
} else if ( geometries . length > 1 ) {
120
122
result = mergeGeometries ( geometries , true ) ;
123
+ const ngeom = result . groups . length ;
124
+ let mts = [ ] ;
121
125
if ( preserve_materials ) {
122
- result . material = materials ;
126
+ for ( let i = 0 ; i < ngeom ; i ++ ) {
127
+ const group = result . groups [ i ] ;
128
+ let m = materials [ i ] ;
129
+ if ( Array . isArray ( m ) ) {
130
+ mts . push ( m [ m . length - 1 ] ) ;
131
+ } else {
132
+ mts . push ( m ) ;
133
+ }
134
+ }
135
+ material = mts ;
123
136
}
124
137
} else {
125
138
result = new THREE . BufferGeometry ( ) ;
126
139
}
127
- return result ;
140
+ return [ result , material ] ;
128
141
}
129
142
130
143
// Handler for special texture types that we want to support
@@ -169,30 +182,28 @@ function handle_special_geometry(geom) {
169
182
console . warn ( "_meshfile is deprecated. Please use _meshfile_geometry for geometries and _meshfile_object for objects with geometry and material" ) ;
170
183
geom . type = "_meshfile_geometry" ;
171
184
}
185
+ let geometry = null ;
186
+ let m = null ;
172
187
if ( geom . type == "_meshfile_geometry" ) {
173
188
if ( geom . format == "obj" ) {
174
189
let loader = new OBJLoader2 ( ) ;
175
190
let obj = loader . parse ( geom . data + "\n" ) ;
176
- let loaded_geom = merge_geometries ( obj ) ;
177
- loaded_geom . uuid = geom . uuid ;
178
- return loaded_geom ;
191
+ [ geometry , m ] = merge_geometries ( obj ) ;
192
+ geometry . uuid = geom . uuid ;
179
193
} else if ( geom . format == "dae" ) {
180
194
let loader = new ColladaLoader ( ) ;
181
195
let obj = loader . parse ( geom . data ) ;
182
- let result = merge_geometries ( obj . scene ) ;
183
- result . uuid = geom . uuid ;
184
- return result ;
196
+ [ geometry , m ] = merge_geometries ( obj . scene ) ;
197
+ geometry . uuid = geom . uuid ;
185
198
} else if ( geom . format == "stl" ) {
186
199
let loader = new STLLoader ( ) ;
187
- let loaded_geom = loader . parse ( geom . data . buffer ) ;
188
- loaded_geom . uuid = geom . uuid ;
189
- return loaded_geom ;
200
+ geometry = loader . parse ( geom . data . buffer ) ;
201
+ geometry . uuid = geom . uuid ;
190
202
} else {
191
203
console . error ( "Unsupported mesh type:" , geom ) ;
192
- return null ;
193
204
}
194
205
}
195
- return null ;
206
+ return geometry ;
196
207
}
197
208
198
209
// The ExtensibleObjectLoader extends the THREE.ObjectLoader
@@ -260,16 +271,14 @@ class ExtensibleObjectLoader extends THREE.ObjectLoader {
260
271
this . onTextureLoad ( ) ;
261
272
}
262
273
let obj = loader . parse ( json . data + "\n" , path ) ;
263
- geometry = merge_geometries ( obj , true ) ;
274
+ [ geometry , material ] = merge_geometries ( obj , true ) ;
264
275
geometry . uuid = json . uuid ;
265
- material = geometry . material ;
266
276
} else if ( json . format == "dae" ) {
267
277
let loader = new ColladaLoader ( manager ) ;
268
278
loader . onTextureLoad = this . onTextureLoad ;
269
279
let obj = loader . parse ( json . data , path ) ;
270
- geometry = merge_geometries ( obj . scene , true ) ;
280
+ [ geometry , material ] = merge_geometries ( obj . scene , true ) ;
271
281
geometry . uuid = json . uuid ;
272
- material = geometry . material ;
273
282
} else if ( json . format == "stl" ) {
274
283
let loader = new STLLoader ( ) ;
275
284
geometry = loader . parse ( json . data . buffer , path ) ;
0 commit comments