|
|
|
|
@ -7,6 +7,7 @@ lightsInit(uint max_lights)
|
|
|
|
|
{ |
|
|
|
|
light_group* lg = UTIL_ALLOC(1, light_group); |
|
|
|
|
lg->lights = UTIL_ALLOC(max_lights, point_light); |
|
|
|
|
lg->max_lights = max_lights; |
|
|
|
|
return lg; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -20,35 +21,39 @@ lightsOut(light_group* lights)
|
|
|
|
|
bool |
|
|
|
|
lightsAdd(light_group* lights, glm::vec3 pos, glm::vec3 color, float intensity) |
|
|
|
|
{ |
|
|
|
|
if (lights->num_lights == lights->max_lights) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
lightsUpdate(light_group* lights, shader_program* shader) |
|
|
|
|
{ |
|
|
|
|
// set shader max_lights uniform to match..
|
|
|
|
|
point_light& pl = lights->lights[lights->num_lights]; |
|
|
|
|
pl.position = pos; |
|
|
|
|
pl.color = color; |
|
|
|
|
pl.intensity = intensity; |
|
|
|
|
lights->needs_update = true; |
|
|
|
|
lights->num_lights++; |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
#include <sstream> |
|
|
|
|
|
|
|
|
|
inline void |
|
|
|
|
updateLights(shader_program& shader, point_light* lights, uint num_lights) |
|
|
|
|
void |
|
|
|
|
lightsUpdate(light_group* lights, shader_program* shader) |
|
|
|
|
{ |
|
|
|
|
// set shader max_lights uniform to match..
|
|
|
|
|
// TODO: use Uniform Buffer Objects to update light data
|
|
|
|
|
// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_uniform_buffer_object.txt
|
|
|
|
|
// https://www.khronos.org/opengl/wiki/Uniform_Buffer_Objects
|
|
|
|
|
|
|
|
|
|
glUniform1ui(shader.num_lights_id, num_lights); |
|
|
|
|
glUniform1ui(shader->num_lights_id, lights->num_lights); |
|
|
|
|
|
|
|
|
|
for (uint i = 0; i < num_lights; i++) { |
|
|
|
|
// TODO: don't do this every frame * every render_group
|
|
|
|
|
for (uint i = 0; i < lights->num_lights; i++) { |
|
|
|
|
std::stringstream ss; |
|
|
|
|
ss << "lights[" << i << "].position"; |
|
|
|
|
int light_pos_loc = glGetUniformLocation(shader.program_id, ss.str().c_str()); |
|
|
|
|
int light_pos_loc = glGetUniformLocation(shader->program_id, ss.str().c_str()); |
|
|
|
|
|
|
|
|
|
glUniform3fv(light_pos_loc, 1, &lights[i].position[0]); |
|
|
|
|
glUniform3fv(light_pos_loc, 1, &lights->lights[i].position[0]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lights->needs_update = false; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|