0ad/source/graphics/ModelDef.h
Ykkrosh 173c56140c # Fixed skeletal animation algorithm.
* Skinning is done in a way that works when there's more than one bone
influencing a vertex.
 * PMDs now store vertexes in world-space instead of bind-space. (The
loader converts the old-version PMDs so they still work.)
 * Moved SkinPoint, SkinNormal into CModelDef so it could use them when
loading the old PMDs.
 * Made the FastNormals approach non-optional, so the inverse-transpose
bone matrices could be removed. Changed the explanation of why it's a
valid approach.
 * Quaternion: Made GetInverse assume that the quaternions have unit
length (which they do when they're representing 3D rotations).
 * lib: Added support for DDS files that aren't a multiple of 4x4 (most
useful for 1x1, 2x2, etc that are still powers of two).
 * Actor Viewer: Added white terrain texture to the minimal test mod, so
shadows are visible. Changed default so walk/run animations don't move
the unit along the ground.
 * Removed some redundant repetition in doc comments.
 * Removed some unnecessary #includes.

This was SVN commit r4696.
2006-12-15 16:09:30 +00:00

192 lines
5.1 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Name: ModelDef.h
// Author: Rich Cross
// Contact: rich@wildfiregames.com
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _MODELDEF_H
#define _MODELDEF_H
#include "ps/CStr.h"
#include "maths/Vector3D.h"
#include "maths/Quaternion.h"
#include <map>
class CMeshManager;
class CModelDef;
class CBoneState;
///////////////////////////////////////////////////////////////////////////////
// SPropPoint: structure describing a prop point
struct SPropPoint
{
// name of the prop point
CStr m_Name;
// position of the point
CVector3D m_Position;
// rotation of the point
CQuaternion m_Rotation;
// object to parent space transformation
CMatrix3D m_Transform;
// index of parent bone; 0xff if unboned
u8 m_BoneIndex;
};
///////////////////////////////////////////////////////////////////////////////
// SVertexBlend: structure containing the necessary data for blending vertices
// with multiple bones
struct SVertexBlend
{
enum { SIZE = 4 };
// index of the influencing bone, or 0xff if none
u8 m_Bone[SIZE];
// weight of the influence; all weights sum to 1
float m_Weight[SIZE];
};
///////////////////////////////////////////////////////////////////////////////
// SModelVertex: structure containing per-vertex data
struct SModelVertex
{
// vertex position
CVector3D m_Coords;
// vertex normal
CVector3D m_Norm;
// vertex UVs
float m_U, m_V;
// vertex blend data
SVertexBlend m_Blend;
};
///////////////////////////////////////////////////////////////////////////////
// SModelFace: structure containing per-face data
struct SModelFace
{
// indices of the 3 vertices on this face
u16 m_Verts[3];
};
////////////////////////////////////////////////////////////////////////////////////////
// CModelDefRPrivate
class CModelDefRPrivate
{
public:
CModelDefRPrivate() { }
virtual ~CModelDefRPrivate() { }
};
////////////////////////////////////////////////////////////////////////////////////////
// CModelDef: a raw 3D model; describes the vertices, faces, skinning and skeletal
// information of a model
class CModelDef
{
friend class CMeshManager;
public:
// current file version given to saved animations
enum { FILE_VERSION = 3 };
// supported file read version - files with a version less than this will be rejected
enum { FILE_READ_VERSION = 1 };
public:
// constructor
CModelDef();
// destructor
virtual ~CModelDef();
// model I/O functions
static void Save(const char* filename,const CModelDef* mdef);
public:
// accessor: get vertex data
size_t GetNumVertices() const { return (size_t)m_NumVertices; }
SModelVertex* GetVertices() const { return m_pVertices; }
// accessor: get face data
size_t GetNumFaces() const { return (size_t)m_NumFaces; }
SModelFace* GetFaces() const { return m_pFaces; }
// accessor: get bone data
size_t GetNumBones() const { return (size_t)m_NumBones; }
CBoneState* GetBones() const { return m_Bones; }
// accessor: get prop data
int GetNumPropPoints() const { return m_NumPropPoints; }
SPropPoint* GetPropPoints() const { return m_PropPoints; }
// find and return pointer to prop point matching given name; return
// null if no match (case insensitive search)
SPropPoint* FindPropPoint(const char* name) const;
/**
* Transform the given vertex's position from the bind pose into the new pose.
*
* @return new world-space vertex coordinates
*/
static CVector3D SkinPoint(const SModelVertex& vtx,
const CMatrix3D newPoseMatrices[], const CMatrix3D inverseBindMatrices[]);
/**
* Transform the given vertex's normal from the bind pose into the new pose.
*
* @return new world-space vertex normal
*/
static CVector3D SkinNormal(const SModelVertex& vtx,
const CMatrix3D newPoseMatrices[], const CMatrix3D inverseBindMatrices[]);
/**
* Register renderer private data. Use the key to
* distinguish between private data used by different render paths.
* The private data will be managed by this CModelDef object:
* It will be deleted when CModelDef is destructed or when private
* data is registered using the same key.
*
* @param key The opaque key that is used to identify the caller.
* The given private data can be retrieved by passing key to GetRenderData.
* @param data The private data.
*
* postconditions : data is bound to the lifetime of this CModelDef
* object.
*/
void SetRenderData(const void* key, CModelDefRPrivate* data);
// accessor: render data
CModelDefRPrivate* GetRenderData(const void* key) const;
// accessor: get model name (for debugging)
const CStr& GetName() const { return m_Name; }
public:
// vertex data
u32 m_NumVertices;
SModelVertex* m_pVertices;
// face data
u32 m_NumFaces;
SModelFace* m_pFaces;
// bone data - default model pose
u32 m_NumBones;
CBoneState* m_Bones;
// prop point data
u32 m_NumPropPoints;
SPropPoint* m_PropPoints;
private:
// filename
CStr m_Name;
// renderdata shared by models of the same modeldef,
// by render path
typedef std::map<const void*, CModelDefRPrivate*> RenderDataMap;
RenderDataMap m_RenderData;
protected:
static CModelDef* Load(const char* filename);
};
#endif