|

楼主 |
发表于 2004-1-15 17:38:00
|
显示全部楼层
Re: 玩转mdl文件之迷
很高兴看到你提出的这个问题,本人上面发布的源码是只支持seqgroup等于1的情况下的.
当seqgroup大于1时,还需要进一步修改代码.不过改动也并不多.提示如下:
在studiohdr_t结构中新增的4个int结构中(其实为2组,每组2个int),第一组描述的是
动画信息,其内部结构很简单,为2个int结构,第一个为seqgroup号,第二个为动画描述
所在的索引号.因此,在bone_setup.cpp中获得动画描述时,我采取的方法是增加了一个函数:
mstudioanimdesc_t *GetAnimDesc( const studiohdr_t *pStudioHdr, const int anim )
{
int group = (pStudioHdr->pAnimNum( anim ))->group;
int value = (pStudioHdr->pAnimNum( anim ))->value;
if (group == 0)
return pStudioHdr->pAnimdesc(value);
// note:pSeqgroup函数是在studiohdr_t中增加的
studiosharehdr_t *phdr = (studiosharehdr_t *)((pStudioHdr->pSeqgroup(group))->cache);
return phdr->pAnimdesc(value);
}
用该函数替换以前的直接获得动画描述.
之所以采用多文件的模式,我认为是想把一些公用的信息提炼出来,从而减小了文件的大小.比如人的动作,
很多是相同的.因此涉及到如动作描述等公用信息时,多文件模式情况下需要从多个文件中进行提取.而这些
公用文件的结构也比较简单,并没有studiohdr_t结构那样多信息.我把它的文件结构定义为:
struct studiosharehdr_t
{
int id;
int version;
char name[64];
int length;
int data;
int numbones; // bones
int boneindex;
inline mstudiobonedesc_t *pBone( int i ) const
{
return (mstudiobonedesc_t *)(((byte *)this) + boneindex) + i;
};
int numanim; // animations/poses
int animdescindex; // animation descriptions
inline mstudioanimdesc_t *pAnimdesc( int i ) const
{
return (mstudioanimdesc_t *)(((byte *)this) + animdescindex) + i;
};
};
其中mstudiobonedesc_t结构是新增加的,见上面以前发布的mstudiotest_t结构,是一样的.
读出多文件后,我采取的方法是将其文件内容的buffer指针存储到结构mstudioseqgroup_t中的cache中.
所以获取信息时,(见最上面函数),我是从cache中取得的.
相信你一试即知.如果仍有疑问,可以与我联系.如果你觉得非常麻烦,我可以把源代码整理后发给你.
非常乐意与你交流.
|
|