Skip to content

Commit 07f6033

Browse files
committed
Removed submesh override migration that dropped model textures
1 parent e51786c commit 07f6033

7 files changed

Lines changed: 16 additions & 178 deletions

File tree

editor/Catalog.cpp

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,10 @@ namespace {
168168
return false;
169169
}
170170

171-
// What an override addresses: the owning model, the live submesh, and the mesh node a
172-
// not-yet-migrated entry was keyed with.
171+
// What an override addresses: the owning model and the live submesh.
173172
struct SubmeshOverrideTarget {
174173
ModelComponent* model = nullptr;
175174
const Submesh* submesh = nullptr;
176-
unsigned int submeshIndex = 0;
177-
int migrateNode = -1;
178175
std::string sourceName;
179176
};
180177

@@ -191,34 +188,14 @@ namespace {
191188

192189
target.model = &registry->getComponent<ModelComponent>(modelEntity);
193190
target.submesh = &mesh->submeshes[submeshIndex];
194-
target.submeshIndex = submeshIndex;
195-
target.migrateNode = -1;
196191
target.sourceName = MeshSystem::getSourceName(*target.model, target.submesh->sourceNode, target.submesh->sourcePrimitive);
197192

198-
if (entity != modelEntity) {
199-
for (const auto& meshNode : target.model->meshNodesMapping) {
200-
if (meshNode.second == entity) {
201-
target.migrateNode = meshNode.first;
202-
break;
203-
}
204-
}
205-
}
206-
207193
return true;
208194
}
209195

