summaryrefslogtreecommitdiff
path: root/src/engine/dynlight.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/dynlight.cpp')
-rw-r--r--src/engine/dynlight.cpp86
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;
}