Skip to content

Commit 417985c

Browse files
committed
Fix
1 parent b21585c commit 417985c

File tree

2 files changed

+24
-70
lines changed

2 files changed

+24
-70
lines changed

fission/src/mirabuf/MirabufInstance.ts

Lines changed: 20 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ const transformGeometry = (geometry: THREE.BufferGeometry, mesh: mirabuf.IMesh)
9393
class 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
}

fission/src/mirabuf/MirabufSceneObject.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,10 @@ class MirabufSceneObject extends SceneObject implements ContextSupplier {
471471
.clone()
472472
.premultiply(transform)
473473
const meshes = this._mirabufInstance.meshes.get(part) ?? []
474-
meshes.forEach(([batch, id]) => batch.setMatrixAt(id, partTransform))
474+
meshes.forEach(([instancedMesh, instanceIndex]) => {
475+
instancedMesh.setMatrixAt(instanceIndex, partTransform)
476+
instancedMesh.instanceMatrix.needsUpdate = true
477+
})
475478
})
476479
}
477480

0 commit comments

Comments
 (0)