123
This commit is contained in:
111
ResourceCompilerPC/CrySkinBuilderBase.h
Normal file
111
ResourceCompilerPC/CrySkinBuilderBase.h
Normal file
@@ -0,0 +1,111 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user