experimenting with z buffering
This commit is contained in:
parent
fc1c266b49
commit
d962951880
BIN
obj/display.o
BIN
obj/display.o
Binary file not shown.
BIN
obj/triangles.o
BIN
obj/triangles.o
Binary file not shown.
|
@ -20,6 +20,8 @@
|
||||||
#include "generation.h"
|
#include "generation.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
|
|
||||||
|
int flashlight = 20 ;
|
||||||
|
|
||||||
int* drawOrder;
|
int* drawOrder;
|
||||||
|
|
||||||
double draw_constant ;
|
double draw_constant ;
|
||||||
|
@ -474,9 +476,9 @@ void renderTriangleNoProject(
|
||||||
) {
|
) {
|
||||||
|
|
||||||
const SDL_Vertex vtxs[3] = {
|
const SDL_Vertex vtxs[3] = {
|
||||||
construct_vertex(px0, py0, red, green, blue, 255),
|
construct_vertex(px0, py0, max(red - (int)(flashlight*pz0), 0), max(green - (int)(flashlight*pz0), 0), max(blue - (int)(flashlight*pz0), 0), 255),
|
||||||
construct_vertex(px1, py1, red, green, blue, 255),
|
construct_vertex(px1, py1, max(red - (int)(flashlight*pz1), 0), max(green - (int)(flashlight*pz1), 0), max(blue - (int)(flashlight*pz1), 0), 255),
|
||||||
construct_vertex(px2, py2, red, green, blue, 255),
|
construct_vertex(px2, py2, max(red - (int)(flashlight*pz2), 0), max(green - (int)(flashlight*pz2), 0), max(blue - (int)(flashlight*pz2), 0), 255),
|
||||||
};
|
};
|
||||||
if(debug) {
|
if(debug) {
|
||||||
printf("P[*] : (%f, %f), (%f, %f), (%f, %f)\n", vtxs[0].position.x, vtxs[0].position.y, vtxs[1].position.x, vtxs[1].position.y, vtxs[2].position.x, vtxs[2].position.y);
|
printf("P[*] : (%f, %f), (%f, %f), (%f, %f)\n", vtxs[0].position.x, vtxs[0].position.y, vtxs[1].position.x, vtxs[1].position.y, vtxs[2].position.x, vtxs[2].position.y);
|
||||||
|
@ -484,6 +486,14 @@ void renderTriangleNoProject(
|
||||||
SDL_RenderGeometry(renderer, NULL, vtxs, 3, NULL, 0);
|
SDL_RenderGeometry(renderer, NULL, vtxs, 3, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double near = -1.0 ;
|
||||||
|
double far = 1.0 ;
|
||||||
|
double getZbuffer(double z) {
|
||||||
|
//return z;
|
||||||
|
return (2.0*(z - near)/(far - near) -1.0);
|
||||||
|
//return ((far + near)/(far - near) + (1.0/z)*((-2.0*far*near)/(far - near)));
|
||||||
|
}
|
||||||
|
|
||||||
pt_2d to_pt_2d(double x0, double y0, double z0) {
|
pt_2d to_pt_2d(double x0, double y0, double z0) {
|
||||||
pt_2d res;
|
pt_2d res;
|
||||||
res.x = x0;
|
res.x = x0;
|
||||||
|
@ -509,9 +519,9 @@ void addTriangle(
|
||||||
project_to_camera(x1, y1, z1, &px1, &py1, &pz1);
|
project_to_camera(x1, y1, z1, &px1, &py1, &pz1);
|
||||||
project_to_camera(x2, y2, z2, &px2, &py2, &pz2);
|
project_to_camera(x2, y2, z2, &px2, &py2, &pz2);
|
||||||
if(pz0 >= draw_constant && pz1 >= draw_constant && pz2 >= draw_constant) {
|
if(pz0 >= draw_constant && pz1 >= draw_constant && pz2 >= draw_constant) {
|
||||||
triangles_to_render[triangles_i][0] = to_pt_2d(1500.0 * (1.0 + (px0 / (1.5 * pz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py0 / (pz0 * tan_fov))) / 2.0, pz0);
|
triangles_to_render[triangles_i][0] = to_pt_2d(1500.0 * (1.0 + (px0 / (1.5 * pz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py0 / (pz0 * tan_fov))) / 2.0, getZbuffer(pz0));
|
||||||
triangles_to_render[triangles_i][1] = to_pt_2d(1500.0 * (1.0 + (px1 / (1.5 * pz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py1 / (pz1 * tan_fov))) / 2.0, pz1);
|
triangles_to_render[triangles_i][1] = to_pt_2d(1500.0 * (1.0 + (px1 / (1.5 * pz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py1 / (pz1 * tan_fov))) / 2.0, getZbuffer(pz1));
|
||||||
triangles_to_render[triangles_i][2] = to_pt_2d(1500.0 * (1.0 + (px2 / (1.5 * pz2 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py2 / (pz2 * tan_fov))) / 2.0, pz2);
|
triangles_to_render[triangles_i][2] = to_pt_2d(1500.0 * (1.0 + (px2 / (1.5 * pz2 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py2 / (pz2 * tan_fov))) / 2.0, getZbuffer(pz2));
|
||||||
reds[triangles_i] = red ;
|
reds[triangles_i] = red ;
|
||||||
greens[triangles_i] = green ;
|
greens[triangles_i] = green ;
|
||||||
blues[triangles_i] = blue ;
|
blues[triangles_i] = blue ;
|
||||||
|
@ -570,12 +580,12 @@ void addTriangle(
|
||||||
&mpx1, &mpy1, &mpz1) ;
|
&mpx1, &mpy1, &mpz1) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
triangles_to_render[triangles_i][0] = to_pt_2d(1500.0 * (1.0 + (fpx0 / (1.5 * fpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy0 / (fpz0 * tan_fov))) / 2.0, fpz0);
|
triangles_to_render[triangles_i][0] = to_pt_2d(1500.0 * (1.0 + (fpx0 / (1.5 * fpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy0 / (fpz0 * tan_fov))) / 2.0, getZbuffer(fpz0));
|
||||||
triangles_to_render[triangles_i][1] = to_pt_2d(1500.0 * (1.0 + (mpx0 / (1.5 * mpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy0 / (mpz0 * tan_fov))) / 2.0, mpz0);
|
triangles_to_render[triangles_i][1] = to_pt_2d(1500.0 * (1.0 + (mpx0 / (1.5 * mpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy0 / (mpz0 * tan_fov))) / 2.0, getZbuffer(mpz0));
|
||||||
triangles_to_render[triangles_i][2] = to_pt_2d(1500.0 * (1.0 + (fpx1 / (1.5 * fpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy1 / (fpz1 * tan_fov))) / 2.0, fpz1);
|
triangles_to_render[triangles_i][2] = to_pt_2d(1500.0 * (1.0 + (fpx1 / (1.5 * fpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy1 / (fpz1 * tan_fov))) / 2.0, getZbuffer(fpz1));
|
||||||
triangles_to_render[triangles_i+1][0] = to_pt_2d(1500.0 * (1.0 + (mpx0 / (1.5 * mpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy0 / (mpz0 * tan_fov))) / 2.0, mpz0);
|
triangles_to_render[triangles_i+1][0] = to_pt_2d(1500.0 * (1.0 + (mpx0 / (1.5 * mpz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy0 / (mpz0 * tan_fov))) / 2.0, getZbuffer(mpz0));
|
||||||
triangles_to_render[triangles_i+1][1] = to_pt_2d(1500.0 * (1.0 + (mpx1 / (1.5 * mpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy1 / (mpz1 * tan_fov))) / 2.0, mpz1);
|
triangles_to_render[triangles_i+1][1] = to_pt_2d(1500.0 * (1.0 + (mpx1 / (1.5 * mpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (mpy1 / (mpz1 * tan_fov))) / 2.0, getZbuffer(mpz1));
|
||||||
triangles_to_render[triangles_i+1][2] = to_pt_2d(1500.0 * (1.0 + (fpx1 / (1.5 * fpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy1 / (fpz1 * tan_fov))) / 2.0, fpz1);
|
triangles_to_render[triangles_i+1][2] = to_pt_2d(1500.0 * (1.0 + (fpx1 / (1.5 * fpz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (fpy1 / (fpz1 * tan_fov))) / 2.0, getZbuffer(fpz1));
|
||||||
reds[triangles_i] = red ;
|
reds[triangles_i] = red ;
|
||||||
greens[triangles_i] = green ;
|
greens[triangles_i] = green ;
|
||||||
blues[triangles_i] = blue ;
|
blues[triangles_i] = blue ;
|
||||||
|
@ -619,9 +629,9 @@ void addTriangle(
|
||||||
&px1, &py1, &pz1);
|
&px1, &py1, &pz1);
|
||||||
}
|
}
|
||||||
|
|
||||||
triangles_to_render[triangles_i][0] = to_pt_2d(1500.0 * (1.0 + (px0 / (1.5 * pz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py0 / (pz0 * tan_fov))) / 2.0, pz0);
|
triangles_to_render[triangles_i][0] = to_pt_2d(1500.0 * (1.0 + (px0 / (1.5 * pz0 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py0 / (pz0 * tan_fov))) / 2.0, getZbuffer(pz0));
|
||||||
triangles_to_render[triangles_i][1] = to_pt_2d(1500.0 * (1.0 + (px1 / (1.5 * pz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py1 / (pz1 * tan_fov))) / 2.0, pz1);
|
triangles_to_render[triangles_i][1] = to_pt_2d(1500.0 * (1.0 + (px1 / (1.5 * pz1 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py1 / (pz1 * tan_fov))) / 2.0, getZbuffer(pz1));
|
||||||
triangles_to_render[triangles_i][2] = to_pt_2d(1500.0 * (1.0 + (px2 / (1.5 * pz2 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py2 / (pz2 * tan_fov))) / 2.0, pz2);
|
triangles_to_render[triangles_i][2] = to_pt_2d(1500.0 * (1.0 + (px2 / (1.5 * pz2 * tan_fov))) / 2.0, 1000.0 * (1.0 + (py2 / (pz2 * tan_fov))) / 2.0, getZbuffer(pz2));
|
||||||
reds[triangles_i] = red ;
|
reds[triangles_i] = red ;
|
||||||
greens[triangles_i] = green ;
|
greens[triangles_i] = green ;
|
||||||
blues[triangles_i] = blue ;
|
blues[triangles_i] = blue ;
|
||||||
|
@ -757,6 +767,14 @@ void drawCurrentRoom(SDL_Renderer* renderer) {
|
||||||
for(int k = 0; k < triangles_i; k++) {
|
for(int k = 0; k < triangles_i; k++) {
|
||||||
renderTriangleFull(renderer, triangles_order[k]);
|
renderTriangleFull(renderer, triangles_order[k]);
|
||||||
}
|
}
|
||||||
|
/*for(int k = 0; k < triangles_i; k++) {
|
||||||
|
drawNumberToRenderer(renderer, digits,
|
||||||
|
(int)(0.33*(triangles_to_render[k][0].z+triangles_to_render[k][1].z+triangles_to_render[k][2].z)),
|
||||||
|
(int)(0.33*(triangles_to_render[k][0].x+triangles_to_render[k][1].x+triangles_to_render[k][2].x)),
|
||||||
|
(int)(0.33*(triangles_to_render[k][0].y+triangles_to_render[k][1].y+triangles_to_render[k][2].y)),
|
||||||
|
75/4, 105/4, 0
|
||||||
|
);
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------------------------------------------------- //
|
// -------------------------------------------------------------------------------------------------------------------------------- //
|
||||||
|
|
|
@ -475,6 +475,21 @@ void print_tri(pt_2d* t) {
|
||||||
printf("T :\n (%lf, %lf, %lf)\n (%lf, %lf, %lf)\n (%lf, %lf, %lf)\n", t[0].x, t[0].y, t[0].z, t[1].x, t[1].y, t[1].z, t[2].x, t[2].y, t[2].z);
|
printf("T :\n (%lf, %lf, %lf)\n (%lf, %lf, %lf)\n (%lf, %lf, %lf)\n", t[0].x, t[0].y, t[0].z, t[1].x, t[1].y, t[1].z, t[2].x, t[2].y, t[2].z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double triangle_dist(pt_2d* tri) {
|
||||||
|
return (tri[0].z + tri[1].z + tri[2].z);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool delta_get2(pt_2d* tri1, pt_2d* tri2, double* ret) {
|
||||||
|
if(triangleIntersection(tri1, tri2)) {
|
||||||
|
if(ret != NULL) {
|
||||||
|
*ret = triangle_dist(tri2) - triangle_dist(tri1);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool delta_get(pt_2d* tri1, pt_2d* tri2, double* ret) {
|
bool delta_get(pt_2d* tri1, pt_2d* tri2, double* ret) {
|
||||||
double th1 = 0.0;
|
double th1 = 0.0;
|
||||||
double th2 = 0.0;
|
double th2 = 0.0;
|
||||||
|
@ -497,7 +512,7 @@ bool delta_get(pt_2d* tri1, pt_2d* tri2, double* ret) {
|
||||||
//print_tri(tri1);
|
//print_tri(tri1);
|
||||||
//print_tri(tri2);
|
//print_tri(tri2);
|
||||||
//printf("%lf, %lf\n\n", th1, th2);
|
//printf("%lf, %lf\n\n", th1, th2);
|
||||||
if(ret != NULL) {*ret = convex_pt(tri2[k2].z, tri2[(k2+1)%3].z, th2) - convex_pt(tri1[k1].z, tri1[(k1+1)%3].z, th1);} //no
|
if(ret != NULL) {*ret = convex_pt(tri2[k2].z, tri2[(k2+1)%3].z, th2) - convex_pt(tri1[k1].z, tri1[(k1+1)%3].z, th1);}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue