@@ -73,6 +73,7 @@ extensionCodec.register({
7373 return to_return
7474 } ,
7575} ) ;
76+
7677// Float32Array
7778extensionCodec . register ( {
7879 type : 0x17 ,
@@ -111,20 +112,32 @@ function merge_geometries(object, preserve_materials = false) {
111112 }
112113 collectGeometries ( object , root_transform ) ;
113114 let result = null ;
115+ let material ;
114116 if ( geometries . length == 1 ) {
115117 result = geometries [ 0 ] ;
116118 if ( preserve_materials ) {
117- result . material = materials [ 0 ] ;
119+ material = materials [ 0 ] ;
118120 }
119121 } else if ( geometries . length > 1 ) {
120122 result = mergeGeometries ( geometries , true ) ;
123+ const ngeom = result . groups . length ;
124+ let mts = [ ] ;
121125 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 ;
123136 }
124137 } else {
125138 result = new THREE . BufferGeometry ( ) ;
126139 }
127- return result ;
140+ return [ result , material ] ;
128141}
129142
130143// Handler for special texture types that we want to support
@@ -169,30 +182,28 @@ function handle_special_geometry(geom) {
169182 console . warn ( "_meshfile is deprecated. Please use _meshfile_geometry for geometries and _meshfile_object for objects with geometry and material" ) ;
170183 geom . type = "_meshfile_geometry" ;
171184 }
185+ let geometry = null ;
186+ let m = null ;
172187 if ( geom . type == "_meshfile_geometry" ) {
173188 if ( geom . format == "obj" ) {
174189 let loader = new OBJLoader2 ( ) ;
175190 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 ;
179193 } else if ( geom . format == "dae" ) {
180194 let loader = new ColladaLoader ( ) ;
181195 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 ;
185198 } else if ( geom . format == "stl" ) {
186199 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 ;
190202 } else {
191203 console . error ( "Unsupported mesh type:" , geom ) ;
192- return null ;
193204 }
194205 }
195- return null ;
206+ return geometry ;
196207}
197208
198209// The ExtensibleObjectLoader extends the THREE.ObjectLoader
@@ -260,16 +271,14 @@ class ExtensibleObjectLoader extends THREE.ObjectLoader {
260271 this . onTextureLoad ( ) ;
261272 }
262273 let obj = loader . parse ( json . data + "\n" , path ) ;
263- geometry = merge_geometries ( obj , true ) ;
274+ [ geometry , material ] = merge_geometries ( obj , true ) ;
264275 geometry . uuid = json . uuid ;
265- material = geometry . material ;
266276 } else if ( json . format == "dae" ) {
267277 let loader = new ColladaLoader ( manager ) ;
268278 loader . onTextureLoad = this . onTextureLoad ;
269279 let obj = loader . parse ( json . data , path ) ;
270- geometry = merge_geometries ( obj . scene , true ) ;
280+ [ geometry , material ] = merge_geometries ( obj . scene , true ) ;
271281 geometry . uuid = json . uuid ;
272- material = geometry . material ;
273282 } else if ( json . format == "stl" ) {
274283 let loader = new STLLoader ( ) ;
275284 geometry = loader . parse ( json . data . buffer , path ) ;
0 commit comments