game-engine/include/myEngine/lighting.hpp

143 lines
No EOL
5.7 KiB
C++

#ifndef LIGHTING_HPP
#define LIGHTING_HPP
#include <glm/glm.hpp>
#include <myEngine/shader.hpp>
class Light {
private:
glm::vec3 color;
glm::vec3 ambient;
glm::vec3 diffuse;
glm::vec3 specular;
public:
Light(const glm::vec3& color, const glm::vec3& ambient, const glm::vec3& diffuse, const glm::vec3& specular)
: color(color), ambient(ambient), diffuse(diffuse), specular(specular) {}
glm::vec3 getColor() const { return color; }
glm::vec3 getAmbient() const { return ambient; }
glm::vec3 getDiffuse() const { return diffuse; }
glm::vec3 getSpecular() const { return specular; }
void setColor(const glm::vec3& newColor) { color = newColor; }
void setAmbient(const glm::vec3& newAmbient) { ambient = newAmbient; }
void setDiffuse(const glm::vec3& newDiffuse) { diffuse = newDiffuse; }
void setSpecular(const glm::vec3& newSpecular) { specular = newSpecular; }
virtual void use(Shader& shader) {}
};
class DirectLight : public Light {
private:
glm::vec3 direction;
public:
DirectLight(const glm::vec3& direction, const glm::vec3& color, const glm::vec3& ambient, const glm::vec3& diffuse, const glm::vec3& specular)
: direction(direction), Light(color, ambient, diffuse, specular) {}
glm::vec3 getDirection() const
{
return direction;
}
void setDirection(const glm::vec3& newDirection)
{
direction = newDirection;
}
void use(Shader& shader) override
{
shader.setVec3("dirLight.direction", direction);
shader.setVec3("dirLight.color", getColor());
shader.setVec3("dirLight.ambient", getAmbient());
shader.setVec3("dirLight.diffuse", getDiffuse());
shader.setVec3("dirLight.specular", getSpecular());
}
};
class SpotLight : public Light {
private:
glm::vec3 position;
glm::vec3 direction;
float cutOff;
float outerCutOff;
float constant;
float linear;
float quadratic;
public:
SpotLight(const glm::vec3& position, const glm::vec3& direction,
float cutOff, float outerCutOff,
const glm::vec3& color, const glm::vec3& ambient,
const glm::vec3& diffuse, const glm::vec3& specular,
float constant, float linear, float quadratic)
: position(position), direction(direction), cutOff(cutOff), outerCutOff(outerCutOff),
Light(color, ambient, diffuse, specular), constant(constant), linear(linear), quadratic(quadratic) {}
glm::vec3 getPosition() const { return position; }
glm::vec3 getDirection() const { return direction; }
float getCutOff() const { return cutOff; }
float getOuterCutOff() const { return outerCutOff; }
float getConstant() const { return constant; }
float getLinear() const { return linear; }
float getQuadratic() const { return quadratic; }
void setPosition(const glm::vec3& newPosition) { position = newPosition; }
void setDirection(const glm::vec3& newDirection) { direction = newDirection; }
void setCutOff(float newCutOff) { cutOff = newCutOff; }
void setOuterCutOff(float newOuterCutOff) { outerCutOff = newOuterCutOff; }
void setConstant(float newConstant) { constant = newConstant; }
void setLinear(float newLinear) { linear = newLinear; }
void setQuadratic(float newQuadratic) { quadratic = newQuadratic; }
void use(Shader& shader) override
{
shader.setVec3("spotLight.position", position);
shader.setVec3("spotLight.direction", direction);
shader.setFloat("spotLight.cutOff", glm::cos(glm::radians(cutOff)));
shader.setFloat("spotLight.outerCutOff", glm::cos(glm::radians(outerCutOff)));
shader.setVec3("spotLight.color", getColor());
shader.setVec3("spotLight.ambient", getAmbient());
shader.setVec3("spotLight.diffuse", getDiffuse());
shader.setVec3("spotLight.specular", getSpecular());
shader.setFloat("spotLight.constant", constant);
shader.setFloat("spotLight.linear", linear);
shader.setFloat("spotLight.quadratic", quadratic);
}
};
class PointLight : public Light {
private:
glm::vec3 position;
float constant;
float linear;
float quadratic;
public:
PointLight(const glm::vec3& position, const glm::vec3& color,
const glm::vec3& ambient, const glm::vec3& diffuse, const glm::vec3& specular,
float constant, float linear, float quadratic)
: position(position), Light(color, ambient, diffuse, specular),
constant(constant), linear(linear), quadratic(quadratic) {}
glm::vec3 getPosition() const { return position; }
float getConstant() const { return constant; }
float getLinear() const { return linear; }
float getQuadratic() const { return quadratic; }
void setPosition(const glm::vec3& newPosition) { position = newPosition; }
void setConstant(float newConstant) { constant = newConstant; }
void setLinear(float newLinear) { linear = newLinear; }
void setQuadratic(float newQuadratic) { quadratic = newQuadratic; }
void use(Shader& shader, int index) const
{
shader.setVec3("pointLights[" + std::to_string(index) + "].position", position);
shader.setVec3("pointLights[" + std::to_string(index) + "].color", getColor());
shader.setVec3("pointLights[" + std::to_string(index) + "].ambient", getAmbient());
shader.setVec3("pointLights[" + std::to_string(index) + "].diffuse", getDiffuse());
shader.setVec3("pointLights[" + std::to_string(index) + "].specular", getSpecular());
shader.setFloat("pointLights[" + std::to_string(index) + "].constant", constant);
shader.setFloat("pointLights[" + std::to_string(index) + "].linear", linear);
shader.setFloat("pointLights[" + std::to_string(index) + "].quadratic", quadratic);
}
};
#endif