diff options
-rw-r--r-- | scene.cpp | 4 | ||||
-rw-r--r-- | terrain.cpp | 152 | ||||
-rw-r--r-- | terrain.h | 1 |
3 files changed, 76 insertions, 81 deletions
@@ -315,7 +315,6 @@ void Scene::render() { //const float light_pos[4] = {0, 1, 0, 0}; //glLightfv(GL_LIGHT0, GL_POSITION, light_pos); - unsigned int chunks_rendered = 0; if(render_terrain) { terrain_program.use(); GLint show_sel = glGetUniformLocation(terrain_program.get_program(), "show_sel"); @@ -354,7 +353,6 @@ void Scene::render() { continue; } else if(!chunk->vbo_object) continue;*/ - chunks_rendered++; glPushMatrix(); glTranslatef(-pos.x + chunk->x, -pos.y, -pos.z + chunk->y); if(show_selection) @@ -430,7 +428,7 @@ void Scene::render() { glColor3f(1, 1, 1); glTranslatef(0, video::height-height, 0); font->Render((boost::format("chunks: %d gravity: %d steps: %d") - % chunks_rendered % gravity % steps).str().c_str()); + % terrain->chunks.size() % gravity % steps).str().c_str()); //font->Render((boost::format("%dx%d %d levels %d nodes tree creation time: %f steps: %d update: %d") // % scene.qt->width % scene.qt->height % scene.qt->levels % scene.qt->nodes % scene.qt->init_time % steps % scene.qt->thread_running).str().c_str()); //glTranslatef(0, height, 0); diff --git a/terrain.cpp b/terrain.cpp index f606cc2..e0f635a 100644 --- a/terrain.cpp +++ b/terrain.cpp @@ -54,19 +54,19 @@ float Terrain::Node::distance(float px, float pz) { void Terrain::Node::fill() { vertex_array[0] = x; - vertex_array[1] = chunk->heights[(int)floorf((x)*(chunk->height+1)+y)]; + vertex_array[1] = chunk->heights[(int)floorf((x)*(chunk->h_height)+y)]; vertex_array[2] = y; vertex_array[3] = x; - vertex_array[4] = chunk->heights[(int)floorf((x)*(chunk->height+1) + (y + 1))]; + vertex_array[4] = chunk->heights[(int)floorf((x)*(chunk->h_height) + (y + 1))]; vertex_array[5] = y + 1; vertex_array[6] = x + 1; - vertex_array[7] = chunk->heights[(int)floorf((x + 1)*(chunk->height+1) + (y + 1))]; + vertex_array[7] = chunk->heights[(int)floorf((x + 1)*(chunk->h_height) + (y + 1))]; vertex_array[8] = y + 1; vertex_array[9] = x + 1; - vertex_array[10] = chunk->heights[(int)floorf((x + 1)*(chunk->height+1) + y)]; + vertex_array[10] = chunk->heights[(int)floorf((x + 1)*(chunk->h_height) + y)]; vertex_array[11] = y; } @@ -86,7 +86,7 @@ void Terrain::Node::draw_grid() { void Terrain::Node::draw_normal() { glNormal3f(0, 1, 0); glColor3f(1, 0, 0); - int i = (int)(x*(chunk->height+1) + y); + int i = (int)(x*(chunk->h_height) + y); glBegin(GL_LINES); Vector3 N = chunk->normals[i]; glVertex3f(chunk->x + x, chunk->heights[i], chunk->y + y); @@ -119,10 +119,12 @@ Terrain::Chunk::Chunk(Terrain *terrain, float x, float y, float width, float hei this->y = y; this->width = width; this->height = height; + this->h_width = width+1; + this->h_height = height+1; this->vbo_object = this->node_count = this->vertices = 0; this->nodes = NULL; - heights = terrain->generate_heights(x, y, width+1, height+1); - normals = new Vector3[(int)((width+1)*(height+1))]; + heights = terrain->get_chunk(x, y, h_width, h_height); + normals = new Vector3[(int)((h_width)*(h_height))]; calc_normals(); @@ -229,10 +231,10 @@ void Terrain::Chunk::make_vbo() { float *n = buffer + vertices_size + normal_chunk_size*index; - Vector3 bl = normals[(int)((node->x+1)*(height+1) + node->y)]; - Vector3 br = normals[(int)((node->x)*(height+1) + node->y)]; - Vector3 tr = normals[(int)((node->x)*(height+1) + node->y+1)]; - Vector3 tl = normals[(int)((node->x+1)*(height+1) + node->y+1)]; + Vector3 bl = normals[(int)((node->x+1)*(h_height) + node->y)]; + Vector3 br = normals[(int)((node->x)*(h_height) + node->y)]; + Vector3 tr = normals[(int)((node->x)*(h_height) + node->y+1)]; + Vector3 tl = normals[(int)((node->x+1)*(h_height) + node->y+1)]; n[0] = n[9] = br.x; n[1] = n[10] = br.y; @@ -264,71 +266,65 @@ Terrain::Node* Terrain::Chunk::find(float x, float y) { void Terrain::Chunk::calc_normals() { float *right, *left, *up, *down; right = left = up = down = NULL; - if(terrain->has_chunk(this->x - chunk_size, this->y)) - right = terrain->get_chunk(this->x - chunk_size, this->y, width, height); - if(terrain->has_chunk(this->x + chunk_size, this->y)) - left = terrain->get_chunk(this->x + chunk_size, this->y, width, height); - if(terrain->has_chunk(this->x, this->y + chunk_size)) - up = terrain->get_chunk(this->x, this->y + chunk_size, width, height); - if(terrain->has_chunk(this->x, this->y - chunk_size)) - down = terrain->get_chunk(this->x, this->y - chunk_size, width, height); - - for(int x = 0; x < width; x++) { - for(int y = 0; y < height; y++) { - Vector3 p(x, heights[x*(int)(height+1) + y], y); - Vector3 N; - Vector3 temp; - - // TODO: fix border bugginess + right = terrain->get_chunk(this->x - chunk_size, this->y, h_width, h_height); + left = terrain->get_chunk(this->x + chunk_size, this->y, h_width, h_height); + up = terrain->get_chunk(this->x, this->y + chunk_size, h_width, h_height); + down = terrain->get_chunk(this->x, this->y - chunk_size, h_width, h_height); + + for(int x = 0; x < h_width; x++) { + for(int y = 0; y < h_height; y++) { + Vector3 p(x, heights[x*h_height + y], y); + Vector3 N, U, V; float h; - if(x > 0 || right) { - if(x == 0) - h = right[(chunk_size-1)*(int)(height) + y]; - else - h = heights[(x-1)*(int)(height+1) + y]; - Vector3 U = Vector3(x-1, h, y) - p; - if(y > 0 || down) { - if(y == 0) - h = down[x*(int)(height) + chunk_size - 1]; - else - h = heights[x*(int)(height+1) + y - 1]; - Vector3 V = Vector3(x, h, y-1) - p; - N += V.cross(U); - } - if(y < height-1 || up) { - if(y == height-1) - h = up[x*(int)(height)]; // y == 0 - else - h = heights[x*(int)(height+1) + y + 1]; - Vector3 V = Vector3(x, h, y+1) - p; - N += U.cross(V); - } - } - if(x < width-1 || left) { - if(x == width-1) - h = left[y]; // x == 0 - else - h = heights[(x+1)*(int)(height+1) + y]; - Vector3 U = Vector3(x+1, h, y) - p; - if(y > 0 || down) { - if(y == 0) - h = down[x*(int)(height) + chunk_size - 1]; - else - h = heights[x*(int)(height+1) + y - 1]; - Vector3 V = Vector3(x, h, y-1) - p; - N += U.cross(V); - } - if(y < height-1 || up) { - if(y == height-1) - h = up[x*(int)(height)]; // y == 0 - else - h = heights[x*(int)(height+1) + y + 1]; - Vector3 V = Vector3(x, h, y+1) - p; - N += V.cross(U); - } - } + + // right + if(x == 0) + h = right[(chunk_size-1)*(int)(h_height) + y]; + else + h = heights[(x-1)*h_height + y]; + U = Vector3(x-1, h, y) - p; + + // down + if(y == 0) + h = down[x*(int)(h_height) + chunk_size - 1]; + else + h = heights[x*h_height + y - 1]; + V = Vector3(x, h, y-1) - p; + N += V.cross(U); + + // up + if(y == h_height-1) + h = up[x*(int)(h_height) + 1]; // y == 1 + else + h = heights[x*h_height + y + 1]; + V = Vector3(x, h, y+1) - p; + N += U.cross(V); + + // left + if(x == h_width-1) + h = left[h_height + y]; // x == 1 + else + h = heights[(x+1)*h_height + y]; + U = Vector3(x+1, h, y) - p; + + //down + if(y == 0) + h = down[x*(int)(h_height) + chunk_size - 1]; + else + h = heights[x*h_height + y - 1]; + V = Vector3(x, h, y-1) - p; + N += U.cross(V); + + // up + if(y == h_height-1) + h = up[x*(int)(h_height) + 1]; // y == 1 + else + h = heights[x*h_height + y + 1]; + V = Vector3(x, h, y+1) - p; + N += V.cross(U); + N /= N.length(); - normals[x*(int)(height+1) + y] = N; + normals[x*h_height + y] = N; } } @@ -402,7 +398,7 @@ void Terrain::raise(float x, float z, float radius, float focus, float strength, v /= radius * (focus/2); Node *node = find(i, j); - int index = (i-node->chunk->x)*(node->chunk->height+1) + j-node->chunk->y; + int index = (i-node->chunk->x)*(node->chunk->h_height) + j-node->chunk->y; if(up) node->chunk->heights[index] += v; else @@ -412,7 +408,7 @@ void Terrain::raise(float x, float z, float radius, float focus, float strength, if(i % chunk_size == 0) { node = find(i-chunk_size, j); if(node) { - index = (chunk_size)*(node->chunk->height+1) + j-node->chunk->y; + index = (chunk_size)*(node->chunk->h_height) + j-node->chunk->y; if(up) node->chunk->heights[index] += v; else @@ -422,7 +418,7 @@ void Terrain::raise(float x, float z, float radius, float focus, float strength, if(j % chunk_size == 0) { node = find(i, j-chunk_size); if(node) { - index = (i-node->chunk->x)*(node->chunk->height+1) + chunk_size; + index = (i-node->chunk->x)*(node->chunk->h_height) + chunk_size; if(up) node->chunk->heights[index] += v; else @@ -432,7 +428,7 @@ void Terrain::raise(float x, float z, float radius, float focus, float strength, if(i % chunk_size == 0 && j % chunk_size == 0) { node = find(i-chunk_size, j-chunk_size); if(node) { - index = (chunk_size)*(node->chunk->height+1) + chunk_size; + index = (chunk_size)*(node->chunk->h_height) + chunk_size; if(up) node->chunk->heights[index] += v; else @@ -33,6 +33,7 @@ class Terrain { Terrain *terrain; Node **nodes; float x, y, width, height; + int h_width, h_height; float *heights; Vector3 *normals; size_t buf_size; |