⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modelbuilder.cpp

📁 骨骼动画....把魔兽模型解出的代码..
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//+-----------------------------------------------------------------------------
//| Included files
//+-----------------------------------------------------------------------------
#include "ModelBuilder.h"


//+-----------------------------------------------------------------------------
//| Global objects
//+-----------------------------------------------------------------------------
MODEL_BUILDER ModelBuilder;


//+-----------------------------------------------------------------------------
//| Constructor
//+-----------------------------------------------------------------------------
MODEL_BUILDER::MODEL_BUILDER()
{
	//Empty
}


//+-----------------------------------------------------------------------------
//| Destructor
//+-----------------------------------------------------------------------------
MODEL_BUILDER::~MODEL_BUILDER()
{
	//Empty
}


//+-----------------------------------------------------------------------------
//| Sets an error message
//+-----------------------------------------------------------------------------
VOID MODEL_BUILDER::SetErrorMessage(CONST CHAR* ErrorMessage)
{
	Error.SetMessage(ErrorMessage);
}


//+-----------------------------------------------------------------------------
//| Sets the model info
//+-----------------------------------------------------------------------------
VOID MODEL_BUILDER::SetModelInfo(CONST WAR3_MODEL_INFO& ModelInfo)
{
	Model.Data().Info.Version = ModelInfo.Version;
	Model.Data().Info.BlendTime = ModelInfo.BlendTime;

	Model.Data().Info.Name = ModelInfo.Name;
	Model.Data().Info.AnimationFile = ModelInfo.AnimationFile;

	Model.Data().Info.Extent.Radius = ModelInfo.Extent.Radius;
	Model.Data().Info.Extent.Min.x = ModelInfo.Extent.Min.X;
	Model.Data().Info.Extent.Min.y = ModelInfo.Extent.Min.Y;
	Model.Data().Info.Extent.Min.z = ModelInfo.Extent.Min.Z;
	Model.Data().Info.Extent.Max.x = ModelInfo.Extent.Max.X;
	Model.Data().Info.Extent.Max.y = ModelInfo.Extent.Max.Y;
	Model.Data().Info.Extent.Max.z = ModelInfo.Extent.Max.Z;
}


