@@ -246,20 +246,11 @@ unsigned int MeshSystem::countSourceName(const ModelComponent& model, const std:
246246}
247247
248248// Finds the override that patches a loaded submesh: by source key, then by name for a reordered
249- // asset, then by position for entries recovered from an old scene .
250- SubmeshOverride* MeshSystem::matchSubmeshOverride (ModelComponent& model, const Submesh& submesh, unsigned int submeshIndex ) {
249+ // asset.
250+ SubmeshOverride* MeshSystem::matchSubmeshOverride (ModelComponent& model, const Submesh& submesh) {
251251 const std::string sourceName = getSourceName (model, submesh.sourceNode , submesh.sourcePrimitive );
252252
253253 for (auto & submeshOverride : model.submeshOverrides ) {
254- if (submeshOverride.needMigrate ) {
255- // No source key yet: rebuilt from the submesh array of a scene saved before overrides.
256- if (submeshOverride.primitiveIndex == submeshIndex &&
257- (submeshOverride.nodeIndex < 0 || submeshOverride.nodeIndex == submesh.sourceNode )) {
258- return &submeshOverride;
259- }
260- continue ;
261- }
262-
263254 // The key is only trusted while the recorded name agrees: deleting a primitive shifts the
264255 // ones behind it, and a rename cannot be told from a deletion.
265256 if (submeshOverride.nodeIndex == submesh.sourceNode &&
@@ -277,7 +268,7 @@ SubmeshOverride* MeshSystem::matchSubmeshOverride(ModelComponent& model, const S
277268
278269 SubmeshOverride* match = nullptr ;
279270 for (auto & submeshOverride : model.submeshOverrides ) {
280- if (submeshOverride.needMigrate || submeshOverride. sourceName != sourceName) {
271+ if (submeshOverride.sourceName != sourceName) {
281272 continue ;
282273 }
283274 if (match) {
@@ -290,52 +281,6 @@ SubmeshOverride* MeshSystem::matchSubmeshOverride(ModelComponent& model, const S
290281 return match;
291282}
292283
293- // Reduces an entry recovered from an old scene to the fields that really differ from the file.
294- void MeshSystem::migrateSubmeshOverride (SubmeshOverride& submeshOverride, const Submesh& submesh) {
295- // Saved values lose a few bits in text; an exact compare would flag untouched fields.
296- auto sameFloat = [](float a, float b) { return std::fabs (a - b) <= 1e-5f ; };
297- auto sameVector3 = [&sameFloat](const Vector3& a, const Vector3& b) {
298- return sameFloat (a.x , b.x ) && sameFloat (a.y , b.y ) && sameFloat (a.z , b.z );
299- };
300- auto sameVector4 = [&sameFloat](const Vector4& a, const Vector4& b) {
301- return sameFloat (a.x , b.x ) && sameFloat (a.y , b.y ) && sameFloat (a.z , b.z ) && sameFloat (a.w , b.w );
302- };
303-
304- const Material& material = submesh.material ;
305- uint32_t fields = submeshOverride.fields ;
306-
307- if (sameVector4 (submeshOverride.material .baseColorFactor , material.baseColorFactor ))
308- fields &= ~SubmeshOverride_BaseColorFactor;
309- if (sameFloat (submeshOverride.material .metallicFactor , material.metallicFactor ))
310- fields &= ~SubmeshOverride_MetallicFactor;
311- if (sameFloat (submeshOverride.material .roughnessFactor , material.roughnessFactor ))
312- fields &= ~SubmeshOverride_RoughnessFactor;
313- if (sameFloat (submeshOverride.material .alphaCutoff , material.alphaCutoff ))
314- fields &= ~SubmeshOverride_AlphaCutoff;
315- if (sameVector3 (submeshOverride.material .emissiveFactor , material.emissiveFactor ))
316- fields &= ~SubmeshOverride_EmissiveFactor;
317- if (submeshOverride.material .alphaMode == material.alphaMode )
318- fields &= ~SubmeshOverride_AlphaMode;
319- if (submeshOverride.material .name == material.name )
320- fields &= ~SubmeshOverride_MaterialName;
321-
322- for (const SubmeshOverrideTextureSlot& slot : submeshOverrideTextureSlots) {
323- if (submeshOverride.material .*slot.texture == material.*slot.texture ) {
324- fields &= ~slot.field ;
325- }
326- }
327-
328- if (submeshOverride.faceCulling == submesh.faceCulling )
329- fields &= ~SubmeshOverride_FaceCulling;
330- if (submeshOverride.textureShadow == submesh.textureShadow )
331- fields &= ~SubmeshOverride_TextureShadow;
332- if (submeshOverride.primitiveType == submesh.primitiveType )
333- fields &= ~SubmeshOverride_PrimitiveType;
334-
335- submeshOverride.fields = fields;
336- submeshOverride.needMigrate = false ;
337- }
338-
339284// Re-applies the user's edits after a load, once per MeshComponent the loaders filled.
340285void MeshSystem::applySubmeshOverrides (ModelComponent& model, MeshComponent& mesh) {
341286 if (model.submeshOverrides .empty () || mesh.numSubmeshes == 0 ) {
@@ -345,15 +290,11 @@ void MeshSystem::applySubmeshOverrides(ModelComponent& model, MeshComponent& mes
345290 for (unsigned int i = 0 ; i < mesh.numSubmeshes ; i++) {
346291 Submesh& submesh = mesh.submeshes [i];
347292
348- SubmeshOverride* submeshOverride = matchSubmeshOverride (model, submesh, i );
293+ SubmeshOverride* submeshOverride = matchSubmeshOverride (model, submesh);
349294 if (!submeshOverride) {
350295 continue ;
351296 }
352297
353- if (submeshOverride->needMigrate ) {
354- migrateSubmeshOverride (*submeshOverride, submesh);
355- }
356-
357298 // Re-key to where the primitive lives now: a name match should not have to happen twice.
358299 submeshOverride->nodeIndex = submesh.sourceNode ;
359300 submeshOverride->primitiveIndex = submesh.sourcePrimitive ;
@@ -388,14 +329,6 @@ void MeshSystem::applySubmeshOverrides(ModelComponent& model, MeshComponent& mes
388329
389330 submesh.needUpdateTexture = true ;
390331 }
391-
392- // A migrated entry that matched the model file everywhere was never an edit.
393- model.submeshOverrides .erase (
394- std::remove_if (model.submeshOverrides .begin (), model.submeshOverrides .end (),
395- [](const SubmeshOverride& submeshOverride) {
396- return submeshOverride.fields == 0 && !submeshOverride.needMigrate ;
397- }),
398- model.submeshOverrides .end ());
399332}
400333
401334bool MeshSystem::createSprite (SpriteComponent& sprite, MeshComponent& mesh, CameraComponent& camera){
0 commit comments