Browse Source

Trade: recognize also NoneRoughnessMetallicTexture in hasORMTexture().

An obvious omission from the time these helpers have been written. Sorry
about that.
pull/651/merge
Vladimír Vondruš 1 year ago
parent
commit
820382767c
  1. 3
      doc/changelog.dox
  2. 18
      src/Magnum/Trade/PbrMetallicRoughnessMaterialData.cpp
  3. 16
      src/Magnum/Trade/PbrMetallicRoughnessMaterialData.h
  4. 107
      src/Magnum/Trade/Test/PbrMetallicRoughnessMaterialDataTest.cpp

3
doc/changelog.dox

@ -485,7 +485,8 @@ See also:
@ref Trade::PbrMetallicRoughnessMaterialData, @ref Trade::PbrMetallicRoughnessMaterialData,
@ref Trade::PbrSpecularGlossinessMaterialData and @ref Trade::PbrSpecularGlossinessMaterialData and
@ref Trade::PbrClearCoatMaterialData convenience accessor APIs similar to @ref Trade::PbrClearCoatMaterialData convenience accessor APIs similar to
@ref Trade::PhongMaterialData. See [mosra/magnum#459](https://github.com/mosra/magnum/pull/459). @ref Trade::PhongMaterialData. See also [mosra/magnum#459](https://github.com/mosra/magnum/pull/459)
and [mosra/magnum#662](https://github.com/mosra/magnum/issues/662).
- Added @ref Trade::PhongMaterialData::hasSpecularTexture(), - Added @ref Trade::PhongMaterialData::hasSpecularTexture(),
@ref Trade::PhongMaterialData::specularTextureSwizzle(), @ref Trade::PhongMaterialData::specularTextureSwizzle(),
@ref Trade::PhongMaterialData::normalTextureScale() and @ref Trade::PhongMaterialData::normalTextureScale() and

18
src/Magnum/Trade/PbrMetallicRoughnessMaterialData.cpp

@ -56,15 +56,21 @@ bool PbrMetallicRoughnessMaterialData::hasNoneRoughnessMetallicTexture() const {
} }
bool PbrMetallicRoughnessMaterialData::hasOcclusionRoughnessMetallicTexture() const { bool PbrMetallicRoughnessMaterialData::hasOcclusionRoughnessMetallicTexture() const {
if(!hasAttribute(MaterialAttribute::OcclusionTexture) || if(!hasAttribute(MaterialAttribute::OcclusionTexture))
!hasAttribute(MaterialAttribute::RoughnessTexture) ||
!hasAttribute(MaterialAttribute::MetalnessTexture))
return false; return false;
const UnsignedInt occlusionTexture = attribute<UnsignedInt>(MaterialAttribute::OcclusionTexture); const UnsignedInt occlusionTexture = attribute<UnsignedInt>(MaterialAttribute::OcclusionTexture);
if(attribute<UnsignedInt>(MaterialAttribute::RoughnessTexture) != occlusionTexture || if(hasAttribute(MaterialAttribute::NoneRoughnessMetallicTexture)) {
attribute<UnsignedInt>(MaterialAttribute::MetalnessTexture) != occlusionTexture || if(attribute<UnsignedInt>(MaterialAttribute::NoneRoughnessMetallicTexture) != occlusionTexture)
occlusionTextureSwizzle() != MaterialTextureSwizzle::R || return false;
} else if(hasAttribute(MaterialAttribute::MetalnessTexture) &&
hasAttribute(MaterialAttribute::RoughnessTexture)) {
if(attribute<UnsignedInt>(MaterialAttribute::RoughnessTexture) != occlusionTexture ||
attribute<UnsignedInt>(MaterialAttribute::MetalnessTexture) != occlusionTexture)
return false;
} else return false;
if(occlusionTextureSwizzle() != MaterialTextureSwizzle::R ||
roughnessTextureSwizzle() != MaterialTextureSwizzle::G || roughnessTextureSwizzle() != MaterialTextureSwizzle::G ||
metalnessTextureSwizzle() != MaterialTextureSwizzle::B) metalnessTextureSwizzle() != MaterialTextureSwizzle::B)
return false; return false;

16
src/Magnum/Trade/PbrMetallicRoughnessMaterialData.h

@ -124,13 +124,15 @@ class MAGNUM_TRADE_EXPORT PbrMetallicRoughnessMaterialData: public MaterialData
/** /**
* @brief Whether the material has a combined occlusion/roughness/metallic texture * @brief Whether the material has a combined occlusion/roughness/metallic texture
* *
* Returns @cpp true @ce if @ref MaterialAttribute::OcclusionTexture, * Returns @cpp true @ce if @ref MaterialAttribute::OcclusionTexture
* @ref MaterialAttribute::RoughnessTexture and * and either the @ref MaterialAttribute::NoneRoughnessMetallicTexture
* @ref MaterialAttribute::MetalnessTexture are all present, point to * attribute is present or both @ref MaterialAttribute::RoughnessTexture
* the same texture ID, @ref MaterialAttribute::OcclusionTextureSwizzle * and @ref MaterialAttribute::MetalnessTexture are present and they
* is set to @ref MaterialTextureSwizzle::R (or omitted, in which case * point to the same texture ID,
* it's the default), @ref MaterialAttribute::RoughnessTextureSwizzle * @ref MaterialAttribute::OcclusionTextureSwizzle is set to
* is set to @ref MaterialTextureSwizzle::G and * @ref MaterialTextureSwizzle::R (or omitted, in which case it's the
* default), @ref MaterialAttribute::RoughnessTextureSwizzle is set to
* @ref MaterialTextureSwizzle::G and
* @ref MaterialAttribute::MetalnessTextureSwizzle is set to * @ref MaterialAttribute::MetalnessTextureSwizzle is set to
* @ref MaterialTextureSwizzle::B, and additionally * @ref MaterialTextureSwizzle::B, and additionally
* @ref MaterialAttribute::OcclusionTextureMatrix, * @ref MaterialAttribute::OcclusionTextureMatrix,

107
src/Magnum/Trade/Test/PbrMetallicRoughnessMaterialDataTest.cpp

@ -40,6 +40,7 @@ struct PbrMetallicRoughnessMaterialDataTest: TestSuite::Tester {
void defaults(); void defaults();
void textured(); void textured();
void texturedDefaults(); void texturedDefaults();
void texturedImplicitPackedNoneRoughnessMetallic();
void texturedExplicitPackedNoneRoughnessMetallic(); void texturedExplicitPackedNoneRoughnessMetallic();
void texturedImplicitPackedOcclusionRoughnessMetallic(); void texturedImplicitPackedOcclusionRoughnessMetallic();
void texturedExplicitPackedOcclusionRoughnessMetallic(); void texturedExplicitPackedOcclusionRoughnessMetallic();
@ -68,6 +69,7 @@ PbrMetallicRoughnessMaterialDataTest::PbrMetallicRoughnessMaterialDataTest() {
&PbrMetallicRoughnessMaterialDataTest::defaults, &PbrMetallicRoughnessMaterialDataTest::defaults,
&PbrMetallicRoughnessMaterialDataTest::textured, &PbrMetallicRoughnessMaterialDataTest::textured,
&PbrMetallicRoughnessMaterialDataTest::texturedDefaults, &PbrMetallicRoughnessMaterialDataTest::texturedDefaults,
&PbrMetallicRoughnessMaterialDataTest::texturedImplicitPackedNoneRoughnessMetallic,
&PbrMetallicRoughnessMaterialDataTest::texturedExplicitPackedNoneRoughnessMetallic, &PbrMetallicRoughnessMaterialDataTest::texturedExplicitPackedNoneRoughnessMetallic,
&PbrMetallicRoughnessMaterialDataTest::texturedImplicitPackedOcclusionRoughnessMetallic, &PbrMetallicRoughnessMaterialDataTest::texturedImplicitPackedOcclusionRoughnessMetallic,
&PbrMetallicRoughnessMaterialDataTest::texturedExplicitPackedOcclusionRoughnessMetallic, &PbrMetallicRoughnessMaterialDataTest::texturedExplicitPackedOcclusionRoughnessMetallic,
@ -475,6 +477,106 @@ void PbrMetallicRoughnessMaterialDataTest::texturedExplicitPackedNoneRoughnessMe
} }
} }
void PbrMetallicRoughnessMaterialDataTest::texturedImplicitPackedOcclusionRoughnessMetallic() {
/* Just the texture IDs, the rest is implicit */
{
PbrMetallicRoughnessMaterialData data{{}, {
{MaterialAttribute::OcclusionTexture, 2u},
{MaterialAttribute::NoneRoughnessMetallicTexture, 2u},
}};
CORRADE_VERIFY(data.hasOcclusionRoughnessMetallicTexture());
CORRADE_VERIFY(!data.hasRoughnessMetallicOcclusionTexture());
/* This is a superset */
CORRADE_VERIFY(data.hasNoneRoughnessMetallicTexture());
/* Explicit parameters for everything, but all the same */
} {
PbrMetallicRoughnessMaterialData data{{}, {
{MaterialAttribute::OcclusionTexture, 2u},
{MaterialAttribute::NoneRoughnessMetallicTexture, 2u},
{MaterialAttribute::OcclusionTextureSwizzle, MaterialTextureSwizzle::R},
{MaterialAttribute::OcclusionTextureMatrix, Matrix3::scaling({0.5f, 0.5f})},
{MaterialAttribute::OcclusionTextureCoordinates, 3u},
{MaterialAttribute::OcclusionTextureLayer, 17u},
{MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::G},
{MaterialAttribute::RoughnessTextureMatrix, Matrix3::scaling({0.5f, 0.5f})},
{MaterialAttribute::RoughnessTextureCoordinates, 3u},
{MaterialAttribute::RoughnessTextureLayer, 17u},
{MaterialAttribute::MetalnessTextureMatrix, Matrix3::scaling({0.5f, 0.5f})},
{MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::B},
{MaterialAttribute::MetalnessTextureCoordinates, 3u},
{MaterialAttribute::MetalnessTextureLayer, 17u}
}};
CORRADE_VERIFY(data.hasOcclusionRoughnessMetallicTexture());
CORRADE_VERIFY(!data.hasRoughnessMetallicOcclusionTexture());
/* This is a superset */
CORRADE_VERIFY(data.hasNoneRoughnessMetallicTexture());
/* Different texture ID */
} {
PbrMetallicRoughnessMaterialData data{{}, {
{MaterialAttribute::OcclusionTexture, 2u},
{MaterialAttribute::NoneRoughnessMetallicTexture, 3u},
{MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::G},
{MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::B},
}};
CORRADE_VERIFY(!data.hasOcclusionRoughnessMetallicTexture());
/* One texture missing */
} {
PbrMetallicRoughnessMaterialData data{{}, {
{MaterialAttribute::NoneRoughnessMetallicTexture, 2u},
{MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::G},
{MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::B},
}};
CORRADE_VERIFY(!data.hasOcclusionRoughnessMetallicTexture());
/* Unexpected swizzle */
} {
PbrMetallicRoughnessMaterialData data{{}, {
{MaterialAttribute::OcclusionTexture, 2u},
{MaterialAttribute::NoneRoughnessMetallicTexture, 2u},
{MaterialAttribute::OcclusionTextureSwizzle, MaterialTextureSwizzle::A},
{MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::G},
{MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::B},
}};
CORRADE_VERIFY(!data.hasOcclusionRoughnessMetallicTexture());
/* Unexpected texture matrix */
} {
PbrMetallicRoughnessMaterialData data{{}, {
{MaterialAttribute::OcclusionTexture, 2u},
{MaterialAttribute::NoneRoughnessMetallicTexture, 2u},
{MaterialAttribute::OcclusionTextureMatrix, Matrix3::scaling({0.5f, 1.0f})},
{MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::G},
{MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::B},
}};
CORRADE_VERIFY(!data.hasOcclusionRoughnessMetallicTexture());
/* Unexpected texture coordinates */
} {
PbrMetallicRoughnessMaterialData data{{}, {
{MaterialAttribute::OcclusionTexture, 2u},
{MaterialAttribute::NoneRoughnessMetallicTexture, 2u},
{MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::G},
{MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::B},
{MaterialAttribute::MetalnessTextureCoordinates, 1u},
}};
CORRADE_VERIFY(!data.hasOcclusionRoughnessMetallicTexture());
/* Unexpected array texture layer */
} {
PbrMetallicRoughnessMaterialData data{{}, {
{MaterialAttribute::OcclusionTexture, 2u},
{MaterialAttribute::NoneRoughnessMetallicTexture, 2u},
{MaterialAttribute::OcclusionTextureLayer, 1u},
{MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::G},
{MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::B},
}};
CORRADE_VERIFY(!data.hasOcclusionRoughnessMetallicTexture());
}
}
void PbrMetallicRoughnessMaterialDataTest::texturedExplicitPackedOcclusionRoughnessMetallic() { void PbrMetallicRoughnessMaterialDataTest::texturedExplicitPackedOcclusionRoughnessMetallic() {
/* Just the texture IDs and swizzles, the rest is implicit */ /* Just the texture IDs and swizzles, the rest is implicit */
{ {
@ -713,14 +815,17 @@ void PbrMetallicRoughnessMaterialDataTest::texturedExplicitPackedNormalRoughness
{MaterialAttribute::NormalTextureSwizzle, MaterialTextureSwizzle::RG}, {MaterialAttribute::NormalTextureSwizzle, MaterialTextureSwizzle::RG},
{MaterialAttribute::NormalTextureMatrix, Matrix3::scaling({0.5f, 0.5f})}, {MaterialAttribute::NormalTextureMatrix, Matrix3::scaling({0.5f, 0.5f})},
{MaterialAttribute::NormalTextureCoordinates, 3u}, {MaterialAttribute::NormalTextureCoordinates, 3u},
{MaterialAttribute::NormalTextureLayer, 17u},
{MaterialAttribute::RoughnessTexture, 2u}, {MaterialAttribute::RoughnessTexture, 2u},
{MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::B}, {MaterialAttribute::RoughnessTextureSwizzle, MaterialTextureSwizzle::B},
{MaterialAttribute::RoughnessTextureMatrix, Matrix3::scaling({0.5f, 0.5f})}, {MaterialAttribute::RoughnessTextureMatrix, Matrix3::scaling({0.5f, 0.5f})},
{MaterialAttribute::RoughnessTextureCoordinates, 3u}, {MaterialAttribute::RoughnessTextureCoordinates, 3u},
{MaterialAttribute::RoughnessTextureLayer, 17u},
{MaterialAttribute::MetalnessTexture, 2u}, {MaterialAttribute::MetalnessTexture, 2u},
{MaterialAttribute::MetalnessTextureMatrix, Matrix3::scaling({0.5f, 0.5f})}, {MaterialAttribute::MetalnessTextureMatrix, Matrix3::scaling({0.5f, 0.5f})},
{MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::A}, {MaterialAttribute::MetalnessTextureSwizzle, MaterialTextureSwizzle::A},
{MaterialAttribute::MetalnessTextureCoordinates, 3u} {MaterialAttribute::MetalnessTextureCoordinates, 3u},
{MaterialAttribute::MetalnessTextureLayer, 17u}
}}; }};
CORRADE_VERIFY(data.hasNormalRoughnessMetallicTexture()); CORRADE_VERIFY(data.hasNormalRoughnessMetallicTexture());

Loading…
Cancel
Save