Browse Source

breaking scene loading for new branch

master
cinnaboot 8 years ago
parent
commit
66d73199d8
  1. 58
      data/test_scene.json
  2. 81
      src/hexgame.cpp
  3. 2
      src/renderer.cpp
  4. 52
      src/scene_loader.cpp
  5. 7
      src/scene_loader.h

58
data/test_scene.json

@ -0,0 +1,58 @@
{
"camera" : {
"position" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"rotation" : {
"x" : 0,
"y" : 0,
"z" : 0,
"w" : 0
}
},
"hex_grid" : {
"layout_type" : "hexagon",
"hex_size" : 10,
"hex_radius" : 20
},
"entities" : [
{
"name" : "catepillar 1",
"model_file" : "catepillar.dae",
"position" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"rotation" : {
"x" : 0,
"y" : 0,
"z" : 0,
"w" : 0
}
}
],
"lights" : [
{
"intensity" : 1.0,
"color" : {
"r" : 0,
"g" : 0,
"b" : 0
},
"position" : {
"x" : 0,
"y" : 0,
"z" : 0
}
}
]
}

81
src/hexgame.cpp

@ -36,6 +36,9 @@
#define CONE_ANGLE 30 #define CONE_ANGLE 30
#define VSYNC_ENABLED true #define VSYNC_ENABLED true
//testing
#define DEFAULT_SCENE_FILE "../data/test_scene.json"
#include <vector> #include <vector>
@ -62,6 +65,7 @@
#include "mesh.h" #include "mesh.h"
#include "platform_wait_for_vblank.h" #include "platform_wait_for_vblank.h"
#include "renderer.h" #include "renderer.h"
#include "scene_loader.h"
#include "util.h" #include "util.h"
using std::vector; using std::vector;
@ -79,7 +83,7 @@ createHexes(vector<hex_info> *hxi_array, const Layout &layout, uint32 color)
{ {
int r1 = std::max(-map_radius, -q - map_radius); int r1 = std::max(-map_radius, -q - map_radius);
int r2 = std::min(map_radius, -q + map_radius); int r2 = std::min(map_radius, -q + map_radius);
for (int r = r1; r <= r2; r++) for (int r = r1; r <= r2; r++)
{ {
hex_info hxi; hex_info hxi;
@ -110,7 +114,7 @@ void
resetHexes() resetHexes()
{ {
g_game_state->start_hex = g_game_state->current_hex = 0; g_game_state->start_hex = g_game_state->current_hex = 0;
for (hex_info &hxi : *g_game_state->hex_array) for (hex_info &hxi : *g_game_state->hex_array)
{ {
hxi.selected = false; hxi.selected = false;
@ -125,13 +129,13 @@ getSingleHex(int32 x, int32 y)
v2f v = getUnprojectedCoords(x, y, dims.x, dims.y); v2f v = getUnprojectedCoords(x, y, dims.x, dims.y);
Point p(v.x, v.y); Point p(v.x, v.y);
Hex h = hex_round(pixel_to_hex(g_game_state->hex_layout, p)); Hex h = hex_round(pixel_to_hex(g_game_state->hex_layout, p));
for (hex_info &hxi : *g_game_state->hex_array) for (hex_info &hxi : *g_game_state->hex_array)
{ {
if (hex_equal(h, hxi.hex)) if (hex_equal(h, hxi.hex))
return &hxi; return &hxi;
} }
return 0; return 0;
} }
@ -161,7 +165,7 @@ updateHexFill(int32 x, int32 y)
{ {
g_game_state->current_hex = hxi; g_game_state->current_hex = hxi;
int l = hex_distance(g_game_state->start_hex->hex, g_game_state->current_hex->hex); int l = hex_distance(g_game_state->start_hex->hex, g_game_state->current_hex->hex);
for (hex_info &h : *g_game_state->hex_array) for (hex_info &h : *g_game_state->hex_array)
{ {
if (hex_distance(g_game_state->start_hex->hex, h.hex) <= l) if (hex_distance(g_game_state->start_hex->hex, h.hex) <= l)
@ -186,11 +190,11 @@ updateHexLineDraw(int32 x, int32 y)
{ {
g_game_state->current_hex = hxi; g_game_state->current_hex = hxi;
vector<Hex> hexLine = hex_linedraw(g_game_state->start_hex->hex, hxi->hex); vector<Hex> hexLine = hex_linedraw(g_game_state->start_hex->hex, hxi->hex);
for (hex_info &h1 : *g_game_state->hex_array) for (hex_info &h1 : *g_game_state->hex_array)
{ {
for (uint i = 0; i < hexLine.size(); i++) for (uint i = 0; i < hexLine.size(); i++)
{ {
Hex h2 = hexLine[i]; Hex h2 = hexLine[i];
if (hex_equal(h1.hex, h2)) if (hex_equal(h1.hex, h2))
{ {
@ -215,14 +219,14 @@ updateHexConeFill(int32 x, int32 y)
if (hxi && (hxi != g_game_state->current_hex) && g_game_state->start_hex) if (hxi && (hxi != g_game_state->current_hex) && g_game_state->start_hex)
{ {
g_game_state->current_hex = hxi; g_game_state->current_hex = hxi;
// TODO: Remove debug code here and from gooey.h // TODO: Remove debug code here and from gooey.h
Point p1(g_game_state->start_hex->XPos, g_game_state->start_hex->YPos); Point p1(g_game_state->start_hex->XPos, g_game_state->start_hex->YPos);
Point p2(g_game_state->current_hex->XPos, g_game_state->current_hex->YPos); Point p2(g_game_state->current_hex->XPos, g_game_state->current_hex->YPos);
real64 angle = std::atan2(p2.y - p1.y, p2.x - p1.x); real64 angle = std::atan2(p2.y - p1.y, p2.x - p1.x);
real64 len = std::hypot(p2.y - p1.y, p2.x - p1.x); real64 len = std::hypot(p2.y - p1.y, p2.x - p1.x);
real64 coneAngle = CONE_ANGLE * M_PI / 180; // M_PI is non-standard and may not be portable real64 coneAngle = CONE_ANGLE * M_PI / 180; // M_PI is non-standard and may not be portable
real64 x1 = len * std::cos(angle); real64 x1 = len * std::cos(angle);
real64 y1 = len * std::sin(angle); real64 y1 = len * std::sin(angle);
// top of cone // top of cone
@ -271,18 +275,18 @@ handleMouseDown(SDL_MouseButtonEvent &e)
case FILL: case FILL:
startDrawHelper(coords.x, coords.y); startDrawHelper(coords.x, coords.y);
break; break;
case LINE: case LINE:
startDrawHelper(coords.x, coords.y); startDrawHelper(coords.x, coords.y);
break; break;
case CONE_FILL: case CONE_FILL:
startDrawHelper(coords.x, coords.y); startDrawHelper(coords.x, coords.y);
break; break;
case PATHFINDING: case PATHFINDING:
break; break;
case NONE: case NONE:
// fall through // fall through
default: default:
@ -298,7 +302,7 @@ handleMouseDown(SDL_MouseButtonEvent &e)
else else
{ {
hex->current_color = hex->stored_color; hex->current_color = hex->stored_color;
} }
} }
}break; }break;
} }
@ -308,24 +312,24 @@ void
handleMouseMove(SDL_MouseMotionEvent &e) handleMouseMove(SDL_MouseMotionEvent &e)
{ {
v2i coords = mapMouseToViewport(e.x, e.y); v2i coords = mapMouseToViewport(e.x, e.y);
switch (g_game_state->draw_mode) switch (g_game_state->draw_mode)
{ {
case FILL: case FILL:
updateHexFill(coords.x, coords.y); updateHexFill(coords.x, coords.y);
break; break;
case LINE: case LINE:
updateHexLineDraw(coords.x, coords.y); updateHexLineDraw(coords.x, coords.y);
break; break;
case CONE_FILL: case CONE_FILL:
updateHexConeFill(coords.x, coords.y); updateHexConeFill(coords.x, coords.y);
break; break;
case PATHFINDING: case PATHFINDING:
break; break;
case NONE: case NONE:
// fall through // fall through
default: default:
@ -337,24 +341,24 @@ void
handleMouseUp(SDL_MouseButtonEvent &e) handleMouseUp(SDL_MouseButtonEvent &e)
{ {
//v2i coords = mapMouseToViewport(e.x, e.y); //v2i coords = mapMouseToViewport(e.x, e.y);
switch (g_game_state->draw_mode) switch (g_game_state->draw_mode)
{ {
case FILL: case FILL:
g_game_state->is_selecting = false; g_game_state->is_selecting = false;
break; break;
case LINE: case LINE:
g_game_state->is_selecting = false; g_game_state->is_selecting = false;
break; break;
case CONE_FILL: case CONE_FILL:
g_game_state->is_selecting = false; g_game_state->is_selecting = false;
break; break;
case PATHFINDING: case PATHFINDING:
break; break;
case NONE: case NONE:
// fall through // fall through
default: default:
@ -446,7 +450,7 @@ processSDLEvents()
break; break;
} }
} }
return run; return run;
} }
@ -482,7 +486,7 @@ cleanUp(SDL_Handles &handles)
#if defined(_WIN32) #if defined(_WIN32)
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd) LPSTR lpCmdLine, int nShowCmd)
#else #else
int main(int argc, char* argv[]) int main(int argc, char* argv[])
#endif #endif
@ -513,7 +517,7 @@ int main(int argc, char* argv[])
createHexes(g_game_state->hex_array, g_game_state->hex_layout, g_render_state->fill_color); createHexes(g_game_state->hex_array, g_game_state->hex_layout, g_render_state->fill_color);
SDL_Handles handles; SDL_Handles handles;
if (SDL_Init(SDL_INIT_VIDEO) != 0) { if (SDL_Init(SDL_INIT_VIDEO) != 0) {
LOG(ERROR) << "Error, SDL_Init: " << SDL_GetError() << "\n"; LOG(ERROR) << "Error, SDL_Init: " << SDL_GetError() << "\n";
return 1; return 1;
@ -550,6 +554,7 @@ int main(int argc, char* argv[])
game_state* g = g_game_state; game_state* g = g_game_state;
g->entities = (Entity*) std::calloc(1000, sizeof(Entity)); g->entities = (Entity*) std::calloc(1000, sizeof(Entity));
#if 0
meMeshGroup mg1, mg2; meMeshGroup mg1, mg2;
// TODO: store these meMeshGroups serperately from entities to re-use them, // TODO: store these meMeshGroups serperately from entities to re-use them,
@ -577,12 +582,22 @@ int main(int argc, char* argv[])
LOG(ERROR) << "Error loading file, exiting\n"; LOG(ERROR) << "Error loading file, exiting\n";
return 1; return 1;
} }
#endif
} else { } else {
LOG(ERROR) << "Error initializing assimp\n"; LOG(ERROR) << "Error initializing assimp\n";
return 1; return 1;
} }
// testing scene_loader
if (slLoadFile(DEFAULT_SCENE_FILE, g_game_state->entities, g_game_state->entity_count, 1000)) {
// ???
} else {
LOG(ERROR) << "Error reading scene file, exiting\n";
return 1;
}
if (!createScene(g_game_state->hex_array, g_game_state->entities, g_game_state->entity_count)) { if (!createScene(g_game_state->hex_array, g_game_state->entities, g_game_state->entity_count)) {
LOG(ERROR) << "Error in vertex data, exiting\n"; LOG(ERROR) << "Error in vertex data, exiting\n";
return 1; return 1;
@ -611,18 +626,18 @@ int main(int argc, char* argv[])
#endif #endif
game_state* g = g_game_state; game_state* g = g_game_state;
render_state* r = g_render_state; render_state* r = g_render_state;
moveCamera(g->is_moveup, g->is_moveleft, g->is_movedown, g->is_moveright, moveCamera(g->is_moveup, g->is_moveleft, g->is_movedown, g->is_moveright,
g->is_moveforward, g->is_movebackward); g->is_moveforward, g->is_movebackward);
renderFrame(g->hex_array, g->entities, g->entity_count); renderFrame(g->hex_array, g->entities, g->entity_count);
if (r->is_debug_draw && g->draw_mode == CONE_FILL) if (r->is_debug_draw && g->draw_mode == CONE_FILL)
renderDebug(g_polygon_select_vertices); renderDebug(g_polygon_select_vertices);
renderGooey(handles, g->draw_mode, r->is_debug_draw, g->start_hex, renderGooey(handles, g->draw_mode, r->is_debug_draw, g->start_hex,
g->current_hex, g->is_selecting, getCameraPosition()); g->current_hex, g->is_selecting, getCameraPosition());
SDL_GL_SwapWindow(handles.window); SDL_GL_SwapWindow(handles.window);
platform_wait_for_vblank(VSYNC_ENABLED); platform_wait_for_vblank(VSYNC_ENABLED);

2
src/renderer.cpp

@ -71,6 +71,7 @@ struct camera
void initMatrices(projection_type p); void initMatrices(projection_type p);
void openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, void openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity,
GLsizei length, const GLchar* message, const void* userParam); GLsizei length, const GLchar* message, const void* userParam);
// TODO: move hex logic to new file
bool initHexGridBuffers(std::vector<hex_info>* hexes); bool initHexGridBuffers(std::vector<hex_info>* hexes);
void fillTriangleBufferFromHex(GLfloat buf[], int idx, const hex_info &hex); void fillTriangleBufferFromHex(GLfloat buf[], int idx, const hex_info &hex);
void fillColorBuffer(GLfloat buf[], int len, std::vector<hex_info>* hexes); void fillColorBuffer(GLfloat buf[], int len, std::vector<hex_info>* hexes);
@ -484,6 +485,7 @@ openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity,
<< ", message: " << message << "\n"; << ", message: " << message << "\n";
} }
// TODO: move hex logic to new file
bool bool
initHexGridBuffers(std::vector<hex_info>* hexes) initHexGridBuffers(std::vector<hex_info>* hexes)
{ {

52
src/scene_loader.cpp

@ -0,0 +1,52 @@
#include <glm/glm.hpp>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "aixlog.hpp"
#include "entity.h"
#include "mesh.h"
#include "util.h"
#include "scene_loader.h"
bool
slLoadFile(const char* file_name, Entity* entity_array, uint& entity_count, uint max_entities)
{
if (entity_array == nullptr) {
LOG(ERROR) << "entity array not initialized\n";
return false;
}
rapidjson::Document doc;
char* contents = utilDumpTextFile(file_name);
if (contents == nullptr) {
LOG(ERROR) << "Error reading file: " << file_name << "\n";
return false;
}
if (doc.Parse(contents).HasParseError() || !doc.IsObject()) {
LOG(ERROR) << "Error parrsing scene file: " << file_name << "\n";
return false;
}
// entities
if (doc.HasMember("entities")) {
const rapidjson::Value& e = doc["entities"];
assert (e.IsArray());
for (uint i = 0; i < e.Size(); i++) {
assert(e[i].HasMember("name"));
assert(e[i]["name"].IsString());
assert(i < max_entities);
std::string s = e[i]["name"].GetString();
LOG(INFO) << "e[" << i << "][\"name\"]: " << s << "\n";
}
}
return true;
}

7
src/scene_loader.h

@ -0,0 +1,7 @@
#include "util.h"
/*
* @param max_entities maximum size of array allocated
*/
bool slLoadFile(const char* file_name, Entity* entity_array, uint& entity_count, uint max_entities);
Loading…
Cancel
Save