210-
// Mirrors MeshSystem's matching: a recorded entry through the primitive stamped on the submesh,
211-
// one still to migrate through the node and position it was built with.
196+
// Mirrors MeshSystem's matching, through the primitive stamped on the submesh.
212197
SubmeshOverride* findSubmeshOverrideEntry(const SubmeshOverrideTarget& target) {
213198
for (auto& submeshOverride : target.model->submeshOverrides) {
214-
if (submeshOverride.needMigrate) {
215-
if (submeshOverride.nodeIndex == target.migrateNode &&
216-
submeshOverride.primitiveIndex == target.submeshIndex) {
217-
return &submeshOverride;
218-
}
219-
continue;
220-
}
221-
222199
// Identity decides here too: an orphaned entry can still hold the numeric key of a
223200
// primitive that now belongs to someone else.
224201
if (submeshOverride.nodeIndex == target.submesh->sourceNode &&
@@ -3741,8 +3718,6 @@ void editor::Catalog::recordSubmeshOverride(EntityRegistry* registry, Entity ent
37413718
entry->sourceName = target.sourceName;
37423719
}
37433720

3744-
// An entry still to migrate is edited in place: it already carries every field, and the load
3745-
// reduces it to whatever differs from the model file, this edit included.
37463721
entry->fields |= fields;
37473722
storeSubmeshOverrideValues(*entry, *target.submesh);
37483723
}

editor/Factory.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1901,9 +1901,6 @@ std::string editor::Factory::createModelComponent(int indentSpaces, EntityRegist
19011901
code << subInd << "submeshOverride.primitiveIndex = " << formatUInt(submeshOverride.primitiveIndex) << ";\n";
19021902
code << subInd << "submeshOverride.sourceName = " << formatString(submeshOverride.sourceName) << ";\n";
19031903
code << subInd << "submeshOverride.fields = " << formatUInt(fields) << ";\n";
1904-
if (submeshOverride.needMigrate) {
1905-
code << subInd << "submeshOverride.needMigrate = true;\n";
1906-
}
19071904

19081905
if (fields & SubmeshOverride_BaseColorFactor)
19091906
code << subInd << "submeshOverride.material.baseColorFactor = " << formatVector4(material.baseColorFactor) << ";\n";

editor/Stream.cpp

Lines changed: 8 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1436,43 +1436,6 @@ Submesh editor::Stream::decodeSubmesh(const YAML::Node& node, const Submesh* old
14361436
return submesh;
14371437
}
14381438

1439-
// Rebuilds override entries from the submesh values of a model saved before overrides existed, so
1440-
// the load stops wiping the user's edits. Every field is carried over: the model file is not in
1441-
// memory yet, so MeshSystem reduces each entry to the real differences once it loads.
1442-
void editor::Stream::migrateSubmeshOverrides(EntityRegistry* registry, Entity entity) {
1443-
ModelComponent* model = registry->findComponent<ModelComponent>(entity);
1444-
if (!model || model->filename.empty() || !model->submeshOverrides.empty()) {
1445-
return;
1446-
}
1447-
1448-
auto collectMesh = [registry, model](Entity meshEntity, int nodeIndex) {
1449-
MeshComponent* mesh = registry->findComponent<MeshComponent>(meshEntity);
1450-
if (!mesh) {
1451-
return;
1452-
}
1453-
1454-
for (unsigned int i = 0; i < mesh->numSubmeshes; i++) {
1455-
SubmeshOverride submeshOverride;
1456-
submeshOverride.nodeIndex = nodeIndex;
1457-
submeshOverride.primitiveIndex = i;
1458-
submeshOverride.fields = SubmeshOverride_All;
1459-
submeshOverride.material = mesh->submeshes[i].material;
1460-
submeshOverride.faceCulling = mesh->submeshes[i].faceCulling;
1461-
submeshOverride.textureShadow = mesh->submeshes[i].textureShadow;
1462-
submeshOverride.primitiveType = mesh->submeshes[i].primitiveType;
1463-
submeshOverride.needMigrate = true;
1464-
1465-
model->submeshOverrides.push_back(submeshOverride);
1466-
}
1467-
};
1468-
1469-
// The root mesh (single-node and merged models) has no node of its own.
1470-
collectMesh(entity, -1);
1471-
for (const auto& meshNode : model->meshNodesMapping) {
1472-
collectMesh(meshNode.second, meshNode.first);
1473-
}
1474-
}
1475-
14761439
// Only the fields the user changed are written; the rest keeps following the model file.
14771440
YAML::Node editor::Stream::encodeSubmeshOverride(const SubmeshOverride& submeshOverride) {
14781441
YAML::Node node;
@@ -1486,10 +1449,6 @@ YAML::Node editor::Stream::encodeSubmeshOverride(const SubmeshOverride& submeshO
14861449
node["sourceName"] = submeshOverride.sourceName;
14871450
}
14881451
node["fields"] = fields;
1489-
// A migration that never ran (the model file failed to load) must stay a migration.
1490-
if (submeshOverride.needMigrate) {
1491-
node["needMigrate"] = true;
1492-
}
14931452

14941453
if (fields & SubmeshOverride_BaseColorFactor) node["baseColorFactor"] = encodeVector4(material.baseColorFactor);
14951454
if (fields & SubmeshOverride_MetallicFactor) node["metallicFactor"] = material.metallicFactor;
@@ -1522,7 +1481,6 @@ SubmeshOverride editor::Stream::decodeSubmeshOverride(const YAML::Node& node) {
15221481
if (node["primitiveIndex"]) submeshOverride.primitiveIndex = node["primitiveIndex"].as<unsigned int>();
15231482
if (node["sourceName"]) submeshOverride.sourceName = node["sourceName"].as<std::string>();
15241483
if (node["fields"]) submeshOverride.fields = node["fields"].as<uint32_t>();
1525-
if (node["needMigrate"]) submeshOverride.needMigrate = node["needMigrate"].as<bool>();
15261484

15271485
Material& material = submeshOverride.material;
15281486

@@ -2859,14 +2817,8 @@ std::vector<Entity> editor::Stream::decodeEntity(const YAML::Node& entityNode, E
28592817
std::string name = entityNode["name"].as<std::string>();
28602818
registry->setEntityName(entity, name);
28612819

2862-
bool migrateOverrides = false;
28632820
if (entityNode["components"]){
28642821
decodeComponents(entity, parent, registry, entityNode["components"]);
2865-
2866-
// A model saved before overrides existed still keeps the user's edits in its submesh
2867-
// arrays.
2868-
YAML::Node modelNode = entityNode["components"][Catalog::getComponentName(ComponentType::ModelComponent, true)];
2869-
migrateOverrides = modelNode && !modelNode["submeshOverrides"];
28702822
}
28712823

28722824
// Components added to a live entity after it was encoded, like a script calling
@@ -2900,11 +2852,6 @@ std::vector<Entity> editor::Stream::decodeEntity(const YAML::Node& entityNode, E
29002852
std::copy(childEntities.begin(), childEntities.end(), std::back_inserter(allEntities));
29012853
}
29022854
}
2903-
2904-
// Runs after the children: a model's generated meshes carry submesh values of their own.
2905-
if (migrateOverrides) {
2906-
migrateSubmeshOverrides(registry, entity);
2907-
}
29082855
}
29092856

29102857
return allEntities;
@@ -4856,15 +4803,13 @@ YAML::Node editor::Stream::encodeModelComponent(const ModelComponent& model) {
48564803
node["mergeStaticMeshes"] = true;
48574804
}
48584805

4859-
// Written even when empty: a missing key marks a scene saved before overrides existed.
4860-
YAML::Node overridesNode(YAML::NodeType::Sequence);
4861-
for (const auto& submeshOverride : model.submeshOverrides) {
4862-
if (submeshOverride.fields == 0) {
4863-
continue;
4806+
if (!model.submeshOverrides.empty()) {
4807+
YAML::Node overridesNode;
4808+
for (const auto& submeshOverride : model.submeshOverrides) {
4809+
overridesNode.push_back(encodeSubmeshOverride(submeshOverride));
48644810
}
4865-
overridesNode.push_back(encodeSubmeshOverride(submeshOverride));
4811+
node["submeshOverrides"] = overridesNode;
48664812
}
4867-
node["submeshOverrides"] = overridesNode;
48684813

48694814
node["skeleton"] = static_cast<uint32_t>(model.skeleton);
48704815

@@ -4924,11 +4869,9 @@ ModelComponent editor::Stream::decodeModelComponent(const YAML::Node& node, cons
49244869
if (node["mergeStaticMeshes"]) model.mergeStaticMeshes = node["mergeStaticMeshes"].as<bool>();
49254870
if (node["skeleton"]) model.skeleton = static_cast<Entity>(node["skeleton"].as<uint32_t>());
49264871

4927-
if (node["submeshOverrides"]) {
4928-
model.submeshOverrides.clear();
4929-
for (const auto& overrideNode : node["submeshOverrides"]) {
4930-
model.submeshOverrides.push_back(decodeSubmeshOverride(overrideNode));
4931-
}
4872+
model.submeshOverrides.clear();
4873+
for (const auto& overrideNode : node["submeshOverrides"]) {
4874+
model.submeshOverrides.push_back(decodeSubmeshOverride(overrideNode));
49324875
}
49334876

49344877
if (node["animations"]) {

editor/Stream.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,6 @@ namespace doriax::editor {
157157
static YAML::Node encodeSubmesh(const Submesh& submesh, bool embedTextureData = true);
158158
static Submesh decodeSubmesh(const YAML::Node& node, const Submesh* oldSubmesh = nullptr);
159159

160-
static void migrateSubmeshOverrides(EntityRegistry* registry, Entity entity);
161-
162160
static YAML::Node encodeSubmeshOverride(const SubmeshOverride& submeshOverride);
163161
static SubmeshOverride decodeSubmeshOverride(const YAML::Node& node);
164162

engine/core/component/ModelComponent.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,7 @@ namespace doriax{
4343
SubmeshOverride_EmissiveFactor | SubmeshOverride_AlphaMode |
4444
SubmeshOverride_MaterialName | SubmeshOverride_BaseColorTexture |
4545
SubmeshOverride_EmissiveTexture | SubmeshOverride_MetallicRoughnessTexture |
46-
SubmeshOverride_OcclusionTexture | SubmeshOverride_NormalTexture,
47-
48-
SubmeshOverride_All = SubmeshOverride_Material | SubmeshOverride_FaceCulling |
49-
SubmeshOverride_TextureShadow | SubmeshOverride_PrimitiveType
46+
SubmeshOverride_OcclusionTexture | SubmeshOverride_NormalTexture
5047
};
5148

5249
// Material texture slots, so override code does not spell all five out every time.
@@ -79,10 +76,6 @@ namespace doriax{
7976
bool faceCulling = true;
8077
bool textureShadow = false;
8178
PrimitiveType primitiveType = PrimitiveType::TRIANGLES;
82-
83-
// Rebuilt from a scene saved before overrides existed: no key yet, so the first load
84-
// matches it by position and reduces it to the real differences.
85-
bool needMigrate = false;
8679
};
8780

8881
struct DORIAX_API ModelComponent{

engine/core/subsystem/MeshSystem.cpp

Lines changed: 4 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
340285
void 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

401334
bool MeshSystem::createSprite(SpriteComponent& sprite, MeshComponent& mesh, CameraComponent& camera){

engine/core/subsystem/MeshSystem.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ namespace doriax{
7575
static void applyDefaultGLTFMaterial(Material& material);
7676
static void applyDefaultObjMaterial(Submesh& submesh);
7777
static unsigned int countSourceName(const ModelComponent& model, const std::string& sourceName);
78-
static SubmeshOverride* matchSubmeshOverride(ModelComponent& model, const Submesh& submesh, unsigned int submeshIndex);
79-
static void migrateSubmeshOverride(SubmeshOverride& submeshOverride, const Submesh& submesh);
78+
static SubmeshOverride* matchSubmeshOverride(ModelComponent& model, const Submesh& submesh);
8079
static void applySubmeshOverrides(ModelComponent& model, MeshComponent& mesh);
8180
void addSubmeshAttribute(Submesh& submesh, const std::string& bufferName, AttributeType attribute, unsigned int elements, AttributeDataType dataType, size_t size, size_t offset, bool normalized);
8281
bool loadGLTFBuffer(int bufferViewIndex, MeshComponent& mesh, ModelComponent& model, const int stride, std::vector<std::string>& loadedBuffers);

0 commit comments

Comments
 (0)