// references them even when on a unix system.
cvar_t csqc_progname = {0, "csqc_progname","csprogs.dat","name of csprogs.dat file to load"}; //[515]: csqc crc check and right csprogs name according to progs.dat
-cvar_t csqc_progcrc = {CVAR_READONLY, "csqc_progcrc","0","CRC of csprogs.dat file to load"};
+cvar_t csqc_progcrc = {CVAR_READONLY, "csqc_progcrc","-1","CRC of csprogs.dat file to load (-1 is none), only used during level changes and then reset to -1"};
cvar_t cl_shownet = {0, "cl_shownet","0","1 = print packet size, 2 = print packet message list"};
cvar_t cl_nolerp = {0, "cl_nolerp", "0","network update smoothing"};
// entire entity array was cleared, so just fill in a few fields
ent->state_current.active = true;
ent->render.model = cl.worldmodel = NULL; // no world model yet
- ent->render.scale = 1; // some of the renderer still relies on scale
ent->render.alpha = 1;
ent->render.colormap = -1; // no special coloring
ent->render.flags = RENDER_SHADOW | RENDER_LIGHT;
Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, 0, 0, 0, 0, 0, 0, 1);
- Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
- CL_BoundingBoxForEntity(&ent->render);
+ CL_UpdateRenderEntity(&ent->render);
// noclip is turned off at start
noclip_anglehack = false;
entity_t *ent;
int i, j;
char name[32];
- vec3_t org;
for (i = 0, ent = cl.entities;i < cl.num_entities;i++, ent++)
{
strlcpy(name, modelname, 25);
for (j = (int)strlen(name);j < 25;j++)
name[j] = ' ';
- Matrix4x4_OriginFromMatrix(&ent->render.matrix, org);
- Con_Printf("%3i: %s:%4i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", i, name, ent->render.frame, (int) org[0], (int) org[1], (int) org[2], (int) ent->render.angles[0] % 360, (int) ent->render.angles[1] % 360, (int) ent->render.angles[2] % 360, ent->render.scale, ent->render.alpha);
+ Con_Printf("%3i: %s:%4i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", i, name, ent->render.frame, (int) ent->state_current.origin[0], (int) ent->state_current.origin[1], (int) ent->state_current.origin[2], (int) ent->state_current.angles[0] % 360, (int) ent->state_current.angles[1] % 360, (int) ent->state_current.angles[2] % 360, ent->render.scale, ent->render.alpha);
}
}
//static const vec3_t nomodelmins = {-16, -16, -16};
//static const vec3_t nomodelmaxs = {16, 16, 16};
-void CL_BoundingBoxForEntity(entity_render_t *ent)
+void CL_UpdateRenderEntity(entity_render_t *ent)
{
vec3_t org;
+ vec_t scale;
model_t *model = ent->model;
+ // update the inverse matrix for the renderer
+ Matrix4x4_Invert_Simple(&ent->inversematrix, &ent->matrix);
+ // update the animation blend state
+ R_LerpAnimation(ent);
+ // we need the matrix origin to center the box
Matrix4x4_OriginFromMatrix(&ent->matrix, org);
+ // update entity->render.scale because the renderer needs it
+ ent->scale = scale = Matrix4x4_ScaleFromMatrix(&ent->matrix);
if (model)
{
// NOTE: this directly extracts vector components from the matrix, which relies on the matrix orientation!
+#ifdef MATRIX4x4_OPENGLORIENTATION
+ if (ent->matrix.m[0][2] != 0 || ent->matrix.m[1][2] != 0)
+#else
if (ent->matrix.m[2][0] != 0 || ent->matrix.m[2][1] != 0)
+#endif
{
// pitch or roll
- ent->mins[0] = org[0] + model->rotatedmins[0];
- ent->mins[1] = org[1] + model->rotatedmins[1];
- ent->mins[2] = org[2] + model->rotatedmins[2];
- ent->maxs[0] = org[0] + model->rotatedmaxs[0];
- ent->maxs[1] = org[1] + model->rotatedmaxs[1];
- ent->maxs[2] = org[2] + model->rotatedmaxs[2];
+ VectorMA(org, scale, model->rotatedmins, ent->mins);
+ VectorMA(org, scale, model->rotatedmaxs, ent->maxs);
}
+#ifdef MATRIX4x4_OPENGLORIENTATION
+ else if (ent->matrix.m[1][0] != 0 || ent->matrix.m[0][1] != 0)
+#else
else if (ent->matrix.m[0][1] != 0 || ent->matrix.m[1][0] != 0)
+#endif
{
// yaw
- ent->mins[0] = org[0] + model->yawmins[0];
- ent->mins[1] = org[1] + model->yawmins[1];
- ent->mins[2] = org[2] + model->yawmins[2];
- ent->maxs[0] = org[0] + model->yawmaxs[0];
- ent->maxs[1] = org[1] + model->yawmaxs[1];
- ent->maxs[2] = org[2] + model->yawmaxs[2];
+ VectorMA(org, scale, model->yawmins, ent->mins);
+ VectorMA(org, scale, model->yawmaxs, ent->maxs);
}
else
{
- ent->mins[0] = org[0] + model->normalmins[0];
- ent->mins[1] = org[1] + model->normalmins[1];
- ent->mins[2] = org[2] + model->normalmins[2];
- ent->maxs[0] = org[0] + model->normalmaxs[0];
- ent->maxs[1] = org[1] + model->normalmaxs[1];
- ent->maxs[2] = org[2] + model->normalmaxs[2];
+ VectorMA(org, scale, model->normalmins, ent->mins);
+ VectorMA(org, scale, model->normalmaxs, ent->maxs);
}
}
else
r_refdef.entities[r_refdef.numentities++] = &ent->render;
ent->render.colormap = -1; // no special coloring
- ent->render.scale = 1;
ent->render.alpha = 1;
VectorSet(ent->render.colormod, 1, 1, 1);
return ent;
// attach the flag to the player matrix
Matrix4x4_CreateFromQuakeEntity(&flagmatrix, -f, -22, 0, 0, 0, -45, 1);
Matrix4x4_Concat(&flag->render.matrix, &player->render.matrix, &flagmatrix);
- Matrix4x4_Invert_Simple(&flag->render.inversematrix, &flag->render.matrix);
- R_LerpAnimation(&flag->render);
- CL_BoundingBoxForEntity(&flag->render);
+ CL_UpdateRenderEntity(&flag->render);
}
#define MAXVIEWMODELS 32
e->render.frame2time = cl.time;
e->render.framelerp = 0;
}
- R_LerpAnimation(&e->render);
// set up the render matrix
// FIXME: e->render.scale should go away
// concat the matrices to make the entity relative to its tag
Matrix4x4_Concat(&e->render.matrix, matrix, &matrix2);
// make the other useful stuff
- Matrix4x4_Invert_Simple(&e->render.inversematrix, &e->render.matrix);
- CL_BoundingBoxForEntity(&e->render);
+ CL_UpdateRenderEntity(&e->render);
// handle effects now that we know where this entity is in the world...
if (e->render.model && e->render.model->soundfromcenter)
cl.brushmodel_entities[cl.num_brushmodel_entities++] = 0;
// FIXME: this should be done at load
ent->render.matrix = identitymatrix;
- ent->render.inversematrix = identitymatrix;
- R_LerpAnimation(&ent->render);
- CL_BoundingBoxForEntity(&ent->render);
+ CL_UpdateRenderEntity(&ent->render);
ent->render.flags = RENDER_SHADOW;
if (!r_fullbright.integer)
ent->render.flags |= RENDER_LIGHT;
VectorSet(ent->render.colormod, 1, 1, 1);
Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, e->origin[0], e->origin[1], e->origin[2], 0, 0, 0, 1);
- Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
- R_LerpAnimation(&ent->render);
- CL_BoundingBoxForEntity(&ent->render);
+ CL_UpdateRenderEntity(&ent->render);
}
}
}
//ent->render.angles[1] = yaw;
//ent->render.angles[2] = rand()%360;
Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, org[0], org[1], org[2], -pitch, yaw, lhrandom(0, 360), 1);
- Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
- R_LerpAnimation(&ent->render);
- CL_BoundingBoxForEntity(&ent->render);
+ CL_UpdateRenderEntity(&ent->render);
VectorMA(org, 30, dist, org);
d -= 30;
}
VectorSet(ent->render.colormod, 1, 1, 1);
Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, v[0], v[1], v[2], v[3], v[4], v[5], 1);
- Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
- R_LerpAnimation(&ent->render);
- CL_BoundingBoxForEntity(&ent->render);
+ CL_UpdateRenderEntity(&ent->render);
}
}
void CSQC_RelinkAllEntities (int drawmask)
{
+ // process network entities (note: this sets up the view!)
+ cl.num_brushmodel_entities = 0;
+ CL_UpdateEntities();
+
+ entitylinkframenumber++;
+ // link stuff
+ CL_RelinkWorld();
+ CL_RelinkStaticEntities();
+ CL_RelinkBeams();
+ CL_RelinkEffects();
+
// link stuff
if (drawmask & ENTMASK_ENGINE)
{
if (drawmask & ENTMASK_ENGINEVIEWMODELS)
CL_LinkNetworkEntity(&cl.viewent); // link gun model
+
+ // update view blend
+ V_CalcViewBlend();
}
/*
CL_MoveParticles();
R_MoveExplosions();
- // process network entities (note: this sets up the view!)
+ // predict current player location
CL_ClientMovement_Replay();
- cl.num_brushmodel_entities = 0;
+
// now that the player entity has been updated we can call V_CalcRefdef
V_CalcRefdef();
- CL_UpdateEntities();
-
- entitylinkframenumber++;
- // link stuff
- CL_RelinkWorld();
- CL_RelinkStaticEntities();
- CL_RelinkBeams();
- CL_RelinkEffects();
if(!csqc_loaded) //[515]: csqc
{
+ // process network entities (note: this sets up the view!)
+ cl.num_brushmodel_entities = 0;
+ CL_UpdateEntities();
+
+ entitylinkframenumber++;
+ // link stuff
+ CL_RelinkWorld();
+ CL_RelinkStaticEntities();
+ CL_RelinkBeams();
+ CL_RelinkEffects();
+
CL_RelinkNetworkEntities();
CL_LinkNetworkEntity(&cl.viewent); // link gun model
CL_RelinkQWNails();
+
+ // update view blend
+ V_CalcViewBlend();
}
else
csqc_frame = true;
- // update view blend
- V_CalcViewBlend();
-
CL_UpdateLights();
CL_StairSmoothing();