Browse Source

Trade: support for vertex colors in MeshData.

In order to have a seamless transition for all the plugins and potential
user code the original constructor was marked as deprecated and there is
a new constructor taking also the colors.
pull/195/head
Vladimír Vondruš 9 years ago
parent
commit
76aab47291
  1. 13
      src/Magnum/Primitives/Capsule.cpp
  2. 10
      src/Magnum/Primitives/Circle.cpp
  3. 10
      src/Magnum/Primitives/Crosshair.cpp
  4. 14
      src/Magnum/Primitives/Cube.cpp
  5. 8
      src/Magnum/Primitives/Cylinder.cpp
  6. 4
      src/Magnum/Primitives/Icosphere.cpp
  7. 6
      src/Magnum/Primitives/Implementation/Spheroid.cpp
  8. 4
      src/Magnum/Primitives/Implementation/WireframeSpheroid.cpp
  9. 10
      src/Magnum/Primitives/Line.cpp
  10. 10
      src/Magnum/Primitives/Plane.cpp
  11. 10
      src/Magnum/Primitives/Square.cpp
  12. 8
      src/Magnum/Primitives/UVSphere.cpp
  13. 18
      src/Magnum/Trade/MeshData2D.cpp
  14. 26
      src/Magnum/Trade/MeshData2D.h
  15. 18
      src/Magnum/Trade/MeshData3D.cpp
  16. 26
      src/Magnum/Trade/MeshData3D.h
  17. 32
      src/Magnum/Trade/Test/MeshData2DTest.cpp
  18. 33
      src/Magnum/Trade/Test/MeshData3DTest.cpp
  19. 4
      src/MagnumPlugins/ObjImporter/ObjImporter.cpp

13
src/Magnum/Primitives/Capsule.cpp

