X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=model_alias.c;h=04e663549ea56ca64ac09d37c64029b1ca57f06c;hb=d3ce8008cff1349ff9fe884d75f0f5bac3a5f872;hp=a2483327aea7677d98db116a2b3d352dfa16d8e8;hpb=71c61efff50dd075867e9d047770c59f7c0b8437;p=xonotic%2Fdarkplaces.git diff --git a/model_alias.c b/model_alias.c index a2483327..04e66354 100644 --- a/model_alias.c +++ b/model_alias.c @@ -62,7 +62,7 @@ void Mod_Alias_GetMesh_Vertex3f(const model_t *model, const frameblend_t *frameb out[0] += v->origin[0] * matrix[0] + v->origin[1] * matrix[1] + v->origin[2] * matrix[ 2] + v->origin[3] * matrix[ 3]; out[1] += v->origin[0] * matrix[4] + v->origin[1] * matrix[5] + v->origin[2] * matrix[ 6] + v->origin[3] * matrix[ 7]; out[2] += v->origin[0] * matrix[8] + v->origin[1] * matrix[9] + v->origin[2] * matrix[10] + v->origin[3] * matrix[11]; - } + } } else { @@ -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}}; @@ -286,78 +351,20 @@ static void Mod_MDL_LoadFrames (qbyte* datapointer, int inverts, vec3_t scale, v } 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; - } - - 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++; + skinframe->base = r_texture_notexture; } - 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; @@ -406,7 +413,7 @@ void Mod_BuildAliasSkinsFromSkinFiles(aliasskin_t *skin, skinfile_t *skinfile, c #define BOUNDI(VALUE,MIN,MAX) if (VALUE < MIN || VALUE >= MAX) Host_Error("model %s has an invalid ##VALUE (%d exceeds %d - %d)\n", loadmodel->name, VALUE, MIN, MAX); #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); +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); void Mod_IDP0_Load(model_t *mod, void *buffer) { @@ -424,7 +431,7 @@ void Mod_IDP0_Load(model_t *mod, void *buffer) char name[MAX_QPATH]; skinframe_t tempskinframe; animscene_t *tempskinscenes; - aliasskin_t *tempaliasskins; + texture_t *tempaliasskins; float *vertst; int *vertonseam, *vertremap; skinfile_t *skinfiles; @@ -603,7 +610,7 @@ void Mod_IDP0_Load(model_t *mod, void *buffer) 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); @@ -618,7 +625,7 @@ void Mod_IDP0_Load(model_t *mod, void *buffer) 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; @@ -680,8 +687,8 @@ void Mod_IDP0_Load(model_t *mod, void *buffer) 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 @@ -788,7 +795,7 @@ void Mod_IDP2_Load(model_t *mod, void *buffer) 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); } @@ -796,7 +803,7 @@ void Mod_IDP2_Load(model_t *mod, void *buffer) { // 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)) @@ -813,7 +820,7 @@ void Mod_IDP2_Load(model_t *mod, void *buffer) // 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); } @@ -1021,7 +1028,7 @@ void Mod_IDP3_Load(model_t *mod, void *buffer) 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])); @@ -1252,7 +1259,7 @@ void Mod_ZYMOTICMODEL_Load(model_t *mod, void *buffer) 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;