From 17715403aff8ba1889c9e1ef473fe9319b87d1d2 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sat, 7 May 2011 17:53:37 +0200 Subject: Use chunk-relative coordinates in nodes. --- scene.cpp | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) (limited to 'scene.cpp') diff --git a/scene.cpp b/scene.cpp index 28f4fcc..b67468b 100644 --- a/scene.cpp +++ b/scene.cpp @@ -76,11 +76,9 @@ void Scene::lookat() { * z = sin Φ sin θ */ Vector3 center(sinf(pitch) * cosf(yaw), cosf(pitch), sinf(pitch) * sinf(yaw)); - center += pos; center.y += cam_height; - //Vector3 up(cosf(yaw) * cosf(pitch), sinf(pitch), sinf(yaw) * cosf(pitch)); Vector3 up(-cosf(pitch) * cosf(yaw), sinf(pitch), -cosf(pitch) * sinf(yaw)); - gluLookAt(pos.x, pos.y+cam_height, pos.z, + gluLookAt(0, cam_height, 0, center.x, center.y, center.z, up.x, up.y, up.z); } @@ -321,9 +319,11 @@ void Scene::render() { terrain_program.use(); GLint show_sel = glGetUniformLocation(terrain_program.get_program(), "show_sel"); glUniform1i(show_sel, show_selection ? 1 : 0); + GLint chunk_pos; if(show_selection) { GLint selpos = glGetUniformLocation(terrain_program.get_program(), "selpos"); glUniform3f(selpos, selected.x, selected.y, selected.z); + chunk_pos = glGetUniformLocation(terrain_program.get_program(), "chunk_pos"); } glEnable(GL_TEXTURE_2D); @@ -352,17 +352,24 @@ void Scene::render() { } else if(!chunk->vbo_object) continue; chunks_rendered++; - glBindBuffer(GL_ARRAY_BUFFER, chunk->vbo_object); - glVertexPointer(3, GL_FLOAT, 0, NULL); - glNormalPointer(GL_FLOAT, 0, (GLvoid*)(chunk->vertices*3*sizeof(float))); - glTexCoordPointer(2, GL_FLOAT, 0, (GLvoid*)(chunk->vertices*3*sizeof(float)*2)); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glDrawArrays(GL_TRIANGLES, 0, chunk->vertices); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glPushMatrix(); + glTranslatef(-pos.x + chunk->x, -pos.y, -pos.z + chunk->y); + if(show_selection) + glUniform2f(chunk_pos, chunk->x, chunk->y); + + glBindBuffer(GL_ARRAY_BUFFER, chunk->vbo_object); + glVertexPointer(3, GL_FLOAT, 0, NULL); + glNormalPointer(GL_FLOAT, 0, (GLvoid*)(chunk->vertices*3*sizeof(float))); + glTexCoordPointer(2, GL_FLOAT, 0, (GLvoid*)(chunk->vertices*3*sizeof(float)*2)); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glDrawArrays(GL_TRIANGLES, 0, chunk->vertices); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + glPopMatrix(); } glBindBuffer(GL_ARRAY_BUFFER, 0); glDisable(GL_TEXTURE_2D); @@ -396,7 +403,7 @@ void Scene::render() { float px, py, pz; if(do_select && select(sx, sy, px, py, pz)) { do_select = false; - selected = Vector3(px, py, pz); + selected = Vector3(pos.x + px, pos.y + py, pos.z + pz); show_selection = true; } -- cgit v1.2.3