Browse Source

Shaders: add a direct LineMaterialUniform setter for miter limit.

This one could eventually become constexpr, the other two helpers cannot.
pull/651/merge
Vladimír Vondruš 1 year ago
parent
commit
cbdbfb32b4
  1. 13
      src/Magnum/Shaders/Line.h
  2. 46
      src/Magnum/Shaders/Test/LineTest.cpp

13
src/Magnum/Shaders/Line.h

@ -379,6 +379,19 @@ struct MAGNUM_SHADERS_EXPORT LineMaterialUniform {
return *this; return *this;
} }
/**
* @brief Set the @ref miterLimit field
* @return Reference to self (for method chaining)
*
* For convenience it's recommended to use the @ref setMiterLengthLimit()
* and @ref setMiterAngleLimit() helpers instead of setting this value
* directly.
*/
LineMaterialUniform& setMiterLimit(Float limit) {
miterLimit = limit;
return *this;
}
/** /**
* @brief Set the @ref miterLimit field to a length value * @brief Set the @ref miterLimit field to a length value
* @return Reference to self (for method chaining) * @return Reference to self (for method chaining)

46
src/Magnum/Shaders/Test/LineTest.cpp

@ -49,8 +49,9 @@ struct LineTest: TestSuite::Tester {
void materialUniformConstructNoInit(); void materialUniformConstructNoInit();
void materialUniformSetters(); void materialUniformSetters();
void materialUniformSetMiterLengthLimitInvalid(); void materialUniformMiterLimit();
void materialUniformSetMiterAngleLimitInvalid(); void materialUniformMiterLengthLimitInvalid();
void materialUniformMiterAngleLimitInvalid();
void debugCapStyle(); void debugCapStyle();
void debugJoinStyle(); void debugJoinStyle();
@ -66,7 +67,7 @@ const struct {
const char* name; const char* name;
Float limit; Float limit;
const char* message; const char* message;
} MaterialUniformSetMiterLengthLimitInvalidData[]{ } MaterialUniformMiterLengthLimitInvalidData[]{
{"too short", 0.9997f, {"too short", 0.9997f,
"expected a finite value greater than or equal to 1, got 0.9997"}, "expected a finite value greater than or equal to 1, got 0.9997"},
{"too long", Constants::inf(), {"too long", Constants::inf(),
@ -77,7 +78,7 @@ const struct {
const char* name; const char* name;
Rad limit; Rad limit;
const char* message; const char* message;
} MaterialUniformSetMiterAngleLimitInvalidData[]{ } MaterialUniformMiterAngleLimitInvalidData[]{
{"too small", 0.0_degf, {"too small", 0.0_degf,
"expected a value greater than 0° and less than or equal to 180°, got 0°"}, "expected a value greater than 0° and less than or equal to 180°, got 0°"},
{"too large", 180.1_degf, {"too large", 180.1_degf,
@ -95,13 +96,15 @@ LineTest::LineTest() {
&LineTest::materialUniformConstructDefault, &LineTest::materialUniformConstructDefault,
&LineTest::materialUniformConstructNoInit, &LineTest::materialUniformConstructNoInit,
&LineTest::materialUniformSetters}); &LineTest::materialUniformSetters,
addInstancedTests({&LineTest::materialUniformSetMiterLengthLimitInvalid}, &LineTest::materialUniformMiterLimit});
Containers::arraySize(MaterialUniformSetMiterLengthLimitInvalidData));
addInstancedTests({&LineTest::materialUniformSetMiterAngleLimitInvalid}, addInstancedTests({&LineTest::materialUniformMiterLengthLimitInvalid},
Containers::arraySize(MaterialUniformSetMiterAngleLimitInvalidData)); Containers::arraySize(MaterialUniformMiterLengthLimitInvalidData));
addInstancedTests({&LineTest::materialUniformMiterAngleLimitInvalid},
Containers::arraySize(MaterialUniformMiterAngleLimitInvalidData));
addTests({&LineTest::debugCapStyle, addTests({&LineTest::debugCapStyle,
&LineTest::debugJoinStyle, &LineTest::debugJoinStyle,
@ -259,19 +262,34 @@ void LineTest::materialUniformSetters() {
.setColor(0x354565fc_rgbaf) .setColor(0x354565fc_rgbaf)
.setWidth(2.5f) .setWidth(2.5f)
.setSmoothness(7.0f) .setSmoothness(7.0f)
.setMiterLengthLimit(25.0f); .setMiterLimit(3.4567f);
CORRADE_COMPARE(a.backgroundColor, 0x01020304_rgbaf); CORRADE_COMPARE(a.backgroundColor, 0x01020304_rgbaf);
CORRADE_COMPARE(a.color, 0x354565fc_rgbaf); CORRADE_COMPARE(a.color, 0x354565fc_rgbaf);
CORRADE_COMPARE(a.width, 2.5f); CORRADE_COMPARE(a.width, 2.5f);
CORRADE_COMPARE(a.smoothness, 7.0f); CORRADE_COMPARE(a.smoothness, 7.0f);
CORRADE_COMPARE(a.miterLimit, 3.4567f);
}
void LineTest::materialUniformMiterLimit() {
LineMaterialUniform a;
/* Verifying documented relation of the default to angle/length */
CORRADE_COMPARE(a.miterLimit, 0.875f);
a.setMiterLengthLimit(4.0f);
CORRADE_COMPARE(a.miterLimit, 0.875f);
a.setMiterAngleLimit(28.955_degf);
CORRADE_COMPARE(a.miterLimit, 0.875f);
a.setMiterLengthLimit(25.0f);
CORRADE_COMPARE(a.miterLimit, 0.9968f); CORRADE_COMPARE(a.miterLimit, 0.9968f);
a.setMiterAngleLimit(35.0_degf); a.setMiterAngleLimit(35.0_degf);
CORRADE_COMPARE(a.miterLimit, 0.819152f); CORRADE_COMPARE(a.miterLimit, 0.819152f);
} }
void LineTest::materialUniformSetMiterLengthLimitInvalid() { void LineTest::materialUniformMiterLengthLimitInvalid() {
auto&& data = MaterialUniformSetMiterLengthLimitInvalidData[testCaseInstanceId()]; auto&& data = MaterialUniformMiterLengthLimitInvalidData[testCaseInstanceId()];
setTestCaseDescription(data.name); setTestCaseDescription(data.name);
CORRADE_SKIP_IF_NO_ASSERT(); CORRADE_SKIP_IF_NO_ASSERT();
@ -284,8 +302,8 @@ void LineTest::materialUniformSetMiterLengthLimitInvalid() {
CORRADE_COMPARE(out, Utility::format("Shaders::LineMaterialUniform::setMiterLengthLimit(): {}\n", data.message)); CORRADE_COMPARE(out, Utility::format("Shaders::LineMaterialUniform::setMiterLengthLimit(): {}\n", data.message));
} }
void LineTest::materialUniformSetMiterAngleLimitInvalid() { void LineTest::materialUniformMiterAngleLimitInvalid() {
auto&& data = MaterialUniformSetMiterAngleLimitInvalidData[testCaseInstanceId()]; auto&& data = MaterialUniformMiterAngleLimitInvalidData[testCaseInstanceId()];
setTestCaseDescription(data.name); setTestCaseDescription(data.name);
CORRADE_SKIP_IF_NO_ASSERT(); CORRADE_SKIP_IF_NO_ASSERT();

Loading…
Cancel
Save