游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4359|回复: 3

这里有人研究过最新版本的wow m2文件格式吗?

[复制链接]

12

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2012-10-11 18:28:00 | 显示全部楼层 |阅读模式
[em7],以前版本总是00 01 00 00,现在成了10 01 00 00,然后就是mesh数据块不知道到哪去了 [em7],没有mesh,就没有顶点索引的数据,没法渲染啊 [em7]

7

主题

87

帖子

124

积分

注册会员

Rank: 2

积分
124
发表于 2012-10-13 00:51:00 | 显示全部楼层

Re:这里有人研究过最新版本的wow m2文件格式吗?

void
M2BoneSerializer::ModelBoneData::CalcLocalOffset()
{
        int animDefNum = m2mdl->m2Holder->animDefs.Size();

        // calculate AnimtionBlockHeader nEntrys and local ofsEntrys
        for (int i=0; i<animDefNum; i++)
        {
                Models::AnimDef& animDef = m2mdl->m2Holder->animDefs;

                AsUtil::Array<uint32>& animTransTimes = animTransTimesArray;
                AsUtil::Array<uint32>& animRotTimes        = animRotTimesArray;
                AsUtil::Array<uint32>& animScaleTimes = animScaleTimesArray;

                this->trans_times_abhs.nEntrys        = animTransTimes.Size();
                this->trans_keys_abhs.nEntrys        = animTransTimes.Size();

                this->rot_times_abhs.nEntrys                = animRotTimes.Size();
                this->rot_keys_abhs.nEntrys                = animRotTimes.Size();

                this->scale_times_abhs.nEntrys        = animScaleTimes.Size();
                this->scale_keys_abhs.nEntrys        = animScaleTimes.Size();

                // AnimationBlockHeader trans time ofsEntrys
                int beforeDataSize = 0;
                for (IndexT before=0; before<i; before++)
                {
                        AsUtil::Array<uint32>& animTransTimes = animTransTimesArray[before];
                        beforeDataSize += (animTransTimes.Size()*sizeof(uint32));
                }
                this->trans_times_abhs.ofsEntrys = beforeDataSize;

                // AnimationBlockHeader trans key ofsEntrys
                beforeDataSize = 0;
                beforeDataSize += (transAllTimes.Size()*sizeof(uint32));
                for (IndexT before=0; before<i; before++)
                {
                        AsUtil::Array<Math::Vec3D>& animTransKeys = animTransKeysArray[before];
                        beforeDataSize += (animTransKeys.Size()*sizeof(Math::Vec3D));
                }
                this->trans_keys_abhs.ofsEntrys = beforeDataSize;

                // AnimationBlockHeader rot time ofsEntrys
                beforeDataSize = 0;
                beforeDataSize += (transAllTimes.Size()*sizeof(uint32));
                beforeDataSize += (transAllDatas.Size()*sizeof(Math::Vec3D));
                for (IndexT before=0; before<i; before++)
                {
                        AsUtil::Array<uint32>& animRotTimes = animRotTimesArray[before];
                        beforeDataSize += (animRotTimes.Size()*sizeof(uint32));
                }
                this->rot_times_abhs.ofsEntrys = beforeDataSize;

                // AnimationBlockHeader rot key ofsEntrys
                beforeDataSize = 0;
                beforeDataSize += (transAllTimes.Size()*sizeof(uint32));
                beforeDataSize += (transAllDatas.Size()*sizeof(Math::Vec3D));
                beforeDataSize += (rotAllTimes.Size()*sizeof(uint32));
                for (IndexT before=0; before<i; before++)
                {
                        AsUtil::Array<Math::Vec4D>& animRotKeys = animRotKeysArray[before];
                        beforeDataSize += (animRotKeys.Size()*sizeof(Math::Vec4D)/2);
                }
                this->rot_keys_abhs.ofsEntrys = beforeDataSize;

                // AnimtionBlockHeader scale time ofsEntry
                beforeDataSize = 0;
                beforeDataSize += (transAllTimes.Size()*sizeof(uint32));
                beforeDataSize += (transAllDatas.Size()*sizeof(Math::Vec3D));
                beforeDataSize += (rotAllTimes.Size()*sizeof(uint32));
                beforeDataSize += (rotAllDatas.Size()*sizeof(Math::Vec4D)/2);
                for (IndexT before=0; before<i; before++)
                {
                        AsUtil::Array<uint32>& animScaleTimes = animScaleTimesArray[before];
                        beforeDataSize += (animScaleTimes.Size()*sizeof(uint32));
                }
                this->scale_times_abhs.ofsEntrys = beforeDataSize;

                // AnimationBlockHeader scale key ofsEntry
                beforeDataSize = 0;
                beforeDataSize += (transAllTimes.Size()*sizeof(uint32));
                beforeDataSize += (transAllDatas.Size()*sizeof(Math::Vec3D));
                beforeDataSize += (rotAllTimes.Size()*sizeof(uint32));
                beforeDataSize += (rotAllDatas.Size()*sizeof(Math::Vec4D)/2);
                beforeDataSize += (scaleAllTimes.Size()*sizeof(uint32));
                for (IndexT before=0; before<i; before++)
                {
                        AsUtil::Array<Math::Vec3D>& animScaleKeys = animScaleKeysArray[before];
                        beforeDataSize += (animScaleKeys.Size()*sizeof(Math::Vec3D));
                }
                this->scale_keys_abhs.ofsEntrys = beforeDataSize;
        }

        // calculate ModelBoneDef nTimes nKeys and local ofsTimes ofsKeys
        boneDef.translation.nTimes = trans_times_abhs.Size();
        boneDef.translation.nKeys = trans_keys_abhs.Size();
        boneDef.rotation.nTimes = rot_times_abhs.Size();
        boneDef.rotation.nKeys = rot_keys_abhs.Size();
        boneDef.scaling.nTimes = scale_times_abhs.Size();
        boneDef.scaling.nKeys = scale_keys_abhs.Size();

        // calculate ModelBoneDef local ofsTimes ofsKeys
        int TimesAndKeysSize = 0;
        TimesAndKeysSize += (transAllTimes.Size()*sizeof(uint32));
        TimesAndKeysSize += (transAllDatas.Size()*sizeof(Math::Vec3D));
        TimesAndKeysSize += (rotAllTimes.Size()*sizeof(uint32));
        TimesAndKeysSize += (rotAllDatas.Size()*sizeof(Math::Vec4D)/2);
        TimesAndKeysSize += (scaleAllTimes.Size()*sizeof(uint32));
        TimesAndKeysSize += (scaleAllDatas.Size()*sizeof(Math::Vec3D));

        boneDef.translation.ofsTimes =        TimesAndKeysSize;
        boneDef.translation.ofsKeys =        TimesAndKeysSize +
                                                                        trans_times_abhs.Size()*sizeof(AnimationBlockHeader);

        boneDef.rotation.ofsTimes =                TimesAndKeysSize +
                                                                        trans_times_abhs.Size()*sizeof(AnimationBlockHeader) +
                                                                        trans_keys_abhs.Size()*sizeof(AnimationBlockHeader);
        boneDef.rotation.ofsKeys =                TimesAndKeysSize +
                                                                        trans_times_abhs.Size()*sizeof(AnimationBlockHeader) +
                                                                        trans_keys_abhs.Size()*sizeof(AnimationBlockHeader)+
                                                                        rot_times_abhs.Size()*sizeof(AnimationBlockHeader);

        boneDef.scaling.ofsTimes =                TimesAndKeysSize +
                                                                        trans_times_abhs.Size()*sizeof(AnimationBlockHeader) +
                                                                        trans_keys_abhs.Size()*sizeof(AnimationBlockHeader)+
                                                                        rot_times_abhs.Size()*sizeof(AnimationBlockHeader)+
                                                                        rot_keys_abhs.Size()*sizeof(AnimationBlockHeader);
        boneDef.scaling.ofsKeys =                TimesAndKeysSize +
                                                                        trans_times_abhs.Size()*sizeof(AnimationBlockHeader) +
                                                                        trans_keys_abhs.Size()*sizeof(AnimationBlockHeader)+
                                                                        rot_times_abhs.Size()*sizeof(AnimationBlockHeader)+
                                                                        rot_keys_abhs.Size()*sizeof(AnimationBlockHeader)+
                                                                        scale_times_abhs.Size()*sizeof(AnimationBlockHeader);
}

