49 lines
1.7 KiB
C++
49 lines
1.7 KiB
C++
#ifndef LIGHT_CLASS
|
|
#define LIGHT_CLASS
|
|
|
|
#include <glm/glm.hpp>
|
|
|
|
// These have to match the sizes in deferred_lighting.frag and default.frag
|
|
static constexpr int MAX_DIRECTIONAL_LIGHTS = 4;
|
|
static constexpr int MAX_POINT_LIGHTS = 16;
|
|
static constexpr int MAX_SPOT_LIGHTS = 8;
|
|
|
|
// Spot and point shadows share one depth texture cut into tiles.
|
|
// A spot light takes 1 tile, a point light takes 6. Lights past the limit just don't cast shadows.
|
|
static constexpr int SHADOW_ATLAS_COLUMNS = 6; // has to match the shaders too
|
|
static constexpr int SHADOW_ATLAS_TILES = SHADOW_ATLAS_COLUMNS * SHADOW_ATLAS_COLUMNS;
|
|
static constexpr int SHADOW_ATLAS_TILE_SIZE = 640;
|
|
|
|
class Light {
|
|
public:
|
|
glm::vec3 color = glm::vec3(1.0f); // linear rgb
|
|
float intensity = 1.0f;
|
|
bool castShadow = true; // spot and point lights, the sun always has its own shadow map
|
|
int shadowTile = -1; // first atlas tile, set each frame by the render system
|
|
};
|
|
|
|
// Parallel rays with no position, so it lights the whole scene from one direction
|
|
class DirectionalLight : public Light {
|
|
public:
|
|
glm::vec3 direction = glm::vec3(0.0f, -1.0f, 0.0f); // the way the light travels
|
|
};
|
|
|
|
// Fades with distance and reaches nothing past radius
|
|
class PointLight : public Light {
|
|
public:
|
|
glm::vec3 position = glm::vec3(0.0f);
|
|
float radius = 10.0f;
|
|
};
|
|
|
|
// A cone from a point. Full brightness inside innerAngle, fading to nothing at outerAngle.
|
|
class SpotLight : public Light {
|
|
public:
|
|
glm::vec3 position = glm::vec3(0.0f);
|
|
glm::vec3 direction = glm::vec3(0.0f, -1.0f, 0.0f); // the way the cone points
|
|
float radius = 20.0f;
|
|
float innerAngle = 20.0f; // degrees from the center of the cone
|
|
float outerAngle = 30.0f;
|
|
};
|
|
|
|
#endif
|