// note: lighting is not cheap!
if (particletype[p->typeindex].lighting)
{
- R_CompleteLightPoint(ambient, diffuse, diffusenormal, p->org, true);
+ R_CompleteLightPoint(ambient, diffuse, diffusenormal, p->org, true, false);
c4f[0] *= (ambient[0] + 0.5 * diffuse[0]);
c4f[1] *= (ambient[1] + 0.5 * diffuse[1]);
c4f[2] *= (ambient[2] + 0.5 * diffuse[2]);
{
vec3_t org;
Matrix4x4_OriginFromMatrix(&ent->matrix, org);
- r_refdef.scene.worldmodel->brush.LightPoint(r_refdef.scene.worldmodel, org, ent->modellight_ambient, ent->modellight_diffuse, tempdiffusenormal);
+
+ // complete lightning for lit sprites
+ // todo: make a EF_ field so small ents could be lit purely by modellight and skipping real rtlight pass (like EF_NORTLIGHT)?
+ if (ent->model->type == mod_sprite && !(ent->model->data_textures[0].basematerialflags & MATERIALFLAG_FULLBRIGHT))
+ {
+ if (ent->model->sprite.sprnum_type == SPR_OVERHEAD) // apply offset for overhead sprites
+ org[2] = org[2] + r_overheadsprites_pushback.value;
+ R_CompleteLightPoint(ent->modellight_ambient, ent->modellight_diffuse, ent->modellight_lightdir, org, true, true);
+ }
+ else
+ r_refdef.scene.worldmodel->brush.LightPoint(r_refdef.scene.worldmodel, org, ent->modellight_ambient, ent->modellight_diffuse, tempdiffusenormal);
+
if(ent->flags & RENDER_EQUALIZE)
{
// first fix up ambient lighting...
const msurface_t *surfacelist = &surface;
// fake enough texture and surface state to render this geometry
-
surface.texture = texture;
surface.num_triangles = numtriangles;
surface.num_firsttriangle = firsttriangle;
=============================================================================
*/
-void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal, const vec3_t p, int dynamic)
+void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal, const vec3_t p, qboolean dynamic, qboolean rtworld)
{
VectorClear(diffusecolor);
VectorClear(diffusenormal);
if (dynamic)
{
- int i;
+ int i, numlights, flag;
float f, v[3];
rtlight_t *light;
+ dlight_t *dlight;
+
+ // sample rtlights
+ if (rtworld)
+ {
+ flag = r_refdef.scene.rtworld ? LIGHTFLAG_REALTIMEMODE : LIGHTFLAG_NORMALMODE;
+ numlights = Mem_ExpandableArray_IndexRange(&r_shadow_worldlightsarray);
+ for (i = 0; i < numlights; i++)
+ {
+ dlight = (dlight_t *) Mem_ExpandableArray_RecordAtIndex(&r_shadow_worldlightsarray, i);
+ light = &dlight->rtlight;
+ if (!(light->flags & flag))
+ continue;
+ Matrix4x4_Transform(&light->matrix_worldtolight, p, v);
+ f = 1 - VectorLength2(v);
+ if (f <= 0)
+ continue;
+ if (!light->shadow || CL_TraceLine(p, light->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction == 1)
+ VectorMA(ambientcolor, f, light->currentcolor, ambientcolor);
+ }
+ }
+
+ // sample dlights
for (i = 0;i < r_refdef.scene.numlights;i++)
{
light = r_refdef.scene.lights[i];
Matrix4x4_Transform(&light->matrix_worldtolight, p, v);
- f = 1 - VectorLength2(v);
- if (f > 0 && CL_TraceLine(p, light->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction == 1)
- VectorMA(ambientcolor, f, light->currentcolor, ambientcolor);
+ f = (1 - VectorLength2(v)) * r_refdef.scene.rtlightstylevalue[light->style];
+ if (f <= 0)
+ continue;
+ if (!light->shadow || CL_TraceLine(p, light->shadoworigin, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID, true, false, NULL, false).fraction == 1)
+ VectorMA(ambientcolor, f, light->color, ambientcolor);
}
}
}
void R_Shadow_PrepareModelShadows(void);
-void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal, const vec3_t p, int dynamic);
+void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal, const vec3_t p, qboolean dynamic, qboolean rtworld);
#endif
// lit sprite by lightgrid if it is not fullbright, lit only ambient
if (!(texture->currentmaterialflags & MATERIALFLAG_FULLBRIGHT))
- VectorAdd(ent->modellight_ambient, ent->modellight_diffuse, rsurface.modellight_ambient);
+ VectorAdd(ent->modellight_ambient, ent->modellight_diffuse, rsurface.modellight_ambient); // sprites dont use lightdirection
// SPR_LABEL should not use depth test AT ALL
if(model->sprite.sprnum_type == SPR_LABEL || model->sprite.sprnum_type == SPR_LABEL_SCALE)