diff --git a/src/Magnum/Trade/Implementation/materialAttributeProperties.hpp b/src/Magnum/Trade/Implementation/materialAttributeProperties.hpp index 306440a91..9cfd2b932 100644 --- a/src/Magnum/Trade/Implementation/materialAttributeProperties.hpp +++ b/src/Magnum/Trade/Implementation/materialAttributeProperties.hpp @@ -70,6 +70,7 @@ _ct(NormalTextureSwizzle,TextureSwizzle,MaterialTextureSwizzle) _c(NormalTextureMatrix,Matrix3x3) _c(NormalTextureCoordinates,UnsignedInt) _c(OcclusionTexture,UnsignedInt) +_c(OcclusionTextureStrength,Float) _ct(OcclusionTextureSwizzle,TextureSwizzle,MaterialTextureSwizzle) _c(OcclusionTextureMatrix,Matrix3x3) _c(OcclusionTextureCoordinates,UnsignedInt) diff --git a/src/Magnum/Trade/MaterialData.h b/src/Magnum/Trade/MaterialData.h index 61a737b3d..262e5dec1 100644 --- a/src/Magnum/Trade/MaterialData.h +++ b/src/Magnum/Trade/MaterialData.h @@ -678,12 +678,36 @@ enum class MaterialAttribute: UnsignedInt { /** * Occlusion texture index, * @ref MaterialAttributeType::UnsignedInt. + * + * Single-channel texture that multiplies the resulting material color + * @f$ \boldsymbol{c} @f$: @f[ + * \boldsymbol{c}_o = o \boldsymbol{c} + * @f] + * + * If @ref MaterialAttribute::OcclusionTextureStrength is present as well, + * it's used as an interpolation factor @f$ \color{m-success} s @f$ between + * material color @f$ \boldsymbol{c} @f$ and color with occlusion applied + * @f$ o \boldsymbol{c} @f$: @f[ + * \boldsymbol{c}_o = \operatorname{lerp}(\boldsymbol{c}, o \boldsymbol{c}, {\color{m-success} s}) = + * \boldsymbol{c} (1 - {\color{m-success} s}) + o \boldsymbol{c} {\color{m-success} s} + * @f] * @see @ref PbrMetallicRoughnessMaterialData::hasOcclusionRoughnessMetallicTexture(), * @ref PbrMetallicRoughnessMaterialData::occlusionTexture(), - * @ref PbrSpecularGlossinessMaterialData::occlusionTexture() + * @ref PbrSpecularGlossinessMaterialData::occlusionTexture(), + * @ref Math::lerp() */ OcclusionTexture, + /** + * Occlusion texture strength, @ref MaterialAttributeType::Float. + * + * Affects the texture defined by @ref MaterialAttribute::OcclusionTexture, + * see above for details. + * @see @ref PbrMetallicRoughnessMaterialData::occlusionTextureStrength(), + * @ref PbrSpecularGlossinessMaterialData::occlusionTextureStrength() + */ + OcclusionTextureStrength, + /** * Occlusion texture swizzle, @ref MaterialAttributeType::TextureSwizzle. * diff --git a/src/Magnum/Trade/PbrMetallicRoughnessMaterialData.cpp b/src/Magnum/Trade/PbrMetallicRoughnessMaterialData.cpp index d22ba4c23..a1a06f0ab 100644 --- a/src/Magnum/Trade/PbrMetallicRoughnessMaterialData.cpp +++ b/src/Magnum/Trade/PbrMetallicRoughnessMaterialData.cpp @@ -259,6 +259,12 @@ UnsignedInt PbrMetallicRoughnessMaterialData::occlusionTexture() const { return attribute(MaterialAttribute::OcclusionTexture); } +Float PbrMetallicRoughnessMaterialData::occlusionTextureStrength() const { + CORRADE_ASSERT(hasAttribute(MaterialAttribute::OcclusionTexture), + "Trade::PbrMetallicRoughnessMaterialData::occlusionTextureStrength(): the material doesn't have an occlusion texture", {}); + return attributeOr(MaterialAttribute::OcclusionTextureStrength, 1.0f); +} + MaterialTextureSwizzle PbrMetallicRoughnessMaterialData::occlusionTextureSwizzle() const { CORRADE_ASSERT(hasAttribute(MaterialAttribute::OcclusionTexture), "Trade::PbrMetallicRoughnessMaterialData::occlusionTextureSwizzle(): the material doesn't have an occlusion texture", {}); diff --git a/src/Magnum/Trade/PbrMetallicRoughnessMaterialData.h b/src/Magnum/Trade/PbrMetallicRoughnessMaterialData.h index 6723660e9..0d5bd67d1 100644 --- a/src/Magnum/Trade/PbrMetallicRoughnessMaterialData.h +++ b/src/Magnum/Trade/PbrMetallicRoughnessMaterialData.h @@ -478,6 +478,17 @@ class MAGNUM_TRADE_EXPORT PbrMetallicRoughnessMaterialData: public MaterialData */ UnsignedInt occlusionTexture() const; + /** + * @brief Occlusion texture strength + * + * Convenience access to the @ref MaterialAttribute::OcclusionTextureStrength + * attribute. If not present, the default is @cpp 1.0f @ce. + * Available only if @ref MaterialAttribute::OcclusionTexture is + * present. + * @see @ref hasAttribute() + */ + Float occlusionTextureStrength() const; + /** * @brief Occlusion texture swizzle * diff --git a/src/Magnum/Trade/PbrSpecularGlossinessMaterialData.cpp b/src/Magnum/Trade/PbrSpecularGlossinessMaterialData.cpp index 238b01843..d137882c1 100644 --- a/src/Magnum/Trade/PbrSpecularGlossinessMaterialData.cpp +++ b/src/Magnum/Trade/PbrSpecularGlossinessMaterialData.cpp @@ -208,6 +208,12 @@ UnsignedInt PbrSpecularGlossinessMaterialData::occlusionTexture() const { return attribute(MaterialAttribute::OcclusionTexture); } +Float PbrSpecularGlossinessMaterialData::occlusionTextureStrength() const { + CORRADE_ASSERT(hasAttribute(MaterialAttribute::OcclusionTexture), + "Trade::PbrSpecularGlossinessMaterialData::occlusionTextureStrength(): the material doesn't have an occlusion texture", {}); + return attributeOr(MaterialAttribute::OcclusionTextureStrength, 1.0f); +} + MaterialTextureSwizzle PbrSpecularGlossinessMaterialData::occlusionTextureSwizzle() const { CORRADE_ASSERT(hasAttribute(MaterialAttribute::OcclusionTexture), "Trade::PbrSpecularGlossinessMaterialData::occlusionTextureSwizzle(): the material doesn't have an occlusion texture", {}); diff --git a/src/Magnum/Trade/PbrSpecularGlossinessMaterialData.h b/src/Magnum/Trade/PbrSpecularGlossinessMaterialData.h index dd21276a4..753bae0ae 100644 --- a/src/Magnum/Trade/PbrSpecularGlossinessMaterialData.h +++ b/src/Magnum/Trade/PbrSpecularGlossinessMaterialData.h @@ -347,6 +347,17 @@ class MAGNUM_TRADE_EXPORT PbrSpecularGlossinessMaterialData: public MaterialData */ UnsignedInt occlusionTexture() const; + /** + * @brief Occlusion texture strength + * + * Convenience access to the @ref MaterialAttribute::OcclusionTextureStrength + * attribute. If not present, the default is @cpp 1.0f @ce. + * Available only if @ref MaterialAttribute::OcclusionTexture is + * present. + * @see @ref hasAttribute() + */ + Float occlusionTextureStrength() const; + /** * @brief Occlusion texture swizzle * diff --git a/src/Magnum/Trade/Test/MaterialDataTest.cpp b/src/Magnum/Trade/Test/MaterialDataTest.cpp index 966509107..51fa51bd4 100644 --- a/src/Magnum/Trade/Test/MaterialDataTest.cpp +++ b/src/Magnum/Trade/Test/MaterialDataTest.cpp @@ -2748,6 +2748,7 @@ void MaterialDataTest::pbrMetallicRoughnessAccessTextured() { {MaterialAttribute::NormalTextureMatrix, Matrix3::scaling({1.0f, 0.5f})}, {MaterialAttribute::NormalTextureCoordinates, 5u}, {MaterialAttribute::OcclusionTexture, 4u}, + {MaterialAttribute::OcclusionTextureStrength, 0.66f}, {MaterialAttribute::OcclusionTextureSwizzle, MaterialTextureSwizzle::B}, {MaterialAttribute::OcclusionTextureMatrix, Matrix3::scaling({1.0f, 0.75f})}, {MaterialAttribute::OcclusionTextureCoordinates, 6u}, @@ -2785,6 +2786,7 @@ void MaterialDataTest::pbrMetallicRoughnessAccessTextured() { CORRADE_COMPARE(data.normalTextureMatrix(), Matrix3::scaling({1.0f, 0.5f})); CORRADE_COMPARE(data.normalTextureCoordinates(), 5); CORRADE_COMPARE(data.occlusionTexture(), 4); + CORRADE_COMPARE(data.occlusionTextureStrength(), 0.66f); CORRADE_COMPARE(data.occlusionTextureMatrix(), Matrix3::scaling({1.0f, 0.75f})); CORRADE_COMPARE(data.occlusionTextureSwizzle(), MaterialTextureSwizzle::B); CORRADE_COMPARE(data.occlusionTextureCoordinates(), 6); @@ -2835,6 +2837,7 @@ void MaterialDataTest::pbrMetallicRoughnessAccessTexturedDefaults() { CORRADE_COMPARE(data.normalTextureMatrix(), Matrix3{}); CORRADE_COMPARE(data.normalTextureCoordinates(), 0); CORRADE_COMPARE(data.occlusionTexture(), 5); + CORRADE_COMPARE(data.occlusionTextureStrength(), 1.0f); CORRADE_COMPARE(data.occlusionTextureSwizzle(), MaterialTextureSwizzle::R); CORRADE_COMPARE(data.occlusionTextureMatrix(), Matrix3{}); CORRADE_COMPARE(data.occlusionTextureCoordinates(), 0); @@ -3278,6 +3281,7 @@ void MaterialDataTest::pbrMetallicRoughnessAccessInvalidTextures() { data.normalTextureMatrix(); data.normalTextureCoordinates(); data.occlusionTexture(); + data.occlusionTextureStrength(); data.occlusionTextureSwizzle(); data.occlusionTextureMatrix(); data.occlusionTextureCoordinates(); @@ -3302,6 +3306,7 @@ void MaterialDataTest::pbrMetallicRoughnessAccessInvalidTextures() { "Trade::PbrMetallicRoughnessMaterialData::normalTextureMatrix(): the material doesn't have a normal texture\n" "Trade::PbrMetallicRoughnessMaterialData::normalTextureCoordinates(): the material doesn't have a normal texture\n" "Trade::MaterialData::attribute(): attribute OcclusionTexture not found in layer 0\n" + "Trade::PbrMetallicRoughnessMaterialData::occlusionTextureStrength(): the material doesn't have an occlusion texture\n" "Trade::PbrMetallicRoughnessMaterialData::occlusionTextureSwizzle(): the material doesn't have an occlusion texture\n" "Trade::PbrMetallicRoughnessMaterialData::occlusionTextureMatrix(): the material doesn't have an occlusion texture\n" "Trade::PbrMetallicRoughnessMaterialData::occlusionTextureCoordinates(): the material doesn't have an occlusion texture\n" @@ -3370,6 +3375,7 @@ void MaterialDataTest::pbrSpecularGlossinessAccessTextured() { {MaterialAttribute::NormalTextureMatrix, Matrix3::scaling({1.0f, 0.5f})}, {MaterialAttribute::NormalTextureCoordinates, 5u}, {MaterialAttribute::OcclusionTexture, 4u}, + {MaterialAttribute::OcclusionTextureStrength, 0.66f}, {MaterialAttribute::OcclusionTextureSwizzle, MaterialTextureSwizzle::B}, {MaterialAttribute::OcclusionTextureMatrix, Matrix3::scaling({1.0f, 0.75f})}, {MaterialAttribute::OcclusionTextureCoordinates, 6u}, @@ -3404,6 +3410,7 @@ void MaterialDataTest::pbrSpecularGlossinessAccessTextured() { CORRADE_COMPARE(data.normalTextureMatrix(), Matrix3::scaling({1.0f, 0.5f})); CORRADE_COMPARE(data.normalTextureCoordinates(), 5); CORRADE_COMPARE(data.occlusionTexture(), 4); + CORRADE_COMPARE(data.occlusionTextureStrength(), 0.66f); CORRADE_COMPARE(data.occlusionTextureMatrix(), Matrix3::scaling({1.0f, 0.75f})); CORRADE_COMPARE(data.occlusionTextureSwizzle(), MaterialTextureSwizzle::B); CORRADE_COMPARE(data.occlusionTextureCoordinates(), 6); @@ -3451,6 +3458,7 @@ void MaterialDataTest::pbrSpecularGlossinessAccessTexturedDefaults() { CORRADE_COMPARE(data.normalTextureMatrix(), Matrix3{}); CORRADE_COMPARE(data.normalTextureCoordinates(), 0); CORRADE_COMPARE(data.occlusionTexture(), 5); + CORRADE_COMPARE(data.occlusionTextureStrength(), 1.0f); CORRADE_COMPARE(data.occlusionTextureMatrix(), Matrix3{}); CORRADE_COMPARE(data.occlusionTextureSwizzle(), MaterialTextureSwizzle::R); CORRADE_COMPARE(data.occlusionTextureCoordinates(), 0); @@ -3665,6 +3673,7 @@ void MaterialDataTest::pbrSpecularGlossinessAccessInvalidTextures() { data.normalTextureMatrix(); data.normalTextureCoordinates(); data.occlusionTexture(); + data.occlusionTextureStrength(); data.occlusionTextureSwizzle(); data.occlusionTextureMatrix(); data.occlusionTextureCoordinates(); @@ -3689,6 +3698,7 @@ void MaterialDataTest::pbrSpecularGlossinessAccessInvalidTextures() { "Trade::PbrSpecularGlossinessMaterialData::normalTextureMatrix(): the material doesn't have a normal texture\n" "Trade::PbrSpecularGlossinessMaterialData::normalTextureCoordinates(): the material doesn't have a normal texture\n" "Trade::MaterialData::attribute(): attribute OcclusionTexture not found in layer 0\n" + "Trade::PbrSpecularGlossinessMaterialData::occlusionTextureStrength(): the material doesn't have an occlusion texture\n" "Trade::PbrSpecularGlossinessMaterialData::occlusionTextureSwizzle(): the material doesn't have an occlusion texture\n" "Trade::PbrSpecularGlossinessMaterialData::occlusionTextureMatrix(): the material doesn't have an occlusion texture\n" "Trade::PbrSpecularGlossinessMaterialData::occlusionTextureCoordinates(): the material doesn't have an occlusion texture\n"