diff options
| author | xolatile | 2025-08-06 22:54:55 +0200 |
|---|---|---|
| committer | xolatile | 2025-08-06 22:54:55 +0200 |
| commit | 0a1172b75f571685c264a8b9d8ee224bbf11381f (patch) | |
| tree | d041fdc68a60f0ebb48a3852bbcce6d9432f83d5 /src/engine/dynlight.cpp | |
| parent | affde05dc07a94643f1fd2751b2b441f57f73d7d (diff) | |
| download | xolatile-badassbug-0a1172b75f571685c264a8b9d8ee224bbf11381f.tar.xz xolatile-badassbug-0a1172b75f571685c264a8b9d8ee224bbf11381f.tar.zst | |
Please do not hate me, it makes sense...
Diffstat (limited to 'src/engine/dynlight.cpp')
| -rw-r--r-- | src/engine/dynlight.cpp | 86 |
1 files changed, 23 insertions, 63 deletions
diff --git a/src/engine/dynlight.cpp b/src/engine/dynlight.cpp index d018480..0c2a08d 100644 --- a/src/engine/dynlight.cpp +++ b/src/engine/dynlight.cpp @@ -3,18 +3,14 @@ VARP(maxdynlights, 0, min(3, MAXDYNLIGHTS), MAXDYNLIGHTS); VARP(dynlightdist, 0, 1024, 10000); -struct dynlight -{ +struct dynlight { vec o, hud; float radius, initradius, curradius, dist; vec color, initcolor, curcolor; int fade, peak, expire, flags; physent *owner; - - void calcradius() - { - if(fade + peak > 0) - { + void calcradius() { + if(fade + peak > 0) { int remaining = expire - lastmillis; if(flags&DL_EXPAND) curradius = initradius + (radius - initradius) * (1.0f - remaining/float(fade + peak)); @@ -26,20 +22,15 @@ struct dynlight } else curradius = radius; } - - void calccolor() - { + void calccolor() { if(flags&DL_FLASH || peak <= 0) curcolor = color; - else - { + else { int peaking = expire - lastmillis - fade; if(peaking <= 0) curcolor = color; else curcolor.lerp(initcolor, color, 1.0f - float(peaking)/peak); } - float intensity = 1.0f; - if(fade > 0) - { + if(fade > 0) { int fading = expire - lastmillis; if(fading < fade) intensity = float(fading)/fade; } @@ -52,11 +43,9 @@ struct dynlight vector<dynlight> dynlights; vector<dynlight *> closedynlights; -void adddynlight(const vec &o, float radius, const vec &color, int fade, int peak, int flags, float initradius, const vec &initcolor, physent *owner) -{ +void adddynlight(const vec &o, float radius, const vec &color, int fade, int peak, int flags, float initradius, const vec &initcolor, physent *owner) { if(!maxdynlights) return; if(o.dist(camera1->o) > dynlightdist || radius <= 0) return; - int insert = 0, expire = fade + peak + lastmillis; loopvrev(dynlights) if(expire>=dynlights[i].expire) { insert = i+1; break; } dynlight d; @@ -73,26 +62,21 @@ void adddynlight(const vec &o, float radius, const vec &color, int fade, int pea dynlights.insert(insert, d); } -void cleardynlights() -{ +void cleardynlights() { int faded = -1; loopv(dynlights) if(lastmillis<dynlights[i].expire) { faded = i; break; } if(faded<0) dynlights.setsize(0); else if(faded>0) dynlights.remove(0, faded); } -void removetrackeddynlights(physent *owner) -{ +void removetrackeddynlights(physent *owner) { loopvrev(dynlights) if(owner ? dynlights[i].owner == owner : dynlights[i].owner != NULL) dynlights.remove(i); } -void updatedynlights() -{ +void updatedynlights() { cleardynlights(); game::adddynlights(); - - loopv(dynlights) - { + loopv(dynlights) { dynlight &d = dynlights[i]; if(d.owner) game::dynlighttrack(d.owner, d.o, d.hud); d.calcradius(); @@ -100,14 +84,12 @@ void updatedynlights() } } -int finddynlights() -{ +int finddynlights() { closedynlights.setsize(0); if(!maxdynlights) return 0; physent e; e.type = ENT_CAMERA; - loopvj(dynlights) - { + loopvj(dynlights) { dynlight &d = dynlights[j]; if(d.curradius <= 0) continue; d.dist = camera1->o.dist(d.o) - d.curradius; @@ -116,7 +98,6 @@ int finddynlights() e.o = d.o; e.radius = e.xradius = e.yradius = e.eyeheight = e.aboveeye = d.curradius; if(!collide(&e, vec(0, 0, 0), 0, false)) continue; - int insert = 0; loopvrev(closedynlights) if(d.dist >= closedynlights[i]->dist) { insert = i+1; break; } closedynlights.insert(insert, &d); @@ -125,8 +106,7 @@ int finddynlights() return closedynlights.length(); } -bool getdynlight(int n, vec &o, float &radius, vec &color) -{ +bool getdynlight(int n, vec &o, float &radius, vec &color) { if(!closedynlights.inrange(n)) return false; dynlight &d = *closedynlights[n]; o = d.o; @@ -135,31 +115,25 @@ bool getdynlight(int n, vec &o, float &radius, vec &color) return true; } -void dynlightreaching(const vec &target, vec &color, vec &dir, bool hud) -{ +void dynlightreaching(const vec &target, vec &color, vec &dir, bool hud) { vec dyncolor(0, 0, 0);//, dyndir(0, 0, 0); - loopv(dynlights) - { + loopv(dynlights) { dynlight &d = dynlights[i]; if(d.curradius<=0) continue; - vec ray(hud ? d.hud : d.o); ray.sub(target); float mag = ray.squaredlen(); if(mag >= d.curradius*d.curradius) continue; - vec color = d.curcolor; color.mul(1 - sqrtf(mag)/d.curradius); dyncolor.add(color); //dyndir.add(ray.mul(intensity/mag)); } #if 0 - if(!dyndir.iszero()) - { + if(!dyndir.iszero()) { dyndir.normalize(); float x = dyncolor.magnitude(), y = color.magnitude(); - if(x+y>0) - { + if(x+y>0) { dir.mul(x); dyndir.mul(y); dir.add(dyndir).div(x+y); @@ -171,15 +145,12 @@ void dynlightreaching(const vec &target, vec &color, vec &dir, bool hud) color.add(dyncolor); } -void calcdynlightmask(vtxarray *va) -{ +void calcdynlightmask(vtxarray *va) { uint mask = 0; int offset = 0; - loopv(closedynlights) - { + loopv(closedynlights) { dynlight &d = *closedynlights[i]; if(d.o.dist_to_bb(va->geommin, va->geommax) >= d.curradius) continue; - mask |= (i+1)<<offset; offset += DYNLIGHTBITS; if(offset >= maxdynlights*DYNLIGHTBITS) break; @@ -187,35 +158,24 @@ void calcdynlightmask(vtxarray *va) va->dynlightmask = mask; } -int setdynlights(vtxarray *va) -{ +int setdynlights(vtxarray *va) { if(closedynlights.empty() || !va->dynlightmask) return 0; - extern bool minimizedynlighttcusage(); - static vec4 posv[MAXDYNLIGHTS]; static vec colorv[MAXDYNLIGHTS]; - int index = 0; - for(uint mask = va->dynlightmask; mask; mask >>= DYNLIGHTBITS, index++) - { + for(uint mask = va->dynlightmask; mask; mask >>= DYNLIGHTBITS, index++) { dynlight &d = *closedynlights[(mask&DYNLIGHTMASK)-1]; - float scale = 1.0f/d.curradius; vec origin = vec(d.o).mul(-scale); - - if(index>0 && minimizedynlighttcusage()) - { + if(index>0 && minimizedynlighttcusage()) { scale /= posv[0].w; origin.sub(vec(posv[0]).mul(scale)); } - posv[index] = vec4(origin, scale); colorv[index] = d.curcolor; } - GLOBALPARAMV(dynlightpos, posv, index); GLOBALPARAMV(dynlightcolor, colorv, index); - return index; } |
