Minor improvements to make it more robust.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3439 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2009-11-13 00:16:34 +00:00
parent 67e90812c2
commit 9f05a93a07
2 changed files with 39 additions and 12 deletions

View file

@ -1331,6 +1331,7 @@ void World_Physics_RemoveFromEntity(world_t *world, wedict_t *ed)
static void World_Physics_Frame_BodyToEntity(world_t *world, wedict_t *ed) static void World_Physics_Frame_BodyToEntity(world_t *world, wedict_t *ed)
{ {
model_t *model;
const dReal *avel; const dReal *avel;
const dReal *o; const dReal *o;
const dReal *r; // for some reason dBodyGetRotation returns a [3][4] matrix const dReal *r; // for some reason dBodyGetRotation returns a [3][4] matrix
@ -1387,14 +1388,25 @@ static void World_Physics_Frame_BodyToEntity(world_t *world, wedict_t *ed)
VectorCopy(vel, velocity); VectorCopy(vel, velocity);
VectorCopy(avel, spinvelocity); VectorCopy(avel, spinvelocity);
Matrix4Q_FromVectors(bodymatrix, forward, left, up, origin); Matrix4Q_FromVectors(bodymatrix, forward, left, up, origin);
Matrix4_Multiply(bodymatrix, ed->ode.ode_offsetimatrix, entitymatrix); Matrix4_Multiply(ed->ode.ode_offsetimatrix, bodymatrix, entitymatrix);
Matrix4Q_ToVectors(entitymatrix, forward, left, up, origin); Matrix4Q_ToVectors(entitymatrix, forward, left, up, origin);
VectorAngles(forward, up, angles); VectorAngles(forward, up, angles);
angles[0]*=-1;
avelocity[PITCH] = RAD2DEG(spinvelocity[PITCH]); avelocity[PITCH] = RAD2DEG(spinvelocity[PITCH]);
avelocity[YAW] = RAD2DEG(spinvelocity[ROLL]); avelocity[YAW] = RAD2DEG(spinvelocity[ROLL]);
avelocity[ROLL] = RAD2DEG(spinvelocity[YAW]); avelocity[ROLL] = RAD2DEG(spinvelocity[YAW]);
if (ed->v->modelindex)
{
model = world->GetCModel(world, ed->v->modelindex);
if (!model || model->type == mod_alias)
{
angles[PITCH] *= -1;
avelocity[PITCH] *= -1;
}
}
VectorCopy(origin, ed->v->origin); VectorCopy(origin, ed->v->origin);
VectorCopy(velocity, ed->v->velocity); VectorCopy(velocity, ed->v->velocity);
//vVectorCopy(forward, ed->xv->axis_forward); //vVectorCopy(forward, ed->xv->axis_forward);
@ -1612,6 +1624,9 @@ static qboolean GenerateCollisionMesh(world_t *world, model_t *mod, wedict_t *ed
for (sno = 0; sno < mod->nummodelsurfaces; sno++) for (sno = 0; sno < mod->nummodelsurfaces; sno++)
{ {
surf = &mod->surfaces[sno+mod->firstmodelsurface]; surf = &mod->surfaces[sno+mod->firstmodelsurface];
if (surf->flags & SURF_DRAWSKY|SURF_DRAWTURB)
continue;
if (surf->mesh) if (surf->mesh)
{ {
mesh = surf->mesh; mesh = surf->mesh;
@ -1636,6 +1651,9 @@ static qboolean GenerateCollisionMesh(world_t *world, model_t *mod, wedict_t *ed
for (sno = 0; sno < mod->nummodelsurfaces; sno++) for (sno = 0; sno < mod->nummodelsurfaces; sno++)
{ {
surf = &mod->surfaces[sno+mod->firstmodelsurface]; surf = &mod->surfaces[sno+mod->firstmodelsurface];
if (surf->flags & SURF_DRAWSKY|SURF_DRAWTURB)
continue;
if (surf->mesh) if (surf->mesh)
{ {
mesh = surf->mesh; mesh = surf->mesh;
@ -1913,7 +1931,6 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, wedict_t *ed)
//val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_up);if (val) VectorCopy(val->vector, up); //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_up);if (val) VectorCopy(val->vector, up);
//val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.spinvelocity);if (val) VectorCopy(val->vector, spinvelocity); //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.spinvelocity);if (val) VectorCopy(val->vector, spinvelocity);
VectorCopy(ed->v->angles, angles); VectorCopy(ed->v->angles, angles);
angles[0] = 0;
VectorCopy(ed->v->avelocity, avelocity); VectorCopy(ed->v->avelocity, avelocity);
if (ed == world->edicts || (ed->xv->gravity && ed->xv->gravity <= 0.01)) if (ed == world->edicts || (ed->xv->gravity && ed->xv->gravity <= 0.01))
gravity = false; gravity = false;
@ -1921,10 +1938,19 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, wedict_t *ed)
// compatibility for legacy entities // compatibility for legacy entities
//if (!VectorLength2(forward) || solid == SOLID_BSP) //if (!VectorLength2(forward) || solid == SOLID_BSP)
{ {
float pitchsign = 1;
vec3_t qangles, qavelocity; vec3_t qangles, qavelocity;
VectorCopy(angles, qangles); VectorCopy(angles, qangles);
VectorCopy(avelocity, qavelocity); VectorCopy(avelocity, qavelocity);
if (ed->v->modelindex)
{
model = world->GetCModel(world, ed->v->modelindex);
if (!model || model->type == mod_alias)
{
qangles[PITCH] *= -1;
qavelocity[PITCH] *= -1;
}
}
AngleVectorsFLU(qangles, forward, left, up); AngleVectorsFLU(qangles, forward, left, up);
// convert single-axis rotations in avelocity to spinvelocity // convert single-axis rotations in avelocity to spinvelocity
@ -2013,7 +2039,7 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, wedict_t *ed)
ed->ode.ode_gravity = gravity; ed->ode.ode_gravity = gravity;
Matrix4Q_FromVectors(entitymatrix, forward, left, up, origin); Matrix4Q_FromVectors(entitymatrix, forward, left, up, origin);
Matrix4_Multiply(entitymatrix, ed->ode.ode_offsetmatrix, bodymatrix); Matrix4_Multiply(ed->ode.ode_offsetmatrix, entitymatrix, bodymatrix);
Matrix4Q_ToVectors(bodymatrix, forward, left, up, origin); Matrix4Q_ToVectors(bodymatrix, forward, left, up, origin);
r[0][0] = forward[0]; r[0][0] = forward[0];
r[1][0] = forward[1]; r[1][0] = forward[1];
@ -2166,7 +2192,7 @@ static void VARGS nearCallback (void *data, dGeomID o1, dGeomID o2)
bouncestop2 = ed2->xv->bouncestop; bouncestop2 = ed2->xv->bouncestop;
} }
if (ed1->v->owner == ed2->entnum || ed2->v->owner == ed1->entnum) if ((ed2->entnum&&ed1->v->owner == ed2->entnum) || (ed1->entnum&&ed2->v->owner == ed1->entnum))
return; return;
// merge bounce factors and bounce stop // merge bounce factors and bounce stop
@ -2208,6 +2234,7 @@ static void VARGS nearCallback (void *data, dGeomID o1, dGeomID o2)
void World_Physics_Frame(world_t *world, double frametime, double gravity) void World_Physics_Frame(world_t *world, double frametime, double gravity)
{ {
SCR_CenterPrint(0, va("ft: %f\n", frametime), true);
if (world->ode.ode) if (world->ode.ode)
{ {
int i; int i;

View file

@ -1449,15 +1449,15 @@ void Matrix4Q_Invert_Simple (const float *in1, float *out)
#ifdef MATRIX4x4_OPENGLORIENTATION #ifdef MATRIX4x4_OPENGLORIENTATION
// invert the translate // invert the translate
out->m[3][0] = -(in1->m[3][0] * out->m[0][0] + in1->m[3][1] * out->m[1][0] + in1->m[3][2] * out->m[2][0]); out->m[12] = -(in1[12] * out[0] + in1[13] * out[4] + in1[14] * out[8]);
out->m[3][1] = -(in1->m[3][0] * out->m[0][1] + in1->m[3][1] * out->m[1][1] + in1->m[3][2] * out->m[2][1]); out->m[13] = -(in1[12] * out[1] + in1[13] * out[5] + in1[14] * out[9]);
out->m[3][2] = -(in1->m[3][0] * out->m[0][2] + in1->m[3][1] * out->m[1][2] + in1->m[3][2] * out->m[2][2]); out->m[14] = -(in1[12] * out[2] + in1[13] * out[6] + in1[14] * out[10]);
// don't know if there's anything worth doing here // don't know if there's anything worth doing here
out->m[0][3] = 0; out[3] = 0;
out->m[1][3] = 0; out[7] = 0;
out->m[2][3] = 0; out[11] = 0;
out->m[3][3] = 1; out[15] = 1;
#else #else
// invert the translate // invert the translate
out[3] = -(in1[3] * out[0] + in1[7] * out[1] + in1[11] * out[2]); out[3] = -(in1[3] * out[0] + in1[7] * out[1] + in1[11] * out[2]);