@@ -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,29 @@ 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 ;
202
+ return geometry ;
190
203
} else {
191
204
console . error ( "Unsupported mesh type:" , geom ) ;
192
- return null ;
193
205
}
194
206
}
195
- return null ;
207
+ return geometry ;
196
208
}
197
209
198
210
// The ExtensibleObjectLoader extends the THREE.ObjectLoader
@@ -260,16 +272,14 @@ class ExtensibleObjectLoader extends THREE.ObjectLoader {
260
272
this . onTextureLoad ( ) ;
261
273
}
262
274
let obj = loader . parse ( json . data + "\n" , path ) ;
263
- geometry = merge_geometries ( obj , true ) ;
275
+ [ geometry , material ] = merge_geometries ( obj , true ) ;
264
276
geometry . uuid = json . uuid ;
265
- material = geometry . material ;
266
277
} else if ( json . format == "dae" ) {
267
278
let loader = new ColladaLoader ( manager ) ;
268
279
loader . onTextureLoad = this . onTextureLoad ;
269
280
let obj = loader . parse ( json . data , path ) ;
270
- geometry = merge_geometries ( obj . scene , true ) ;
281
+ [ geometry , material ] = merge_geometries ( obj . scene , true ) ;
271
282
geometry . uuid = json . uuid ;
272
- material = geometry . material ;
273
283
} else if ( json . format == "stl" ) {
274
284
let loader = new STLLoader ( ) ;
275
285
geometry = loader . parse ( json . data . buffer , path ) ;
0 commit comments