7

主题

87

帖子

124

积分

注册会员

Rank: 2

积分
124
发表于 2012-10-13 00:45:00 | 显示全部楼层

Re:这里有人研究过最新版本的wow m2文件格式吗?

妈的,我对这个爆熟悉,2.4.3, 3.3.5, 4.x
还专门写了max导出m2格式的插件
bone mesh material

7

主题

87

帖子

124

积分

注册会员

Rank: 2

积分
124
发表于 2012-10-13 00:49:00 | 显示全部楼层

Re:这里有人研究过最新版本的wow m2文件格式吗?

        //if (ARESVER>=ARESVER_WOW&& ARESVER<ARESVER_TBC)                        //WOW
        //{
        //        n_assert(ModelVersion(m2Holder->m2Header.UVER.version) >= ModelVersion(0,1,0,0));
        //        n_assert(ModelVersion(m2Holder->m2Header.UVER.version) < ModelVersion(4,1,0,0));
        //}
        //else if (ARESVER>=ARESVER_TBC && ARESVER<ARESVER_WLK)        //TBC
        //{
        //        n_assert(ModelVersion(m2Holder->m2Header.UVER.version) >= ModelVersion(4,1,0,0));
        //        n_assert(ModelVersion(m2Holder->m2Header.UVER.version) < ModelVersion(8,1,0,0));
        //}
        //else if (ARESVER>=ARESVER_WLK && ARESVER<ARESVER_CTM)        //WLK
        //{
        //        n_assert(ModelVersion(m2Holder->m2Header.UVER.version) >= ModelVersion(8,1,0,0));
        //        n_assert(ModelVersion(m2Holder->m2Header.UVER.version) < ModelVersion(9,1,0,0));
        //}
        //else if (ARESVER >= ARESVER_CTM)                                                //CTM
        //{
        //        n_assert(ModelVersion(m2Holder->m2Header.UVER.version) >= ModelVersion(9,1,0,0));
        //}
        //else
        //{
        //        n_assert(!"Error version with resource!");
        //}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-10 10:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表