mirror of https://github.com/mosra/magnum.git
5 changed files with 472 additions and 0 deletions
@ -0,0 +1,124 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, |
||||
2020 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
#include "Reference.h" |
||||
|
||||
#include <Corrade/Utility/Algorithms.h> |
||||
|
||||
#include "Magnum/Trade/MeshData.h" |
||||
|
||||
namespace Magnum { namespace MeshTools { |
||||
|
||||
Trade::MeshData reference(const Trade::MeshData& data) { |
||||
return Trade::MeshData{data.primitive(), |
||||
{}, data.indexData(), Trade::MeshIndexData{data.indices()}, |
||||
{}, data.vertexData(), Trade::meshAttributeDataNonOwningArray(data.attributeData()), |
||||
data.vertexCount()}; |
||||
} |
||||
|
||||
Trade::MeshData mutableReference(Trade::MeshData& data) { |
||||
CORRADE_ASSERT((data.indexDataFlags() & Trade::DataFlag::Mutable) && (data.vertexDataFlags() & Trade::DataFlag::Mutable), |
||||
"MeshTools::mutableReference(): data not mutable", |
||||
(Trade::MeshData{MeshPrimitive::Points, 0})); |
||||
|
||||
return Trade::MeshData{data.primitive(), |
||||
Trade::DataFlag::Mutable, data.mutableIndexData(), Trade::MeshIndexData{data.indices()}, |
||||
Trade::DataFlag::Mutable, data.mutableVertexData(), Trade::meshAttributeDataNonOwningArray(data.attributeData()), |
||||
data.vertexCount()}; |
||||
} |
||||
|
||||
Trade::MeshData owned(const Trade::MeshData& data) { |
||||
return owned(reference(data)); |
||||
} |
||||
|
||||
Trade::MeshData owned(Trade::MeshData&& data) { |
||||
/** @todo copy only the actually used range instead of the whole thing? */ |
||||
|
||||
/* If index data are already owned, move them to the output. This works
|
||||
without any extra effort also for non-indexed meshes. */ |
||||
Containers::Array<char> indexData; |
||||
Trade::MeshIndexData indices; |
||||
if(data.indexDataFlags() & Trade::DataFlag::Owned) { |
||||
indices = Trade::MeshIndexData{data.indices()}; |
||||
indexData = data.releaseIndexData(); |
||||
|
||||
/* Otherwise copy them, if the mesh is indexed. If not, the
|
||||
default-constructed instances are fine. */ |
||||
} else if(data.isIndexed()) { |
||||
indexData = Containers::Array<char>{Containers::NoInit, data.indexData().size()}; |
||||
indices = Trade::MeshIndexData{data.indexType(), indexData.slice(data.indexOffset(), data.indexOffset() + data.indexCount()*meshIndexTypeSize(data.indexType()))}; |
||||
Utility::copy(data.indexData(), indexData); |
||||
} |
||||
|
||||
/* If vertex data are already owned, move them to the output. Because
|
||||
releasing them will clear vertex count, save that in advance, save also |
||||
original vertex data view for attribute offset calculation */ |
||||
const UnsignedInt vertexCount = data.vertexCount(); |
||||
const Containers::ArrayView<const char> originalVertexData = data.vertexData(); |
||||
Containers::Array<char> vertexData; |
||||
if(data.vertexDataFlags() & Trade::DataFlag::Owned) { |
||||
vertexData = data.releaseVertexData(); |
||||
|
||||
/* Otherwise copy them */ |
||||
} else { |
||||
vertexData = Containers::Array<char>{Containers::NoInit, originalVertexData.size()}; |
||||
Utility::copy(originalVertexData, vertexData); |
||||
} |
||||
|
||||
/* There's no way to know if attribute data are owned until we release
|
||||
them and check the deleter, but releasing them makes it impossible to |
||||
use the convenience MeshData APIs, so we have to do the hard way. */ |
||||
Containers::Array<Trade::MeshAttributeData> originalAttributeData = data.releaseAttributeData(); |
||||
|
||||
/* If the attribute data are owned *and* the vertex data weren't copied,
|
||||
we can reuse the original array in its entirety */ |
||||
Containers::Array<Trade::MeshAttributeData> attributeData; |
||||
if(!originalAttributeData.deleter() && (data.vertexDataFlags() & Trade::DataFlag::Owned)) { |
||||
attributeData = std::move(originalAttributeData); |
||||
|
||||
/* Otherwise we have to allocate a new one and re-route the attributes to
|
||||
a potentially different vertex array */ |
||||
} else { |
||||
attributeData = Containers::Array<Trade::MeshAttributeData>{originalAttributeData.size()}; |
||||
for(std::size_t i = 0; i != originalAttributeData.size(); ++i) { |
||||
attributeData[i] = Trade::MeshAttributeData{ |
||||
originalAttributeData[i].name(), |
||||
originalAttributeData[i].format(), |
||||
Containers::StridedArrayView1D<const void>{ |
||||
vertexData, |
||||
vertexData.data() + originalAttributeData[i].offset(originalVertexData), |
||||
vertexCount, |
||||
originalAttributeData[i].stride()}, |
||||
originalAttributeData[i].arraySize()}; |
||||
} |
||||
} |
||||
|
||||
return Trade::MeshData{data.primitive(), |
||||
std::move(indexData), indices, |
||||
std::move(vertexData), std::move(attributeData), |
||||
vertexCount}; |
||||
} |
||||
|
||||
}} |
||||
@ -0,0 +1,93 @@
|
||||
#ifndef Magnum_MeshTools_Reference_h |
||||
#define Magnum_MeshTools_Reference_h |
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, |
||||
2020 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
/** @file
|
||||
* @brief Function @ref Magnum::MeshTools::reference(), @ref Magnum::MeshTools::owned() |
||||
* @m_since_latest |
||||
*/ |
||||
|
||||
#include "Magnum/MeshTools/visibility.h" |
||||
#include "Magnum/Trade/Trade.h" |
||||
|
||||
namespace Magnum { namespace MeshTools { |
||||
|
||||
/**
|
||||
@brief Create an immutable reference on a @ref Trade::MeshData |
||||
@m_since_latest |
||||
|
||||
The returned instance has empty @ref Trade::MeshData::indexDataFlags() and |
||||
@ref Trade::MeshData::vertexDataFlags() and references attribute data from the |
||||
@p data as well. The function performs no allocation or data copy. Use |
||||
@ref owned() for an inverse operation. |
||||
@see @ref mutableReference() |
||||
*/ |
||||
MAGNUM_MESHTOOLS_EXPORT Trade::MeshData reference(const Trade::MeshData& data); |
||||
|
||||
/**
|
||||
@brief Create a mutable reference on a @ref Trade::MeshData |
||||
@m_since_latest |
||||
|
||||
The returned instance has @ref Trade::MeshData::indexDataFlags() and |
||||
@ref Trade::MeshData::vertexDataFlags() set to @ref Trade::DataFlag::Mutable. |
||||
The function performs no allocation or data copy. Use @ref owned() for an |
||||
inverse operation. Expects that @p data is mutable. |
||||
@see @ref reference() |
||||
*/ |
||||
MAGNUM_MESHTOOLS_EXPORT Trade::MeshData mutableReference(Trade::MeshData& data); |
||||
|
||||
/**
|
||||
@brief Create an owned @ref Trade::MeshData |
||||
@m_since_latest |
||||
|
||||
The returned instance owns its index, vertex and attribute data --- both |
||||
@ref Trade::MeshData::indexDataFlags() and |
||||
@ref Trade::MeshData::vertexDataFlags() have @ref Trade::DataFlag::Mutable and |
||||
@ref Trade::DataFlag::Owned set. This function unconditionally does an |
||||
allocation and a copy even if the @p data is already owned, use |
||||
@ref owned(Trade::MeshData&&) to make an owned copy only if the instance isn't |
||||
already owned. |
||||
@see @ref reference(), @ref mutableReference() |
||||
*/ |
||||
MAGNUM_MESHTOOLS_EXPORT Trade::MeshData owned(const Trade::MeshData& data); |
||||
|
||||
/**
|
||||
@brief Create an owned @ref Trade::MeshData, if not already |
||||
@m_since_latest |
||||
|
||||
The returned instance owns its index, vertex and attribute data --- both |
||||
@ref Trade::MeshData::indexDataFlags() and |
||||
@ref Trade::MeshData::vertexDataFlags() have @ref Trade::DataFlag::Mutable and |
||||
@ref Trade::DataFlag::Owned set. Index, vertex and attribute data that are |
||||
already owned are simply moved to the output, otherwise the data get copied |
||||
into newly allocated arrays. |
||||
@see @ref reference(), @ref mutableReference() |
||||
*/ |
||||
MAGNUM_MESHTOOLS_EXPORT Trade::MeshData owned(Trade::MeshData&& data); |
||||
|
||||
}} |
||||
|
||||
#endif |
||||
@ -0,0 +1,252 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, |
||||
2020 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
#include <sstream> |
||||
#include <Corrade/TestSuite/Tester.h> |
||||
#include <Corrade/TestSuite/Compare/Container.h> |
||||
#include <Corrade/Utility/DebugStl.h> |
||||
|
||||
#include "Magnum/Math/Color.h" |
||||
#include "Magnum/MeshTools/Reference.h" |
||||
#include "Magnum/Primitives/Cube.h" |
||||
#include "Magnum/Primitives/Gradient.h" |
||||
#include "Magnum/Primitives/Grid.h" |
||||
#include "Magnum/Trade/MeshData.h" |
||||
|
||||
namespace Magnum { namespace MeshTools { namespace Test { namespace { |
||||
|
||||
struct ReferenceTest: TestSuite::Tester { |
||||
explicit ReferenceTest(); |
||||
|
||||
void reference(); |
||||
void referenceNoIndexVertexAttributeData(); |
||||
|
||||
void mutableReference(); |
||||
void mutableReferenceNoIndexVertexAttributeData(); |
||||
void mutableReferenceNotMutable(); |
||||
|
||||
void owned(); |
||||
void ownedNoIndexData(); |
||||
void ownedNoAttributeVertexData(); |
||||
void ownedArrayAttribute(); |
||||
void ownedRvaluePassthrough(); |
||||
void ownedRvaluePartialPassthrough(); |
||||
}; |
||||
|
||||
ReferenceTest::ReferenceTest() { |
||||
addTests({&ReferenceTest::reference, |
||||
&ReferenceTest::referenceNoIndexVertexAttributeData, |
||||
|
||||
&ReferenceTest::mutableReference, |
||||
&ReferenceTest::mutableReferenceNoIndexVertexAttributeData, |
||||
&ReferenceTest::mutableReferenceNotMutable, |
||||
|
||||
&ReferenceTest::owned, |
||||
&ReferenceTest::ownedNoIndexData, |
||||
&ReferenceTest::ownedNoAttributeVertexData, |
||||
&ReferenceTest::ownedArrayAttribute, |
||||
&ReferenceTest::ownedRvaluePassthrough, |
||||
&ReferenceTest::ownedRvaluePartialPassthrough}); |
||||
} |
||||
|
||||
void ReferenceTest::reference() { |
||||
const Trade::MeshData circle = Primitives::grid3DSolid({15, 3}, Primitives::GridFlag::Tangents); |
||||
|
||||
Trade::MeshData reference = MeshTools::reference(circle); |
||||
CORRADE_COMPARE(reference.primitive(), circle.primitive()); |
||||
CORRADE_COMPARE(reference.indexDataFlags(), Trade::DataFlags{}); |
||||
CORRADE_COMPARE(reference.vertexDataFlags(), Trade::DataFlags{}); |
||||
CORRADE_COMPARE(reference.vertexCount(), circle.vertexCount()); |
||||
CORRADE_COMPARE(static_cast<const void*>(reference.indexData().data()), circle.indexData().data()); |
||||
CORRADE_COMPARE(static_cast<const void*>(reference.vertexData().data()), circle.vertexData().data()); |
||||
CORRADE_COMPARE(static_cast<const void*>(reference.attributeData().data()), circle.attributeData().data()); |
||||
} |
||||
|
||||
void ReferenceTest::referenceNoIndexVertexAttributeData() { |
||||
Trade::MeshData fourtytwo{MeshPrimitive::Edges, 42}; |
||||
|
||||
Trade::MeshData reference = MeshTools::reference(fourtytwo); |
||||
CORRADE_COMPARE(reference.primitive(), fourtytwo.primitive()); |
||||
CORRADE_COMPARE(reference.indexDataFlags(), Trade::DataFlags{}); |
||||
CORRADE_COMPARE(reference.vertexDataFlags(), Trade::DataFlags{}); |
||||
CORRADE_COMPARE(reference.vertexCount(), 42); |
||||
CORRADE_VERIFY(!static_cast<const void*>(reference.indexData().data())); |
||||
CORRADE_VERIFY(!static_cast<const void*>(reference.vertexData().data())); |
||||
CORRADE_VERIFY(!static_cast<const void*>(reference.attributeData().data())); |
||||
} |
||||
|
||||
void ReferenceTest::mutableReference() { |
||||
Trade::MeshData circle = Primitives::grid3DSolid({15, 3}, Primitives::GridFlag::Tangents); |
||||
CORRADE_VERIFY(circle.isIndexed()); |
||||
|
||||
Trade::MeshData reference = MeshTools::mutableReference(circle); |
||||
CORRADE_COMPARE(reference.primitive(), circle.primitive()); |
||||
CORRADE_COMPARE(reference.indexDataFlags(), Trade::DataFlag::Mutable); |
||||
CORRADE_COMPARE(reference.vertexDataFlags(), Trade::DataFlag::Mutable); |
||||
CORRADE_COMPARE(reference.vertexCount(), circle.vertexCount()); |
||||
CORRADE_COMPARE(static_cast<const void*>(reference.indexData().data()), circle.indexData().data()); |
||||
CORRADE_COMPARE(static_cast<const void*>(reference.vertexData().data()), circle.vertexData().data()); |
||||
CORRADE_COMPARE(static_cast<const void*>(reference.attributeData().data()), circle.attributeData().data()); |
||||
} |
||||
|
||||
void ReferenceTest::mutableReferenceNoIndexVertexAttributeData() { |
||||
Trade::MeshData fourtytwo{MeshPrimitive::Edges, 42}; |
||||
|
||||
Trade::MeshData reference = MeshTools::mutableReference(fourtytwo); |
||||
CORRADE_COMPARE(reference.primitive(), fourtytwo.primitive()); |
||||
CORRADE_COMPARE(reference.indexDataFlags(), Trade::DataFlag::Mutable); |
||||
CORRADE_COMPARE(reference.vertexDataFlags(), Trade::DataFlag::Mutable); |
||||
CORRADE_COMPARE(reference.vertexCount(), 42); |
||||
CORRADE_VERIFY(!static_cast<const void*>(reference.indexData().data())); |
||||
CORRADE_VERIFY(!static_cast<const void*>(reference.vertexData().data())); |
||||
CORRADE_VERIFY(!static_cast<const void*>(reference.attributeData().data())); |
||||
} |
||||
|
||||
void ReferenceTest::mutableReferenceNotMutable() { |
||||
#ifdef CORRADE_NO_ASSERT |
||||
CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); |
||||
#endif |
||||
|
||||
Trade::MeshData cube = Primitives::cubeSolid(); |
||||
CORRADE_COMPARE(cube.indexDataFlags(), Trade::DataFlags{}); |
||||
CORRADE_COMPARE(cube.vertexDataFlags(), Trade::DataFlags{}); |
||||
|
||||
std::ostringstream out; |
||||
Error redirectError{&out}; |
||||
MeshTools::mutableReference(cube); |
||||
CORRADE_COMPARE(out.str(), "MeshTools::mutableReference(): data not mutable\n"); |
||||
} |
||||
|
||||
void ReferenceTest::owned() { |
||||
Trade::MeshData cube = Primitives::cubeSolid(); |
||||
CORRADE_COMPARE(cube.indexDataFlags(), Trade::DataFlags{}); |
||||
CORRADE_COMPARE(cube.vertexDataFlags(), Trade::DataFlags{}); |
||||
|
||||
Trade::MeshData owned = MeshTools::owned(cube); |
||||
CORRADE_COMPARE(owned.primitive(), cube.primitive()); |
||||
CORRADE_COMPARE(owned.indexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_COMPARE(owned.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_VERIFY(owned.isIndexed()); |
||||
CORRADE_COMPARE(owned.indexCount(), cube.indexCount()); |
||||
CORRADE_COMPARE(owned.indexType(), cube.indexType()); |
||||
CORRADE_COMPARE(owned.vertexCount(), cube.vertexCount()); |
||||
CORRADE_COMPARE(owned.attributeCount(), cube.attributeCount()); |
||||
|
||||
for(std::size_t i = 0; i != cube.attributeCount(); ++i) { |
||||
CORRADE_ITERATION(i); |
||||
|
||||
CORRADE_COMPARE(owned.attributeName(i), cube.attributeName(i)); |
||||
CORRADE_COMPARE(owned.attributeFormat(i), cube.attributeFormat(i)); |
||||
CORRADE_COMPARE(owned.attributeOffset(i), cube.attributeOffset(i)); |
||||
CORRADE_COMPARE(owned.attributeStride(i), cube.attributeStride(i)); |
||||
CORRADE_COMPARE(owned.attributeArraySize(i), cube.attributeArraySize(i)); |
||||
} |
||||
|
||||
CORRADE_COMPARE_AS(owned.indexData(), cube.indexData(), TestSuite::Compare::Container); |
||||
CORRADE_COMPARE_AS(owned.vertexData(), cube.vertexData(), TestSuite::Compare::Container); |
||||
} |
||||
|
||||
void ReferenceTest::ownedNoIndexData() { |
||||
Trade::MeshData cube = Primitives::cubeSolidStrip(); |
||||
CORRADE_VERIFY(!cube.isIndexed()); |
||||
CORRADE_COMPARE(cube.vertexDataFlags(), Trade::DataFlags{}); |
||||
|
||||
Trade::MeshData owned = MeshTools::owned(cube); |
||||
CORRADE_COMPARE(owned.primitive(), cube.primitive()); |
||||
CORRADE_COMPARE(owned.indexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_COMPARE(owned.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_VERIFY(!owned.isIndexed()); |
||||
CORRADE_COMPARE(owned.vertexCount(), cube.vertexCount()); |
||||
CORRADE_COMPARE(owned.attributeCount(), cube.attributeCount()); |
||||
} |
||||
|
||||
void ReferenceTest::ownedNoAttributeVertexData() { |
||||
UnsignedShort indexData[]{0, 41, 2}; |
||||
Trade::MeshData indexedFourtytwo{MeshPrimitive::Edges, |
||||
{}, indexData, Trade::MeshIndexData{indexData}, |
||||
42}; |
||||
|
||||
Trade::MeshData owned = MeshTools::owned(indexedFourtytwo); |
||||
CORRADE_COMPARE(owned.primitive(), MeshPrimitive::Edges); |
||||
CORRADE_COMPARE(owned.indexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_COMPARE(owned.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_VERIFY(owned.isIndexed()); |
||||
CORRADE_COMPARE(owned.indexCount(), 3); |
||||
CORRADE_COMPARE(owned.indexType(), MeshIndexType::UnsignedShort); |
||||
CORRADE_COMPARE(owned.vertexCount(), 42); |
||||
CORRADE_COMPARE(owned.attributeCount(), 0); |
||||
|
||||
CORRADE_COMPARE_AS(owned.indexData(), indexedFourtytwo.indexData(), TestSuite::Compare::Container); |
||||
CORRADE_VERIFY(!static_cast<const void*>(owned.vertexData().data())); |
||||
CORRADE_VERIFY(!static_cast<const void*>(owned.attributeData().data())); |
||||
} |
||||
|
||||
void ReferenceTest::ownedArrayAttribute() { |
||||
const Vector3us vertexData[13]{}; |
||||
/* Verify that array attributes are propagated correctly */ |
||||
Trade::MeshData weirdThing{MeshPrimitive::Faces, |
||||
{}, vertexData, |
||||
{Trade::MeshAttributeData{Trade::meshAttributeCustom(42), VertexFormat::Half, Containers::arrayView(vertexData), 3}}}; |
||||
|
||||
Trade::MeshData owned = MeshTools::owned(weirdThing); |
||||
CORRADE_COMPARE(owned.vertexCount(), 13); |
||||
CORRADE_COMPARE(owned.attributeCount(), 1); |
||||
CORRADE_COMPARE(owned.attributeArraySize(0), 3); |
||||
} |
||||
|
||||
void ReferenceTest::ownedRvaluePassthrough() { |
||||
Trade::MeshData circle = Primitives::grid3DSolid({15, 3}, Primitives::GridFlag::Tangents); |
||||
CORRADE_COMPARE(circle.indexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_COMPARE(circle.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
const void* indexData = circle.indexData(); |
||||
const void* vertexData = circle.vertexData(); |
||||
const void* attributeData = circle.attributeData(); |
||||
|
||||
Trade::MeshData owned = MeshTools::owned(std::move(circle)); |
||||
CORRADE_COMPARE(owned.indexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_COMPARE(owned.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_COMPARE(owned.indexData(), indexData); |
||||
CORRADE_COMPARE(owned.vertexData(), vertexData); |
||||
CORRADE_COMPARE(owned.attributeData(), attributeData); |
||||
} |
||||
|
||||
void ReferenceTest::ownedRvaluePartialPassthrough() { |
||||
Trade::MeshData gradient = Primitives::gradient3DHorizontal({}, {}); |
||||
CORRADE_COMPARE(gradient.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
const void* vertexData = gradient.vertexData(); |
||||
const void* attributeData = gradient.attributeData(); |
||||
|
||||
Trade::MeshData owned = MeshTools::owned(std::move(gradient)); |
||||
CORRADE_COMPARE(owned.indexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_COMPARE(owned.vertexDataFlags(), Trade::DataFlag::Mutable|Trade::DataFlag::Owned); |
||||
CORRADE_VERIFY(!owned.isIndexed()); |
||||
CORRADE_COMPARE(owned.vertexData(), vertexData); |
||||
/* Attribute data is constant in the original, so this gets copied */ |
||||
CORRADE_VERIFY(owned.attributeData() != attributeData); |
||||
} |
||||
|
||||
}}}} |
||||
|
||||
CORRADE_TEST_MAIN(Magnum::MeshTools::Test::ReferenceTest) |
||||
Loading…
Reference in new issue