亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? modelloadermdx.cpp

?? 骨骼動畫....把魔獸模型解出的代碼..
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
//+-----------------------------------------------------------------------------
//| Included files
//+-----------------------------------------------------------------------------
#include "ModelLoaderMdx.h"


//+-----------------------------------------------------------------------------
//| Global objects
//+-----------------------------------------------------------------------------
MODEL_LOADER_MDX ModelLoaderMdx;


//+-----------------------------------------------------------------------------
//| Constructor
//+-----------------------------------------------------------------------------
MODEL_LOADER_MDX::MODEL_LOADER_MDX()
{
	RegisterMdxLoader('VERS', LoadVersion);
	RegisterMdxLoader('MODL', LoadModel);
	RegisterMdxLoader('SEQS', LoadSequences);
	RegisterMdxLoader('GLBS', LoadGlobalSequences);
	RegisterMdxLoader('TEXS', LoadTextures);
	RegisterMdxLoader('MTLS', LoadMaterials);
	RegisterMdxLoader('TXAN', LoadTextureAnimations);
	RegisterMdxLoader('GEOS', LoadGeosets);
	RegisterMdxLoader('GEOA', LoadGeosetAnimations);
	RegisterMdxLoader('BONE', LoadBones);
	RegisterMdxLoader('LITE', LoadLights);
	RegisterMdxLoader('HELP', LoadHelpers);
	RegisterMdxLoader('ATCH', LoadAttachments);
	RegisterMdxLoader('PIVT', LoadPivotPoints);
	RegisterMdxLoader('PREM', LoadParticleEmitters);
	RegisterMdxLoader('PRE2', LoadParticleEmitters2);
	RegisterMdxLoader('RIBB', LoadRibbonEmitters);
	RegisterMdxLoader('EVTS', LoadEventObjects);
	RegisterMdxLoader('CAMS', LoadCameras);
	RegisterMdxLoader('CLID', LoadCollisionShapes);
}


//+-----------------------------------------------------------------------------
//| Destructor
//+-----------------------------------------------------------------------------
MODEL_LOADER_MDX::~MODEL_LOADER_MDX()
{
	MdxLoaderMap.clear();
}


