Browse Source

break lighting

testing
cinnaboot 6 years ago
parent
commit
fce30650ad
  1. 7
      examples/assimp_loading/main.cpp
  2. 22
      include/lights.h
  3. 3
      include/render_object.h
  4. 12
      include/renderer.h
  5. 54
      src/lights.cpp
  6. 30
      src/render_object.cpp
  7. 14
      src/renderer.cpp

7
examples/assimp_loading/main.cpp

@ -68,7 +68,6 @@ main()
rs->render_group_count = 1;
entity& spaceship = rs->render_groups->entities[0];
// setup camera
cameraInitPerspective(
rs->cam,
glm::vec3(200, -150, 150),
@ -76,11 +75,7 @@ main()
glm::vec3(0,0,1)
);
// TODO: renderer::setDefaults() allocates 10 lights based on a MACRO in
// renderer.cpp probably need an interface to add more than that add a
// light
rs->num_lights = 1;
rs->lights[0].position = glm::vec3(200, -150, 150);
renAddLight(rs, glm::vec3(200, -150, 150));
// TODO: look into setting up git-annex for large files. git-lfs works fine
// for gitlab, but has no real implementation for self-hosting:

22
include/lights.h

@ -1,6 +1,11 @@
#pragma once
#include <glm/glm.hpp>
#include "shader_program.h"
#include "util.h"
struct point_light
{
uint light_ID;
@ -9,3 +14,20 @@ struct point_light
float intensity;
};
struct light_group
{
point_light* lights;
uint num_lights;
uint max_lights;
bool needs_update;
};
light_group* lightsInit(uint max_lights = 10);
void lightsOut(light_group* lights);
bool
lightsAdd(light_group* lights, glm::vec3 pos, glm::vec3 color, float intensity);
void lightsUpdate(light_group* lights, shader_program* shader);

3
include/render_object.h

@ -29,5 +29,4 @@ void roFree(render_object& ro);
void roDraw(render_object& ro,
camera& cam,
shader_program& shader,
point_light* lights,
uint num_lights);
light_group* lights);

12
include/renderer.h

@ -35,7 +35,6 @@ struct render_group
struct render_state
{
glm::vec2 viewport_dims;
bool is_debug_draw;
SDL_Handles handles;
camera cam;
util_RGBA clear_col;
@ -46,10 +45,7 @@ struct render_state
uint render_group_count;
shader_program* default_shader;
point_light* lights;
uint num_lights;
uint max_lights;
light_group* lights;
};
render_state*
@ -63,3 +59,9 @@ renAllocateGroup(uint entity_count, shader_program shader);
void renRenderFrame(render_state* rs);
bool
renAddLight(render_state* rs,
glm::vec3 pos = glm::vec3(0, 0, 0),
glm::vec3 color = glm::vec3(1, 1, 1),
float intensity = 1.0);

54
src/lights.cpp

@ -0,0 +1,54 @@
#include "lights.h"
light_group*
lightsInit(uint max_lights)
{
light_group* lg = UTIL_ALLOC(1, light_group);
lg->lights = UTIL_ALLOC(max_lights, point_light);
return lg;
}
void
lightsOut(light_group* lights)
{
utilSafeFree(lights->lights);
utilSafeFree(lights);
}
bool
lightsAdd(light_group* lights, glm::vec3 pos, glm::vec3 color, float intensity)
{
return false;
}
void
lightsUpdate(light_group* lights, shader_program* shader)
{
// set shader max_lights uniform to match..
}
#if 0
#include <sstream>
inline void
updateLights(shader_program& shader, point_light* lights, uint num_lights)
{
// 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);
for (uint i = 0; i < num_lights; i++) {
// TODO: don't do this every frame * every render_group
std::stringstream ss;
ss << "lights[" << i << "].position";
int light_pos_loc = glGetUniformLocation(shader.program_id, ss.str().c_str());
glUniform3fv(light_pos_loc, 1, &lights[i].position[0]);
}
}
#endif

30
src/render_object.cpp

@ -13,8 +13,6 @@ bool initGLTexture(const util_image image, GLuint& tex_id);
inline void
updateMatrices(shader_program& shader, camera& cam, glm::mat4 node_xform);
inline void enableGLFloatBuffer(uint buffer_id, uint location);
inline void
updateLights(shader_program& shader, point_light* lights, uint num_lights);
// interface
@ -60,20 +58,21 @@ void
roDraw(render_object& ro,
camera& cam,
shader_program& shader,
point_light* lights,
uint num_lights)
light_group* lights)
{
glUseProgram(shader.program_id);
updateMatrices(shader, cam, ro.node_xform);
enableGLFloatBuffer(ro.vertex_buffer_id, 0);
enableGLFloatBuffer(ro.normal_buffer_id, 1);
updateLights(shader, lights, num_lights);
// TODO: could pass in a stride parameter here to enableGLFloatBuffer()
// could then use a 2d buffer for uv coords
enableGLFloatBuffer(ro.uv_buffer_id, 2);
glBindTexture(GL_TEXTURE_2D, ro.tex_id);
glUniform1i(shader.sampler_id, 0);
if (lights->needs_update)
lightsUpdate(lights, &shader);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ro.index_buffer_id);
glDrawElements(GL_TRIANGLES, ro.index_buffer_count, GL_UNSIGNED_INT, 0);
@ -148,24 +147,3 @@ enableGLFloatBuffer(uint buffer_id, uint location)
glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0);
}
#include <sstream>
inline void
updateLights(shader_program& shader, point_light* lights, uint num_lights)
{
// 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);
for (uint i = 0; i < num_lights; i++) {
// TODO: don't do this every frame * every render_group
std::stringstream ss;
ss << "lights[" << i << "].position";
int light_pos_loc = glGetUniformLocation(shader.program_id, ss.str().c_str());
glUniform3fv(light_pos_loc, 1, &lights[i].position[0]);
}
}

14
src/renderer.cpp

@ -84,9 +84,9 @@ renShutdown(render_state* rs)
}
shaderFree(rs->default_shader);
lightsOut(rs->lights);
utilSafeFree(rs->render_groups);
utilSafeFree(rs->default_shader);
utilSafeFree(rs->lights);
SDL_GL_DeleteContext(rs->handles.glContext);
SDL_DestroyWindow(rs->handles.window);
SDL_Quit();
@ -119,13 +119,18 @@ renRenderFrame(render_state* rs)
roDraw(e.render_objs[k],
rs->cam,
rg.shader,
rs->lights,
rs->num_lights);
rs->lights);
}
}
}
}
bool
renAddLight(render_state* rs, glm::vec3 pos, glm::vec3 color, float intensity)
{
return lightsAdd(rs->lights, pos, color, intensity);
}
// internal
@ -238,8 +243,7 @@ void
setDefaults(render_state* rs, glm::vec2 viewport_dims)
{
rs->viewport_dims = viewport_dims;
rs->max_lights = MAX_LIGHTS;
rs->lights = UTIL_ALLOC(rs->max_lights, point_light);
rs->lights = lightsInit();
rs->clear_col.R = CLEAR_COL_R;
rs->clear_col.B = CLEAR_COL_B;
rs->clear_col.G = CLEAR_COL_G;

Loading…
Cancel
Save