summaryrefslogtreecommitdiff
path: root/terrain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'terrain.cpp')
-rw-r--r--terrain.cpp152
1 files changed, 74 insertions, 78 deletions
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