Browse Source

Trade: make SceneField::MeshMaterial signed.

Because the material index has to share the object mapping with a mesh,
there needs to be a way to express meshes without associated materials.
pull/525/head
Vladimír Vondruš 5 years ago
parent
commit
56047b030e
  1. 57
      src/Magnum/Trade/SceneData.cpp
  2. 27
      src/Magnum/Trade/SceneData.h
  3. 42
      src/Magnum/Trade/Test/SceneDataTest.cpp

57
src/Magnum/Trade/SceneData.cpp

@ -1106,7 +1106,7 @@ Containers::Array<Matrix4> SceneData::transformations3DAsArray() const {
return out; return out;
} }
void SceneData::indexFieldIntoInternal(const UnsignedInt fieldId, const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const { void SceneData::unsignedIndexFieldIntoInternal(const UnsignedInt fieldId, const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const {
/* fieldId, offset and destination.size() is assumed to be in bounds, /* fieldId, offset and destination.size() is assumed to be in bounds,
checked by the callers */ checked by the callers */
@ -1123,8 +1123,31 @@ void SceneData::indexFieldIntoInternal(const UnsignedInt fieldId, const std::siz
else CORRADE_INTERNAL_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ else CORRADE_INTERNAL_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */
} }
Containers::Array<UnsignedInt> SceneData::indexFieldAsArrayInternal(const UnsignedInt fieldId) const { void SceneData::indexFieldIntoInternal(const UnsignedInt fieldId, const std::size_t offset, const Containers::StridedArrayView1D<Int>& destination) const {
/* fieldId, offset and destination.size() is assumed to be in bounds,
checked by the callers */
const SceneFieldData& field = _fields[fieldId];
const Containers::StridedArrayView1D<const void> fieldData = fieldDataFieldViewInternal(field, offset, destination.size());
const auto destination1ui = Containers::arrayCast<2, Int>(destination);
if(field._fieldType == SceneFieldType::Int)
Utility::copy(Containers::arrayCast<const Int>(fieldData), destination);
else if(field._fieldType == SceneFieldType::Short)
Math::castInto(Containers::arrayCast<2, const Short>(fieldData, 1), destination1ui);
else if(field._fieldType == SceneFieldType::Byte)
Math::castInto(Containers::arrayCast<2, const Byte>(fieldData, 1), destination1ui);
else CORRADE_INTERNAL_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */
}
Containers::Array<UnsignedInt> SceneData::unsignedIndexFieldAsArrayInternal(const UnsignedInt fieldId) const {
Containers::Array<UnsignedInt> out{NoInit, std::size_t(_fields[fieldId]._size)}; Containers::Array<UnsignedInt> out{NoInit, std::size_t(_fields[fieldId]._size)};
unsignedIndexFieldIntoInternal(fieldId, 0, out);
return out;
}
Containers::Array<Int> SceneData::indexFieldAsArrayInternal(const UnsignedInt fieldId) const {
Containers::Array<Int> out{NoInit, std::size_t(_fields[fieldId]._size)};
indexFieldIntoInternal(fieldId, 0, out); indexFieldIntoInternal(fieldId, 0, out);
return out; return out;
} }
@ -1135,7 +1158,7 @@ void SceneData::meshesInto(const Containers::StridedArrayView1D<UnsignedInt>& de
"Trade::SceneData::meshesInto(): field not found", ); "Trade::SceneData::meshesInto(): field not found", );
CORRADE_ASSERT(destination.size() == _fields[fieldId]._size, CORRADE_ASSERT(destination.size() == _fields[fieldId]._size,
"Trade::SceneData::meshesInto(): expected a view with" << _fields[fieldId]._size << "elements but got" << destination.size(), ); "Trade::SceneData::meshesInto(): expected a view with" << _fields[fieldId]._size << "elements but got" << destination.size(), );
indexFieldIntoInternal(fieldId, 0, destination); unsignedIndexFieldIntoInternal(fieldId, 0, destination);
} }
std::size_t SceneData::meshesInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const { std::size_t SceneData::meshesInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const {
@ -1145,7 +1168,7 @@ std::size_t SceneData::meshesInto(const std::size_t offset, const Containers::St
CORRADE_ASSERT(offset <= _fields[fieldId]._size, CORRADE_ASSERT(offset <= _fields[fieldId]._size,
"Trade::SceneData::meshesInto(): offset" << offset << "out of bounds for a field of size" << _fields[fieldId]._size, {}); "Trade::SceneData::meshesInto(): offset" << offset << "out of bounds for a field of size" << _fields[fieldId]._size, {});
const std::size_t size = Math::min(destination.size(), std::size_t(_fields[fieldId]._size) - offset); const std::size_t size = Math::min(destination.size(), std::size_t(_fields[fieldId]._size) - offset);
indexFieldIntoInternal(fieldId, offset, destination.prefix(size)); unsignedIndexFieldIntoInternal(fieldId, offset, destination.prefix(size));
return size; return size;
} }
@ -1155,10 +1178,10 @@ Containers::Array<UnsignedInt> SceneData::meshesAsArray() const {
/* Using the same message as in Into() to avoid too many redundant /* Using the same message as in Into() to avoid too many redundant
strings in the binary */ strings in the binary */
"Trade::SceneData::meshesInto(): field not found", {}); "Trade::SceneData::meshesInto(): field not found", {});
return indexFieldAsArrayInternal(fieldId); return unsignedIndexFieldAsArrayInternal(fieldId);
} }
void SceneData::meshMaterialsInto(const Containers::StridedArrayView1D<UnsignedInt>& destination) const { void SceneData::meshMaterialsInto(const Containers::StridedArrayView1D<Int>& destination) const {
const UnsignedInt fieldId = fieldFor(SceneField::MeshMaterial); const UnsignedInt fieldId = fieldFor(SceneField::MeshMaterial);
CORRADE_ASSERT(fieldId != ~UnsignedInt{}, CORRADE_ASSERT(fieldId != ~UnsignedInt{},
"Trade::SceneData::meshMaterialsInto(): field not found", ); "Trade::SceneData::meshMaterialsInto(): field not found", );
@ -1167,7 +1190,7 @@ void SceneData::meshMaterialsInto(const Containers::StridedArrayView1D<UnsignedI
indexFieldIntoInternal(fieldId, 0, destination); indexFieldIntoInternal(fieldId, 0, destination);
} }
std::size_t SceneData::meshMaterialsInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const { std::size_t SceneData::meshMaterialsInto(const std::size_t offset, const Containers::StridedArrayView1D<Int>& destination) const {
const UnsignedInt fieldId = fieldFor(SceneField::MeshMaterial); const UnsignedInt fieldId = fieldFor(SceneField::MeshMaterial);
CORRADE_ASSERT(fieldId != ~UnsignedInt{}, CORRADE_ASSERT(fieldId != ~UnsignedInt{},
"Trade::SceneData::meshMaterialsInto(): field not found", {}); "Trade::SceneData::meshMaterialsInto(): field not found", {});
@ -1178,7 +1201,7 @@ std::size_t SceneData::meshMaterialsInto(const std::size_t offset, const Contain
return size; return size;
} }
Containers::Array<UnsignedInt> SceneData::meshMaterialsAsArray() const { Containers::Array<Int> SceneData::meshMaterialsAsArray() const {
const UnsignedInt fieldId = fieldFor(SceneField::MeshMaterial); const UnsignedInt fieldId = fieldFor(SceneField::MeshMaterial);
CORRADE_ASSERT(fieldId != ~UnsignedInt{}, CORRADE_ASSERT(fieldId != ~UnsignedInt{},
/* Using the same message as in Into() to avoid too many redundant /* Using the same message as in Into() to avoid too many redundant
@ -1193,7 +1216,7 @@ void SceneData::lightsInto(const Containers::StridedArrayView1D<UnsignedInt>& de
"Trade::SceneData::lightsInto(): field not found", ); "Trade::SceneData::lightsInto(): field not found", );
CORRADE_ASSERT(destination.size() == _fields[fieldId]._size, CORRADE_ASSERT(destination.size() == _fields[fieldId]._size,
"Trade::SceneData::lightsInto(): expected a view with" << _fields[fieldId]._size << "elements but got" << destination.size(), ); "Trade::SceneData::lightsInto(): expected a view with" << _fields[fieldId]._size << "elements but got" << destination.size(), );
indexFieldIntoInternal(fieldId, 0, destination); unsignedIndexFieldIntoInternal(fieldId, 0, destination);
} }
std::size_t SceneData::lightsInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const { std::size_t SceneData::lightsInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const {
@ -1203,7 +1226,7 @@ std::size_t SceneData::lightsInto(const std::size_t offset, const Containers::St
CORRADE_ASSERT(offset <= _fields[fieldId]._size, CORRADE_ASSERT(offset <= _fields[fieldId]._size,
"Trade::SceneData::lightsInto(): offset" << offset << "out of bounds for a field of size" << _fields[fieldId]._size, {}); "Trade::SceneData::lightsInto(): offset" << offset << "out of bounds for a field of size" << _fields[fieldId]._size, {});
const std::size_t size = Math::min(destination.size(), std::size_t(_fields[fieldId]._size) - offset); const std::size_t size = Math::min(destination.size(), std::size_t(_fields[fieldId]._size) - offset);
indexFieldIntoInternal(fieldId, offset, destination.prefix(size)); unsignedIndexFieldIntoInternal(fieldId, offset, destination.prefix(size));
return size; return size;
} }
@ -1213,7 +1236,7 @@ Containers::Array<UnsignedInt> SceneData::lightsAsArray() const {
/* Using the same message as in Into() to avoid too many redundant /* Using the same message as in Into() to avoid too many redundant
strings in the binary */ strings in the binary */
"Trade::SceneData::lightsInto(): field not found", {}); "Trade::SceneData::lightsInto(): field not found", {});
return indexFieldAsArrayInternal(fieldId); return unsignedIndexFieldAsArrayInternal(fieldId);
} }
void SceneData::camerasInto(const Containers::StridedArrayView1D<UnsignedInt>& destination) const { void SceneData::camerasInto(const Containers::StridedArrayView1D<UnsignedInt>& destination) const {
@ -1222,7 +1245,7 @@ void SceneData::camerasInto(const Containers::StridedArrayView1D<UnsignedInt>& d
"Trade::SceneData::camerasInto(): field not found", ); "Trade::SceneData::camerasInto(): field not found", );
CORRADE_ASSERT(destination.size() == _fields[fieldId]._size, CORRADE_ASSERT(destination.size() == _fields[fieldId]._size,
"Trade::SceneData::camerasInto(): expected a view with" << _fields[fieldId]._size << "elements but got" << destination.size(), ); "Trade::SceneData::camerasInto(): expected a view with" << _fields[fieldId]._size << "elements but got" << destination.size(), );
indexFieldIntoInternal(fieldId, 0, destination); unsignedIndexFieldIntoInternal(fieldId, 0, destination);
} }
std::size_t SceneData::camerasInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const { std::size_t SceneData::camerasInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const {
@ -1232,7 +1255,7 @@ std::size_t SceneData::camerasInto(const std::size_t offset, const Containers::S
CORRADE_ASSERT(offset <= _fields[fieldId]._size, CORRADE_ASSERT(offset <= _fields[fieldId]._size,
"Trade::SceneData::camerasInto(): offset" << offset << "out of bounds for a field of size" << _fields[fieldId]._size, {}); "Trade::SceneData::camerasInto(): offset" << offset << "out of bounds for a field of size" << _fields[fieldId]._size, {});
const std::size_t size = Math::min(destination.size(), std::size_t(_fields[fieldId]._size) - offset); const std::size_t size = Math::min(destination.size(), std::size_t(_fields[fieldId]._size) - offset);
indexFieldIntoInternal(fieldId, offset, destination.prefix(size)); unsignedIndexFieldIntoInternal(fieldId, offset, destination.prefix(size));
return size; return size;
} }
@ -1242,7 +1265,7 @@ Containers::Array<UnsignedInt> SceneData::camerasAsArray() const {
/* Using the same message as in Into() to avoid too many redundant /* Using the same message as in Into() to avoid too many redundant
strings in the binary */ strings in the binary */
"Trade::SceneData::camerasInto(): field not found", {}); "Trade::SceneData::camerasInto(): field not found", {});
return indexFieldAsArrayInternal(fieldId); return unsignedIndexFieldAsArrayInternal(fieldId);
} }
void SceneData::skinsInto(const Containers::StridedArrayView1D<UnsignedInt>& destination) const { void SceneData::skinsInto(const Containers::StridedArrayView1D<UnsignedInt>& destination) const {
@ -1251,7 +1274,7 @@ void SceneData::skinsInto(const Containers::StridedArrayView1D<UnsignedInt>& des
"Trade::SceneData::skinsInto(): field not found", ); "Trade::SceneData::skinsInto(): field not found", );
CORRADE_ASSERT(destination.size() == _fields[fieldId]._size, CORRADE_ASSERT(destination.size() == _fields[fieldId]._size,
"Trade::SceneData::skinsInto(): expected a view with" << _fields[fieldId]._size << "elements but got" << destination.size(), ); "Trade::SceneData::skinsInto(): expected a view with" << _fields[fieldId]._size << "elements but got" << destination.size(), );
indexFieldIntoInternal(fieldId, 0, destination); unsignedIndexFieldIntoInternal(fieldId, 0, destination);
} }
std::size_t SceneData::skinsInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const { std::size_t SceneData::skinsInto(const std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const {
@ -1261,7 +1284,7 @@ std::size_t SceneData::skinsInto(const std::size_t offset, const Containers::Str
CORRADE_ASSERT(offset <= _fields[fieldId]._size, CORRADE_ASSERT(offset <= _fields[fieldId]._size,
"Trade::SceneData::skinsInto(): offset" << offset << "out of bounds for a field of size" << _fields[fieldId]._size, {}); "Trade::SceneData::skinsInto(): offset" << offset << "out of bounds for a field of size" << _fields[fieldId]._size, {});
const std::size_t size = Math::min(destination.size(), std::size_t(_fields[fieldId]._size) - offset); const std::size_t size = Math::min(destination.size(), std::size_t(_fields[fieldId]._size) - offset);
indexFieldIntoInternal(fieldId, offset, destination.prefix(size)); unsignedIndexFieldIntoInternal(fieldId, offset, destination.prefix(size));
return size; return size;
} }
@ -1271,7 +1294,7 @@ Containers::Array<UnsignedInt> SceneData::skinsAsArray() const {
/* Using the same message as in Into() to avoid too many redundant /* Using the same message as in Into() to avoid too many redundant
strings in the binary */ strings in the binary */
"Trade::SceneData::skinsInto(): field not found", {}); "Trade::SceneData::skinsInto(): field not found", {});
return indexFieldAsArrayInternal(fieldId); return unsignedIndexFieldAsArrayInternal(fieldId);
} }
Containers::Array<SceneFieldData> SceneData::releaseFieldData() { Containers::Array<SceneFieldData> SceneData::releaseFieldData() {

27
src/Magnum/Trade/SceneData.h

@ -208,10 +208,10 @@ enum class SceneField: UnsignedInt {
/** /**
* ID of a material for a @ref SceneField::Mesh, corresponding to the ID * ID of a material for a @ref SceneField::Mesh, corresponding to the ID
* passed to @ref AbstractImporter::material(). Type is usually * passed to @ref AbstractImporter::material() or @cpp -1 @ce if the mesh
* @ref SceneFieldType::UnsignedInt, but can be also any of * has no material associated. Type is usually @ref SceneFieldType::Int,
* @relativeref{SceneFieldType,UnsignedByte} or * but can be also any of @relativeref{SceneFieldType,Byte} or
* @relativeref{SceneFieldType,UnsignedShort}. Expected to share the * @relativeref{SceneFieldType,Short}. Expected to share the
* object mapping view with @ref SceneField::Mesh. * object mapping view with @ref SceneField::Mesh.
* @see @ref SceneData::meshMaterialsAsArray() * @see @ref SceneData::meshMaterialsAsArray()
*/ */
@ -1492,7 +1492,7 @@ class MAGNUM_TRADE_EXPORT SceneData {
* newly-allocated array. The field is expected to exist. * newly-allocated array. The field is expected to exist.
* @see @ref meshMaterialsInto(), @ref hasField() * @see @ref meshMaterialsInto(), @ref hasField()
*/ */
Containers::Array<UnsignedInt> meshMaterialsAsArray() const; Containers::Array<Int> meshMaterialsAsArray() const;
/** /**
* @brief Mesh material IDs as 32-bit integers into a pre-allocated view * @brief Mesh material IDs as 32-bit integers into a pre-allocated view
@ -1503,20 +1503,20 @@ class MAGNUM_TRADE_EXPORT SceneData {
* @p destination is sized to contain exactly all data. * @p destination is sized to contain exactly all data.
* @see @ref fieldSize(SceneField) const * @see @ref fieldSize(SceneField) const
*/ */
void meshMaterialsInto(const Containers::StridedArrayView1D<UnsignedInt>& destination) const; void meshMaterialsInto(const Containers::StridedArrayView1D<Int>& destination) const;
/** /**
* @brief A subrange of mesh material IDs as 32-bit integers into a pre-allocated view * @brief A subrange of mesh material IDs as 32-bit integers into a pre-allocated view
* @m_since_latest * @m_since_latest
* *
* Compared to @ref meshMaterialsInto(const Containers::StridedArrayView1D<UnsignedInt>&) const * Compared to @ref meshMaterialsInto(const Containers::StridedArrayView1D<Int>&) const
* extracts only a subrange of the field defined by @p offset and size * extracts only a subrange of the field defined by @p offset and size
* of the @p destination view, returning the count of items actually * of the @p destination view, returning the count of items actually
* extracted. The @p offset is expected to not be larger than the field * extracted. The @p offset is expected to not be larger than the field
* size. * size.
* @see @ref fieldSize(SceneField) const * @see @ref fieldSize(SceneField) const
*/ */
std::size_t meshMaterialsInto(std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const; std::size_t meshMaterialsInto(std::size_t offset, const Containers::StridedArrayView1D<Int>& destination) const;
/** /**
* @brief Light IDs as 32-bit integers * @brief Light IDs as 32-bit integers
@ -1689,8 +1689,10 @@ class MAGNUM_TRADE_EXPORT SceneData {
MAGNUM_TRADE_LOCAL std::size_t findTransformFields(UnsignedInt& transformationFieldId, UnsignedInt& translationFieldId, UnsignedInt& rotationFieldId, UnsignedInt& scalingFieldId) const; MAGNUM_TRADE_LOCAL std::size_t findTransformFields(UnsignedInt& transformationFieldId, UnsignedInt& translationFieldId, UnsignedInt& rotationFieldId, UnsignedInt& scalingFieldId) const;
MAGNUM_TRADE_LOCAL void transformations2DIntoInternal(UnsignedInt transformationFieldId, UnsignedInt translationFieldId, UnsignedInt rotationFieldId, UnsignedInt scalingFieldId, std::size_t offset, const Containers::StridedArrayView1D<Matrix3>& destination) const; MAGNUM_TRADE_LOCAL void transformations2DIntoInternal(UnsignedInt transformationFieldId, UnsignedInt translationFieldId, UnsignedInt rotationFieldId, UnsignedInt scalingFieldId, std::size_t offset, const Containers::StridedArrayView1D<Matrix3>& destination) const;
MAGNUM_TRADE_LOCAL void transformations3DIntoInternal(UnsignedInt transformationFieldId, UnsignedInt translationFieldId, UnsignedInt rotationFieldId, UnsignedInt scalingFieldId, std::size_t offset, const Containers::StridedArrayView1D<Matrix4>& destination) const; MAGNUM_TRADE_LOCAL void transformations3DIntoInternal(UnsignedInt transformationFieldId, UnsignedInt translationFieldId, UnsignedInt rotationFieldId, UnsignedInt scalingFieldId, std::size_t offset, const Containers::StridedArrayView1D<Matrix4>& destination) const;
MAGNUM_TRADE_LOCAL void indexFieldIntoInternal(const UnsignedInt fieldId, std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const; MAGNUM_TRADE_LOCAL void unsignedIndexFieldIntoInternal(const UnsignedInt fieldId, std::size_t offset, const Containers::StridedArrayView1D<UnsignedInt>& destination) const;
MAGNUM_TRADE_LOCAL Containers::Array<UnsignedInt> indexFieldAsArrayInternal(const UnsignedInt fieldId) const; MAGNUM_TRADE_LOCAL void indexFieldIntoInternal(const UnsignedInt fieldId, std::size_t offset, const Containers::StridedArrayView1D<Int>& destination) const;
MAGNUM_TRADE_LOCAL Containers::Array<UnsignedInt> unsignedIndexFieldAsArrayInternal(const UnsignedInt fieldId) const;
MAGNUM_TRADE_LOCAL Containers::Array<Int> indexFieldAsArrayInternal(const UnsignedInt fieldId) const;
DataFlags _dataFlags; DataFlags _dataFlags;
SceneObjectType _objectType; SceneObjectType _objectType;
@ -1857,13 +1859,16 @@ namespace Implementation {
type == SceneFieldType::Quaternion || type == SceneFieldType::Quaternion ||
type == SceneFieldType::Quaterniond)) || type == SceneFieldType::Quaterniond)) ||
((name == SceneField::Mesh || ((name == SceneField::Mesh ||
name == SceneField::MeshMaterial ||
name == SceneField::Light || name == SceneField::Light ||
name == SceneField::Camera || name == SceneField::Camera ||
name == SceneField::Skin) && name == SceneField::Skin) &&
(type == SceneFieldType::UnsignedByte || (type == SceneFieldType::UnsignedByte ||
type == SceneFieldType::UnsignedShort || type == SceneFieldType::UnsignedShort ||
type == SceneFieldType::UnsignedInt)) || type == SceneFieldType::UnsignedInt)) ||
(name == SceneField::MeshMaterial &&
(type == SceneFieldType::Byte ||
type == SceneFieldType::Short ||
type == SceneFieldType::Int)) ||
/* Custom fields can be anything */ /* Custom fields can be anything */
isSceneFieldCustom(name); isSceneFieldCustom(name);
} }

42
src/Magnum/Trade/Test/SceneDataTest.cpp

@ -303,9 +303,9 @@ SceneDataTest::SceneDataTest() {
Containers::arraySize(IntoArrayOffsetData)); Containers::arraySize(IntoArrayOffsetData));
addTests({&SceneDataTest::meshesIntoArrayInvalidSizeOrOffset, addTests({&SceneDataTest::meshesIntoArrayInvalidSizeOrOffset,
&SceneDataTest::meshMaterialsAsArray<UnsignedByte>, &SceneDataTest::meshMaterialsAsArray<Byte>,
&SceneDataTest::meshMaterialsAsArray<UnsignedShort>, &SceneDataTest::meshMaterialsAsArray<Short>,
&SceneDataTest::meshMaterialsAsArray<UnsignedInt>}); &SceneDataTest::meshMaterialsAsArray<Int>});
addInstancedTests({&SceneDataTest::meshMaterialsIntoArray}, addInstancedTests({&SceneDataTest::meshMaterialsIntoArray},
Containers::arraySize(IntoArrayOffsetData)); Containers::arraySize(IntoArrayOffsetData));
@ -1314,7 +1314,7 @@ void SceneDataTest::constructZeroFields() {
void SceneDataTest::constructZeroObjects() { void SceneDataTest::constructZeroObjects() {
int importerState; int importerState;
SceneFieldData meshes{SceneField::Mesh, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedShort, nullptr}; SceneFieldData meshes{SceneField::Mesh, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedShort, nullptr};
SceneFieldData materials{SceneField::MeshMaterial, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedInt, nullptr}; SceneFieldData materials{SceneField::MeshMaterial, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::Int, nullptr};
SceneData scene{SceneObjectType::UnsignedInt, 0, nullptr, {meshes, materials}, &importerState}; SceneData scene{SceneObjectType::UnsignedInt, 0, nullptr, {meshes, materials}, &importerState};
CORRADE_COMPARE(scene.dataFlags(), DataFlag::Owned|DataFlag::Mutable); CORRADE_COMPARE(scene.dataFlags(), DataFlag::Owned|DataFlag::Mutable);
CORRADE_VERIFY(!scene.fieldData().empty()); CORRADE_VERIFY(!scene.fieldData().empty());
@ -1327,7 +1327,7 @@ void SceneDataTest::constructZeroObjects() {
/* Field property access by name */ /* Field property access by name */
CORRADE_COMPARE(scene.fieldType(SceneField::Mesh), SceneFieldType::UnsignedShort); CORRADE_COMPARE(scene.fieldType(SceneField::Mesh), SceneFieldType::UnsignedShort);
CORRADE_COMPARE(scene.fieldType(SceneField::MeshMaterial), SceneFieldType::UnsignedInt); CORRADE_COMPARE(scene.fieldType(SceneField::MeshMaterial), SceneFieldType::Int);
CORRADE_COMPARE(scene.fieldSize(SceneField::Mesh), 0); CORRADE_COMPARE(scene.fieldSize(SceneField::Mesh), 0);
CORRADE_COMPARE(scene.fieldSize(SceneField::MeshMaterial), 0); CORRADE_COMPARE(scene.fieldSize(SceneField::MeshMaterial), 0);
CORRADE_COMPARE(scene.objects(SceneField::Mesh).data(), nullptr); CORRADE_COMPARE(scene.objects(SceneField::Mesh).data(), nullptr);
@ -1381,7 +1381,7 @@ void SceneDataTest::constructDuplicateField() {
/* Builtin fields are checked using a bitfield, as they have monotonic /* Builtin fields are checked using a bitfield, as they have monotonic
numbering */ numbering */
SceneFieldData meshes{SceneField::Mesh, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedShort, nullptr}; SceneFieldData meshes{SceneField::Mesh, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedShort, nullptr};
SceneFieldData materials{SceneField::MeshMaterial, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedInt, nullptr}; SceneFieldData materials{SceneField::MeshMaterial, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::Int, nullptr};
SceneFieldData meshesAgain{SceneField::Mesh, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedInt, nullptr}; SceneFieldData meshesAgain{SceneField::Mesh, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedInt, nullptr};
std::ostringstream out; std::ostringstream out;
@ -1413,7 +1413,7 @@ void SceneDataTest::constructInconsistentObjectType() {
#endif #endif
SceneFieldData meshes{SceneField::Mesh, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedShort, nullptr}; SceneFieldData meshes{SceneField::Mesh, SceneObjectType::UnsignedInt, nullptr, SceneFieldType::UnsignedShort, nullptr};
SceneFieldData materials{SceneField::MeshMaterial, SceneObjectType::UnsignedShort, nullptr, SceneFieldType::UnsignedInt, nullptr}; SceneFieldData materials{SceneField::MeshMaterial, SceneObjectType::UnsignedShort, nullptr, SceneFieldType::Int, nullptr};
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
@ -1439,12 +1439,12 @@ void SceneDataTest::constructObjectDataNotContained() {
}}; }};
/* Second a view that's in a completely different location */ /* Second a view that's in a completely different location */
SceneData{SceneObjectType::UnsignedShort, 5, {}, data, { SceneData{SceneObjectType::UnsignedShort, 5, {}, data, {
SceneFieldData{SceneField::MeshMaterial, dataIn, dataIn}, SceneFieldData{SceneField::Light, dataIn, dataIn},
SceneFieldData{SceneField::Mesh, dataOut, dataIn} SceneFieldData{SceneField::Mesh, dataOut, dataIn}
}}; }};
/* Verify the owning constructor does the checks as well */ /* Verify the owning constructor does the checks as well */
SceneData{SceneObjectType::UnsignedShort, 5, std::move(data), { SceneData{SceneObjectType::UnsignedShort, 5, std::move(data), {
SceneFieldData{SceneField::MeshMaterial, dataIn, dataIn}, SceneFieldData{SceneField::Light, dataIn, dataIn},
SceneFieldData{SceneField::Mesh, dataOut, dataIn} SceneFieldData{SceneField::Mesh, dataOut, dataIn}
}}; }};
/* And if we have no data at all, it doesn't try to dereference them but /* And if we have no data at all, it doesn't try to dereference them but
@ -1486,7 +1486,7 @@ void SceneDataTest::constructFieldDataNotContained() {
}}; }};
/* Second a view that's in a completely different location */ /* Second a view that's in a completely different location */
SceneData{SceneObjectType::UnsignedShort, 5, {}, data, { SceneData{SceneObjectType::UnsignedShort, 5, {}, data, {
SceneFieldData{SceneField::MeshMaterial, dataIn, dataIn}, SceneFieldData{SceneField::Light, dataIn, dataIn},
SceneFieldData{SceneField::Mesh, dataIn, dataOut} SceneFieldData{SceneField::Mesh, dataIn, dataOut}
}}; }};
/* Verify array size is taken into account as well. If not, the data would /* Verify array size is taken into account as well. If not, the data would
@ -1496,7 +1496,7 @@ void SceneDataTest::constructFieldDataNotContained() {
}}; }};
/* Verify the owning constructor does the checks as well */ /* Verify the owning constructor does the checks as well */
SceneData{SceneObjectType::UnsignedShort, 5, std::move(data), { SceneData{SceneObjectType::UnsignedShort, 5, std::move(data), {
SceneFieldData{SceneField::MeshMaterial, dataIn, dataIn}, SceneFieldData{SceneField::Light, dataIn, dataIn},
SceneFieldData{SceneField::Mesh, dataIn, dataOut} SceneFieldData{SceneField::Mesh, dataIn, dataOut}
}}; }};
/* Not checking for nullptr data, since that got checked for object view /* Not checking for nullptr data, since that got checked for object view
@ -1614,8 +1614,8 @@ void SceneDataTest::constructMismatchedMeshMaterialView() {
reinterpret_cast<const UnsignedInt*>(data.data() + 0x0c), 3}; reinterpret_cast<const UnsignedInt*>(data.data() + 0x0c), 3};
Containers::ArrayView<const UnsignedInt> meshMaterialObjectData{ Containers::ArrayView<const UnsignedInt> meshMaterialObjectData{
reinterpret_cast<const UnsignedInt*>(data.data() + 0x18), 3}; reinterpret_cast<const UnsignedInt*>(data.data() + 0x18), 3};
Containers::ArrayView<const UnsignedInt> meshMaterialFieldData{ Containers::ArrayView<const Int> meshMaterialFieldData{
reinterpret_cast<const UnsignedInt*>(data.data() + 0x24), 3}; reinterpret_cast<const Int*>(data.data() + 0x24), 3};
SceneFieldData meshes{SceneField::Mesh, meshObjectData, meshFieldData}; SceneFieldData meshes{SceneField::Mesh, meshObjectData, meshFieldData};
SceneFieldData meshMaterialsDifferent{SceneField::MeshMaterial, meshMaterialObjectData, meshMaterialFieldData}; SceneFieldData meshMaterialsDifferent{SceneField::MeshMaterial, meshMaterialObjectData, meshMaterialFieldData};
@ -2892,7 +2892,7 @@ template<class T> void SceneDataTest::meshMaterialsAsArray() {
T meshMaterial; T meshMaterial;
} fields[]{ } fields[]{
{0, T(15)}, {0, T(15)},
{1, T(37)}, {1, T(-1)},
{15, T(44)} {15, T(44)}
}; };
@ -2905,7 +2905,7 @@ template<class T> void SceneDataTest::meshMaterialsAsArray() {
}}; }};
CORRADE_COMPARE_AS(scene.meshMaterialsAsArray(), CORRADE_COMPARE_AS(scene.meshMaterialsAsArray(),
Containers::arrayView<UnsignedInt>({15, 37, 44}), Containers::arrayView<Int>({15, -1, 44}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
} }
@ -2919,10 +2919,10 @@ void SceneDataTest::meshMaterialsIntoArray() {
struct Field { struct Field {
UnsignedInt object; UnsignedInt object;
UnsignedInt meshMaterial; Int meshMaterial;
} fields[]{ } fields[]{
{1, 15}, {1, 15},
{0, 37}, {0, -1},
{4, 44} {4, 44}
}; };
@ -2938,7 +2938,7 @@ void SceneDataTest::meshMaterialsIntoArray() {
/* The offset-less overload should give back all data */ /* The offset-less overload should give back all data */
{ {
UnsignedInt out[3]; Int out[3];
scene.meshMaterialsInto(out); scene.meshMaterialsInto(out);
CORRADE_COMPARE_AS(Containers::stridedArrayView(out), CORRADE_COMPARE_AS(Containers::stridedArrayView(out),
view.slice(&Field::meshMaterial), view.slice(&Field::meshMaterial),
@ -2946,7 +2946,7 @@ void SceneDataTest::meshMaterialsIntoArray() {
/* The offset variant only a subset */ /* The offset variant only a subset */
} { } {
Containers::Array<UnsignedInt> out{data.size}; Containers::Array<Int> out{data.size};
CORRADE_COMPARE(scene.meshMaterialsInto(data.offset, out), data.expectedSize); CORRADE_COMPARE(scene.meshMaterialsInto(data.offset, out), data.expectedSize);
CORRADE_COMPARE_AS(out.prefix(data.expectedSize), CORRADE_COMPARE_AS(out.prefix(data.expectedSize),
view.slice(&Field::meshMaterial) view.slice(&Field::meshMaterial)
@ -2962,7 +2962,7 @@ void SceneDataTest::meshMaterialsIntoArrayInvalidSizeOrOffset() {
struct Field { struct Field {
UnsignedInt object; UnsignedInt object;
UnsignedInt meshMaterial; Int meshMaterial;
} fields[3]{}; } fields[3]{};
Containers::StridedArrayView1D<Field> view = fields; Containers::StridedArrayView1D<Field> view = fields;
@ -2973,7 +2973,7 @@ void SceneDataTest::meshMaterialsIntoArrayInvalidSizeOrOffset() {
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
UnsignedInt destination[2]; Int destination[2];
scene.meshMaterialsInto(destination); scene.meshMaterialsInto(destination);
scene.meshMaterialsInto(4, destination); scene.meshMaterialsInto(4, destination);
CORRADE_COMPARE(out.str(), CORRADE_COMPARE(out.str(),

Loading…
Cancel
Save