ref: 92ef6fb8cfe7f251756a7e79aab31d3a8b279b13
parent: a3fad209b38881c6bf31f1448dec06f3e0d500ac
author: rodri <[email protected]>
date: Sun Dec 17 17:47:09 EST 2023
add knobs to control fb's dimensions. make the light an actual global.
--- a/main.c
+++ b/main.c
@@ -78,6 +78,7 @@
int shownormals;
char winspec[32];
+Point3 light = {0,-1,1,1}; /* global directional light */
Point3 camera = {0,0,3,1};
Point3 center = {0,0,0,1};
Point3 up = {0,1,0,0};
@@ -413,10 +414,7 @@
Point3
vertshader(VSparams *sp)
{
- static Point3 light = {1,1,1,0}; /* global light field */
- light = subpt3(camera, center);
-
- sp->su->var_intensity[sp->idx] = fmax(0, dotvec3(sp->n, normvec3(light)));
+ sp->su->var_intensity[sp->idx] = fmax(0, dotvec3(sp->n, light));
return xform3(sp->p, view);
}
@@ -425,9 +423,7 @@
{
double intens;
- intens = sp->su->var_intensity[0]*sp->bc.x;
- intens += sp->su->var_intensity[1]*sp->bc.y;
- intens += sp->su->var_intensity[2]*sp->bc.z;
+ intens = dotvec3(Vec3(sp->su->var_intensity[0], sp->su->var_intensity[1], sp->su->var_intensity[2]), sp->bc);
sp->cbuf[1] *= intens;
sp->cbuf[2] *= intens;
sp->cbuf[3] *= intens;
@@ -441,9 +437,7 @@
{
double intens;
- intens = sp->su->var_intensity[0]*sp->bc.x;
- intens += sp->su->var_intensity[1]*sp->bc.y;
- intens += sp->su->var_intensity[2]*sp->bc.z;
+ intens = dotvec3(Vec3(sp->su->var_intensity[0], sp->su->var_intensity[1], sp->su->var_intensity[2]), sp->bc);
intens = intens > 0.85? 1: intens > 0.60? 0.80: intens > 0.45? 0.60: intens > 0.30? 0.45: intens > 0.15? 0.30: 0;
sp->cbuf[1] = 0;
sp->cbuf[2] = 155*intens;
@@ -588,7 +582,7 @@
nt.p0.x*bc.x + nt.p1.x*bc.y + nt.p2.x*bc.z,
nt.p0.y*bc.x + nt.p1.y*bc.y + nt.p2.y*bc.z,
nt.p0.z*bc.x + nt.p1.z*bc.y + nt.p2.z*bc.z);
- np1 = addpt3(np0, mulpt3(np1, 50));
+ np1 = addpt3(np0, mulpt3(np1, Dx(fb->r)/32));
triangle(nfb, Pt(st₂.p0.x,st₂.p0.y), Pt(st₂.p1.x,st₂.p1.y), Pt(st₂.p2.x,st₂.p2.y), red);
bresenham(nfb, Pt(np0.x,np0.y), Pt(np1.x,np1.y), green);
@@ -934,6 +928,7 @@
char *mdlpath, *texpath;
char *sname;
double θ;
+ int fbw, fbh;
GEOMfmtinstall();
mdlpath = "mdl/def.obj";
@@ -940,6 +935,8 @@
texpath = nil;
sname = "gouraud";
θ = 0;
+ fbw = 200;
+ fbh = 200;
ARGBEGIN{
case 'n':
nprocs = strtoul(EARGF(usage()), nil, 10);
@@ -951,7 +948,7 @@
texpath = EARGF(usage());
break;
case 'a':
- θ = strtoul(EARGF(usage()), nil, 10)*DEG;
+ θ = strtod(EARGF(usage()), nil)*DEG;
break;
case 'z':
camera.z = strtod(EARGF(usage()), nil);
@@ -959,6 +956,12 @@
case 's':
sname = EARGF(usage());
break;
+ case 'W':
+ fbw = strtoul(EARGF(usage()), nil, 10);
+ break;
+ case 'H':
+ fbh = strtoul(EARGF(usage()), nil, 10);
+ break;
default: usage();
}ARGEND;
if(argc != 0)
@@ -975,7 +978,20 @@
if(texpath != nil && (modeltex = readtga(texpath)) == nil)
sysfatal("readtga: %r");
- snprint(winspec, sizeof winspec, "-dx %d -dy %d", 200, 200);
+ {
+ int i, nv[OBJNVERT], nf;
+ OBJObject *o;
+ OBJElem *e;
+
+ nf = 0;
+ memset(nv, 0, sizeof nv);
+ for(i = 0; i < OBJNVERT; i++) nv[i] += model->vertdata[i].nvert;
+ for(i = 0; i < OBJHTSIZE; i++) if((o = model->objtab[i]) != nil)
+ for(e = o->child; e != nil; e = e->next) if(e->type == OBJEFace) nf++;
+ fprint(2, "v %d vn %d vt %d f %d\n", nv[OBJVGeometric], nv[OBJVNormal], nv[OBJVTexture], nf);
+ }
+
+ snprint(winspec, sizeof winspec, "-dx %d -dy %d", fbw, fbh);
if(newwindow(winspec) < 0)
sysfatal("newwindow: %r");
if(initdraw(nil, nil, "tinyrend") < 0)
@@ -997,24 +1013,6 @@
green = rgb(DGreen);
blue = rgb(DBlue);
- {
- int i, nv[OBJNVERT], nf;
- OBJObject *o;
- OBJElem *e;
-
- nf = 0;
- memset(nv, 0, sizeof nv);
- for(i = 0; i < OBJNVERT; i++) nv[i] += model->vertdata[i].nvert;
- for(i = 0; i < OBJHTSIZE; i++) if((o = model->objtab[i]) != nil)
- for(e = o->child; e != nil; e = e->next) if(e->type == OBJEFace) nf++;
- fprint(2, "v %d vn %d vt %d f %d\n", nv[OBJVGeometric], nv[OBJVNormal], nv[OBJVTexture], nf);
- }
-
- drawc = chancreate(sizeof(void*), 1);
- donedrawc = chancreate(sizeof(void*), 1);
- display->locking = 1;
- unlockdisplay(display);
-
Matrix3 yrot = {
cos(θ), 0, -sin(θ), 0,
0, 1, 0, 0,
@@ -1028,6 +1026,12 @@
mulm3(rota, yrot);
mulm3(proj, rota);
mulm3(view, proj);
+ light = normvec3(subpt3(light, center));
+
+ drawc = chancreate(sizeof(void*), 1);
+ donedrawc = chancreate(sizeof(void*), 1);
+ display->locking = 1;
+ unlockdisplay(display);
proccreate(renderer, s, mainstacksize);