]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_alias.c
no more warping meshs of any kind
[xonotic/darkplaces.git] / model_alias.c
index 85c6ddd273e3b530229ae1a5f7e77fe190ae05ff..6247e5b64162b89f3c86b0ecffe6171fbd503812 100644 (file)
@@ -27,11 +27,6 @@ void Mod_AliasInit (void)
        Cvar_RegisterVariable(&r_mipskins);
 }
 
-static void Mod_Alias_SERAddEntity(void)
-{
-       R_Clip_AddBox(currentrenderentity->mins, currentrenderentity->maxs, R_Entity_Callback, currentrenderentity, NULL);
-}
-
 // LordHavoc: proper bounding box considerations
 static float aliasbboxmin[3], aliasbboxmax[3], modelyawradius, modelradius;
 
@@ -95,7 +90,7 @@ static void Mod_ConvertAliasVerts (int inverts, vec3_t scale, vec3_t translate,
                Con_Printf("Mod_ConvertAliasVerts: \"%s\", %i invalid normal indices found\n", loadmodel->name, invalidnormals);
 }
 
-static void Mod_MDL_LoadFrames (long datapointer, int inverts, int outverts, vec3_t scale, vec3_t translate)
+static void Mod_MDL_LoadFrames (qbyte * datapointer, int inverts, int outverts, vec3_t scale, vec3_t translate)
 {
        daliasframetype_t       *pframetype;
        daliasframe_t           *pinframe;
@@ -160,10 +155,10 @@ static void Mod_MDL_LoadFrames (long datapointer, int inverts, int outverts, vec
        }
 }
 
