Browse Source

Shaders: add a generic texture layer attribute and UBO definition.

The attribute will be used for instanced texture layers in
texture-array-enabled shaders.
pull/518/head
Vladimír Vondruš 5 years ago
parent
commit
c4b748ad2d
  1. 27
      src/Magnum/Shaders/Generic.h
  2. 28
      src/Magnum/Shaders/GenericGL.h
  3. 10
      src/Magnum/Shaders/Test/GenericTest.cpp

27
src/Magnum/Shaders/Generic.h

@ -374,10 +374,9 @@ Used only if @ref DistanceFieldVectorGL::Flag::TextureTransformation,
*/
struct TextureTransformationUniform {
/** @brief Construct with default parameters */
constexpr explicit TextureTransformationUniform(DefaultInitT = DefaultInit) noexcept: rotationScaling{Math::IdentityInit}
constexpr explicit TextureTransformationUniform(DefaultInitT = DefaultInit) noexcept: rotationScaling{Math::IdentityInit}, offset{0.0f, 0.0f}, layer{0}
#if (defined(CORRADE_TARGET_CLANG) && __clang_major__ < 4) || (defined(CORRADE_TARGET_APPLE_CLANG) && __clang_major__ < 8)
/* Otherwise it refuses to constexpr, on 3.8 at least */
, _pad0{}, _pad1{}
, _pad0{} /* Otherwise it refuses to constexpr, on 3.8 at least */
#endif
{}
/** @brief Construct without initializing the contents */
@ -407,6 +406,15 @@ struct TextureTransformationUniform {
return *this;
}
/**
* @brief Set the @ref layer field
* @return Reference to self (for method chaining)
*/
TextureTransformationUniform& setLayer(UnsignedInt layer) {
this->layer = layer;
return *this;
}
/**
* @}
*/
@ -449,6 +457,14 @@ struct TextureTransformationUniform {
*/
Vector2 offset;
/**
* @brief Texture layer
*
* Descibes which layer of a texture array to use. Default value is
* @cpp 0.5f @ce.
*/
UnsignedInt layer;
/* warning: Member __pad0__ is not documented. FFS DOXYGEN WHY DO YOU THINK
I MADE THOSE UNNAMED, YOU DUMB FOOL */
#ifndef DOXYGEN_GENERATING_OUTPUT
@ -456,11 +472,6 @@ struct TextureTransformationUniform {
#if (defined(CORRADE_TARGET_CLANG) && __clang_major__ < 4) || (defined(CORRADE_TARGET_APPLE_CLANG) && __clang_major__ < 8)
_pad0 /* Otherwise it refuses to constexpr, on 3.8 at least */
#endif
:32; /* reserved for layer */
Int
#if (defined(CORRADE_TARGET_CLANG) && __clang_major__ < 4) || (defined(CORRADE_TARGET_APPLE_CLANG) && __clang_major__ < 8)
_pad1 /* Otherwise it refuses to constexpr, on 3.8 at least */
#endif
:32; /* reserved for coordinateSet */
#endif
};

28
src/Magnum/Shaders/GenericGL.h

@ -186,9 +186,7 @@ rotation and scale
<tr>
<td>15</td>
<td>
@ref TextureOffset (instanced)
* *Reserved* --- third component for a layer
@ref TextureOffset / @ref TextureOffsetLayer (instanced)
</td>
<td>
* *Reserved* --- a single component \n
@ -420,8 +418,9 @@ template<UnsignedInt dimensions> struct GenericGL {
* @brief (Instanced) texture offset
* @m_since{2020,06}
*
* @ref Magnum::Vector2 "Vector2". Currently doesn't have a corresponding
* @ref Trade::MeshAttribute.
* @ref Magnum::Vector2 "Vector2". Use either this or the
* @ref TextureOffsetLayer attribute. Currently doesn't have a
* corresponding @ref Trade::MeshAttribute.
* @requires_gl33 Extension @gl_extension{ARB,instanced_arrays}
* @requires_gles30 Extension @gl_extension{ANGLE,instanced_arrays},
* @gl_extension{EXT,instanced_arrays} or
@ -430,6 +429,22 @@ template<UnsignedInt dimensions> struct GenericGL {
* in WebGL 1.0.
*/
typedef GL::Attribute<15, Vector2> TextureOffset;
#ifndef MAGNUM_TARGET_GLES2
/**
* @brief (Instanced) texture offset and layer
* @m_since_latest
*
* @ref Magnum::Vector3 "Vector3", with the last component interpreted as
* an integer. Use either this or the @ref TextureOffset attribute.
* Currently doesn't have a corresponding @ref Trade::MeshAttribute.
* @requires_gl33 Extension @gl_extension{EXT,texture_array} and
* @gl_extension{ARB,instanced_arrays}
* @requires_gles30 Texture arrays are not available in OpenGL ES 2.0.
* @requires_webgl20 Texture arrays are not available in WebGL 1.0.
*/
typedef GL::Attribute<15, Vector3> TextureOffsetLayer;
#endif
};
#endif
@ -462,6 +477,9 @@ struct BaseGenericGL {
#endif
typedef GL::Attribute<15, Vector2> TextureOffset;
#ifndef MAGNUM_TARGET_GLES2
typedef GL::Attribute<15, Vector3> TextureOffsetLayer;
#endif
};
template<> struct GenericGL<2>: BaseGenericGL {

10
src/Magnum/Shaders/Test/GenericTest.cpp

@ -378,6 +378,8 @@ void GenericTest::textureTransformationUniformConstructDefault() {
}));
CORRADE_COMPARE(a.offset, (Vector2{0.0f, 0.0f}));
CORRADE_COMPARE(b.offset, (Vector2{0.0f, 0.0f}));
CORRADE_COMPARE(a.layer, 0);
CORRADE_COMPARE(b.layer, 0);
constexpr TextureTransformationUniform ca;
constexpr TextureTransformationUniform cb{DefaultInit};
@ -391,6 +393,8 @@ void GenericTest::textureTransformationUniformConstructDefault() {
}));
CORRADE_COMPARE(ca.offset, (Vector2{0.0f, 0.0f}));
CORRADE_COMPARE(cb.offset, (Vector2{0.0f, 0.0f}));
CORRADE_COMPARE(ca.layer, 0);
CORRADE_COMPARE(cb.layer, 0);
CORRADE_VERIFY(std::is_nothrow_default_constructible<TextureTransformationUniform>::value);
CORRADE_VERIFY(std::is_nothrow_constructible<TextureTransformationUniform, DefaultInitT>::value);
@ -403,6 +407,7 @@ void GenericTest::textureTransformationUniformConstructNoInit() {
TextureTransformationUniform a;
a.rotationScaling[1] = {2.5f, -3.0f};
a.offset = {2.7f, 0.3f};
a.layer = 37;
new(&a) TextureTransformationUniform{NoInit};
{
@ -411,6 +416,7 @@ void GenericTest::textureTransformationUniformConstructNoInit() {
#endif
CORRADE_COMPARE(a.rotationScaling[1], (Vector2{2.5f, -3.0f}));
CORRADE_COMPARE(a.offset, (Vector2{2.7f, 0.3f}));
CORRADE_COMPARE(a.layer, 37);
}
CORRADE_VERIFY(std::is_nothrow_constructible<TextureTransformationUniform, NoInitT>::value);
@ -422,12 +428,14 @@ void GenericTest::textureTransformationUniformConstructNoInit() {
void GenericTest::textureTransformationUniformSetters() {
TextureTransformationUniform a;
a.setTextureMatrix(Matrix3::translation({2.6f, 0.3f})*
Matrix3::rotation(90.0_degf));
Matrix3::rotation(90.0_degf))
.setLayer(37);
CORRADE_COMPARE(a.rotationScaling, (Matrix2x2{
Vector2{ 0.0f, 1.0f},
Vector2{-1.0f, 0.0f}
}));
CORRADE_COMPARE(a.offset, (Vector2{2.6f, 0.3f}));
CORRADE_COMPARE(a.layer, 37);
}
}}}}

Loading…
Cancel
Save