// 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;
// stop sounds (especially looping!)
S_StopAllSounds ();
+ cl.parsingtextexpectingpingforscores = 0; // just in case no reply has come yet
+
// clear contents blends
cl.cshifts[0].percent = 0;
cl.cshifts[1].percent = 0;
strlcpy(name, modelname, 25);
for (j = (int)strlen(name);j < 25;j++)
name[j] = ' ';
- Con_Printf("%3i: %s:%4i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", i, name, ent->render.frame, (int) ent->render.matrix.m[0][3], (int) ent->render.matrix.m[1][3], (int) ent->render.matrix.m[2][3], (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)
{
- //if (ent->angles[0] || ent->angles[2])
+ // 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] = ent->matrix.m[0][3] + model->rotatedmins[0];
- ent->mins[1] = ent->matrix.m[1][3] + model->rotatedmins[1];
- ent->mins[2] = ent->matrix.m[2][3] + model->rotatedmins[2];
- ent->maxs[0] = ent->matrix.m[0][3] + model->rotatedmaxs[0];
- ent->maxs[1] = ent->matrix.m[1][3] + model->rotatedmaxs[1];
- ent->maxs[2] = ent->matrix.m[2][3] + model->rotatedmaxs[2];
- //VectorAdd(ent->origin, model->rotatedmins, ent->mins);
- //VectorAdd(ent->origin, model->rotatedmaxs, ent->maxs);
+ VectorMA(org, scale, model->rotatedmins, ent->mins);
+ VectorMA(org, scale, model->rotatedmaxs, ent->maxs);
}
- //else if (ent->angles[1])
+#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] = ent->matrix.m[0][3] + model->yawmins[0];
- ent->mins[1] = ent->matrix.m[1][3] + model->yawmins[1];
- ent->mins[2] = ent->matrix.m[2][3] + model->yawmins[2];
- ent->maxs[0] = ent->matrix.m[0][3] + model->yawmaxs[0];
- ent->maxs[1] = ent->matrix.m[1][3] + model->yawmaxs[1];
- ent->maxs[2] = ent->matrix.m[2][3] + model->yawmaxs[2];
- //VectorAdd(ent->origin, model->yawmins, ent->mins);
- //VectorAdd(ent->origin, model->yawmaxs, ent->maxs);
+ VectorMA(org, scale, model->yawmins, ent->mins);
+ VectorMA(org, scale, model->yawmaxs, ent->maxs);
}
else
{
- ent->mins[0] = ent->matrix.m[0][3] + model->normalmins[0];
- ent->mins[1] = ent->matrix.m[1][3] + model->normalmins[1];
- ent->mins[2] = ent->matrix.m[2][3] + model->normalmins[2];
- ent->maxs[0] = ent->matrix.m[0][3] + model->normalmaxs[0];
- ent->maxs[1] = ent->matrix.m[1][3] + model->normalmaxs[1];
- ent->maxs[2] = ent->matrix.m[2][3] + model->normalmaxs[2];
- //VectorAdd(ent->origin, model->normalmins, ent->mins);
- //VectorAdd(ent->origin, model->normalmaxs, ent->maxs);
+ VectorMA(org, scale, model->normalmins, ent->mins);
+ VectorMA(org, scale, model->normalmaxs, ent->maxs);
}
}
else
{
- ent->mins[0] = ent->matrix.m[0][3] - 16;
- ent->mins[1] = ent->matrix.m[1][3] - 16;
- ent->mins[2] = ent->matrix.m[2][3] - 16;
- ent->maxs[0] = ent->matrix.m[0][3] + 16;
- ent->maxs[1] = ent->matrix.m[1][3] + 16;
- ent->maxs[2] = ent->matrix.m[2][3] + 16;
- //VectorAdd(ent->origin, nomodelmins, ent->mins);
- //VectorAdd(ent->origin, nomodelmaxs, ent->maxs);
+ ent->mins[0] = org[0] - 16;
+ ent->mins[1] = org[1] - 16;
+ ent->mins[2] = org[2] - 16;
+ ent->maxs[0] = org[0] + 16;
+ ent->maxs[1] = org[1] + 16;
+ ent->maxs[2] = org[2] + 16;
}
}
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;
memset (dl, 0, sizeof(*dl));
Matrix4x4_Normalize(&dl->matrix, matrix);
dl->ent = ent;
- dl->origin[0] = dl->matrix.m[0][3];
- dl->origin[1] = dl->matrix.m[1][3];
- dl->origin[2] = dl->matrix.m[2][3];
+ Matrix4x4_OriginFromMatrix(&dl->matrix, dl->origin);
CL_FindNonSolidLocation(dl->origin, dl->origin, 6);
- dl->matrix.m[0][3] = dl->origin[0];
- dl->matrix.m[1][3] = dl->origin[1];
- dl->matrix.m[2][3] = dl->origin[2];
+ Matrix4x4_SetOrigin(&dl->matrix, dl->origin[0], dl->origin[1], dl->origin[2]);
dl->radius = radius;
dl->color[0] = red;
dl->color[1] = green;
// 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)
Matrix4x4_Transform(&e->render.matrix, o, origin);
}
else
- {
- origin[0] = e->render.matrix.m[0][3];
- origin[1] = e->render.matrix.m[1][3];
- origin[2] = e->render.matrix.m[2][3];
- }
+ Matrix4x4_OriginFromMatrix(&e->render.matrix, origin);
trailtype = EFFECT_NONE;
dlightradius = 0;
dlightcolor[0] = 0;
Matrix4x4_Transform(&e->render.matrix, muzzleflashorigin, v2);
trace = CL_TraceBox(origin, vec3_origin, vec3_origin, v2, true, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, false);
tempmatrix = e->render.matrix;
- tempmatrix.m[0][3] = trace.endpos[0];
- tempmatrix.m[1][3] = trace.endpos[1];
- tempmatrix.m[2][3] = trace.endpos[2];
+ Matrix4x4_SetOrigin(&tempmatrix, trace.endpos[0], trace.endpos[1], trace.endpos[2]);
CL_AllocDlight(NULL, &tempmatrix, 100, e->persistent.muzzleflash, e->persistent.muzzleflash, e->persistent.muzzleflash, 0, 0, 0, -1, true, 0, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
e->persistent.muzzleflash -= (cl.time - cl.oldtime) * 10;
}
//dlightmatrix = e->render.matrix;
// hack to make glowing player light shine on their gun
//if (e->state_current.number == cl.viewentity/* && !chase_active.integer*/)
- // dlightmatrix.m[2][3] += 30;
+ // Matrix4x4_AdjustOrigin(&dlightmatrix, 0, 0, 30);
CL_AllocDlight(&e->render, &e->render.matrix, dlightradius, dlightcolor[0], dlightcolor[1], dlightcolor[2], 0, 0, 0, -1, true, 1, 0.25, 0.25, 1, 1, LIGHTFLAG_NORMALMODE | LIGHTFLAG_REALTIMEMODE);
}
// custom rtlight
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();
//
// register our commands
//
- Cvar_RegisterVariable (&csqc_progname);
- Cvar_RegisterVariable (&csqc_progcrc);
-
Cvar_RegisterVariable (&cl_upspeed);
Cvar_RegisterVariable (&cl_forwardspeed);
Cvar_RegisterVariable (&cl_backspeed);