650 lines
16 KiB
C
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
|