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
 |