X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=model_alias.c;h=1a75f9b060d41861cbd6b27e9b9e445181e67ba0;hb=ef3ee13a9b63f6c849d620b1b99710343f3addbb;hp=3672dbc09378607043a9164cd5100b4e00532c5f;hpb=e2da2ae1092579c392c7bd4fc9e1b65312f0fc84;p=xonotic%2Fdarkplaces.git diff --git a/model_alias.c b/model_alias.c index 3672dbc0..1a75f9b0 100644 --- a/model_alias.c +++ b/model_alias.c @@ -785,7 +785,7 @@ static void Mod_BuildAliasSkinFromSkinFrame(texture_t *texture, skinframe_t *ski if (texture->currentskinframe->hasalpha) texture->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_NOSHADOW; texture->currentmaterialflags = texture->basematerialflags; - texture->offsetmapping = OFFSETMAPPING_OFF; + texture->offsetmapping = OFFSETMAPPING_DEFAULT; texture->offsetscale = 1; texture->specularscalemod = 1; texture->specularpowermod = 1; @@ -3037,11 +3037,6 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) Con_Printf("%s has no geometry\n", loadmodel->name); return; } - if (header->num_frames < 1 || header->num_anims < 1) - { - Con_Printf("%s has no animations\n", loadmodel->name); - return; - } if (pbase + header->ofs_text + header->num_text > pend || pbase + header->ofs_meshes + header->num_meshes*sizeof(iqmmesh_t) > pend || @@ -3105,7 +3100,7 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) break; } } - if (!vposition || !vtexcoord || !vblendindexes || !vblendweights) + if (!vposition || !vtexcoord || ((header->num_frames > 0 || header->num_anims > 0) && (!vblendindexes || !vblendweights))) { Con_Printf("%s is missing vertex array data\n", loadmodel->name); return; @@ -3134,9 +3129,9 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) if (loadmodel->numskins < 1) loadmodel->numskins = 1; - loadmodel->numframes = header->num_anims; + loadmodel->numframes = max(header->num_anims, 1); loadmodel->num_bones = header->num_joints; - loadmodel->num_poses = header->num_frames; + loadmodel->num_poses = max(header->num_frames, 1); loadmodel->nummodelsurfaces = loadmodel->num_surfaces = header->num_meshes; loadmodel->num_textures = loadmodel->num_surfaces * loadmodel->numskins; loadmodel->num_texturesperskin = loadmodel->num_surfaces; @@ -3145,7 +3140,7 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) meshtriangles = header->num_triangles; // do most allocations as one merged chunk - data = (unsigned char *)Mem_Alloc(loadmodel->mempool, loadmodel->num_surfaces * sizeof(msurface_t) + loadmodel->num_surfaces * sizeof(int) + loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t) + meshtriangles * sizeof(int[3]) + (meshvertices <= 65536 ? meshtriangles * sizeof(unsigned short[3]) : 0) + (r_enableshadowvolumes.integer ? meshtriangles * sizeof(int[3]) : 0) + meshvertices * (sizeof(float[14]) + sizeof(unsigned short)) + loadmodel->num_poses * loadmodel->num_bones * sizeof(short[6]) + loadmodel->num_bones * sizeof(float[12]) + loadmodel->numskins * sizeof(animscene_t) + loadmodel->num_bones * sizeof(aliasbone_t) + loadmodel->numframes * sizeof(animscene_t)); + data = (unsigned char *)Mem_Alloc(loadmodel->mempool, loadmodel->num_surfaces * sizeof(msurface_t) + loadmodel->num_surfaces * sizeof(int) + loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t) + meshtriangles * sizeof(int[3]) + (meshvertices <= 65536 ? meshtriangles * sizeof(unsigned short[3]) : 0) + (r_enableshadowvolumes.integer ? meshtriangles * sizeof(int[3]) : 0) + meshvertices * sizeof(float[14]) + (vblendindexes && vblendweights ? meshvertices * sizeof(unsigned short) : 0) + loadmodel->num_poses * loadmodel->num_bones * sizeof(short[6]) + loadmodel->num_bones * sizeof(float[12]) + loadmodel->numskins * sizeof(animscene_t) + loadmodel->num_bones * sizeof(aliasbone_t) + loadmodel->numframes * sizeof(animscene_t)); loadmodel->data_surfaces = (msurface_t *)data;data += loadmodel->num_surfaces * sizeof(msurface_t); loadmodel->sortedmodelsurfaces = (int *)data;data += loadmodel->num_surfaces * sizeof(int); loadmodel->data_textures = (texture_t *)data;data += loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t); @@ -3165,14 +3160,18 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) loadmodel->skinscenes = (animscene_t *)data;data += loadmodel->numskins * sizeof(animscene_t); loadmodel->data_bones = (aliasbone_t *)data;data += loadmodel->num_bones * sizeof(aliasbone_t); loadmodel->animscenes = (animscene_t *)data;data += loadmodel->numframes * sizeof(animscene_t); - loadmodel->surfmesh.num_blends = 0; - loadmodel->surfmesh.blends = (unsigned short *)data;data += meshvertices * sizeof(unsigned short); + if (vblendindexes && vblendweights) + { + loadmodel->surfmesh.num_blends = 0; + loadmodel->surfmesh.blends = (unsigned short *)data;data += meshvertices * sizeof(unsigned short); + } if (meshvertices <= 65536) { loadmodel->surfmesh.data_element3s = (unsigned short *)data;data += meshtriangles * sizeof(unsigned short[3]); } loadmodel->data_poses6s = (short *)data;data += loadmodel->num_poses * loadmodel->num_bones * sizeof(short[6]); - loadmodel->surfmesh.data_blendweights = (blendweights_t *)Mem_Alloc(loadmodel->mempool, meshvertices * sizeof(blendweights_t)); + if (vblendindexes && vblendweights) + loadmodel->surfmesh.data_blendweights = (blendweights_t *)Mem_Alloc(loadmodel->mempool, meshvertices * sizeof(blendweights_t)); for (i = 0;i < loadmodel->numskins;i++) { @@ -3231,9 +3230,9 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) loadmodel->data_bones[i].parent = joint[i].parent; if (loadmodel->data_bones[i].parent >= i) Host_Error("%s bone[%i].parent >= %i", loadmodel->name, i, i); - if (joint[i].rotation[3] > 0) - Vector4Negate(joint[i].rotation, joint[i].rotation); - Vector4Normalize2(joint[i].rotation, joint[i].rotation); + if (joint[i].rotation[3] > 0) + Vector4Negate(joint[i].rotation, joint[i].rotation); + Vector4Normalize2(joint[i].rotation, joint[i].rotation); Matrix4x4_FromDoom3Joint(&relbase, joint[i].origin[0], joint[i].origin[1], joint[i].origin[2], joint[i].rotation[0], joint[i].rotation[1], joint[i].rotation[2]); Matrix4x4_Invert_Simple(&relinvbase, &relbase); if (loadmodel->data_bones[i].parent >= 0) @@ -3261,7 +3260,15 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) loadmodel->animscenes[i].loop = ((anim[i].flags & IQM_LOOP) != 0); loadmodel->animscenes[i].framerate = anim[i].framerate; } - + if (header->num_anims <= 0) + { + strlcpy(loadmodel->animscenes[0].name, "static", sizeof(loadmodel->animscenes[0].name)); + loadmodel->animscenes[0].firstframe = 0; + loadmodel->animscenes[0].framecount = 1; + loadmodel->animscenes[0].loop = true; + loadmodel->animscenes[0].framerate = 10; + } + biggestorigin = 0; if (header->version == 1) { @@ -3283,6 +3290,16 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) f = fabs(pose1[i].channeloffset[1] + 0xFFFF*pose1[i].channelscale[1]); biggestorigin = max(biggestorigin, f); f = fabs(pose1[i].channeloffset[2] + 0xFFFF*pose1[i].channelscale[2]); biggestorigin = max(biggestorigin, f); } + if (header->num_frames <= 0) + { + for (i = 0;i < loadmodel->num_bones;i++) + { + float f; + f = fabs(joint1[i].origin[0]); biggestorigin = max(biggestorigin, f); + f = fabs(joint1[i].origin[1]); biggestorigin = max(biggestorigin, f); + f = fabs(joint1[i].origin[2]); biggestorigin = max(biggestorigin, f); + } + } } else { @@ -3304,6 +3321,16 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) f = fabs(pose[i].channeloffset[1] + 0xFFFF*pose[i].channelscale[1]); biggestorigin = max(biggestorigin, f); f = fabs(pose[i].channeloffset[2] + 0xFFFF*pose[i].channelscale[2]); biggestorigin = max(biggestorigin, f); } + if (header->num_frames <= 0) + { + for (i = 0;i < loadmodel->num_bones;i++) + { + float f; + f = fabs(joint[i].origin[0]); biggestorigin = max(biggestorigin, f); + f = fabs(joint[i].origin[1]); biggestorigin = max(biggestorigin, f); + f = fabs(joint[i].origin[2]); biggestorigin = max(biggestorigin, f); + } + } } loadmodel->num_posescale = biggestorigin / 32767.0f; loadmodel->num_poseinvscale = 1.0f / loadmodel->num_posescale; @@ -3328,6 +3355,18 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) if(pose1[j].channelmask&256) framedata++; } } + if (header->num_frames <= 0) + { + for (i = 0;i < loadmodel->num_bones;i++) + { + loadmodel->data_poses6s[i*6 + 0] = loadmodel->num_poseinvscale * joint1[i].origin[0]; + loadmodel->data_poses6s[i*6 + 1] = loadmodel->num_poseinvscale * joint1[i].origin[1]; + loadmodel->data_poses6s[i*6 + 2] = loadmodel->num_poseinvscale * joint1[i].origin[2]; + loadmodel->data_poses6s[i*6 + 3] = 32767.0f * joint1[i].rotation[0]; + loadmodel->data_poses6s[i*6 + 4] = 32767.0f * joint1[i].rotation[1]; + loadmodel->data_poses6s[i*6 + 5] = 32767.0f * joint1[i].rotation[2]; + } + } } else { @@ -3355,6 +3394,18 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) if(pose[j].channelmask&512) framedata++; } } + if (header->num_frames <= 0) + { + for (i = 0;i < loadmodel->num_bones;i++) + { + loadmodel->data_poses6s[i*6 + 0] = loadmodel->num_poseinvscale * joint[i].origin[0]; + loadmodel->data_poses6s[i*6 + 1] = loadmodel->num_poseinvscale * joint[i].origin[1]; + loadmodel->data_poses6s[i*6 + 2] = loadmodel->num_poseinvscale * joint[i].origin[2]; + loadmodel->data_poses6s[i*6 + 3] = 32767.0f * joint[i].rotation[0]; + loadmodel->data_poses6s[i*6 + 4] = 32767.0f * joint[i].rotation[1]; + loadmodel->data_poses6s[i*6 + 5] = 32767.0f * joint[i].rotation[2]; + } + } } // load bounding box data @@ -3484,7 +3535,7 @@ void Mod_INTERQUAKEMODEL_Load(dp_model_t *mod, void *buffer, void *bufferend) } } - for (i = 0; i < (int)header->num_vertexes;i++) + if (vblendindexes && vblendweights) for (i = 0; i < (int)header->num_vertexes;i++) { blendweights_t weights; memcpy(weights.index, vblendindexes + i*4, 4);