1
0
mirror of https://github.com/zeldaret/oot.git synced 2024-09-21 12:54:51 +00:00
oot/include/z64skin.h
Dragorn421 4e55168eaa
Update ZAPD (#1569)
* git subrepo pull --force tools/ZAPD

subrepo:
  subdir:   "tools/ZAPD"
  merged:   "094e79734"
upstream:
  origin:   "https://github.com/zeldaret/ZAPD.git"
  branch:   "master"
  commit:   "094e79734"
git-subrepo:
  version:  "0.4.6"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "110b9eb"

* Add EnumData.xml where some names are now externalized

* Remove legacy typedefs for zapd, no longer needed!
2023-10-24 21:36:10 -04:00

79 lines
2.5 KiB
C

#ifndef Z64_SKIN_H
#define Z64_SKIN_H
#include "z64animation.h"
/**
* Holds a compact version of a vertex used in the Skin system
* It is used to initialise the Vtx used by an animated limb
*/
typedef struct {
/* 0x00 */ u16 index;
/* 0x02 */ s16 s; // s and t are texture coordinates (also known as u and v)
/* 0x04 */ s16 t;
/* 0x06 */ s8 normX;
/* 0x07 */ s8 normY;
/* 0x08 */ s8 normZ;
/* 0x09 */ u8 alpha;
} SkinVertex; // size = 0xA
/**
* Describes a position displacement and a scale to be applied to a limb at index `limbIndex`
*/
typedef struct {
/* 0x00 */ u8 limbIndex;
/* 0x02 */ s16 x;
/* 0x04 */ s16 y;
/* 0x06 */ s16 z;
/* 0x08 */ u8 scale;
} SkinTransformation; // size = 0xA
typedef struct {
/* 0x00 */ u16 vtxCount; // number of vertices in this modif entry
/* 0x02 */ u16 transformCount;
/* 0x04 */ u16 unk_4; // index of limbTransformations?
/* 0x08 */ SkinVertex* skinVertices;
/* 0x0C */ SkinTransformation* limbTransformations;
} SkinLimbModif; // size = 0x10
typedef struct {
/* 0x00 */ u16 totalVtxCount; // total vertex count for all modif entries
/* 0x02 */ u16 limbModifCount;
/* 0x04 */ SkinLimbModif* limbModifications;
/* 0x08 */ Gfx* dlist;
} SkinAnimatedLimbData; // size = 0xC
#define SKIN_LIMB_TYPE_ANIMATED 4
#define SKIN_LIMB_TYPE_NORMAL 11
typedef struct {
/* 0x00 */ Vec3s jointPos; // Root is position in model space, children are relative to parent
/* 0x06 */ u8 child;
/* 0x07 */ u8 sibling;
/* 0x08 */ s32 segmentType; // Type of data contained in segment
/* 0x0C */ void* segment; // Gfx* if segmentType is SKIN_LIMB_TYPE_NORMAL, SkinAnimatedLimbData* if segmentType is SKIN_LIMB_TYPE_ANIMATED, NULL otherwise
} SkinLimb; // size = 0x10
typedef struct {
/* 0x000 */ u8 index; // alternates every draw cycle
/* 0x004 */ Vtx* buf[2]; // number of vertices in buffer determined by `totalVtxCount`
} SkinLimbVtx; // size = 0xC
typedef struct {
/* 0x000 */ SkeletonHeader* skeletonHeader;
/* 0x004 */ MtxF mtx;
/* 0x044 */ s32 limbCount;
/* 0x048 */ SkinLimbVtx* vtxTable; // double buffered list of vertices for each limb
/* 0x04C */ SkelAnime skelAnime;
} Skin; // size = 0x90
typedef void (*SkinPostDraw)(struct Actor*, struct PlayState*, Skin*);
typedef s32 (*SkinOverrideLimbDraw)(struct Actor*, struct PlayState*, s32, Skin*);
#define SKIN_DRAW_FLAG_CUSTOM_TRANSFORMS (1 << 0)
#define SKIN_DRAW_FLAG_CUSTOM_MATRIX (1 << 1)
#define SKIN_TRANSFORM_IS_FHG 0x23
#endif