//+-----------------------------------------------------------------------------
//| Saves a model to a buffer
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::Save(MODEL& Model, CONST std::string& FileName, BUFFER& Buffer)
{
	DATA_OUT_STREAM DataStream;

	CurrentFileName = FileName;
	DataStream.SetFileName(FileName);

	Model.GenerateObjectIds();
	Model.WrapPivotPoints();

	DataStream.WriteDWord(ReverseDWord('MDLX'));

	if(!SaveVersion(Model, DataStream)) return FALSE;
	if(!SaveModel(Model, DataStream)) return FALSE;
	if(!SaveSequences(Model, DataStream)) return FALSE;
	if(!SaveGlobalSequences(Model, DataStream)) return FALSE;
	if(!SaveMaterials(Model, DataStream)) return FALSE;
	if(!SaveTextures(Model, DataStream)) return FALSE;
	if(!SaveTextureAnimations(Model, DataStream)) return FALSE;
	if(!SaveGeosets(Model, DataStream)) return FALSE;
	if(!SaveGeosetAnimations(Model, DataStream)) return FALSE;
	if(!SaveBones(Model, DataStream)) return FALSE;
	if(!SaveLights(Model, DataStream)) return FALSE;
	if(!SaveHelpers(Model, DataStream)) return FALSE;
	if(!SaveAttachments(Model, DataStream)) return FALSE;
	if(!SavePivotPoints(Model, DataStream)) return FALSE;
	if(!SaveParticleEmitters(Model, DataStream)) return FALSE;
	if(!SaveParticleEmitters2(Model, DataStream)) return FALSE;
	if(!SaveRibbonEmitters(Model, DataStream)) return FALSE;
	if(!SaveCameras(Model, DataStream)) return FALSE;
	if(!SaveEventObjects(Model, DataStream)) return FALSE;
	if(!SaveCollisionShapes(Model, DataStream)) return FALSE;

	if(!DataStream.Save(Buffer)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Loads a model from a buffer
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::Load(MODEL& Model, CONST std::string& FileName, BUFFER& Buffer)
{
	INT Size;
	DWORD Group;
	DATA_IN_STREAM DataStream;
	std::map<DWORD, MDX_LOADER>::iterator i;

	CurrentFileName = FileName;
	DataStream.SetFileName(FileName);

	if(!DataStream.Load(Buffer)) return FALSE;

	if(ReverseDWord(DataStream.ReadDWord()) != 'MDLX')
	{
		Error.SetMessage("The file is not an MDX model!");
		return FALSE;
	}

	while(!DataStream.Eof())
	{
		Group = ReverseDWord(DataStream.ReadDWord());
		Size = static_cast<INT>(DataStream.ReadDWord());

		i = MdxLoaderMap.find(Group);
		if(i == MdxLoaderMap.end())
		{
			Error.SetMessage("Unable to load \"" + FileName + "\", unknown group \"" + GroupToString(Group) + "\"!");
			return FALSE;
		}

		if(!(i->second(Model, DataStream, Size))) return FALSE;
	}

	Model.ConnectNodes();
	Model.UnwrapPivotPoints();

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Registers an mdx loader
//+-----------------------------------------------------------------------------
VOID MODEL_LOADER_MDX::RegisterMdxLoader(DWORD Group, MDX_LOADER Loader)
{
	MdxLoaderMap.insert(std::make_pair(Group, Loader));
}


//+-----------------------------------------------------------------------------
//| Reverses a DWORD
//+-----------------------------------------------------------------------------
DWORD MODEL_LOADER_MDX::ReverseDWord(DWORD DWord)
{
	DWORD NewDWord;
	CHAR* Source;
	CHAR* Target;

	Source = reinterpret_cast<CHAR*>(&DWord);
	Target = reinterpret_cast<CHAR*>(&NewDWord);

	Target[0] = Source[3];
	Target[1] = Source[2];
	Target[2] = Source[1];
	Target[3] = Source[0];

	return NewDWord;
}


//+-----------------------------------------------------------------------------
//| Converts a group to a string
//+-----------------------------------------------------------------------------
std::string MODEL_LOADER_MDX::GroupToString(DWORD Group)
{
	CHAR Buffer[5];
	CHAR* Pointer;

	Pointer = reinterpret_cast<CHAR*>(&Group);

	Buffer[0] = Pointer[3];
	Buffer[1] = Pointer[2];
	Buffer[2] = Pointer[1];
	Buffer[3] = Pointer[0];
	Buffer[4] = '\0';

	return Buffer;
}


//+-----------------------------------------------------------------------------
//| Saves the model version
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveVersion(MODEL& Model, DATA_OUT_STREAM& DataStream)
{
	DataStream.WriteDWord(ReverseDWord('VERS'));
	DataStream.WriteDWord(4);
	DataStream.WriteDWord(Model.Data().Info.Version);

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves the model info
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveModel(MODEL& Model, DATA_OUT_STREAM& DataStream)
{
	DataStream.WriteDWord(ReverseDWord('MODL'));
	DataStream.WriteDWord(MODEL_NAME_SIZE + 36);

	DataStream.WriteString(Model.Data().Info.Name, MODEL_NAME_SIZE);

	DataStream.WriteDWord(0); //What is this? (always 0?)

	DataStream.WriteFloat(Model.Data().Info.Extent.Radius);
	DataStream.WriteFloat(Model.Data().Info.Extent.Min.x);
	DataStream.WriteFloat(Model.Data().Info.Extent.Min.y);
	DataStream.WriteFloat(Model.Data().Info.Extent.Min.z);
	DataStream.WriteFloat(Model.Data().Info.Extent.Max.x);
	DataStream.WriteFloat(Model.Data().Info.Extent.Max.y);
	DataStream.WriteFloat(Model.Data().Info.Extent.Max.z);

	DataStream.WriteDWord(Model.Data().Info.BlendTime);

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves the model sequences
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveSequences(MODEL& Model, DATA_OUT_STREAM& DataStream)
{
	INT i;
	INT TotalSize = 0;

	if(Model.Data().SequenceContainer.GetSize() <= 0) return TRUE;

	for(i = 0; i < Model.Data().SequenceContainer.GetTotalSize(); i++)
	{
		if(Model.Data().SequenceContainer.ValidIndex(i))
		{
			TotalSize += Model.Data().SequenceContainer[i]->GetSize();
		}
	}

	DataStream.WriteDWord(ReverseDWord('SEQS'));
	DataStream.WriteDWord(TotalSize);

	for(i = 0; i < Model.Data().SequenceContainer.GetTotalSize(); i++)
	{
		if(Model.Data().SequenceContainer.ValidIndex(i))
		{
			if(!SaveSequence(*(Model.Data().SequenceContainer[i]), DataStream)) return FALSE;
		}
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves a model sequence
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveSequence(MODEL_SEQUENCE& Sequence, DATA_OUT_STREAM& DataStream)
{
	DataStream.WriteString(Sequence.Data().Name, MODEL_NAME_SEQUENCE_SIZE);

	DataStream.WriteDWord(static_cast<DWORD>(Sequence.Data().Interval.x));
	DataStream.WriteDWord(static_cast<DWORD>(Sequence.Data().Interval.y));
	DataStream.WriteFloat(Sequence.Data().MoveSpeed);
	DataStream.WriteDWord(Sequence.Data().NonLooping ? 1 : 0);
	DataStream.WriteFloat(Sequence.Data().Rarity);

	DataStream.WriteDWord(0); //What is this?

	DataStream.WriteFloat(Sequence.Data().Extent.Radius);
	DataStream.WriteFloat(Sequence.Data().Extent.Min.x);
	DataStream.WriteFloat(Sequence.Data().Extent.Min.y);
	DataStream.WriteFloat(Sequence.Data().Extent.Min.z);
	DataStream.WriteFloat(Sequence.Data().Extent.Max.x);
	DataStream.WriteFloat(Sequence.Data().Extent.Max.y);
	DataStream.WriteFloat(Sequence.Data().Extent.Max.z);

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves the global model sequences
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveGlobalSequences(MODEL& Model, DATA_OUT_STREAM& DataStream)
{
	INT i;
	INT TotalSize = 0;

	if(Model.Data().GlobalSequenceContainer.GetSize() <= 0) return TRUE;

	for(i = 0; i < Model.Data().GlobalSequenceContainer.GetTotalSize(); i++)
	{
		if(Model.Data().GlobalSequenceContainer.ValidIndex(i))
		{
			TotalSize += Model.Data().GlobalSequenceContainer[i]->GetSize();
		}
	}

	DataStream.WriteDWord(ReverseDWord('GLBS'));
	DataStream.WriteDWord(TotalSize);

	for(i = 0; i < Model.Data().GlobalSequenceContainer.GetTotalSize(); i++)
	{
		if(Model.Data().GlobalSequenceContainer.ValidIndex(i))
		{
			DataStream.WriteDWord(Model.Data().GlobalSequenceContainer[i]->Data().Duration);
		}
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves the model textures
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveTextures(MODEL& Model, DATA_OUT_STREAM& DataStream)
{
	INT i;
	INT TotalSize = 0;

	if(Model.Data().TextureContainer.GetSize() <= 0) return TRUE;

	for(i = 0; i < Model.Data().TextureContainer.GetTotalSize(); i++)
	{
		if(Model.Data().TextureContainer.ValidIndex(i))
		{
			TotalSize += Model.Data().TextureContainer[i]->GetSize();
		}
	}

	DataStream.WriteDWord(ReverseDWord('TEXS'));
	DataStream.WriteDWord(TotalSize);

	for(i = 0; i < Model.Data().TextureContainer.GetTotalSize(); i++)
	{
		if(Model.Data().TextureContainer.ValidIndex(i))
		{
			if(!SaveTexture(*(Model.Data().TextureContainer[i]), DataStream)) return FALSE;
		}
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves a model texture
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveTexture(MODEL_TEXTURE& Texture, DATA_OUT_STREAM& DataStream)
{
	DWORD Flags;

	DataStream.WriteDWord((Texture.Data().ReplaceableId == INVALID_INDEX) ? 0 : Texture.Data().ReplaceableId);
	DataStream.WriteString(Texture.Data().FileName, MODEL_NAME_TEXTURE_SIZE);

	DataStream.WriteDWord(0); //What is this? (always 0?)

	Flags = 0;
	if(Texture.Data().WrapWidth) Flags |= 1;
	if(Texture.Data().WrapHeight) Flags |= 2;

	DataStream.WriteDWord(Flags);

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves the model materials
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveMaterials(MODEL& Model, DATA_OUT_STREAM& DataStream)
{
	INT i;
	INT TotalSize = 0;

	if(Model.Data().MaterialContainer.GetSize() <= 0) return TRUE;

	for(i = 0; i < Model.Data().MaterialContainer.GetTotalSize(); i++)
	{
		if(Model.Data().MaterialContainer.ValidIndex(i))
		{
			TotalSize += Model.Data().MaterialContainer[i]->GetSize();
		}
	}

	DataStream.WriteDWord(ReverseDWord('MTLS'));
	DataStream.WriteDWord(TotalSize);

	for(i = 0; i < Model.Data().MaterialContainer.GetTotalSize(); i++)
	{
		if(Model.Data().MaterialContainer.ValidIndex(i))
		{
			if(!SaveMaterial(*(Model.Data().MaterialContainer[i]), DataStream)) return FALSE;
		}
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Saves a model material
//+-----------------------------------------------------------------------------
BOOL MODEL_LOADER_MDX::SaveMaterial(MODEL_MATERIAL& Material, DATA_OUT_STREAM& DataStream)
{
	INT i;
	DWORD Flags;
	DWORD Temp;
	MODEL_MATERIAL_LAYER* Layer;

	DataStream.WriteDWord(Material.GetSize());

	Flags = 0;
	if(Material.Data().ConstantColor) Flags |= 1;
	if(Material.Data().SortPrimitivesFarZ) Flags |= 16;
	if(Material.Data().FullResolution) Flags |= 32;

	DataStream.WriteDWord(Material.Data().PriorityPlane);
	DataStream.WriteDWord(Flags);

	DataStream.WriteDWord(ReverseDWord('LAYS'));

	DataStream.WriteDWord(Material.Data().LayerContainer.GetSize());
	for(i = 0; i < Material.Data().LayerContainer.GetTotalSize(); i++)
	{
		if(Material.Data().LayerContainer.ValidIndex(i))
		{
			Layer = Material.Data().LayerContainer[i];

			DataStream.WriteDWord(Layer->GetSize());

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91视频91自| 粉嫩久久99精品久久久久久夜| 久久一区二区视频| 欧美日韩成人综合在线一区二区| 成人国产精品免费| 成人激情黄色小说| 国产精品羞羞答答xxdd| 午夜欧美在线一二页| 亚洲欧美精品午睡沙发| 国产精品三级av| 国产精品家庭影院| 亚洲日本一区二区| 1024精品合集| 亚洲综合色成人| 日本成人在线看| 日韩av网站免费在线| 日韩中文字幕一区二区三区| 日韩av不卡一区二区| 美日韩黄色大片| 国产成人av福利| 99在线视频精品| 欧美亚洲自拍偷拍| 欧美日韩国产免费| 日韩精品一区在线| 久久亚洲一级片| 日韩毛片精品高清免费| 天涯成人国产亚洲精品一区av| 久久精品国产77777蜜臀| 国内外成人在线| 91一区二区三区在线播放| 色婷婷综合久久| 精品精品欲导航| 国产精品入口麻豆原神| 亚洲第一二三四区| 国产中文字幕精品| 成人永久aaa| 91精品国产综合久久小美女| 久久青草国产手机看片福利盒子 | 成人免费视频在线观看| 亚洲免费毛片网站| 奇米色一区二区三区四区| 国产精品一区在线观看乱码| 91片黄在线观看| 精品国精品国产尤物美女| 亚洲精品久久久蜜桃| 奇米在线7777在线精品| 成人精品在线视频观看| 91麻豆精品国产91久久久使用方法| xfplay精品久久| 亚洲成av人片在线| 成人毛片视频在线观看| 日韩一卡二卡三卡四卡| 亚洲蜜臀av乱码久久精品| 精品在线视频一区| 日本韩国一区二区三区| 国产日产欧美一区二区视频| 视频在线观看一区| 91免费在线播放| 久久青草国产手机看片福利盒子 | 日韩女优电影在线观看| 亚洲精品第一国产综合野| 国产在线精品一区二区夜色| 日韩一区二区三区视频在线观看| 亚洲日本va在线观看| 国产成人亚洲综合a∨猫咪| 欧美酷刑日本凌虐凌虐| 亚洲精品乱码久久久久久久久 | 99久久精品久久久久久清纯| 日韩手机在线导航| 日韩成人免费电影| 欧美亚洲高清一区二区三区不卡| 亚洲视频一区在线| 国产成人精品三级| 精品播放一区二区| 日韩avvvv在线播放| 69久久夜色精品国产69蝌蚪网| 亚洲黄色免费电影| 色婷婷久久久久swag精品| 国产精品乱码人人做人人爱| 国产精品亚洲视频| 国产婷婷色一区二区三区| 国产麻豆精品在线观看| 欧美videos中文字幕| 日本成人在线一区| 日韩欧美中文字幕制服| 男女性色大片免费观看一区二区 | 久久久亚洲高清| 国产精品资源在线观看| 久久先锋影音av鲁色资源网| 国产一区二区三区四| 久久久久久一级片| 国产乱码精品一区二区三区av| 久久久天堂av| 色综合久久综合| 午夜精品爽啪视频| 日韩免费性生活视频播放| 麻豆精品新av中文字幕| 久久久久国色av免费看影院| 岛国av在线一区| 亚洲国产欧美在线人成| 欧美一区二区三区公司| 国产一区二区三区av电影| 中国色在线观看另类| 97精品久久久午夜一区二区三区| 亚洲免费在线电影| 欧美性欧美巨大黑白大战| 亚洲三级电影网站| 欧美在线短视频| 亚洲国产毛片aaaaa无费看| 色8久久人人97超碰香蕉987| 亚洲动漫第一页| 欧美年轻男男videosbes| 五月天激情综合| 日本伦理一区二区| 久久99精品久久只有精品| 日韩精品专区在线影院观看 | 视频一区在线播放| 欧美日本韩国一区| 麻豆精品一二三| 中文字幕乱码一区二区免费| 91在线国产观看| 美女高潮久久久| 亚洲欧洲精品天堂一级| 欧美中文字幕一二三区视频| 日本欧美在线观看| 精品国产乱码久久久久久1区2区| 日韩精品1区2区3区| 国产精品国产三级国产普通话99 | 视频一区在线视频| 国产精品情趣视频| 欧美性生活影院| 国产原创一区二区三区| 国产精品灌醉下药二区| 欧美卡1卡2卡| 久久99精品久久久久婷婷| 亚洲综合成人在线| 日韩免费福利电影在线观看| av动漫一区二区| 蜜臀91精品一区二区三区 | 久久无码av三级| 色综合久久综合网97色综合| 精一区二区三区| 亚洲精品午夜久久久| 国产精品视频一二三| 欧美日韩国产成人在线免费| 高清国产一区二区| 蜜桃视频第一区免费观看| 国产精品久久久久久久久久免费看 | 17c精品麻豆一区二区免费| 欧美人体做爰大胆视频| 成人黄色av电影| 亚洲18色成人| 亚洲一区免费在线观看| 国产日韩精品一区二区三区在线| 7777精品伊人久久久大香线蕉的 | 石原莉奈在线亚洲三区| 国产精品视频yy9299一区| 91精品国产综合久久国产大片| 色婷婷国产精品| 激情综合网最新| 奇米亚洲午夜久久精品| 日本一不卡视频| 亚洲v精品v日韩v欧美v专区| 中文乱码免费一区二区| 日韩免费性生活视频播放| 欧美在线观看18| 高清成人免费视频| 成人毛片在线观看| 国产一区二区按摩在线观看| 老司机午夜精品| 麻豆一区二区三区| 一二三区精品视频| 亚洲成a人v欧美综合天堂下载 | 精品久久一区二区| 欧美美女黄视频| 欧美日韩视频在线第一区| 精品一区二区三区在线观看国产 | 国内精品久久久久影院色 | 亚洲美女免费在线| 亚洲日本一区二区三区| 亚洲视频在线一区观看| 日韩成人午夜电影| 天堂资源在线中文精品| 日韩精品电影一区亚洲| 亚洲一区在线观看免费| 天堂久久一区二区三区| 三级精品在线观看| 青娱乐精品在线视频| 毛片一区二区三区| 五月天精品一区二区三区| 国产成人av福利| 99精品视频一区| 欧美性xxxxxxxx| 欧美日韩精品福利| 日韩免费视频一区二区| 中文字幕综合网| 日本成人在线不卡视频| 国产精品一区二区在线观看不卡| 成人一级视频在线观看| 色拍拍在线精品视频8848|