emer
This commit is contained in:
parent
15f90efb1a
commit
8ed29aa8d4
2
Makefile
2
Makefile
|
@ -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
47
c3d.c
|
@ -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();
|
||||||
|
|
9
reader.c
9
reader.c
|
@ -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
12
singletri.mtl
Normal 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
36
singletri.obj
Normal 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
|
Loading…
Reference in a new issue