@@ -93,8 +93,8 @@ const transformGeometry = (geometry: THREE.BufferGeometry, mesh: mirabuf.IMesh)
9393class MirabufInstance {
9494 private _mirabufParser : MirabufParser
9595 private _materials : Map < string , THREE . Material >
96- private _meshes : Map < MirabufPartInstanceGUID , Array < [ THREE . BatchedMesh , number ] > >
97- private _batches : Array < THREE . BatchedMesh >
96+ private _meshes : Map < MirabufPartInstanceGUID , Array < [ THREE . InstancedMesh , number ] > >
97+ private _batches : Array < THREE . InstancedMesh >
9898
9999 public get parser ( ) {
100100 return this . _mirabufParser
@@ -163,90 +163,41 @@ class MirabufInstance {
163163 const assembly = this . _mirabufParser . assembly
164164 const instances = assembly . data ! . parts ! . partInstances !
165165
166- interface BatchCounts {
167- maxInstances : number
168- maxVertices : number
169- maxIndices : number
170- }
171-
172- const batchMap = new Map < THREE . Material , Map < string , [ mirabuf . IBody , Array < mirabuf . IPartInstance > ] > > ( )
173- const countMap = new Map < THREE . Material , BatchCounts > ( )
174- // Filter all instances by first material, then body
175166 Object . values ( instances ) . forEach ( instance => {
176167 const definition = assembly . data ! . parts ! . partDefinitions ! [ instance . partDefinitionReference ! ]
177168 const bodies = definition ?. bodies ?? [ ]
169+
178170 bodies . forEach ( body => {
179171 const mesh = body ?. triangleMesh ?. mesh
180172 if ( ! mesh ?. verts || ! mesh . normals || ! mesh . uv || ! mesh . indices ) return
181173
182174 const appearanceOverride = body . appearanceOverride
183-
184175 const material = WIREFRAME
185176 ? new THREE . MeshStandardMaterial ( { wireframe : true , color : 0x000000 } )
186177 : appearanceOverride && this . _materials . has ( appearanceOverride )
187178 ? this . _materials . get ( appearanceOverride ) !
188179 : fillerMaterials [ nextFillerMaterial ++ % fillerMaterials . length ]
189180
190- let materialBodyMap = batchMap . get ( material )
191- if ( ! materialBodyMap ) {
192- materialBodyMap = new Map < string , [ mirabuf . IBody , Array < mirabuf . IPartInstance > ] > ( )
193- batchMap . set ( material , materialBodyMap )
194- }
181+ const geometry = new THREE . BufferGeometry ( )
182+ transformGeometry ( geometry , mesh )
183+
184+ // Create InstancedMesh with count of 1 for this body
185+ const instancedMesh = new THREE . InstancedMesh ( geometry , material , 1 )
186+ instancedMesh . castShadow = true
187+ instancedMesh . receiveShadow = true
195188
196- const partBodyGuid = this . getPartBodyGuid ( definition , body )
197- let bodyInstances = materialBodyMap . get ( partBodyGuid )
198- if ( ! bodyInstances ) {
199- bodyInstances = [ body , [ ] ]
200- materialBodyMap . set ( partBodyGuid , bodyInstances )
201- }
202- bodyInstances [ 1 ] . push ( instance )
203-
204- if ( countMap . has ( material ) ) {
205- const count = countMap . get ( material ) !
206- count . maxInstances += 1
207- count . maxVertices += mesh . verts . length / 3
208- count . maxIndices += mesh . indices . length
209- return
210- }
189+ const mat = this . _mirabufParser . globalTransforms . get ( instance . info ! . GUID ! ) !
190+ instancedMesh . setMatrixAt ( 0 , mat )
191+ instancedMesh . instanceMatrix . needsUpdate = true
211192
212- const count : BatchCounts = {
213- maxInstances : 1 ,
214- maxVertices : mesh . verts . length / 3 ,
215- maxIndices : mesh . indices . length ,
216- }
217- countMap . set ( material , count )
218- } )
219- } )
193+ this . _batches . push ( instancedMesh )
220194
221- // Construct batched meshes
222- batchMap . forEach ( ( materialBodyMap , material ) => {
223- const count = countMap . get ( material ) !
224- const batchedMesh = new THREE . BatchedMesh ( count . maxInstances , count . maxVertices , count . maxIndices )
225- this . _batches . push ( batchedMesh )
226-
227- batchedMesh . material = material
228- batchedMesh . castShadow = true
229- batchedMesh . receiveShadow = true
230-
231- materialBodyMap . forEach ( instances => {
232- const body = instances [ 0 ]
233- instances [ 1 ] . forEach ( instance => {
234- const mat = this . _mirabufParser . globalTransforms . get ( instance . info ! . GUID ! ) !
235-
236- const geometry = new THREE . BufferGeometry ( )
237- transformGeometry ( geometry , body . triangleMesh ! . mesh ! )
238- const geoId = batchedMesh . addGeometry ( geometry )
239- const instanceId = batchedMesh . addInstance ( geoId )
240- batchedMesh . setMatrixAt ( instanceId , mat )
241-
242- let bodies = this . _meshes . get ( instance . info ! . GUID ! )
243- if ( ! bodies ) {
244- bodies = [ ]
245- this . _meshes . set ( instance . info ! . GUID ! , bodies )
246- }
247-
248- bodies . push ( [ batchedMesh , geoId ] )
249- } )
195+ let bodies = this . _meshes . get ( instance . info ! . GUID ! )
196+ if ( ! bodies ) {
197+ bodies = [ ]
198+ this . _meshes . set ( instance . info ! . GUID ! , bodies )
199+ }
200+ bodies . push ( [ instancedMesh , 0 ] )
250201 } )
251202 } )
252203 }
0 commit comments