diff --git a/data/test_scene.json b/data/test_scene.json index 0ecbee2..2d3163f 100644 --- a/data/test_scene.json +++ b/data/test_scene.json @@ -86,7 +86,7 @@ "position" : { "x" : 0, "y" : 0, - "z" : 0 + "z" : 100 } } ] diff --git a/src/hexgame.cpp b/src/hexgame.cpp index 74d18dd..2cb279c 100644 --- a/src/hexgame.cpp +++ b/src/hexgame.cpp @@ -40,8 +40,6 @@ #define SCENE_SCHEMA_FILE "scene_schema.json" #define MAX_ENTITIES 1000 -#define RS_MAX_LIGHTS 10 // NOTE: needs to match the fragment shader source - #include #if defined(_WIN32) @@ -484,7 +482,6 @@ int main(int argc, char* argv[]) g_render_state = UTIL_ALLOC(1, render_state); g_render_state->is_debug_draw = DEBUG_DRAW; g_render_state->viewport_dims = v2i(VIEWPORT_WIDTH, VIEWPORT_HEIGHT); - g_render_state->max_lights = RS_MAX_LIGHTS; SDL_Handles handles; @@ -493,7 +490,7 @@ int main(int argc, char* argv[]) return 1; } - if (!initRenderer(handles, g_render_state->viewport_dims)) { + if (!initRenderer(g_render_state, handles)) { LOG(ERROR) << "Unable to initialize graphics, exiting\n"; return 1; } @@ -543,7 +540,12 @@ int main(int argc, char* argv[]) slParseCamera(sd, renGetCamera()); slParseHexGrid(sd, g->grid); - slParseLights(sd, rs->lights, rs->num_lights, rs->max_lights); + + if (!slParseLights(sd, rs->lights, rs->num_lights, rs->max_lights)) { + LOG(ERROR) << "Error loading lights, exiting\n"; + return 1; + } + slFreeSceneDoc(sd); } else { LOG(ERROR) << "Error loading scene, exiting\n"; diff --git a/src/renderer.cpp b/src/renderer.cpp index f0c766d..315934b 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -27,6 +27,7 @@ #define PROJ_TYPE PERSPECTIVE #define DEFAULT_VERTEX_SHADER_FILE "../data/default.vs" #define DEFAULT_FRAGMENT_SHADER_FILE "../data/default.fs" +#define MAX_LIGHTS 10 // NOTE: needs to match the fragment shader source typedef struct clear_col { @@ -76,7 +77,7 @@ static camera g_camera; // TODO: maybe make this a contructor for render_state? bool -initRenderer(SDL_Handles &handles, v2i vpDims) +initRenderer(render_state* rs, SDL_Handles &handles) { SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); @@ -88,7 +89,7 @@ initRenderer(SDL_Handles &handles, v2i vpDims) SDL_GetCurrentDisplayMode(0, &handles.currentDisplayMode); handles.window = SDL_CreateWindow("hexgame", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, - vpDims.x, vpDims.y, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE); + rs->viewport_dims.x, rs->viewport_dims.y, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE); if (!handles.window) { LOG(ERROR) << "Error creating window: " << SDL_GetError() << "\n"; @@ -141,6 +142,9 @@ initRenderer(SDL_Handles &handles, v2i vpDims) utilSafeFree(vs_code); utilSafeFree(fs_code); + rs->max_lights = MAX_LIGHTS; + rs->lights = UTIL_ALLOC(rs->max_lights, rg_point_light); + if (shader_error) { LOG(ERROR) << "Error initializing shader program\n"; return false; @@ -264,9 +268,7 @@ createScene(render_state* rs, std::vector* hexes, Entity* entities, ui // TODO: load light properties from scene/level files // light testing - // TODO: allocate this in scene_loader... or initRenderer? - rs->lights = UTIL_ALLOC(rs->max_lights, rg_point_light); -#if 1 +#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); diff --git a/src/renderer.h b/src/renderer.h index 9e5f818..76afeda 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -30,6 +30,7 @@ struct render_state { v2i viewport_dims; bool is_debug_draw; + // TODO: maybe add handles reference here? // TODO: testing lighting rg_point_light* lights = nullptr; @@ -37,7 +38,7 @@ struct render_state uint max_lights = 0; }; -bool initRenderer(SDL_Handles &handles, v2i vpDims); +bool initRenderer(render_state* rs, SDL_Handles &handles); void freeBuffers(render_state* rs); bool addTexture(SDL_Handles &handles, const char * path); camera& renGetCamera(); diff --git a/src/scene_loader.cpp b/src/scene_loader.cpp index 4882778..413c899 100644 --- a/src/scene_loader.cpp +++ b/src/scene_loader.cpp @@ -146,10 +146,23 @@ slParseHexGrid(slSceneDoc* sd, hexgrid& hg) } -void +bool slParseLights(slSceneDoc* sd, rg_point_light* lights, uint& num_lights, uint max_lights) { - //const rapidjson::Value& json_lights = (*sd->doc)["lights"]; + const rapidjson::Value& json_lights = (*sd->doc)["lights"]; + + if (json_lights.Size() > max_lights) { + LOG(ERROR) << "Too many lights\n"; + return false; + } + + num_lights = json_lights.Size(); + + for (uint i = 0; i < num_lights; i++) { + lights[i].position = parseVec3(json_lights[i]["position"]); + } + + return true; } diff --git a/src/scene_loader.h b/src/scene_loader.h index c9bcfc9..f66ca05 100644 --- a/src/scene_loader.h +++ b/src/scene_loader.h @@ -22,4 +22,4 @@ bool slParseEntities( void slParseCamera(slSceneDoc* sd, camera& cam); void slParseHexGrid(slSceneDoc* sd, hexgrid& hg); -void slParseLights(slSceneDoc* sd, rg_point_light* lights, uint& num_lights, uint max_lights); +bool slParseLights(slSceneDoc* sd, rg_point_light* lights, uint& num_lights, uint max_lights);