Browse Source

Add matrix vertex formats.

pull/430/head
Vladimír Vondruš 6 years ago
parent
commit
b3b61b22e4
  1. 57
      src/Magnum/Implementation/vertexFormatMapping.hpp
  2. 228
      src/Magnum/Test/VertexFormatTest.cpp
  3. 542
      src/Magnum/VertexFormat.cpp
  4. 579
      src/Magnum/VertexFormat.h
  5. 5
      src/Magnum/Vk/Enums.h
  6. 57
      src/Magnum/Vk/Implementation/vertexFormatMapping.hpp
  7. 1
      src/Magnum/Vk/Test/EnumsTest.cpp

57
src/Magnum/Implementation/vertexFormatMapping.hpp

@ -77,4 +77,61 @@ _c(Vector4s)
_c(Vector4sNormalized) _c(Vector4sNormalized)
_c(Vector4ui) _c(Vector4ui)
_c(Vector4i) _c(Vector4i)
_c(Matrix2x2)
_c(Matrix2x2h)
_c(Matrix2x2d)
_c(Matrix2x2bNormalized)
_c(Matrix2x2sNormalized)
_c(Matrix2x3)
_c(Matrix2x3h)
_c(Matrix2x3d)
_c(Matrix2x3bNormalized)
_c(Matrix2x3sNormalized)
_c(Matrix2x4)
_c(Matrix2x4h)
_c(Matrix2x4d)
_c(Matrix2x4bNormalized)
_c(Matrix2x4sNormalized)
_c(Matrix2x2bNormalizedAligned)
_c(Matrix2x3hAligned)
_c(Matrix2x3bNormalizedAligned)
_c(Matrix2x3sNormalizedAligned)
_c(Matrix3x2)
_c(Matrix3x2h)
_c(Matrix3x2d)
_c(Matrix3x2bNormalized)
_c(Matrix3x2sNormalized)
_c(Matrix3x3)
_c(Matrix3x3h)
_c(Matrix3x3d)
_c(Matrix3x3bNormalized)
_c(Matrix3x3sNormalized)
_c(Matrix3x4)
_c(Matrix3x4h)
_c(Matrix3x4d)
_c(Matrix3x4bNormalized)
_c(Matrix3x4sNormalized)
_c(Matrix3x2bNormalizedAligned)
_c(Matrix3x3hAligned)
_c(Matrix3x3bNormalizedAligned)
_c(Matrix3x3sNormalizedAligned)
_c(Matrix4x2)
_c(Matrix4x2h)
_c(Matrix4x2d)
_c(Matrix4x2bNormalized)
_c(Matrix4x2sNormalized)
_c(Matrix4x3)
_c(Matrix4x3h)
_c(Matrix4x3d)
_c(Matrix4x3bNormalized)
_c(Matrix4x3sNormalized)
_c(Matrix4x4)
_c(Matrix4x4h)
_c(Matrix4x4d)
_c(Matrix4x4bNormalized)
_c(Matrix4x4sNormalized)
_c(Matrix4x2bNormalizedAligned)
_c(Matrix4x3hAligned)
_c(Matrix4x3bNormalizedAligned)
_c(Matrix4x3sNormalizedAligned)
#endif #endif

228
src/Magnum/Test/VertexFormatTest.cpp