@ -25,7 +25,7 @@
#include "Capsule.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Math/Functions.h"
#include "Magnum/Mesh.h"
#include "Magnum/Primitives/Implementation/Spheroid.h"
@ -36,7 +36,8 @@
namespace Magnum { namespace Primitives {
Trade::MeshData2D Capsule2D::wireframe(UnsignedInt hemisphereRings, UnsignedInt cylinderRings, Float halfLength) {
CORRADE_ASSERT(hemisphereRings >= 1 && cylinderRings >= 1, "Capsule must have at least one hemisphere ring, one cylinder ring and three segments", Trade::MeshData2D(MeshPrimitive::Lines, {}, {}, {}));
CORRADE_ASSERT(hemisphereRings >= 1 && cylinderRings >= 1, "Capsule must have at least one hemisphere ring, one cylinder ring and three segments",
(Trade::MeshData2D{MeshPrimitive::Triangles, {}, {}, {}, {}, nullptr}));
std::vector<Vector2> positions;
positions.reserve(hemisphereRings*4+2+(cylinderRings-1)*2);
@ -87,11 +88,12 @@ Trade::MeshData2D Capsule2D::wireframe(UnsignedInt hemisphereRings, UnsignedInt
{UnsignedInt(positions.size())-3, UnsignedInt(positions.size())-1,
UnsignedInt(positions.size())-2, UnsignedInt(positions.size())-1});
return Trade::MeshData2D(MeshPrimitive::Lines, std::move(indices), {std::move(positions)}, {});
return Trade::MeshData2D{MeshPrimitive::Lines, std::move(indices), {std::move(positions)}, {}, {}, nullptr};
}
Trade::MeshData3D Capsule3D::solid(UnsignedInt hemisphereRings, UnsignedInt cylinderRings, UnsignedInt segments, Float halfLength, TextureCoords textureCoords) {
CORRADE_ASSERT(hemisphereRings >= 1 && cylinderRings >= 1 && segments >= 3, "Capsule must have at least one hemisphere ring, one cylinder ring and three segments", Trade::MeshData3D(MeshPrimitive::Triangles, {}, {}, {}, {}));
CORRADE_ASSERT(hemisphereRings >= 1 && cylinderRings >= 1 && segments >= 3, "Capsule must have at least one hemisphere ring, one cylinder ring and three segments",
(Trade::MeshData3D{MeshPrimitive::Triangles, {}, {}, {}, {}, {}, nullptr}));
Implementation::Spheroid capsule(segments, textureCoords == TextureCoords::Generate ?
Implementation::Spheroid::TextureCoords::Generate :
@ -125,7 +127,8 @@ Trade::MeshData3D Capsule3D::solid(UnsignedInt hemisphereRings, UnsignedInt cyli
}
Trade::MeshData3D Capsule3D::wireframe(const UnsignedInt hemisphereRings, const UnsignedInt cylinderRings, const UnsignedInt segments, const Float halfLength) {
CORRADE_ASSERT(hemisphereRings >= 1 && cylinderRings >= 1 && segments >= 4 && segments%4 == 0, "Primitives::Capsule::wireframe(): improper parameters", Trade::MeshData3D(MeshPrimitive::Lines, {}, {}, {}, {}));
CORRADE_ASSERT(hemisphereRings >= 1 && cylinderRings >= 1 && segments >= 4 && segments%4 == 0, "Primitives::Capsule::wireframe(): improper parameters",
(Trade::MeshData3D{MeshPrimitive::Triangles, {}, {}, {}, {}, {}, nullptr}));
Implementation::WireframeSpheroid capsule(segments/4);

10
src/Magnum/Primitives/Circle.cpp

@ -26,7 +26,7 @@
#include "Circle.h"
#include "Magnum/Math/Functions.h"
#include "Magnum/Math/Vector2.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Mesh.h"
#include "Magnum/Trade/MeshData2D.h"
@ -34,7 +34,7 @@ namespace Magnum { namespace Primitives {
Trade::MeshData2D Circle::solid(UnsignedInt segments) {
CORRADE_ASSERT(segments >= 3, "Primitives::Circle::solid(): segments must be >= 3",
Trade::MeshData2D(MeshPrimitive::TriangleFan, {}, {}, {}));
(Trade::MeshData2D{MeshPrimitive::TriangleFan, {}, {}, {}, {}, nullptr}));
std::vector<Vector2> positions;
positions.reserve(segments+1);
@ -49,12 +49,12 @@ Trade::MeshData2D Circle::solid(UnsignedInt segments) {
positions.emplace_back(Math::cos(angle), Math::sin(angle));
}
return Trade::MeshData2D(MeshPrimitive::TriangleFan, {}, {std::move(positions)}, {});
return Trade::MeshData2D{MeshPrimitive::TriangleFan, {}, {std::move(positions)}, {}, {}, nullptr};
}
Trade::MeshData2D Circle::wireframe(UnsignedInt segments) {
CORRADE_ASSERT(segments >= 3, "Primitives::Circle::wireframe(): segments must be >= 3",
Trade::MeshData2D(MeshPrimitive::LineLoop, {}, {}, {}));
(Trade::MeshData2D{MeshPrimitive::LineLoop, {}, {}, {}, {}, nullptr}));
std::vector<Vector2> positions;
positions.reserve(segments);
@ -66,7 +66,7 @@ Trade::MeshData2D Circle::wireframe(UnsignedInt segments) {
positions.emplace_back(Math::cos(angle), Math::sin(angle));
}
return Trade::MeshData2D(MeshPrimitive::LineLoop, {}, {std::move(positions)}, {});
return Trade::MeshData2D{MeshPrimitive::LineLoop, {}, {std::move(positions)}, {}, {}, nullptr};
}
}}

10
src/Magnum/Primitives/Crosshair.cpp

@ -26,25 +26,25 @@
#include "Crosshair.h"
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Trade/MeshData2D.h"
#include "Magnum/Trade/MeshData3D.h"
namespace Magnum { namespace Primitives {
Trade::MeshData2D Crosshair2D::wireframe() {
return Trade::MeshData2D(MeshPrimitive::Lines, {}, {{
return Trade::MeshData2D{MeshPrimitive::Lines, {}, {{
{-1.0f, 0.0f}, {1.0f, 0.0f},
{ 0.0f, -1.0f}, {0.0f, 1.0f}
}}, {});
}}, {}, {}, nullptr};
}
Trade::MeshData3D Crosshair3D::wireframe() {
return Trade::MeshData3D(MeshPrimitive::Lines, {}, {{
return Trade::MeshData3D{MeshPrimitive::Lines, {}, {{
{-1.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f},
{ 0.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.0f},
{ 0.0f, 0.0f, -1.0f}, {0.0f, 0.0f, 1.0f}
}}, {}, {});
}}, {}, {}, {}, nullptr};
}
}}

14
src/Magnum/Primitives/Cube.cpp

@ -26,13 +26,13 @@
#include "Cube.h"
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Trade/MeshData3D.h"
namespace Magnum { namespace Primitives {
Trade::MeshData3D Cube::solid() {
return Trade::MeshData3D(MeshPrimitive::Triangles, {
return Trade::MeshData3D{MeshPrimitive::Triangles, {
0, 1, 2, 0, 2, 3, /* +Z */
4, 5, 6, 4, 6, 7, /* +X */
8, 9, 10, 8, 10, 11, /* +Y */
@ -99,7 +99,7 @@ Trade::MeshData3D Cube::solid() {
{-1.0f, 0.0f, 0.0f},
{-1.0f, 0.0f, 0.0f}, /* -X */
{-1.0f, 0.0f, 0.0f}
}}, {});
}}, {}, {}, nullptr};
}
Trade::MeshData3D Cube::solidStrip() {
@ -126,7 +126,7 @@ Trade::MeshData3D Cube::solidStrip() {
|F \|
2---3
*/
return Trade::MeshData3D(MeshPrimitive::TriangleStrip, {}, {{
return Trade::MeshData3D{MeshPrimitive::TriangleStrip, {}, {{
{ 1.0f, 1.0f, 1.0f}, /* 3 */
{-1.0f, 1.0f, 1.0f}, /* 2 */
{ 1.0f, -1.0f, 1.0f}, /* 6 */
@ -141,11 +141,11 @@ Trade::MeshData3D Cube::solidStrip() {
{-1.0f, -1.0f, -1.0f}, /* 4 */
{ 1.0f, 1.0f, -1.0f}, /* 1 */
{-1.0f, 1.0f, -1.0f} /* 0 */
}}, {}, {});
}}, {}, {}, {}, nullptr};
}
Trade::MeshData3D Cube::wireframe() {
return Trade::MeshData3D(MeshPrimitive::Lines, {
return Trade::MeshData3D{MeshPrimitive::Lines, {
0, 1, 1, 2, 2, 3, 3, 0, /* +Z */
4, 5, 5, 6, 6, 7, 7, 4, /* -Z */
1, 5, 2, 6, /* +X */
@ -160,7 +160,7 @@ Trade::MeshData3D Cube::wireframe() {
{ 1.0f, -1.0f, -1.0f},
{ 1.0f, 1.0f, -1.0f},
{-1.0f, 1.0f, -1.0f}
}}, {}, {});
}}, {}, {}, {}, nullptr};
}
}}

8
src/Magnum/Primitives/Cylinder.cpp

@ -26,7 +26,7 @@
#include "Cylinder.h"
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Primitives/Implementation/Spheroid.h"
#include "Magnum/Primitives/Implementation/WireframeSpheroid.h"
#include "Magnum/Trade/MeshData3D.h"
@ -34,7 +34,8 @@
namespace Magnum { namespace Primitives {
Trade::MeshData3D Cylinder::solid(const UnsignedInt rings, const UnsignedInt segments, const Float halfLength, const Flags flags) {
CORRADE_ASSERT(rings >= 1 && segments >= 3, "Primitives::Cylinder::solid(): cylinder must have at least one ring and three segments", Trade::MeshData3D(MeshPrimitive::Triangles, {}, {}, {}, {}));
CORRADE_ASSERT(rings >= 1 && segments >= 3, "Primitives::Cylinder::solid(): cylinder must have at least one ring and three segments",
(Trade::MeshData3D{MeshPrimitive::Triangles, {}, {}, {}, {}, {}, nullptr}));
Implementation::Spheroid cylinder(segments, flags & Flag::GenerateTextureCoords ? Implementation::Spheroid::TextureCoords::Generate : Implementation::Spheroid::TextureCoords::DontGenerate);
@ -65,7 +66,8 @@ Trade::MeshData3D Cylinder::solid(const UnsignedInt rings, const UnsignedInt seg
}
Trade::MeshData3D Cylinder::wireframe(const UnsignedInt rings, const UnsignedInt segments, const Float halfLength) {
CORRADE_ASSERT(rings >= 1 && segments >= 4 && segments%4 == 0, "Primitives::Cylinder::wireframe(): improper parameters", Trade::MeshData3D(MeshPrimitive::Lines, {}, {}, {}, {}));
CORRADE_ASSERT(rings >= 1 && segments >= 4 && segments%4 == 0, "Primitives::Cylinder::wireframe(): improper parameters",
(Trade::MeshData3D{MeshPrimitive::Lines, {}, {}, {}, {}, {}, nullptr}));
Implementation::WireframeSpheroid cylinder(segments/4);

4
src/Magnum/Primitives/Icosphere.cpp

@ -26,7 +26,7 @@
#include "Icosphere.h"
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/MeshTools/Duplicate.h"
#include "Magnum/MeshTools/RemoveDuplicates.h"
#include "Magnum/MeshTools/Subdivide.h"
@ -81,7 +81,7 @@ Trade::MeshData3D Icosphere::solid(const UnsignedInt subdivisions) {
indices = MeshTools::duplicate(indices, MeshTools::removeDuplicates(positions));
std::vector<Vector3> normals(positions);
return Trade::MeshData3D(MeshPrimitive::Triangles, std::move(indices), {std::move(positions)}, {std::move(normals)}, {});
return Trade::MeshData3D{MeshPrimitive::Triangles, std::move(indices), {std::move(positions)}, {std::move(normals)}, {}, {}, nullptr};
}
}}

6
src/Magnum/Primitives/Implementation/Spheroid.cpp

@ -26,7 +26,7 @@
#include "Spheroid.h"
#include "Magnum/Math/Functions.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Mesh.h"
#include "Magnum/Trade/MeshData3D.h"
@ -163,8 +163,8 @@ void Spheroid::capVertexRing(Float y, Float textureCoordsV, const Vector3& norma
}
Trade::MeshData3D Spheroid::finalize() {
return Trade::MeshData3D(MeshPrimitive::Triangles, std::move(indices), {std::move(positions)}, {std::move(normals)},
textureCoords == TextureCoords::Generate ? std::vector<std::vector<Vector2>>{std::move(textureCoords2D)} : std::vector<std::vector<Vector2>>());
return Trade::MeshData3D{MeshPrimitive::Triangles, std::move(indices), {std::move(positions)}, {std::move(normals)},
textureCoords == TextureCoords::Generate ? std::vector<std::vector<Vector2>>{std::move(textureCoords2D)} : std::vector<std::vector<Vector2>>(), {}, nullptr};
}
}}}

4
src/Magnum/Primitives/Implementation/WireframeSpheroid.cpp

@ -26,7 +26,7 @@
#include "WireframeSpheroid.h"
#include "Magnum/Math/Functions.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Mesh.h"
#include "Magnum/Trade/MeshData3D.h"
@ -111,7 +111,7 @@ void WireframeSpheroid::cylinder() {
}
Trade::MeshData3D WireframeSpheroid::finalize() {
return Trade::MeshData3D(MeshPrimitive::Lines, std::move(_indices), {std::move(_positions)}, {}, {});
return Trade::MeshData3D{MeshPrimitive::Lines, std::move(_indices), {std::move(_positions)}, {}, {}, {}, nullptr};
}
}}}

