diff --git a/data/default.fs b/data/default.fs index 6a21be9..ef1d157 100644 --- a/data/default.fs +++ b/data/default.fs @@ -15,7 +15,7 @@ struct point_light { }; #define MAX_LIGHTS 10 uniform point_light lights[MAX_LIGHTS]; -uniform int num_lights = 0; +uniform uint num_lights = 0u; out vec3 color; @@ -23,19 +23,15 @@ void main() { // https://www.tomdalling.com/blog/modern-opengl/06-diffuse-point-lighting vec3 normal = normalize(normal_matrix * fragNormal); - vec3 fragPosition = vec3(model * vec4(fragVertex, 1)); + float totalBrightness = 0; - ///// - - //vec3 surfaceToLight = light_position - fragPosition; - vec3 surfaceToLight = lights[0].position - fragPosition; - - ///// - - float brightness = dot(normal, surfaceToLight) / (length(surfaceToLight) * length(normal)); - brightness = clamp(brightness, 0, 1); + for (uint i = 0u; i < num_lights; i++) { + vec3 surfaceToLight = lights[i].position - fragPosition; + float brightness = dot(normal, surfaceToLight) / (length(surfaceToLight) * length(normal)); + totalBrightness += brightness; + } - color = brightness * fragmentColor; + color = clamp(totalBrightness, 0, 1) * fragmentColor; } diff --git a/data/test_scene.json b/data/test_scene.json index 2d3163f..109810f 100644 --- a/data/test_scene.json +++ b/data/test_scene.json @@ -84,7 +84,21 @@ }, "position" : { - "x" : 0, + "x" : -400, + "y" : 0, + "z" : 100 + } + }, + { + "intensity" : 1.0, + "color" : { + "r" : 0, + "g" : 0, + "b" : 0 + }, + + "position" : { + "x" : 200, "y" : 0, "z" : 100 } diff --git a/src/hexgame.cpp b/src/hexgame.cpp index 2cb279c..16c1ec0 100644 --- a/src/hexgame.cpp +++ b/src/hexgame.cpp @@ -525,10 +525,10 @@ int main(int argc, char* argv[]) return 1; } - - // testing scene_loader + // load scene from json slSceneDoc* sd = slLoadFile(DATA_DIR, DEFAULT_SCENE_FILE, SCENE_SCHEMA_FILE); + if (sd != nullptr) { game_state* g = g_game_state; render_state* rs = g_render_state; diff --git a/src/render_group.cpp b/src/render_group.cpp index 8920aec..0a06b24 100644 --- a/src/render_group.cpp +++ b/src/render_group.cpp @@ -331,13 +331,14 @@ drawRenderObject(render_group* rg, render_object* ro, glBindBuffer(GL_ARRAY_BUFFER, ro->normal_buffer.buffer_id); glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); - // TODO: testing lighting + glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(model_matrix))); + glUniformMatrix3fv(rg->shader.normal_matrix_id, 1, GL_FALSE, &normal_matrix[0][0]); + // 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 - glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(model_matrix))); - glUniformMatrix3fv(rg->shader.normal_matrix_id, 1, GL_FALSE, &normal_matrix[0][0]); + glUniform1ui(rg->shader.num_lights_id, num_lights); for (uint i = 0; i < num_lights; i++) { // TODO: don't do this every frame * every render_group diff --git a/src/renderer.cpp b/src/renderer.cpp index 315934b..48347ed 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -67,9 +67,6 @@ static render_group* g_debug_render_group; static rg_shader_program g_default_shader; // NOTE: entity render_group pointers are kept in the entity struct static camera g_camera; - -// TODO: testing lighting -//static renPointLight g_test_light; // TODO: maybe keep all these globals in the render_state object? @@ -264,18 +261,6 @@ createScene(render_state* rs, std::vector* hexes, Entity* entities, ui rgBufferData(&debug_color_buf, GL_STATIC_DRAW, GL_ARRAY_BUFFER); rgBufferData(&debug_normal_buf, GL_STATIC_DRAW, GL_ARRAY_BUFFER); - // lights - - // TODO: load light properties from scene/level files - // light testing -#if 0 - rs->lights[0].light_ID = 0; - rs->lights[0].position = glm::vec3(0.f, 0.f, 200.f); - rs->lights[0].color = glm::vec3(1.f, 1.f, 1.f); - rs->lights[0].intensity = 1.f; - rs->num_lights = 1; -#endif - return true; }