@ -25,11 +25,13 @@
#include <sstream> #include <sstream>
#include <Corrade/TestSuite/Tester.h> #include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Numeric.h>
#include <Corrade/Utility/Configuration.h> #include <Corrade/Utility/Configuration.h>
#include <Corrade/Utility/DebugStl.h> #include <Corrade/Utility/DebugStl.h>
#include "Magnum/VertexFormat.h" #include "Magnum/VertexFormat.h"
#include "Magnum/Math/Vector4.h" #include "Magnum/Math/Half.h"
#include "Magnum/Math/Matrix4.h"
namespace Magnum { namespace Test { namespace { namespace Magnum { namespace Test { namespace {
@ -52,6 +54,12 @@ struct VertexFormatTest: TestSuite::Tester {
void componentFormat(); void componentFormat();
void componentFormatInvalid(); void componentFormatInvalid();
void componentFormatImplementationSpecific(); void componentFormatImplementationSpecific();
void vectorCount();
void vectorCountInvalid();
void vectorCountImplementationSpecific();
void vectorStride();
void vectorStrideInvalid();
void vectorStrideImplementationSpecific();
void isNormalized(); void isNormalized();
void isNormalizedInvalid(); void isNormalizedInvalid();
void isNormalizedImplementationSpecific(); void isNormalizedImplementationSpecific();
@ -62,6 +70,12 @@ struct VertexFormatTest: TestSuite::Tester {
void assembleInvalidComponentCount(); void assembleInvalidComponentCount();
void assembleImplementationSpecific(); void assembleImplementationSpecific();
void assembleMatrix();
void assembleMatrixRoundtrip();
void assembleMatrixInvalidType();
void assembleMatrixInvalidCount();
void assembleMatrixImplementationSpecific();
void debug(); void debug();
void debugImplementationSpecific(); void debugImplementationSpecific();
void configuration(); void configuration();
@ -85,6 +99,32 @@ constexpr struct {
{VertexFormat::Int, false} {VertexFormat::Int, false}
}; };
constexpr struct {
VertexFormat componentType;
UnsignedInt componentCount;
bool aligned;
} AssembleMatrixRoundtripData[]{
{VertexFormat::Float, 2, true},
{VertexFormat::Float, 3, true},
{VertexFormat::Float, 4, true},
{VertexFormat::Half, 2, false},
{VertexFormat::Half, 3, false},
{VertexFormat::Half, 3, true},
{VertexFormat::Half, 4, false},
{VertexFormat::Double, 2, true},
{VertexFormat::Double, 3, true},
{VertexFormat::Double, 4, true},
{VertexFormat::Byte, 2, false},
{VertexFormat::Byte, 2, true},
{VertexFormat::Byte, 3, false},
{VertexFormat::Byte, 3, true},
{VertexFormat::Byte, 4, false},
{VertexFormat::Short, 2, false},
{VertexFormat::Short, 3, false},
{VertexFormat::Short, 3, true},
{VertexFormat::Short, 4, false}
};
VertexFormatTest::VertexFormatTest() { VertexFormatTest::VertexFormatTest() {
addTests({&VertexFormatTest::mapping, addTests({&VertexFormatTest::mapping,
@ -102,6 +142,12 @@ VertexFormatTest::VertexFormatTest() {
&VertexFormatTest::componentFormat, &VertexFormatTest::componentFormat,
&VertexFormatTest::componentFormatInvalid, &VertexFormatTest::componentFormatInvalid,
&VertexFormatTest::componentFormatImplementationSpecific, &VertexFormatTest::componentFormatImplementationSpecific,
&VertexFormatTest::vectorCount,
&VertexFormatTest::vectorCountInvalid,
&VertexFormatTest::vectorCountImplementationSpecific,
&VertexFormatTest::vectorStride,
&VertexFormatTest::vectorStrideInvalid,
&VertexFormatTest::vectorStrideImplementationSpecific,
&VertexFormatTest::isNormalized, &VertexFormatTest::isNormalized,
&VertexFormatTest::isNormalizedInvalid, &VertexFormatTest::isNormalizedInvalid,
&VertexFormatTest::isNormalizedImplementationSpecific, &VertexFormatTest::isNormalizedImplementationSpecific,
@ -115,6 +161,15 @@ VertexFormatTest::VertexFormatTest() {
&VertexFormatTest::assembleInvalidComponentCount, &VertexFormatTest::assembleInvalidComponentCount,
&VertexFormatTest::assembleImplementationSpecific, &VertexFormatTest::assembleImplementationSpecific,
&VertexFormatTest::assembleMatrix});
addRepeatedInstancedTests({&VertexFormatTest::assembleMatrixRoundtrip}, 3,
Containers::arraySize(AssembleMatrixRoundtripData));
addTests({&VertexFormatTest::assembleMatrixInvalidType,
&VertexFormatTest::assembleMatrixInvalidCount,
&VertexFormatTest::assembleMatrixImplementationSpecific,
&VertexFormatTest::debug, &VertexFormatTest::debug,
&VertexFormatTest::debugImplementationSpecific, &VertexFormatTest::debugImplementationSpecific,
&VertexFormatTest::configuration}); &VertexFormatTest::configuration});
@ -198,6 +253,13 @@ void VertexFormatTest::size() {
CORRADE_COMPARE(vertexFormatSize(VertexFormat::Vector2), sizeof(Vector2)); CORRADE_COMPARE(vertexFormatSize(VertexFormat::Vector2), sizeof(Vector2));
CORRADE_COMPARE(vertexFormatSize(VertexFormat::Vector3), sizeof(Vector3)); CORRADE_COMPARE(vertexFormatSize(VertexFormat::Vector3), sizeof(Vector3));
CORRADE_COMPARE(vertexFormatSize(VertexFormat::Vector4), sizeof(Vector4)); CORRADE_COMPARE(vertexFormatSize(VertexFormat::Vector4), sizeof(Vector4));
CORRADE_COMPARE(vertexFormatSize(VertexFormat::Matrix2x3), sizeof(Matrix2x3));
CORRADE_COMPARE(vertexFormatSize(VertexFormat::Matrix4x3h), sizeof(Matrix4x3h));
/* Aligned types */
CORRADE_COMPARE(vertexFormatSize(VertexFormat::Matrix2x2bNormalized), sizeof(Matrix2x2b));
CORRADE_COMPARE(vertexFormatSize(VertexFormat::Matrix2x2bNormalizedAligned), sizeof(Matrix2x4b));
} }
void VertexFormatTest::sizeInvalid() { void VertexFormatTest::sizeInvalid() {
@ -224,6 +286,13 @@ void VertexFormatTest::componentCount() {
CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Vector2us), 2); CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Vector2us), 2);
CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Vector3bNormalized), 3); CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Vector3bNormalized), 3);
CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Vector4), 4); CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Vector4), 4);
CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Matrix4x3), 3);
CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Matrix2x4sNormalized), 4);
/* Aligned types return used component count, w/o padding */
CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Matrix2x3sNormalized), 3);
CORRADE_COMPARE(vertexFormatComponentCount(VertexFormat::Matrix2x3sNormalizedAligned), 3);
} }
void VertexFormatTest::componentCountInvalid() { void VertexFormatTest::componentCountInvalid() {
@ -257,6 +326,14 @@ void VertexFormatTest::componentFormat() {
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Vector2sNormalized), VertexFormat::Short); CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Vector2sNormalized), VertexFormat::Short);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Vector2ui), VertexFormat::UnsignedInt); CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Vector2ui), VertexFormat::UnsignedInt);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Vector3i), VertexFormat::Int); CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Vector3i), VertexFormat::Int);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Matrix3x4), VertexFormat::Float);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Matrix2x3h), VertexFormat::Half);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Matrix2x2d), VertexFormat::Double);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Matrix4x2bNormalized), VertexFormat::Byte);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Matrix4x2bNormalizedAligned), VertexFormat::Byte);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Matrix2x3sNormalized), VertexFormat::Short);
CORRADE_COMPARE(vertexFormatComponentFormat(VertexFormat::Matrix2x3sNormalizedAligned), VertexFormat::Short);
} }
void VertexFormatTest::componentFormatInvalid() { void VertexFormatTest::componentFormatInvalid() {
@ -279,11 +356,80 @@ void VertexFormatTest::componentFormatImplementationSpecific() {
"vertexFormatComponentFormat(): can't determine component format of an implementation-specific format 0xdead\n"); "vertexFormatComponentFormat(): can't determine component format of an implementation-specific format 0xdead\n");
} }
void VertexFormatTest::vectorCount() {
CORRADE_COMPARE(vertexFormatVectorCount(VertexFormat::UnsignedByteNormalized), 1);
CORRADE_COMPARE(vertexFormatVectorCount(VertexFormat::Vector2us), 1);
CORRADE_COMPARE(vertexFormatVectorCount(VertexFormat::Vector3bNormalized), 1);
CORRADE_COMPARE(vertexFormatVectorCount(VertexFormat::Vector4), 1);
CORRADE_COMPARE(vertexFormatVectorCount(VertexFormat::Matrix2x4sNormalized), 2);
CORRADE_COMPARE(vertexFormatVectorCount(VertexFormat::Matrix3x2bNormalized), 3);
CORRADE_COMPARE(vertexFormatVectorCount(VertexFormat::Matrix3x2bNormalizedAligned), 3);
CORRADE_COMPARE(vertexFormatVectorCount(VertexFormat::Matrix4x3), 4);
}
void VertexFormatTest::vectorCountInvalid() {
std::ostringstream out;
Error redirectError{&out};
vertexFormatVectorCount(VertexFormat{});
vertexFormatVectorCount(VertexFormat(0xdead));
CORRADE_COMPARE(out.str(),
"vertexFormatVectorCount(): invalid format VertexFormat(0x0)\n"
"vertexFormatVectorCount(): invalid format VertexFormat(0xdead)\n");
}
void VertexFormatTest::vectorCountImplementationSpecific() {
std::ostringstream out;
Error redirectError{&out};
vertexFormatVectorCount(vertexFormatWrap(0xdead));
CORRADE_COMPARE(out.str(),
"vertexFormatVectorCount(): can't determine vector count of an implementation-specific format 0xdead\n");
}
void VertexFormatTest::vectorStride() {
CORRADE_COMPARE(vertexFormatVectorStride(VertexFormat::UnsignedByteNormalized), 1);
CORRADE_COMPARE(vertexFormatVectorStride(VertexFormat::Vector3bNormalized), 3);
CORRADE_COMPARE(vertexFormatVectorStride(VertexFormat::Vector2us), 4);
CORRADE_COMPARE(vertexFormatVectorStride(VertexFormat::Vector4), 16);
CORRADE_COMPARE(vertexFormatVectorStride(VertexFormat::Matrix2x4sNormalized), 8);
CORRADE_COMPARE(vertexFormatVectorStride(VertexFormat::Matrix4x3), 12);
/* Aligned formats */
CORRADE_COMPARE(vertexFormatVectorStride(VertexFormat::Matrix3x2bNormalized), 2);
CORRADE_COMPARE(vertexFormatVectorStride(VertexFormat::Matrix3x2bNormalizedAligned), 4);
}
void VertexFormatTest::vectorStrideInvalid() {
std::ostringstream out;
Error redirectError{&out};
vertexFormatVectorStride(VertexFormat{});
vertexFormatVectorStride(VertexFormat(0xdead));
CORRADE_COMPARE(out.str(),
"vertexFormatVectorStride(): invalid format VertexFormat(0x0)\n"
"vertexFormatVectorStride(): invalid format VertexFormat(0xdead)\n");
}
void VertexFormatTest::vectorStrideImplementationSpecific() {
std::ostringstream out;
Error redirectError{&out};
vertexFormatVectorStride(vertexFormatWrap(0xdead));
CORRADE_COMPARE(out.str(),
"vertexFormatVectorStride(): can't determine vector count of an implementation-specific format 0xdead\n");
}
void VertexFormatTest::isNormalized() { void VertexFormatTest::isNormalized() {
CORRADE_VERIFY(isVertexFormatNormalized(VertexFormat::UnsignedByteNormalized)); CORRADE_VERIFY(isVertexFormatNormalized(VertexFormat::UnsignedByteNormalized));
CORRADE_VERIFY(!isVertexFormatNormalized(VertexFormat::Vector2us)); CORRADE_VERIFY(!isVertexFormatNormalized(VertexFormat::Vector2us));
CORRADE_VERIFY(isVertexFormatNormalized(VertexFormat::Vector3bNormalized)); CORRADE_VERIFY(isVertexFormatNormalized(VertexFormat::Vector3bNormalized));
CORRADE_VERIFY(!isVertexFormatNormalized(VertexFormat::Vector4)); CORRADE_VERIFY(!isVertexFormatNormalized(VertexFormat::Vector4));
CORRADE_VERIFY(!isVertexFormatNormalized(VertexFormat::Matrix2x2h));
CORRADE_VERIFY(isVertexFormatNormalized(VertexFormat::Matrix2x3bNormalized));
} }
void VertexFormatTest::isNormalizedInvalid() { void VertexFormatTest::isNormalizedInvalid() {
@ -336,8 +482,11 @@ void VertexFormatTest::assembleRoundtrip() {
setTestCaseDescription(out.str()); setTestCaseDescription(out.str());
VertexFormat result = vertexFormat(data.componentType, testCaseRepeatId() + 1, data.normalized); VertexFormat result = vertexFormat(data.componentType, testCaseRepeatId() + 1, data.normalized);
CORRADE_COMPARE(vertexFormat(result, testCaseRepeatId() + 1, data.normalized), result);
CORRADE_COMPARE(vertexFormatComponentFormat(result), data.componentType); CORRADE_COMPARE(vertexFormatComponentFormat(result), data.componentType);
CORRADE_COMPARE(vertexFormatComponentCount(result), testCaseRepeatId() + 1); CORRADE_COMPARE(vertexFormatComponentCount(result), testCaseRepeatId() + 1);
CORRADE_COMPARE(vertexFormatVectorCount(result), 1);
CORRADE_COMPARE(vertexFormatVectorStride(result), vertexFormatSize(result));
CORRADE_COMPARE(isVertexFormatNormalized(result), data.normalized); CORRADE_COMPARE(isVertexFormatNormalized(result), data.normalized);
} }
@ -365,6 +514,83 @@ void VertexFormatTest::assembleImplementationSpecific() {
"vertexFormat(): can't assemble a format out of an implementation-specific format 0xdead\n"); "vertexFormat(): can't assemble a format out of an implementation-specific format 0xdead\n");
} }
void VertexFormatTest::assembleMatrix() {
CORRADE_COMPARE(vertexFormat(VertexFormat::Byte, 3, 2, false),
VertexFormat::Matrix3x2bNormalized);
CORRADE_COMPARE(vertexFormat(VertexFormat::Short, 2, 3, true),
VertexFormat::Matrix2x3sNormalizedAligned);
CORRADE_COMPARE(vertexFormat(VertexFormat::Float, 4, 2, true),
VertexFormat::Matrix4x2);
CORRADE_COMPARE(vertexFormat(VertexFormat::Half, 2, 4, false),
VertexFormat::Matrix2x4h);
CORRADE_COMPARE(vertexFormat(VertexFormat::Double, 4, 4, true),
VertexFormat::Matrix4x4d);
/* Non-scalar types allowed too, as that makes the internal checking
much simpler than when requiring the type to be scalar non-normalized */
CORRADE_COMPARE(vertexFormat(VertexFormat::Vector4bNormalized, 2, 2, false),
VertexFormat::Matrix2x2bNormalized);
CORRADE_COMPARE(vertexFormat(VertexFormat::Vector3h, 3, 3, true),
VertexFormat::Matrix3x3hAligned);
}
void VertexFormatTest::assembleMatrixRoundtrip() {
auto&& data = AssembleMatrixRoundtripData[testCaseInstanceId()];
std::ostringstream out;
{
Debug d{&out, Debug::Flag::NoNewlineAtTheEnd};
d << data.componentType << Debug::nospace << "," << data.componentCount;
if(data.aligned) d << Debug::nospace << ", aligned";
}
setTestCaseDescription(out.str());
VertexFormat result = vertexFormat(data.componentType, testCaseRepeatId() + 2, data.componentCount, data.aligned);
CORRADE_COMPARE(vertexFormat(result, testCaseRepeatId() + 2, data.componentCount, data.aligned), result);
CORRADE_COMPARE(vertexFormatComponentFormat(result), data.componentType);
CORRADE_COMPARE(vertexFormatComponentCount(result), data.componentCount);
CORRADE_COMPARE(vertexFormatVectorCount(result), testCaseRepeatId() + 2);
CORRADE_COMPARE(vertexFormatVectorStride(result), vertexFormatSize(result)/(testCaseRepeatId() + 2));
if(data.aligned)
CORRADE_COMPARE_AS(vertexFormatVectorStride(result), 4, TestSuite::Compare::Divisible);
}
void VertexFormatTest::assembleMatrixInvalidType() {
std::ostringstream out;
Error redirectError{&out};
vertexFormat(VertexFormat::UnsignedByte, 3, 2, false);
vertexFormat(VertexFormat::UnsignedShort, 3, 2, false);
vertexFormat(VertexFormat::UnsignedInt, 2, 3, false);
vertexFormat(VertexFormat::Int, 2, 3, false);
CORRADE_COMPARE(out.str(),
"vertexFormat(): invalid matrix component type VertexFormat::UnsignedByte, only floating-point or 8-/16-bit signed integer types are supported\n"
"vertexFormat(): invalid matrix component type VertexFormat::UnsignedShort, only floating-point or 8-/16-bit signed integer types are supported\n"
"vertexFormat(): invalid matrix component type VertexFormat::UnsignedInt, only floating-point or 8-/16-bit signed integer types are supported\n"
"vertexFormat(): invalid matrix component type VertexFormat::Int, only floating-point or 8-/16-bit signed integer types are supported\n");
}
void VertexFormatTest::assembleMatrixInvalidCount() {
std::ostringstream out;
Error redirectError{&out};
vertexFormat(VertexFormat::Vector3, 2, 1, false);
vertexFormat(VertexFormat::Vector3, 2, 5, false);
vertexFormat(VertexFormat::Vector3, 5, 2, false);
vertexFormat(VertexFormat::Vector3, 1, 2, false);
CORRADE_COMPARE(out.str(),
"vertexFormat(): invalid component count 1\n"
"vertexFormat(): invalid component count 5\n"
"vertexFormat(): invalid vector count 5\n"
"vertexFormat(): invalid vector count 1\n");
}
void VertexFormatTest::assembleMatrixImplementationSpecific() {
std::ostringstream out;
Error redirectError{&out};
vertexFormat(vertexFormatWrap(0xdead), 2, 2, true);
CORRADE_COMPARE(out.str(),
"vertexFormat(): can't assemble a format out of an implementation-specific format 0xdead\n");
}
void VertexFormatTest::debug() { void VertexFormatTest::debug() {
std::ostringstream o; std::ostringstream o;
Debug(&o) << VertexFormat::Vector4 << VertexFormat(0xdead); Debug(&o) << VertexFormat::Vector4 << VertexFormat(0xdead);

542
src/Magnum/VertexFormat.cpp

@ -69,12 +69,15 @@ UnsignedInt vertexFormatSize(const VertexFormat format) {
case VertexFormat::Vector4ubNormalized: case VertexFormat::Vector4ubNormalized:
case VertexFormat::Vector4b: case VertexFormat::Vector4b:
case VertexFormat::Vector4bNormalized: case VertexFormat::Vector4bNormalized:
case VertexFormat::Matrix2x2bNormalized:
return 4; return 4;
case VertexFormat::Vector3h: case VertexFormat::Vector3h:
case VertexFormat::Vector3us: case VertexFormat::Vector3us:
case VertexFormat::Vector3usNormalized: case VertexFormat::Vector3usNormalized:
case VertexFormat::Vector3s: case VertexFormat::Vector3s:
case VertexFormat::Vector3sNormalized: case VertexFormat::Vector3sNormalized:
case VertexFormat::Matrix2x3bNormalized:
case VertexFormat::Matrix3x2bNormalized:
return 6; return 6;
case VertexFormat::Double: case VertexFormat::Double:
case VertexFormat::Vector2: case VertexFormat::Vector2:
@ -85,20 +88,82 @@ UnsignedInt vertexFormatSize(const VertexFormat format) {
case VertexFormat::Vector4usNormalized: case VertexFormat::Vector4usNormalized:
case VertexFormat::Vector4s: case VertexFormat::Vector4s:
case VertexFormat::Vector4sNormalized: case VertexFormat::Vector4sNormalized:
case VertexFormat::Matrix2x2h:
case VertexFormat::Matrix2x2sNormalized:
case VertexFormat::Matrix2x4bNormalized:
case VertexFormat::Matrix2x2bNormalizedAligned:
case VertexFormat::Matrix2x3bNormalizedAligned:
case VertexFormat::Matrix4x2bNormalized:
return 8; return 8;
case VertexFormat::Matrix3x3bNormalized:
return 9;
case VertexFormat::Vector3: case VertexFormat::Vector3:
case VertexFormat::Vector3ui: case VertexFormat::Vector3ui:
case VertexFormat::Vector3i: case VertexFormat::Vector3i:
case VertexFormat::Matrix2x3h:
case VertexFormat::Matrix2x3sNormalized:
case VertexFormat::Matrix3x2h:
case VertexFormat::Matrix3x2sNormalized:
case VertexFormat::Matrix3x4bNormalized:
case VertexFormat::Matrix3x2bNormalizedAligned:
case VertexFormat::Matrix3x3bNormalizedAligned:
case VertexFormat::Matrix4x3bNormalized:
return 12; return 12;
case VertexFormat::Vector2d: case VertexFormat::Vector2d:
case VertexFormat::Vector4: case VertexFormat::Vector4:
case VertexFormat::Vector4ui: case VertexFormat::Vector4ui:
case VertexFormat::Vector4i: case VertexFormat::Vector4i:
case VertexFormat::Matrix2x2:
case VertexFormat::Matrix2x4h:
case VertexFormat::Matrix2x4sNormalized:
case VertexFormat::Matrix2x3hAligned:
case VertexFormat::Matrix2x3sNormalizedAligned:
case VertexFormat::Matrix4x2h:
case VertexFormat::Matrix4x2sNormalized:
case VertexFormat::Matrix4x4bNormalized:
case VertexFormat::Matrix4x2bNormalizedAligned:
case VertexFormat::Matrix4x3bNormalizedAligned:
return 16; return 16;
case VertexFormat::Matrix3x3h:
case VertexFormat::Matrix3x3sNormalized:
return 18;
case VertexFormat::Vector3d: case VertexFormat::Vector3d:
case VertexFormat::Matrix2x3:
case VertexFormat::Matrix3x2:
case VertexFormat::Matrix3x4h:
case VertexFormat::Matrix3x4sNormalized:
case VertexFormat::Matrix3x3hAligned:
case VertexFormat::Matrix3x3sNormalizedAligned:
case VertexFormat::Matrix4x3h:
case VertexFormat::Matrix4x3sNormalized:
return 24; return 24;
case VertexFormat::Vector4d: case VertexFormat::Vector4d:
case VertexFormat::Matrix2x2d:
case VertexFormat::Matrix2x4:
case VertexFormat::Matrix4x2:
case VertexFormat::Matrix4x4h:
case VertexFormat::Matrix4x4sNormalized:
case VertexFormat::Matrix4x3hAligned:
case VertexFormat::Matrix4x3sNormalizedAligned:
return 32; return 32;
case VertexFormat::Matrix3x3:
return 36;
case VertexFormat::Matrix2x3d:
case VertexFormat::Matrix3x2d:
case VertexFormat::Matrix3x4:
case VertexFormat::Matrix4x3:
return 48;
case VertexFormat::Matrix2x4d:
case VertexFormat::Matrix4x2d:
case VertexFormat::Matrix4x4:
return 64;
case VertexFormat::Matrix3x3d:
return 72;
case VertexFormat::Matrix3x4d:
case VertexFormat::Matrix4x3d:
return 96;
case VertexFormat::Matrix4x4d:
return 128;
} }
CORRADE_ASSERT(false, "vertexFormatSize(): invalid format" << format, {}); CORRADE_ASSERT(false, "vertexFormatSize(): invalid format" << format, {});
@ -137,6 +202,24 @@ UnsignedInt vertexFormatComponentCount(const VertexFormat format) {
case VertexFormat::Vector2sNormalized: case VertexFormat::Vector2sNormalized:
case VertexFormat::Vector2ui: case VertexFormat::Vector2ui:
case VertexFormat::Vector2i: case VertexFormat::Vector2i:
case VertexFormat::Matrix2x2:
case VertexFormat::Matrix2x2h:
case VertexFormat::Matrix2x2d:
case VertexFormat::Matrix2x2bNormalized:
case VertexFormat::Matrix2x2sNormalized:
case VertexFormat::Matrix2x2bNormalizedAligned:
case VertexFormat::Matrix3x2:
case VertexFormat::Matrix3x2h:
case VertexFormat::Matrix3x2d:
case VertexFormat::Matrix3x2bNormalized:
case VertexFormat::Matrix3x2sNormalized:
case VertexFormat::Matrix3x2bNormalizedAligned:
case VertexFormat::Matrix4x2:
case VertexFormat::Matrix4x2h:
case VertexFormat::Matrix4x2d:
case VertexFormat::Matrix4x2bNormalized:
case VertexFormat::Matrix4x2sNormalized:
case VertexFormat::Matrix4x2bNormalizedAligned:
return 2; return 2;
case VertexFormat::Vector3: case VertexFormat::Vector3:
@ -152,6 +235,30 @@ UnsignedInt vertexFormatComponentCount(const VertexFormat format) {
case VertexFormat::Vector3sNormalized: case VertexFormat::Vector3sNormalized:
case VertexFormat::Vector3ui: case VertexFormat::Vector3ui:
case VertexFormat::Vector3i: case VertexFormat::Vector3i:
case VertexFormat::Matrix2x3:
case VertexFormat::Matrix2x3h:
case VertexFormat::Matrix2x3d:
case VertexFormat::Matrix2x3bNormalized:
case VertexFormat::Matrix2x3sNormalized:
case VertexFormat::Matrix2x3bNormalizedAligned:
case VertexFormat::Matrix2x3hAligned:
case VertexFormat::Matrix2x3sNormalizedAligned:
case VertexFormat::Matrix3x3:
case VertexFormat::Matrix3x3h:
case VertexFormat::Matrix3x3d:
case VertexFormat::Matrix3x3bNormalized:
case VertexFormat::Matrix3x3sNormalized:
case VertexFormat::Matrix3x3bNormalizedAligned:
case VertexFormat::Matrix3x3hAligned:
case VertexFormat::Matrix3x3sNormalizedAligned:
case VertexFormat::Matrix4x3:
case VertexFormat::Matrix4x3h:
case VertexFormat::Matrix4x3d:
case VertexFormat::Matrix4x3bNormalized:
case VertexFormat::Matrix4x3sNormalized:
case VertexFormat::Matrix4x3bNormalizedAligned:
case VertexFormat::Matrix4x3hAligned:
case VertexFormat::Matrix4x3sNormalizedAligned:
return 3; return 3;
case VertexFormat::Vector4: case VertexFormat::Vector4:
@ -167,6 +274,21 @@ UnsignedInt vertexFormatComponentCount(const VertexFormat format) {
case VertexFormat::Vector4sNormalized: case VertexFormat::Vector4sNormalized:
case VertexFormat::Vector4ui: case VertexFormat::Vector4ui:
case VertexFormat::Vector4i: case VertexFormat::Vector4i:
case VertexFormat::Matrix2x4:
case VertexFormat::Matrix2x4h:
case VertexFormat::Matrix2x4d:
case VertexFormat::Matrix2x4bNormalized:
case VertexFormat::Matrix2x4sNormalized:
case VertexFormat::Matrix3x4:
case VertexFormat::Matrix3x4h:
case VertexFormat::Matrix3x4d:
case VertexFormat::Matrix3x4bNormalized:
case VertexFormat::Matrix3x4sNormalized:
case VertexFormat::Matrix4x4:
case VertexFormat::Matrix4x4h:
case VertexFormat::Matrix4x4d:
case VertexFormat::Matrix4x4bNormalized:
case VertexFormat::Matrix4x4sNormalized:
return 4; return 4;
} }
@ -182,18 +304,48 @@ VertexFormat vertexFormatComponentFormat(const VertexFormat format) {
case VertexFormat::Vector2: case VertexFormat::Vector2:
case VertexFormat::Vector3: case VertexFormat::Vector3:
case VertexFormat::Vector4: case VertexFormat::Vector4:
case VertexFormat::Matrix2x2:
case VertexFormat::Matrix2x3:
case VertexFormat::Matrix2x4:
case VertexFormat::Matrix3x2:
case VertexFormat::Matrix3x3:
case VertexFormat::Matrix3x4:
case VertexFormat::Matrix4x2:
case VertexFormat::Matrix4x3:
case VertexFormat::Matrix4x4:
return VertexFormat::Float; return VertexFormat::Float;
case VertexFormat::Half: case VertexFormat::Half:
case VertexFormat::Vector2h: case VertexFormat::Vector2h:
case VertexFormat::Vector3h: case VertexFormat::Vector3h:
case VertexFormat::Vector4h: case VertexFormat::Vector4h:
case VertexFormat::Matrix2x2h:
case VertexFormat::Matrix2x3h:
case VertexFormat::Matrix2x4h:
case VertexFormat::Matrix2x3hAligned:
case VertexFormat::Matrix3x2h:
case VertexFormat::Matrix3x3h:
case VertexFormat::Matrix3x4h:
case VertexFormat::Matrix3x3hAligned:
case VertexFormat::Matrix4x2h:
case VertexFormat::Matrix4x3h:
case VertexFormat::Matrix4x4h:
case VertexFormat::Matrix4x3hAligned:
return VertexFormat::Half; return VertexFormat::Half;
case VertexFormat::Double: case VertexFormat::Double:
case VertexFormat::Vector2d: case VertexFormat::Vector2d:
case VertexFormat::Vector3d: case VertexFormat::Vector3d:
case VertexFormat::Vector4d: case VertexFormat::Vector4d:
case VertexFormat::Matrix2x2d:
case VertexFormat::Matrix2x3d:
case VertexFormat::Matrix2x4d:
case VertexFormat::Matrix3x2d:
case VertexFormat::Matrix3x3d:
case VertexFormat::Matrix3x4d:
case VertexFormat::Matrix4x2d:
case VertexFormat::Matrix4x3d:
case VertexFormat::Matrix4x4d:
return VertexFormat::Double; return VertexFormat::Double;
case VertexFormat::UnsignedByte: case VertexFormat::UnsignedByte:
@ -214,6 +366,21 @@ VertexFormat vertexFormatComponentFormat(const VertexFormat format) {
case VertexFormat::Vector3bNormalized: case VertexFormat::Vector3bNormalized:
case VertexFormat::Vector4b: case VertexFormat::Vector4b:
case VertexFormat::Vector4bNormalized: case VertexFormat::Vector4bNormalized:
case VertexFormat::Matrix2x2bNormalized:
case VertexFormat::Matrix2x3bNormalized:
case VertexFormat::Matrix2x4bNormalized:
case VertexFormat::Matrix2x2bNormalizedAligned:
case VertexFormat::Matrix2x3bNormalizedAligned:
case VertexFormat::Matrix3x2bNormalized:
case VertexFormat::Matrix3x3bNormalized:
case VertexFormat::Matrix3x4bNormalized:
case VertexFormat::Matrix3x2bNormalizedAligned:
case VertexFormat::Matrix3x3bNormalizedAligned:
case VertexFormat::Matrix4x2bNormalized:
case VertexFormat::Matrix4x3bNormalized:
case VertexFormat::Matrix4x4bNormalized:
case VertexFormat::Matrix4x2bNormalizedAligned:
case VertexFormat::Matrix4x3bNormalizedAligned:
return VertexFormat::Byte; return VertexFormat::Byte;
case VertexFormat::UnsignedShort: case VertexFormat::UnsignedShort:
@ -234,6 +401,18 @@ VertexFormat vertexFormatComponentFormat(const VertexFormat format) {
case VertexFormat::Vector3sNormalized: case VertexFormat::Vector3sNormalized:
case VertexFormat::Vector4s: case VertexFormat::Vector4s:
case VertexFormat::Vector4sNormalized: case VertexFormat::Vector4sNormalized:
case VertexFormat::Matrix2x2sNormalized:
case VertexFormat::Matrix2x3sNormalized:
case VertexFormat::Matrix2x4sNormalized:
case VertexFormat::Matrix2x3sNormalizedAligned:
case VertexFormat::Matrix3x2sNormalized:
case VertexFormat::Matrix3x3sNormalized:
case VertexFormat::Matrix3x4sNormalized:
case VertexFormat::Matrix3x3sNormalizedAligned:
case VertexFormat::Matrix4x2sNormalized:
case VertexFormat::Matrix4x3sNormalized:
case VertexFormat::Matrix4x4sNormalized:
case VertexFormat::Matrix4x3sNormalizedAligned:
return VertexFormat::Short; return VertexFormat::Short;
case VertexFormat::UnsignedInt: case VertexFormat::UnsignedInt:
@ -252,6 +431,261 @@ VertexFormat vertexFormatComponentFormat(const VertexFormat format) {
CORRADE_ASSERT(false, "vertexFormatComponentType(): invalid format" << format, {}); CORRADE_ASSERT(false, "vertexFormatComponentType(): invalid format" << format, {});
} }
UnsignedInt vertexFormatVectorCount(const VertexFormat format) {
CORRADE_ASSERT(!isVertexFormatImplementationSpecific(format),
"vertexFormatVectorCount(): can't determine vector count of an implementation-specific format" << reinterpret_cast<void*>(vertexFormatUnwrap(format)), {});
switch(format) {
case VertexFormat::Float:
case VertexFormat::Half:
case VertexFormat::Double:
case VertexFormat::UnsignedByte:
case VertexFormat::UnsignedByteNormalized:
case VertexFormat::Byte:
case VertexFormat::ByteNormalized:
case VertexFormat::UnsignedShort:
case VertexFormat::UnsignedShortNormalized:
case VertexFormat::Short:
case VertexFormat::ShortNormalized:
case VertexFormat::UnsignedInt:
case VertexFormat::Int:
case VertexFormat::Vector2:
case VertexFormat::Vector2h:
case VertexFormat::Vector2d:
case VertexFormat::Vector2ub:
case VertexFormat::Vector2ubNormalized:
case VertexFormat::Vector2b:
case VertexFormat::Vector2bNormalized:
case VertexFormat::Vector2us:
case VertexFormat::Vector2usNormalized:
case VertexFormat::Vector2s:
case VertexFormat::Vector2sNormalized:
case VertexFormat::Vector2ui:
case VertexFormat::Vector2i:
case VertexFormat::Vector3:
case VertexFormat::Vector3h:
case VertexFormat::Vector3d:
case VertexFormat::Vector3ub:
case VertexFormat::Vector3ubNormalized:
case VertexFormat::Vector3b:
case VertexFormat::Vector3bNormalized:
case VertexFormat::Vector3us:
case VertexFormat::Vector3usNormalized:
case VertexFormat::Vector3s:
case VertexFormat::Vector3sNormalized:
case VertexFormat::Vector3ui:
case VertexFormat::Vector3i:
case VertexFormat::Vector4:
case VertexFormat::Vector4h:
case VertexFormat::Vector4d:
case VertexFormat::Vector4ub:
case VertexFormat::Vector4ubNormalized:
case VertexFormat::Vector4b:
case VertexFormat::Vector4bNormalized:
case VertexFormat::Vector4us:
case VertexFormat::Vector4usNormalized:
case VertexFormat::Vector4s:
case VertexFormat::Vector4sNormalized:
case VertexFormat::Vector4ui:
case VertexFormat::Vector4i:
return 1;
case VertexFormat::Matrix2x2:
case VertexFormat::Matrix2x2h:
case VertexFormat::Matrix2x2d:
case VertexFormat::Matrix2x2bNormalized:
case VertexFormat::Matrix2x2sNormalized:
case VertexFormat::Matrix2x2bNormalizedAligned:
case VertexFormat::Matrix2x3:
case VertexFormat::Matrix2x3h:
case VertexFormat::Matrix2x3d:
case VertexFormat::Matrix2x3bNormalized:
case VertexFormat::Matrix2x3sNormalized:
case VertexFormat::Matrix2x3bNormalizedAligned:
case VertexFormat::Matrix2x3hAligned:
case VertexFormat::Matrix2x3sNormalizedAligned:
case VertexFormat::Matrix2x4:
case VertexFormat::Matrix2x4h:
case VertexFormat::Matrix2x4d:
case VertexFormat::Matrix2x4bNormalized:
case VertexFormat::Matrix2x4sNormalized:
return 2;
case VertexFormat::Matrix3x2:
case VertexFormat::Matrix3x2h:
case VertexFormat::Matrix3x2d:
case VertexFormat::Matrix3x2bNormalized:
case VertexFormat::Matrix3x2sNormalized:
case VertexFormat::Matrix3x2bNormalizedAligned:
case VertexFormat::Matrix3x3:
case VertexFormat::Matrix3x3h:
case VertexFormat::Matrix3x3d:
case VertexFormat::Matrix3x3bNormalized:
case VertexFormat::Matrix3x3sNormalized:
case VertexFormat::Matrix3x3bNormalizedAligned:
case VertexFormat::Matrix3x3hAligned:
case VertexFormat::Matrix3x3sNormalizedAligned:
case VertexFormat::Matrix3x4:
case VertexFormat::Matrix3x4h:
case VertexFormat::Matrix3x4d:
case VertexFormat::Matrix3x4bNormalized:
case VertexFormat::Matrix3x4sNormalized:
return 3;
case VertexFormat::Matrix4x2:
case VertexFormat::Matrix4x2h:
case VertexFormat::Matrix4x2d:
case VertexFormat::Matrix4x2bNormalized:
case VertexFormat::Matrix4x2sNormalized:
case VertexFormat::Matrix4x2bNormalizedAligned:
case VertexFormat::Matrix4x3:
case VertexFormat::Matrix4x3h:
case VertexFormat::Matrix4x3d:
case VertexFormat::Matrix4x3bNormalized:
case VertexFormat::Matrix4x3sNormalized:
case VertexFormat::Matrix4x3bNormalizedAligned:
case VertexFormat::Matrix4x3hAligned:
case VertexFormat::Matrix4x3sNormalizedAligned:
case VertexFormat::Matrix4x4:
case VertexFormat::Matrix4x4h:
case VertexFormat::Matrix4x4d:
case VertexFormat::Matrix4x4bNormalized:
case VertexFormat::Matrix4x4sNormalized:
return 4;
}
CORRADE_ASSERT(false, "vertexFormatVectorCount(): invalid format" << format, {});
}
UnsignedInt vertexFormatVectorStride(const VertexFormat format) {
CORRADE_ASSERT(!isVertexFormatImplementationSpecific(format),
"vertexFormatVectorStride(): can't determine vector count of an implementation-specific format" << reinterpret_cast<void*>(vertexFormatUnwrap(format)), {});
switch(format) {
case VertexFormat::UnsignedByte:
case VertexFormat::UnsignedByteNormalized:
case VertexFormat::Byte:
case VertexFormat::ByteNormalized:
return 1;
case VertexFormat::Half:
case VertexFormat::UnsignedShort:
case VertexFormat::UnsignedShortNormalized:
case VertexFormat::Short:
case VertexFormat::ShortNormalized:
case VertexFormat::Vector2ub:
case VertexFormat::Vector2ubNormalized:
case VertexFormat::Vector2b:
case VertexFormat::Vector2bNormalized:
case VertexFormat::Matrix2x2bNormalized:
case VertexFormat::Matrix3x2bNormalized:
case VertexFormat::Matrix4x2bNormalized:
return 2;
case VertexFormat::Vector3ub:
case VertexFormat::Vector3ubNormalized:
case VertexFormat::Vector3b:
case VertexFormat::Vector3bNormalized:
case VertexFormat::Matrix2x3bNormalized:
case VertexFormat::Matrix3x3bNormalized:
case VertexFormat::Matrix4x3bNormalized:
return 3;
case VertexFormat::Float:
case VertexFormat::UnsignedInt:
case VertexFormat::Int:
case VertexFormat::Vector2h:
case VertexFormat::Vector2us:
case VertexFormat::Vector2usNormalized:
case VertexFormat::Vector2s:
case VertexFormat::Vector2sNormalized:
case VertexFormat::Vector4ub:
case VertexFormat::Vector4ubNormalized:
case VertexFormat::Vector4b:
case VertexFormat::Vector4bNormalized:
case VertexFormat::Matrix2x2bNormalizedAligned:
case VertexFormat::Matrix3x2bNormalizedAligned:
case VertexFormat::Matrix4x2bNormalizedAligned:
case VertexFormat::Matrix2x3bNormalizedAligned:
case VertexFormat::Matrix3x3bNormalizedAligned:
case VertexFormat::Matrix4x3bNormalizedAligned:
case VertexFormat::Matrix2x4bNormalized:
case VertexFormat::Matrix3x4bNormalized:
case VertexFormat::Matrix4x4bNormalized:
case VertexFormat::Matrix2x2h:
case VertexFormat::Matrix3x2h:
case VertexFormat::Matrix4x2h:
case VertexFormat::Matrix2x2sNormalized:
case VertexFormat::Matrix3x2sNormalized:
case VertexFormat::Matrix4x2sNormalized:
return 4;
case VertexFormat::Vector3h:
case VertexFormat::Vector3us:
case VertexFormat::Vector3usNormalized:
case VertexFormat::Vector3s:
case VertexFormat::Vector3sNormalized:
case VertexFormat::Matrix2x3h:
case VertexFormat::Matrix3x3h:
case VertexFormat::Matrix4x3h:
case VertexFormat::Matrix2x3sNormalized:
case VertexFormat::Matrix3x3sNormalized:
case VertexFormat::Matrix4x3sNormalized:
return 6;
case VertexFormat::Double:
case VertexFormat::Vector2:
case VertexFormat::Vector2ui:
case VertexFormat::Vector2i:
case VertexFormat::Vector4h:
case VertexFormat::Vector4us:
case VertexFormat::Vector4usNormalized:
case VertexFormat::Vector4s:
case VertexFormat::Vector4sNormalized:
case VertexFormat::Matrix2x2:
case VertexFormat::Matrix3x2:
case VertexFormat::Matrix4x2:
case VertexFormat::Matrix2x4h:
case VertexFormat::Matrix3x4h:
case VertexFormat::Matrix4x4h:
case VertexFormat::Matrix2x4sNormalized:
case VertexFormat::Matrix3x4sNormalized:
case VertexFormat::Matrix4x4sNormalized:
case VertexFormat::Matrix2x3hAligned:
case VertexFormat::Matrix3x3hAligned:
case VertexFormat::Matrix4x3hAligned:
case VertexFormat::Matrix2x3sNormalizedAligned:
case VertexFormat::Matrix3x3sNormalizedAligned:
case VertexFormat::Matrix4x3sNormalizedAligned:
return 8;
case VertexFormat::Vector3:
case VertexFormat::Vector3ui:
case VertexFormat::Vector3i:
case VertexFormat::Matrix2x3:
case VertexFormat::Matrix3x3:
case VertexFormat::Matrix4x3:
return 12;
case VertexFormat::Vector2d:
case VertexFormat::Vector4:
case VertexFormat::Vector4ui:
case VertexFormat::Vector4i:
case VertexFormat::Matrix2x4:
case VertexFormat::Matrix3x4:
case VertexFormat::Matrix4x4:
case VertexFormat::Matrix2x2d:
case VertexFormat::Matrix3x2d:
case VertexFormat::Matrix4x2d:
return 16;
case VertexFormat::Vector3d:
case VertexFormat::Matrix2x3d:
case VertexFormat::Matrix3x3d:
case VertexFormat::Matrix4x3d:
return 24;
case VertexFormat::Vector4d:
case VertexFormat::Matrix2x4d:
case VertexFormat::Matrix3x4d:
case VertexFormat::Matrix4x4d:
return 32;
}
CORRADE_ASSERT(false, "vertexFormatVectorStride(): invalid format" << format, {});
}
bool isVertexFormatNormalized(const VertexFormat format) { bool isVertexFormatNormalized(const VertexFormat format) {
CORRADE_ASSERT(!isVertexFormatImplementationSpecific(format), CORRADE_ASSERT(!isVertexFormatImplementationSpecific(format),
"isVertexFormatNormalized(): can't determine normalization of an implementation-specific format" << reinterpret_cast<void*>(vertexFormatUnwrap(format)), {}); "isVertexFormatNormalized(): can't determine normalization of an implementation-specific format" << reinterpret_cast<void*>(vertexFormatUnwrap(format)), {});
@ -293,6 +727,36 @@ bool isVertexFormatNormalized(const VertexFormat format) {
case VertexFormat::Vector4s: case VertexFormat::Vector4s:
case VertexFormat::Vector4ui: case VertexFormat::Vector4ui:
case VertexFormat::Vector4i: case VertexFormat::Vector4i:
case VertexFormat::Matrix2x2:
case VertexFormat::Matrix2x2h:
case VertexFormat::Matrix2x2d:
case VertexFormat::Matrix2x3:
case VertexFormat::Matrix2x3h:
case VertexFormat::Matrix2x3d:
case VertexFormat::Matrix2x4:
case VertexFormat::Matrix2x4h:
case VertexFormat::Matrix2x4d:
case VertexFormat::Matrix2x3hAligned:
case VertexFormat::Matrix3x2:
case VertexFormat::Matrix3x2h:
case VertexFormat::Matrix3x2d:
case VertexFormat::Matrix3x3:
case VertexFormat::Matrix3x3h:
case VertexFormat::Matrix3x3d:
case VertexFormat::Matrix3x4:
case VertexFormat::Matrix3x4h:
case VertexFormat::Matrix3x4d:
case VertexFormat::Matrix3x3hAligned:
case VertexFormat::Matrix4x2:
case VertexFormat::Matrix4x2h:
case VertexFormat::Matrix4x2d:
case VertexFormat::Matrix4x3:
case VertexFormat::Matrix4x3h:
case VertexFormat::Matrix4x3d:
case VertexFormat::Matrix4x4:
case VertexFormat::Matrix4x4h:
case VertexFormat::Matrix4x4d:
case VertexFormat::Matrix4x3hAligned:
return false; return false;
case VertexFormat::UnsignedByteNormalized: case VertexFormat::UnsignedByteNormalized:
@ -311,6 +775,33 @@ bool isVertexFormatNormalized(const VertexFormat format) {
case VertexFormat::Vector4bNormalized: case VertexFormat::Vector4bNormalized:
case VertexFormat::Vector4usNormalized: case VertexFormat::Vector4usNormalized:
case VertexFormat::Vector4sNormalized: case VertexFormat::Vector4sNormalized:
case VertexFormat::Matrix2x2bNormalized:
case VertexFormat::Matrix2x2sNormalized:
case VertexFormat::Matrix2x3bNormalized:
case VertexFormat::Matrix2x3sNormalized:
case VertexFormat::Matrix2x4bNormalized:
case VertexFormat::Matrix2x4sNormalized:
case VertexFormat::Matrix2x2bNormalizedAligned:
case VertexFormat::Matrix2x3bNormalizedAligned:
case VertexFormat::Matrix2x3sNormalizedAligned:
case VertexFormat::Matrix3x2bNormalized:
case VertexFormat::Matrix3x2sNormalized:
case VertexFormat::Matrix3x3bNormalized:
case VertexFormat::Matrix3x3sNormalized:
case VertexFormat::Matrix3x4bNormalized:
case VertexFormat::Matrix3x4sNormalized:
case VertexFormat::Matrix3x2bNormalizedAligned:
case VertexFormat::Matrix3x3bNormalizedAligned:
case VertexFormat::Matrix3x3sNormalizedAligned:
case VertexFormat::Matrix4x2bNormalized:
case VertexFormat::Matrix4x2sNormalized:
case VertexFormat::Matrix4x3bNormalized:
case VertexFormat::Matrix4x3sNormalized:
case VertexFormat::Matrix4x4bNormalized:
case VertexFormat::Matrix4x4sNormalized:
case VertexFormat::Matrix4x2bNormalizedAligned:
case VertexFormat::Matrix4x3bNormalizedAligned:
case VertexFormat::Matrix4x3sNormalizedAligned:
return true; return true;
} }
@ -362,6 +853,57 @@ VertexFormat vertexFormat(const VertexFormat format, const UnsignedInt component
CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ CORRADE_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */
} }
VertexFormat vertexFormat(const VertexFormat format, const UnsignedInt vectorCount, UnsignedInt componentCount, const bool aligned) {
CORRADE_ASSERT(!isVertexFormatImplementationSpecific(format),
"vertexFormat(): can't assemble a format out of an implementation-specific format" << reinterpret_cast<void*>(vertexFormatUnwrap(format)), {});
CORRADE_ASSERT(vectorCount >= 2 && vectorCount <= 4,
"vertexFormat(): invalid vector count" << vectorCount, {});
CORRADE_ASSERT(componentCount >= 2 && componentCount <= 4,
"vertexFormat(): invalid component count" << componentCount, {});
const VertexFormat componentFormat = vertexFormatComponentFormat(format);
const UnsignedInt vectorDistance = (vectorCount - 2)*(
UnsignedInt(VertexFormat::Matrix3x2) -
UnsignedInt(VertexFormat::Matrix2x2));
const UnsignedInt componentDistance = (componentCount - 2)*(
UnsignedInt(VertexFormat::Matrix2x3) -
UnsignedInt(VertexFormat::Matrix2x2));
UnsignedInt out;
switch(componentFormat) {
case VertexFormat::Float:
out = UnsignedInt(VertexFormat::Matrix2x2) + componentDistance;
break;
case VertexFormat::Half:
if(aligned && componentCount == 3)
out = UnsignedInt(VertexFormat::Matrix2x3hAligned);
else
out = UnsignedInt(VertexFormat::Matrix2x2h) + componentDistance;
break;
case VertexFormat::Double:
out = UnsignedInt(VertexFormat::Matrix2x2d) + componentDistance;
break;
case VertexFormat::Byte:
if(aligned && componentCount == 2)
out = UnsignedInt(VertexFormat::Matrix2x2bNormalizedAligned);
else if(aligned && componentCount == 3)
out = UnsignedInt(VertexFormat::Matrix2x3bNormalizedAligned);
else
out = UnsignedInt(VertexFormat::Matrix2x2bNormalized) + componentDistance;
break;
case VertexFormat::Short:
if(aligned && componentCount == 3)
out = UnsignedInt(VertexFormat::Matrix2x3sNormalizedAligned);
else
out = UnsignedInt(VertexFormat::Matrix2x2sNormalized) + componentDistance;
break;
default: CORRADE_ASSERT(false,
"vertexFormat(): invalid matrix component type" << componentFormat << Debug::nospace << ", only floating-point or 8-/16-bit signed integer types are supported", {});
}
return VertexFormat(out + vectorDistance);
}
namespace { namespace {
constexpr const char* VertexFormatNames[] { constexpr const char* VertexFormatNames[] {

579
src/Magnum/VertexFormat.h

@ -26,7 +26,7 @@
*/ */
/** @file /** @file
* @brief Enum @ref Magnum::VertexFormat, function @ref Magnum::isVertexFormatImplementationSpecific(), @ref Magnum::vertexFormatWrap(), @ref Magnum::vertexFormatUnwrap(), @ref Magnum::vertexFormatSize(), @ref Magnum::vertexFormatComponentCount(), @ref Magnum::vertexFormatComponentFormat(), @ref Magnum::isVertexFormatNormalized() * @brief Enum @ref Magnum::VertexFormat, function @ref Magnum::isVertexFormatImplementationSpecific(), @ref Magnum::vertexFormatWrap(), @ref Magnum::vertexFormatUnwrap(), @ref Magnum::vertexFormatSize(), @ref Magnum::vertexFormatComponentFormat(), @ref Magnum::vertexFormatComponentCount(), @ref Magnum::vertexFormatVectorCount(), @ref Magnum::vertexFormatVectorStride(), @ref Magnum::isVertexFormatNormalized()
*/ */
#include <Corrade/Utility/Assert.h> #include <Corrade/Utility/Assert.h>
@ -776,7 +776,547 @@ enum class VertexFormat: UnsignedInt {
* or @m_class{m-doc-external} [MTLVertexFormatInt4](https://developer.apple.com/documentation/metal/mtlvertexformat/mtlvertexformatint4?language=objc). * or @m_class{m-doc-external} [MTLVertexFormatInt4](https://developer.apple.com/documentation/metal/mtlvertexformat/mtlvertexformatint4?language=objc).
* @m_keywords{DXGI_FORMAT_R32G32B32A32_SINT MTLVertexFormatInt4} * @m_keywords{DXGI_FORMAT_R32G32B32A32_SINT MTLVertexFormatInt4}
*/ */
Vector4i Vector4i,
/**
* @ref Matrix2x2.
*
* Same as two @ref VertexFormat::Vector2 tightly following each other and
* bound to consecutive locations.
*/
Matrix2x2,
/**
* @ref Matrix2x2h.
*
* Same as two @ref VertexFormat::Vector2h tightly following each other and
* bound to consecutive locations.
*/
Matrix2x2h,
/**
* @ref Matrix2x2d.
*
* Same as two @ref VertexFormat::Vector2d tightly following each other and
* bound to consecutive locations.
*/
Matrix2x2d,
/**
* @ref Matrix2x2b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as two @ref VertexFormat::Vector2bNormalized tightly following each
* other and bound to consecutive locations. Note that this type doesn't
* have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix2x2bNormalizedAligned instead.
*/
Matrix2x2bNormalized,
/**
* @ref Matrix2x2s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as two @ref VertexFormat::Vector2sNormalized tightly following each
* other and bound to consecutive locations.
*/
Matrix2x2sNormalized,
/**
* @ref Matrix2x3.
*
* Same as two @ref VertexFormat::Vector3 tightly following each other and
* bound to consecutive locations.
*/
Matrix2x3,
/**
* @ref Matrix2x3h.
*
* Same as two @ref VertexFormat::Vector3h tightly following each other and
* bound to consecutive locations. Note that this type doesn't have the
* columns four-byte aligned, which may negatively affect performance on
* some APIs --- prefer to use @ref VertexFormat::Matrix2x3hAligned
* instead.
*/
Matrix2x3h,
/**
* @ref Matrix2x3d.
*
* Same as two @ref VertexFormat::Vector3d tightly following each other and
* bound to consecutive locations.
*/
Matrix2x3d,
/**
* @ref Matrix2x3b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as two @ref VertexFormat::Vector3bNormalized tightly following each
* other and bound to consecutive locations. Note that this type doesn't
* have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix2x3bNormalizedAligned instead.
*/
Matrix2x3bNormalized,
/**
* @ref Matrix2x3s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as two @ref VertexFormat::Vector3sNormalized tightly following each
* other and bound to consecutive locations. Note that this type doesn't
* have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix2x3sNormalizedAligned instead.
*/
Matrix2x3sNormalized,
/**
* @ref Matrix2x4.
*
* Same as two @ref VertexFormat::Vector4 tightly following each other and
* bound to consecutive locations.
*/
Matrix2x4,
/**
* @ref Matrix2x4h.
*
* Same as two @ref VertexFormat::Vector4h tightly following each other and
* bound to consecutive locations.
*/
Matrix2x4h,
/**
* @ref Matrix2x4d.
*
* Same as two @ref VertexFormat::Vector4d tightly following each other and
* bound to consecutive locations.
*/
Matrix2x4d,
/**
* @ref Matrix2x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as two @ref VertexFormat::Vector4bNormalized tightly following each
* other and bound to consecutive locations.
*/
Matrix2x4bNormalized,
/**
* @ref Matrix2x4s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as two @ref VertexFormat::Vector4sNormalized tightly following each
* other and bound to consecutive locations.
*/
Matrix2x4sNormalized,
/**
* @ref Matrix2x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom two rows ignored. A variant of
* @ref VertexFormat::Matrix2x2bNormalized that has columns four-byte
* aligned.
*
* Same as two @ref VertexFormat::Vector2bNormalized following each other
* with a 2-byte gap in between, bound to consecutive locations.
*/
Matrix2x2bNormalizedAligned,
/**
* @ref Matrix2x4h, with bottom row ignored. A variant of
* @ref VertexFormat::Matrix2x3h that has columns four-byte aligned.
*
* Same as two @ref VertexFormat::Vector3s following each other with a
* 2-byte gap in between, bound to consecutive locations.
*/
Matrix2x3hAligned,
/**
* @ref Matrix2x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom row ignored. A variant of
* @ref VertexFormat::Matrix2x3bNormalized that has columns four-byte
* aligned.
*
* Same as two @ref VertexFormat::Vector3bNormalized following each other
* with a 1-byte gap in between, bound to consecutive locations.
*/
Matrix2x3bNormalizedAligned,
/**
* @ref Matrix2x4s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom row ignored. A variant of
* @ref VertexFormat::Matrix2x3sNormalized that has columns four-byte
* aligned.
*
* Same as two @ref VertexFormat::Vector3sNormalized following each other
* with a 2-byte gap in between, bound to consecutive locations.
*/
Matrix2x3sNormalizedAligned,
/**
* @ref Matrix3x2.
*
* Same as three @ref VertexFormat::Vector2 tightly following each other
* and bound to consecutive locations.
*/
Matrix3x2,
/**
* @ref Matrix3x2h.
*
* Same as three @ref VertexFormat::Vector2h tightly following each other
* and bound to consecutive locations.
*/
Matrix3x2h,
/**
* @ref Matrix3x2d.
*
* Same as three @ref VertexFormat::Vector2d tightly following each other
* and bound to consecutive locations.
*/
Matrix3x2d,
/**
* @ref Matrix3x2b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as three @ref VertexFormat::Vector2bNormalized tightly following
* each other and bound to consecutive locations. Note that this type
* doesn't have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix3x2bNormalizedAligned instead.
*/
Matrix3x2bNormalized,
/**
* @ref Matrix3x2s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as three @ref VertexFormat::Vector2sNormalized tightly following
* each other and bound to consecutive locations.
*/
Matrix3x2sNormalized,
/**
* @ref Matrix3x3 or @ref Matrix3.
*
* Same as three @ref VertexFormat::Vector3 tightly following each other
* and bound to consecutive locations.
*/
Matrix3x3,
/**
* @ref Matrix3x3h.
*
* Same as three @ref VertexFormat::Vector3h tightly following each other
* and bound to consecutive locations. Note that this type doesn't have the
* columns four-byte aligned, which may negatively affect performance on
* some APIs --- prefer to use @ref VertexFormat::Matrix3x3hAligned
* instead.
*/
Matrix3x3h,
/**
* @ref Matrix3x3d or @ref Matrix3d.
*
* Same as three @ref VertexFormat::Vector3d tightly following each other
* and bound to consecutive locations.
*/
Matrix3x3d,
/**
* @ref Matrix3x3b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as three @ref VertexFormat::Vector3bNormalized tightly following
* each other and bound to consecutive locations. Note that this type
* doesn't have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix3x3bNormalizedAligned instead.
*/
Matrix3x3bNormalized,
/**
* @ref Matrix3x3s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as three @ref VertexFormat::Vector3sNormalized tightly following
* each other and bound to consecutive locations. Note that this type
* doesn't have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix3x3sNormalizedAligned instead.
*/
Matrix3x3sNormalized,
/**
* @ref Matrix3x4.
*
* Same as three @ref VertexFormat::Vector4 tightly following each other
* and bound to consecutive locations.
*/
Matrix3x4,
/**
* @ref Matrix3x4h.
*
* Same as three @ref VertexFormat::Vector4h tightly following each other
* and bound to consecutive locations.
*/
Matrix3x4h,
/**
* @ref Matrix3x4d.
*
* Same as three @ref VertexFormat::Vector4d tightly following each other
* and bound to consecutive locations.
*/
Matrix3x4d,
/**
* @ref Matrix3x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as three @ref VertexFormat::Vector4bNormalized tightly following
* each other and bound to consecutive locations.
*/
Matrix3x4bNormalized,
/**
* @ref Matrix3x4s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as three @ref VertexFormat::Vector4sNormalized tightly following
* each other and bound to consecutive locations.
*/
Matrix3x4sNormalized,
/**
* @ref Matrix3x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom two rows ignored. A variant of
* @ref VertexFormat::Matrix3x2bNormalized that has columns four-byte
* aligned.
*
* Same as three @ref VertexFormat::Vector2bNormalized following each other
* with a 2-byte gap in between, bound to consecutive locations.
*/
Matrix3x2bNormalizedAligned,
/**
* @ref Matrix3x4h, with bottom row ignored. A variant of
* @ref VertexFormat::Matrix3x3h that has columns four-byte aligned.
*
* Same as three @ref VertexFormat::Vector3s following each other with a
* 2-byte gap in between, bound to consecutive locations.
*/
Matrix3x3hAligned,
/**
* @ref Matrix3x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom row ignored. A variant of
* @ref VertexFormat::Matrix3x3bNormalized that has columns four-byte
* aligned.
*
* Same as three @ref VertexFormat::Vector3bNormalized following each other
* with a 1-byte gap in between, bound to consecutive locations.
*/
Matrix3x3bNormalizedAligned,
/**
* @ref Matrix3x4s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom row ignored. A variant of
* @ref VertexFormat::Matrix3x3sNormalized that has columns four-byte
* aligned.
*
* Same as three @ref VertexFormat::Vector3sNormalized following each other
* with a 2-byte gap in between, bound to consecutive locations.
*/
Matrix3x3sNormalizedAligned,
/**
* @ref Matrix4x2.
*
* Same as four @ref VertexFormat::Vector2 tightly following each other and
* bound to consecutive locations.
*/
Matrix4x2,
/**
* @ref Matrix4x2h.
*
* Same as four @ref VertexFormat::Vector2h tightly following each other
* and bound to consecutive locations.
*/
Matrix4x2h,
/**
* @ref Matrix4x2d.
*
* Same as four @ref VertexFormat::Vector2d tightly following each other
* and bound to consecutive locations.
*/
Matrix4x2d,
/**
* @ref Matrix4x2b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as four @ref VertexFormat::Vector2bNormalized tightly following
* each other and bound to consecutive locations. Note that this type
* doesn't have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix4x2bNormalizedAligned instead.
*/
Matrix4x2bNormalized,
/**
* @ref Matrix4x2s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as four @ref VertexFormat::Vector2sNormalized tightly following
* each other and bound to consecutive locations.
*/
Matrix4x2sNormalized,
/**
* @ref Matrix4x3.
*
* Same as four @ref VertexFormat::Vector3 tightly following each other and
* bound to consecutive locations.
*/
Matrix4x3,
/**
* @ref Matrix4x3h.
*
* Same as four @ref VertexFormat::Vector3h tightly following each other
* and bound to consecutive locations. Note that this type doesn't have the
* columns four-byte aligned, which may negatively affect performance on
* some APIs --- prefer to use @ref VertexFormat::Matrix4x3hAligned
* instead.
*/
Matrix4x3h,
/**
* @ref Matrix4x3d.
*
* Same as four @ref VertexFormat::Vector3d tightly following each other
* and bound to consecutive locations.
*/
Matrix4x3d,
/**
* @ref Matrix4x3b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as four @ref VertexFormat::Vector3bNormalized tightly following
* each other and bound to consecutive locations. Note that this type
* doesn't have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix4x3bNormalizedAligned instead.
*/
Matrix4x3bNormalized,
/**
* @ref Matrix4x3s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as four @ref VertexFormat::Vector3sNormalized tightly following
* each other and bound to consecutive locations. Note that this type
* doesn't have the columns four-byte aligned, which may negatively affect
* performance --- prefer to use
* @ref VertexFormat::Matrix4x3sNormalizedAligned instead.
*/
Matrix4x3sNormalized,
/**
* @ref Matrix4x4 or @ref Matrix4.
*
* Same as four @ref VertexFormat::Vector4 tightly following each other
* and bound to consecutive locations.
*/
Matrix4x4,
/**
* @ref Matrix4x4h.
*
* Same as four @ref VertexFormat::Vector4h tightly following each other
* and bound to consecutive locations.
*/
Matrix4x4h,
/**
* @ref Matrix4x4d.
*
* Same as four @ref VertexFormat::Vector4d tightly following each other
* and bound to consecutive locations.
*/
Matrix4x4d,
/**
* @ref Matrix4x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as four @ref VertexFormat::Vector4bNormalized tightly following
* each other and bound to consecutive locations.
*/
Matrix4x4bNormalized,
/**
* @ref Matrix4x4s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$.
*
* Same as four @ref VertexFormat::Vector4sNormalized tightly following
* each other and bound to consecutive locations.
*/
Matrix4x4sNormalized,
/**
* @ref Matrix4x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom two rows ignored. A variant of
* @ref VertexFormat::Matrix4x2bNormalized that has columns four-byte
* aligned.
*
* Same as four @ref VertexFormat::Vector2bNormalized following each other
* with a 2-byte gap in between, bound to consecutive locations.
*/
Matrix4x2bNormalizedAligned,
/**
* @ref Matrix4x4h, with bottom row ignored. A variant of
* @ref VertexFormat::Matrix3x3h that has columns four-byte aligned.
*
* Same as four @ref VertexFormat::Vector3s following each other with a
* 2-byte gap in between, bound to consecutive locations.
*/
Matrix4x3hAligned,
/**
* @ref Matrix4x4b, with range @f$ [-127, 127] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom row ignored. A variant of
* @ref VertexFormat::Matrix4x3bNormalized that has columns four-byte
* aligned.
*
* Same as four @ref VertexFormat::Vector3bNormalized following each other
* with a 1-byte gap in between, bound to consecutive locations.
*/
Matrix4x3bNormalizedAligned,
/**
* @ref Matrix4x4s, with range @f$ [-32767, 32767] @f$ interpreted as
* @f$ [-1.0, 1.0] @f$ and bottom row ignored. A variant of
* @ref VertexFormat::Matrix4x3sNormalized that has columns four-byte
* aligned.
*
* Same as four @ref VertexFormat::Vector3sNormalized following each other
* with a 2-byte gap in between, bound to consecutive locations.
*/
Matrix4x3sNormalizedAligned
}; };
/** /**
@ -863,6 +1403,25 @@ Returns @cpp 1 @ce for scalar types and e.g. @cpp 3 @ce for
*/ */
MAGNUM_EXPORT UnsignedInt vertexFormatComponentCount(VertexFormat format); MAGNUM_EXPORT UnsignedInt vertexFormatComponentCount(VertexFormat format);
/**
@brief Vector count of given vertex format
@m_since_latest
Returns @cpp 1 @ce for scalar and vector types and e.g. @cpp 3 @ce for
@ref VertexFormat::Matrix3x2d.
*/
MAGNUM_EXPORT UnsignedInt vertexFormatVectorCount(VertexFormat format);
/**
@brief Vector stride of given vertex format
@m_since_latest
Returns type size for scalar and vector types and e.g. @cpp 8 @ce for
@ref VertexFormat::Matrix2x3hAligned (but @cpp 6 @ce for
@ref VertexFormat::Matrix2x3h).
*/
MAGNUM_EXPORT UnsignedInt vertexFormatVectorStride(VertexFormat format);
/** /**
@brief Component count of given vertex format @brief Component count of given vertex format
@m_since_latest @m_since_latest
@ -888,6 +1447,22 @@ normalization. Expects that @p componentCount is not larger than @cpp 4 @ce and
*/ */
MAGNUM_EXPORT VertexFormat vertexFormat(VertexFormat format, UnsignedInt componentCount, bool normalized); MAGNUM_EXPORT VertexFormat vertexFormat(VertexFormat format, UnsignedInt componentCount, bool normalized);
/**
@brief Assemble a matrix vertex format from parts
@m_since_latest
Converts @p format to a new format of desired component and vertex count and
normalization. Expects that both @p vectorCount and @p componentCount is either
@cpp 2 @ce, @cpp 3 @ce or @cpp 4 @ce, and @p format is floating-point or
8-/16-bit signed integer.
@see @ref vertexFormatComponentFormat(),
@ref vertexFormatComponentCount(),
@ref vertexFormatVectorCount(),
@ref vertexFormatVectorStride(),
@ref isVertexFormatNormalized()
*/
MAGNUM_EXPORT VertexFormat vertexFormat(VertexFormat format, UnsignedInt vectorCount, UnsignedInt componentCount, bool aligned);
} }
namespace Corrade { namespace Utility { namespace Corrade { namespace Utility {

5
src/Magnum/Vk/Enums.h

@ -95,7 +95,10 @@ Some Vulkan targets don't support all generic vertex formats. Returns
@cpp false @ce if current target can't support such format, @cpp true @ce @cpp false @ce if current target can't support such format, @cpp true @ce
otherwise. Moreover, returns @cpp true @ce also for all formats that are otherwise. Moreover, returns @cpp true @ce also for all formats that are
@ref isVertexFormatImplementationSpecific(). The @p format value is expected @ref isVertexFormatImplementationSpecific(). The @p format value is expected
to be valid. to be valid. Note that for matrix formats the function only returns a
corresponding vector type, and the user is expected to bind the remaining
vectors to consecutive attribute locations based on what
@ref vertexFormatVectorCount() and @ref vertexFormatVectorStride() return.
@note Support of some formats depends on presence of a particular Vulkan @note Support of some formats depends on presence of a particular Vulkan
extension. Such check is outside of the scope of this function and you are extension. Such check is outside of the scope of this function and you are

57
src/Magnum/Vk/Implementation/vertexFormatMapping.hpp

@ -77,4 +77,61 @@ _c(Vector4s, R16G16B16A16_SINT)
_c(Vector4sNormalized, R16G16B16A16_SNORM) _c(Vector4sNormalized, R16G16B16A16_SNORM)
_c(Vector4ui, R32G32B32A32_UINT) _c(Vector4ui, R32G32B32A32_UINT)
_c(Vector4i, R32G32B32A32_SINT) _c(Vector4i, R32G32B32A32_SINT)
_c(Matrix2x2, R32G32_SFLOAT)
_c(Matrix2x2h, R16G16_SFLOAT)
_c(Matrix2x2d, R64G64_SFLOAT)
_c(Matrix2x2bNormalized, R8G8_SNORM)
_c(Matrix2x2sNormalized, R16G16_SNORM)
_c(Matrix2x3, R32G32B32_SFLOAT)
_c(Matrix2x3h, R16G16B16_SFLOAT)
_c(Matrix2x3d, R64G64B64_SFLOAT)
_c(Matrix2x3bNormalized, R8G8B8_SNORM)
_c(Matrix2x3sNormalized, R16G16B16_SNORM)
_c(Matrix2x4, R32G32B32A32_SFLOAT)
_c(Matrix2x4h, R16G16B16A16_SFLOAT)
_c(Matrix2x4d, R64G64B64A64_SFLOAT)
_c(Matrix2x4bNormalized, R8G8B8A8_SNORM)
_c(Matrix2x4sNormalized, R16G16B16A16_SNORM)
_c(Matrix2x2bNormalizedAligned, R8G8_SNORM)
_c(Matrix2x3hAligned, R16G16B16_SFLOAT)
_c(Matrix2x3bNormalizedAligned, R8G8B8_SNORM)
_c(Matrix2x3sNormalizedAligned, R16G16B16_SNORM)
_c(Matrix3x2, R32G32_SFLOAT)
_c(Matrix3x2h, R16G16_SFLOAT)
_c(Matrix3x2d, R64G64_SFLOAT)
_c(Matrix3x2bNormalized, R8G8_SNORM)
_c(Matrix3x2sNormalized, R16G16_SNORM)
_c(Matrix3x3, R32G32B32_SFLOAT)
_c(Matrix3x3h, R16G16B16_SFLOAT)
_c(Matrix3x3d, R64G64B64_SFLOAT)
_c(Matrix3x3bNormalized, R8G8B8_SNORM)
_c(Matrix3x3sNormalized, R16G16B16_SNORM)
_c(Matrix3x4, R32G32B32A32_SFLOAT)
_c(Matrix3x4h, R16G16B16A16_SFLOAT)
_c(Matrix3x4d, R64G64B64A64_SFLOAT)
_c(Matrix3x4bNormalized, R8G8B8A8_SNORM)
_c(Matrix3x4sNormalized, R16G16B16A16_SNORM)
_c(Matrix3x2bNormalizedAligned, R8G8_SNORM)
_c(Matrix3x3hAligned, R16G16B16_SFLOAT)
_c(Matrix3x3bNormalizedAligned, R8G8B8_SNORM)
_c(Matrix3x3sNormalizedAligned, R16G16B16_SNORM)
_c(Matrix4x2, R32G32_SFLOAT)
_c(Matrix4x2h, R16G16_SFLOAT)
_c(Matrix4x2d, R64G64_SFLOAT)
_c(Matrix4x2bNormalized, R8G8_SNORM)
_c(Matrix4x2sNormalized, R16G16_SNORM)
_c(Matrix4x3, R32G32B32_SFLOAT)
_c(Matrix4x3h, R16G16B16_SFLOAT)
_c(Matrix4x3d, R64G64B64_SFLOAT)
_c(Matrix4x3bNormalized, R8G8B8_SNORM)
_c(Matrix4x3sNormalized, R16G16B16_SNORM)
_c(Matrix4x4, R32G32B32A32_SFLOAT)
_c(Matrix4x4h, R16G16B16A16_SFLOAT)
_c(Matrix4x4d, R64G64B64A64_SFLOAT)
_c(Matrix4x4bNormalized, R8G8B8A8_SNORM)
_c(Matrix4x4sNormalized, R16G16B16A16_SNORM)
_c(Matrix4x2bNormalizedAligned, R8G8_SNORM)
_c(Matrix4x3hAligned, R16G16B16_SFLOAT)
_c(Matrix4x3bNormalizedAligned, R8G8B8_SNORM)
_c(Matrix4x3sNormalizedAligned, R16G16B16_SNORM)
#endif #endif

1
src/Magnum/Vk/Test/EnumsTest.cpp

@ -251,6 +251,7 @@ void EnumsTest::mapVkFormatVertexFormat() {
/* Touchstone verification */ /* Touchstone verification */
CORRADE_VERIFY(hasVkFormat(Magnum::VertexFormat::Vector3us)); CORRADE_VERIFY(hasVkFormat(Magnum::VertexFormat::Vector3us));
CORRADE_COMPARE(vkFormat(Magnum::VertexFormat::Vector3us), VK_FORMAT_R16G16B16_UINT); CORRADE_COMPARE(vkFormat(Magnum::VertexFormat::Vector3us), VK_FORMAT_R16G16B16_UINT);
CORRADE_COMPARE(vkFormat(Magnum::VertexFormat::Matrix2x3bNormalizedAligned), VK_FORMAT_R8G8B8_SNORM);
/* This goes through the first 16 bits, which should be enough. Going /* This goes through the first 16 bits, which should be enough. Going
through 32 bits takes 8 seconds, too much. */ through 32 bits takes 8 seconds, too much. */

Loading…
Cancel
Save