10
src/Magnum/Primitives/Line.cpp

@ -26,22 +26,22 @@
#include "Line.h"
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Trade/MeshData2D.h"
#include "Magnum/Trade/MeshData3D.h"
namespace Magnum { namespace Primitives {
Trade::MeshData2D Line2D::wireframe() {
return Trade::MeshData2D(MeshPrimitive::Lines, {}, {{
return Trade::MeshData2D{MeshPrimitive::Lines, {}, {{
{0.0f, 0.0f}, {1.0f, 0.0f}
}}, {});
}}, {}, {}, nullptr};
}
Trade::MeshData3D Line3D::wireframe() {
return Trade::MeshData3D(MeshPrimitive::Lines, {}, {{
return Trade::MeshData3D{MeshPrimitive::Lines, {}, {{
{0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f},
}}, {}, {});
}}, {}, {}, {}, nullptr};
}
}}

10
src/Magnum/Primitives/Plane.cpp

@ -25,8 +25,8 @@
#include "Plane.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Mesh.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Trade/MeshData3D.h"
namespace Magnum { namespace Primitives {
@ -40,7 +40,7 @@ Trade::MeshData3D Plane::solid(const TextureCoords textureCoords) {
{0.0f, 1.0f}
});
return Trade::MeshData3D(MeshPrimitive::TriangleStrip, {}, {{
return Trade::MeshData3D{MeshPrimitive::TriangleStrip, {}, {{
{1.0f, -1.0f, 0.0f},
{1.0f, 1.0f, 0.0f},
{-1.0f, -1.0f, 0.0f},
@ -50,16 +50,16 @@ Trade::MeshData3D Plane::solid(const TextureCoords textureCoords) {
{0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f}
}}, std::move(coords));
}}, std::move(coords), {}, nullptr};
}
Trade::MeshData3D Plane::wireframe() {
return Trade::MeshData3D(MeshPrimitive::LineLoop, {}, {{
return Trade::MeshData3D{MeshPrimitive::LineLoop, {}, {{
{-1.0f, -1.0f, 0.0f},
{1.0f, -1.0f, 0.0f},
{1.0f, 1.0f, 0.0f},
{-1.0f, 1.0f, 0.0f}
}}, {}, {});
}}, {}, {}, {}, nullptr};
}
}}

