@@ -98,6 +98,7 @@ extensionCodec.register({
98
98
return to_return
99
99
} ,
100
100
} ) ;
101
+
101
102
// Float32Array
102
103
extensionCodec . register ( {
103
104
type : 0x17 ,
@@ -136,20 +137,32 @@ function merge_geometries(object, preserve_materials = false) {
136
137
}
137
138
collectGeometries ( object , root_transform ) ;
138
139
let result = null ;
140
+ let material ;
139
141
if ( geometries . length == 1 ) {
140
142
result = geometries [ 0 ] ;
141
143
if ( preserve_materials ) {
142
- result . material = materials [ 0 ] ;
144
+ material = materials [ 0 ] ;
143
145
}
144
146
} else if ( geometries . length > 1 ) {
145
147
result = mergeGeometries ( geometries , true ) ;
148
+ const ngeom = result . groups . length ;
149
+ let mts = [ ] ;
146
150
if ( preserve_materials ) {
147
- result . material = materials ;
151
+ for ( let i = 0 ; i < ngeom ; i ++ ) {
152
+ const group = result . groups [ i ] ;
153
+ let m = materials [ i ] ;
154
+ if ( Array . isArray ( m ) ) {
155
+ mts . push ( m [ m . length - 1 ] ) ;
156
+ } else {
157
+ mts . push ( m ) ;
158
+ }
159
+ }
160
+ material = mts ;
148
161
}
149
162
} else {
150
163
result = new THREE . BufferGeometry ( ) ;
151
164
}
152
- return result ;
165
+ return [ result , material ] ;
153
166
}
154
167
155
168
// Handler for special texture types that we want to support
@@ -194,30 +207,28 @@ function handle_special_geometry(geom) {
194
207
console . warn ( "_meshfile is deprecated. Please use _meshfile_geometry for geometries and _meshfile_object for objects with geometry and material" ) ;
195
208
geom . type = "_meshfile_geometry" ;
196
209
}
210
+ let geometry = null ;
211
+ let m = null ;
197
212
if ( geom . type == "_meshfile_geometry" ) {
198
213
if ( geom . format == "obj" ) {
199
214
let loader = new OBJLoader2 ( ) ;
200
215
let obj = loader . parse ( geom . data + "\n" ) ;
201
- let loaded_geom = merge_geometries ( obj ) ;
202
- loaded_geom . uuid = geom . uuid ;
203
- return loaded_geom ;
216
+ [ geometry , m ] = merge_geometries ( obj ) ;
217
+ geometry . uuid = geom . uuid ;
204
218
} else if ( geom . format == "dae" ) {
205
219
let loader = new ColladaLoader ( ) ;
206
220
let obj = loader . parse ( geom . data ) ;
207
- let result = merge_geometries ( obj . scene ) ;
208
- result . uuid = geom . uuid ;
209
- return result ;
221
+ [ geometry , m ] = merge_geometries ( obj . scene ) ;
222
+ geometry . uuid = geom . uuid ;
210
223
} else if ( geom . format == "stl" ) {
211
224
let loader = new STLLoader ( ) ;
212
- let loaded_geom = loader . parse ( geom . data . buffer ) ;
213
- loaded_geom . uuid = geom . uuid ;
214
- return loaded_geom ;
225
+ geometry = loader . parse ( geom . data . buffer ) ;
226
+ geometry . uuid = geom . uuid ;
215
227
} else {
216
228
console . error ( "Unsupported mesh type:" , geom ) ;
217
- return null ;
218
229
}
219
230
}
220
- return null ;
231
+ return geometry ;
221
232
}
222
233
223
234
// The ExtensibleObjectLoader extends the THREE.ObjectLoader
@@ -285,16 +296,14 @@ class ExtensibleObjectLoader extends THREE.ObjectLoader {
285
296
this . onTextureLoad ( ) ;
286
297
}
287
298
let obj = loader . parse ( json . data + "\n" , path ) ;
288
- geometry = merge_geometries ( obj , true ) ;
299
+ [ geometry , material ] = merge_geometries ( obj , true ) ;
289
300
geometry . uuid = json . uuid ;
290
- material = geometry . material ;
291
301
} else if ( json . format == "dae" ) {
292
302
let loader = new ColladaLoader ( manager ) ;
293
303
loader . onTextureLoad = this . onTextureLoad ;
294
304
let obj = loader . parse ( json . data , path ) ;
295
- geometry = merge_geometries ( obj . scene , true ) ;
305
+ [ geometry , material ] = merge_geometries ( obj . scene , true ) ;
296
306
geometry . uuid = json . uuid ;
297
- material = geometry . material ;
298
307
} else if ( json . format == "stl" ) {
299
308
let loader = new STLLoader ( ) ;
300
309
geometry = loader . parse ( json . data . buffer , path ) ;
0 commit comments