summaryrefslogtreecommitdiff
path: root/include/common.h
blob: 82d3fcafd33a1a115d6ba6f5a5bc28edff1fc6aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#ifndef __KAMEK_COMMON_H
#define __KAMEK_COMMON_H


#define GEKKO

/* Common Number Types */
typedef signed long long s64;
typedef signed int s32;
typedef signed short s16;
typedef signed char s8;

typedef unsigned long long u64;
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;

typedef float f32;
typedef double f64;

typedef unsigned long ulong;
typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char uchar;

typedef unsigned long size_t;

typedef char* Ptr; // DUMB

typedef int BOOL;
#define TRUE 1
#define FALSE 0

#define NULL 0

/* Structures */
typedef f32 Mtx[3][4];
typedef f32 (*MtxPtr)[4];
typedef f32 Mtx44[4][4];
typedef f32 (*Mtx44Ptr)[4];
typedef f32 ROMtx[4][3];
typedef f32 (*ROMtxPtr)[3];

typedef struct { f32 x, y; } VEC2, Vec2, *Vec2Ptr, Point2d, *Point2dPtr;
typedef struct { f32 x, y, z; } VEC3, Vec, Vec3, *VecPtr, Point3d, *Point3dPtr;
typedef struct { s16 x; s16 y; s16 z; }S16Vec, *S16VecPtr;
typedef struct { f32 x, y, z, w; } Quaternion, *QuaternionPtr, Qtrn, *QtrnPtr;

typedef struct { f32 frame, value, slope; } HermiteKey;

extern "C" const char * strrchr ( const char * str, int character );
extern "C" int strcmp ( const char * str1, const char * str2 );

#include "rvl/mtx.h"


inline void *operator new(size_t size, void *ptr) { return ptr; }

inline float abs(float value) {
	return __fabs(value);
}
inline double abs(double value) {
	return __fabs(value);
}


struct tree_node {
	tree_node *parent, *child, *prev_sibling, *next_sibling;
	void *obj;
};

/* Virtual Function Helpers */
//#define VF_BEGIN(type, obj, id, vtable_offset) \
//	{ type __VFUNC = (((u32)(obj))+(vtable_offset));
#define VF_BEGIN(type, obj, id, vtable_offset) \
	{ type __VFUNC = ((type*)(*((void**)(((u32)(obj))+(vtable_offset)))))[(id)];

#define VF_CALL __VFUNC

#define VF_END }




/* Common Functions */

void OSReport(const char *format, ...);
int sprintf(char *buffer, const char *format, ...);
int snprintf(char *buffer, size_t buff_size, const char *format, ...);
char *strcat(char *destination, const char *source);
extern "C" void *memcpy(void *dest, const void *src, size_t count);
void *memset(void *ptr, int value, size_t num);
int memcmp(const void *ptr1, const void *ptr2, size_t num);

void *AllocFromGameHeap1(u32 size);
void FreeFromGameHeap1(void *block);

float GetHermiteCurveValue(float current_frame, HermiteKey* keys, unsigned int key_count);

/* Archive */
/*#ifdef REGION_PAL
	#define ARC_TABLE ((*((void**)0x8042A318))+4)
	#define RAW_ARC_TABLE (*((void**)0x8042A318))
#endif

#ifdef REGION_NTSC
	#define ARC_TABLE ((*((void**)0x8042A038))+4)
	#define RAW_ARC_TABLE (*((void**)0x8042A038))
#endif

char *RetrieveFileFromArc(void *table, char *name, char *path);
char *RetrieveFileFromArcAlt(void *table, char *name, char *path);*/

extern void *ArchiveHeap; // PAL 0x8042A72C, NTSC 0x8042A44C

namespace nw4r { namespace math { float FrSqrt(float); }}
float sqrtf(float x) {
    return (x <= 0) ? 0.0f : x * nw4r::math::FrSqrt(x);
}

#ifdef __MWERKS__
	#define InfiniteLoop for (;;) { asm { nop } }
#else
	#define InfiniteLoop for (;;) { asm("nop"); }
#endif

typedef struct
{
    u8   *destp;                         // Write-destination pointer:                     4B
    s32  destCount;                      // Remaining size to write:                     4B
    s32  forceDestCount;                 // Forcibly set the decompression size             4B
    u16  huffTable9 [ 1 << (9 + 1) ];    // Huffman encoding table: 2048B
    u16  huffTable12[ 1 << (5 + 1) ];    // Huffman encoding table: 128B
    u16  *nodep;                         // Node during a Huffman table search: 4B
    s32  tableSize9;                     // Table size during a load: 4B
    s32  tableSize12;                    // Table size during a load: 4B
    u32  tableIdx;                       // Index for the table load position: 4B
    u32  stream;                         // Bit stream for loading: 4B
    u32  stream_len;                     // Number of valid stream bits for loading: 4B
    u16  length;                         // Read length for LZ compression: 2B
    s8   offset_bits;                    // Bit length for offset information: 1B
    u8   headerSize;                     // Size of header being read:             1B
}                                        //                             Total is 2216B
CXUncompContextLH;

extern "C" void CXInitUncompContextLH( CXUncompContextLH * context, void* dest );
extern "C" s32 CXReadUncompLH( CXUncompContextLH *context, const void* data, u32 len );
extern "C" u32 CXGetUncompressedSize( const void *srcp );
extern "C" void CXUncompressLZ( const void *srcp, void *destp );

static inline BOOL CXIsFinishedUncompLH( const CXUncompContextLH *context )
{
    return (context->destCount > 0 || context->headerSize > 0)? FALSE : TRUE;
}


#endif