#ifndef LIGHT_POSITIONAL_HPP
#define LIGHT_POSITIONAL_HPP
#include "Constants.hpp"
#include "LightNode.hpp"
#include "Transform.hpp"
namespace wren {
class PositionalLight : public LightNode {
public:
const glm::vec3 &position() const {
update();
return mPositionAbsolute;
}
float radius() const { return mRadius; }
float attenuationConstant() const { return mAttenuationConstant; }
float attenuationLinear() const { return mAttenuationLinear; }
float attenuationQuadratic() const { return mAttenuationQuadratic; }
void setAttenuation(float attenuationConstant, float attenuationLinear, float attenuationQuadratic);
virtual void setPosition(const glm::vec3 &position);
virtual void setRadius(float radius);
void setMatrixDirty() const override {
Node::setMatrixDirty();
mIsPositionDirty = true;
}
void update() const override {
if (!mIsPositionDirty)
return;
if (mParent)
mPositionAbsolute = mParent->position() + mParent->orientation() * (mParent->scale() * mPositionRelative);
else
mPositionAbsolute = mPositionRelative;
}
protected:
PositionalLight();
virtual ~PositionalLight() {}
private:
mutable bool mIsPositionDirty;
mutable glm::vec3 mPositionAbsolute;
glm::vec3 mPositionRelative;
float mRadius;
float mAttenuationConstant;
float mAttenuationLinear;
float mAttenuationQuadratic;
};
}
#endif