- Host_Error ("%s has invalid number of skins: %i", mod->name, LittleLong(pinmodel->num_skins));
-
- pheader->framesize = framesize;
- pheader->num_skins = LittleLong(pinmodel->num_skins);
- pheader->num_xyz = LittleLong(pinmodel->num_xyz);
- pheader->num_st = LittleLong(pinmodel->num_st);
- pheader->num_tris = LittleLong(pinmodel->num_tris);
- pheader->num_frames = LittleLong(pinmodel->num_frames);
- pheader->num_glcmds = LittleLong(pinmodel->num_glcmds);
-
-// load the skins
- if (pheader->num_skins)
- {
- rtexture_t **skin;
- int *skinrange;
- skinrange = loadmodel->skinanimrange;
- skin = loadmodel->skinanim;
-// skinrange = Hunk_AllocName (sizeof(int) * (pheader->num_skins * 2), loadname);
-// skin = skinrange + pheader->num_skins * 2;
-// loadmodel->skinanimrange = (int) skinrange - (int) pheader;
-// loadmodel->skinanim = (int) skin - (int) pheader;
- pinskins = (void*)((int) pinmodel + LittleLong(pinmodel->ofs_skins));
- for (i = 0;i < pheader->num_skins;i++)
+ Host_Error ("%s has invalid number of skins: %i", loadmodel->name, LittleLong(pinmodel->num_skins));
+
+ end = LittleLong(pinmodel->ofs_end);
+ if (LittleLong(pinmodel->num_skins) >= 1 && (LittleLong(pinmodel->ofs_skins <= 0) || LittleLong(pinmodel->ofs_skins) >= end))
+ Host_Error ("%s is not a valid model", loadmodel->name);
+ if (LittleLong(pinmodel->ofs_st <= 0) || LittleLong(pinmodel->ofs_st) >= end)
+ Host_Error ("%s is not a valid model", loadmodel->name);
+ if (LittleLong(pinmodel->ofs_tris <= 0) || LittleLong(pinmodel->ofs_tris) >= end)
+ Host_Error ("%s is not a valid model", loadmodel->name);
+ if (LittleLong(pinmodel->ofs_frames <= 0) || LittleLong(pinmodel->ofs_frames) >= end)
+ Host_Error ("%s is not a valid model", loadmodel->name);
+ if (LittleLong(pinmodel->ofs_glcmds <= 0) || LittleLong(pinmodel->ofs_glcmds) >= end)
+ Host_Error ("%s is not a valid model", loadmodel->name);
+
+ loadmodel->numskins = LittleLong(pinmodel->num_skins);
+ numxyz = LittleLong(pinmodel->num_xyz);
+ numst = LittleLong(pinmodel->num_st);
+ loadmodel->numtris = LittleLong(pinmodel->num_tris);
+ loadmodel->numframes = LittleLong(pinmodel->num_frames);
+
+ loadmodel->flags = 0; // there are no MD2 flags
+ loadmodel->synctype = ST_RAND;
+
+ // load the skins
+ inskin = (void*)(base + LittleLong(pinmodel->ofs_skins));
+ if (loadmodel->numskins)
+ {
+ loadmodel->skinscenes = Mem_Alloc(loadmodel->mempool, sizeof(animscene_t) * loadmodel->numskins);
+ loadmodel->skinframes = Mem_Alloc(loadmodel->mempool, sizeof(skinframe_t) * loadmodel->numskins);
+ for (i = 0;i < loadmodel->numskins;i++)
+ {
+ loadmodel->skinscenes[i].firstframe = i;
+ loadmodel->skinscenes[i].framecount = 1;
+ loadmodel->skinscenes[i].loop = true;
+ loadmodel->skinscenes[i].framerate = 10;
+ loadmodel->skinframes[i].base = loadtextureimagewithmask (loadmodel->texturepool, inskin, 0, 0, true, r_mipskins.integer, true);
+ loadmodel->skinframes[i].fog = image_masktex;
+ loadmodel->skinframes[i].pants = NULL;
+ loadmodel->skinframes[i].shirt = NULL;
+ loadmodel->skinframes[i].glow = NULL;
+ loadmodel->skinframes[i].merged = NULL;
+ inskin += MD2MAX_SKINNAME;
+ }
+ }
+
+ // load the triangles and stvert data
+ inst = (void*)(base + LittleLong(pinmodel->ofs_st));
+ intri = (void*)(base + LittleLong(pinmodel->ofs_tris));
+ skinwidth = LittleLong(pinmodel->skinwidth);
+ skinheight = LittleLong(pinmodel->skinheight);
+
+ stverts = Mem_Alloc(tempmempool, numst * sizeof(float[2]));
+ s = 1.0f / skinwidth;
+ t = 1.0f / skinheight;
+ for (i = 0;i < numst;i++)
+ {
+ j = (unsigned short) LittleShort(inst[i*2+0]);
+ k = (unsigned short) LittleShort(inst[i*2+1]);
+ if (j >= skinwidth || k >= skinheight)