diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2011-05-07 17:53:37 +0200 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2011-05-07 17:53:37 +0200 |
commit | 17715403aff8ba1889c9e1ef473fe9319b87d1d2 (patch) | |
tree | 459d789562ef6c7279045e86b4df5751427a9023 /scene.cpp | |
parent | f0eb6a7b101afba52f33c5286e15a862ee68c64e (diff) |
Use chunk-relative coordinates in nodes.
Diffstat (limited to 'scene.cpp')
-rw-r--r-- | scene.cpp | 37 |
1 files changed, 22 insertions, 15 deletions
@@ -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; } |