X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=model_alias.c;h=2fb1a35952a6ce49c04ee8a1b31e51992c6cb1e0;hb=4697d247f884b54564ab15189fa4dfb3420708e2;hp=a35dbb754dd77512450988fb262435446204e35f;hpb=baa29902049951543f6b9114ab5cf0f8ab6edeac;p=xonotic%2Fdarkplaces.git diff --git a/model_alias.c b/model_alias.c index a35dbb75..2fb1a359 100644 --- a/model_alias.c +++ b/model_alias.c @@ -102,6 +102,71 @@ void Mod_Alias_GetMesh_Vertex3f(const model_t *model, const frameblend_t *frameb } } +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}}; @@ -110,7 +175,7 @@ static void Mod_Alias_Mesh_CompileFrameZero(aliasmesh_t *mesh) 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) @@ -319,12 +384,14 @@ static void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfi Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe); else { - Con_Printf("mesh \"%s\": failed to load skin #%i \"%s\", falling back to mesh's internal shader name \"%s\"\n", meshname, i, skinfileitem->replacement, shadername); + if (cls.state != ca_dedicated) + Con_Printf("mesh \"%s\": failed to load skin #%i \"%s\", falling back to mesh's internal shader name \"%s\"\n", meshname, i, skinfileitem->replacement, shadername); if (Mod_LoadSkinFrame(&tempskinframe, shadername, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, true, false, true)) Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe); else { - Con_Printf("failed to load skin \"%s\"\n", shadername); + if (cls.state != ca_dedicated) + Con_Printf("failed to load skin \"%s\"\n", shadername); Mod_BuildAliasSkinFromSkinFrame(skin, NULL); } } @@ -339,7 +406,8 @@ static void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfi Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe); else { - Con_Printf("failed to load mesh \"%s\" shader \"%s\"\n", meshname, shadername); + if (cls.state != ca_dedicated) + Con_Printf("failed to load mesh \"%s\" shader \"%s\"\n", meshname, shadername); Mod_BuildAliasSkinFromSkinFrame(skin, NULL); } } @@ -349,7 +417,7 @@ static void Mod_BuildAliasSkinsFromSkinFiles(texture_t *skin, skinfile_t *skinfi #define BOUNDF(VALUE,MIN,MAX) if (VALUE < MIN || VALUE >= MAX) Host_Error("model %s has an invalid ##VALUE (%f exceeds %f - %f)\n", loadmodel->name, VALUE, MIN, MAX); extern void R_Model_Alias_Draw(entity_render_t *ent); extern void R_Model_Alias_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightorigin, float lightradius, int numsurfaces, const int *surfacelist, const vec3_t lightmins, const vec3_t lightmaxs); -extern void R_Model_Alias_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, vec3_t relativeeyeorigin, float lightradius, float *lightcolor, const matrix4x4_t *matrix_modeltolight, const matrix4x4_t *matrix_modeltoattenuationxyz, const matrix4x4_t *matrix_modeltoattenuationz, rtexture_t *lightcubemap, vec_t ambientscale, vec_t diffusescale, vec_t specularscale, int numsurfaces, const int *surfacelist); +extern void R_Model_Alias_DrawLight(entity_render_t *ent, float *lightcolor, int numsurfaces, const int *surfacelist); void Mod_IDP0_Load(model_t *mod, void *buffer) { int i, j, version, totalskins, skinwidth, skinheight, groupframes, groupskins, numverts;