From 382fbf2843f62c94752e809de977d0b4a2a2a113 Mon Sep 17 00:00:00 2001 From: vortex Date: Mon, 18 Oct 2010 00:47:19 +0000 Subject: [PATCH] R_CompleteLightPoint bugfixed, dynamic lights actually matter for lit particles, lit sprites now sample lightning from rtlights and dlights instead of just lightgrid (by using R_CompleteLightPoint). git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10546 d7cf8633-e32d-0410-b094-e92efae38249 --- cl_particles.c | 2 +- gl_rmain.c | 14 ++++++++++++-- r_shadow.c | 35 ++++++++++++++++++++++++++++++----- r_shadow.h | 2 +- r_sprites.c | 2 +- 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/cl_particles.c b/cl_particles.c index 92b0b1c6..d75ae27b 100644 --- a/cl_particles.c +++ b/cl_particles.c @@ -2536,7 +2536,7 @@ void R_DrawParticle_TransparentCallback(const entity_render_t *ent, const rtligh // 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]); diff --git a/gl_rmain.c b/gl_rmain.c index c5d46a79..45b1a68d 100644 --- a/gl_rmain.c +++ b/gl_rmain.c @@ -7868,7 +7868,18 @@ static void R_View_UpdateEntityLighting (void) { 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... @@ -14503,7 +14514,6 @@ void R_DrawCustomSurface_Texture(texture_t *texture, const matrix4x4_t *texmatri 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; diff --git a/r_shadow.c b/r_shadow.c index 032d80db..d6057792 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -6001,7 +6001,7 @@ LIGHT SAMPLING ============================================================================= */ -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); @@ -6016,16 +6016,41 @@ void R_CompleteLightPoint(vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffu 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); } } } diff --git a/r_shadow.h b/r_shadow.h index cf74e268..479d839e 100644 --- a/r_shadow.h +++ b/r_shadow.h @@ -92,6 +92,6 @@ void R_Shadow_PrepareShadowSides(int numtris); 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 diff --git a/r_sprites.c b/r_sprites.c index fbcd8b36..02348b37 100644 --- a/r_sprites.c +++ b/r_sprites.c @@ -386,7 +386,7 @@ void R_Model_Sprite_Draw_TransparentCallback(const entity_render_t *ent, const r // 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) -- 2.39.2