calcshadowinfo cleanup

master
Lee Salzman 2013-02-04 21:02:19 +02:00
parent ac52ed9f3e
commit 3b3655bff4
3 changed files with 49 additions and 28 deletions

View File

@ -462,6 +462,7 @@ extern void clearshadowcache();
extern void findshadowvas();
extern void findshadowmms();
extern int calcshadowinfo(const extentity &e, vec &origin, float &radius, vec &spotloc, int &spotangle, float &bias);
extern int dynamicshadowvabounds(int mask, vec &bbmin, vec &bbmax);
extern void rendershadowmapworld();
extern void batchshadowmapmodels();

View File

@ -3039,6 +3039,48 @@ void rendercsmshadowmaps()
shadowmapping = 0;
}
int calcshadowinfo(const extentity &e, vec &origin, float &radius, vec &spotloc, int &spotangle, float &bias)
{
if(e.attr5&L_NOSHADOW || (e.attr1 > 0 && e.attr1 <= smminradius)) return SM_NONE;
origin = e.o;
radius = e.attr1 > 0 ? e.attr1 : 2*worldsize;
int type, w;
float lod;
if(e.attached && e.attached->type == ET_SPOTLIGHT)
{
type = SM_SPOT;
w = 1;
lod = smspotprec;
spotloc = e.attached->o;
spotangle = clamp(int(e.attached->attr1), 1, 89);
}
else
{
if(smtetra && glslversion >= 130)
{
type = SM_TETRA;
w = 2;
lod = smtetraprec;
}
else
{
type = SM_CUBEMAP;
w = 3;
lod = smcubeprec;
}
spotloc = e.o;
spotangle = 0;
}
lod *= smminsize;
int size = clamp(int(ceil((lod * shadowatlaspacker.w) / SHADOWATLAS_SIZE)), 1, shadowatlaspacker.w / w),
border = smfilter > 2 ? smborder2 : smborder;
bias = border / float(size - border);
return type;
}
void rendershadowmaps()
{
bool tetra = smtetra && glslversion >= 130;

View File

@ -2165,7 +2165,7 @@ struct shadowmesh
{
vec origin;
float radius;
vec spotdir;
vec spotloc;
int spotangle;
int type;
int draws[6];
@ -2303,37 +2303,15 @@ static void genshadowmeshtris(shadowmesh &m, int sides, shadowdrawinfo draws[6],
static void genshadowmesh(int idx, extentity &e)
{
extern int smminradius;
if(e.attr5&L_NOSHADOW || (e.attr1 > 0 && e.attr1 <= smminradius)) return;
shadowmesh m;
m.origin = e.o;
m.radius = e.attr1 > 0 ? e.attr1 : 2*worldsize;
if(e.attached && e.attached->type == ET_SPOTLIGHT)
{
m.type = SM_SPOT;
m.spotdir = e.attached->o;
m.spotangle = clamp(int(e.attached->attr1), 1, 89);
}
else
{
m.type = smtetra && glslversion >= 130 ? SM_TETRA : SM_CUBEMAP;
m.spotdir = e.o;
m.spotangle = 0;
}
m.type = calcshadowinfo(e, m.origin, m.radius, m.spotloc, m.spotangle, shadowbias);
if(!m.type) return;
memset(m.draws, -1, sizeof(m.draws));
extern float smspotprec, smtetraprec, smcubeprec;
extern int smfilter, smborder, smborder2, smminsize;
float lod = m.type == SM_SPOT ? smspotprec : (m.type == SM_TETRA ? smtetraprec : smcubeprec);
int size = clamp(int(ceil(lod * smminsize)), 1, 1024), border = smfilter > 2 ? smborder2 : smborder;
shadowmapping = m.type;
shadoworigin = m.origin;
shadowradius = m.radius;
shadowbias = border / float(size - border);
shadowdir = m.type == SM_SPOT ? vec(m.spotdir).sub(m.origin).normalize() : vec(0, 0, 0);
shadowdir = m.type == SM_SPOT ? vec(m.spotloc).sub(m.origin).normalize() : vec(0, 0, 0);
shadowspot = m.spotangle;
findshadowvas();
@ -2382,11 +2360,11 @@ void genshadowmeshes()
shadowmesh *findshadowmesh(int idx, extentity &e)
{
shadowmesh *m = shadowmeshes.access(idx);
if(!m || m->type != shadowmapping || m->origin != shadoworigin || m->radius != shadowradius) return NULL;
if(!m || m->type != shadowmapping || m->origin != shadoworigin || m->radius < shadowradius) return NULL;
switch(m->type)
{
case SM_SPOT:
if(!e.attached || e.attached->type != ET_SPOTLIGHT || m->spotdir != e.attached->o || m->spotangle != clamp(int(e.attached->attr1), 1, 89))
if(!e.attached || e.attached->type != ET_SPOTLIGHT || m->spotloc != e.attached->o || m->spotangle < clamp(int(e.attached->attr1), 1, 89))
return NULL;
break;
}