214 lines
5.0 KiB
C
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
|