]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
updated Dev-C++ project file from Spirit
[xonotic/darkplaces.git] / cl_main.c
index f4f09c34cfe133527a437d3ec54e66ac8e1f5d2b..50c185d634ced44d80bda2ed3262be7f66e7a3e7 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -31,7 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // 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"};
@@ -188,13 +188,11 @@ void CL_ClearState(void)
        // 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;
@@ -456,65 +454,62 @@ static void CL_PrintEntities_f(void)
                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;
        }
 }
 
@@ -566,7 +561,6 @@ entity_t *CL_NewTempEntity(void)
        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;
@@ -634,13 +628,9 @@ dlightsetup:
        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;
@@ -777,9 +767,7 @@ void CL_AddQWCTFFlagModel(entity_t *player, int skin)
        // 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
@@ -996,7 +984,6 @@ void CL_UpdateNetworkEntity(entity_t *e)
                        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
@@ -1004,8 +991,7 @@ void CL_UpdateNetworkEntity(entity_t *e)
                // 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)
@@ -1016,11 +1002,7 @@ void CL_UpdateNetworkEntity(entity_t *e)
                        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;
@@ -1083,9 +1065,7 @@ void CL_UpdateNetworkEntity(entity_t *e)
                        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;
                }
@@ -1124,7 +1104,7 @@ void CL_UpdateNetworkEntity(entity_t *e)
                        //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
@@ -1294,9 +1274,7 @@ void CL_RelinkWorld(void)
        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;
@@ -1403,9 +1381,7 @@ static void CL_RelinkEffects(void)
                                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);
                        }
                }
        }
@@ -1517,9 +1493,7 @@ void CL_RelinkBeams(void)
                        //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;
                }
@@ -1551,9 +1525,7 @@ static void CL_RelinkQWNails(void)
                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);
        }
 }
 
@@ -1572,6 +1544,17 @@ void CL_LerpPlayer(float frac)
 
 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)
        {
@@ -1581,6 +1564,9 @@ void CSQC_RelinkAllEntities (int drawmask)
 
        if (drawmask & ENTMASK_ENGINEVIEWMODELS)
                CL_LinkNetworkEntity(&cl.viewent); // link gun model
+
+       // update view blend
+       V_CalcViewBlend();
 }
 
 /*
@@ -1616,32 +1602,35 @@ int CL_ReadFromServer(void)
                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();
 
@@ -1742,9 +1731,6 @@ void CL_Init (void)
 //
 // register our commands
 //
-       Cvar_RegisterVariable (&csqc_progname);
-       Cvar_RegisterVariable (&csqc_progcrc);
-
        Cvar_RegisterVariable (&cl_upspeed);
        Cvar_RegisterVariable (&cl_forwardspeed);
        Cvar_RegisterVariable (&cl_backspeed);