////// // // IntLib.H - Main header file for SCEE's internal library of reusable code. // // $Header: /Include/IntLib.H 16 27/08/97 14:22 Cemsen $ // ////// #ifndef __SCEE_INT_LIB_HEADER #define __SCEE_INT_LIB_HEADER #include #include #include #ifdef __cplusplus extern "C" { #endif //-- Miscellaneous Maths functions ------------------------------------ int HypotApprox4 (int x1, int y1, int x2, int y2); int HypotApprox (int dx, int dy); int Hypot4 (int x1, int y1, int x2, int y2); int Hypot (int dx, int dy); long ATan12 (long dx, long dy); // Hyperaccurate sine/cosine functions - they provide the answer<<28 // with an error of no more than +/-2 extern struct { long sin[1024]; long cos[4096]; } sincos_table; #define FSIN(a) (((a)*25736)>>12) #define FCOS(a) ((1<<28) - (unsigned)(a) * (a) / 13599099) #define SIN(a) ((int)(((long long)sincos_table.cos[((a)>>16)&0xfff] * FSIN((a)&0xffff) + (long long)sincos_table.sin[((a)>>16)&0xfff] * FCOS((a)&0xffff))>>28)) #define COS(a) ((int)(((long long)sincos_table.cos[((a)>>16)&0xfff] * FCOS((a)&0xffff) - (long long)sincos_table.sin[((a)>>16)&0xfff] * FSIN((a)&0xffff))>>28)) //-- Matrix functions ------------------------------------------------- MATRIX *RotMatrixZYX (const SVECTOR *rot, MATRIX *m); SVECTOR *ApplyRotMatrixSV (const SVECTOR *in, SVECTOR *out); //-- Vector functions ------------------------------------------------- typedef struct DVECTOR_long_tag { /* 2D long vector.. psx doesn't have one */ long vx, vy; } DVECTOR_long; long Get2DAngleD (DVECTOR *v0); long Get2DAngleDL (DVECTOR_long *v0); long AccurateVectorMeasure (VECTOR *v0); long AccurateVectorMeasureS (SVECTOR *v0); long AccurateVectorMeasureD (DVECTOR *original); long AccurateVectorMeasureDL (DVECTOR_long *original); void AccurateVectorNormalD (DVECTOR *original, DVECTOR *out); void AccurateVectorNormalDL (DVECTOR_long *original, DVECTOR *out); void AccurateVectorNormalS (VECTOR *v0, SVECTOR *v1); void AccurateVectorNormalSS (SVECTOR *v0, SVECTOR *v1); long AccurateVectorNormalAndMeasureS (VECTOR *v0, SVECTOR *v1); long no_limits_AccurateVectorMeasure (VECTOR *v0); void no_limits_AccurateVectorNormalSS (SVECTOR *v0, SVECTOR *v1); void no_limits_AccurateVectorNormalS (VECTOR *v0, SVECTOR *v1); long no_limits_AccurateVectorNormalAndMeasureS (VECTOR *v0, SVECTOR *v1); long no_limits_VectorNormalS (VECTOR *v0, SVECTOR *v1); void PolygonNormal (SVECTOR *srcv0, SVECTOR *srcv1, SVECTOR *srcv2, SVECTOR *normal); void PolygonNormalWorld (SVECTOR *srcv0, SVECTOR *srcv1, SVECTOR *srcv2, SVECTOR *normal); //-- Graphics related functions --------------------------------------- #define gte_RotTransPers3C(__v,__sxy,__depthq,__flag,__otz) \ { gte_ldv3c(__v); \ gte_rtpt(); \ gte_stsxy3c(__sxy); \ if ((__depthq) != NULL) gte_stdp(__depthq); \ if ((__flag) != NULL) gte_stflg(__flag); \ if ((__otz) != NULL) gte_stszotz(__otz); \ } #define gte_lddqa(immed) __asm__ volatile ("ctc2 %0,$27": :"r"(immed)) #define gte_lddqb(immed) __asm__ volatile ("ctc2 %0,$28": :"r"(immed)) #define gte_stdqa(ptr) __asm__ volatile ("cfc2 $12, $27;" "nop;" "sw $12, 0( %0 )": :"r"(ptr):"$12","memory") #define gte_stdqb(ptr) __asm__ volatile ("cfc2 $12, $28;" "nop;" "sw $12, 0( %0 )": :"r"(ptr):"$12","memory") void TransferTexture (u_long *src_addr, u_short *tpage, u_short *clut); void TransferTextureUVWH (u_long *src_addr, u_short *tpage, u_short *clut, u_char *U, u_char *V, int *W, int *H); void *SubDivide2D_G3 (POLY_G3 *p, void *Space); void *SubDivide2D_GT3 (POLY_GT3 *p, void *Space); void *SubDivide2D_F3 (POLY_F3 *p, void *Space); void *SubDivide2D_FT3 (POLY_FT3 *p, void *Space); void *SubDivide2D_G4 (POLY_G4 *p, void *Space); void *SubDivide2D_GT4 (POLY_GT4 *p, void *Space); void *SubDivide2D_F4 (POLY_F4 *p, void *Space); void *SubDivide2D_FT4 (POLY_FT4 *p, void *Space); //-- Memory management functions -------------------------------------- extern u_long _ramsize, _stacksize; // must be defined in app void InitMem (void); void WarmInitMem (void *addr); void OverlayInitMem (void *address); u_long *GetHeapbase (void); void SetHeapbase (u_long *addr); u_long RamRemaining (void); u_long PrintRamRemaining (void); void NewContext (void); void *AllocHeap (u_long bytes); void DestroyContext (void); void NewContextBase (void); void *AllocBase (u_long bytes); void DestroyContextBase (void); #ifdef DEBUG_MEM extern int memTrace; // set true to enable printf's extern u_long memTotalAlloced; #define InitMem() debugInitMem () #define WarmInitMem(x) debugWarmInitMem (x) void debugInitMem (void); void debugWarmInitMem (void *addr); #define NewContext() debugNewContext () #define AllocHeap(x) debugAllocHeap (x, __FUNCTION__) #define DestroyContext() debugDestroyContext () void debugNewContext (void); void *debugAllocHeap (u_long bytes, char *caller); void debugDestroyContext (void); #define NewContextBase() debugNewContextBase () #define AllocBase(x) debugAllocBase (x, __FUNCTION__) #define DestroyContextBase() debugDestroyContextBase () void debugNewContextBase (void); void *debugAllocBase (u_long bytes, char *caller); void debugDestroyContextBase (void); #endif //-- File handling functions ------------------------------------------ #define DISK_UNCOMPRESSED 0x0 #define DISK_COMPRESSED 0x1 #define DISK_HEAP 0x0 #define DISK_BASE 0x2 extern u_char gDiskMode; extern char gCDFilePath[]; // these must be defined in main app extern char gPCFilePath[]; #ifdef FILES_CD #define InitLoading cdInitLoading #define LoadFileToMemory cdLoadFileToMemory #define LoadFileAtAddress cdLoadFileAtAddress #define LoadFileToVRAM cdLoadFileToVRAM #define LoadFileToVRAM_UVWH cdLoadFileToVRAM_UVWH #define LoadVRAMFileToVRAM cdLoadVRAMFileToVRAM void cdInitLoading (void); u_long *cdLoadFileToMemory (char *filename); u_long cdLoadFileAtAddress (char *filename,u_long* addr); int cdLoadFileToVRAM (char *filename, u_short *tpage, u_short *clut); int cdLoadFileToVRAM_UVWH (char *filename, u_short *tpage, u_short *clut, u_char *U, u_char *V, int *W, int *H); void cdLoadVRAMFileToVRAM (char *filename, int x, int y, int w, int h); #elif defined (FILES_PC) // the PC file system #define InitLoading pcInitLoading #define LoadFileToMemory pcLoadFileToMemory #define LoadFileAtAddress pcLoadFileAtAddress #define LoadFileToVRAM pcLoadFileToVRAM #define LoadFileToVRAM_UVWH pcLoadFileToVRAM_UVWH #define LoadVRAMFileToVRAM pcLoadVRAMFileToVRAM void pcInitLoading (void); u_long *pcLoadFileToMemory (char *filename); u_long pcLoadFileAtAddress (char *filename,u_long* addr); int pcLoadFileToVRAM (char *filename, u_short *tpage, u_short *clut); int pcLoadFileToVRAM_UVWH (char *filename, u_short *tpage, u_short *clut, u_char *U, u_char *V, int *W, int *); void pcLoadVRAMFileToVRAM (char *filename, int x, int y, int w, int h); #endif void DiskSetMode (int compressed, int base); #ifdef __cplusplus }; #endif #endif // __HEADER