ref: dc91bf04e06898d84513edc8b2a5352355295427
parent: 04bca24d0d4f02f7e3b4442ef484df1178c7872b
author: rodri <rgl@antares-labs.eu>
date: Sun Dec 17 06:07:10 EST 2023
added a table of shaders to choose from.
--- a/main.c
+++ b/main.c
@@ -48,7 +48,16 @@
Memimage *(*fshader)(FSparams*);
};
+typedef struct Shader Shader;
+struct Shader
+{
+ char *name;
+ Point3 (*vshader)(VSparams*);
+ Memimage *(*fshader)(FSparams*);
+};
+
+
Memimage *screenfb, *fb, *zfb, *nfb, *curfb;
double *zbuf;
Lock zbuflk;
@@ -583,7 +592,7 @@
}
void
-shade(Memimage *dst, Point3 (*vs)(VSparams*), Memimage *(*fs)(FSparams*))
+shade(Memimage *dst, Shader *s)
{
int i, nelems, nparts, nworkers;
OBJObject *o;
@@ -621,8 +630,8 @@
params->e = params->b + nparts;
params->id = i;
params->donec = donec;
- params->vshader = vs;
- params->fshader = fs;
+ params->vshader = s->vshader;
+ params->fshader = s->fshader;
proccreate(shaderunit, params, mainstacksize);
fprint(2, "spawned su %d for elems [%d, %d)\n", params->id, i*nparts, i*nparts+nparts);
}
@@ -744,6 +753,24 @@
return sp->frag;
}
+Shader shadertab[] = {
+ { "triangle", vertshader, triangleshader },
+ { "circle", vertshader, circleshader },
+ { "box", vertshader, boxshader },
+ { "gouraud", vertshader, gouraudshader },
+ { "toon", vertshader, toonshader },
+};
+Shader *
+getshader(char *name)
+{
+ int i;
+
+ for(i = 0; i < nelem(shadertab); i++)
+ if(strcmp(shadertab[i].name, name) == 0)
+ return &shadertab[i];
+ return nil;
+}
+
void
redraw(void)
{
@@ -758,22 +785,26 @@
}
void
-render(void)
+render(Shader *s)
{
uvlong t0, t1;
t0 = nanosec();
- shade(fb, vertshader, gouraudshader);
+ shade(fb, s);
t1 = nanosec();
fprint(2, "shader took %lludns\n", t1-t0);
}
void
-renderer(void *)
+renderer(void *arg)
{
+ Shader *s;
+
threadsetname("renderer");
- render();
+ s = arg;
+
+ render(s);
rendering = 0;
nbsendp(drawc, nil);
threadexits(nil);
@@ -863,7 +894,7 @@
void
usage(void)
{
- fprint(2, "usage: %s [-n nprocs] [-m objfile] [-t texfile] [-a yrotangle] [-z camzpos]\n", argv0);
+ fprint(2, "usage: %s [-n nprocs] [-m objfile] [-t texfile] [-a yrotangle] [-z camzpos] [-s shader]\n", argv0);
exits("usage");
}
@@ -873,12 +904,15 @@
Mousectl *mc;
Keyboardctl *kc;
Rune r;
+ Shader *s;
char *mdlpath, *texpath;
+ char *sname;
double θ;
GEOMfmtinstall();
- mdlpath = nil;
+ mdlpath = "mdl/def.obj";
texpath = nil;
+ sname = "gouraud";
θ = 0;
ARGBEGIN{
case 'n':
@@ -896,6 +930,9 @@
case 'z':
camera.z = strtod(EARGF(usage()), nil);
break;
+ case 's':
+ sname = EARGF(usage());
+ break;
default: usage();
}ARGEND;
if(argc != 0)
@@ -904,6 +941,14 @@
if(nprocs < 1)
nprocs = strtoul(getenv("NPROC"), nil, 10);
+ if((s = getshader(sname)) == nil)
+ sysfatal("couldn't find %s shader", sname);
+
+ if((model = objparse(mdlpath)) == nil)
+ sysfatal("objparse: %r");
+ if(texpath != nil && (modeltex = readtga(texpath)) == nil)
+ sysfatal("readtga: %r");
+
snprint(winspec, sizeof winspec, "-dx %d -dy %d", 800, 800);
if(newwindow(winspec) < 0)
sysfatal("newwindow: %r");
@@ -927,13 +972,6 @@
green = rgb(DGreen);
blue = rgb(DBlue);
- if(mdlpath == nil)
- mdlpath = "mdl/def.obj";
- if((model = objparse(mdlpath)) == nil)
- sysfatal("objparse: %r");
- if(texpath != nil && (modeltex = readtga(texpath)) == nil)
- sysfatal("readtga: %r");
-
{
int i, nv[OBJNVERT], nf;
OBJObject *o;
@@ -965,7 +1003,7 @@
mulm3(view, proj);
rendering = 1;
- proccreate(renderer, nil, mainstacksize);
+ proccreate(renderer, s, mainstacksize);
threadcreate(scrsync, nil, mainstacksize);
for(;;){