This commit is contained in:
InventorXtreme 2024-08-16 19:34:53 -04:00
parent 15f90efb1a
commit 8ed29aa8d4
5 changed files with 97 additions and 13 deletions

View file

@ -1,5 +1,5 @@
CC = gcc #Set compiler CC = gcc #Set compiler
CFLAGS = -pg -g -Wall -O3 -pg #set compiler flags CFLAGS = -pg -g -Wall -O3 #set compiler flags
LDFLAGS = -pg -g #set linker flags LDFLAGS = -pg -g #set linker flags
LDLIBS = -lraylib -lm #set libraries to use LDLIBS = -lraylib -lm #set libraries to use
objects = c3d.o reader.o arrayfuncs.o vecfunc.o #list all object files objects = c3d.o reader.o arrayfuncs.o vecfunc.o #list all object files

47
c3d.c
View file

@ -179,6 +179,16 @@ void V2Print(Vector2 v) {
printf("%f, %f\n", v.x, v.y); printf("%f, %f\n", v.x, v.y);
} }
Vector2 GetUVFromTriAndBary(Vector3 bary, Tri2D * tri, float z){
Vector2 ta = Vector2Scale(tri->auv, (1.0 / tri->adepth ));
Vector2 tb = Vector2Scale(tri->buv, (1.0 / tri->bdepth ));
Vector2 tc = Vector2Scale(tri->cuv, (1.0 / tri->cdepth ));
Vector2 AB = Vector2Add( Vector2Scale(ta, bary.x), Vector2Scale(tb, bary.y)) ;
Vector2 ABC = Vector2Add(AB, Vector2Scale(tc, bary.z));
return Vector2Scale(ABC, z);
}
void DrawScanline(Zee *zee, Tri2D *trianglepointer, double start, double end, int scanline) { void DrawScanline(Zee *zee, Tri2D *trianglepointer, double start, double end, int scanline) {
float depth = 0; float depth = 0;
Vector2 UVpos; Vector2 UVpos;
@ -192,17 +202,16 @@ void DrawScanline(Zee *zee, Tri2D *trianglepointer, double start, double end, in
/* V2Print(UVRangeTri.b); */ /* V2Print(UVRangeTri.b); */
/* V2Print(UVRangeTri.c); */ /* V2Print(UVRangeTri.c); */
Vector3 f1baryatpoint = Tri2DBaryAtPoint(trianglepointer, (Vector2){Max(start, 0), scanline}); Vector3 f1baryatpoint = Tri2DBaryAtPoint(trianglepointer, (Vector2){Max(start, 0), scanline});
Vector3 f1baryatpoint2 = Vector3 f1baryatpoint2 =
Tri2DBaryAtPoint(trianglepointer, (Vector2){Max(start, 0) + 1, scanline}); Tri2DBaryAtPoint(trianglepointer, (Vector2){Max(start, 0) + 1, scanline});
Vector2 tex1point = BaryAndTritoPoint(&UVRangeTri, f1baryatpoint);
Vector2 tex2point = BaryAndTritoPoint(&UVRangeTri, f1baryatpoint2);
double f1invdepth = InvDepthAtBary(trianglepointer, f1baryatpoint); double f1invdepth = InvDepthAtBary(trianglepointer, f1baryatpoint);
double f1invdepth2 = InvDepthAtBary(trianglepointer, f1baryatpoint2); double f1invdepth2 = InvDepthAtBary(trianglepointer, f1baryatpoint2);
Vector2 tex1point = GetUVFromTriAndBary(f1baryatpoint, trianglepointer, 1.0 / f1invdepth);
Vector2 tex2point = GetUVFromTriAndBary(f1baryatpoint2, trianglepointer, 1.0 / f1invdepth2);
double dinvslope = f1invdepth2 - f1invdepth; // change in store_depth per pixel double dinvslope = f1invdepth2 - f1invdepth; // change in store_depth per pixel
@ -212,15 +221,16 @@ void DrawScanline(Zee *zee, Tri2D *trianglepointer, double start, double end, in
// UNCOMMENT TO DO TRUE NON SLOPE BASED DEPTH CALC: // UNCOMMENT TO DO TRUE NON SLOPE BASED DEPTH CALC:
//Vector3 baryatpoint = Tri2DBaryAtPoint(trianglepointer, ( (Vector2){i, scanline})); //Vector3 baryatpoint = Tri2DBaryAtPoint(trianglepointer, ( (Vector2){i, scanline}));
depth = 1.0 / (f1invdepth + (dinvslope * ((float)i - (float)(Max(start, 0)))));
//depth = 1.0 / InvDepthAtBary(trianglepointer, baryatpoint); //depth = 1.0 / InvDepthAtBary(trianglepointer, baryatpoint);
//UNCOMMENT TO DO REAL UV CALC //UNCOMMENT TO DO REAL UV CALC
//UVpos = BaryAndTritoPoint(&UVRangeTri, baryatpoint); //UVpos = BaryAndTritoPoint(&UVRangeTri, baryatpoint);
//UVpos = GetUVFromTriAndBary(baryatpoint, trianglepointer, depth);
//V2Print(UVpos); //V2Print(UVpos);
UVpos = Vector2Add(tex1point, Vector2Scale(UVSlope, ((float)i - (float)(Max(start, 0))))); UVpos = Vector2Add(tex1point, Vector2Scale(UVSlope, ((float)i - (float)(Max(start, 0)))));
depth = 1.0 / (f1invdepth + (dinvslope * ((float)i - (float)(Max(start, 0)))));
if (depth < zee[IndexOfZBuff(i, scanline)].depth) { if (depth < zee[IndexOfZBuff(i, scanline)].depth) {
CMaterial *mat = trianglepointer->material; CMaterial *mat = trianglepointer->material;
@ -340,6 +350,22 @@ void FillBottomFlatZbuffer(Zee *zee, Tri2D *t, Tri2D *tp) {
/* } */ /* } */
void AnotateTri(Tri2D *tex) {
char linea[500];
char lineb[500];
char linec[500];
sprintf(linea, "UV: %f, %f;", tex->auv.x, tex->auv.y);
sprintf(lineb, "UV: %f, %f;", tex->buv.x, tex->buv.y);
sprintf(linec, "UV: %f, %f;", tex->cuv.x, tex->cuv.y);
DrawText(linea, tex->a.x, tex->a.y, 60, WHITE);
DrawText(lineb, tex->b.x, tex->b.y, 60, WHITE);
DrawText(linec, tex->c.x, tex->c.y, 60, WHITE);
}
//the issues is the tt pointer changes, so the thing does not reference properly for debugging //the issues is the tt pointer changes, so the thing does not reference properly for debugging
void DrawTriZuff(Zee *zbuf, Tri2D *tex) { void DrawTriZuff(Zee *zbuf, Tri2D *tex) {
Tri2D tt = *tex; Tri2D tt = *tex;
@ -353,6 +379,8 @@ void DrawTriZuff(Zee *zbuf, Tri2D *tex) {
Vector2Integate(&t->b); Vector2Integate(&t->b);
Vector2Integate(&t->c); Vector2Integate(&t->c);
//AnotateTri(tex);
CMaterial *mat = tex->material; CMaterial *mat = tex->material;
/* int y = (int) UVpos.y % mat->h; // keep within range because of bug */ /* int y = (int) UVpos.y % mat->h; // keep within range because of bug */
/* int x = (int) UVpos.x % mat->w; */ /* int x = (int) UVpos.x % mat->w; */
@ -453,6 +481,12 @@ void CtrlLocalCam(LocalCam *cam, float time) {
if (IsKeyDown(KEY_E)) { if (IsKeyDown(KEY_E)) {
cam->angleVelocity.y = cam->angleVelocity.y - time * 30; cam->angleVelocity.y = cam->angleVelocity.y - time * 30;
} }
if (IsKeyDown(KEY_R)) {
cam->angleVelocity.x = cam->angleVelocity.x + time * 30;
}
if (IsKeyDown(KEY_F)) {
cam->angleVelocity.x = cam->angleVelocity.x - time * 30;
}
if (IsKeyDown(KEY_G)) { if (IsKeyDown(KEY_G)) {
printf("PosX: %f PosY: %f PosZ: %f\n", cam->position.x, cam->position.y, cam->position.z); printf("PosX: %f PosY: %f PosZ: %f\n", cam->position.x, cam->position.y, cam->position.z);
@ -606,7 +640,7 @@ int main() {
bool run3d = true; bool run3d = true;
Object3D t = ReadObjectFromFile("mario.obj"); Object3D t = ReadObjectFromFile("IronMan.obj");
if (true) { if (true) {
for (int i = 0; i < t.triangles->length; i++) { for (int i = 0; i < t.triangles->length; i++) {
// printf("t: %f\n", t.triangles->arr[i].a.x); // printf("t: %f\n", t.triangles->arr[i].a.x);
@ -643,6 +677,8 @@ int main() {
ZBuff[i].depth = 10000000; ZBuff[i].depth = 10000000;
} }
BeginTextureMode(uiraylibtexture);
ClearBackground(BLANK);
for (int i = 0; i < Tri2Darr.length; i++) { for (int i = 0; i < Tri2Darr.length; i++) {
DrawTriZuff(ZBuff, &Tri2Darr.arr[i]); DrawTriZuff(ZBuff, &Tri2Darr.arr[i]);
} }
@ -686,7 +722,6 @@ int main() {
/* } */ /* } */
/* } */ /* } */
BeginTextureMode(uiraylibtexture);
// gui stuff // gui stuff
EndTextureMode(); EndTextureMode();

View file

@ -27,6 +27,7 @@ CMaterial NewCmat(char *matname, char *fname) {
strncpy(cmat.name, matname, 15); strncpy(cmat.name, matname, 15);
strncpy(cmat.texturefile, fname, 15); strncpy(cmat.texturefile, fname, 15);
Image teximg = LoadImage(fname); Image teximg = LoadImage(fname);
ImageFlipVertical(&teximg);
cmat.h = teximg.height; cmat.h = teximg.height;
cmat.w = teximg.width; cmat.w = teximg.width;
cmat.tex = LoadImageColors(teximg); cmat.tex = LoadImageColors(teximg);
@ -92,18 +93,18 @@ CMaterial * FindCmat(CMaterialArray * cmats, char * name){
Object3D ReadObjectFromFile(char *fname) { Object3D ReadObjectFromFile(char *fname) {
Object3D out; Object3D out;
Vector3 *VertexArray = malloc(10000 * sizeof(Vector3)); Vector3 *VertexArray = malloc(1000000 * sizeof(Vector3));
int VertexArrayLength = 0; int VertexArrayLength = 0;
Vector2 *UVArray = malloc(10000 * sizeof(Vector2)); Vector2 *UVArray = malloc(1000000 * sizeof(Vector2));
int UVArrayLength = 0; int UVArrayLength = 0;
TriArray * tarr = malloc(sizeof(TriArray)); TriArray * tarr = malloc(sizeof(TriArray));
tarr->arr = malloc(10000 * sizeof(Tri)); tarr->arr = malloc(1000000 * sizeof(Tri));
tarr->length = 0; tarr->length = 0;
CMaterialArray * cmats = malloc(sizeof(CMaterialArray)); CMaterialArray * cmats = malloc(sizeof(CMaterialArray));
cmats->arr = malloc(50 * sizeof(CMaterial)); cmats->arr = malloc(500 * sizeof(CMaterial));
cmats->length = 0; cmats->length = 0;
out.triangles = tarr; out.triangles = tarr;

12
singletri.mtl Normal file
View file

@ -0,0 +1,12 @@
# Blender 4.2.0 MTL File: 'singletri.blend'
# www.blender.org
newmtl Material.001
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd /home/inventorx/Downloads/0.png

36
singletri.obj Normal file
View file

@ -0,0 +1,36 @@
# Blender 4.2.0
# www.blender.org
mtllib singletri.mtl
o Cube
v -1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v -1.000000 1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vt 0.000000 1.000000
vt 1.000000 0.000000
vt 0.000000 0.000000
vt 1.000000 1.000000
s 0
usemtl Material.001
f 2/1/1 3/2/1 1/3/1
f 4/1/2 7/2/2 3/3/2
f 8/4/3 5/3/3 7/2/3
f 6/4/4 1/3/4 5/2/4
f 7/4/5 1/3/5 3/1/5
f 4/1/6 6/2/6 8/4/6
f 2/1/1 4/4/1 3/2/1
f 4/1/2 8/4/2 7/2/2
f 8/4/3 6/1/3 5/3/3
f 6/4/4 2/1/4 1/3/4
f 7/4/5 5/2/5 1/3/5
f 4/1/6 2/3/6 6/2/6