}
}
+int Mod_Alias_GetTagMatrix(const model_t *model, int poseframe, int tagindex, matrix4x4_t *outmatrix)
+{
+ const float *boneframe;
+ float tempbonematrix[12], bonematrix[12];
+ Matrix4x4_CreateIdentity(outmatrix);
+ if (model->alias.aliasnum_bones)
+ {
+ if (tagindex < 0 || tagindex >= model->alias.aliasnum_bones)
+ return 4;
+ if (poseframe >= model->alias.aliasnum_poses)
+ return 6;
+ boneframe = model->alias.aliasdata_poses + poseframe * model->alias.aliasnum_bones * 12;
+ memcpy(bonematrix, boneframe + tagindex * 12, sizeof(float[12]));
+ while (model->alias.aliasdata_bones[tagindex].parent >= 0)
+ {
+ memcpy(tempbonematrix, bonematrix, sizeof(float[12]));
+ R_ConcatTransforms(boneframe + model->alias.aliasdata_bones[tagindex].parent * 12, tempbonematrix, bonematrix);
+ tagindex = model->alias.aliasdata_bones[tagindex].parent;
+ }
+ outmatrix->m[0][0] = bonematrix[0];
+ outmatrix->m[0][1] = bonematrix[1];
+ outmatrix->m[0][2] = bonematrix[2];
+ outmatrix->m[0][3] = bonematrix[3];
+ outmatrix->m[1][0] = bonematrix[4];
+ outmatrix->m[1][1] = bonematrix[5];
+ outmatrix->m[1][2] = bonematrix[6];
+ outmatrix->m[1][3] = bonematrix[7];
+ outmatrix->m[2][0] = bonematrix[8];
+ outmatrix->m[2][1] = bonematrix[9];
+ outmatrix->m[2][2] = bonematrix[10];
+ outmatrix->m[2][3] = bonematrix[11];
+ outmatrix->m[3][0] = 0;
+ outmatrix->m[3][1] = 0;
+ outmatrix->m[3][2] = 0;
+ outmatrix->m[3][3] = 1;
+ }
+ else if (model->alias.aliasnum_tags)
+ {
+ if (tagindex < 0 || tagindex >= model->alias.aliasnum_tags)
+ return 4;
+ if (poseframe >= model->alias.aliasnum_tagframes)
+ return 6;
+ *outmatrix = model->alias.aliasdata_tags[poseframe * model->alias.aliasnum_tags + tagindex].matrix;
+ }
+ return 0;
+}
+
+int Mod_Alias_GetTagIndexForName(const model_t *model, unsigned int skin, const char *tagname)
+{
+ int i;
+ if (model->data_overridetagnamesforskin && skin < (unsigned int)model->numskins && model->data_overridetagnamesforskin[(unsigned int)skin].num_overridetagnames)
+ for (i = 0;i < model->data_overridetagnamesforskin[skin].num_overridetagnames;i++)
+ if (!strcasecmp(tagname, model->data_overridetagnamesforskin[skin].data_overridetagnames[i].name))
+ return i + 1;
+ if (model->alias.aliasnum_bones)
+ for (i = 0;i < model->alias.aliasnum_bones;i++)
+ if (!strcasecmp(tagname, model->alias.aliasdata_bones[i].name))
+ return i + 1;
+ if (model->alias.aliasnum_tags)
+ for (i = 0;i < model->alias.aliasnum_tags;i++)
+ if (!strcasecmp(tagname, model->alias.aliasdata_tags[i].name))
+ return i + 1;
+ return 0;
+}
+
static void Mod_Alias_Mesh_CompileFrameZero(aliasmesh_t *mesh)
{
frameblend_t frameblend[4] = {{0, 1}, {0, 0}, {0, 0}, {0, 0}};
mesh->data_basetvector3f = mesh->data_basevertex3f + mesh->num_vertices * 6;
mesh->data_basenormal3f = mesh->data_basevertex3f + mesh->num_vertices * 9;
Mod_Alias_GetMesh_Vertex3f(loadmodel, frameblend, mesh, mesh->data_basevertex3f);
- Mod_BuildTextureVectorsAndNormals(mesh->num_vertices, mesh->num_triangles, mesh->data_basevertex3f, mesh->data_texcoord2f, mesh->data_element3i, mesh->data_basesvector3f, mesh->data_basetvector3f, mesh->data_basenormal3f);
+ Mod_BuildTextureVectorsAndNormals(0, mesh->num_vertices, mesh->num_triangles, mesh->data_basevertex3f, mesh->data_texcoord2f, mesh->data_element3i, mesh->data_basesvector3f, mesh->data_basetvector3f, mesh->data_basenormal3f);
}
static void Mod_MDLMD2MD3_TraceBox(model_t *model, int frame, trace_t *trace, const vec3_t boxstartmins, const vec3_t boxstartmaxs, const vec3_t boxendmins, const vec3_t boxendmaxs, int hitsupercontentsmask)
}
static skinframe_t missingskinframe;
-aliaslayer_t mod_alias_layersbuffer[16]; // 7 currently used
-void Mod_BuildAliasSkinFromSkinFrame(aliasskin_t *skin, skinframe_t *skinframe)
+static void Mod_BuildAliasSkinFromSkinFrame(texture_t *skin, skinframe_t *skinframe)
{
- aliaslayer_t *layer;
-
// hack
if (skinframe == NULL)
{
skinframe = &missingskinframe;
memset(skinframe, 0, sizeof(*skinframe));
- skinframe->base = r_notexture;
+ skinframe->base = r_texture_notexture;
}
- memset(&mod_alias_layersbuffer, 0, sizeof(mod_alias_layersbuffer));
- layer = mod_alias_layersbuffer;
- layer->flags = ALIASLAYER_SPECULAR;
- layer->texture = skinframe->gloss;
- layer->nmap = skinframe->nmap;
- layer++;
- if (skinframe->merged != NULL)
- {
- layer->flags = ALIASLAYER_DIFFUSE | ALIASLAYER_NODRAW_IF_COLORMAPPED;
- layer->texture = skinframe->merged;
- layer->nmap = skinframe->nmap;
- layer++;
- }
- if (skinframe->base != NULL)
- {
- layer->flags = ALIASLAYER_DIFFUSE;
- if (skinframe->merged != NULL)
- layer->flags |= ALIASLAYER_NODRAW_IF_NOTCOLORMAPPED;
- layer->texture = skinframe->base;
- layer->nmap = skinframe->nmap;
- layer++;
- }
- if (skinframe->pants != NULL)
- {
- layer->flags = ALIASLAYER_DIFFUSE | ALIASLAYER_NODRAW_IF_NOTCOLORMAPPED | ALIASLAYER_COLORMAP_PANTS;
- layer->texture = skinframe->pants;
- layer->nmap = skinframe->nmap;
- layer++;
- }
- if (skinframe->shirt != NULL)
- {
- layer->flags = ALIASLAYER_DIFFUSE | ALIASLAYER_NODRAW_IF_NOTCOLORMAPPED | ALIASLAYER_COLORMAP_SHIRT;
- layer->texture = skinframe->shirt;
- layer->nmap = skinframe->nmap;
- layer++;
- }
-
- if (skinframe->glow != NULL)
- {
- layer->flags = 0;
- layer->texture = skinframe->glow;
- layer++;
- }
-
- layer->flags = ALIASLAYER_FOG | ALIASLAYER_FORCEDRAW_IF_FIRSTPASS;
- layer->texture = skinframe->fog;
- layer++;
-
- skin->flags = 0;
- // fog texture only exists if some pixels are transparent...
- if (skinframe->fog != NULL)
- skin->flags |= ALIASSKIN_TRANSPARENT;
-
- skin->num_layers = layer - mod_alias_layersbuffer;
- skin->data_layers = Mem_Alloc(loadmodel->mempool, skin->num_layers * sizeof(aliaslayer_t));
- memcpy(skin->data_layers, mod_alias_layersbuffer, skin->num_layers * sizeof(aliaslayer_t));
+ skin->skin = *skinframe;
}
-void Mod_BuildAliasSkinsFromSkinFiles(aliasskin_t *skin, skinfile_t *skinfile, char *meshname, char *shadername)
+static void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfile, char *meshname, char *shadername)
{
int i;
skinfileitem_t *skinfileitem;
char name[MAX_QPATH];
skinframe_t tempskinframe;
animscene_t *tempskinscenes;
- aliasskin_t *tempaliasskins;
+ texture_t *tempaliasskins;
float *vertst;
int *vertonseam, *vertremap;
skinfile_t *skinfiles;
if ((skinfiles = Mod_LoadSkinFiles()))
{
loadmodel->alias.aliasdata_meshes->num_skins = totalskins = loadmodel->numskins;
- loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(aliasskin_t));
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(texture_t));
Mod_BuildAliasSkinsFromSkinFiles(loadmodel->alias.aliasdata_meshes->data_skins, skinfiles, "default", "");
Mod_FreeSkinFiles(skinfiles);
loadmodel->skinscenes = Mem_Alloc(loadmodel->mempool, sizeof(animscene_t) * loadmodel->numskins);
else
{
loadmodel->alias.aliasdata_meshes->num_skins = totalskins;
- loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(aliasskin_t));
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(texture_t));
loadmodel->skinscenes = Mem_Alloc(loadmodel->mempool, loadmodel->numskins * sizeof(animscene_t));
totalskins = 0;
datapointer = startskins;
Mem_Free(tempskinscenes);
tempaliasskins = loadmodel->alias.aliasdata_meshes->data_skins;
- loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, (totalskins + 1) * sizeof(aliasskin_t));
- memcpy(loadmodel->alias.aliasdata_meshes->data_skins, tempaliasskins, totalskins * sizeof(aliasskin_t));
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, (totalskins + 1) * sizeof(texture_t));
+ memcpy(loadmodel->alias.aliasdata_meshes->data_skins, tempaliasskins, totalskins * sizeof(texture_t));
Mem_Free(tempaliasskins);
// store the info about the new skin
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));
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(texture_t));
Mod_BuildAliasSkinsFromSkinFiles(loadmodel->alias.aliasdata_meshes->data_skins, skinfiles, "default", "");
Mod_FreeSkinFiles(skinfiles);
}
{
// 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));
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(texture_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))
// 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));
+ loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(texture_t));
Mod_BuildAliasSkinFromSkinFrame(loadmodel->alias.aliasdata_meshes->data_skins, NULL);
}
mesh->num_morphframes = LittleLong(pinmesh->num_frames);
mesh->num_vertices = LittleLong(pinmesh->num_vertices);
mesh->num_triangles = LittleLong(pinmesh->num_triangles);
- mesh->data_skins = Mem_Alloc(loadmodel->mempool, mesh->num_skins * sizeof(aliasskin_t));
+ mesh->data_skins = Mem_Alloc(loadmodel->mempool, mesh->num_skins * sizeof(texture_t));
mesh->data_element3i = Mem_Alloc(loadmodel->mempool, mesh->num_triangles * sizeof(int[3]));
mesh->data_neighbor3i = Mem_Alloc(loadmodel->mempool, mesh->num_triangles * sizeof(int[3]));
mesh->data_texcoord2f = Mem_Alloc(loadmodel->mempool, mesh->num_vertices * sizeof(float[2]));
mesh = loadmodel->alias.aliasdata_meshes + i;
mesh->num_skins = loadmodel->numskins;
mesh->num_triangles = count;
- mesh->data_skins = Mem_Alloc(loadmodel->mempool, mesh->num_skins * sizeof(aliasskin_t));
+ mesh->data_skins = Mem_Alloc(loadmodel->mempool, mesh->num_skins * sizeof(texture_t));
mesh->data_element3i = Mem_Alloc(loadmodel->mempool, mesh->num_triangles * sizeof(int[3]));
mesh->data_neighbor3i = Mem_Alloc(loadmodel->mempool, mesh->num_triangles * sizeof(int[3]));
outelements = mesh->data_element3i;