Skip to content

ChrInfo

_nebula edited this page Oct 25, 2025 · 4 revisions

ChrCntl_ChrInfo_s (.rcb.PS3)

struct ChrCntl_ChrInfo_s
{
  int offsetToRelocationTable;
  int version; // 22 in GF1, 23 in TSG and GF2
  unsigned int nameID[4];
  int numSkeletons;
  EA::CCT::Skeleton *skeletons;
  int numSkeletonFilters;
  EA::CCT::SkeletonFilterRef *skeletonFilterArr;
  EA::CCT::SkeletonFilterMap *skeletonFilterMap; // Always 0?
  ChrCntl_TransitionRulesList *transitionRulesList; // Always 0?
  ChrCntl_NameNodeHash *m_nameNodeHash; // Always 0?
  struct ChrCntl_MotionRefMap *motionRefMap; // Always 0?
  float baseScale;
  int *stateFrameCount; // Always 0?
  ChrCntl_LocatorHeader_s *locatorTable; // Might be one header per skeleton?
  int numReferencedContainers; // Always 0?
  unsigned int *referencedContainerIds; // Always 0?
  int numPoseAdjustments; // Always 0?
  ChrCntl_PoseAdjustment_s *poseAdjustments; // Always 0?
  int numSkeletonBindings; // Always 0?
  ChrCntl_Transform *skeletonBindings; // Always 0?
};

struct EA::CCT::Skeleton
{
  unsigned int nameID;
  char *skeletonName; // Null terminated string
  int numBones;
  EA::CCT::Bone *bones;
  float (*invBindMats)[4][4]; // Each matrix is 64 bytes and there are numBones matrices.
  ChrCntl_IndexLookupEntry_s *boneIndexLookupTable;
};

struct ChrCntl_IndexLookupEntry_s
{
  unsigned int resourceID[4];
  int index;
};

struct EA::CCT::Bone
{
  int parent; // -1 if no parent
  int bindTableIdx; // Always -1?
  int bindSourceIdx; // Always -1?
  int bindType; // Always 1?
};

struct __cppobj EA::CCT::SkeletonFilterRef
{
  int m_ID;
  EA::CCT::SkeletonFilter *m_filter;
};

struct __cppobj EA::CCT::SkeletonFilter
{
  unsigned int *m_buffer;
  int m_boneCount;
};

struct ChrCntl_LocatorHeader_s
{
  int numLocators; // Always 0?
  ChrCntl_Locator_s *locators; // Points to 0x5F5F5F5F padding?
};


Clone this wiki locally