diff --git a/cubes.c b/cubes.c index 44e1085..6945ed4 100644 --- a/cubes.c +++ b/cubes.c @@ -41,7 +41,6 @@ void gen_face(Vertex *cube, int i, int x, int y, int z, int x2, int y2, int z2, Vertex c = a2; Vertex d = a2; - if (is_text) { b.pos[0] += TEXT_GAP_H; c.pos[1] += TEXT_GAP_V; @@ -78,12 +77,21 @@ void *gen_chunk(void *args) { Vertex *text = args2.text; // int is_text = args2.is_text; - int the_j = (((z2 / CHUNK_LENGTH)%a3) + ((x2 / CHUNK_LENGTH)%a3) * CHUNK_DIAMETER_H + - ((y2 / CHUNK_LENGTH)%a3) * CHUNK_DIAMETER_H * CHUNK_DIAMETER_H) % - CHUNK_ALL; + int the_j = (((z2 / CHUNK_LENGTH) % CHUNK_DIAMETER_H) + + ((x2 / CHUNK_LENGTH) % CHUNK_DIAMETER_H) * CHUNK_DIAMETER_H + + ((y2 / CHUNK_LENGTH) % CHUNK_DIAMETER_V) * CHUNK_DIAMETER_H * + CHUNK_DIAMETER_H) % + (CHUNK_ALL * CBUF_ALL); + + Chunk old_chunk = chunk_old[the_j > 0 ? the_j : 0]; + + int cached = + (old_chunk.x == x2 / CHUNK_LENGTH && old_chunk.y == y2 / CHUNK_LENGTH && + old_chunk.z == z2 / CHUNK_LENGTH && old_chunk.exists != 0); Chunk chunk = - fetch_chunk(x2 / CHUNK_LENGTH, y2 / CHUNK_LENGTH, z2 / CHUNK_LENGTH, a, - chunk_old[the_j > 0 ? the_j : 0].exists, read_order); + cached ? old_chunk + : fetch_chunk(x2 / CHUNK_LENGTH, y2 / CHUNK_LENGTH, + z2 / CHUNK_LENGTH, a, old_chunk.exists, read_order); if (chunk.exists != 0 && the_j > 0) chunk_old[the_j] = chunk; @@ -142,7 +150,7 @@ int gen_cubes(Vertex *cube, Vertex *text, int x, int y, int z, int r, } if (!chunk_old) { - chunk_old = calloc(CHUNK_ALL, sizeof(struct Chunk)); + chunk_old = calloc((CHUNK_ALL * CBUF_ALL), sizeof(struct Chunk)); } read_order = !read_order; pthread_t thread_id[a3]; @@ -156,11 +164,14 @@ int gen_cubes(Vertex *cube, Vertex *text, int x, int y, int z, int r, z2 <= z + (CHUNK_RADIUS_H + r) * CHUNK_LENGTH; z2 += CHUNK_LENGTH) { VertexI pos = { - {x + (((x2 / CHUNK_LENGTH) % (CHUNK_DIAMETER_H + r * 2))) * + {x + (((x2 / CHUNK_LENGTH) % (CHUNK_DIAMETER_H + r * 2)) - + CHUNK_RADIUS_H) * CHUNK_LENGTH, - y + (((y2 / CHUNK_LENGTH) % (CHUNK_DIAMETER_V + r * 2))) * + y + (((y2 / CHUNK_LENGTH) % (CHUNK_DIAMETER_V + r * 2)) - + CHUNK_RADIUS_V) * CHUNK_LENGTH, - z + (((z2 / CHUNK_LENGTH) % (CHUNK_DIAMETER_H + r * 2))) * + z + (((z2 / CHUNK_LENGTH) % (CHUNK_DIAMETER_H + r * 2)) - + CHUNK_RADIUS_H) * CHUNK_LENGTH}}; int a2 = a % a3; diff --git a/main.c b/main.c index 01d9180..a00278d 100644 --- a/main.c +++ b/main.c @@ -43,7 +43,7 @@ static const char *fragment_shader_text = "{\n" //" color=vec4(v_tex.rg,0.5,0.5);\n" " if (v_tex.x < 0.0 || v_tex.y < 0.0) { discard; }\n" - " dist = distance(v_pos_out, center)/65;\n" + " dist = distance(v_pos_out, center + vec3(8,8,8))/65;\n" " if (dist > 1.0) { dist = 1.0; }\n" " color=vec4(texture(sampler_tex, v_tex).rgb,1.0)*(1.0-(dist*dist)) + vec4(0.2,0.5,0.7,1.0)*(dist*dist);\n" "}\n"; @@ -240,9 +240,9 @@ int main(void) { glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat *)&mvp); glUniform3fv(center_location, 1, (const GLfloat *)(&(oldPos[0]))); - int ax = (int)(oldPos[0] / CHUNK_LENGTH) - (int)(pos[0] / CHUNK_LENGTH); - int ay = (int)(oldPos[1] / CHUNK_LENGTH) - (int)(pos[1] / CHUNK_LENGTH); - int az = (int)(oldPos[2] / CHUNK_LENGTH) - (int)(pos[2] / CHUNK_LENGTH); + int ax = (int)(oldPos[0]/ CHUNK_LENGTH) - (int)(pos[0] / CHUNK_LENGTH); + int ay = (int)(oldPos[1]/ CHUNK_LENGTH) - (int)(pos[1] / CHUNK_LENGTH); + int az = (int)(oldPos[2]/ CHUNK_LENGTH) - (int)(pos[2] / CHUNK_LENGTH); if ((ax != 0 || ay != 0 || az != 0) && last_render < 0) { struct args args; @@ -259,9 +259,9 @@ int main(void) { last_render = 120; if (thread_id == 0) { - oldPos[0] = pos[0]; - oldPos[1] = pos[1]; - oldPos[2] = pos[2]; + oldPos[0] = (int)(pos[0]/ CHUNK_LENGTH) * CHUNK_LENGTH; + oldPos[1] = (int)(pos[1]/ CHUNK_LENGTH) * CHUNK_LENGTH; + oldPos[2] = (int)(pos[2]/ CHUNK_LENGTH) * CHUNK_LENGTH; pthread_create(&(thread_id), NULL, render_chunks, (void *)&(args)); } }