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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? modelloadermdx.cpp

?? 骨骼動(dòng)畫....把魔獸模型解出的代碼..
?? CPP
?? 第 1 頁 / 共 5 頁
字號(hào):
//+-----------------------------------------------------------------------------
//| 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());

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩1区2区| 欧美日韩在线一区二区| 亚洲444eee在线观看| 久久久精品tv| 91精品黄色片免费大全| www.爱久久.com| 国产乱子轮精品视频| 亚洲第一激情av| 国产精品久久久久久久久晋中 | 亚洲欧洲三级电影| 欧美一级视频精品观看| 欧美中文字幕不卡| 99精品视频在线免费观看| 国产精品亚洲人在线观看| 午夜伊人狠狠久久| 亚洲国产精品一区二区www在线| 国产精品欧美一级免费| 91精品国产综合久久精品麻豆| gogogo免费视频观看亚洲一| 国产一区二区福利| 极品少妇xxxx精品少妇| 青青草原综合久久大伊人精品优势 | 99久久国产免费看| 日韩中文字幕不卡| 亚州成人在线电影| 奇米在线7777在线精品| 日韩精品福利网| 午夜一区二区三区在线观看| 亚洲成人综合在线| 日韩精品一级二级| 视频一区视频二区中文| 日韩福利视频导航| 国产一区二区三区四区五区入口 | 99免费精品视频| 色又黄又爽网站www久久| 91传媒视频在线播放| 日韩欧美一级二级三级久久久| 精品国产一区二区三区忘忧草| 欧美日韩成人一区| 欧美亚洲综合色| 精品成人免费观看| 国产精品家庭影院| 首页综合国产亚洲丝袜| 国产毛片精品视频| 91久久香蕉国产日韩欧美9色| 欧美精品高清视频| 久久久久久久综合狠狠综合| 国产精品精品国产色婷婷| 亚洲午夜国产一区99re久久| 麻豆国产精品视频| 色婷婷综合久久久中文一区二区| 91精品婷婷国产综合久久 | 国内精品国产成人国产三级粉色 | 91精品午夜视频| 精品1区2区在线观看| 久久久久88色偷偷免费| 亚洲精品国产成人久久av盗摄| 韩国女主播一区二区三区| 色先锋久久av资源部| 久久精品亚洲精品国产欧美 | wwwwxxxxx欧美| 亚洲高清视频在线| 色综合天天综合色综合av | 亚洲精品在线免费播放| 五月天久久比比资源色| 欧美视频中文字幕| 亚洲日本在线观看| 波多野结衣在线一区| www欧美成人18+| 久久精品国产久精国产| 91麻豆精品久久久久蜜臀 | 亚洲va欧美va国产va天堂影院| 成人黄色一级视频| 国产精品你懂的在线| 国产精品99久| 国产精品久久久久久久久晋中 | 国产传媒欧美日韩成人| 欧美r级在线观看| 精久久久久久久久久久| 国产亚洲一二三区| 成人黄色软件下载| 一区二区成人在线观看| 5858s免费视频成人| 裸体健美xxxx欧美裸体表演| 日韩一级大片在线| 国产伦精品一区二区三区视频青涩 | 久久综合久色欧美综合狠狠| 久久精品国产久精国产| 国产午夜亚洲精品理论片色戒 | 欧美大片顶级少妇| 国产不卡视频在线播放| 亚洲日本乱码在线观看| 欧美日韩一区二区欧美激情| 日韩精品国产精品| 国产欧美日韩精品一区| 欧美日韩亚州综合| 国产一区二区不卡在线| 亚洲美女一区二区三区| 18成人在线视频| 欧美xxx久久| 国产精品久久毛片a| 久久国产视频网| 6080yy午夜一二三区久久| 中文字幕日韩一区二区| 成人精品国产免费网站| 久久九九全国免费| 国产麻豆视频一区| 精品国产乱码久久久久久1区2区 | 国产精品自拍在线| 日韩精品在线看片z| 免费看欧美美女黄的网站| 欧美日韩日日夜夜| 亚洲成人动漫在线免费观看| 欧美性一二三区| 亚洲综合在线观看视频| 91国偷自产一区二区开放时间| 一区二区三区在线观看欧美 | 欧美成人艳星乳罩| 久久99久久久久| www一区二区| 懂色av一区二区三区免费观看| 久久久久成人黄色影片| 福利视频网站一区二区三区| 国产精品麻豆欧美日韩ww| 色综合色综合色综合色综合色综合 | 调教+趴+乳夹+国产+精品| 欧美日韩的一区二区| 久久精品国产一区二区| 久久久www免费人成精品| 成人免费视频免费观看| 中文字幕亚洲欧美在线不卡| 色丁香久综合在线久综合在线观看| 亚洲美女屁股眼交| 91麻豆精品国产91久久久更新时间| 免费人成在线不卡| 国产精品视频九色porn| 欧美伊人久久大香线蕉综合69| 日韩av电影一区| 久久精品男人天堂av| 日本大香伊一区二区三区| 日本在线不卡视频| 国产精品天干天干在观线| 欧美在线观看你懂的| 美国三级日本三级久久99| 国产亲近乱来精品视频 | 欧美精品一区二区三区蜜臀| 99久久综合精品| 亚洲.国产.中文慕字在线| 久久蜜臀精品av| 欧美中文字幕一二三区视频| 久久99久久久久| 一区二区三区资源| 欧美成人一区二区三区在线观看| 成人午夜视频网站| 日韩黄色免费网站| 国产精品久久久久久久久搜平片| 欧美日韩电影在线| a4yy欧美一区二区三区| 日本三级亚洲精品| 亚洲精品国产第一综合99久久| 欧美成人高清电影在线| 91年精品国产| 国产资源精品在线观看| 亚洲在线成人精品| 国产精品网曝门| 日韩精品中午字幕| 欧美在线免费观看亚洲| 大白屁股一区二区视频| 日本成人在线视频网站| 最新国产精品久久精品| 26uuu久久天堂性欧美| 欧美性色综合网| 99久久国产综合精品麻豆| 国产一区二区三区高清播放| 亚洲电影激情视频网站| 亚洲欧美综合另类在线卡通| 精品奇米国产一区二区三区| 在线国产亚洲欧美| 成人动漫av在线| 经典三级一区二区| 秋霞成人午夜伦在线观看| 亚洲免费在线视频一区 二区| 国产日韩精品视频一区| 精品国产伦一区二区三区观看体验| 欧美性受xxxx| 色婷婷久久久久swag精品| 高清不卡一区二区| 国产在线精品不卡| 蜜臀精品久久久久久蜜臀| 亚洲午夜视频在线| 亚洲欧美日韩国产手机在线| 国产日产精品1区| 久久综合狠狠综合久久激情| 欧美日韩黄视频| 91浏览器打开| 色综合天天综合在线视频| 成人av网在线| 高清shemale亚洲人妖| 国产不卡在线视频| 国产夫妻精品视频|