- mod->name, version, MD2ALIAS_VERSION);
-
- mod->type = mod_alias;
- mod->aliastype = ALIASTYPE_MD2;
-
- framesize = sizeof(md2framesize_t) + LittleLong(pinmodel->num_xyz) * sizeof(trivertx_t);
- // LordHavoc: calculate size for in memory version
- size = sizeof(md2mem_t)
- + LittleLong(pinmodel->num_st) * sizeof(md2stvert_t)
- + LittleLong(pinmodel->num_tris) * sizeof(md2triangle_t)
- + LittleLong(pinmodel->num_frames) * framesize
- + LittleLong(pinmodel->num_glcmds) * sizeof(int);
- if (size <= 0 || size >= MD2MAX_SIZE)
- Host_Error ("%s is not a valid model", mod->name);
- pheader = Hunk_AllocName (size, va("%s Quake2 model", loadname));
-
- mod->flags = 0; // there are no MD2 flags
- mod->numframes = LittleLong(pinmodel->num_frames);
- mod->synctype = ST_RAND;
- mod->numtris = LittleLong(pinmodel->num_tris); // LordHavoc: to simplify renderer decisions
-
- if (LittleLong(pinmodel->num_skins) >= 1 && (LittleLong(pinmodel->ofs_skins <= 0) || LittleLong(pinmodel->ofs_skins) >= LittleLong(pinmodel->ofs_end)))
- Host_Error ("%s is not a valid model", mod->name);
- if (LittleLong(pinmodel->ofs_st <= 0) || LittleLong(pinmodel->ofs_st) >= LittleLong(pinmodel->ofs_end))
- Host_Error ("%s is not a valid model", mod->name);
- if (LittleLong(pinmodel->ofs_tris <= 0) || LittleLong(pinmodel->ofs_tris) >= LittleLong(pinmodel->ofs_end))
- Host_Error ("%s is not a valid model", mod->name);
- if (LittleLong(pinmodel->ofs_frames <= 0) || LittleLong(pinmodel->ofs_frames) >= LittleLong(pinmodel->ofs_end))
- Host_Error ("%s is not a valid model", mod->name);
- if (LittleLong(pinmodel->ofs_glcmds <= 0) || LittleLong(pinmodel->ofs_glcmds) >= LittleLong(pinmodel->ofs_end))
- Host_Error ("%s is not a valid model", mod->name);
-
- if (LittleLong(pinmodel->num_tris < 1) || LittleLong(pinmodel->num_tris) > MD2MAX_TRIANGLES)
- Host_Error ("%s has invalid number of triangles: %i", mod->name, LittleLong(pinmodel->num_tris));
- if (LittleLong(pinmodel->num_xyz < 1) || LittleLong(pinmodel->num_xyz) > MD2MAX_VERTS)
- Host_Error ("%s has invalid number of vertices: %i", mod->name, LittleLong(pinmodel->num_xyz));
- if (LittleLong(pinmodel->num_frames < 1) || LittleLong(pinmodel->num_frames) > MD2MAX_FRAMES)
- Host_Error ("%s has invalid number of frames: %i", mod->name, LittleLong(pinmodel->num_frames));
- if (LittleLong(pinmodel->num_skins < 0) || LittleLong(pinmodel->num_skins) > MAX_SKINS)
- 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)
+ loadmodel->name, version, MD2ALIAS_VERSION);
+
+ loadmodel->type = mod_alias;
+ loadmodel->DrawSky = NULL;
+ loadmodel->Draw = R_Model_Alias_Draw;
+ loadmodel->DrawShadowVolume = R_Model_Alias_DrawShadowVolume;
+ loadmodel->DrawLight = R_Model_Alias_DrawLight;
+ loadmodel->TraceBox = Mod_MDLMD2MD3_TraceBox;
+
+ if (LittleLong(pinmodel->num_tris) < 1 || LittleLong(pinmodel->num_tris) > 65536)
+ Host_Error ("%s has invalid number of triangles: %i", loadmodel->name, LittleLong(pinmodel->num_tris));
+ if (LittleLong(pinmodel->num_xyz) < 1 || LittleLong(pinmodel->num_xyz) > 65536)
+ Host_Error ("%s has invalid number of vertices: %i", loadmodel->name, LittleLong(pinmodel->num_xyz));
+ if (LittleLong(pinmodel->num_frames) < 1 || LittleLong(pinmodel->num_frames) > 65536)
+ Host_Error ("%s has invalid number of frames: %i", loadmodel->name, LittleLong(pinmodel->num_frames));
+ if (LittleLong(pinmodel->num_skins) < 0 || LittleLong(pinmodel->num_skins) > 256)
+ 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->alias.aliasnum_meshes = 1;
+ loadmodel->alias.aliasdata_meshes = Mem_Alloc(loadmodel->mempool, sizeof(aliasmesh_t));
+
+ loadmodel->numskins = LittleLong(pinmodel->num_skins);
+ numxyz = LittleLong(pinmodel->num_xyz);
+ numst = LittleLong(pinmodel->num_st);
+ loadmodel->alias.aliasdata_meshes->num_triangles = LittleLong(pinmodel->num_tris);
+ loadmodel->numframes = LittleLong(pinmodel->num_frames);
+ loadmodel->alias.aliasdata_meshes->num_morphframes = loadmodel->numframes;
+ loadmodel->animscenes = Mem_Alloc(loadmodel->mempool, loadmodel->numframes * sizeof(animscene_t));
+
+ loadmodel->flags = 0; // there are no MD2 flags
+ loadmodel->synctype = ST_RAND;
+
+ // load the skins
+ inskin = (void*)(base + LittleLong(pinmodel->ofs_skins));
+ if ((skinfiles = Mod_LoadSkinFiles()))
+ {
+ loadmodel->alias.aliasdata_meshes->num_skins = loadmodel->numskins;
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(aliasskin_t));
+ Mod_BuildAliasSkinsFromSkinFiles(loadmodel->alias.aliasdata_meshes->data_skins, skinfiles, "default", "");
+ Mod_FreeSkinFiles(skinfiles);
+ }
+ else if (loadmodel->numskins)
+ {
+ // skins found (most likely not a player model)
+ loadmodel->alias.aliasdata_meshes->num_skins = loadmodel->numskins;
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(aliasskin_t));
+ for (i = 0;i < loadmodel->numskins;i++, inskin += MD2_SKINNAME)
+ {
+ if (Mod_LoadSkinFrame(&tempskinframe, inskin, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, true, false, true))
+ Mod_BuildAliasSkinFromSkinFrame(loadmodel->alias.aliasdata_meshes->data_skins + i, &tempskinframe);
+ else
+ {
+ Con_Printf("%s is missing skin \"%s\"\n", loadmodel->name, inskin);
+ Mod_BuildAliasSkinFromSkinFrame(loadmodel->alias.aliasdata_meshes->data_skins + i, NULL);
+ }
+ }
+ }
+ else
+ {
+ // no skins (most likely a player model)
+ loadmodel->numskins = 1;
+ loadmodel->alias.aliasdata_meshes->num_skins = loadmodel->numskins;
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(aliasskin_t));
+ Mod_BuildAliasSkinFromSkinFrame(loadmodel->alias.aliasdata_meshes->data_skins, NULL);
+ }
+
+ loadmodel->skinscenes = Mem_Alloc(loadmodel->mempool, sizeof(animscene_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;
+ }
+
+ // 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++)