|
|
|
@ -38,14 +38,6 @@ typedef struct clear_col |
|
|
|
} clear_col; |
|
|
|
} clear_col; |
|
|
|
clear_col g_clear_col { 75.f / 255.f, 135.f / 255.f, 135.f / 255.f, 1.f }; |
|
|
|
clear_col g_clear_col { 75.f / 255.f, 135.f / 255.f, 135.f / 255.f, 1.f }; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct gl_matrix_info |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
glm::mat4 projection; |
|
|
|
|
|
|
|
glm::mat4 view; |
|
|
|
|
|
|
|
glm::mat4 model; |
|
|
|
|
|
|
|
glm::mat4 MVP; |
|
|
|
|
|
|
|
} gl_matrix_info; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// forward declarations
|
|
|
|
// forward declarations
|
|
|
|
void initMatrices(projection_type p); |
|
|
|
void initMatrices(projection_type p); |
|
|
|
@ -59,8 +51,6 @@ void fillHexLineBuffer(GLfloat buf[], int len, std::vector<hex_info>* hexes); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// globals
|
|
|
|
// globals
|
|
|
|
// TODO: store scene_matrices on camera object
|
|
|
|
|
|
|
|
static gl_matrix_info g_scene_matrices; |
|
|
|
|
|
|
|
static render_group* g_filled_hex_render_group; |
|
|
|
static render_group* g_filled_hex_render_group; |
|
|
|
static render_group* g_hex_line_render_group; |
|
|
|
static render_group* g_hex_line_render_group; |
|
|
|
static render_group* g_debug_render_group; |
|
|
|
static render_group* g_debug_render_group; |
|
|
|
@ -209,7 +199,7 @@ getUnprojectedCoords(int32 x, int32 y, int32 vp_width, int32 vp_height) |
|
|
|
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); |
|
|
|
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); |
|
|
|
glm::vec4 viewport = glm::vec4(0, 0, vp_width, vp_height); |
|
|
|
glm::vec4 viewport = glm::vec4(0, 0, vp_width, vp_height); |
|
|
|
glm::vec3 wincoord = glm::vec3(x, y, depth); |
|
|
|
glm::vec3 wincoord = glm::vec3(x, y, depth); |
|
|
|
glm::vec3 vU = glm::unProject(wincoord, g_scene_matrices.view, g_scene_matrices.projection, viewport); |
|
|
|
glm::vec3 vU = glm::unProject(wincoord, g_render_state->cam.view, g_render_state->cam.projection, viewport); |
|
|
|
v2f v(vU.x, vU.y); |
|
|
|
v2f v(vU.x, vU.y); |
|
|
|
|
|
|
|
|
|
|
|
return v; |
|
|
|
return v; |
|
|
|
@ -291,8 +281,8 @@ moveCamera(bool up, bool left, bool down, bool right, bool forward, bool backwar |
|
|
|
|
|
|
|
|
|
|
|
p += (v * MOVE_SPEED); |
|
|
|
p += (v * MOVE_SPEED); |
|
|
|
glm::vec3 diff = old - p; |
|
|
|
glm::vec3 diff = old - p; |
|
|
|
g_scene_matrices.view = glm::translate(g_scene_matrices.view, diff); |
|
|
|
g_render_state->cam.view = glm::translate(g_render_state->cam.view, diff); |
|
|
|
g_scene_matrices.MVP = g_scene_matrices.projection * g_scene_matrices.view * g_scene_matrices.model; |
|
|
|
g_render_state->cam.MVP = g_render_state->cam.projection * g_render_state->cam.view * g_render_state->cam.model; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
@ -320,8 +310,8 @@ rotateCamera(int32 xrel, int32 yrel) |
|
|
|
c.left = glm::normalize(glm::cross(c.forward, c.up)); |
|
|
|
c.left = glm::normalize(glm::cross(c.forward, c.up)); |
|
|
|
c.up = glm::normalize(glm::cross(c.left, c.forward)); |
|
|
|
c.up = glm::normalize(glm::cross(c.left, c.forward)); |
|
|
|
|
|
|
|
|
|
|
|
g_scene_matrices.view = glm::lookAt(c.position, c.position + c.forward, c.up); |
|
|
|
g_render_state->cam.view = glm::lookAt(c.position, c.position + c.forward, c.up); |
|
|
|
g_scene_matrices.MVP = g_scene_matrices.projection * g_scene_matrices.view * g_scene_matrices.model; |
|
|
|
g_render_state->cam.MVP = g_render_state->cam.projection * g_render_state->cam.view * g_render_state->cam.model; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// NOTE: don't need this yet
|
|
|
|
// NOTE: don't need this yet
|
|
|
|
@ -340,8 +330,8 @@ rollCamera(bool CW, bool CCW) |
|
|
|
glm::vec4 v(c.up.x, c.up.y, c.up.z, 0); |
|
|
|
glm::vec4 v(c.up.x, c.up.y, c.up.z, 0); |
|
|
|
v = v * m; |
|
|
|
v = v * m; |
|
|
|
g_render_state->cam.up = glm::vec3(v.x, v.y, v.z); |
|
|
|
g_render_state->cam.up = glm::vec3(v.x, v.y, v.z); |
|
|
|
g_scene_matrices.view *= m; |
|
|
|
g_render_state->cam.view *= m; |
|
|
|
g_scene_matrices.MVP = g_scene_matrices.projection * g_scene_matrices.view * g_scene_matrices.model; |
|
|
|
g_render_state->cam.MVP = g_render_state->cam.projection * g_render_state->cam.view * g_render_state->cam.model; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -351,9 +341,9 @@ renderFrame(render_state* rs, std::vector<hex_info> *hexes, Entity* entities, ui |
|
|
|
glClearColor(g_clear_col.R, g_clear_col.G, g_clear_col.B, g_clear_col.A); |
|
|
|
glClearColor(g_clear_col.R, g_clear_col.G, g_clear_col.B, g_clear_col.A); |
|
|
|
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); |
|
|
|
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); |
|
|
|
|
|
|
|
|
|
|
|
glm::mat4 m_model = g_scene_matrices.model; |
|
|
|
glm::mat4 m_model = g_render_state->cam.model; |
|
|
|
glm::mat4 m_view = g_scene_matrices.view; |
|
|
|
glm::mat4 m_view = g_render_state->cam.view; |
|
|
|
glm::mat4 m_projection = g_scene_matrices.projection; |
|
|
|
glm::mat4 m_projection = g_render_state->cam.projection; |
|
|
|
|
|
|
|
|
|
|
|
// filled hexes
|
|
|
|
// filled hexes
|
|
|
|
|
|
|
|
|
|
|
|
@ -385,8 +375,8 @@ renderDebug(render_state* rs, std::vector<Point> &vertices) |
|
|
|
buf[6] = vertices[2].x; buf[7] = vertices[2].y; buf[8] = 0; |
|
|
|
buf[6] = vertices[2].x; buf[7] = vertices[2].y; buf[8] = 0; |
|
|
|
buf[9] = vertices[3].x; buf[10] = vertices[3].y; buf[11] = 0; |
|
|
|
buf[9] = vertices[3].x; buf[10] = vertices[3].y; buf[11] = 0; |
|
|
|
|
|
|
|
|
|
|
|
rgDraw(g_debug_render_group, g_scene_matrices.model, g_scene_matrices.view, |
|
|
|
rgDraw(g_debug_render_group, g_render_state->cam.model, g_render_state->cam.view, |
|
|
|
g_scene_matrices.projection, rs->lights, rs->num_lights, true); |
|
|
|
g_render_state->cam.projection, rs->lights, rs->num_lights, true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -399,65 +389,24 @@ initMatrices(projection_type p) |
|
|
|
|
|
|
|
|
|
|
|
if (p == PERSPECTIVE) |
|
|
|
if (p == PERSPECTIVE) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// TODO: replace referernces to g_scene_matrices with camera.matrix_name
|
|
|
|
g_render_state->cam.projection = g_render_state->cam.projection; |
|
|
|
g_scene_matrices.projection = g_render_state->cam.projection; |
|
|
|
g_render_state->cam.view = g_render_state->cam.view; |
|
|
|
g_scene_matrices.view = g_render_state->cam.view; |
|
|
|
//g_render_state->cam.model = g_render_state->cam.model;
|
|
|
|
//g_scene_matrices.model = g_render_state->cam.model;
|
|
|
|
//g_render_state->cam.MVP = g_render_state->cam.MVP;
|
|
|
|
//g_scene_matrices.MVP = g_render_state->cam.MVP;
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
|
|
|
g_scene_matrices.projection = glm::infinitePerspective( |
|
|
|
|
|
|
|
glm::radians(60.f), // FoV
|
|
|
|
|
|
|
|
16.f / 9.f, // ascpect ratio
|
|
|
|
|
|
|
|
0.1f // near clip plane
|
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
g_render_state->cam.position = glm::vec3(640,0,100); |
|
|
|
|
|
|
|
g_render_state->cam.target = glm::vec3(640,500,0); |
|
|
|
|
|
|
|
//g_render_state->cam.target = glm::vec3(0,0,0);
|
|
|
|
|
|
|
|
// inital rotation should match target direction
|
|
|
|
|
|
|
|
glm::vec3 &p = g_render_state->cam.position; |
|
|
|
|
|
|
|
glm::vec3 &t = g_render_state->cam.target; |
|
|
|
|
|
|
|
g_render_state->cam.hAngle = 0; |
|
|
|
|
|
|
|
g_render_state->cam.vAngle = glm::atan((t.z - p.z) / (t.y - p.y)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////
|
|
|
|
|
|
|
|
// TODO: add call to rotate camera here to remove duplicate code
|
|
|
|
|
|
|
|
camera &c = g_render_state->cam; |
|
|
|
|
|
|
|
float &h = c.hAngle; |
|
|
|
|
|
|
|
float &v = c.vAngle; |
|
|
|
|
|
|
|
c.forward = glm::vec3( |
|
|
|
|
|
|
|
glm::cos(v) * glm::sin(h), |
|
|
|
|
|
|
|
glm::cos(v) * glm::cos(h), |
|
|
|
|
|
|
|
glm::sin(v) |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
glm::normalize(c.forward); |
|
|
|
|
|
|
|
//////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
g_render_state->cam.up = glm::vec3(0,1,0); |
|
|
|
|
|
|
|
g_render_state->cam.left = glm::normalize(glm::cross(g_render_state->cam.up, g_render_state->cam.forward)); |
|
|
|
|
|
|
|
g_render_state->cam.up = glm::normalize(glm::cross(g_render_state->cam.forward, g_render_state->cam.left)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
g_scene_matrices.view = glm::lookAt( |
|
|
|
|
|
|
|
g_render_state->cam.position, // camera position
|
|
|
|
|
|
|
|
g_render_state->cam.position + g_render_state->cam.forward, |
|
|
|
|
|
|
|
g_render_state->cam.up // "up" vector
|
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else // ORTHO
|
|
|
|
else // ORTHO
|
|
|
|
{ |
|
|
|
{ |
|
|
|
// left, right, bottom, top, zNear, zFar
|
|
|
|
// left, right, bottom, top, zNear, zFar
|
|
|
|
g_scene_matrices.projection = glm::ortho(0.f, 1280.0f, 0.f, 720.0f, 0.1f, 100.0f); |
|
|
|
g_render_state->cam.projection = glm::ortho(0.f, 1280.0f, 0.f, 720.0f, 0.1f, 100.0f); |
|
|
|
g_scene_matrices.view = glm::lookAt( |
|
|
|
g_render_state->cam.view = glm::lookAt( |
|
|
|
glm::vec3(0.0f, 0.0f, 1.0f), // camera position
|
|
|
|
glm::vec3(0.0f, 0.0f, 1.0f), // camera position
|
|
|
|
glm::vec3(0.0f, 0.0f, 0.0f), // look at position
|
|
|
|
glm::vec3(0.0f, 0.0f, 0.0f), // look at position
|
|
|
|
glm::vec3(0,1,0) // "up" vector
|
|
|
|
glm::vec3(0,1,0) // "up" vector
|
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
g_scene_matrices.model = glm::mat4(1.0f); |
|
|
|
g_render_state->cam.model = glm::mat4(1.0f); |
|
|
|
g_scene_matrices.MVP = g_scene_matrices.projection * g_scene_matrices.view * g_scene_matrices.model; |
|
|
|
g_render_state->cam.MVP = g_render_state->cam.projection * g_render_state->cam.view * g_render_state->cam.model; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
|