+void Mod_BuildMDLMD2MeshInfo(void)
+{
+ int i;
+ aliasmesh_t *mesh;
+ aliasskin_t *skin;
+ aliaslayer_t *layer;
+ skinframe_t *skinframe;
+
+ loadmodel->mdlmd2data_triangleneighbors = Mem_Alloc(loadmodel->mempool, loadmodel->numtris * sizeof(int[3]));
+ Mod_ValidateElements(loadmodel->mdlmd2data_indices, loadmodel->numtris, loadmodel->numverts, __FILE__, __LINE__);
+ Mod_BuildTriangleNeighbors(loadmodel->mdlmd2data_triangleneighbors, loadmodel->mdlmd2data_indices, loadmodel->numtris);
+
+ loadmodel->mdlmd2num_meshes = 1;
+ mesh = loadmodel->mdlmd2data_meshes = Mem_Alloc(loadmodel->mempool, loadmodel->mdlmd2num_meshes * sizeof(aliasmesh_t));
+ mesh->num_skins = 0;
+ mesh->num_frames = 0;
+ for (i = 0;i < loadmodel->numframes;i++)
+ mesh->num_frames += loadmodel->animscenes[i].framecount;
+ for (i = 0;i < loadmodel->numskins;i++)
+ mesh->num_skins += loadmodel->skinscenes[i].framecount;
+ mesh->num_triangles = loadmodel->numtris;
+ mesh->num_vertices = loadmodel->numverts;
+ mesh->data_skins = Mem_Alloc(loadmodel->mempool, mesh->num_skins * sizeof(aliasskin_t));
+ mesh->data_elements = loadmodel->mdlmd2data_indices;
+ mesh->data_neighbors = loadmodel->mdlmd2data_triangleneighbors;
+ mesh->data_texcoords = loadmodel->mdlmd2data_texcoords;
+ mesh->data_vertices = loadmodel->mdlmd2data_pose;
+ for (i = 0, skin = mesh->data_skins, skinframe = loadmodel->skinframes;i < mesh->num_skins;i++, skin++, skinframe++)
+ {
+ skin->flags = 0;
+ // fog texture only exists if some pixels are transparent...
+ if (skinframe->fog != NULL)
+ skin->flags |= ALIASSKIN_TRANSPARENT;
+ // fog and gloss layers always exist
+ skin->num_layers = 2;
+ if (skinframe->glow != NULL)
+ skin->num_layers++;
+ if (skinframe->merged != NULL)
+ skin->num_layers++;
+ if (skinframe->base != NULL)
+ skin->num_layers++;
+ if (skinframe->pants != NULL)
+ skin->num_layers++;
+ if (skinframe->shirt != NULL)
+ skin->num_layers++;
+ layer = skin->data_layers = Mem_Alloc(loadmodel->mempool, skin->num_layers * sizeof(aliaslayer_t));
+ if (skinframe->glow != NULL)
+ {
+ layer->flags = ALIASLAYER_REALTIME_NODRAW;
+ layer->texture = skinframe->glow;
+ layer++;
+ }
+ if (skinframe->merged != NULL)
+ {
+ layer->flags = ALIASLAYER_COLORMAP_NODRAW | ALIASLAYER_DIFFUSE;
+ if (skinframe->glow != NULL)
+ layer->flags |= ALIASLAYER_ADD;
+ layer->texture = skinframe->merged;
+ layer->nmap = skinframe->nmap;
+ layer++;
+ }
+ if (skinframe->base != NULL)
+ {
+ layer->flags = ALIASLAYER_COLORMAP_DRAW | ALIASLAYER_DIFFUSE;
+ if (skinframe->glow != NULL)
+ layer->flags |= ALIASLAYER_ADD;
+ layer->texture = skinframe->base;
+ layer->nmap = skinframe->nmap;
+ layer++;
+ }
+ if (skinframe->pants != NULL)
+ {
+ layer->flags = ALIASLAYER_COLORMAP_DRAW | ALIASLAYER_COLORMAP_DIFFUSE_SHIRT;
+ if (skinframe->glow != NULL || skinframe->base != NULL)
+ layer->flags |= ALIASLAYER_ADD;
+ layer->texture = skinframe->pants;
+ layer->nmap = skinframe->nmap;
+ layer++;
+ }
+ if (skinframe->shirt != NULL)
+ {
+ layer->flags = ALIASLAYER_COLORMAP_DRAW | ALIASLAYER_COLORMAP_DIFFUSE_SHIRT;
+ if (skinframe->glow != NULL || skinframe->base != NULL || skinframe->pants != NULL)
+ layer->flags |= ALIASLAYER_ADD;
+ layer->texture = skinframe->shirt;
+ layer->nmap = skinframe->nmap;
+ layer++;
+ }
+ layer->flags = ALIASLAYER_REALTIME_DRAW | ALIASLAYER_SPECULAR;
+ layer->texture = skinframe->gloss;
+ layer->nmap = skinframe->nmap;
+ layer++;
+ layer->flags = ALIASLAYER_REALTIME_NODRAW | ALIASLAYER_FOG;
+ layer->texture = skinframe->fog;
+ layer++;
+ }
+}
+