{
int vert[2];
float mindist, maxdist;
- };
+ };
struct rotlimit
{
{
setupjoints();
setuprotfrictions();
-
+
loaded = true;
- }
+ }
void addreljoint(int bone, int parent)
{
radius(0),
timestep(0),
scale(scale),
- verts(new vert[skel->verts.length()]),
+ verts(new vert[skel->verts.length()]),
tris(new matrix3[skel->tris.length()]),
animjoints(!skel->animjoints || skel->joints.empty() ? NULL : new matrix4x3[skel->joints.length()]),
reljoints(skel->reljoints.empty() ? NULL : new dualquat[skel->reljoints.length()])
};
/*
- seed particle position = avg(modelview * base2anim * spherepos)
- mapped transform = invert(curtri) * origtrig
+ seed particle position = avg(modelview * base2anim * spherepos)
+ mapped transform = invert(curtri) * origtrig
parented transform = parent{invert(curtri) * origtrig} * (invert(parent{base2anim}) * base2anim)
*/
v2c.newpos.add(vec().cross(c2, q2c).madd(q2c, s2).add(v2c.pos));
v2c.weight++;
}
-
+
void ragdolldata::constrainrot()
{
loopv(skel->rotlimits)
float angle;
if(!rot.calcangleaxis(angle, axis)) continue;
angle = r.maxangle - fabs(angle);
- if(angle >= 0) continue;
+ if(angle >= 0) continue;
angle += 1e-3f;
applyrotlimit(skel->tris[r.tri[0]], skel->tris[r.tri[1]], angle, axis);
if(!water) game::physicstrigger(pl, true, 0, 1, pl->inwater);
}
pl->inwater = water ? material&MATF_VOLUME : MAT_AIR;
-
- calcrotfriction();
+
+ calcrotfriction();
float tsfric = timestep ? ts/timestep : 1,
airfric = ragdollairfric + min((ragdollbodyfricscale*collisions)/skel->verts.length(), 1.0f)*(ragdollbodyfric - ragdollairfric);
collisions = 0;
v.pos = v.oldpos;
v.oldpos.sub(dir.reflect(collidewall));
collisions++;
- }
+ }
}
if(unsticks && ragdollunstick) tryunstick(ts*ragdollunstick);
-
+
timestep = ts;
if(collisions)
{
constrain();
calctris();
calcboundsphere();
-}
+}
FVAR(ragdolleyesmooth, 0, 0.5f, 1);
VAR(ragdolleyesmoothmillis, 1, 250, 10000);
{
DELETEP(d->ragdoll);
}
-
shadowmapping = false;
shadowmapmaxz = min(shadowmapmaxz, shadowfocus.z);
- if(shadowmapcasters && smdepthpeel)
+ if(shadowmapcasters && smdepthpeel)
{
int sx, sy, sw, sh;
bool scissoring = rtscissor && scissorblur(sx, sy, sw, sh) && sw > 0 && sh > 0;
float skew = va->size/2*SHADOWSKEW;
if(!shadowmap || !shadowmaptex ||
va->o.z + va->size <= shadowfocus.z - shadowmapdist || va->o.z >= shadowmapmaxz ||
- va->o.x + va->size <= cx - shadowmapradius-skew || va->o.x >= cx + shadowmapradius+skew ||
- va->o.y + va->size <= cy - shadowmapradius-skew || va->o.y >= cy + shadowmapradius+skew)
+ va->o.x + va->size <= cx - shadowmapradius-skew || va->o.x >= cx + shadowmapradius+skew ||
+ va->o.y + va->size <= cy - shadowmapradius-skew || va->o.y >= cy + shadowmapradius+skew)
return false;
return true;
#endif
g = max(25.0f, 0.4f*ambientcolor[1] + 0.6f*max(ambientcolor[1], skylightcolor[1]));
b = max(25.0f, 0.4f*ambientcolor[2] + 0.6f*max(ambientcolor[2], skylightcolor[2]));
}
- else
+ else
{
r = max(25.0f, 2.0f*ambientcolor[0]);
g = max(25.0f, 2.0f*ambientcolor[1]);
b = max(25.0f, 2.0f*ambientcolor[2]);
}
- }
+ }
else { r = shadowmapambientcolor[0]; g = shadowmapambientcolor[1]; b = shadowmapambientcolor[2]; }
GLOBALPARAMF(shadowmapambient, r/255.0f, g/255.0f, b/255.0f);
}