Browse Source

Trade: deprecate LightData::Type in favor of LightType.

Enums in classes are bad, can't forward-declare them.
pull/620/head
Vladimír Vondruš 3 years ago
parent
commit
89e77a42db
  1. 6
      doc/changelog.dox
  2. 6
      doc/snippets/MagnumTrade.cpp
  3. 6
      src/Magnum/SceneTools/Implementation/sceneConverterUtilities.h
  4. 10
      src/Magnum/SceneTools/Test/SceneConverterImplementationTest.cpp
  5. 38
      src/Magnum/Trade/LightData.cpp
  6. 319
      src/Magnum/Trade/LightData.h
  7. 20
      src/Magnum/Trade/Test/AbstractSceneConverterTest.cpp
  8. 96
      src/Magnum/Trade/Test/LightDataTest.cpp
  9. 1
      src/Magnum/Trade/Trade.h

6
doc/changelog.dox

@ -1112,9 +1112,11 @@ See also:
possible cases. The variant taking an @ref Animation::TrackView is kept possible cases. The variant taking an @ref Animation::TrackView is kept
however as it may be convenient when exporting already-populated animation however as it may be convenient when exporting already-populated animation
instances. instances.
- @cpp Trade::LightData::Type::Infinite @ce, originally adapted from the - @cpp Trade::LightData::Type @ce is deprecated in favor of
@ref Trade::LightType that is shorter to type and can be forward-declared
- @cpp Trade::LightType::Infinite @ce, originally adapted from the
OpenGEX specification, is deprecated in favor of OpenGEX specification, is deprecated in favor of
@ref Trade::LightData::Type::Directional as that's the more commonly used @ref Trade::LightType::Directional as that's the more commonly used
term term
- @cpp Trade::PhongMaterialData::ambientCoordinateSet() @ce, - @cpp Trade::PhongMaterialData::ambientCoordinateSet() @ce,
@cpp diffuseCoordinateSet() @ce, @cpp specularCoordinateSet() @ce and @cpp diffuseCoordinateSet() @ce, @cpp specularCoordinateSet() @ce and

6
doc/snippets/MagnumTrade.cpp