-static rtexture_t *GL_SkinSplitShirt(byte *in, byte *out, int width, int height, int bits, char *name, int precache)
+static rtexture_t *GL_SkinSplitShirt(qbyte *in, qbyte *out, int width, int height, int bits, char *name, int precache)
 {
        int i, pixels, passed;
-       byte pixeltest[16];
+       qbyte pixeltest[16];
        for (i = 0;i < 16;i++)
                pixeltest[i] = (bits & (1 << i)) != 0;
        pixels = width*height;
@@ -190,10 +185,10 @@ static rtexture_t *GL_SkinSplitShirt(byte *in, byte *out, int width, int height,
                return NULL;
 }
 
-static rtexture_t *GL_SkinSplit(byte *in, byte *out, int width, int height, int bits, char *name, int precache)
+static rtexture_t *GL_SkinSplit(qbyte *in, qbyte *out, int width, int height, int bits, char *name, int precache)
 {
        int i, pixels, passed;
-       byte pixeltest[16];
+       qbyte pixeltest[16];
        for (i = 0;i < 16;i++)
                pixeltest[i] = (bits & (1 << i)) != 0;
        pixels = width*height;
@@ -216,7 +211,7 @@ static rtexture_t *GL_SkinSplit(byte *in, byte *out, int width, int height, int
                return NULL;
 }
 
-static void Mod_LoadSkin (char *basename, byte *skindata, byte *skintemp, int width, int height, skinframe_t *skinframe, int precache)
+static void Mod_LoadSkin (char *basename, qbyte *skindata, qbyte *skintemp, int width, int height, skinframe_t *skinframe, int precache)
 {
        skinframe->base   = loadtextureimagewithmask(loadmodel->texturepool, va("%s_normal", basename), 0, 0, false, r_mipskins.integer, precache);
        skinframe->fog    = image_masktex;
@@ -265,13 +260,13 @@ void Mod_LoadAliasModel (model_t *mod, void *buffer)
        daliasframetype_t               *pinframetype;
        daliasgroup_t                   *pinframegroup;
        float                                   scales, scalet, scale[3], translate[3], interval;
-       long                                    datapointer, startframes, startskins;
+       qbyte                                   *datapointer, *startframes, *startskins;
        char                                    name[MAX_QPATH];
-       byte                                    *skintemp = NULL;
+       qbyte                                   *skintemp = NULL;
        modelyawradius = 0;
        modelradius = 0;
 
-       datapointer = (long) buffer;
+       datapointer = buffer;
        pinmodel = (mdl_t *)datapointer;
        datapointer += sizeof(mdl_t);
 
@@ -401,7 +396,7 @@ void Mod_LoadAliasModel (model_t *mod, void *buffer)
                                sprintf (name, "%s_%i_%i", loadmodel->name, i, j);
                        else
                                sprintf (name, "%s_%i", loadmodel->name, i);
-                       Mod_LoadSkin(name, (byte *)datapointer, skintemp, skinwidth, skinheight, loadmodel->skinframes + totalskins, i == 0);
+                       Mod_LoadSkin(name, (qbyte *)datapointer, skintemp, skinwidth, skinheight, loadmodel->skinframes + totalskins, i == 0);
                        datapointer += skinwidth * skinheight;
                        totalskins++;
                }
@@ -484,12 +479,8 @@ void Mod_LoadAliasModel (model_t *mod, void *buffer)
 
        Mod_MDL_LoadFrames (startframes, numverts, totalverts, scale, translate);
 
-       // LordHavoc: fixed model bbox - was //FIXME: do this right
-       //loadmodel->mins[0] = loadmodel->mins[1] = loadmodel->mins[2] = -16;
-       //loadmodel->maxs[0] = loadmodel->maxs[1] = loadmodel->maxs[2] = 16;
        modelyawradius = sqrt(modelyawradius);
        modelradius = sqrt(modelradius);
-//     loadmodel->modelradius = modelradius;
        for (j = 0;j < 3;j++)
        {
                loadmodel->normalmins[j] = aliasbboxmin[j];
@@ -501,7 +492,6 @@ void Mod_LoadAliasModel (model_t *mod, void *buffer)
        loadmodel->yawmins[2] = loadmodel->normalmins[2];
        loadmodel->yawmaxs[2] = loadmodel->normalmaxs[2];
 
-       loadmodel->SERAddEntity = Mod_Alias_SERAddEntity;
        loadmodel->Draw = R_DrawAliasModel;
        loadmodel->DrawSky = NULL;
        loadmodel->DrawShadow = NULL;
@@ -548,7 +538,7 @@ void Mod_LoadQ2AliasModel (model_t *mod, void *buffer)
 {
        int *vertremap;
        md2_t *pinmodel;
-       long base;
+       qbyte *base;
        int version, end;
        int i, j, k, hashindex, num, numxyz, numst, xyz, st;
        float *stverts, s, t;
@@ -559,7 +549,7 @@ void Mod_LoadQ2AliasModel (model_t *mod, void *buffer)
                float st[2];
        }
        *hash, **md2verthash, *md2verthashdata;
-       long datapointer;
+       qbyte *datapointer;
        md2frame_t *pinframe;
        char *inskin;
        md2triangle_t *intri;
@@ -567,7 +557,7 @@ void Mod_LoadQ2AliasModel (model_t *mod, void *buffer)
        int skinwidth, skinheight;
 
        pinmodel = buffer;
-       base = (long) buffer;
+       base = buffer;
 
        version = LittleLong (pinmodel->version);
        if (version != MD2ALIAS_VERSION)
@@ -576,7 +566,6 @@ void Mod_LoadQ2AliasModel (model_t *mod, void *buffer)
 
        loadmodel->type = mod_alias;
        loadmodel->aliastype = ALIASTYPE_MDLMD2;
-       loadmodel->SERAddEntity = Mod_Alias_SERAddEntity;
        loadmodel->Draw = R_DrawAliasModel;
        loadmodel->DrawSky = NULL;
        loadmodel->DrawShadow = NULL;
@@ -749,7 +738,6 @@ void Mod_LoadQ2AliasModel (model_t *mod, void *buffer)
        // LordHavoc: model bbox
        modelyawradius = sqrt(modelyawradius);
        modelradius = sqrt(modelradius);
-//     loadmodel->modelradius = modelradius;
        for (j = 0;j < 3;j++)
        {
                loadmodel->normalmins[j] = aliasbboxmin[j];
@@ -774,7 +762,7 @@ static void zymswapintblock(int *m, int size)
 
 void Mod_LoadZymoticModel(model_t *mod, void *buffer)
 {
-       int i, pbase, *bonecount;
+       int i, pbase, *bonecount, numposes;
        unsigned int count, a, b, c, *renderlist, *renderlistend;
        rtexture_t **texture;
        char *shadername;
@@ -845,6 +833,7 @@ void Mod_LoadZymoticModel(model_t *mod, void *buffer)
        loadmodel->skinframes->glow = NULL;
        loadmodel->skinframes->merged = NULL;
        loadmodel->numskins = 1;
+       numposes = pheader->lump_poses.length / sizeof(float[3][4]) / pheader->numbones;
 
        // go through the lumps, swapping things
 
@@ -867,6 +856,12 @@ void Mod_LoadZymoticModel(model_t *mod, void *buffer)
                loadmodel->animscenes[i].framerate = scene->framerate;
                loadmodel->animscenes[i].loop = (scene->flags & ZYMSCENEFLAG_NOLOOP) == 0;
 
+               if ((unsigned int) loadmodel->animscenes[i].firstframe >= numposes)
+                       Host_Error("Mod_LoadZymoticModel: scene firstframe (%i) >= numposes (%i)\n", loadmodel->animscenes[i].firstframe, numposes);
+               if ((unsigned int) loadmodel->animscenes[i].firstframe + (unsigned int) loadmodel->animscenes[i].framecount > numposes)
+                       Host_Error("Mod_LoadZymoticModel: scene firstframe (%i) + framecount (%i) >= numposes (%i)\n", loadmodel->animscenes[i].firstframe, loadmodel->animscenes[i].framecount, numposes);
+               if (loadmodel->animscenes[i].framerate < 0)
+                       Host_Error("Mod_LoadZymoticModel: scene framerate (%f) < 0\n", loadmodel->animscenes[i].framerate);
                scene++;
        }
 
@@ -900,7 +895,7 @@ void Mod_LoadZymoticModel(model_t *mod, void *buffer)
        zymswapintblock((void *) (pheader->lump_render.start + pbase), pheader->lump_render.length);
        // validate renderlist and swap winding order of tris
        renderlist = (void *) (pheader->lump_render.start + pbase);
-       renderlistend = (void *) ((byte *) renderlist + pheader->lump_render.length);
+       renderlistend = (void *) ((qbyte *) renderlist + pheader->lump_render.length);
        i = pheader->numshaders * sizeof(int) + pheader->numtris * sizeof(int[3]);
        if (pheader->lump_render.length != i)
                Host_Error("Mod_LoadZymoticModel: renderlist is wrong size in %s (is %i bytes, should be %i bytes)\n", loadmodel->name, pheader->lump_render.length, i);
@@ -941,7 +936,6 @@ void Mod_LoadZymoticModel(model_t *mod, void *buffer)
 
        // model bbox
        modelradius = pheader->radius;
-//     loadmodel->modelradius = pheader->radius;
        for (i = 0;i < 3;i++)
        {
                loadmodel->normalmins[i] = pheader->mins[i];
@@ -958,8 +952,8 @@ void Mod_LoadZymoticModel(model_t *mod, void *buffer)
        loadmodel->yawmins[2] = loadmodel->normalmins[2];
        loadmodel->yawmaxs[2] = loadmodel->normalmaxs[2];
 
-       loadmodel->SERAddEntity = Mod_Alias_SERAddEntity;
        loadmodel->Draw = R_DrawAliasModel;
        loadmodel->DrawSky = NULL;
        loadmodel->DrawShadow = NULL;
 }
+