Skip to content

Commit 2ad3abd

Browse files
committed
[wip] the null fields/mappings are a PAIN
1 parent c34e03d commit 2ad3abd

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/Magnum/Trade/Implementation/sceneTools.h

+2
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,8 @@ inline SceneData sceneConvertToSingleFunctionObjects(const SceneData& scene, Con
305305
- fields that don't actually get their object mapping touched
306306
during the process (and then all fields that share object
307307
mapping with them) */
308+
#warning removing implicit mapping from here will mean the null will get treated as a placeholder by copy(), not wanted
309+
#warning it needs to restore the field instead
308310
} else fields[i] = SceneFieldData{field.name(), field.mappingType(), field.mappingData(), field.fieldType(), field.fieldData(), field.fieldArraySize(), field.flags() & ~SceneFieldFlag::ImplicitMapping};
309311
}
310312

src/Magnum/Trade/Test/SceneToolsTest.cpp

+47-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ struct SceneToolsTest: TestSuite::Tester {
4141
void combineObjectsShared();
4242
void combineObjectsPlaceholderFieldPlaceholder();
4343
void combineObjectSharedFieldPlaceholder();
44+
void combineImplicitNullMapping();
45+
void combineTrivialNullParent();
4446

4547
void convertToSingleFunctionObjects();
4648
void convertToSingleFunctionObjectsFieldsToCopy();
@@ -80,7 +82,10 @@ SceneToolsTest::SceneToolsTest() {
8082
addTests({&SceneToolsTest::combineAlignment,
8183
&SceneToolsTest::combineObjectsShared,
8284
&SceneToolsTest::combineObjectsPlaceholderFieldPlaceholder,
83-
&SceneToolsTest::combineObjectSharedFieldPlaceholder});
85+
&SceneToolsTest::combineObjectSharedFieldPlaceholder,
86+
87+
&SceneToolsTest::combineImplicitNullMapping,
88+
&SceneToolsTest::combineTrivialNullParent});
8489

8590
addInstancedTests({&SceneToolsTest::convertToSingleFunctionObjects},
8691
Containers::arraySize(ConvertToSingleFunctionObjectsData));
@@ -349,6 +354,47 @@ void SceneToolsTest::combineObjectSharedFieldPlaceholder() {
349354
CORRADE_COMPARE(scene.field(SceneField::MeshMaterial).stride()[0], 4);
350355
}
351356

357+
void SceneToolsTest::combineImplicitNullMapping() {
358+
const Short parentFieldData[]{-1, 0, 0};
359+
const UnsignedByte meshFieldData[]{3, 5};
360+
361+
SceneData scene = Implementation::sceneCombine(SceneMappingType::UnsignedShort, 167, Containers::arrayView({
362+
/* If the field has any flags, it shouldn't be treated as a
363+
placeholder */
364+
#warning or maybe it should be preserved? yeah
365+
SceneFieldData{SceneField::Mesh, Containers::ArrayView<UnsignedByte>{nullptr, Containers::arraySize(meshFieldData)}, Containers::arrayView(meshFieldData), SceneFieldFlag::ImplicitMapping},
366+
SceneFieldData{SceneField::Parent, Containers::ArrayView<UnsignedShort>{nullptr, Containers::arraySize(parentFieldData)}, Containers::arrayView(parentFieldData), SceneFieldFlag::ImplicitMapping}
367+
}));
368+
369+
CORRADE_COMPARE(scene.mappingBound(), 167);
370+
CORRADE_COMPARE(scene.fieldCount(), 2);
371+
372+
CORRADE_COMPARE(scene.fieldName(0), SceneField::Mesh);
373+
CORRADE_COMPARE(scene.fieldFlags(0), SceneFieldFlag::ImplicitMapping);
374+
CORRADE_COMPARE(scene.fieldType(0), SceneFieldType::UnsignedByte);
375+
CORRADE_COMPARE(scene.fieldArraySize(0), 0);
376+
CORRADE_COMPARE_AS(scene.mapping<UnsignedShort>(0), Containers::arrayView<UnsignedShort>({
377+
0, 1, 2
378+
}), TestSuite::Compare::Container);
379+
CORRADE_COMPARE_AS(scene.field<UnsignedByte>(0),
380+
Containers::arrayView(meshFieldData),
381+
TestSuite::Compare::Container);
382+
383+
CORRADE_COMPARE(scene.fieldName(1), SceneField::Parent);
384+
CORRADE_COMPARE(scene.fieldFlags(1), SceneFieldFlag::ImplicitMapping);
385+
CORRADE_COMPARE(scene.fieldType(1), SceneFieldType::Short);
386+
CORRADE_COMPARE(scene.fieldArraySize(1), 0);
387+
CORRADE_COMPARE_AS(scene.mapping<UnsignedShort>(1), Containers::arrayView<UnsignedShort>({
388+
0, 1
389+
}), TestSuite::Compare::Container);
390+
CORRADE_COMPARE_AS(scene.field<UnsignedByte>(1),
391+
Containers::arrayView(meshFieldData),
392+
TestSuite::Compare::Container);
393+
}
394+
395+
void SceneToolsTest::combineTrivialNullParent() {
396+
}
397+
352398
void SceneToolsTest::convertToSingleFunctionObjects() {
353399
auto&& data = ConvertToSingleFunctionObjectsData[testCaseInstanceId()];
354400
setTestCaseDescription(data.name);

0 commit comments

Comments
 (0)