@ -496,7 +496,7 @@ for(auto&& row: data.mutablePixels<Color3ub>())
{ {
/* [LightData-populating-range] */ /* [LightData-populating-range] */
Trade::LightData data{Trade::LightData::Type::Point, Trade::LightData data{Trade::LightType::Point,
0xfff3d6_srgbf, 1.0f, 0xfff3d6_srgbf, 1.0f,
15.0f}; 15.0f};
/* [LightData-populating-range] */ /* [LightData-populating-range] */
@ -504,7 +504,7 @@ Trade::LightData data{Trade::LightData::Type::Point,
{ {
/* [LightData-populating-attenuation] */ /* [LightData-populating-attenuation] */
Trade::LightData data{Trade::LightData::Type::Spot, Trade::LightData data{Trade::LightType::Spot,
0xf3d6ff_srgbf, 10.0f, 0xf3d6ff_srgbf, 10.0f,
{0.01f, 0.5f, 2.0f}, {0.01f, 0.5f, 2.0f},
25.0_degf, 55.0_degf}; 25.0_degf, 55.0_degf};
@ -513,7 +513,7 @@ Trade::LightData data{Trade::LightData::Type::Spot,
{ {
/* [LightData-populating-none] */ /* [LightData-populating-none] */
Trade::LightData data{Trade::LightData::Type::Directional, Trade::LightData data{Trade::LightType::Directional,
0xd6fff3_srgbf, 0.25f}; 0xd6fff3_srgbf, 0.25f};
/* [LightData-populating-none] */ /* [LightData-populating-none] */
} }

6
src/Magnum/SceneTools/Implementation/sceneConverterUtilities.h

@ -796,7 +796,7 @@ bool printInfo(const Debug::Flags useColor, const bool useColor24, const Utility
d << Debug::newline << " Type:" << Debug::packed d << Debug::newline << " Type:" << Debug::packed
<< Debug::color(Debug::Color::Cyan) << Debug::color(Debug::Color::Cyan)
<< info.data.type() << Debug::resetColor; << info.data.type() << Debug::resetColor;
if(info.data.type() == Trade::LightData::Type::Spot) if(info.data.type() == Trade::LightType::Spot)
d << Debug::nospace << "," << Debug::packed d << Debug::nospace << "," << Debug::packed
<< Deg(info.data.innerConeAngle()) << Debug::nospace << Deg(info.data.innerConeAngle()) << Debug::nospace
<< "° -" << Debug::packed << Deg(info.data.outerConeAngle()) << "° -" << Debug::packed << Deg(info.data.outerConeAngle())
@ -807,8 +807,8 @@ bool printInfo(const Debug::Flags useColor, const bool useColor24, const Utility
d << Debug::packed << info.data.color(); d << Debug::packed << info.data.color();
if(!Math::equal(info.data.intensity(), 1.0f)) if(!Math::equal(info.data.intensity(), 1.0f))
d << "*" << info.data.intensity(); d << "*" << info.data.intensity();
if(info.data.type() != Trade::LightData::Type::Ambient && if(info.data.type() != Trade::LightType::Ambient &&
info.data.type() != Trade::LightData::Type::Directional) info.data.type() != Trade::LightType::Directional)
d << Debug::newline << " Attenuation:" << Debug::packed d << Debug::newline << " Attenuation:" << Debug::packed
<< info.data.attenuation(); << info.data.attenuation();
if(info.data.range() != Constants::inf()) if(info.data.range() != Constants::inf())

10
src/Magnum/SceneTools/Test/SceneConverterImplementationTest.cpp

@ -464,7 +464,7 @@ void SceneConverterImplementationTest::infoLights() {
Containers::Optional<Trade::LightData> doLight(UnsignedInt id) override { Containers::Optional<Trade::LightData> doLight(UnsignedInt id) override {
/* First a blue spot light */ /* First a blue spot light */
if(id == 0) return Trade::LightData{ if(id == 0) return Trade::LightData{
Trade::LightData::Type::Spot, Trade::LightType::Spot,
0x3457ff_rgbf, 0x3457ff_rgbf,
15.0f, 15.0f,
{1.2f, 0.3f, 0.04f}, {1.2f, 0.3f, 0.04f},
@ -475,7 +475,7 @@ void SceneConverterImplementationTest::infoLights() {
/* Second a yellow directional light with infinite range */ /* Second a yellow directional light with infinite range */
if(id == 1) return Trade::LightData{ if(id == 1) return Trade::LightData{
Trade::LightData::Type::Directional, Trade::LightType::Directional,
0xff5734_rgbf, 0xff5734_rgbf,
5.0f 5.0f
}; };
@ -998,17 +998,17 @@ void SceneConverterImplementationTest::infoReferenceCount() {
} }
Containers::Optional<Trade::LightData> doLight(UnsignedInt id) override { Containers::Optional<Trade::LightData> doLight(UnsignedInt id) override {
if(id == 0) return Trade::LightData{ if(id == 0) return Trade::LightData{
Trade::LightData::Type::Directional, Trade::LightType::Directional,
0x57ff34_rgbf, 0x57ff34_rgbf,
5.0f 5.0f
}; };
if(id == 1) return Trade::LightData{ if(id == 1) return Trade::LightData{
Trade::LightData::Type::Ambient, Trade::LightType::Ambient,
0xff5734_rgbf, 0xff5734_rgbf,
0.1f 0.1f
}; };
if(id == 2) return Trade::LightData{ if(id == 2) return Trade::LightData{
Trade::LightData::Type::Directional, Trade::LightType::Directional,
0x3457ff_rgbf, 0x3457ff_rgbf,
1.0f 1.0f
}; };

38
src/Magnum/Trade/LightData.cpp

@ -31,50 +31,50 @@ namespace Magnum { namespace Trade {
using namespace Math::Literals; using namespace Math::Literals;
LightData::LightData(const Type type, const Color3& color, const Float intensity, const Vector3& attenuation, const Float range, const Rad innerConeAngle, const Rad outerConeAngle, const void* const importerState) noexcept: _type{type}, _color{color}, _intensity{intensity}, _attenuation{attenuation}, _range{range}, _innerConeAngle{innerConeAngle}, _outerConeAngle{outerConeAngle}, _importerState{importerState} { LightData::LightData(const LightType type, const Color3& color, const Float intensity, const Vector3& attenuation, const Float range, const Rad innerConeAngle, const Rad outerConeAngle, const void* const importerState) noexcept: _type{type}, _color{color}, _intensity{intensity}, _attenuation{attenuation}, _range{range}, _innerConeAngle{innerConeAngle}, _outerConeAngle{outerConeAngle}, _importerState{importerState} {
CORRADE_ASSERT(_type != Type::Spot || (Deg(_innerConeAngle) >= 0.0_degf && _innerConeAngle <= _outerConeAngle && Deg(_outerConeAngle) <= 360.0_degf), CORRADE_ASSERT(_type != LightType::Spot || (Deg(_innerConeAngle) >= 0.0_degf && _innerConeAngle <= _outerConeAngle && Deg(_outerConeAngle) <= 360.0_degf),
"Trade::LightData: spot light inner and outer cone angles have to be in range [0°, 360°] and inner not larger than outer but got" << Deg(_innerConeAngle) << "and" << Deg(_outerConeAngle), ); "Trade::LightData: spot light inner and outer cone angles have to be in range [0°, 360°] and inner not larger than outer but got" << Deg(_innerConeAngle) << "and" << Deg(_outerConeAngle), );
CORRADE_ASSERT(_type == Type::Spot || (Math::equal(Deg(_innerConeAngle),360.0_degf) && Math::equal(Deg(_outerConeAngle), 360.0_degf)), CORRADE_ASSERT(_type == LightType::Spot || (Math::equal(Deg(_innerConeAngle),360.0_degf) && Math::equal(Deg(_outerConeAngle), 360.0_degf)),
"Trade::LightData: cone angles have to be 360° for lights that aren't spot but got" << Deg(_innerConeAngle) << "and" << Deg(_outerConeAngle), ); "Trade::LightData: cone angles have to be 360° for lights that aren't spot but got" << Deg(_innerConeAngle) << "and" << Deg(_outerConeAngle), );
CORRADE_ASSERT((_type != Type::Ambient && _type != Type::Directional) || (_attenuation == Vector3{1.0f, 0.0f, 0.0f}), CORRADE_ASSERT((_type != LightType::Ambient && _type != LightType::Directional) || (_attenuation == Vector3{1.0f, 0.0f, 0.0f}),
"Trade::LightData: attenuation has to be (1, 0, 0) for an ambient or directional light but got" << _attenuation, ); "Trade::LightData: attenuation has to be (1, 0, 0) for an ambient or directional light but got" << _attenuation, );
CORRADE_ASSERT((_type != Type::Ambient && _type != Type::Directional) || _range == Constants::inf(), CORRADE_ASSERT((_type != LightType::Ambient && _type != LightType::Directional) || _range == Constants::inf(),
"Trade::LightData: range has to be infinity for an ambient or directional light but got" << _range, ); "Trade::LightData: range has to be infinity for an ambient or directional light but got" << _range, );
} }
LightData::LightData(const Type type, const Color3& color, const Float intensity, const Vector3& attenuation, const Float range, const void* const importerState) noexcept: LightData{type, color, intensity, attenuation, range, LightData::LightData(const LightType type, const Color3& color, const Float intensity, const Vector3& attenuation, const Float range, const void* const importerState) noexcept: LightData{type, color, intensity, attenuation, range,
type == Type::Spot ? 0.0_degf : 360.0_degf, type == LightType::Spot ? 0.0_degf : 360.0_degf,
type == Type::Spot ? 90.0_degf : 360.0_degf, type == LightType::Spot ? 90.0_degf : 360.0_degf,
importerState} {} importerState} {}
LightData::LightData(const Type type, const Color3& color, const Float intensity, const Vector3& attenuation, const Rad innerConeAngle, const Rad outerConeAngle, const void* const importerState) noexcept: LightData{type, color, intensity, attenuation, Constants::inf(), innerConeAngle, outerConeAngle, importerState} {} LightData::LightData(const LightType type, const Color3& color, const Float intensity, const Vector3& attenuation, const Rad innerConeAngle, const Rad outerConeAngle, const void* const importerState) noexcept: LightData{type, color, intensity, attenuation, Constants::inf(), innerConeAngle, outerConeAngle, importerState} {}
LightData::LightData(const Type type, const Color3& color, const Float intensity, const Vector3& attenuation, const void* const importerState) noexcept: LightData{type, color, intensity, attenuation, Constants::inf(), importerState} {} LightData::LightData(const LightType type, const Color3& color, const Float intensity, const Vector3& attenuation, const void* const importerState) noexcept: LightData{type, color, intensity, attenuation, Constants::inf(), importerState} {}
LightData::LightData(const Type type, const Color3& color, const Float intensity, const Float range, const Rad innerConeAngle, const Rad outerConeAngle, const void* const importerState) noexcept: LightData{type, color, intensity, LightData::LightData(const LightType type, const Color3& color, const Float intensity, const Float range, const Rad innerConeAngle, const Rad outerConeAngle, const void* const importerState) noexcept: LightData{type, color, intensity,
type == Type::Ambient || type == Type::Directional ? type == LightType::Ambient || type == LightType::Directional ?
Vector3{1.0f, 0.0f, 0.0f} : Vector3{1.0f, 0.0f, 1.0f}, Vector3{1.0f, 0.0f, 0.0f} : Vector3{1.0f, 0.0f, 1.0f},
range, innerConeAngle, outerConeAngle, importerState} {} range, innerConeAngle, outerConeAngle, importerState} {}
LightData::LightData(const Type type, const Color3& color, const Float intensity, const Float range, const void* const importerState) noexcept: LightData{type, color, intensity, LightData::LightData(const LightType type, const Color3& color, const Float intensity, const Float range, const void* const importerState) noexcept: LightData{type, color, intensity,
type == Type::Ambient || type == Type::Directional ? type == LightType::Ambient || type == LightType::Directional ?
Vector3{1.0f, 0.0f, 0.0f} : Vector3{1.0f, 0.0f, 1.0f}, Vector3{1.0f, 0.0f, 0.0f} : Vector3{1.0f, 0.0f, 1.0f},
range, importerState} {} range, importerState} {}
LightData::LightData(const Type type, const Color3& color, const Float intensity, const Rad innerConeAngle, const Rad outerConeAngle, const void* const importerState) noexcept: LightData{type, color, intensity, Constants::inf(), innerConeAngle, outerConeAngle, importerState} {} LightData::LightData(const LightType type, const Color3& color, const Float intensity, const Rad innerConeAngle, const Rad outerConeAngle, const void* const importerState) noexcept: LightData{type, color, intensity, Constants::inf(), innerConeAngle, outerConeAngle, importerState} {}
LightData::LightData(const Type type, const Color3& color, const Float intensity, const void* const importerState) noexcept: LightData{type, color, intensity, Constants::inf(), importerState} {} LightData::LightData(const LightType type, const Color3& color, const Float intensity, const void* const importerState) noexcept: LightData{type, color, intensity, Constants::inf(), importerState} {}
#ifndef DOXYGEN_GENERATING_OUTPUT #ifndef DOXYGEN_GENERATING_OUTPUT
Debug& operator<<(Debug& debug, const LightData::Type value) { Debug& operator<<(Debug& debug, const LightType value) {
const bool packed = debug.immediateFlags() >= Debug::Flag::Packed; const bool packed = debug.immediateFlags() >= Debug::Flag::Packed;
if(!packed) if(!packed)
debug << "Trade::LightData::Type" << Debug::nospace; debug << "Trade::LightType" << Debug::nospace;
switch(value) { switch(value) {
/* LCOV_EXCL_START */ /* LCOV_EXCL_START */
#define _c(value) case LightData::Type::value: return debug << (packed ? "" : "::") << Debug::nospace << #value; #define _c(value) case LightType::value: return debug << (packed ? "" : "::") << Debug::nospace << #value;
_c(Ambient) _c(Ambient)
_c(Directional) _c(Directional)
_c(Point) _c(Point)

319
src/Magnum/Trade/LightData.h

@ -35,6 +35,63 @@
namespace Magnum { namespace Trade { namespace Magnum { namespace Trade {
/**
@brief Light type
@m_since_latest
@see @ref LightData::type()
*/
enum class LightType: UnsignedByte {
/* Zero reserved for an invalid value */
/**
* Ambient light, without any position, direction or attenuation. Meant to
* be added to ambient color in Phong workflows, has no use in physically
* based workflows.
* @m_since_latest
*/
Ambient = 1,
/**
* Light at a position that is infinitely far away, emitted in a direction
* of negative Z axis. The rotation is inherited from absolute object
* transformation; scale and position don't affect the light in any way.
* Because the light is at infinite distance, it's not attenuated in any
* way.
* @m_since_latest
*/
Directional,
#ifdef MAGNUM_BUILD_DEPRECATED
/**
* Directional light.
* @m_deprecated_since_latest Use @ref LightType::Directional instead.
*/
Infinite CORRADE_DEPRECATED_ENUM("use LightType::Directional instead") = Directional,
#endif
/**
* Point light, emitting light in all directions. The position is inherited
* from absolute object transformation; scale and rotation don't affect the
* light in any way. Brightness attenuates depending on the
* @ref LightData::range() value.
*/
Point,
/**
* Spot light, emitting light in a cone in direction of local negative Z
* axis. The position and rotation is inherited from absolute object
* transformation; scale doesn't affect the light in any way. The angle and
* falloff of the cone is defined using @ref LightData::innerConeAngle()
* and @ref LightData::outerConeAngle() and brightness attenuates depending
* on the @ref LightData::range() value.
*/
Spot
};
/** @debugoperatorenum{LightType} */
MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, LightType value);
/** /**
@brief Light data @brief Light data
@ -50,20 +107,22 @@ everything except spotlights.
You can choose a constructor overload that matches the subset of input You can choose a constructor overload that matches the subset of input
parameters and let the class set the rest implicitly. For example, a parameters and let the class set the rest implicitly. For example, a
@ref Type::Point light constructed using a range will have @ref attenuation() @ref LightType::Point light constructed using a range will have
implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce and cone angles to @ref attenuation() implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce and cone
@cpp 360.0_degf @ce: angles to @cpp 360.0_degf @ce:
@snippet MagnumTrade.cpp LightData-populating-range @snippet MagnumTrade.cpp LightData-populating-range
Or, a @ref Type::Spot light constructed from a constant / linear / quadratic Or, a @ref LightType::Spot light constructed from a constant / linear /
attenuation will have @ref range() implicitly set to @ref Constants::inf(): quadratic attenuation will have @ref range() implicitly set to
@ref Constants::inf():
@snippet MagnumTrade.cpp LightData-populating-attenuation @snippet MagnumTrade.cpp LightData-populating-attenuation
And a @ref Type::Directional light that doesn't attenuate can be constructed And a @ref LightType::Directional light that doesn't attenuate can be
without either, causing @ref attenuation() to be @cpp {1.0f, 0.0f, 0.0f} @ce constructed without either, causing @ref attenuation() to be
and @ref range() @ref Constants::inf(), cancelling out the attenuation equation: @cpp {1.0f, 0.0f, 0.0f} @ce and @ref range() @ref Constants::inf(), cancelling
out the attenuation equation:
@snippet MagnumTrade.cpp LightData-populating-none @snippet MagnumTrade.cpp LightData-populating-none
@ -100,7 +159,7 @@ a simple inverse square: @f[
F_{att} = \lim_{{\color{m-info} R} \to \infty} \frac{{\color{m-dim} \operatorname{clamp}(} 1 \mathbin{\color{m-dim} -} {\color{m-dim} (\frac{d}{R})^4, 0, 1)^2}}{{\color{m-success} K_c} + {\color{m-dim} K_l d} \mathbin{\color{m-dim} +} {\color{m-success} K_q} d^2} = \frac{1}{1 + d^2} F_{att} = \lim_{{\color{m-info} R} \to \infty} \frac{{\color{m-dim} \operatorname{clamp}(} 1 \mathbin{\color{m-dim} -} {\color{m-dim} (\frac{d}{R})^4, 0, 1)^2}}{{\color{m-success} K_c} + {\color{m-dim} K_l d} \mathbin{\color{m-dim} +} {\color{m-success} K_q} d^2} = \frac{1}{1 + d^2}
@f] @f]
As a special case, a @ref Type::Directional light is defined by As a special case, a @ref LightType::Directional light is defined by
@ref attenuation() set to @cpp {1.0f, 0.0f, 0.0f} @ce and @ref range() to @ref attenuation() set to @cpp {1.0f, 0.0f, 0.0f} @ce and @ref range() to
@ref Constants::inf() --- thus without any attenuation: @f[ @ref Constants::inf() --- thus without any attenuation: @f[
F_{att} = \lim_{{\color{m-info} R} \to \infty} \frac{{\color{m-dim} \operatorname{clamp}(} 1 \mathbin{\color{m-dim} -} {\color{m-dim} (\frac{d}{R})^4, 0, 1)^2}}{{\color{m-success} K_c} \mathbin{\color{m-dim} +} {\color{m-dim} K_l d + K_q d^2}} = 1 F_{att} = \lim_{{\color{m-info} R} \to \infty} \frac{{\color{m-dim} \operatorname{clamp}(} 1 \mathbin{\color{m-dim} -} {\color{m-dim} (\frac{d}{R})^4, 0, 1)^2}}{{\color{m-success} K_c} \mathbin{\color{m-dim} +} {\color{m-dim} K_l d + K_q d^2}} = 1
@ -109,67 +168,20 @@ As a special case, a @ref Type::Directional light is defined by
@section Trade-LightData-units Units @section Trade-LightData-units Units
To follow physically-based principles in lighting calculation, intensity is To follow physically-based principles in lighting calculation, intensity is
assumed to be in in *candela* (lm/sr) for @ref Type::Point and @ref Type::Spot, assumed to be in in *candela* (lm/sr) for @ref LightType::Point and
and in *lux* (lm/m<sup>2</sup>) for @ref Type::Directional. Distance @f$ d @f$ @ref LightType::Spot, and in *lux* (lm/m<sup>2</sup>) for
is in meters. @ref LightType::Directional. Distance @f$ d @f$ is in meters.
@see @ref AbstractImporter::light() @see @ref AbstractImporter::light()
*/ */
class MAGNUM_TRADE_EXPORT LightData { class MAGNUM_TRADE_EXPORT LightData {
public: public:
/** #ifdef MAGNUM_BUILD_DEPRECATED
* @brief Light type /** @brief @copybrief LightType
* * @m_deprecated_since_latest Use @ref LightType instead.
* @see @ref type()
* @todo move this to LightType outside of the class for consistency
*/ */
enum class Type: UnsignedByte { typedef CORRADE_DEPRECATED("use LightType instead") LightType Type;
/* Zero reserved for an invalid value */ #endif
/**
* Ambient light, without any position, direction or attenuation.
* Meant to be added to ambient color in Phong workflows, has no
* use in physically based workflows.
* @m_since_latest
*/
Ambient = 1,
/**
* Light at a position that is infinitely far away, emitted in a
* direction of negative Z axis. The rotation is inherited from
* absolute object transformation; scale and position don't affect
* the light in any way. Because the light is at infinite distance,
* it's not attenuated in any way.
* @m_since_latest
*/
Directional,
#ifdef MAGNUM_BUILD_DEPRECATED
/**
* Directional light.
* @m_deprecated_since_latest Use @ref Type::Directional instead.
*/
Infinite CORRADE_DEPRECATED_ENUM("use Type::Directional instead") = Directional,
#endif
/**
* Point light, emitting light in all directions. The position is
* inherited from absolute object transformation; scale and
* rotation don't affect the light in any way. Brightness
* attenuates depending on the @ref range() value.
*/
Point,
/**
* Spot light, emitting light in a cone in direction of local
* negative Z axis. The position and rotation is inherited from
* absolute object transformation; scale doesn't affect the light
* in any way. The angle and falloff of the cone is defined using
* @ref innerConeAngle() and @ref outerConeAngle() and brightness
* attenuates depending on the @ref range() value.
*/
Spot
};
/** /**
* @brief Constructor * @brief Constructor
@ -178,35 +190,37 @@ class MAGNUM_TRADE_EXPORT LightData {
* @param intensity Light intensity * @param intensity Light intensity
* @param attenuation Constant, linear and quadratic light * @param attenuation Constant, linear and quadratic light
* attenuation factor. Expected to be @cpp {1.0f, 0.0f, 0.0f} @ce * attenuation factor. Expected to be @cpp {1.0f, 0.0f, 0.0f} @ce
* for an @ref Type::Ambient and @ref Type::Directional light. * for an @ref LightType::Ambient and @ref LightType::Directional
* light.
* @param range Light range, after which the intensity is * @param range Light range, after which the intensity is
* considered to be zero. Expected to be @ref Constants::inf() for * considered to be zero. Expected to be @ref Constants::inf() for
* an @ref Type::Ambient and @ref Type::Directional light. * an @ref LightType::Ambient and @ref LightType::Directional
* light.
* @param innerConeAngle Inner cone angle. Expected to be greater * @param innerConeAngle Inner cone angle. Expected to be greater
* than or equal to @cpp 0.0_degf @ce and less than or equal to * than or equal to @cpp 0.0_degf @ce and less than or equal to
* @p outerConeAngle for a @ref Type::Spot light, * @p outerConeAngle for a @ref LightType::Spot light,
* @cpp 360.0_degf @ce otherwise. * @cpp 360.0_degf @ce otherwise.
* @param outerConeAngle Outer cone angle. Expected to be greater * @param outerConeAngle Outer cone angle. Expected to be greater
* than or equal to @p innerConeAngle and less than or equal to * than or equal to @p innerConeAngle and less than or equal to
* @cpp 360.0_degf @ce for a @ref Type::Spot light, * @cpp 360.0_degf @ce for a @ref LightType::Spot light,
* @cpp 360.0_degf @ce otherwise. * @cpp 360.0_degf @ce otherwise.
* @param importerState Importer-specific state * @param importerState Importer-specific state
* @m_since_latest * @m_since_latest
* *
* This is a combined constructor including both attenuation and range * This is a combined constructor including both attenuation and range
* parameters. Use @ref LightData(Type, const Color3&, Float, const Vector3&, Rad, Rad, const void*) * parameters. Use @ref LightData(LightType, const Color3&, Float, const Vector3&, Rad, Rad, const void*)
* for light data defined by just attenuation parameters and * for light data defined by just attenuation parameters and
* @ref LightData(Type, const Color3&, Float, Float, Rad, Rad, const void*) * @ref LightData(LightType, const Color3&, Float, Float, Rad, Rad, const void*)
* for light data defined by a range alone, and * for light data defined by a range alone, and
* @ref LightData(Type, const Color3&, Float, Rad, Rad, const void*) * @ref LightData(LightType, const Color3&, Float, Rad, Rad, const void*)
* for an implicit inverse square attenuation. See * for an implicit inverse square attenuation. See
* @ref Trade-LightData-attenuation for more information. * @ref Trade-LightData-attenuation for more information.
* *
* For lights other than spot it may be more convenient to use * For lights other than spot it may be more convenient to use
* @ref LightData(Type, const Color3&, Float, const Vector3&, Float, const void*) * @ref LightData(LightType, const Color3&, Float, const Vector3&, Float, const void*)
* and friends instead. * and friends instead.
*/ */
explicit LightData(Type type, const Color3& color, Float intensity, const Vector3& attenuation, Float range, Rad innerConeAngle, Rad outerConeAngle, const void* importerState = nullptr) noexcept; explicit LightData(LightType type, const Color3& color, Float intensity, const Vector3& attenuation, Float range, Rad innerConeAngle, Rad outerConeAngle, const void* importerState = nullptr) noexcept;
/** /**
* @brief Construct with implicit cone angles * @brief Construct with implicit cone angles
@ -215,29 +229,31 @@ class MAGNUM_TRADE_EXPORT LightData {
* @param intensity Light intensity * @param intensity Light intensity
* @param attenuation Constant, linear and quadratic light * @param attenuation Constant, linear and quadratic light
* attenuation factor. Expected to be @cpp {1.0f, 0.0f, 0.0f} @ce * attenuation factor. Expected to be @cpp {1.0f, 0.0f, 0.0f} @ce
* for an @ref Type::Ambient and @ref Type::Directional light. * for an @ref LightType::Ambient and @ref LightType::Directional
* light.
* @param range Light range, after which the intensity is * @param range Light range, after which the intensity is
* considered to be zero. Expected to be @ref Constants::inf() for * considered to be zero. Expected to be @ref Constants::inf() for
* an @ref Type::Ambient and @ref Type::Directional light. * an @ref LightType::Ambient and @ref LightType::Directional
* light.
* @param importerState Importer-specific state * @param importerState Importer-specific state
* @m_since_latest * @m_since_latest
* *
* This is a combined constructor including both attenuation and range * This is a combined constructor including both attenuation and range
* parameters. Use @ref LightData(Type, const Color3&, Float, const Vector3&, const void*) * parameters. Use @ref LightData(LightType, const Color3&, Float, const Vector3&, const void*)
* for light data defined by just attenuation parameters and * for light data defined by just attenuation parameters and
* @ref LightData(Type, const Color3&, Float, Float, const void*) for * @ref LightData(LightType, const Color3&, Float, Float, const void*)
* light data defined by a range alone, and * for light data defined by a range alone, and
* @ref LightData(Type, const Color3&, Float, const void*) for an * @ref LightData(LightType, const Color3&, Float, const void*) for an
* implicit inverse square attenuation. See * implicit inverse square attenuation. See
* @ref Trade-LightData-attenuation for more information. * @ref Trade-LightData-attenuation for more information.
* *
* For a @ref Type::Spot light, @ref innerConeAngle() is implicitly set * For a @ref LightType::Spot light, @ref innerConeAngle() is
* to @cpp 0.0_degf @ce and @ref outerConeAngle() to @cpp 90.0_degf @ce, * implicitly set to @cpp 0.0_degf @ce and @ref outerConeAngle() to
* and both are @cpp 360.0_degf @ce otherwise. Use * @cpp 90.0_degf @ce, and both are @cpp 360.0_degf @ce otherwise. Use
* @ref LightData(Type, const Color3&, Float, const Vector3&, Float, Rad, Rad, const void*) * @ref LightData(LightType, const Color3&, Float, const Vector3&, Float, Rad, Rad, const void*)
* in order to specify cone angles as well. * in order to specify cone angles as well.
*/ */
explicit LightData(Type type, const Color3& color, Float intensity, const Vector3& attenuation, Float range, const void* importerState = nullptr) noexcept; explicit LightData(LightType type, const Color3& color, Float intensity, const Vector3& attenuation, Float range, const void* importerState = nullptr) noexcept;
/** /**
* @brief Construct attenuation-based light data * @brief Construct attenuation-based light data
@ -246,14 +262,15 @@ class MAGNUM_TRADE_EXPORT LightData {
* @param intensity Light intensity * @param intensity Light intensity
* @param attenuation Constant, linear and quadratic light * @param attenuation Constant, linear and quadratic light
* attenuation factor. Expected to be @cpp {1.0f, 0.0f, 0.0f} @ce * attenuation factor. Expected to be @cpp {1.0f, 0.0f, 0.0f} @ce
* for an @ref Type::Ambient and @ref Type::Directional light. * for an @ref LightType::Ambient and @ref LightType::Directional
* light.
* @param innerConeAngle Inner cone angle. Expected to be greater * @param innerConeAngle Inner cone angle. Expected to be greater
* than or equal to @cpp 0.0_degf @ce and less than or equal to * than or equal to @cpp 0.0_degf @ce and less than or equal to
* @p outerConeAngle for a @ref Type::Spot light, * @p outerConeAngle for a @ref LightType::Spot light,
* @cpp 360.0_degf @ce otherwise. * @cpp 360.0_degf @ce otherwise.
* @param outerConeAngle Inner cone angle. Expected to be greater * @param outerConeAngle Inner cone angle. Expected to be greater
* than or equal to @p innerConeAngle and less than or equal to * than or equal to @p innerConeAngle and less than or equal to
* @cpp 360.0_degf @ce for a @ref Type::Spot light, * @cpp 360.0_degf @ce for a @ref LightType::Spot light,
* @cpp 360.0_degf @ce otherwise. * @cpp 360.0_degf @ce otherwise.
* @param importerState Importer-specific state * @param importerState Importer-specific state
* @m_since_latest * @m_since_latest
@ -262,10 +279,10 @@ class MAGNUM_TRADE_EXPORT LightData {
* @ref Trade-LightData-attenuation for more information. * @ref Trade-LightData-attenuation for more information.
* *
* For lights other than spot it may be more convenient to use * For lights other than spot it may be more convenient to use
* @ref LightData(Type, const Color3&, Float, const Vector3&, const void*) * @ref LightData(LightType, const Color3&, Float, const Vector3&, const void*)
* instead. * instead.
*/ */
explicit LightData(Type type, const Color3& color, Float intensity, const Vector3& attenuation, Rad innerConeAngle, Rad outerConeAngle, const void* importerState = nullptr) noexcept; explicit LightData(LightType type, const Color3& color, Float intensity, const Vector3& attenuation, Rad innerConeAngle, Rad outerConeAngle, const void* importerState = nullptr) noexcept;
/** /**
* @brief Construct attenuation-based light data with implicit cone angles * @brief Construct attenuation-based light data with implicit cone angles
@ -274,20 +291,21 @@ class MAGNUM_TRADE_EXPORT LightData {
* @param intensity Light intensity * @param intensity Light intensity
* @param attenuation Constant, linear and quadratic light * @param attenuation Constant, linear and quadratic light
* attenuation factor. Expected to be @cpp {1.0f, 0.0f, 0.0f} @ce * attenuation factor. Expected to be @cpp {1.0f, 0.0f, 0.0f} @ce
* for an @ref Type::Ambient and @ref Type::Directional light. * for an @ref LightType::Ambient and @ref LightType::Directional
* light.
* @param importerState Importer-specific state * @param importerState Importer-specific state
* @m_since_latest * @m_since_latest
* *
* The @ref range() is implicitly set to @ref Constants::inf(). See * The @ref range() is implicitly set to @ref Constants::inf(). See
* @ref Trade-LightData-attenuation for more information. * @ref Trade-LightData-attenuation for more information.
* *
* For a @ref Type::Spot light, @ref innerConeAngle() is implicitly set * For a @ref LightType::Spot light, @ref innerConeAngle() is
* to @cpp 0.0_degf @ce and @ref outerConeAngle() to @cpp 90.0_degf @ce, * implicitly set to @cpp 0.0_degf @ce and @ref outerConeAngle() to
* and both are @cpp 360.0_degf @ce otherwise. Use * @cpp 90.0_degf @ce, and both are @cpp 360.0_degf @ce otherwise. Use
* @ref LightData(Type, const Color3&, Float, const Vector3&, Rad, Rad, const void*) * @ref LightData(LightType, const Color3&, Float, const Vector3&, Rad, Rad, const void*)
* in order to specify cone angles as well. * in order to specify cone angles as well.
*/ */
explicit LightData(Type type, const Color3& color, Float intensity, const Vector3& attenuation, const void* importerState = nullptr) noexcept; explicit LightData(LightType type, const Color3& color, Float intensity, const Vector3& attenuation, const void* importerState = nullptr) noexcept;
/** /**
* @brief Construct range-based light data * @brief Construct range-based light data
@ -296,29 +314,30 @@ class MAGNUM_TRADE_EXPORT LightData {
* @param intensity Light intensity * @param intensity Light intensity
* @param range Light range, after which the intensity is * @param range Light range, after which the intensity is
* considered to be zero. Expected to be @ref Constants::inf() for * considered to be zero. Expected to be @ref Constants::inf() for
* an @ref Type::Ambient and @ref Type::Directional light. * an @ref LightType::Ambient and @ref LightType::Directional
* light.
* @param innerConeAngle Inner cone angle. Expected to be greater * @param innerConeAngle Inner cone angle. Expected to be greater
* than or equal to @cpp 0.0_degf @ce and less than or equal to * than or equal to @cpp 0.0_degf @ce and less than or equal to
* @p outerConeAngle for a @ref Type::Spot light, * @p outerConeAngle for a @ref LightType::Spot light,
* @cpp 360.0_degf @ce otherwise. * @cpp 360.0_degf @ce otherwise.
* @param outerConeAngle Outer cone angle. Expected to be greater * @param outerConeAngle Outer cone angle. Expected to be greater
* than or equal to @p innerConeAngle and less than or equal to * than or equal to @p innerConeAngle and less than or equal to
* @cpp 360.0_degf @ce for a @ref Type::Spot light, * @cpp 360.0_degf @ce for a @ref LightType::Spot light,
* @cpp 360.0_degf @ce otherwise. * @cpp 360.0_degf @ce otherwise.
* @param importerState Importer-specific state * @param importerState Importer-specific state
* @m_since_latest * @m_since_latest
* *
* The @ref attenuation() is implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce * The @ref attenuation() is implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce
* for a @ref Type::Point and @ref Type::Spot light and to * for a @ref LightType::Point and @ref LightType::Spot light and to
* @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref Type::Ambient and * @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref LightType::Ambient and
* @ref Type::Directional light. See @ref Trade-LightData-attenuation * @ref LightType::Directional light. See
* for more information. * @ref Trade-LightData-attenuation for more information.
* *
* For lights other than spot it may be more convenient to use * For lights other than spot it may be more convenient to use
* @ref LightData(Type, const Color3&, Float, Float, const void*) * @ref LightData(LightType, const Color3&, Float, Float, const void*)
* instead. * instead.
*/ */
explicit LightData(Type type, const Color3& color, Float intensity, Float range, Rad innerConeAngle, Rad outerConeAngle, const void* importerState = nullptr) noexcept; explicit LightData(LightType type, const Color3& color, Float intensity, Float range, Rad innerConeAngle, Rad outerConeAngle, const void* importerState = nullptr) noexcept;
/** /**
* @brief Construct range-based light data with implicit cone angles * @brief Construct range-based light data with implicit cone angles
@ -327,23 +346,24 @@ class MAGNUM_TRADE_EXPORT LightData {
* @param intensity Light intensity * @param intensity Light intensity
* @param range Light range, after which the intensity is * @param range Light range, after which the intensity is
* considered to be zero. Expected to be @ref Constants::inf() for * considered to be zero. Expected to be @ref Constants::inf() for
* an @ref Type::Ambient and @ref Type::Directional light. * an @ref LightType::Ambient and @ref LightType::Directional
* light.
* @param importerState Importer-specific state * @param importerState Importer-specific state
* @m_since_latest * @m_since_latest
* *
* The @ref attenuation() is implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce * The @ref attenuation() is implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce
* for a @ref Type::Point and @ref Type::Spot light and to * for a @ref LightType::Point and @ref LightType::Spot light and to
* @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref Type::Ambient and * @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref LightType::Ambient and
* @ref Type::Directional light. See @ref Trade-LightData-attenuation * @ref LightType::Directional light. See
* for more information. * @ref Trade-LightData-attenuation for more information.
* *
* For a @ref Type::Spot light, @ref innerConeAngle() is implicitly set * For a @ref LightType::Spot light, @ref innerConeAngle() is
* to @cpp 0.0_degf @ce and @ref outerConeAngle() to @cpp 90.0_degf @ce, * implicitly set to @cpp 0.0_degf @ce and @ref outerConeAngle() to
* and both are @cpp 360.0_degf @ce otherwise. Use * @cpp 90.0_degf @ce, and both are @cpp 360.0_degf @ce otherwise. Use
* @ref LightData(Type, const Color3&, Float, Float, Rad, Rad, const void*) * @ref LightData(LightType, const Color3&, Float, Float, Rad, Rad, const void*)
* in order to specify cone angles as well. * in order to specify cone angles as well.
*/ */
explicit LightData(Type type, const Color3& color, Float intensity, Float range, const void* importerState = nullptr) noexcept; explicit LightData(LightType type, const Color3& color, Float intensity, Float range, const void* importerState = nullptr) noexcept;
/** /**
* @brief Construct light data with implicit attenuation * @brief Construct light data with implicit attenuation
@ -352,26 +372,27 @@ class MAGNUM_TRADE_EXPORT LightData {
* @param intensity Light intensity * @param intensity Light intensity
* @param innerConeAngle Inner cone angle. Expected to be greater * @param innerConeAngle Inner cone angle. Expected to be greater
* than or equal to @cpp 0.0_degf @ce and less than or equal to * than or equal to @cpp 0.0_degf @ce and less than or equal to
* @p outerConeAngle for a @ref Type::Spot light, * @p outerConeAngle for a @ref LightType::Spot light,
* @cpp 360.0_degf @ce otherwise. * @cpp 360.0_degf @ce otherwise.
* @param outerConeAngle Outer cone angle. Expected to be greater * @param outerConeAngle Outer cone angle. Expected to be greater
* than or equal to @p innerConeAngle and less than or equal to * than or equal to @p innerConeAngle and less than or equal to
* @cpp 360.0_degf @ce for a @ref Type::Spot light, * @cpp 360.0_degf @ce for a @ref LightType::Spot light,
* @cpp 360.0_degf @ce otherwise. * @cpp 360.0_degf @ce otherwise.
* @param importerState Importer-specific state * @param importerState Importer-specific state
* @m_since_latest * @m_since_latest
* *
* The @ref attenuation() is implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce * The @ref attenuation() is implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce
* for a @ref Type::Point and @ref Type::Spot light and to * for a @ref LightType::Point and @ref LightType::Spot light and to
* @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref Type::Ambient and * @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref LightType::Ambient and
* @ref Type::Directional light; @ref range() is always * @ref LightType::Directional light; @ref range() is always
* @ref Constants::inf(). See @ref Trade-LightData-attenuation for more * @ref Constants::inf(). See @ref Trade-LightData-attenuation for more
* information. * information.
* *
* For lights other than spot it may be more convenient to use * For lights other than spot it may be more convenient to use
* @ref LightData(Type, const Color3&, Float, const void*) instead. * @ref LightData(LightType, const Color3&, Float, const void*)
* instead.
*/ */
explicit LightData(Type type, const Color3& color, Float intensity, Rad innerConeAngle, Rad outerConeAngle, const void* importerState = nullptr) noexcept; explicit LightData(LightType type, const Color3& color, Float intensity, Rad innerConeAngle, Rad outerConeAngle, const void* importerState = nullptr) noexcept;
/** /**
* @brief Construct light data with implicit attenuation and cone angles * @brief Construct light data with implicit attenuation and cone angles
@ -381,19 +402,19 @@ class MAGNUM_TRADE_EXPORT LightData {
* @param importerState Importer-specific state * @param importerState Importer-specific state
* *
* The @ref attenuation() is implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce * The @ref attenuation() is implicitly set to @cpp {1.0f, 0.0f, 1.0f} @ce
* for a @ref Type::Point and @ref Type::Spot light and to * for a @ref LightType::Point and @ref LightType::Spot light and to
* @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref Type::Ambient and * @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref LightType::Ambient and
* @ref Type::Directional light; @ref range() is always * @ref LightType::Directional light; @ref range() is always
* @ref Constants::inf(). See @ref Trade-LightData-attenuation for more * @ref Constants::inf(). See @ref Trade-LightData-attenuation for more
* information. * information.
* *
* For a @ref Type::Spot light, @ref innerConeAngle() is implicitly set * For a @ref LightType::Spot light, @ref innerConeAngle() is
* to @cpp 0.0_degf @ce and @ref outerConeAngle() to @cpp 90.0_degf @ce, * implicitly set to @cpp 0.0_degf @ce and @ref outerConeAngle() to
* and both are @cpp 360.0_degf @ce otherwise. Use * @cpp 90.0_degf @ce, and both are @cpp 360.0_degf @ce otherwise. Use
* @ref LightData(Type, const Color3&, Float, Rad, Rad, const void*) in * @ref LightData(LightType, const Color3&, Float, Rad, Rad, const void*)
* order to specify cone angles as well. * in order to specify cone angles as well.
*/ */
explicit LightData(Type type, const Color3& color, Float intensity, const void* importerState = nullptr) noexcept; explicit LightData(LightType type, const Color3& color, Float intensity, const void* importerState = nullptr) noexcept;
/** @brief Copying is not allowed */ /** @brief Copying is not allowed */
LightData(const LightData&) = delete; LightData(const LightData&) = delete;
@ -408,7 +429,7 @@ class MAGNUM_TRADE_EXPORT LightData {
LightData& operator=(LightData&&) noexcept = default; LightData& operator=(LightData&&) noexcept = default;
/** @brief Light type */ /** @brief Light type */
Type type() const { return _type; } LightType type() const { return _type; }
/** @brief Light color */ /** @brief Light color */
Color3 color() const { return _color; } Color3 color() const { return _color; }
@ -416,9 +437,9 @@ class MAGNUM_TRADE_EXPORT LightData {
/** /**
* @brief Light intensity * @brief Light intensity
* *
* Defined in *candela* (lm/sr) for @ref Type::Point and * Defined in *candela* (lm/sr) for @ref LightType::Point and
* @ref Type::Spot, and in *lux* (lm/m<sup>2</sup>) for * @ref LightType::Spot, and in *lux* (lm/m<sup>2</sup>) for
* @ref Type::Directional. * @ref LightType::Directional.
*/ */
Float intensity() const { return _intensity; } Float intensity() const { return _intensity; }
@ -429,11 +450,11 @@ class MAGNUM_TRADE_EXPORT LightData {
* Values of @f$ \color{m-success} K_c @f$, * Values of @f$ \color{m-success} K_c @f$,
* @f$ \color{m-success} K_l @f$ and @f$ \color{m-success} K_q @f$ in * @f$ \color{m-success} K_l @f$ and @f$ \color{m-success} K_q @f$ in
* the @ref Trade-LightData-attenuation "attenuation equation". Always * the @ref Trade-LightData-attenuation "attenuation equation". Always
* @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref Type::Ambient and * @cpp {1.0f, 0.0f, 0.0f} @ce for an @ref LightType::Ambient and
* @ref Type::Directional light, set to @cpp {1.0f, 0.0f, 1.0f} @ce for * @ref LightType::Directional light, set to
* range-based attenuation --- and if @ref range() is * @cpp {1.0f, 0.0f, 1.0f} @ce for range-based attenuation --- and if
* @ref Constants::inf() as well, the attenuation equation is simply * @ref range() is @ref Constants::inf() as well, the attenuation
* @f$ F_{att} = \frac{1}{1 + d^2} @f$. * equation is simply @f$ F_{att} = \frac{1}{1 + d^2} @f$.
*/ */
Vector3 attenuation() const { return _attenuation; } Vector3 attenuation() const { return _attenuation; }
@ -450,7 +471,8 @@ class MAGNUM_TRADE_EXPORT LightData {
* - if @ref attenuation() is @cpp {1.0f, 0.0f, 0.0f} @ce, the * - if @ref attenuation() is @cpp {1.0f, 0.0f, 0.0f} @ce, the
* attenuation equation is @f$ F_{att} = 1 @f$. * attenuation equation is @f$ F_{att} = 1 @f$.
* *
* The latter is always the case for a @ref Type::Directional light. * The latter is always the case for a @ref LightType::Directional
* light.
*/ */
Float range() const { return _range; } Float range() const { return _range; }
@ -458,9 +480,9 @@ class MAGNUM_TRADE_EXPORT LightData {
* @brief Inner cone angle * @brief Inner cone angle
* @m_since_latest * @m_since_latest
* *
* For a @ref Type::Spot light, it's always less than * For a @ref LightType::Spot light, it's always less than
* @ref outerConeAngle(). For a @ref Type::Directional or * @ref outerConeAngle(). For a @ref LightType::Directional or
* @ref Type::Point light it's always @cpp 360.0_degf @ce. * @ref LightType::Point light it's always @cpp 360.0_degf @ce.
*/ */
Rad innerConeAngle() const { return _innerConeAngle; } Rad innerConeAngle() const { return _innerConeAngle; }
@ -468,10 +490,10 @@ class MAGNUM_TRADE_EXPORT LightData {
* @brief Outer cone angle * @brief Outer cone angle
* @m_since_latest * @m_since_latest
* *
* For a @ref Type::Spot light, it's always greater than * For a @ref LightType::Spot light, it's always greater than
* @ref outerConeAngle() and less than or equal to @cpp 90.0_degf @ce. * @ref outerConeAngle() and less than or equal to @cpp 90.0_degf @ce.
* For a @ref Type::Directional or @ref Type::Point light it's always * For a @ref LightType::Directional or @ref LightType::Point light
* @cpp 360.0_degf @ce. * it's always @cpp 360.0_degf @ce.
*/ */
Rad outerConeAngle() const { return _outerConeAngle; } Rad outerConeAngle() const { return _outerConeAngle; }
@ -483,7 +505,7 @@ class MAGNUM_TRADE_EXPORT LightData {
const void* importerState() const { return _importerState; } const void* importerState() const { return _importerState; }
private: private:
Type _type; LightType _type;
Vector3 _color; Vector3 _color;
Float _intensity; Float _intensity;
Vector3 _attenuation; Vector3 _attenuation;
@ -492,9 +514,6 @@ class MAGNUM_TRADE_EXPORT LightData {
const void* _importerState; const void* _importerState;
}; };
/** @debugoperatorclassenum{LightData,LightData::Type} */
MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, LightData::Type value);
}} }}
#endif #endif

20
src/Magnum/Trade/Test/AbstractSceneConverterTest.cpp

@ -1080,7 +1080,7 @@ void AbstractSceneConverterTest::thingNotSupported() {
converter.setDefaultScene(0); converter.setDefaultScene(0);
converter.add(AnimationData{nullptr, nullptr}); converter.add(AnimationData{nullptr, nullptr});
converter.add(LightData{LightData::Type::Point, {}, 0.0f}); converter.add(LightData{LightType::Point, {}, 0.0f});
converter.add(CameraData{CameraType::Orthographic3D, {}, 0.0f, 1.0f}); converter.add(CameraData{CameraType::Orthographic3D, {}, 0.0f, 1.0f});
converter.add(SkinData2D{nullptr, nullptr}); converter.add(SkinData2D{nullptr, nullptr});
converter.add(SkinData3D{nullptr, nullptr}); converter.add(SkinData3D{nullptr, nullptr});
@ -2584,7 +2584,7 @@ void AbstractSceneConverterTest::thingNoBegin() {
converter.add(AnimationData{nullptr, nullptr}); converter.add(AnimationData{nullptr, nullptr});
converter.lightCount(); converter.lightCount();
converter.add(LightData{LightData::Type::Point, {}, 0.0f}); converter.add(LightData{LightType::Point, {}, 0.0f});
converter.cameraCount(); converter.cameraCount();
converter.add(CameraData{CameraType::Orthographic3D, {}, 0.0f, 1.0f}); converter.add(CameraData{CameraType::Orthographic3D, {}, 0.0f, 1.0f});
@ -3106,10 +3106,10 @@ void AbstractSceneConverterTest::addLight() {
CORRADE_VERIFY(converter.begin()); CORRADE_VERIFY(converter.begin());
CORRADE_COMPARE(converter.lightCount(), 0); CORRADE_COMPARE(converter.lightCount(), 0);
CORRADE_COMPARE(converter.add(LightData{LightData::Type::Point, {}, 0.0f, reinterpret_cast<const void*>(0xdeadbeef)}, "hello"), 0); CORRADE_COMPARE(converter.add(LightData{LightType::Point, {}, 0.0f, reinterpret_cast<const void*>(0xdeadbeef)}, "hello"), 0);
CORRADE_VERIFY(converter.addCalled); CORRADE_VERIFY(converter.addCalled);
CORRADE_COMPARE(converter.lightCount(), 1); CORRADE_COMPARE(converter.lightCount(), 1);
CORRADE_COMPARE(converter.add(LightData{LightData::Type::Point, {}, 0.0f, reinterpret_cast<const void*>(0xdeadbeef)}, "hello"), 1); CORRADE_COMPARE(converter.add(LightData{LightType::Point, {}, 0.0f, reinterpret_cast<const void*>(0xdeadbeef)}, "hello"), 1);
CORRADE_COMPARE(converter.lightCount(), 2); CORRADE_COMPARE(converter.lightCount(), 2);
} }
@ -3134,7 +3134,7 @@ void AbstractSceneConverterTest::addLightFailed() {
{ {
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
CORRADE_VERIFY(!converter.add(LightData{LightData::Type::Point, {}, 0.0f})); CORRADE_VERIFY(!converter.add(LightData{LightType::Point, {}, 0.0f}));
CORRADE_COMPARE(out.str(), ""); CORRADE_COMPARE(out.str(), "");
} }
@ -3159,7 +3159,7 @@ void AbstractSceneConverterTest::addLightNotImplemented() {
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
converter.add(LightData{LightData::Type::Point, {}, 0.0f}); converter.add(LightData{LightType::Point, {}, 0.0f});
CORRADE_COMPARE(out.str(), "Trade::AbstractSceneConverter::add(): light conversion advertised but not implemented\n"); CORRADE_COMPARE(out.str(), "Trade::AbstractSceneConverter::add(): light conversion advertised but not implemented\n");
} }
@ -5926,7 +5926,7 @@ void AbstractSceneConverterTest::addImporterContents() {
return Utility::format("Light {}", id); return Utility::format("Light {}", id);
} }
Containers::Optional<LightData> doLight(UnsignedInt id) override { Containers::Optional<LightData> doLight(UnsignedInt id) override {
return LightData{LightData::Type::Point, {}, {}, reinterpret_cast<const void*>(0x11600000 + id)}; return LightData{LightType::Point, {}, {}, reinterpret_cast<const void*>(0x11600000 + id)};
} }
UnsignedInt doCameraCount() const override { UnsignedInt doCameraCount() const override {
@ -6355,7 +6355,7 @@ void AbstractSceneConverterTest::addImporterContentsImportFail() {
} }
Containers::Optional<LightData> doLight(UnsignedInt id) override { Containers::Optional<LightData> doLight(UnsignedInt id) override {
if(id == 2) return {}; if(id == 2) return {};
return LightData{LightData::Type::Point, {}, {}}; return LightData{LightType::Point, {}, {}};
} }
UnsignedInt doCameraCount() const override { UnsignedInt doCameraCount() const override {
@ -6597,7 +6597,7 @@ void AbstractSceneConverterTest::addImporterContentsConversionFail() {
return 4; return 4;
} }
Containers::Optional<LightData> doLight(UnsignedInt) override { Containers::Optional<LightData> doLight(UnsignedInt) override {
return LightData{LightData::Type::Point, {}, {}}; return LightData{LightType::Point, {}, {}};
} }
UnsignedInt doCameraCount() const override { UnsignedInt doCameraCount() const override {
@ -7160,7 +7160,7 @@ void AbstractSceneConverterTest::addSupportedImporterContents() {
UnsignedInt doLightCount() const override { return 4; } UnsignedInt doLightCount() const override { return 4; }
Containers::Optional<LightData> doLight(UnsignedInt) override { Containers::Optional<LightData> doLight(UnsignedInt) override {
return LightData{LightData::Type::Point, {}, {}}; return LightData{LightType::Point, {}, {}};
} }
UnsignedInt doCameraCount() const override { return 5; } UnsignedInt doCameraCount() const override { return 5; }

96
src/Magnum/Trade/Test/LightDataTest.cpp

@ -53,35 +53,35 @@ using namespace Math::Literals;
const struct { const struct {
const char* name; const char* name;
LightData::Type type; LightType type;
Vector3 attenuation; Vector3 attenuation;
Float range; Float range;
Rad innerConeAngle; Rad innerConeAngle;
Rad outerConeAngle; Rad outerConeAngle;
const char* message; const char* message;
} ConstructInvalidData[] { } ConstructInvalidData[] {
{"invalid ambient attenuation", LightData::Type::Ambient, {"invalid ambient attenuation", LightType::Ambient,
{1.0f, 0.0f, 1.0f}, Constants::inf(), 360.0_degf, 360.0_degf, {1.0f, 0.0f, 1.0f}, Constants::inf(), 360.0_degf, 360.0_degf,
"attenuation has to be (1, 0, 0) for an ambient or directional light but got Vector(1, 0, 1)"}, "attenuation has to be (1, 0, 0) for an ambient or directional light but got Vector(1, 0, 1)"},
{"invalid directional attenuation", LightData::Type::Directional, {"invalid directional attenuation", LightType::Directional,
{1.0f, 0.0f, 1.0f}, Constants::inf(), 360.0_degf, 360.0_degf, {1.0f, 0.0f, 1.0f}, Constants::inf(), 360.0_degf, 360.0_degf,
"attenuation has to be (1, 0, 0) for an ambient or directional light but got Vector(1, 0, 1)"}, "attenuation has to be (1, 0, 0) for an ambient or directional light but got Vector(1, 0, 1)"},
{"invalid ambient range", LightData::Type::Ambient, {"invalid ambient range", LightType::Ambient,
{1.0f, 0.0f, 0.0f}, 2.0f, 360.0_degf, 360.0_degf, {1.0f, 0.0f, 0.0f}, 2.0f, 360.0_degf, 360.0_degf,
"range has to be infinity for an ambient or directional light but got 2"}, "range has to be infinity for an ambient or directional light but got 2"},
{"invalid directional range", LightData::Type::Directional, {"invalid directional range", LightType::Directional,
{1.0f, 0.0f, 0.0f}, 2.0f, 360.0_degf, 360.0_degf, {1.0f, 0.0f, 0.0f}, 2.0f, 360.0_degf, 360.0_degf,
"range has to be infinity for an ambient or directional light but got 2"}, "range has to be infinity for an ambient or directional light but got 2"},
{"invalid point angles", LightData::Type::Point, {"invalid point angles", LightType::Point,
{1.0f, 0.0f, 1.0f}, Constants::inf(), 15.0_degf, 90.0_degf, {1.0f, 0.0f, 1.0f}, Constants::inf(), 15.0_degf, 90.0_degf,
"cone angles have to be 360° for lights that aren't spot but got Deg(15) and Deg(90)"}, "cone angles have to be 360° for lights that aren't spot but got Deg(15) and Deg(90)"},
{"negative inner spot angle", LightData::Type::Spot, {"negative inner spot angle", LightType::Spot,
{1.0f, 0.0f, 1.0f}, Constants::inf(), -1.0_degf, 90.0_degf, {1.0f, 0.0f, 1.0f}, Constants::inf(), -1.0_degf, 90.0_degf,
"spot light inner and outer cone angles have to be in range [0°, 360°] and inner not larger than outer but got Deg(-1) and Deg(90)"}, "spot light inner and outer cone angles have to be in range [0°, 360°] and inner not larger than outer but got Deg(-1) and Deg(90)"},
{"too big outer spot angle", LightData::Type::Spot, {"too big outer spot angle", LightType::Spot,
{1.0f, 0.0f, 1.0f}, Constants::inf(), 0.0_degf, 361.0_degf, {1.0f, 0.0f, 1.0f}, Constants::inf(), 0.0_degf, 361.0_degf,
"spot light inner and outer cone angles have to be in range [0°, 360°] and inner not larger than outer but got Deg(0) and Deg(361)"}, "spot light inner and outer cone angles have to be in range [0°, 360°] and inner not larger than outer but got Deg(0) and Deg(361)"},
{"inner spot angle larger than outer", LightData::Type::Spot, {"inner spot angle larger than outer", LightType::Spot,
{1.0f, 0.0f, 1.0f}, Constants::inf(), 35.0_degf, 30.0_degf, {1.0f, 0.0f, 1.0f}, Constants::inf(), 35.0_degf, 30.0_degf,
"spot light inner and outer cone angles have to be in range [0°, 360°] and inner not larger than outer but got Deg(35) and Deg(30)"} "spot light inner and outer cone angles have to be in range [0°, 360°] and inner not larger than outer but got Deg(35) and Deg(30)"}
}; };
@ -105,13 +105,13 @@ LightDataTest::LightDataTest() {
void LightDataTest::construct() { void LightDataTest::construct() {
{ {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Spot, LightData data{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
{0.1f, 0.5f, 0.7f}, 15.0f, {0.1f, 0.5f, 0.7f}, 15.0f,
15.0_degf, 35.0_degf, 15.0_degf, 35.0_degf,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Spot); CORRADE_COMPARE(data.type(), LightType::Spot);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f})); CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f}));
@ -123,12 +123,12 @@ void LightDataTest::construct() {
/* Implicit spot angles */ /* Implicit spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Spot, LightData data{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
{0.1f, 0.5f, 0.7f}, 15.0f, {0.1f, 0.5f, 0.7f}, 15.0f,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Spot); CORRADE_COMPARE(data.type(), LightType::Spot);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f})); CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f}));
@ -140,12 +140,12 @@ void LightDataTest::construct() {
/* Implicit non-spot angles */ /* Implicit non-spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Point, LightData data{LightType::Point,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
{0.1f, 0.5f, 0.7f}, 15.0f, {0.1f, 0.5f, 0.7f}, 15.0f,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Point); CORRADE_COMPARE(data.type(), LightType::Point);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f})); CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f}));
@ -160,13 +160,13 @@ void LightDataTest::constructAttenuation() {
/* Implicit range */ /* Implicit range */
{ {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Spot, LightData data{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
{0.1f, 0.5f, 0.7f}, {0.1f, 0.5f, 0.7f},
15.0_degf, 35.0_degf, 15.0_degf, 35.0_degf,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Spot); CORRADE_COMPARE(data.type(), LightType::Spot);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f})); CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f}));
@ -178,12 +178,12 @@ void LightDataTest::constructAttenuation() {
/* Implicit range + spot angles */ /* Implicit range + spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Spot, LightData data{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
{0.1f, 0.5f, 0.7f}, {0.1f, 0.5f, 0.7f},
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Spot); CORRADE_COMPARE(data.type(), LightType::Spot);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f})); CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f}));
@ -195,12 +195,12 @@ void LightDataTest::constructAttenuation() {
/* Implicit range + non-spot angles */ /* Implicit range + non-spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Point, LightData data{LightType::Point,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
{0.1f, 0.5f, 0.7f}, {0.1f, 0.5f, 0.7f},
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Point); CORRADE_COMPARE(data.type(), LightType::Point);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f})); CORRADE_COMPARE(data.attenuation(), (Vector3{0.1f, 0.5f, 0.7f}));
@ -215,13 +215,13 @@ void LightDataTest::constructRange() {
/* Implicit attenuation for a spot */ /* Implicit attenuation for a spot */
{ {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Spot, LightData data{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
15.0f, 15.0f,
15.0_degf, 35.0_degf, 15.0_degf, 35.0_degf,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Spot); CORRADE_COMPARE(data.type(), LightType::Spot);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f}));
@ -233,12 +233,12 @@ void LightDataTest::constructRange() {
/* Implicit attenuation for a spot + spot angles */ /* Implicit attenuation for a spot + spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Spot, LightData data{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
15.0f, 15.0f,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Spot); CORRADE_COMPARE(data.type(), LightType::Spot);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f}));
@ -250,12 +250,12 @@ void LightDataTest::constructRange() {
/* Implicit attenuation for a point + non-spot angles */ /* Implicit attenuation for a point + non-spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Point, LightData data{LightType::Point,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
15.0f, 15.0f,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Point); CORRADE_COMPARE(data.type(), LightType::Point);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f}));
@ -267,12 +267,12 @@ void LightDataTest::constructRange() {
/* Implicit attenuation for an ambient + non-spot angles */ /* Implicit attenuation for an ambient + non-spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Ambient, LightData data{LightType::Ambient,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
Constants::inf(), Constants::inf(),
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Ambient); CORRADE_COMPARE(data.type(), LightType::Ambient);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 0.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 0.0f}));
@ -284,12 +284,12 @@ void LightDataTest::constructRange() {
/* Implicit attenuation for a directional + non-spot angles */ /* Implicit attenuation for a directional + non-spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Directional, LightData data{LightType::Directional,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
Constants::inf(), Constants::inf(),
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Directional); CORRADE_COMPARE(data.type(), LightType::Directional);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 0.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 0.0f}));
@ -304,12 +304,12 @@ void LightDataTest::constructNone() {
/* Implicit attenuation + range for a spot */ /* Implicit attenuation + range for a spot */
{ {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Spot, LightData data{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
15.0_degf, 35.0_degf, 15.0_degf, 35.0_degf,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Spot); CORRADE_COMPARE(data.type(), LightType::Spot);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f}));
@ -321,11 +321,11 @@ void LightDataTest::constructNone() {
/* Implicit attenuation + range for a spot + spot angles */ /* Implicit attenuation + range for a spot + spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Spot, LightData data{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Spot); CORRADE_COMPARE(data.type(), LightType::Spot);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f}));
@ -337,11 +337,11 @@ void LightDataTest::constructNone() {
/* Implicit attenuation + range for a point + non-spot angles */ /* Implicit attenuation + range for a point + non-spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Point, LightData data{LightType::Point,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Point); CORRADE_COMPARE(data.type(), LightType::Point);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 1.0f}));
@ -353,11 +353,11 @@ void LightDataTest::constructNone() {
/* Implicit attenuation for an ambient + non-spot angles */ /* Implicit attenuation for an ambient + non-spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Ambient, LightData data{LightType::Ambient,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Ambient); CORRADE_COMPARE(data.type(), LightType::Ambient);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 0.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 0.0f}));
@ -369,11 +369,11 @@ void LightDataTest::constructNone() {
/* Implicit attenuation for a directional + non-spot angles */ /* Implicit attenuation for a directional + non-spot angles */
} { } {
int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int a{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData data{LightData::Type::Directional, LightData data{LightType::Directional,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
&a}; &a};
CORRADE_COMPARE(data.type(), LightData::Type::Directional); CORRADE_COMPARE(data.type(), LightType::Directional);
CORRADE_COMPARE(data.color(), 0xccff33_rgbf); CORRADE_COMPARE(data.color(), 0xccff33_rgbf);
CORRADE_COMPARE(data.intensity(), 0.8f); CORRADE_COMPARE(data.intensity(), 0.8f);
CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 0.0f})); CORRADE_COMPARE(data.attenuation(), (Vector3{1.0f, 0.0f, 0.0f}));
@ -403,14 +403,14 @@ void LightDataTest::constructCopy() {
void LightDataTest::constructMove() { void LightDataTest::constructMove() {
int state{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */ int state{}; /* GCC 11 complains that "maybe uninitialized" w/o the {} */
LightData a{LightData::Type::Spot, LightData a{LightType::Spot,
0xccff33_rgbf, 0.8f, 0xccff33_rgbf, 0.8f,
{0.1f, 0.5f, 0.7f}, 15.0f, {0.1f, 0.5f, 0.7f}, 15.0f,
15.0_degf, 35.0_degf, 15.0_degf, 35.0_degf,
&state}; &state};
LightData b{std::move(a)}; LightData b{std::move(a)};
CORRADE_COMPARE(b.type(), LightData::Type::Spot); CORRADE_COMPARE(b.type(), LightType::Spot);
CORRADE_COMPARE(b.color(), 0xccff33_rgbf); CORRADE_COMPARE(b.color(), 0xccff33_rgbf);
CORRADE_COMPARE(b.intensity(), 0.8f); CORRADE_COMPARE(b.intensity(), 0.8f);
CORRADE_COMPARE(b.attenuation(), (Vector3{0.1f, 0.5f, 0.7f})); CORRADE_COMPARE(b.attenuation(), (Vector3{0.1f, 0.5f, 0.7f}));
@ -421,7 +421,7 @@ void LightDataTest::constructMove() {
LightData c{{}, {}, {}}; LightData c{{}, {}, {}};
c = std::move(a); c = std::move(a);
CORRADE_COMPARE(c.type(), LightData::Type::Spot); CORRADE_COMPARE(c.type(), LightType::Spot);
CORRADE_COMPARE(c.color(), 0xccff33_rgbf); CORRADE_COMPARE(c.color(), 0xccff33_rgbf);
CORRADE_COMPARE(c.intensity(), 0.8f); CORRADE_COMPARE(c.intensity(), 0.8f);
CORRADE_COMPARE(c.attenuation(), (Vector3{0.1f, 0.5f, 0.7f})); CORRADE_COMPARE(c.attenuation(), (Vector3{0.1f, 0.5f, 0.7f}));
@ -437,15 +437,15 @@ void LightDataTest::constructMove() {
void LightDataTest::debugType() { void LightDataTest::debugType() {
std::ostringstream out; std::ostringstream out;
Debug(&out) << LightData::Type::Spot << LightData::Type(0xbe); Debug(&out) << LightType::Spot << LightType(0xbe);
CORRADE_COMPARE(out.str(), "Trade::LightData::Type::Spot Trade::LightData::Type(0xbe)\n"); CORRADE_COMPARE(out.str(), "Trade::LightType::Spot Trade::LightType(0xbe)\n");
} }
void LightDataTest::debugTypePacked() { void LightDataTest::debugTypePacked() {
std::ostringstream out; std::ostringstream out;
/* Last is not packed, ones before should not make any flags persistent */ /* Last is not packed, ones before should not make any flags persistent */
Debug(&out) << Debug::packed << LightData::Type::Spot << Debug::packed << LightData::Type(0xbe) << LightData::Type::Ambient; Debug(&out) << Debug::packed << LightType::Spot << Debug::packed << LightType(0xbe) << LightType::Ambient;
CORRADE_COMPARE(out.str(), "Spot 0xbe Trade::LightData::Type::Ambient\n"); CORRADE_COMPARE(out.str(), "Spot 0xbe Trade::LightType::Ambient\n");
} }
}}}} }}}}

1
src/Magnum/Trade/Trade.h

@ -82,6 +82,7 @@ typedef ImageData<1> ImageData1D;
typedef ImageData<2> ImageData2D; typedef ImageData<2> ImageData2D;
typedef ImageData<3> ImageData3D; typedef ImageData<3> ImageData3D;
enum class LightType: UnsignedByte;
class LightData; class LightData;
enum class MeshAttribute: UnsignedShort; enum class MeshAttribute: UnsignedShort;

Loading…
Cancel
Save