sm64/include/math.h

214 lines
5.0 KiB
C

/********************************************************************************
math.h: Ultra 64 MARIO Brothers include file
Copyright (c) 1996 Nintendo co., ltd. All rights reserved
February 19, 1996
********************************************************************************/
#ifndef MATH_H
#define MATH_H
#define COORD_X 0
#define COORD_Y 1
#define COORD_Z 2
#define _AX 0
#define _AY 1
#define _AZ 2
#define roundf(val) (int)(val+(((val)>0.0f)?0.5f:-0.5f))
#define absf(val) (((val)>0.0f)?(val):-(val))
#define fixed(val) ((long)((val)*65536.0f))
#define cvangle(ang) ((float)(ang)*M_PI/32768.0f)
#define radianf(rad) (short)((float)(rad)*32768.0f/M_PI+0.5f)
#define degreef(deg) (short)((float)(deg)*32768.0f/180.0f+0.5f)
#define degreei(deg) (short)((int)(deg)*32768L/180L)
#define sin(angle) sintable[((ushort)(angle)) >> 4]
#define cos(angle) costable[((ushort)(angle)) >> 4]
typedef float RotateMtx[3][3]; /* 3x3 rotation matrix */
typedef float AffineMtx[4][4]; /* 4x4 affine transformation matrix */
typedef struct {
short integer[4][4];
short fraction[4][4];
} RCPMatrix;
typedef struct {
short time;
short posx;
short posy;
short posz;
} BSplineRecord, *BSplinePtr;
typedef short SVector[3]; /* 3D short vector */
typedef float FVector[3]; /* 3D float vector */
/********************************************************************************
*
* External works
*
********************************************************************************/
extern float sintable[4096]; /* sin table */
extern float costable[4096]; /* cos table */
extern short atntable[1024]; /* arc tan table */
extern Mtx fixedIdentMatrix; /* identity matrix (fixed point value) */
extern FVector zeroFVector; /* 3D float vector (0, 0, 0) */
extern SVector zeroSVector; /* 3D short vector (0, 0, 0) */
extern FVector unitFVector; /* 3D float vector (1, 1, 1) */
extern SVector unitSVector; /* 3D short vector (1, 1, 1) */
/********************************************************************************
*
* Function prototypes
*
********************************************************************************/
/* floating point vector oparations */
extern FVector
*SetFVector(FVector vector, float vecx, float vecy, float vecz);
extern FVector
*CopyFVector(FVector desvec, FVector souvec);
extern FVector
*AddFVector(FVector desvec, FVector souvec);
extern FVector
*AddToFVector(FVector desvec, FVector souvec1, FVector souvec2);
extern FVector *
CalcNormalVector(FVector normal, FVector pos1, FVector pos2, FVector pos3);
extern FVector *
CrossProduct(FVector cross, FVector vec1, FVector vec2);
extern FVector *
NormalizeFVector(FVector vec);
/* short interger vector oparations */
extern SVector
*SetSVector(SVector vector, short vecx, short vecy, short vecz);
extern SVector
*CopySVector(SVector desvec, SVector souvec);
extern SVector
*AddSVector(SVector desvec, SVector souvec);
extern SVector
*AddToSVector(SVector desvec, SVector souvec1, SVector souvec2);
extern SVector
*SubSVector(SVector desvec, SVector souvec);
/* vector convertion */
extern FVector *
SVectorToFVector(FVector fvec, SVector svec);
extern SVector *
FVectorToSVector(SVector svec, FVector fvec);
/* matrix oparations */
extern void
CopyAffineMtx(AffineMtx desmat, AffineMtx soumat);
extern void
LoadIdentAffineMtx(AffineMtx mtx);
extern void
CreateTransAffineMtx(AffineMtx matrix, FVector position);
extern void
LookAtAffineMtx(AffineMtx mtx, FVector eye, FVector look, short bank);
#if 0
extern void
CreateCameraAffineMtx(AffineMtx matrix, SVector position, SVector angle);
#endif
extern void
CreateModelAffineMtx(AffineMtx mtx, FVector position, SVector angle);
extern void
CreateJointAffineMtx(AffineMtx matrix, FVector position, SVector angle);
extern void
CreateBboardAffineMtx(AffineMtx mat, AffineMtx cam, FVector position, short bank);
extern void
CreateRotationAffineMtx(AffineMtx matrix, FVector vectorY, FVector position, short angle);
extern void
CreatePostureAffineMtx(AffineMtx matrix, FVector position, short angle, float radius);
extern void
MultAffineMtx(AffineMtx mtx, AffineMtx ma, AffineMtx mb);
extern void
ScaleAffineMtx(AffineMtx desmtx, AffineMtx soumtx, FVector scale);
extern void
RotatePoint(AffineMtx mtx, SVector point);
extern void
AffineToMtx(Mtx *matrix, AffineMtx affine);
extern void
CreateBankMatrix(Mtx *matrix, short bank);
extern void
CalcGlobalPosition(FVector position, AffineMtx mat, AffineMtx cam);
extern void
CrossToPolar(FVector center, FVector point, float *dist, short *angx, short *angy);
extern void
PolarToCross(FVector center, FVector point, float dist, short angx, short angy);
extern int
IConverge(int value, int target, int add, int sub);
extern float
FConverge(float value, float target, float add, float sub);
/* mathematic oparations */
extern short
atan(float x, float y);
extern float
atanf(float x, float y);
extern void
StartBSpline(BSplinePtr data);
extern int
RunBSpline(FVector position);
#endif