rendering tri, still need to cull when behind
This commit is contained in:
parent
e90f1e6b62
commit
75f9f7fbb2
158
c3d.c
158
c3d.c
|
@ -1,5 +1,6 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
const int RENDERWIDTH = 1920;
|
const int RENDERWIDTH = 1920;
|
||||||
|
@ -35,9 +36,72 @@ struct LocalCam {
|
||||||
Vector3 angleVelocity;
|
Vector3 angleVelocity;
|
||||||
Vector3 angleAcceleration;
|
Vector3 angleAcceleration;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct LocalCam LocalCam;
|
typedef struct LocalCam LocalCam;
|
||||||
|
|
||||||
|
struct Tri {
|
||||||
|
Vector3 a;
|
||||||
|
Vector3 b;
|
||||||
|
Vector3 c;
|
||||||
|
|
||||||
|
Color color;
|
||||||
|
};
|
||||||
|
typedef struct Tri Tri;
|
||||||
|
|
||||||
|
struct Tri2D{
|
||||||
|
Vector2 a;
|
||||||
|
Vector2 b;
|
||||||
|
Vector2 c;
|
||||||
|
|
||||||
|
Color color;
|
||||||
|
};
|
||||||
|
typedef struct Tri2D Tri2D;
|
||||||
|
|
||||||
|
struct Zee {
|
||||||
|
int depth;
|
||||||
|
Tri2D * triangle;
|
||||||
|
};
|
||||||
|
typedef struct Zee Zee;
|
||||||
|
|
||||||
|
struct TriArray {
|
||||||
|
int length;
|
||||||
|
Tri* arr;
|
||||||
|
};
|
||||||
|
typedef struct TriArray TriArray;
|
||||||
|
|
||||||
|
struct Tri2DArray {
|
||||||
|
int length;
|
||||||
|
Tri2D* arr;
|
||||||
|
};
|
||||||
|
typedef struct Tri2DArray Tri2DArray;
|
||||||
|
|
||||||
|
float Sign(Vector2 v1, Vector2 v2, Vector2 v3) {
|
||||||
|
return (v1.x - v3.x) * (v2.y - v3.y) - (v2.x - v3.x) * (v1.y - v3.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsInTri(Tri2D tri, Vector2 p) {
|
||||||
|
float d1, d2, d3;
|
||||||
|
bool has_neg, has_pos;
|
||||||
|
|
||||||
|
d1 = Sign(p, tri.a, tri.b);
|
||||||
|
d2 = Sign(p, tri.b, tri.c);
|
||||||
|
d3 = Sign(p, tri.c, tri.a);
|
||||||
|
|
||||||
|
has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0);
|
||||||
|
has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0);
|
||||||
|
|
||||||
|
return !(has_neg && has_pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TriArrayAppend(TriArray * tarr, Tri t) {
|
||||||
|
tarr->arr[tarr->length] = t;
|
||||||
|
tarr->length = tarr->length + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tri2DArrayAppend(Tri2DArray * tarr, Tri2D t) {
|
||||||
|
tarr->arr[tarr->length] = t;
|
||||||
|
tarr->length = tarr->length + 1;
|
||||||
|
}
|
||||||
|
|
||||||
Vector3 Vector3Sum(Vector3 v1, Vector3 v2) {
|
Vector3 Vector3Sum(Vector3 v1, Vector3 v2) {
|
||||||
Vector3 retvec;
|
Vector3 retvec;
|
||||||
retvec.x = v1.x + v2.x;
|
retvec.x = v1.x + v2.x;
|
||||||
|
@ -188,11 +252,31 @@ Vector3 TransformWithCam(Vector3 v, LocalCam * cam) {
|
||||||
return returnvector;
|
return returnvector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tri TriTransformWithCam(Tri *t, LocalCam * cam) {
|
||||||
|
Tri rettri;
|
||||||
|
rettri.a = TransformWithCam(t->a,cam);
|
||||||
|
rettri.b = TransformWithCam(t->b,cam);
|
||||||
|
rettri.c = TransformWithCam(t->c,cam);
|
||||||
|
|
||||||
|
rettri.color = t->color;
|
||||||
|
return rettri;
|
||||||
|
}
|
||||||
|
|
||||||
|
Tri2D ConvertTriToTri2D(Tri* t){
|
||||||
|
Tri2D rettri2d;
|
||||||
|
rettri2d.a = Conv3Dto2D(t->a);
|
||||||
|
rettri2d.b = Conv3Dto2D(t->b);
|
||||||
|
rettri2d.c = Conv3Dto2D(t->c);
|
||||||
|
|
||||||
|
rettri2d.a = Conv2DCenteredToScreen(rettri2d.a);
|
||||||
|
rettri2d.b = Conv2DCenteredToScreen(rettri2d.b);
|
||||||
|
rettri2d.c = Conv2DCenteredToScreen(rettri2d.c);
|
||||||
|
|
||||||
|
rettri2d.color = t->color;
|
||||||
|
return rettri2d;
|
||||||
|
}
|
||||||
int main() {
|
int main() {
|
||||||
proj = HALFWIDTH / tan(half_fov);
|
proj = HALFWIDTH / tan(half_fov);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SetConfigFlags(FLAG_WINDOW_UNDECORATED);
|
SetConfigFlags(FLAG_WINDOW_UNDECORATED);
|
||||||
InitWindow(SCREENWIDTH, SCREENHEIGHT, "raylib [core] example - basic window");
|
InitWindow(SCREENWIDTH, SCREENHEIGHT, "raylib [core] example - basic window");
|
||||||
|
@ -223,6 +307,23 @@ int main() {
|
||||||
|
|
||||||
Vector3 point = (Vector3){0,0,-10};
|
Vector3 point = (Vector3){0,0,-10};
|
||||||
|
|
||||||
|
Tri internaltriarray[50];
|
||||||
|
TriArray tarr;
|
||||||
|
tarr.arr = internaltriarray;
|
||||||
|
tarr.length = 0;
|
||||||
|
TriArrayAppend(&tarr,(Tri){(Vector3){0,0,-1000},(Vector3){0,800,-1000},(Vector3){800,800,-1000},WHITE});
|
||||||
|
|
||||||
|
Tri internaltransformedtriarray[50];
|
||||||
|
TriArray TransformedTris;
|
||||||
|
TransformedTris.arr = internaltransformedtriarray;
|
||||||
|
TransformedTris.length = 0;
|
||||||
|
|
||||||
|
Tri2D internaltri2darray[50];
|
||||||
|
Tri2DArray Tri2Darr;
|
||||||
|
Tri2Darr.length=0;
|
||||||
|
Tri2Darr.arr = internaltri2darray;
|
||||||
|
|
||||||
|
static Zee ZBuff[1920][1080] = {{(Zee){10000,NULL}}}; //FIXME: Stupid static makes the file 32 Megs because pog
|
||||||
|
|
||||||
|
|
||||||
while (!WindowShouldClose()) {
|
while (!WindowShouldClose()) {
|
||||||
|
@ -230,16 +331,51 @@ int main() {
|
||||||
CtrlLocalCam(&camera,frametime);
|
CtrlLocalCam(&camera,frametime);
|
||||||
LocalCamApplyVelo(&camera,frametime);
|
LocalCamApplyVelo(&camera,frametime);
|
||||||
BeginTextureMode(renderTexture);
|
BeginTextureMode(renderTexture);
|
||||||
ClearBackground(WHITE);
|
ClearBackground(BLACK);
|
||||||
DrawText("Congrats! You created your first window!", 190, 200, 20,
|
DrawText("Congrats! You created your first window!", 190, 200, 20,
|
||||||
BLACK);
|
BLACK);
|
||||||
Vector3 TransVector = TransformWithCam(point,&camera);
|
/* Vector3 TransVector = TransformWithCam(point,&camera); */
|
||||||
if (TransVector.z < 0) {
|
/* if (TransVector.z < 0) { */
|
||||||
Vector2 MPos = Conv3Dto2D(TransVector);
|
/* Vector2 MPos = Conv3Dto2D(TransVector); */
|
||||||
Vector2 FinPos = Conv2DCenteredToScreen(MPos);
|
/* Vector2 FinPos = Conv2DCenteredToScreen(MPos); */
|
||||||
DrawCircleV(FinPos,100,BLACK);
|
/* DrawCircleV(FinPos,100,BLACK); */
|
||||||
|
/* } */
|
||||||
|
/* EndTextureMode(); */
|
||||||
|
|
||||||
|
TransformedTris.length = 0;
|
||||||
|
Tri2Darr.length = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < tarr.length; i++) {
|
||||||
|
TriArrayAppend(&TransformedTris,TriTransformWithCam(&tarr.arr[i],&camera));
|
||||||
}
|
}
|
||||||
EndTextureMode();
|
|
||||||
|
for(int i = 0; i < TransformedTris.length; i++) {
|
||||||
|
Tri2DArrayAppend(&Tri2Darr,ConvertTriToTri2D(&TransformedTris.arr[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(ZBuff,0,sizeof(ZBuff));
|
||||||
|
|
||||||
|
for(int i = 0; i < Tri2Darr.length; i++) {
|
||||||
|
for(int y = 0; y < RENDERHEIGHT; y++){
|
||||||
|
for(int x = 0; x< RENDERWIDTH; x++) {
|
||||||
|
if (IsInTri(Tri2Darr.arr[i],(Vector2){x,y})) {
|
||||||
|
ZBuff[x][y].triangle = &Tri2Darr.arr[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int y = 0; y < RENDERHEIGHT; y++) {
|
||||||
|
for(int x = 0; x < RENDERWIDTH; x++) {
|
||||||
|
if (ZBuff[x][y].triangle != NULL){
|
||||||
|
DrawPixel(x,y,ZBuff[x][y].triangle->color);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
EndTextureMode();
|
||||||
|
|
||||||
//Copytexture to main display :0
|
//Copytexture to main display :0
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue