Files
FC1/CryAnimation/CrySkinRigidBasis.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

72 lines
2.7 KiB
C++

#ifndef _CRY_ANIMATION_CRY_SKIN_RIGID_BASIS_HDR_
#define _CRY_ANIMATION_CRY_SKIN_RIGID_BASIS_HDR_
#include "CrySkinBase.h"
//////////////////////////////////////////////////////////////////////////
// This is the skin that calculates the tangent bases
// the skin is assumed to be rigid.
// The basises can be flipped, but may not be non-normalized or non-orthogonal
//
// IMPLEMENTATION NOTES:
// each base is represented by the first 2 vectors in the vertex array.
// the 3rd one is the cross-product, optionally negated with the 0x80000000
// flag in the 2nd vertex's nDest field. The 1st vertex contains the destination
// vertex index itself
class CrySkinRigidBasis: public CrySkinBase
{
public:
// returns the size of the skin, the number of bases being calculated
// by this skin. The bases are calculated into a 0-base continuous array
// tangents may be divided into subskins, each having different number of bases
// to skin, based on the performance consideration (strip mining)
unsigned size()const;
// does the skinning out of the given array of global matrices:
// calculates the bases and fills the PipVertices in
void skin (const Matrix44* pBones, SPipTangentsA* pDest)const;
#if defined(_CPU_X86) && !defined(LINUX)
// uses SSE for skinning; NOTE: EVERYTHING must be 16-aligned:
// destination, bones, and the data in this object
void skinSSE (const Matrix44* pBones, SPipTangentsA* pDest)const;
#endif
friend class CrySkinBasisBuilder;
// does the same as the base class init() but also remembers the number of bases (numVerts/2)
// for future reference
void init (unsigned numVerts, unsigned numAux, unsigned numSkipBones, unsigned numBones);
// returns the number of bytes occupied by this structure and all its contained objects
unsigned sizeofThis()const;
friend class CStatistics;
// this structure contains the statistical information about this skin; its calculation
// may take significant time and should not be used in game run time (only for debugging purposes
// and to output statistics in the tools)
class CStatistics: public CrySkinBase::CStatistics
{
public:
CStatistics (const CrySkinRigidBasis* pSkin):
CrySkinBase::CStatistics(pSkin)
{
initSetDests (pSkin);
}
void initSetDests (const CrySkinRigidBasis* pSkin);
void addDest(unsigned nDest);
// destination vertex set
std::set<unsigned> setDests;
// the number of links per each vertex
std::vector<unsigned> arrNumLinks;
};
unsigned Serialize (bool bSave, void* pBuffer, unsigned nBufSize);
protected:
// The size of the skin, the number of bases being calculated
// by this skin. The bases are calculated into a 0-base continuous array
unsigned m_numDestBases;
};
#endif