cvar_t r_modellights = {CVAR_SAVE, "r_modellights", "4"};
cvar_t r_vismarklights = {0, "r_vismarklights", "1"};
+cvar_t r_coronas = {CVAR_SAVE, "r_coronas", "1"};
+cvar_t gl_flashblend = {CVAR_SAVE, "gl_flashblend", "1"};
static rtexture_t *lightcorona;
static rtexturepool_t *lighttexturepool;
{
Cvar_RegisterVariable(&r_modellights);
Cvar_RegisterVariable(&r_vismarklights);
+ Cvar_RegisterVariable(&r_coronas);
+ Cvar_RegisterVariable(&gl_flashblend);
R_RegisterModule("R_Light", r_light_start, r_light_shutdown, r_light_newmap);
}
rd->cullradius = sqrt(rd->cullradius2);
rd->subtract = 1.0f / rd->cullradius2;
//rd->ent = cd->ent;
- r_numdlights++;
c_dlights++; // count every dlight in use
}
}
rmeshbufferinfo_t m;
float scale, viewdist, diff[3], dist;
rdlight_t *rd;
+ if (!r_coronas.integer)
+ return;
memset(&m, 0, sizeof(m));
- m.transparent = false;
m.blendfunc1 = GL_ONE;
m.blendfunc2 = GL_ONE;
m.depthdisable = true; // magic
dist = (DotProduct(rd->origin, vpn) - viewdist);
if (dist >= 24.0f)
{
- // trace to a point just barely closer to the eye
- VectorSubtract(rd->origin, vpn, diff);
- if (CL_TraceLine(r_origin, diff, NULL, NULL, 0, true) == 1 && R_Mesh_Draw_GetBuffer(&m, false))
+ if (CL_TraceLine(rd->origin, r_origin, NULL, NULL, 0, true) == 1)
{
- scale = m.colorscale * (1.0f / 131072.0f);
- if (fogenabled)
+ Matrix4x4_CreateIdentity(&m.matrix);
+ if (R_Mesh_Draw_GetBuffer(&m, false))
{
- VectorSubtract(rd->origin, r_origin, diff);
- scale *= 1 - exp(fogdensity/DotProduct(diff,diff));
+ scale = m.colorscale * (1.0f / 131072.0f);
+ if (gl_flashblend.integer)
+ scale *= 4.0f;
+ if (fogenabled)
+ {
+ VectorSubtract(rd->origin, r_origin, diff);
+ scale *= 1 - exp(fogdensity/DotProduct(diff,diff));
+ }
+ m.index[0] = 0;
+ m.index[1] = 1;
+ m.index[2] = 2;
+ m.index[3] = 0;
+ m.index[4] = 2;
+ m.index[5] = 3;
+ m.color[0] = m.color[4] = m.color[8] = m.color[12] = rd->light[0] * scale;
+ m.color[1] = m.color[5] = m.color[9] = m.color[13] = rd->light[1] * scale;
+ m.color[2] = m.color[6] = m.color[10] = m.color[14] = rd->light[2] * scale;
+ m.color[3] = m.color[7] = m.color[11] = m.color[15] = 1;
+ m.texcoords[0][0] = 0;
+ m.texcoords[0][1] = 0;
+ m.texcoords[0][2] = 0;
+ m.texcoords[0][3] = 1;
+ m.texcoords[0][4] = 1;
+ m.texcoords[0][5] = 1;
+ m.texcoords[0][6] = 1;
+ m.texcoords[0][7] = 0;
+ scale = rd->cullradius * 0.25f;
+ if (gl_flashblend.integer)
+ scale *= 2.0f;
+ m.vertex[0] = rd->origin[0] - vright[0] * scale - vup[0] * scale;
+ m.vertex[1] = rd->origin[1] - vright[1] * scale - vup[1] * scale;
+ m.vertex[2] = rd->origin[2] - vright[2] * scale - vup[2] * scale;
+ m.vertex[4] = rd->origin[0] - vright[0] * scale + vup[0] * scale;
+ m.vertex[5] = rd->origin[1] - vright[1] * scale + vup[1] * scale;
+ m.vertex[6] = rd->origin[2] - vright[2] * scale + vup[2] * scale;
+ m.vertex[8] = rd->origin[0] + vright[0] * scale + vup[0] * scale;
+ m.vertex[9] = rd->origin[1] + vright[1] * scale + vup[1] * scale;
+ m.vertex[10] = rd->origin[2] + vright[2] * scale + vup[2] * scale;
+ m.vertex[12] = rd->origin[0] + vright[0] * scale - vup[0] * scale;
+ m.vertex[13] = rd->origin[1] + vright[1] * scale - vup[1] * scale;
+ m.vertex[14] = rd->origin[2] + vright[2] * scale - vup[2] * scale;
+ R_Mesh_Render();
}
- m.index[0] = 0;
- m.index[1] = 1;
- m.index[2] = 2;
- m.index[3] = 0;
- m.index[4] = 2;
- m.index[5] = 3;
- m.color[0] = m.color[4] = m.color[8] = m.color[12] = rd->light[0] * scale;
- m.color[1] = m.color[5] = m.color[9] = m.color[13] = rd->light[1] * scale;
- m.color[2] = m.color[6] = m.color[10] = m.color[14] = rd->light[2] * scale;
- m.color[3] = m.color[7] = m.color[11] = m.color[15] = 1;
- m.texcoords[0][0] = 0;
- m.texcoords[0][1] = 0;
- m.texcoords[0][2] = 0;
- m.texcoords[0][3] = 1;
- m.texcoords[0][4] = 1;
- m.texcoords[0][5] = 1;
- m.texcoords[0][6] = 1;
- m.texcoords[0][7] = 0;
- scale = rd->cullradius * 0.25f;
- m.vertex[0] = rd->origin[0] - vright[0] * scale - vup[0] * scale;
- m.vertex[1] = rd->origin[1] - vright[1] * scale - vup[1] * scale;
- m.vertex[2] = rd->origin[2] - vright[2] * scale - vup[2] * scale;
- m.vertex[4] = rd->origin[0] - vright[0] * scale + vup[0] * scale;
- m.vertex[5] = rd->origin[1] - vright[1] * scale + vup[1] * scale;
- m.vertex[6] = rd->origin[2] - vright[2] * scale + vup[2] * scale;
- m.vertex[8] = rd->origin[0] + vright[0] * scale + vup[0] * scale;
- m.vertex[9] = rd->origin[1] + vright[1] * scale + vup[1] * scale;
- m.vertex[10] = rd->origin[2] + vright[2] * scale + vup[2] * scale;
- m.vertex[12] = rd->origin[0] + vright[0] * scale - vup[0] * scale;
- m.vertex[13] = rd->origin[1] + vright[1] * scale - vup[1] * scale;
- m.vertex[14] = rd->origin[2] + vright[2] * scale - vup[2] * scale;
- R_Mesh_Render();
}
}
}
R_MarkLights
=============
*/
-static void R_OldMarkLights (vec3_t lightorigin, rdlight_t *rd, int bit, int bitindex, mnode_t *node)
+static void R_OldMarkLights (entity_render_t *ent, vec3_t lightorigin, rdlight_t *rd, int bit, int bitindex, mnode_t *node)
{
float ndist, maxdist;
msurface_t *surf;
}
// mark the polygons
- surf = currentrenderentity->model->surfaces + node->firstsurface;
+ surf = ent->model->surfaces + node->firstsurface;
for (i=0 ; i<node->numsurfaces ; i++, surf++)
{
int d, impacts, impactt;
{
if (node->children[1]->contents >= 0)
{
- R_OldMarkLights (lightorigin, rd, bit, bitindex, node->children[0]);
+ R_OldMarkLights (ent, lightorigin, rd, bit, bitindex, node->children[0]);
node = node->children[1];
goto loc0;
}
}
-static void R_VisMarkLights (rdlight_t *rd, int bit, int bitindex)
+static void R_VisMarkLights (entity_render_t *ent, rdlight_t *rd, int bit, int bitindex)
{
static int lightframe = 0;
mleaf_t *pvsleaf;
if (!r_dynamic.integer)
return;
- model = currentrenderentity->model;
- softwareuntransform(rd->origin, lightorigin);
+ model = ent->model;
+ //softwareuntransform(rd->origin, lightorigin);
+ Matrix4x4_Transform(&ent->inversematrix, rd->origin, lightorigin);
if (!r_vismarklights.integer)
{
- R_OldMarkLights(lightorigin, rd, bit, bitindex, model->nodes + model->hulls[0].firstclipnode);
+ R_OldMarkLights(ent, lightorigin, rd, bit, bitindex, model->nodes + model->hulls[0].firstclipnode);
return;
}
if (pvsleaf == NULL)
{
Con_Printf("R_VisMarkLights: NULL leaf??\n");
- R_OldMarkLights(lightorigin, rd, bit, bitindex, model->nodes + model->hulls[0].firstclipnode);
+ R_OldMarkLights(ent, lightorigin, rd, bit, bitindex, model->nodes + model->hulls[0].firstclipnode);
return;
}
if (!in)
{
// no vis info, so make all visible
- R_OldMarkLights(lightorigin, rd, bit, bitindex, model->nodes + model->hulls[0].firstclipnode);
+ R_OldMarkLights(ent, lightorigin, rd, bit, bitindex, model->nodes + model->hulls[0].firstclipnode);
return;
}
}
}
-void R_MarkLights(void)
+void R_MarkLights(entity_render_t *ent)
{
int i;
- for (i = 0;i < r_numdlights;i++)
- R_VisMarkLights (r_dlight + i, 1 << (i & 31), i >> 5);
+ if (!gl_flashblend.integer)
+ for (i = 0;i < r_numdlights;i++)
+ R_VisMarkLights (ent, r_dlight + i, 1 << (i & 31), i >> 5);
}
/*
=============================================================================
*/
-static int RecursiveLightPoint (vec3_t color, mnode_t *node, float x, float y, float startz, float endz)
+static int RecursiveLightPoint (vec3_t color, const mnode_t *node, float x, float y, float startz, float endz)
{
int side, distz = endz - startz;
float front, back;
}
}
-void R_CompleteLightPoint (vec3_t color, vec3_t p, int dynamic, mleaf_t *leaf)
+void R_CompleteLightPoint (vec3_t color, const vec3_t p, int dynamic, const mleaf_t *leaf)
{
- int i, *dlightbits;
+ int i;
+ const int *dlightbits;
vec3_t v;
float f;
rdlight_t *rd;
}
}
-void R_ModelLightPoint (vec3_t color, vec3_t p, int *dlightbits)
+void R_ModelLightPoint (const entity_render_t *ent, vec3_t color, const vec3_t p, int *dlightbits)
{
mleaf_t *leaf;
leaf = Mod_PointInLeaf(p, cl.worldmodel);
return;
}
- if (r_fullbright.integer || !cl.worldmodel->lightdata || currentrenderentity->effects & EF_FULLBRIGHT)
+ if (r_fullbright.integer || !cl.worldmodel->lightdata || ent->effects & EF_FULLBRIGHT)
{
color[0] = color[1] = color[2] = 2;
dlightbits[0] = dlightbits[1] = dlightbits[2] = dlightbits[3] = dlightbits[4] = dlightbits[5] = dlightbits[6] = dlightbits[7] = 0;
dlightbits[0] = dlightbits[1] = dlightbits[2] = dlightbits[3] = dlightbits[4] = dlightbits[5] = dlightbits[6] = dlightbits[7] = 0;
}
-void R_LightModel(int numverts, float colorr, float colorg, float colorb, int worldcoords)
+void R_LightModel(const entity_render_t *ent, int numverts, float colorr, float colorg, float colorb, int worldcoords)
{
int i, j, nearlights = 0, maxnearlights = r_modellights.integer;
float color[3], basecolor[3], v[3], t, *av, *avn, *avc, a, f, dist2, mscale, dot, stylescale, intensity, ambientcolor[3];
int modeldlightbits[8];
mlight_t *sl;
rdlight_t *rd;
- a = currentrenderentity->alpha;
+ a = ent->alpha;
// scale of the model's coordinate space, to alter light attenuation to match
// make the mscale squared so it can scale the squared distance results
- mscale = currentrenderentity->scale * currentrenderentity->scale;
- if ((maxnearlights != 0) && !r_fullbright.integer && !(currentrenderentity->effects & EF_FULLBRIGHT))
+ mscale = ent->scale * ent->scale;
+ if ((maxnearlights != 0) && !r_fullbright.integer && !(ent->effects & EF_FULLBRIGHT))
{
- R_ModelLightPoint(basecolor, currentrenderentity->origin, modeldlightbits);
+ R_ModelLightPoint(ent, basecolor, ent->origin, modeldlightbits);
nl = &nearlight[0];
- VectorSubtract(currentrenderentity->origin, currentrenderentity->entlightsorigin, v);
- if ((realtime > currentrenderentity->entlightstime && DotProduct(v,v) >= 1.0f))
- {
- currentrenderentity->numentlights = 0;
- currentrenderentity->entlightstime = realtime + 0.2;
- VectorCopy(currentrenderentity->origin, currentrenderentity->entlightsorigin);
- for (i = 0, sl = cl.worldmodel->lights;i < cl.worldmodel->numlights && currentrenderentity->numentlights < MAXENTLIGHTS;i++, sl++)
- if (CL_TraceLine(currentrenderentity->origin, sl->origin, NULL, NULL, 0, false) == 1)
- currentrenderentity->entlights[currentrenderentity->numentlights++] = i;
- }
- for (i = 0;i < currentrenderentity->numentlights;i++)
+ for (i = 0;i < ent->numentlights;i++)
{
- sl = cl.worldmodel->lights + currentrenderentity->entlights[i];
+ sl = cl.worldmodel->lights + ent->entlights[i];
stylescale = d_lightstylevalue[sl->style] * (1.0f / 65536.0f);
- VectorSubtract (currentrenderentity->origin, sl->origin, v);
+ VectorSubtract (ent->origin, sl->origin, v);
f = ((1.0f / (DotProduct(v, v) * sl->falloff + sl->distbias)) - sl->subtract) * stylescale;
VectorScale(sl->light, f, ambientcolor);
intensity = DotProduct(ambientcolor, ambientcolor);
if (worldcoords)
VectorCopy(sl->origin, nl->origin);
else
- softwareuntransform(sl->origin, nl->origin);
+ //softwareuntransform(sl->origin, nl->origin);
+ Matrix4x4_Transform(&ent->inversematrix, sl->origin, nl->origin);
// integrate mscale into falloff, for maximum speed
nl->falloff = sl->falloff * mscale;
VectorCopy(ambientcolor, nl->ambientlight);
if (!(modeldlightbits[i >> 5] & (1 << (i & 31))))
continue;
rd = r_dlight + i;
- VectorSubtract (currentrenderentity->origin, rd->origin, v);
+ VectorSubtract (ent->origin, rd->origin, v);
f = ((1.0f / (DotProduct(v, v) + LIGHTOFFSET)) - rd->subtract);
VectorScale(rd->light, f, ambientcolor);
intensity = DotProduct(ambientcolor, ambientcolor);
if (worldcoords)
VectorCopy(rd->origin, nl->origin);
else
- softwareuntransform(rd->origin, nl->origin);
+ {
+ //softwareuntransform(rd->origin, nl->origin);
+ Matrix4x4_Transform(&ent->inversematrix, rd->origin, nl->origin);
+ /*
+ Con_Printf("%i %s : %f %f %f : %f %f %f\n%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n"
+ , rd - r_dlight, ent->model->name
+ , rd->origin[0], rd->origin[1], rd->origin[2]
+ , nl->origin[0], nl->origin[1], nl->origin[2]
+ , ent->inversematrix.m[0][0], ent->inversematrix.m[0][1], ent->inversematrix.m[0][2], ent->inversematrix.m[0][3]
+ , ent->inversematrix.m[1][0], ent->inversematrix.m[1][1], ent->inversematrix.m[1][2], ent->inversematrix.m[1][3]
+ , ent->inversematrix.m[2][0], ent->inversematrix.m[2][1], ent->inversematrix.m[2][2], ent->inversematrix.m[2][3]
+ , ent->inversematrix.m[3][0], ent->inversematrix.m[3][1], ent->inversematrix.m[3][2], ent->inversematrix.m[3][3]);
+ */
+ }
// integrate mscale into falloff, for maximum speed
nl->falloff = mscale;
VectorCopy(ambientcolor, nl->ambientlight);
}
else
{
- R_CompleteLightPoint (basecolor, currentrenderentity->origin, true, NULL);
+ R_CompleteLightPoint (basecolor, ent->origin, true, NULL);
}
basecolor[0] *= colorr;
basecolor[1] *= colorg;
}
}
+void R_UpdateEntLights(entity_render_t *ent)
+{
+ int i;
+ const mlight_t *sl;
+ vec3_t v;
+ VectorSubtract(ent->origin, ent->entlightsorigin, v);
+ if (ent->entlightsframe != (r_framecount - 1) || (realtime > ent->entlightstime && DotProduct(v,v) >= 1.0f))
+ {
+ ent->entlightstime = realtime + 0.1;
+ VectorCopy(ent->origin, ent->entlightsorigin);
+ ent->numentlights = 0;
+ for (i = 0, sl = cl.worldmodel->lights;i < cl.worldmodel->numlights && ent->numentlights < MAXENTLIGHTS;i++, sl++)
+ if (CL_TraceLine(ent->origin, sl->origin, NULL, NULL, 0, false) == 1)
+ ent->entlights[ent->numentlights++] = i;
+ }
+ ent->entlightsframe = r_framecount;
+}