diff options
| author | xolatile | 2025-08-10 00:19:46 +0200 |
|---|---|---|
| committer | xolatile | 2025-08-10 00:19:46 +0200 |
| commit | 757096e7df15c14b9b10352fa91663483f9e34f8 (patch) | |
| tree | dcad789d0abd8be76463277dc01bf32c4e6a527b /src/engine/shader.cpp | |
| parent | b2c89d7060e99a36c8c7ac897b7386686c74deac (diff) | |
| download | xolatile-badassbug-757096e7df15c14b9b10352fa91663483f9e34f8.tar.xz xolatile-badassbug-757096e7df15c14b9b10352fa91663483f9e34f8.tar.zst | |
all
Diffstat (limited to 'src/engine/shader.cpp')
| -rw-r--r-- | src/engine/shader.cpp | 65 |
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); } } |
