calcshadowinfo cleanup
parent
ac52ed9f3e
commit
3b3655bff4
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue