sm64/include/hierarchy.h

650 lines
16 KiB
C

/********************************************************************************
hierarchy.h: Ultra 64 MARIO Brothers include file
Copyright (c) 1996 Nintendo co., ltd. All rights reserved
May 9, 1996
********************************************************************************/
#ifndef HIERARCHY_H
#define HIERARCHY_H
/* node code */
#define MAP_TYPE_CBACK 0x100
#define MAP_NODE 0
#define MAP_NODE_SCENE 1
#define MAP_NODE_ORTHO 2
#define MAP_NODE_PERSP 3 + MAP_TYPE_CBACK
#define MAP_NODE_LAYER 4
#define MAP_NODE_GROUP 10
#define MAP_NODE_LOD 11
#define MAP_NODE_SELECT 12 + MAP_TYPE_CBACK
#define MAP_NODE_AREA 13
#define MAP_NODE_CAMERA 20 + MAP_TYPE_CBACK
#define MAP_NODE_COORD 21
#define MAP_NODE_TRANS 22
#define MAP_NODE_ROTATE 23
#define MAP_NODE_SHAPE 24
#define MAP_NODE_JOINT 25
#define MAP_NODE_BBOARD 26
#define MAP_NODE_GFX 27
#define MAP_NODE_SCALE 28
#define MAP_NODE_MATRIX 29
#define MAP_NODE_SHADOW 40
#define MAP_NODE_BRANCH 41
#define MAP_NODE_CPROG 42 + MAP_TYPE_CBACK
#define MAP_NODE_CLEAR 44 + MAP_TYPE_CBACK
#define MAP_NODE_PRINT 45
#define MAP_NODE_SUCKER 46 + MAP_TYPE_CBACK
#define MAP_NODE_HEADER 47
/* flag of node */
#define MAP_FLAG_ENABLE (1<<0)
#define MAP_FLAG_THROUGH (1<<1)
#define MAP_FLAG_BBOARD (1<<2)
#define MAP_FLAG_ZBUFFER (1<<3)
#define MAP_FLAG_HIDESHAPE (1<<4)
#define MAP_FLAG_ANIMESW (1<<5)
/* flag of call back routine */
#define MAP_CBACK_INIT 0
#define MAP_CBACK_EXEC 1
#define MAP_CBACK_INITIAL 0
#define MAP_CBACK_EXECUTE 1
#define MAP_CBACK_SUSPEND 2
#define MAP_CBACK_ACTIVAT 3
#define MAP_CBACK_ACTIVATE 3
#define MAP_CBACK_DISPOSE 4
#define MAP_CBACK_MATRIX 5
/* flag of skeleton animation */
#define MAP_ANIM_NORMAL 0x00
#define MAP_ANIM_ONETIME 0x01
#define MAP_ANIM_REVERSE 0x02
#define MAP_ANIM_FREEZE 0x04
#define MAP_ANIM_TRVERTI 0x08
#define MAP_ANIM_TRPLANE 0x10
#define MAP_ANIM_FIXSHADOW 0x20
#define MAP_ANIM_NOTRANS 0x40
#ifndef ASSEMBLER
/*--------------------------------------------------------------------------------
* Skeleton animation record
*/
typedef struct {
short attr; /* attribute */
short hbase; /* height base */
short start; /* start frame number */
short loop; /* loop frame number */
short nframes; /* number of frames */
short njoints; /* number of joiunts */
short *param; /* pointer to the parameters */
ushort *table; /* pointer to the animation */
long size; /* size of animation data */
} AnimeRecord, *AnimePtr;
typedef struct {
AnimeRecord *info;
char *head;
char *tail;
} AnimeList;
typedef struct {
short animeID; /* animation ID */
short height; /* shape height */
AnimePtr anime; /* pointer to the animation record */
short frame; /* animation frame counter (integer) */
ushort stamp; /* time stamp */
long vframe; /* frame counter for variable speed */
long vspeed; /* animation speed */
} SkelAnime;
/*-------------------------------------------------------------------------------
* Map hierarchy base structures.
*/
typedef struct map_node MapNode, MapGroup;
typedef ulong (*MapCBack)(int code, MapNode *node, void *data);
struct map_node {
short type; /* node type */
short flags; /* flags */
MapNode *prev; /* pointer to the prev sibling node */
MapNode *next; /* pointer to the next sibling node */
MapNode *parent; /* pointer to the parent node */
MapNode *child; /* pointer to the child node */
};
/*-------------------------------------------------------------------------------
* Shape information structure.
*/
typedef struct map_actor ActorRecord, *ActorPtr;
struct map_actor {
SVector position; /* shape initial position */
SVector angle; /* shape initial angle */
char sceneNo; /* scene number */
char actorID; /* actor ID code */
ushort scale; /* object scale */
ulong code; /* shape discription code */
ulong *strategy; /* pointer to the strategy */
MapNode *shape; /* pointer to the shape */
ActorRecord *next; /* pointer to the next shape */
};
/*-------------------------------------------------------------------------------
* Display list link structure.
*/
typedef struct displist {
MtxPtr matrix; /* pointer to the RCP matrix */
GfxPtr gfxlist; /* pointer to the gfx list */
struct displist *next; /* pointer to the next render link */
} DispList, *DispPtr;
/*-------------------------------------------------------------------------------
* Map hierarchy node structures.
*/
/*
* Scene node.
*/
typedef struct {
MapNode node; /* node structure */
uchar sceneNo; /* serial number of scene */
uchar splitID; /* ID number for splited screen */
short centerh; /* center of the view port */
short centerv; /* center of the view port */
short offseth; /* offset of the view port */
short offsetv; /* offset of the view port */
ushort nstorages; /* number of the storages */
MapNode **storage; /* pointer to the node strage */
} MapScene;
/*
* Ortho node.
*/
typedef struct {
MapNode node; /* node structure */
float scale; /* scale of orthographic */
} MapOrtho;
/*
* Pers node.
*/
typedef struct {
MapNode node; /* node structure */
MapCBack callBack; /* perspective call back routine */
ulong refCon;
float angle; /* view angle */
short near; /* near clipping point */
short far; /* far clipping point */
} MapPersp;
/*
* Layer node.
*/
typedef struct {
MapNode node; /* node structure */
DispPtr first[NUM_RENDERS]; /* first pointer of the display list */
DispPtr last[NUM_RENDERS]; /* last pointer of the display list */
} MapLayer;
/*
* Camera node.
*/
typedef struct {
MapNode node; /* node structure */
MapCBack callBack; /* camera call back routine */
ulong refCon;
FVector position; /* camera position */
FVector lookat; /* camera look at */
AffineMtx *matrix; /* pointer to the affine matrix */
short bank; /* bank angle */
short rotscrn; /* screen rotation angle */
} MapCamera;
/*
* LOD node for the level of detail.
*/
typedef struct {
MapNode node; /* node structure */
short near; /* display near limit */
short far; /* display far limit */
} MapLOD;
/*
* Select node.
*/
typedef struct {
MapNode node; /* node structure */
MapCBack callBack; /* pointer to the call back routine */
ulong refCon;
short selid;
short selsw; /* node selector */
} MapSelect;
/*
* Select node. (information node)
*/
typedef struct {
MapNode node; /* node structure */
SVector point1; /* left-bottom-far point */
SVector point2; /* right-top-near point */
} MapArea;
/*
* Gfx node.
*/
typedef struct {
MapNode node; /* node structure */
GfxPtr gfxlist; /* pointer to the gfx list (segment addr) */
} MapGfx;
/*
* Coord node. (make a matrix)
*/
typedef struct {
MapNode node; /* node structure */
GfxPtr gfxlist; /* pointer to the gfx list */
SVector position; /* vector to the position */
SVector angle; /* rotation angle */
} MapCoord;
/*
* Trans node. (make a transration matrix)
*/
typedef struct {
MapNode node;
GfxPtr gfxlist; /* pointer to the gfx list */
SVector position; /* vector to the position */
short pad;
} MapTrans;
/*
* Rotate node. (make a rotation matrix)
*/
typedef struct {
MapNode node;
GfxPtr gfxlist; /* pointer to the gfx list */
SVector angle; /* rotation angle */
short pad;
} MapRotate;
/*
* Scale node.
*/
typedef struct {
MapNode node;
GfxPtr gfxlist; /* pointer to the gfx list */
float scaling;
} MapScale;
/*
* Matrix node.
*/
typedef struct {
MapNode node;
GfxPtr gfxlist; /* pointer to the gfx list */
AffineMtx matrix; /* affine matrix */
} MapMatrix;
/*
* Billboard node.
*/
typedef struct {
MapNode node; /* node structure */
GfxPtr gfxlist; /* pointer to the gfx list */
SVector position; /* vector to the position */
short pad;
} MapBboard;
/*
* Joint node for skeleton animation.
*/
typedef struct {
MapNode node;
GfxPtr gfxlist; /* pointer to the gfx list */
SVector offset; /* vector to the position */
short number;
} MapJoint;
/*
* Shadow node.
*/
typedef struct {
MapNode node; /* node structure */
short size; /* size of shadow rectangle */
uchar level; /* level of shadow */
uchar eight; /* flag for eight height check */
} MapShadow;
/*
* Branch node.
*/
typedef struct {
MapNode node; /* node structure */
MapNode *subnode; /* pointer to the sub node structure */
} MapBranch;
/*
* CProg node.
*/
typedef struct {
MapNode node; /* node structure */
MapCBack callBack; /* pointer to the call back routine */
ulong refCon;
} MapCProg;
/*
* Clear node.
*/
typedef struct {
MapNode node;
MapCBack callBack; /* pointer to the call back routine */
ulong refCon;
ulong color;
} MapClear;
/*
* String node.
*/
typedef struct {
MapNode node;
uchar width; /* character (font) width */
uchar height; /* character (font) height */
uchar length; /* length of string buffer */
char string[1]; /* string buffer (variable length) */
} MapPrint;
/*
* Shape node for the strategy.
*/
typedef struct {
MapNode node; /* node structure */
MapNode *shape; /* pointer to the shape header node */
char sceneNo; /* scene number */
char actorID; /* actor ID code */
SVector angle; /* object rotation angle */
FVector position; /* object position */
FVector scale; /* object scale */
SkelAnime skelanim; /* information for the skeleton animation */
ActorPtr actor; /* pointer to the actor record */
AffineMtx *matrix; /* pointer to the affine matrix */
FVector viewCoord; /* view coordinates */
} MapShape;
/*
* Header node (shape information).
*/
typedef struct {
MapNode node; /* node structure */
short radius; /* shape radius */
short pad;
} MapHeader;
/*
* Sucker node for taking.
*/
typedef struct {
MapNode node; /* node structure */
MapCBack callBack; /* pointer to the call back routine */
ulong refCon;
MapShape *shape; /* pointer to the MapShape node */
SVector offset; /* vector to the position */
short pad;
} MapSucker;
/********************************************************************************
*
* Global works
*
********************************************************************************/
extern MapScene *hmsActiveScene;
extern MapLayer *hmsActiveLayer;
extern MapPersp *hmsActivePersp;
extern MapCamera *hmsActiveCamera;
extern MapShape *hmsActiveShape;
extern MapSucker *hmsActiveSucker;
extern ushort animationCounter;
/********************************************************************************
*
* Function prototypes
*
********************************************************************************/
extern MapGroup strategyGroup;
#define MapEnable(node) ((MapNode *)(node))->flags |= MAP_FLAG_ENABLE
#define MapDisable(node) ((MapNode *)(node))->flags &= ~MAP_FLAG_ENABLE
#define MapBboardOn(node) ((MapNode *)(node))->flags |= MAP_FLAG_BBOARD
#define MapBboardOff(node) ((MapNode *)(node))->flags &= ~MAP_FLAG_BBOARD
#define MapThroughOn(node) ((MaoNode *)(node))->flags |= MAP_FLAG_THROUGH
#define MapThroughOff(node) ((MaoNode *)(node))->flags &= ~MAP_FLAG_THROUGH
#define MapGetRenderMode(node) (((MapNode *)(node))->flags >> 8)
#define MapSetRenderMode(node, mode) ((MapNode *)(node))->flags = ((mode)<<8) | (((MapNode *)(node))->flags & 0xff)
#define MapHideShape(node) ((MapNode *)(node))->flags |= MAP_FLAG_HIDESHAPE
#define MapDispShape(node) ((MapNode *)(node))->flags &= ~MAP_FLAG_HIDESHAPE
#define MapAnimeEnable(node) ((MapNode *)(node))->flags |= MAP_FLAG_ANIMESW
#define MapAnimeDisable(node) ((MapNode *)(node))->flags &= ~MAP_FLAG_ANIMESW
#define MapIsEnable(node) ((((MapNode *)(node))->flags & MAP_FLAG_ENABLE) != 0)
/*
* Map hierarchy node creators.
*/
extern MapScene *
MapNewScene(ArenaPtr arena, MapScene *scene, short sceneNo, short centh, short centv, short ofsh, short ofsv);
extern MapOrtho *
MapNewOrtho(ArenaPtr arena, MapOrtho *ortho, float scale);
extern MapPersp *
MapNewPersp(ArenaPtr arena, MapPersp *persp, float angle, short near, short far, MapCBack proc, long code);
extern MapGroup *
MapNewGroup(ArenaPtr arena, MapGroup *group);
extern MapArea *
MapNewArea(ArenaPtr arena, MapArea *area, SVector point1, SVector point2);
extern MapLayer *
MapNewLayer(ArenaPtr arena, MapLayer *layer, short zbuffer);
extern MapLOD *
MapNewLOD(ArenaPtr arena, MapLOD *lodOp, short near, short far);
extern MapSelect *
MapNewSelect(ArenaPtr arena, MapSelect *select, short selid, short selsw, MapCBack proc, long code);
extern MapCamera *
MapNewCamera(ArenaPtr arena, MapCamera *camera, FVector pos, FVector look, MapCBack proc, long code);
extern MapCoord *
MapNewCoord(ArenaPtr arena, MapCoord *coord, int render, GfxPtr gfxlist, SVector position, SVector angle);
extern MapTrans *
MapNewTrans(ArenaPtr arena, MapTrans *trans, int render, GfxPtr gfxlist, SVector position);
extern MapRotate *
MapNewRotate(ArenaPtr arena, MapRotate *rotate, int render, GfxPtr gfxlist, SVector angle);
extern MapScale *
MapNewScale(ArenaPtr arena, MapScale *scale, int render, GfxPtr gfxlist, float scaling);
extern MapMatrix *
MapNewMatrix(ArenaPtr arena, MapMatrix *matrix, int render, GfxPtr gfxlist, AffineMtx affine);
extern MapShape *
MapNewShape(ArenaPtr arena, MapShape *mapShape, MapNode *shape, FVector position, SVector angle, FVector scale);
extern MapHeader *
MapNewHeader(ArenaPtr arena, MapHeader *mapHeader, short radius);
extern MapJoint *
MapNewJoint(ArenaPtr arena, MapJoint *joint, int render, GfxPtr gfxlist, SVector offset);
extern MapBboard *
MapNewBboard(ArenaPtr arena, MapBboard *board, int render, GfxPtr gfxlist, SVector position);
extern MapGfx *
MapNewGfx(ArenaPtr arena, MapGfx *gfxOp, int render, GfxPtr gfxlist);
extern MapShadow *
MapNewShadow(ArenaPtr arena, MapShadow *shadow, short size, uchar level, uchar eight);
extern MapBranch *
MapNewBranch(ArenaPtr arena, MapBranch *branch, MapNode *node);
extern MapCProg *
MapNewCProg(ArenaPtr arena, MapCProg *cprog, MapCBack proc, long code);
extern MapClear *
MapNewClear(ArenaPtr arena, MapClear *clear, ushort color, MapCBack proc, long code);
extern MapPrint *
MapNewPrint(ArenaPtr arena, MapPrint *print, short width, short height, short length, char *string);
extern MapSucker *
MapNewSucker(ArenaPtr arena, MapSucker *sucker, MapShape *shape, SVector offset, MapCBack proc, long code);
/*
* Map hierarcky builder
*/
extern MapNode *
MapAddChild(MapNode *parent, MapNode *child);
extern MapNode *
MapRemoveChild(MapNode *child);
extern MapNode *
MapChangeFirstChild(MapNode *node);
extern void
MapSendMessage(MapScene *scene, int message);
/*
* Map hierarchy utilities
*/
extern void
MapInitShape(MapShape *shape);
extern void
MapEnterShape(MapShape *mapShape, MapNode *shape, FVector position, SVector angle);
extern void
MapEnterActor(MapShape *mapShape, ActorPtr actor);
extern void
MapSetAnimation(MapShape *shape, AnimePtr *animation);
extern void
MapSetVariableAnime(MapShape *shape, AnimePtr *animation, long speed);
extern int
MapAnimeIndex(int frame, ushort **table);
extern short
MapNextAnimeFrame(SkelAnime *skelanim, long *vframe);
extern void
MapGetWaistOffset(MapShape *shape, FVector offset);
extern void
DrawScene(MapScene *scene, Vp *viewing, Vp *trimming, ulong blanking);
extern MapScene *
MapGetScenePtr(MapNode *node);
#endif
#endif