forked from raduprv/Eternal-Lands
-
Notifications
You must be signed in to change notification settings - Fork 3
/
platform.h
181 lines (156 loc) · 3.96 KB
/
platform.h
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/*!
* \file
* \ingroup platform
* \brief Various defines and constants to make EL compile on different platforms.
*/
#ifndef PLATFORM_H
#define PLATFORM_H
// Try to use compiler macros to detect 64-bitness. According to
// http://predef.sourceforge.net/prearch.html , these ought to work on
// gcc, Sun Studio and Visual Studio.
// Throw in ia64 as well, though I doubt anyone will play EL on that.
#if defined (__x86_64__) || defined (_M_X64) || defined (__ia64__) || defined (_M_IA64)
#ifndef X86_64
// #define X86_64
#endif
#endif
#ifdef FASTER_STARTUP
// x86 can do unaligned reads of multi-byte data, not sure about other
// architectures, so split unaligned reads there
#if defined (__i386__) || defined (_M_IX86) || defined (__x86_64__) || defined (_M_X64)
#undef EL_FORCE_ALIGNED_READ
#else
#define EL_FORCE_ALIGNED_READ
#endif
#endif // FASTER_STARTUP
// only ever use WINDOWS anywhere else, in case we need to add another 'catch' to
// enable WINDOWS
#if defined (_WIN32) || defined (_WIN64) || defined (WIN32)
#ifndef WINDOWS
#define WINDOWS
#endif // !WINDOWS
#endif // _WIN32 || _WIN64
#ifdef WINDOWS
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
#ifdef _MSC_VER // now we do test for VC
// Lachesis: Make sure snprintf is declared before we #define it to be something else,
// else we'll eventually break C++ headers that use it
#include <stdio.h>
#define stat _stat
#define snprintf safe_snprintf
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#define __inline__ __inline
#if _MSC_VER < 1400 // VC 2003 needs these defines, VC 2005 will error with them included
#define atan2f atan2
#define acosf acos
#define ceilf ceil
#define floorf floor
#define fabsf fabs
#endif // _MSC_VER < 1400
#define rint(X) floor(X+0.5f)
#endif // _MSC_VER
#ifdef __MINGW32__
// Lachesis: Make sure snprintf is declared before we #define it to be something else,
// else we'll eventually break C++ headers that use it
#include <stdio.h>
#define snprintf safe_snprintf
#endif // __MINGW32__
#elif defined (OSX)
#ifndef __MACOSX__
#define __MACOSX__ //necessary for Ogg on Macs
#endif
#ifdef __BIG_ENDIAN__
#define EL_BIG_ENDIAN
#endif
#endif //WINDOWS
#ifdef OSX
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
//#include <OpenGL/glext.h>
#include "elglext.h"
#define APIENTRY
#define APIENTRYP *
#elif !defined(BSD)
#define GL_GLEXT_LEGACY
#include <GL/gl.h>
#include <GL/glu.h>
#undef GL_VERSION_1_2
#undef GL_VERSION_1_3
#include "glext.h"
#else // BSD
#include <GL/gl.h>
#include <GL/glu.h>
#endif
// Inlucde the plaform specific location sound libs
#ifdef OSX
#include <Carbon/Carbon.h>
#include <AudioToolbox/AudioToolbox.h>
#include <AudioUnit/AudioUnit.h>
#include <OpenAL/al.h>
#include <OpenAL/alc.h>
#include <OpenAL/MacOSX_OALExtensions.h>
#else
#include <AL/al.h>
#include <AL/alc.h>
#endif //lib location platform checking
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif //M_PI
#ifndef M_SQRT2
#define M_SQRT2 1.41421356237309504880
#endif
#ifdef __GNUC__
#define UNUSED(x) x __attribute__((unused))
#else
#define UNUSED(x) x
#endif // __GNUC__
#ifdef EL_BIG_ENDIAN
#define SwapLEFloat(X) SwapFloat(X)
#else
#define SwapLEFloat(X) (X)
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef X86_64
typedef long int point;
#else
typedef int point;
#endif
/*!
* \ingroup platform
* \brief Swaps a float properly
*
* Swaps the bytes of the given float \a t
*
* \param t the float to swap
* \retval float the swapped float
*/
#include <SDL_endian.h>
static __inline__ float SwapFloat (float t)
{
union
{
float f;
Uint32 i;
} intOrFloat;
intOrFloat.f = t;
intOrFloat.i = SDL_Swap32 (intOrFloat.i);
return intOrFloat.f;
}
#ifdef _MSC_VER
#include <math.h>
static __inline__ double trunc(const double d)
{
return (d < 0 ? ceil(d) : floor(d));
}
#endif
#ifdef __cplusplus
} // extern "C"
#endif
#endif // PLATFORM_H