111 lines
3.5 KiB
C++
111 lines
3.5 KiB
C++
#ifndef _CRY_ANIMATION_CRY_SKIN_BUILDER_BASE_HDR_
|
|
#define _CRY_ANIMATION_CRY_SKIN_BUILDER_BASE_HDR_
|
|
|
|
#include "CrySkinTypes.h"
|
|
#include "CryVertexBinding.h"
|
|
|
|
// This interface presents all the necessary information to the skin builders
|
|
// the actual skinned info can actually be vertices or normals - doesn't really matter
|
|
class ICrySkinSource
|
|
{
|
|
public:
|
|
// this structure is initialized through the constructor
|
|
ICrySkinSource (
|
|
const CryVertexBinding* pLinks,
|
|
unsigned numLinks,
|
|
const Vec3* pVertices,
|
|
unsigned numVertices,
|
|
const TangData* pExtTangents,
|
|
unsigned numExtTangents,
|
|
const unsigned* pExtToIntMapping
|
|
):
|
|
m_pLinks (pLinks),
|
|
m_numLinks (numLinks),
|
|
m_pVertices (pVertices),
|
|
m_numVertices (numVertices),
|
|
m_pExtTangents (pExtTangents),
|
|
m_numExtTangents (numExtTangents),
|
|
m_pExtToIntMapping (pExtToIntMapping)
|
|
{}
|
|
unsigned numVertices()const {return m_numVertices;}
|
|
const Vec3& getVertex (unsigned i)const {return m_pVertices[i];}
|
|
unsigned numLinks() const {return m_numLinks;}
|
|
const CryVertexBinding& getLink (unsigned i) const {return m_pLinks[i];}
|
|
unsigned numExtTangents() const {return m_numExtTangents;}
|
|
const unsigned *getExtToIntMapEntries()const {return m_pExtToIntMapping;}
|
|
const TangData& getExtTangent(unsigned i)const {return m_pExtTangents[i];}
|
|
protected:
|
|
// this needs to be filled in by the derived class
|
|
unsigned m_numLinks;
|
|
const CryVertexBinding* m_pLinks;
|
|
unsigned m_numVertices;
|
|
const Vec3* m_pVertices;
|
|
const TangData* m_pExtTangents;
|
|
unsigned m_numExtTangents;
|
|
const unsigned* m_pExtToIntMapping;
|
|
};
|
|
|
|
class CrySkinBuilderBase0
|
|
{
|
|
public:
|
|
CrySkinBuilderBase0(const class ICrySkinSource* pGeometry):
|
|
m_pGeometry (pGeometry)
|
|
{}
|
|
|
|
typedef CrySkinVertexAligned Vertex;
|
|
|
|
struct CrySkinStreams
|
|
{
|
|
CrySkinAuxInt* pAux;
|
|
Vertex* pVert;
|
|
};
|
|
protected:
|
|
const ICrySkinSource* m_pGeometry;
|
|
};
|
|
|
|
class CrySkinBuilderBase: public CrySkinBuilderBase0
|
|
{
|
|
public:
|
|
protected:
|
|
CrySkinBuilderBase(const class ICrySkinSource* pGeometry);
|
|
|
|
// Calculates the total number of links per all vertices. If the whole object is rigid,
|
|
// the number of links is the same as the number of vertices.
|
|
// Also calculates the sets of vertices belonging to each bone
|
|
// calculates the max number of bone affecting a vertex + 1
|
|
// and the total number of links to smooth vertices - the sum of numbers of links of all smooth vertices
|
|
void preprocess();
|
|
|
|
// calculates the vertex list of each bone, for all vertices present in the geometry
|
|
void makeFullBoneVertexArrays();
|
|
|
|
// fills in the group of aux ints for the given bone (the rigid vertex group)
|
|
// returns the pointer to the next available auxint after the group
|
|
void fillRigidGroup (CrySkinStreams& streams, unsigned nBone);
|
|
|
|
protected:
|
|
|
|
// precalculated numbers
|
|
unsigned m_numLinks; // total number of links (number of aligned vertex structures)
|
|
unsigned m_numBones; // number of bones affecting the skin, in the original array (max bone id + 1)
|
|
unsigned m_numSmoothLinks; // number of smooth links
|
|
|
|
// the sets of vertices belonging to each bone
|
|
typedef std::vector< CrySkinRigidVertex > CrySkinRigidVertexArray;
|
|
typedef std::vector< CrySkinSmoothVertex > CrySkinSmoothVertexArray;
|
|
struct BoneVertexGroup
|
|
{
|
|
CrySkinRigidVertexArray arrRigid;
|
|
CrySkinSmoothVertexArray arrSmooth;
|
|
bool empty() const{return arrRigid.empty() && arrSmooth.empty();}
|
|
void reserve (unsigned numReserve)
|
|
{
|
|
arrRigid.reserve (numReserve/2);
|
|
arrSmooth.reserve (numReserve/2);
|
|
}
|
|
};
|
|
typedef std::vector< BoneVertexGroup > BoneVertexArray;
|
|
BoneVertexArray m_arrBoneVerts;
|
|
};
|
|
|
|
#endif |