summaryrefslogtreecommitdiff
path: root/src/engine/shader.cpp
diff options
context:
space:
mode:
authorxolatile2025-08-10 00:19:46 +0200
committerxolatile2025-08-10 00:19:46 +0200
commit757096e7df15c14b9b10352fa91663483f9e34f8 (patch)
treedcad789d0abd8be76463277dc01bf32c4e6a527b /src/engine/shader.cpp
parentb2c89d7060e99a36c8c7ac897b7386686c74deac (diff)
downloadxolatile-badassbug-757096e7df15c14b9b10352fa91663483f9e34f8.tar.xz
xolatile-badassbug-757096e7df15c14b9b10352fa91663483f9e34f8.tar.zst
all
Diffstat (limited to 'src/engine/shader.cpp')
-rw-r--r--src/engine/shader.cpp65
1 files changed, 4 insertions, 61 deletions
diff --git a/src/engine/shader.cpp b/src/engine/shader.cpp
index 86e4546..eb10720 100644
--- a/src/engine/shader.cpp
+++ b/src/engine/shader.cpp
@@ -445,7 +445,7 @@ void Shader::cleanup(bool invalid) {
bool Shader::isnull(const Shader *s) { return !s; }
-static void genattriblocs(Shader &s, const char *vs, const char *ps, Shader *reusevs, Shader *reuseps) {
+static void genattriblocs(Shader &s, const char *vs, Shader *reusevs) {
static int len = strlen("//:attrib");
string name;
int loc;
@@ -457,7 +457,7 @@ static void genattriblocs(Shader &s, const char *vs, const char *ps, Shader *reu
}
}
-static void genuniformlocs(Shader &s, const char *vs, const char *ps, Shader *reusevs, Shader *reuseps) {
+static void genuniformlocs(Shader &s, const char *vs, Shader *reusevs) {
static int len = strlen("//:uniform");
string name, blockname;
int binding, stride;
@@ -503,8 +503,8 @@ Shader *newshader(int type, const char *name, const char *vs, const char *ps, Sh
else loopv(slotparams) s.defaultparams.add(slotparams[i]);
s.attriblocs.setsize(0);
s.uniformlocs.setsize(0);
- genattriblocs(s, vs, ps, s.reusevs, s.reuseps);
- genuniformlocs(s, vs, ps, s.reusevs, s.reuseps);
+ genattriblocs(s, vs, s.reusevs);
+ genuniformlocs(s, vs, s.reusevs);
if(!s.compile()) {
s.cleanup(true);
if(variant) shaders.remove(rname);
@@ -622,60 +622,6 @@ static void gengenericvariant(Shader &s, const char *sname, const char *vs, cons
newshader(s.type, varname, vschanged ? vsv.getbuf() : reuse, pschanged ? psv.getbuf() : reuse, &s, row);
}
-bool minimizedynlighttcusage() { return glversion < 300 && maxvaryings < 48; }
-
-static void gendynlightvariant(Shader &s, const char *sname, const char *vs, const char *ps, int row = 0) {
- int numlights = minimizedynlighttcusage() ? 1 : MAXDYNLIGHTS;
- const char *vspragma = strstr(vs, "//:dynlight"), *pspragma = strstr(ps, "//:dynlight");
- if(!vspragma || !pspragma) return;
- string pslight;
- vspragma += strcspn(vspragma, "\n");
- if(*vspragma) vspragma++;
- if(sscanf(pspragma, "//:dynlight %100s", pslight)!=1) return;
- pspragma += strcspn(pspragma, "\n");
- if(*pspragma) pspragma++;
- const char *vsmain = findglslmain(vs), *psmain = findglslmain(ps);
- if(vsmain > vspragma) vsmain = vs;
- if(psmain > pspragma) psmain = ps;
- vector<char> vsdl, psdl;
- loopi(MAXDYNLIGHTS) {
- vsdl.setsize(0);
- psdl.setsize(0);
- if(vsmain >= vs) vsdl.put(vs, vsmain - vs);
- if(psmain >= ps) psdl.put(ps, psmain - ps);
- defformatstring(pos, "uniform vec4 dynlightpos[%d];\n", i+1);
- vsdl.put(pos, strlen(pos));
- psdl.put(pos, strlen(pos));
- defformatstring(color, "uniform vec3 dynlightcolor[%d];\n", i+1);
- psdl.put(color, strlen(color));
- loopk(min(i+1, numlights)) {
- defformatstring(dir, "%sdynlight%ddir%s", !k ? "varying vec3 " : " ", k, k==i || k+1==numlights ? ";\n" : ",");
- vsdl.put(dir, strlen(dir));
- psdl.put(dir, strlen(dir));
- }
- vsdl.put(vsmain, vspragma-vsmain);
- psdl.put(psmain, pspragma-psmain);
- loopk(i+1) {
- defformatstring(tc,
- k<numlights ?
- "dynlight%ddir = vvertex.xyz*dynlightpos[%d].w + dynlightpos[%d].xyz;\n" :
- "vec3 dynlight%ddir = dynlight0dir*dynlightpos[%d].w + dynlightpos[%d].xyz;\n",
- k, k, k);
- if(k < numlights) vsdl.put(tc, strlen(tc));
- else psdl.put(tc, strlen(tc));
- defformatstring(dl,
- "%s.rgb += dynlightcolor[%d] * (1.0 - clamp(dot(dynlight%ddir, dynlight%ddir), 0.0, 1.0));\n",
- pslight, k, k, k);
- psdl.put(dl, strlen(dl));
- }
- vsdl.put(vspragma, strlen(vspragma)+1);
- psdl.put(pspragma, strlen(pspragma)+1);
- defformatstring(name, "<dynlight %d>%s", i+1, sname);
- Shader *variant = newshader(s.type, name, vsdl.getbuf(), psdl.getbuf(), &s, row);
- if(!variant) return;
- }
-}
-
static void genshadowmapvariant(Shader &s, const char *sname, const char *vs, const char *ps, int row = 1) {
const char *vspragma = strstr(vs, "//:shadowmap"), *pspragma = strstr(ps, "//:shadowmap");
if(!vspragma || !pspragma) return;
@@ -724,7 +670,6 @@ static void genshadowmapvariant(Shader &s, const char *sname, const char *vs, co
defformatstring(name, "<shadowmap>%s", sname);
Shader *variant = newshader(s.type, name, vssm.getbuf(), pssm.getbuf(), &s, row);
if(!variant) return;
- if(strstr(vs, "//:dynlight")) gendynlightvariant(s, name, vssm.getbuf(), pssm.getbuf(), row);
}
static void genuniformdefs(vector<char> &vsbuf, vector<char> &psbuf, const char *vs, const char *ps, Shader *variant = NULL) {
@@ -842,7 +787,6 @@ void shader(int *type, char *name, char *vs, char *ps) {
Shader *s = newshader(*type, name, vs, ps);
if(s) {
if(strstr(vs, "//:shadowmap")) genshadowmapvariant(*s, s->name, vs, ps);
- if(strstr(vs, "//:dynlight")) gendynlightvariant(*s, s->name, vs, ps);
}
slotparams.shrink(0);
}
@@ -862,7 +806,6 @@ void variantshader(int *type, char *name, int *row, char *vs, char *ps) {
GENSHADER(s->defaultparams.length(), genuniformdefs(vsbuf, psbuf, vs, ps, s));
Shader *v = newshader(*type, varname, vs, ps, s, *row);
if(v) {
- if(strstr(vs, "//:dynlight")) gendynlightvariant(*s, varname, vs, ps, *row);
if(strstr(ps, "//:variant") || strstr(vs, "//:variant")) gengenericvariant(*s, varname, vs, ps, *row);
}
}