📄 m2animation.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 + -