10
src/Magnum/Primitives/Square.cpp

@ -26,7 +26,7 @@
#include "Square.h"
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector2.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Trade/MeshData2D.h"
namespace Magnum { namespace Primitives {
@ -40,21 +40,21 @@ Trade::MeshData2D Square::solid(const TextureCoords textureCoords) {
{0.0f, 1.0f}
});
return Trade::MeshData2D(MeshPrimitive::TriangleStrip, {}, {{
return Trade::MeshData2D{MeshPrimitive::TriangleStrip, {}, {{
{1.0f, -1.0f},
{1.0f, 1.0f},
{-1.0f, -1.0f},
{-1.0f, 1.0f}
}}, std::move(coords));
}}, std::move(coords), {}, nullptr};
}
Trade::MeshData2D Square::wireframe() {
return Trade::MeshData2D(MeshPrimitive::LineLoop, {}, {{
return Trade::MeshData2D{MeshPrimitive::LineLoop, {}, {{
{-1.0f, -1.0f},
{1.0f, -1.0f},
{1.0f, 1.0f},
{-1.0f, 1.0f}
}}, {});
}}, {}, {}, nullptr};
}
}}

8
src/Magnum/Primitives/UVSphere.cpp

@ -26,7 +26,7 @@
#include "UVSphere.h"
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Primitives/Implementation/Spheroid.h"
#include "Magnum/Primitives/Implementation/WireframeSpheroid.h"
#include "Magnum/Trade/MeshData3D.h"
@ -34,7 +34,8 @@
namespace Magnum { namespace Primitives {
Trade::MeshData3D UVSphere::solid(UnsignedInt rings, UnsignedInt segments, TextureCoords textureCoords) {
CORRADE_ASSERT(rings >= 2 && segments >= 3, "UVSphere must have at least two rings and three segments", Trade::MeshData3D(MeshPrimitive::Triangles, {}, {}, {}, {}));
CORRADE_ASSERT(rings >= 2 && segments >= 3, "UVSphere must have at least two rings and three segments",
(Trade::MeshData3D{MeshPrimitive::Triangles, {}, {}, {}, {}, {}, nullptr}));
Implementation::Spheroid sphere(segments, textureCoords == TextureCoords::Generate ?
Implementation::Spheroid::TextureCoords::Generate :
@ -61,7 +62,8 @@ Trade::MeshData3D UVSphere::solid(UnsignedInt rings, UnsignedInt segments, Textu
}
Trade::MeshData3D UVSphere::wireframe(const UnsignedInt rings, const UnsignedInt segments) {
CORRADE_ASSERT(rings >= 2 && rings%2 == 0 && segments >= 4 && segments%2 == 0, "Primitives::UVSphere::wireframe(): improper parameters", Trade::MeshData3D(MeshPrimitive::Lines, {}, {}, {}, {}));
CORRADE_ASSERT(rings >= 2 && rings%2 == 0 && segments >= 4 && segments%2 == 0, "Primitives::UVSphere::wireframe(): improper parameters",
(Trade::MeshData3D{MeshPrimitive::Triangles, {}, {}, {}, {}, {}, nullptr}));
Implementation::WireframeSpheroid sphere(segments/4);

18
src/Magnum/Trade/MeshData2D.cpp

@ -25,14 +25,18 @@
#include "MeshData2D.h"
#include "Magnum/Math/Vector2.h"
#include "Magnum/Math/Color.h"
namespace Magnum { namespace Trade {
MeshData2D::MeshData2D(const MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector2>> positions, std::vector<std::vector<Vector2>> textureCoords2D, const void* const importerState): _primitive{primitive}, _indices{std::move(indices)}, _positions{std::move(positions)}, _textureCoords2D{std::move(textureCoords2D)}, _importerState{importerState} {
MeshData2D::MeshData2D(const MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector2>> positions, std::vector<std::vector<Vector2>> textureCoords2D, std::vector<std::vector<Color4>> colors, const void* const importerState): _primitive{primitive}, _indices{std::move(indices)}, _positions{std::move(positions)}, _textureCoords2D{std::move(textureCoords2D)}, _colors{std::move(colors)}, _importerState{importerState} {
CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData2D: no position array specified", );
}
#ifdef MAGNUM_BUILD_DEPRECATED
MeshData2D::MeshData2D(const MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector2>> positions, std::vector<std::vector<Vector2>> textureCoords2D, const void* const importerState): MeshData2D{primitive, std::move(indices), std::move(positions), std::move(textureCoords2D), {}, importerState} {}
#endif
MeshData2D::MeshData2D(MeshData2D&&)
#if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409
noexcept
@ -77,4 +81,14 @@ const std::vector<Vector2>& MeshData2D::textureCoords2D(const UnsignedInt id) co
return _textureCoords2D[id];
}
std::vector<Color4>& MeshData2D::colors(const UnsignedInt id) {
CORRADE_ASSERT(id < colorArrayCount(), "Trade::MeshData3D::colors(): index out of range", _colors[id]);
return _colors[id];
}
const std::vector<Color4>& MeshData2D::colors(const UnsignedInt id) const {
CORRADE_ASSERT(id < colorArrayCount(), "Trade::MeshData3D::colors(): index out of range", _colors[id]);
return _colors[id];
}
}}

26
src/Magnum/Trade/MeshData2D.h

@ -54,9 +54,17 @@ class MAGNUM_EXPORT MeshData2D {
* array should be present.
* @param textureCoords2D Two-dimensional texture coordinate arrays,
* if present
* @param colors Vertex color arrays, if present
* @param importerState Importer-specific state
*/
explicit MeshData2D(MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector2>> positions, std::vector<std::vector<Vector2>> textureCoords2D, const void* importerState = nullptr);
explicit MeshData2D(MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector2>> positions, std::vector<std::vector<Vector2>> textureCoords2D, std::vector<std::vector<Color4>> colors, const void* importerState = nullptr);
#ifdef MAGNUM_BUILD_DEPRECATED
/** @copybrief MeshData2D(MeshPrimitive, std::vector<UnsignedInt>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Color4>>, const void*)
* @deprecated Use @ref MeshData2D(MeshPrimitive, std::vector<UnsignedInt>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Color4>>, const void*) instead.
*/
CORRADE_DEPRECATED("Use MeshData2D(MeshPrimitive, std::vector<UnsignedInt>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Color4>>, const void*) instead") explicit MeshData2D(MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector2>> positions, std::vector<std::vector<Vector2>> textureCoords2D, const void* importerState = nullptr);
#endif
/** @brief Copying is not allowed */
MeshData2D(const MeshData2D&) = delete;
@ -131,6 +139,21 @@ class MAGNUM_EXPORT MeshData2D {
std::vector<Vector2>& textureCoords2D(UnsignedInt id);
const std::vector<Vector2>& textureCoords2D(UnsignedInt id) const; /**< @overload */
/** @brief Whether the data contain any vertex colors */
bool hasColors() const { return !_colors.empty(); }
/** @brief Count of color arrays */
UnsignedInt colorArrayCount() const { return _colors.size(); }
/**
* @brief Vertex colors
* @param id Vertex color array ID
*
* @see @ref colorArrayCount()
*/
std::vector<Color4>& colors(UnsignedInt id);
const std::vector<Color4>& colors(UnsignedInt id) const; /**< @overload */
/**
* @brief Importer-specific state
*
@ -143,6 +166,7 @@ class MAGNUM_EXPORT MeshData2D {
std::vector<UnsignedInt> _indices;
std::vector<std::vector<Vector2>> _positions;
std::vector<std::vector<Vector2>> _textureCoords2D;
std::vector<std::vector<Color4>> _colors;
const void* _importerState;
};

18
src/Magnum/Trade/MeshData3D.cpp

@ -25,14 +25,18 @@
#include "MeshData3D.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
namespace Magnum { namespace Trade {
MeshData3D::MeshData3D(const MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector3>> positions, std::vector<std::vector<Vector3>> normals, std::vector<std::vector<Vector2>> textureCoords2D, const void* const importerState): _primitive{primitive}, _indices{std::move(indices)}, _positions{std::move(positions)}, _normals{std::move(normals)}, _textureCoords2D{std::move(textureCoords2D)}, _importerState{importerState} {
MeshData3D::MeshData3D(const MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector3>> positions, std::vector<std::vector<Vector3>> normals, std::vector<std::vector<Vector2>> textureCoords2D, std::vector<std::vector<Color4>> colors, const void* const importerState): _primitive{primitive}, _indices{std::move(indices)}, _positions{std::move(positions)}, _normals{std::move(normals)}, _textureCoords2D{std::move(textureCoords2D)}, _colors{std::move(colors)}, _importerState{importerState} {
CORRADE_ASSERT(!_positions.empty(), "Trade::MeshData3D: no position array specified", );
}
#ifdef MAGNUM_BUILD_DEPRECATED
MeshData3D::MeshData3D(const MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector3>> positions, std::vector<std::vector<Vector3>> normals, std::vector<std::vector<Vector2>> textureCoords2D, const void* const importerState): MeshData3D{primitive, std::move(indices), std::move(positions), std::move(normals), std::move(textureCoords2D), {}, importerState} {}
#endif
MeshData3D::MeshData3D(MeshData3D&&)
#if !defined(__GNUC__) || __GNUC__*100 + __GNUC_MINOR__ != 409
noexcept
@ -87,4 +91,14 @@ const std::vector<Vector2>& MeshData3D::textureCoords2D(const UnsignedInt id) co
return _textureCoords2D[id];
}
std::vector<Color4>& MeshData3D::colors(const UnsignedInt id) {
CORRADE_ASSERT(id < colorArrayCount(), "Trade::MeshData3D::colors(): index out of range", _colors[id]);
return _colors[id];
}
const std::vector<Color4>& MeshData3D::colors(const UnsignedInt id) const {
CORRADE_ASSERT(id < colorArrayCount(), "Trade::MeshData3D::colors(): index out of range", _colors[id]);
return _colors[id];
}
}}

26
src/Magnum/Trade/MeshData3D.h

@ -55,9 +55,17 @@ class MAGNUM_EXPORT MeshData3D {
* @param normals Normal arrays, if present
* @param textureCoords2D Two-dimensional texture coordinate arrays,
* if present
* @param colors Vertex color arrays, if present
* @param importerState Importer-specific state
*/
explicit MeshData3D(MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector3>> positions, std::vector<std::vector<Vector3>> normals, std::vector<std::vector<Vector2>> textureCoords2D, const void* importerState = nullptr);
explicit MeshData3D(MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector3>> positions, std::vector<std::vector<Vector3>> normals, std::vector<std::vector<Vector2>> textureCoords2D, std::vector<std::vector<Color4>> colors, const void* importerState = nullptr);
#ifdef MAGNUM_BUILD_DEPRECATED
/** @copybrief MeshData3D(MeshPrimitive, std::vector<UnsignedInt>, std::vector<std::vector<Vector3>>, std::vector<std::vector<Vector3>>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Color4>>, const void*)
* @deprecated Use @ref MeshData3D(MeshPrimitive, std::vector<UnsignedInt>, std::vector<std::vector<Vector3>>, std::vector<std::vector<Vector3>>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Color4>>, const void*) instead.
*/
CORRADE_DEPRECATED("Use MeshData3D(MeshPrimitive, std::vector<UnsignedInt>, std::vector<std::vector<Vector3>>, std::vector<std::vector<Vector3>>, std::vector<std::vector<Vector2>>, std::vector<std::vector<Color4>>, const void*) instead") explicit MeshData3D(MeshPrimitive primitive, std::vector<UnsignedInt> indices, std::vector<std::vector<Vector3>> positions, std::vector<std::vector<Vector3>> normals, std::vector<std::vector<Vector2>> textureCoords2D, const void* importerState = nullptr);
#endif
/** @brief Copying is not allowed */
MeshData3D(const MeshData3D&) = delete;
@ -147,6 +155,21 @@ class MAGNUM_EXPORT MeshData3D {
std::vector<Vector2>& textureCoords2D(UnsignedInt id);
const std::vector<Vector2>& textureCoords2D(UnsignedInt id) const; /**< @overload */
/** @brief Whether the data contain any vertex colors */
bool hasColors() const { return !_colors.empty(); }
/** @brief Count of color arrays */
UnsignedInt colorArrayCount() const { return _colors.size(); }
/**
* @brief Vertex colors
* @param id Vertex color array ID
*
* @see @ref colorArrayCount()
*/
std::vector<Color4>& colors(UnsignedInt id);
const std::vector<Color4>& colors(UnsignedInt id) const; /**< @overload */
/**
* @brief Importer-specific state
*
@ -160,6 +183,7 @@ class MAGNUM_EXPORT MeshData3D {
std::vector<std::vector<Vector3>> _positions;
std::vector<std::vector<Vector3>> _normals;
std::vector<std::vector<Vector2>> _textureCoords2D;
std::vector<std::vector<Color4>> _colors;
const void* _importerState;
};

32
src/Magnum/Trade/Test/MeshData2DTest.cpp

@ -26,7 +26,7 @@
#include <Corrade/TestSuite/Tester.h>
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector2.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Trade/MeshData2D.h"
namespace Magnum { namespace Trade { namespace Test {
@ -37,6 +37,7 @@ struct MeshData2DTest: TestSuite::Tester {
void construct();
void constructNonIndexed();
void constructNoTexCoords();
void constructNoColors();
void constructCopy();
void constructMove();
};
@ -45,10 +46,13 @@ MeshData2DTest::MeshData2DTest() {
addTests({&MeshData2DTest::construct,
&MeshData2DTest::constructNonIndexed,
&MeshData2DTest::constructNoTexCoords,
&MeshData2DTest::constructNoColors,
&MeshData2DTest::constructCopy,
&MeshData2DTest::constructMove});
}
using namespace Math::Literals;
void MeshData2DTest::construct() {
const int a{};
const MeshData2D data{MeshPrimitive::Lines, {12, 1, 0},
@ -57,6 +61,7 @@ void MeshData2DTest::construct() {
{{{0.0f, 0.0f}, {0.3f, 0.7f}},
{{0.1f, 0.2f}, {0.7f, 1.0f}},
{{0.0f, 0.0f}, {1.0f, 1.0f}}},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
CORRADE_COMPARE(data.primitive(), MeshPrimitive::Lines);
@ -74,6 +79,10 @@ void MeshData2DTest::construct() {
CORRADE_COMPARE(data.textureCoords2D(1), (std::vector<Vector2>{{0.1f, 0.2f}, {0.7f, 1.0f}}));
CORRADE_COMPARE(data.textureCoords2D(2), (std::vector<Vector2>{{0.0f, 0.0f}, {1.0f, 1.0f}}));
CORRADE_VERIFY(data.hasColors());
CORRADE_COMPARE(data.colorArrayCount(), 1);
CORRADE_COMPARE(data.colors(0), (std::vector<Color4>{0xff98ab_rgbf, 0xff3366_rgbf}));
CORRADE_COMPARE(data.importerState(), &a);
}
@ -82,6 +91,7 @@ void MeshData2DTest::constructNonIndexed() {
const MeshData2D data{MeshPrimitive::Lines, {},
{{{0.5f, 1.0f}, {-1.0f, 0.3f}}},
{{{0.0f, 0.0f}, {0.3f, 0.7f}}},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
CORRADE_VERIFY(!data.isIndexed());
@ -93,12 +103,26 @@ void MeshData2DTest::constructNoTexCoords() {
{{{0.5f, 1.0f}, {-1.0f, 0.3f}},
{{1.4f, 0.2f}, {1.1f, 0.13f}}},
{},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
CORRADE_VERIFY(!data.hasTextureCoords2D());
CORRADE_COMPARE(data.textureCoords2DArrayCount(), 0);
}
void MeshData2DTest::constructNoColors() {
const int a{};
const MeshData2D data{MeshPrimitive::Lines, {12, 1, 0},
{{{0.5f, 1.0f}, {-1.0f, 0.3f}},
{{1.4f, 0.2f}, {1.1f, 0.13f}}},
{{{0.0f, 0.0f}, {0.3f, 0.7f}}},
{},
&a};
CORRADE_VERIFY(!data.hasColors());
CORRADE_COMPARE(data.colorArrayCount(), 0);
}
void MeshData2DTest::constructCopy() {
CORRADE_VERIFY(!(std::is_constructible<MeshData2D, const MeshData2D&>{}));
CORRADE_VERIFY(!(std::is_assignable<MeshData2D, const MeshData2D&>{}));
@ -109,6 +133,7 @@ void MeshData2DTest::constructMove() {
MeshData2D data{MeshPrimitive::LineStrip, {12, 1, 0},
{{{0.5f, 1.0f}, {-1.0f, 0.3f}}},
{{{0.0f, 0.0f}, {0.3f, 0.7f}}},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
MeshData2D b{std::move(data)};
@ -120,12 +145,15 @@ void MeshData2DTest::constructMove() {
CORRADE_COMPARE(b.positions(0), (std::vector<Vector2>{{0.5f, 1.0f}, {-1.0f, 0.3f}}));
CORRADE_COMPARE(b.textureCoords2DArrayCount(), 1);
CORRADE_COMPARE(b.textureCoords2D(0), (std::vector<Vector2>{{0.0f, 0.0f}, {0.3f, 0.7f}}));
CORRADE_COMPARE(b.colorArrayCount(), 1);
CORRADE_COMPARE(b.colors(0), (std::vector<Color4>{0xff98ab_rgbf, 0xff3366_rgbf}));
CORRADE_COMPARE(b.importerState(), &a);
const int c{};
MeshData2D d{MeshPrimitive::TriangleFan, {},
{{}},
{},
{},
&c};
d = std::move(b);
CORRADE_COMPARE(d.primitive(), MeshPrimitive::LineStrip);
@ -135,6 +163,8 @@ void MeshData2DTest::constructMove() {
CORRADE_COMPARE(d.positions(0), (std::vector<Vector2>{{0.5f, 1.0f}, {-1.0f, 0.3f}}));
CORRADE_COMPARE(d.textureCoords2DArrayCount(), 1);
CORRADE_COMPARE(d.textureCoords2D(0), (std::vector<Vector2>{{0.0f, 0.0f}, {0.3f, 0.7f}}));
CORRADE_COMPARE(d.colorArrayCount(), 1);
CORRADE_COMPARE(d.colors(0), (std::vector<Color4>{0xff98ab_rgbf, 0xff3366_rgbf}));
CORRADE_COMPARE(d.importerState(), &a);
}

33
src/Magnum/Trade/Test/MeshData3DTest.cpp

@ -26,7 +26,7 @@
#include <Corrade/TestSuite/Tester.h>
#include "Magnum/Mesh.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Trade/MeshData3D.h"
namespace Magnum { namespace Trade { namespace Test {
@ -38,6 +38,7 @@ struct MeshData3DTest: TestSuite::Tester {
void constructNonIndexed();
void constructNoNormals();
void constructNoTexCoords();
void constructNoColors();
void constructCopy();
void constructMove();
};
@ -47,10 +48,13 @@ MeshData3DTest::MeshData3DTest() {
&MeshData3DTest::constructNonIndexed,
&MeshData3DTest::constructNoNormals,
&MeshData3DTest::constructNoTexCoords,
&MeshData3DTest::constructNoColors,
&MeshData3DTest::constructCopy,
&MeshData3DTest::constructMove});
}
using namespace Math::Literals;
void MeshData3DTest::construct() {
const int a{};
const MeshData3D data{MeshPrimitive::Lines, {12, 1, 0},
@ -60,6 +64,7 @@ void MeshData3DTest::construct() {
{{{0.0f, 0.0f}, {0.3f, 0.7f}},
{{0.1f, 0.2f}, {0.7f, 1.0f}},
{{0.0f, 0.0f}, {1.0f, 1.0f}}},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
CORRADE_COMPARE(data.primitive(), MeshPrimitive::Lines);
@ -81,6 +86,10 @@ void MeshData3DTest::construct() {
CORRADE_COMPARE(data.textureCoords2D(1), (std::vector<Vector2>{{0.1f, 0.2f}, {0.7f, 1.0f}}));
CORRADE_COMPARE(data.textureCoords2D(2), (std::vector<Vector2>{{0.0f, 0.0f}, {1.0f, 1.0f}}));
CORRADE_VERIFY(data.hasColors());
CORRADE_COMPARE(data.colorArrayCount(), 1);
CORRADE_COMPARE(data.colors(0), (std::vector<Color4>{0xff98ab_rgbf, 0xff3366_rgbf}));
CORRADE_COMPARE(data.importerState(), &a);
}
@ -90,6 +99,7 @@ void MeshData3DTest::constructNonIndexed() {
{{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}},
{{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}},
{{{0.0f, 0.0f}, {0.3f, 0.7f}}},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
CORRADE_VERIFY(!data.isIndexed());
@ -101,6 +111,7 @@ void MeshData3DTest::constructNoNormals() {
{{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}},
{},
{{{0.0f, 0.0f}, {0.3f, 0.7f}}},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
CORRADE_VERIFY(!data.hasNormals());
@ -113,12 +124,26 @@ void MeshData3DTest::constructNoTexCoords() {
{{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}},
{{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}},
{},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
CORRADE_VERIFY(!data.hasTextureCoords2D());
CORRADE_COMPARE(data.textureCoords2DArrayCount(), 0);
}
void MeshData3DTest::constructNoColors() {
const int a{};
const MeshData3D data{MeshPrimitive::Lines, {12, 1, 0},
{{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}},
{{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}},
{{{0.0f, 0.0f}, {0.3f, 0.7f}}},
{},
&a};
CORRADE_VERIFY(!data.hasColors());
CORRADE_COMPARE(data.colorArrayCount(), 0);
}
void MeshData3DTest::constructCopy() {
CORRADE_VERIFY(!(std::is_constructible<MeshData3D, const MeshData3D&>{}));
CORRADE_VERIFY(!(std::is_assignable<MeshData3D, const MeshData3D&>{}));
@ -130,6 +155,7 @@ void MeshData3DTest::constructMove() {
{{{0.5f, 1.0f, 0.1f}, {-1.0f, 0.3f, -1.0f}}},
{{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}},
{{{0.0f, 0.0f}, {0.3f, 0.7f}}},
{{0xff98ab_rgbf, 0xff3366_rgbf}},
&a};
MeshData3D b{std::move(data)};
@ -143,6 +169,8 @@ void MeshData3DTest::constructMove() {
CORRADE_COMPARE(b.normals(0), (std::vector<Vector3>{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}));
CORRADE_COMPARE(b.textureCoords2DArrayCount(), 1);
CORRADE_COMPARE(b.textureCoords2D(0), (std::vector<Vector2>{{0.0f, 0.0f}, {0.3f, 0.7f}}));
CORRADE_COMPARE(b.colorArrayCount(), 1);
CORRADE_COMPARE(b.colors(0), (std::vector<Color4>{0xff98ab_rgbf, 0xff3366_rgbf}));
CORRADE_COMPARE(b.importerState(), &a);
const int c{};
@ -150,6 +178,7 @@ void MeshData3DTest::constructMove() {
{{}},
{},
{{}},
{},
&c};
d = std::move(b);
CORRADE_COMPARE(d.primitive(), MeshPrimitive::LineStrip);
@ -161,6 +190,8 @@ void MeshData3DTest::constructMove() {
CORRADE_COMPARE(d.normals(0), (std::vector<Vector3>{{0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}));
CORRADE_COMPARE(d.textureCoords2DArrayCount(), 1);
CORRADE_COMPARE(d.textureCoords2D(0), (std::vector<Vector2>{{0.0f, 0.0f}, {0.3f, 0.7f}}));
CORRADE_COMPARE(d.colorArrayCount(), 1);
CORRADE_COMPARE(d.colors(0), (std::vector<Color4>{0xff98ab_rgbf, 0xff3366_rgbf}));
CORRADE_COMPARE(d.importerState(), &a);
}

4
src/MagnumPlugins/ObjImporter/ObjImporter.cpp

@ -35,7 +35,7 @@
#include "Magnum/Mesh.h"
#include "Magnum/MeshTools/CombineIndexedArrays.h"
#include "Magnum/MeshTools/Duplicate.h"
#include "Magnum/Math/Vector3.h"
#include "Magnum/Math/Color.h"
#include "Magnum/Trade/MeshData3D.h"
namespace Magnum { namespace Trade {
@ -495,7 +495,7 @@ std::optional<MeshData3D> ObjImporter::doMesh3D(UnsignedInt id) {
}
}
return MeshData3D(*primitive, std::move(indices), {std::move(positions)}, std::move(normals), std::move(textureCoordinates));
return MeshData3D{*primitive, std::move(indices), {std::move(positions)}, std::move(normals), std::move(textureCoordinates), {}, nullptr};
}
}}

Loading…
Cancel
Save