diff --git a/bin/back b/bin/back index ee18efe..888a04d 100755 Binary files a/bin/back and b/bin/back differ diff --git a/obj/display.o b/obj/display.o index 76cd7fa..19b7c36 100644 Binary files a/obj/display.o and b/obj/display.o differ diff --git a/obj/generation.o b/obj/generation.o index eb68cf8..75b899f 100644 Binary files a/obj/generation.o and b/obj/generation.o differ diff --git a/src/display.c b/src/display.c index 24b6218..1f10577 100644 --- a/src/display.c +++ b/src/display.c @@ -404,7 +404,115 @@ void renderTriangle( construct_vertex(1500.0 * (1.0 + (px2 / (1.5 * pz2 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py2 / (pz2 * tan_fov))) / 2.0, red, green, blue), }; SDL_RenderGeometry(renderer, NULL, vtxs, 3, NULL, 0); - } // TODO // + } else if((pz0 >= 0.4) + (pz1 >= 0.4) + (pz2 >= 0.4) == 2) { + double fpx0; double fpy0; double fpz0; + double fpx1; double fpy1; double fpz1; + double mpx0; double mpy0; double mpz0; + double mpx1; double mpy1; double mpz1; + if(pz0 < 0.4) { + // pz1 >= 0.4 and pz2 >+ 0.4 + fpx0 = px1 ; fpy0 = py1 ; fpz0 = pz1 ; + fpx1 = px2 ; fpy1 = py2 ; fpz1 = pz2 ; + // 1-0 segment + project_to_camera( + convex_pt(x1, x0, (pz1 - 0.4)/(pz1 - pz0)), + convex_pt(y1, y0, (pz1 - 0.4)/(pz1 - pz0)), + convex_pt(z1, z0, (pz1 - 0.4)/(pz1 - pz0)), + &mpx0, &mpy0, &mpz0) ; + + // 0-2 segment + project_to_camera( + convex_pt(x2, x0, (pz2 - 0.4)/(pz2 - pz0)), + convex_pt(y2, y0, (pz2 - 0.4)/(pz2 - pz0)), + convex_pt(z2, z0, (pz2 - 0.4)/(pz2 - pz0)), + &mpx1, &mpy1, &mpz1) ; + } else if(pz1 < 0.4) { + // pz0 >= 0.4 and pz2 >+ 0.4 + fpx0 = px0 ; fpy0 = py0 ; fpz0 = pz0 ; + fpx1 = px2 ; fpy1 = py2 ; fpz1 = pz2 ; + // 0-1 segment + project_to_camera( + convex_pt(x0, x1, (pz0 - 0.4)/(pz0 - pz1)), + convex_pt(y0, y1, (pz0 - 0.4)/(pz0 - pz1)), + convex_pt(z0, z1, (pz0 - 0.4)/(pz0 - pz1)), + &mpx0, &mpy0, &mpz0) ; + + // 1-2 segment + project_to_camera( + convex_pt(x2, x1, (pz2 - 0.4)/(pz2 - pz1)), + convex_pt(y2, y1, (pz2 - 0.4)/(pz2 - pz1)), + convex_pt(z2, z1, (pz2 - 0.4)/(pz2 - pz1)), + &mpx1, &mpy1, &mpz1) ; + } else if(pz2 < 0.4) { + // pz1 >= 0.4 and pz0 >+ 0.4 + fpx0 = px0 ; fpy0 = py0 ; fpz0 = pz0 ; + fpx1 = px1 ; fpy1 = py1 ; fpz1 = pz1 ; + // 0-2 segment + project_to_camera( + convex_pt(x0, x2, (pz0 - 0.4)/(pz0 - pz2)), + convex_pt(y0, y2, (pz0 - 0.4)/(pz0 - pz2)), + convex_pt(z0, z2, (pz0 - 0.4)/(pz0 - pz2)), + &mpx0, &mpy0, &mpz0) ; + + // 1-2 segment + project_to_camera( + convex_pt(x1, x2, (pz1 - 0.4)/(pz1 - pz2)), + convex_pt(y1, y2, (pz1 - 0.4)/(pz1 - pz2)), + convex_pt(z1, z2, (pz1 - 0.4)/(pz1 - pz2)), + &mpx1, &mpy1, &mpz1) ; + } + + const SDL_Vertex vtxs[6] = { + construct_vertex(1500.0 * (1.0 + (fpx0 / (1.5 * fpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy0 / (fpz0 * tan_fov))) / 2.0, red, green, blue), + construct_vertex(1500.0 * (1.0 + (mpx0 / (1.5 * mpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy0 / (mpz0 * tan_fov))) / 2.0, red, green, blue), + construct_vertex(1500.0 * (1.0 + (fpx1 / (1.5 * fpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy1 / (fpz1 * tan_fov))) / 2.0, red, green, blue), + construct_vertex(1500.0 * (1.0 + (mpx0 / (1.5 * mpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy0 / (mpz0 * tan_fov))) / 2.0, red, green, blue), + construct_vertex(1500.0 * (1.0 + (mpx1 / (1.5 * mpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy1 / (mpz1 * tan_fov))) / 2.0, red, green, blue), + construct_vertex(1500.0 * (1.0 + (fpx1 / (1.5 * fpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy1 / (fpz1 * tan_fov))) / 2.0, red, green, blue), + }; + SDL_RenderGeometry(renderer, NULL, vtxs, 6, NULL, 0); + } else if((pz0 >= 0.4) + (pz1 >= 0.4) + (pz2 >= 0.4) == 1) { + if(pz0 >= 0.4) { + project_to_camera( + convex_pt(x0, x1, (pz0 - 0.4)/(pz0 - pz1)), + convex_pt(y0, y1, (pz0 - 0.4)/(pz0 - pz1)), + convex_pt(z0, z1, (pz0 - 0.4)/(pz0 - pz1)), + &px1, &py1, &pz1); + project_to_camera( + convex_pt(x0, x2, (pz0 - 0.4)/(pz0 - pz2)), + convex_pt(y0, y2, (pz0 - 0.4)/(pz0 - pz2)), + convex_pt(z0, z2, (pz0 - 0.4)/(pz0 - pz2)), + &px2, &py2, &pz2); + } else if(pz1 >= 0.4) { + project_to_camera( + convex_pt(x1, x0, (pz1 - 0.4)/(pz1 - pz0)), + convex_pt(y1, y0, (pz1 - 0.4)/(pz1 - pz0)), + convex_pt(z1, z0, (pz1 - 0.4)/(pz1 - pz0)), + &px0, &py0, &pz0); + project_to_camera( + convex_pt(x1, x2, (pz1 - 0.4)/(pz1 - pz2)), + convex_pt(y1, y2, (pz1 - 0.4)/(pz1 - pz2)), + convex_pt(z1, z2, (pz1 - 0.4)/(pz1 - pz2)), + &px2, &py2, &pz2); + } else if(pz2 >= 0.4) { + project_to_camera( + convex_pt(x2, x0, (pz2 - 0.4)/(pz2 - pz0)), + convex_pt(y2, y0, (pz2 - 0.4)/(pz2 - pz0)), + convex_pt(z2, z0, (pz2 - 0.4)/(pz2 - pz0)), + &px0, &py0, &pz0); + project_to_camera( + convex_pt(x2, x1, (pz2 - 0.4)/(pz2 - pz1)), + convex_pt(y2, y1, (pz2 - 0.4)/(pz2 - pz1)), + convex_pt(z2, z1, (pz2 - 0.4)/(pz2 - pz1)), + &px1, &py1, &pz1); + } + const SDL_Vertex vtxs[3] = { + construct_vertex(1500.0 * (1.0 + (px0 / (1.5 * pz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py0 / (pz0 * tan_fov))) / 2.0, red, green, blue), + construct_vertex(1500.0 * (1.0 + (px1 / (1.5 * pz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py1 / (pz1 * tan_fov))) / 2.0, red, green, blue), + construct_vertex(1500.0 * (1.0 + (px2 / (1.5 * pz2 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py2 / (pz2 * tan_fov))) / 2.0, red, green, blue), + }; + SDL_RenderGeometry(renderer, NULL, vtxs, 3, NULL, 0); + } } void renderTriangleRotated( diff --git a/src/generation.c b/src/generation.c index df21cb3..3821e93 100644 --- a/src/generation.c +++ b/src/generation.c @@ -39,9 +39,9 @@ void build_chunk_1(int chx, int chy) { new->map[5] = create_cube_0(4.0, 1.0, 4.0, 1.0, 5.0, 1.0, 0.0, 0.0, 255, 255, 128); new->tps[0] = create_teleporter(-1.0, 1.0, 2.0, 1.0, 2.0 + (double)(rand()%2), 1.0, 3.14159/4.0, 0.0, 255, 0, 0 , chx-1, chy , 2.5, 2.5, 2.5); - new->tps[1] = create_teleporter(2.0, 1.0, -1.0, 1.0, 2.0 + (double)(rand()%2), 1.0, 3.14159/4.0, 0.0, 255, 255, 0, chx , chy+1, 2.5, 2.5, 2.5); + new->tps[1] = create_teleporter(2.0, 1.0, -1.0, 1.0, 2.0 + (double)(rand()%2), 1.0, 3.14159/4.0, 0.0, 255, 255, 0, chx , chy-1, 2.5, 2.5, 2.5); new->tps[2] = create_teleporter(5.0, 1.0, 2.0, 1.0, 2.0 + (double)(rand()%2), 1.0, 3.14159/4.0, 0.0, 0, 255, 0 , chx+1, chy , 2.5, 2.5, 2.5); - new->tps[3] = create_teleporter(2.0, 1.0, 5.0, 1.0, 2.0 + (double)(rand()%2), 1.0, 3.14159/4.0, 0.0, 0, 0, 255 , chx , chy-1, 2.5, 2.5, 2.5); + new->tps[3] = create_teleporter(2.0, 1.0, 5.0, 1.0, 2.0 + (double)(rand()%2), 1.0, 3.14159/4.0, 0.0, 0, 0, 255 , chx , chy+1, 2.5, 2.5, 2.5); //printf("linked (%d, %d) to :\n", chx, chy); //printf(" {%d, %d}; {%d, %d}; {%d, %d}; {%d, %d}\n", chx-1, chy, chx, chy+1, chx+1, chy, chx, chy-1);