summaryrefslogtreecommitdiff
path: root/scene.cpp
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2011-05-07 17:53:37 +0200
committerJon Bergli Heier <snakebite@jvnv.net>2011-05-07 17:53:37 +0200
commit17715403aff8ba1889c9e1ef473fe9319b87d1d2 (patch)
tree459d789562ef6c7279045e86b4df5751427a9023 /scene.cpp
parentf0eb6a7b101afba52f33c5286e15a862ee68c64e (diff)
Use chunk-relative coordinates in nodes.
Diffstat (limited to 'scene.cpp')
-rw-r--r--scene.cpp37
1 files changed, 22 insertions, 15 deletions
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;
}