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

📄 m2animation.h

📁 3D游戏展示程序
💻 H
字号:
//--------------------------------------------------
//  Desc: Bone Animation Interpolate
//  Date: 2007.4.3 /update
//  Author: Artsylee
//
//  From: WOW Model Viewer
//  I just coding in my own ways!
//
//--------------------------------------------------

#ifndef _M2ANIMATION_
#define _M2ANIMATION_

#include "M2Header.h"
#include "Interpolate.h"

extern D3DXVECTOR3 FixCoordSystemVector(const D3DXVECTOR3 &v);
extern D3DXVECTOR3 FixCoordSystemScale(const D3DXVECTOR3 &v);
extern Quaternion  FixCoordSystemQuat(const Quaternion &v);

#define M2FVF D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1
struct M2Vertex
{
	M2Vertex()	{}
	M2Vertex(const D3DXVECTOR3 &pos, const D3DXVECTOR3 &normal, const D3DXVECTOR2 &texcoord)
	{
		m_position = pos;
		m_normal = normal;
		m_texcoord = texcoord;
	}
	D3DXVECTOR3 m_position;
	D3DXVECTOR3 m_normal;
	D3DXVECTOR2 m_texcoord;
};

#define M2BOUNDFVF D3DFVF_XYZ | D3DFVF_DIFFUSE
struct M2BoundVertex
{
	M2BoundVertex()	{}
	M2BoundVertex(const D3DXVECTOR3 &pos, DWORD dwColor = 0xffffffff)
	{
		m_position = pos;
		m_color = dwColor;
	}
	void SetVertex(const D3DXVECTOR3 &pos, DWORD dwColor = 0xffffffff)
	{
		m_position = pos;
		m_color = dwColor;
	}
	D3DXVECTOR3 m_position;
	DWORD m_color;
};

enum BoneTable 
{
	//Block F - Bone lookup table.
	//---------------------------------
	BONE_LARM = 0,		// 0, Left upper arm
	BONE_RARM,			// 1, Right upper arm
	BONE_LSHOULDER,		// 2, Left Shoulder / deltoid area
	BONE_RSHOULDER,		// 3, Right Shoulder / deltoid area
	BONE_STOMACH,		// 4, (upper?) abdomen
	BONE_WAIST,			// 5, (lower abdomen?) waist
	BONE_HEAD,			// 6, head
	BONE_JAW,			// 7, jaw/mouth
	BONE_RFINGER1,		// 8, (Trolls have 3 "fingers", this points to the 2nd one.
	BONE_RFINGER2,		// 9, center finger - only used by dwarfs.. don't know why
	BONE_RFINGER3,		// 10, (Trolls have 3 "fingers", this points to the 3rd one.
	BONE_RFINGERS,		// 11, Right fingers -- this is -1 for trolls, they have no fingers, only the 3 thumb like thingys
	BONE_RTHUMB,		// 12, Right Thumb
	BONE_LFINGER1,		// 13, (Trolls have 3 "fingers", this points to the 2nd one.
	BONE_LFINGER2,		// 14, Center finger - only used by dwarfs.
	BONE_LFINGER3,		// 15, (Trolls have 3 "fingers", this points to the 3rd one.
	BONE_LFINGERS,		// 16, Left fingers
	BONE_LTHUMB,		// 17, Left Thumb
	UnK19,	// ?
	UnK20,	// ?
	UnK21,	// ?
	UnK22,	// ?
	UnK23,	// ?
	UnK24,	// ?
	UnK25,	// ?
	UnK26,	// ?
	BONE_ROOT			// 26, The "Root" bone,  this controls rotations, transformations, etc of the whole model and all subsequent bones.
};

struct M2Bone 
{
	Animated<D3DXVECTOR3>	m_Trans;
	Animated<Quaternion>	m_Rotate;
	Animated<D3DXVECTOR3>	m_Scale;

	D3DXVECTOR3	m_Point;
	D3DXVECTOR3	m_TransPoint;
	int			m_Parent;

	bool		m_bBillboard;
	bool		m_bCalc;

	D3DXMATRIX	m_matTrans;
	D3DXMATRIX	m_matRotate;

	void CalcMatrix(M2Bone *pBone, int animIndex, int curtime, bool bRotate=true);
	void Init(uint8 *pData, ModelBoneDef &bone, int *pGlobalSequence);
};

struct M2Color
{
	Animated<D3DXVECTOR3>	m_Color;
	AnimatedShort			m_Opacity;
	void Init(uint8 *pData, ModelColorDef &colordef, int *pGlobalSequence);
};

struct M2Transparency
{
	AnimatedShort m_Transparency;
	void Init(uint8 *pData, ModelTransDef &transdef, int *pGlobalSequence);
};

struct M2Texture
{
};

struct M2Attachment
{
	int			m_Id;
	D3DXVECTOR3 m_Position;
	int			m_Bone;

	void Init(const ModelAttachmentDef &attachment);
	int GetBoneIndex(void)	{	return m_Bone;	}
	D3DXMATRIX* GetMatrix(D3DXMATRIX *pOut, D3DXMATRIX *pBone);
};

struct M2Camera
{
	bool	m_bInit;
	float	m_Nearclip;
	float	m_Farclip;
	float	m_Fov;

	D3DXVECTOR3 m_Position;
	D3DXVECTOR3 m_Target;

	Animated<D3DXVECTOR3> m_ToPos;
	Animated<D3DXVECTOR3> m_ToTarget;
	Animated<float> m_Rotate;

	void Init(uint8 *pData, ModelCameraDef &camera, int *pGlobalSequence);
	void Setup(int time = 0);

	M2Camera():m_bInit(false) {}
};

struct M2Light
{
};

enum M2BlendMode
{
	BM_OPAQUE,
	BM_TRANSPARENT,
	BM_ALPHA_BLEND,
	BM_ADDITIVE,
	BM_ADDITIVE_ALPHA,
	BM_MODULATE,
	BM_MODULATEX2
};

class CM2Loader;
struct M2RenderPass
{
	uint16 m_IndexStart;
	uint16 m_IndexCount;
	uint16 m_VertexStart;
	uint16 m_VertexCount;

	bool m_bCull;
	bool m_bUnLight;
	bool m_bNoZWrite;
	bool m_bSwrap;
	bool m_bTwrap;
	bool m_bTrans;

	int m_TextureIndex;
	bool useTex2, useEnvMap;
	float p;

	int16 m_Texanim;
	int16 m_Color;
	int16 m_Opacity;
	int16 m_BlendMode;
	uint16 m_RenderOrder;

	// Geoset ID
	int m_SubMeshIndex;

	// colours
//	Vec4D ocol, ecol;

	bool OpenState(CM2Loader *m);
	void CloseState();

	bool operator<(const M2RenderPass &m) const
	{
		if(m_RenderOrder<m.m_RenderOrder)
			return true;
		else if(m_RenderOrder>m.m_RenderOrder)
			return false;
		else
			return m_BlendMode == m.m_BlendMode ? (p<m.p) : (m_BlendMode<m.m_BlendMode);
	}
};


#endif // _M2ANIMATION_

⌨️ 快捷键说明

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