Browse Source

move scene_matrices into camera struct

master
cinnaboot 8 years ago
parent
commit
f65732c79b
  1. 91
      src/renderer.cpp

91
src/renderer.cpp

@ -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

Loading…
Cancel
Save