From 0842f5b47e27ebfc2b143387732d71f159ae3b40 Mon Sep 17 00:00:00 2001 From: havoc Date: Sun, 6 Oct 2002 16:51:35 +0000 Subject: [PATCH] make r_shadows 3 mode mostly match lighting conditions of the lightmaps r_shadows 3 mode now checks SURF_SHADOWCAST and SURF_SHADOWLIGHT flags git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2512 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rsurf.c | 52 ++++++++++++++++++++++++++++----------------------- model_brush.c | 12 ++++++------ model_brush.h | 2 ++ r_shadow.c | 6 +++--- 4 files changed, 40 insertions(+), 32 deletions(-) diff --git a/gl_rsurf.c b/gl_rsurf.c index 5593a63a..749e2238 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -1864,21 +1864,24 @@ void R_Model_Brush_DrawShadowVolume (entity_render_t *ent, vec3_t relativelighto lightradius2 = lightradius * lightradius; for (i = 0, surf = ent->model->surfaces + ent->model->firstmodelsurface;i < ent->model->nummodelsurfaces;i++, surf++) { - f = PlaneDiff(relativelightorigin, surf->plane); - if (surf->flags & SURF_PLANEBACK) - f = -f; - // draw shadows only for backfaces - projectdistance = lightradius + f; - if (projectdistance >= 0.1 && projectdistance < lightradius) + if (surf->flags & SURF_SHADOWCAST) { - VectorSubtract(relativelightorigin, surf->poly_center, temp); - if (DotProduct(temp, temp) < (surf->poly_radius2 + lightradius2)) + f = PlaneDiff(relativelightorigin, surf->plane); + if (surf->flags & SURF_PLANEBACK) + f = -f; + // draw shadows only for backfaces + projectdistance = lightradius + f; + if (projectdistance >= 0.1 && projectdistance < lightradius) { - for (mesh = surf->mesh;mesh;mesh = mesh->chain) + VectorSubtract(relativelightorigin, surf->poly_center, temp); + if (DotProduct(temp, temp) < (surf->poly_radius2 + lightradius2)) { - R_Mesh_ResizeCheck(mesh->numverts * 2); - memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4])); - R_Shadow_Volume(mesh->numverts, mesh->numtriangles, varray_vertex, mesh->index, mesh->triangleneighbors, relativelightorigin, lightradius, projectdistance, visiblevolume); + for (mesh = surf->mesh;mesh;mesh = mesh->chain) + { + R_Mesh_ResizeCheck(mesh->numverts * 2); + memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4])); + R_Shadow_Volume(mesh->numverts, mesh->numtriangles, varray_vertex, mesh->index, mesh->triangleneighbors, relativelightorigin, lightradius, projectdistance, visiblevolume); + } } } } @@ -1898,22 +1901,25 @@ void R_Model_Brush_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, f GL_UseColorArray(); for (i = 0, surf = ent->model->surfaces + ent->model->firstmodelsurface;i < ent->model->nummodelsurfaces;i++, surf++) { - f = PlaneDiff(relativelightorigin, surf->plane); - if (surf->flags & SURF_PLANEBACK) - f = -f; - if (f >= -0.1 && f < lightradius) + if (surf->flags & SURF_SHADOWLIGHT) { - f = PlaneDiff(modelorg, surf->plane); + f = PlaneDiff(relativelightorigin, surf->plane); if (surf->flags & SURF_PLANEBACK) f = -f; - if (f > 0) + if (f >= -0.1 && f < lightradius) { - for (mesh = surf->mesh;mesh;mesh = mesh->chain) + f = PlaneDiff(modelorg, surf->plane); + if (surf->flags & SURF_PLANEBACK) + f = -f; + if (f > 0) { - R_Mesh_ResizeCheck(mesh->numverts); - memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4])); - R_Shadow_Light(mesh->numverts, mesh->normals, relativelightorigin, lightradius, lightdistbias, lightsubtract, lightcolor); - R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->index); + for (mesh = surf->mesh;mesh;mesh = mesh->chain) + { + R_Mesh_ResizeCheck(mesh->numverts); + memcpy(varray_vertex, mesh->verts, mesh->numverts * sizeof(float[4])); + R_Shadow_Light(mesh->numverts, mesh->normals, relativelightorigin, lightradius, lightdistbias, lightsubtract, lightcolor); + R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->index); + } } } } diff --git a/model_brush.c b/model_brush.c index 44bb23ff..a499fd4c 100644 --- a/model_brush.c +++ b/model_brush.c @@ -427,7 +427,7 @@ static void Mod_LoadTextures (lump_t *l) { tx->flags |= SURF_LIGHTMAP; if (!tx->fogtexture) - tx->flags |= SURF_CLIPSOLID; + tx->flags |= SURF_SHADOWCAST | SURF_SHADOWLIGHT; tx->shader = &Cshader_wall_lightmap; } @@ -1187,7 +1187,7 @@ void Mod_ProcessLightList(void) qbyte *pvs; for (lnum = 0, e = loadmodel->lights;lnum < loadmodel->numlights;lnum++, e++) { - e->cullradius2 = DotProduct(e->light, e->light) * (1.0f / (8192.0f * 8192.0f)) / (e->falloff * e->falloff) + 4096.0f; + e->cullradius2 = DotProduct(e->light, e->light) / (e->falloff * e->falloff * 8192.0f * 8192.0f);// + 4096.0f; if (e->cullradius2 > 4096.0f * 4096.0f) e->cullradius2 = 4096.0f * 4096.0f; e->cullradius = sqrt(e->cullradius2); @@ -1287,7 +1287,7 @@ void Mod_ProcessLightList(void) svworld = Mod_ShadowBrush_NewWorld(loadmodel->mempool); for (j = 0, surf = loadmodel->surfaces + loadmodel->firstmodelsurface;j < loadmodel->nummodelsurfaces;j++, surf++) { - if (!(surf->flags & SURF_CLIPSOLID)) + if (!(surf->flags & SURF_SHADOWCAST)) continue; f = DotProduct(e->origin, surf->plane->normal) - surf->plane->dist; if (surf->flags & SURF_PLANEBACK) @@ -1442,7 +1442,7 @@ void Mod_ProcessLightList(void) #if 1 for (j = 0, surf = loadmodel->surfaces + loadmodel->firstmodelsurface;j < loadmodel->nummodelsurfaces;j++, surf++) { - if (!(surf->flags & SURF_CLIPSOLID)) + if (!(surf->flags & SURF_SHADOWCAST)) continue; /* if (surf->poly_maxs[0] < e->mins[0] @@ -1541,7 +1541,7 @@ void Mod_ProcessLightList(void) for (j = 0;j < e->numsurfaces;j++) { surf = e->surfaces[j]; - if (!(surf->flags & SURF_CLIPSOLID)) + if (!(surf->flags & SURF_SHADOWCAST)) continue; f = DotProduct(e->origin, surf->plane->normal) - surf->plane->dist; if (surf->flags & SURF_PLANEBACK) @@ -3459,7 +3459,7 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer) // (only used for shadow volumes) mod->shadowmesh = Mod_ShadowMesh_Begin(originalloadmodel->mempool); for (j = 0, surf = &mod->surfaces[mod->firstmodelsurface];j < mod->nummodelsurfaces;j++, surf++) - if (surf->flags & SURF_CLIPSOLID) + if (surf->flags & SURF_SHADOWCAST) Mod_ShadowMesh_AddPolygon(originalloadmodel->mempool, mod->shadowmesh, surf->poly_numverts, surf->poly_verts); mod->shadowmesh = Mod_ShadowMesh_Finish(originalloadmodel->mempool, mod->shadowmesh); Mod_ShadowMesh_CalcBBox(mod->shadowmesh, mod->shadowmesh_mins, mod->shadowmesh_maxs, mod->shadowmesh_center, &mod->shadowmesh_radius); diff --git a/model_brush.h b/model_brush.h index ff58a377..e9282698 100644 --- a/model_brush.h +++ b/model_brush.h @@ -120,6 +120,8 @@ texture_t; #define SURF_DRAWFULLBRIGHT 0x200 #define SURF_LIGHTBOTHSIDES 0x400 #define SURF_CLIPSOLID 0x800 // this polygon can obscure other polygons +#define SURF_SHADOWCAST 0x1000 // this polygon can cast stencil shadows +#define SURF_SHADOWLIGHT 0x2000 // this polygon can be lit by stencil shadowing typedef struct { diff --git a/r_shadow.c b/r_shadow.c index 4aa7b5aa..07fcb218 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -13,10 +13,10 @@ rtexturepool_t *r_shadow_texturepool; rtexture_t *r_shadow_attenuationtexture; cvar_t r_shadow1 = {0, "r_shadow1", "16"}; -cvar_t r_shadow2 = {0, "r_shadow2", "2"}; +cvar_t r_shadow2 = {0, "r_shadow2", "4"}; cvar_t r_shadow3 = {0, "r_shadow3", "65536"}; cvar_t r_shadow4 = {0, "r_shadow4", "1"}; -cvar_t r_shadow5 = {0, "r_shadow5", "0.05"}; +cvar_t r_shadow5 = {0, "r_shadow5", "0"}; cvar_t r_shadow6 = {0, "r_shadow6", "1"}; void r_shadow_start(void) @@ -318,7 +318,7 @@ void R_Shadow_Stage_ShadowVolumes(void) qglColorMask(0, 0, 0, 0); qglDisable(GL_BLEND); qglDepthMask(0); - qglDepthFunc(GL_LEQUAL); + qglDepthFunc(GL_LESS); qglClearStencil(0); qglClear(GL_STENCIL_BUFFER_BIT); qglEnable(GL_STENCIL_TEST); -- 2.39.2