//+-----------------------------------------------------------------------------
//| Creates an attachment
//+-----------------------------------------------------------------------------
BOOL MODEL_BUILDER::CreateAttachment(CONST WAR3_MODEL_ATTACHMENT& Attachment)
{
	MODEL_ATTACHMENT* ModelAttachment;

	ModelAttachment = new MODEL_ATTACHMENT();
	if(ModelAttachment == NULL) return FALSE;

	ModelAttachment->Data().Name = Attachment.Node.Name;
	ModelAttachment->Data().ObjectId = Attachment.Node.ObjectId;
	ModelAttachment->Data().ParentId = Attachment.Node.ParentId;
	ModelAttachment->Data().DontInheritTranslation = Attachment.Node.DontInheritTranslation;
	ModelAttachment->Data().DontInheritRotation = Attachment.Node.DontInheritRotation;
	ModelAttachment->Data().DontInheritScaling = Attachment.Node.DontInheritScaling;
	ModelAttachment->Data().Billboarded = Attachment.Node.Billboarded;
	ModelAttachment->Data().BillboardedLockX = Attachment.Node.BillboardedLockX;
	ModelAttachment->Data().BillboardedLockY = Attachment.Node.BillboardedLockY;
	ModelAttachment->Data().BillboardedLockZ = Attachment.Node.BillboardedLockZ;
	ModelAttachment->Data().CameraAnchored = Attachment.Node.CameraAnchored;

	if(!Model.AddAttachment(ModelAttachment)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Creates a bone
//+-----------------------------------------------------------------------------
BOOL MODEL_BUILDER::CreateBone(CONST WAR3_MODEL_BONE& Bone)
{
	MODEL_BONE* ModelBone;

	ModelBone = new MODEL_BONE();
	if(ModelBone == NULL) return FALSE;

	ModelBone->Data().Name = Bone.Node.Name;
	ModelBone->Data().ObjectId = Bone.Node.ObjectId;
	ModelBone->Data().ParentId = Bone.Node.ParentId;
	ModelBone->Data().DontInheritTranslation = Bone.Node.DontInheritTranslation;
	ModelBone->Data().DontInheritRotation = Bone.Node.DontInheritRotation;
	ModelBone->Data().DontInheritScaling = Bone.Node.DontInheritScaling;
	ModelBone->Data().Billboarded = Bone.Node.Billboarded;
	ModelBone->Data().BillboardedLockX = Bone.Node.BillboardedLockX;
	ModelBone->Data().BillboardedLockY = Bone.Node.BillboardedLockY;
	ModelBone->Data().BillboardedLockZ = Bone.Node.BillboardedLockZ;
	ModelBone->Data().CameraAnchored = Bone.Node.CameraAnchored;

	ModelBone->Data().GeosetId = Bone.GeosetId;
	ModelBone->Data().GeosetAnimationId = Bone.GeosetAnimationId;

	if(!Model.AddBone(ModelBone)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Creates a collision shape
//+-----------------------------------------------------------------------------
BOOL MODEL_BUILDER::CreateCollisionShape(CONST WAR3_MODEL_COLLISION_SHAPE& CollisionShape)
{
	MODEL_COLLISION_SHAPE* ModelCollisionShape;

	ModelCollisionShape = new MODEL_COLLISION_SHAPE();
	if(ModelCollisionShape == NULL) return FALSE;

	ModelCollisionShape->Data().Name = CollisionShape.Node.Name;
	ModelCollisionShape->Data().ObjectId = CollisionShape.Node.ObjectId;
	ModelCollisionShape->Data().ParentId = CollisionShape.Node.ParentId;
	ModelCollisionShape->Data().DontInheritTranslation = CollisionShape.Node.DontInheritTranslation;
	ModelCollisionShape->Data().DontInheritRotation = CollisionShape.Node.DontInheritRotation;
	ModelCollisionShape->Data().DontInheritScaling = CollisionShape.Node.DontInheritScaling;
	ModelCollisionShape->Data().Billboarded = CollisionShape.Node.Billboarded;
	ModelCollisionShape->Data().BillboardedLockX = CollisionShape.Node.BillboardedLockX;
	ModelCollisionShape->Data().BillboardedLockY = CollisionShape.Node.BillboardedLockY;
	ModelCollisionShape->Data().BillboardedLockZ = CollisionShape.Node.BillboardedLockZ;
	ModelCollisionShape->Data().CameraAnchored = CollisionShape.Node.CameraAnchored;

	ModelCollisionShape->Data().Type = static_cast<COLLISION_SHAPE_TYPE>(CollisionShape.Type);
	ModelCollisionShape->Data().BoundsRadius = CollisionShape.Radius;
	ModelCollisionShape->Data().VertexList.push_back(D3DXVECTOR3(CollisionShape.Vertex1.X, CollisionShape.Vertex1.Y, CollisionShape.Vertex1.Z));
	if(ModelCollisionShape->Data().Type == COLLISION_SHAPE_TYPE_BOX) ModelCollisionShape->Data().VertexList.push_back(D3DXVECTOR3(CollisionShape.Vertex2.X, CollisionShape.Vertex2.Y, CollisionShape.Vertex2.Z));

	if(!Model.AddCollisionShape(ModelCollisionShape)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Creates an event object
//+-----------------------------------------------------------------------------
BOOL MODEL_BUILDER::CreateEventObject(CONST WAR3_MODEL_EVENT_OBJECT& EventObject)
{
	MODEL_EVENT_OBJECT* ModelEventObject;

	ModelEventObject = new MODEL_EVENT_OBJECT();
	if(ModelEventObject == NULL) return FALSE;

	ModelEventObject->Data().Name = EventObject.Node.Name;
	ModelEventObject->Data().ObjectId = EventObject.Node.ObjectId;
	ModelEventObject->Data().ParentId = EventObject.Node.ParentId;
	ModelEventObject->Data().DontInheritTranslation = EventObject.Node.DontInheritTranslation;
	ModelEventObject->Data().DontInheritRotation = EventObject.Node.DontInheritRotation;
	ModelEventObject->Data().DontInheritScaling = EventObject.Node.DontInheritScaling;
	ModelEventObject->Data().Billboarded = EventObject.Node.Billboarded;
	ModelEventObject->Data().BillboardedLockX = EventObject.Node.BillboardedLockX;
	ModelEventObject->Data().BillboardedLockY = EventObject.Node.BillboardedLockY;
	ModelEventObject->Data().BillboardedLockZ = EventObject.Node.BillboardedLockZ;
	ModelEventObject->Data().CameraAnchored = EventObject.Node.CameraAnchored;

	ModelEventObject->Data().GlobalSequenceId = EventObject.GlobalSequenceId;

	if(!Model.AddEventObject(ModelEventObject)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Creates a helper
//+-----------------------------------------------------------------------------
BOOL MODEL_BUILDER::CreateHelper(CONST WAR3_MODEL_HELPER& Helper)
{
	MODEL_HELPER* ModelHelper;

	ModelHelper = new MODEL_HELPER();
	if(ModelHelper == NULL) return FALSE;

	ModelHelper->Data().Name = Helper.Node.Name;
	ModelHelper->Data().ObjectId = Helper.Node.ObjectId;
	ModelHelper->Data().ParentId = Helper.Node.ParentId;
	ModelHelper->Data().DontInheritTranslation = Helper.Node.DontInheritTranslation;
	ModelHelper->Data().DontInheritRotation = Helper.Node.DontInheritRotation;
	ModelHelper->Data().DontInheritScaling = Helper.Node.DontInheritScaling;
	ModelHelper->Data().Billboarded = Helper.Node.Billboarded;
	ModelHelper->Data().BillboardedLockX = Helper.Node.BillboardedLockX;
	ModelHelper->Data().BillboardedLockY = Helper.Node.BillboardedLockY;
	ModelHelper->Data().BillboardedLockZ = Helper.Node.BillboardedLockZ;
	ModelHelper->Data().CameraAnchored = Helper.Node.CameraAnchored;

	if(!Model.AddHelper(ModelHelper)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Creates a light
//+-----------------------------------------------------------------------------
BOOL MODEL_BUILDER::CreateLight(CONST WAR3_MODEL_LIGHT& Light)
{
	MODEL_LIGHT* ModelLight;

	ModelLight = new MODEL_LIGHT();
	if(ModelLight == NULL) return FALSE;

	ModelLight->Data().Name = Light.Node.Name;
	ModelLight->Data().ObjectId = Light.Node.ObjectId;
	ModelLight->Data().ParentId = Light.Node.ParentId;
	ModelLight->Data().DontInheritTranslation = Light.Node.DontInheritTranslation;
	ModelLight->Data().DontInheritRotation = Light.Node.DontInheritRotation;
	ModelLight->Data().DontInheritScaling = Light.Node.DontInheritScaling;
	ModelLight->Data().Billboarded = Light.Node.Billboarded;
	ModelLight->Data().BillboardedLockX = Light.Node.BillboardedLockX;
	ModelLight->Data().BillboardedLockY = Light.Node.BillboardedLockY;
	ModelLight->Data().BillboardedLockZ = Light.Node.BillboardedLockZ;
	ModelLight->Data().CameraAnchored = Light.Node.CameraAnchored;

	ModelLight->Data().Type = Light.Type;

	ModelLight->Data().Visibility.SetStaticScalar(Light.Visibility);
	ModelLight->Data().AttenuationStart.SetStaticScalar(Light.AttenuationStart);
	ModelLight->Data().AttenuationEnd.SetStaticScalar(Light.AttenuationEnd);
	ModelLight->Data().Intensity.SetStaticScalar(Light.Intensity);
	ModelLight->Data().AmbientIntensity.SetStaticScalar(Light.AmbientIntensity);
	ModelLight->Data().Color.SetStaticVector3(D3DXVECTOR3(Light.Color.B, Light.Color.G, Light.Color.R));
	ModelLight->Data().AmbientColor.SetStaticVector3(D3DXVECTOR3(Light.AmbientColor.B, Light.AmbientColor.G, Light.AmbientColor.R));

	if(!Model.AddLight(ModelLight)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Creates a particle emitter
//+-----------------------------------------------------------------------------
BOOL MODEL_BUILDER::CreateParticleEmitter(CONST WAR3_MODEL_PARTICLE_EMITTER& ParticleEmitter)
{
	MODEL_PARTICLE_EMITTER* ModelParticleEmitter;

	ModelParticleEmitter = new MODEL_PARTICLE_EMITTER();
	if(ModelParticleEmitter == NULL) return FALSE;

	ModelParticleEmitter->Data().Name = ParticleEmitter.Node.Name;
	ModelParticleEmitter->Data().ObjectId = ParticleEmitter.Node.ObjectId;
	ModelParticleEmitter->Data().ParentId = ParticleEmitter.Node.ParentId;
	ModelParticleEmitter->Data().DontInheritTranslation = ParticleEmitter.Node.DontInheritTranslation;
	ModelParticleEmitter->Data().DontInheritRotation = ParticleEmitter.Node.DontInheritRotation;
	ModelParticleEmitter->Data().DontInheritScaling = ParticleEmitter.Node.DontInheritScaling;
	ModelParticleEmitter->Data().Billboarded = ParticleEmitter.Node.Billboarded;
	ModelParticleEmitter->Data().BillboardedLockX = ParticleEmitter.Node.BillboardedLockX;
	ModelParticleEmitter->Data().BillboardedLockY = ParticleEmitter.Node.BillboardedLockY;
	ModelParticleEmitter->Data().BillboardedLockZ = ParticleEmitter.Node.BillboardedLockZ;
	ModelParticleEmitter->Data().CameraAnchored = ParticleEmitter.Node.CameraAnchored;

	ModelParticleEmitter->Data().EmissionRate.SetStaticScalar(ParticleEmitter.EmissionRate);
	ModelParticleEmitter->Data().Gravity.SetStaticScalar(ParticleEmitter.Gravity);
	ModelParticleEmitter->Data().Longitude.SetStaticScalar(ParticleEmitter.Longitude);
	ModelParticleEmitter->Data().Latitude.SetStaticScalar(ParticleEmitter.Latitude);
	ModelParticleEmitter->Data().Visibility.SetStaticScalar(ParticleEmitter.Visibility);

	ModelParticleEmitter->Data().ParticleFileName = ParticleEmitter.ParticleFileName;
	ModelParticleEmitter->Data().ParticleLifeSpan.SetStaticScalar(ParticleEmitter.ParticleLifeSpan);
	ModelParticleEmitter->Data().ParticleInitialVelocity.SetStaticScalar(ParticleEmitter.ParticleInitialVelocity);

	ModelParticleEmitter->Data().EmitterUsesMdl = ParticleEmitter.EmitterUsesMdl;
	ModelParticleEmitter->Data().EmitterUsesTga = ParticleEmitter.EmitterUsesTga;

	if(!Model.AddParticleEmitter(ModelParticleEmitter)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Creates a particle emitter 2
//+-----------------------------------------------------------------------------
BOOL MODEL_BUILDER::CreateParticleEmitter2(CONST WAR3_MODEL_PARTICLE_EMITTER_2& ParticleEmitter2)
{
	MODEL_PARTICLE_EMITTER_2* ModelParticleEmitter2;

	ModelParticleEmitter2 = new MODEL_PARTICLE_EMITTER_2();
	if(ModelParticleEmitter2 == NULL) return FALSE;

	ModelParticleEmitter2->Data().Name = ParticleEmitter2.Node.Name;
	ModelParticleEmitter2->Data().ObjectId = ParticleEmitter2.Node.ObjectId;
	ModelParticleEmitter2->Data().ParentId = ParticleEmitter2.Node.ParentId;
	ModelParticleEmitter2->Data().DontInheritTranslation = ParticleEmitter2.Node.DontInheritTranslation;
	ModelParticleEmitter2->Data().DontInheritRotation = ParticleEmitter2.Node.DontInheritRotation;
	ModelParticleEmitter2->Data().DontInheritScaling = ParticleEmitter2.Node.DontInheritScaling;
	ModelParticleEmitter2->Data().Billboarded = ParticleEmitter2.Node.Billboarded;
	ModelParticleEmitter2->Data().BillboardedLockX = ParticleEmitter2.Node.BillboardedLockX;
	ModelParticleEmitter2->Data().BillboardedLockY = ParticleEmitter2.Node.BillboardedLockY;
	ModelParticleEmitter2->Data().BillboardedLockZ = ParticleEmitter2.Node.BillboardedLockZ;
	ModelParticleEmitter2->Data().CameraAnchored = ParticleEmitter2.Node.CameraAnchored;

	ModelParticleEmitter2->Data().FilterMode = static_cast<FILTER_MODE>(ParticleEmitter2.FilterMode);

	ModelParticleEmitter2->Data().Speed.SetStaticScalar(ParticleEmitter2.Speed);
	ModelParticleEmitter2->Data().Variation.SetStaticScalar(ParticleEmitter2.Variation);
	ModelParticleEmitter2->Data().Latitude.SetStaticScalar(ParticleEmitter2.Latitude);
	ModelParticleEmitter2->Data().Gravity.SetStaticScalar(ParticleEmitter2.Gravity);
	ModelParticleEmitter2->Data().Visibility.SetStaticScalar(ParticleEmitter2.Visibility);
	ModelParticleEmitter2->Data().EmissionRate.SetStaticScalar(ParticleEmitter2.EmissionRate);
	ModelParticleEmitter2->Data().Width.SetStaticScalar(ParticleEmitter2.Width);
	ModelParticleEmitter2->Data().Length.SetStaticScalar(ParticleEmitter2.Length);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -