|
|
|
|
@ -73,6 +73,99 @@ static render_state* g_render_state;
|
|
|
|
|
static vector<Point> g_polygon_select_vertices = {Point(), Point(), Point(), Point()}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
loadSceneFromJson(game_state* s, render_state* rs) |
|
|
|
|
{ |
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
if (!slParseEntities(sd, g->entities, g->entity_count, MAX_ENTITIES, DATA_DIR)) { |
|
|
|
|
LOG(ERROR) << "Error loading Entities, exiting\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
slParseCamera(sd, rs->cam); |
|
|
|
|
slParseHexGrid(sd, g->grid); |
|
|
|
|
hgCreateHexes(g->grid); |
|
|
|
|
|
|
|
|
|
if (!slCreateHexRenderGroups(g->grid, rs)) |
|
|
|
|
{ |
|
|
|
|
LOG(ERROR) << "Error creating hex render groups\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!slParseLights(sd, rs->lights, rs->num_lights, rs->max_lights)) { |
|
|
|
|
LOG(ERROR) << "Error loading lights, exiting\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
slFreeSceneDoc(sd); |
|
|
|
|
} else { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
init() |
|
|
|
|
{ |
|
|
|
|
// init global game state
|
|
|
|
|
g_game_state = UTIL_ALLOC(1, game_state); |
|
|
|
|
g_game_state->grid.hex_array = new vector<hex_info>; |
|
|
|
|
g_game_state->entities = UTIL_ALLOC(MAX_ENTITIES, Entity); |
|
|
|
|
|
|
|
|
|
// init global render state
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
if (SDL_Init(SDL_INIT_VIDEO) != 0) { |
|
|
|
|
LOG(ERROR) << "Error, SDL_Init: " << SDL_GetError() << "\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!renInit(g_render_state)) { |
|
|
|
|
LOG(ERROR) << "Unable to initialize graphics, exiting\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!gooInit(g_render_state->handles, g_render_state->viewport_dims)) { |
|
|
|
|
LOG(ERROR) << "Fooey, No Gooey!\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!meInitAssimp()) { |
|
|
|
|
LOG(ERROR) << "Error initializing assimp\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!loadSceneFromJson(g_game_state, g_render_state)) { |
|
|
|
|
LOG(ERROR) << "Error loading scene\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!renCreateScene(g_render_state, g_game_state->entities, g_game_state->entity_count)) |
|
|
|
|
{ |
|
|
|
|
LOG(ERROR) << "Error in vertex data, exiting\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if defined(_WIN32) |
|
|
|
|
LOG(DEBUG) << "TODO: Test SDL_Delay frame timer in win32\n"; |
|
|
|
|
|
|
|
|
|
if (!platform_init(g_render_state->handles.window)) { |
|
|
|
|
LOG(ERROR) << "Couldn't get SDL platform info, exiting\n"; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
v2i |
|
|
|
|
mapMouseToViewport(int32 x, int32 y) |
|
|
|
|
{ |
|
|
|
|
@ -304,86 +397,11 @@ int main(int argc, char* argv[])
|
|
|
|
|
#endif |
|
|
|
|
LOG(INFO) << "Application started\n"; |
|
|
|
|
|
|
|
|
|
// init global game state
|
|
|
|
|
g_game_state = UTIL_ALLOC(1, game_state); |
|
|
|
|
g_game_state->grid.hex_array = new vector<hex_info>; |
|
|
|
|
g_game_state->entities = UTIL_ALLOC(MAX_ENTITIES, Entity); |
|
|
|
|
|
|
|
|
|
// init global render state
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
if (SDL_Init(SDL_INIT_VIDEO) != 0) { |
|
|
|
|
LOG(ERROR) << "Error, SDL_Init: " << SDL_GetError() << "\n"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!renInit(g_render_state)) { |
|
|
|
|
LOG(ERROR) << "Unable to initialize graphics, exiting\n"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!gooInit(g_render_state->handles, g_render_state->viewport_dims)) { |
|
|
|
|
LOG(ERROR) << "Fooey, No Gooey!\n"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!meInitAssimp()) { |
|
|
|
|
LOG(ERROR) << "Error initializing assimp\n"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 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; |
|
|
|
|
|
|
|
|
|
if (!slParseEntities(sd, g->entities, g->entity_count, MAX_ENTITIES, DATA_DIR)) { |
|
|
|
|
LOG(ERROR) << "Error loading Entities, exiting\n"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
slParseCamera(sd, rs->cam); |
|
|
|
|
slParseHexGrid(sd, g->grid); |
|
|
|
|
|
|
|
|
|
rs->filled_hex_render_group = hgInitGLBuffers(g->grid, rs->default_shader, true); |
|
|
|
|
rs->hex_line_render_group = hgInitGLBuffers(g->grid, rs->default_shader, false); |
|
|
|
|
|
|
|
|
|
if ((rs->filled_hex_render_group == nullptr) || (rs->hex_line_render_group == nullptr)) { |
|
|
|
|
LOG(ERROR) << "Error allocating render_group, exiting\n"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!renCreateScene(g_render_state, g_game_state->entities, g_game_state->entity_count)) |
|
|
|
|
{ |
|
|
|
|
LOG(ERROR) << "Error in vertex data, exiting\n"; |
|
|
|
|
return 1; |
|
|
|
|
if (!init()) { |
|
|
|
|
LOG(ERROR) << "failed init, exiting\n"; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if defined(_WIN32) |
|
|
|
|
LOG(DEBUG) << "TODO: Test SDL_Delay frame timer in win32\n"; |
|
|
|
|
|
|
|
|
|
if (!platform_init(g_render_state->handles.window)) { |
|
|
|
|
LOG(ERROR) << "Couldn't get SDL platform info, exiting\n"; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// main loop
|
|
|
|
|
|
|
|
|
|
const uint TARGET_FPS = 60; |
|
|
|
|
|