doom3-gpl
Doom 3 GPL source release
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Lib.cpp
Go to the documentation of this file.
1 /*
2 ===========================================================================
3 
4 Doom 3 GPL Source Code
5 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
6 
7 This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
8 
9 Doom 3 Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13 
14 Doom 3 Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
21 
22 In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
23 
24 If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
25 
26 ===========================================================================
27 */
28 
29 #include "precompiled.h"
30 #pragma hdrstop
31 
32 #if defined( MACOS_X )
33 #include <signal.h>
34 #include <sys/types.h>
35 #include <unistd.h>
36 #endif
37 
38 /*
39 ===============================================================================
40 
41  idLib
42 
43 ===============================================================================
44 */
45 
50 int idLib::frameNumber = 0;
51 
52 /*
53 ================
54 idLib::Init
55 ================
56 */
57 void idLib::Init( void ) {
58 
59  assert( sizeof( bool ) == 1 );
60 
61  // initialize little/big endian conversion
62  Swap_Init();
63 
64  // initialize memory manager
65  Mem_Init();
66 
67  // init string memory allocator
69 
70  // initialize generic SIMD implementation
71  idSIMD::Init();
72 
73  // initialize math
74  idMath::Init();
75 
76  // test idMatX
77  //idMatX::Test();
78 
79  // test idPolynomial
81 
82  // initialize the dictionary string pools
83  idDict::Init();
84 }
85 
86 /*
87 ================
88 idLib::ShutDown
89 ================
90 */
91 void idLib::ShutDown( void ) {
92 
93  // shut down the dictionary string pools
95 
96  // shut down the string memory allocator
98 
99  // shut down the SIMD engine
101 
102  // shut down the memory manager
103  Mem_Shutdown();
104 }
105 
106 
107 /*
108 ===============================================================================
109 
110  Colors
111 
112 ===============================================================================
113 */
114 
115 idVec4 colorBlack = idVec4( 0.00f, 0.00f, 0.00f, 1.00f );
116 idVec4 colorWhite = idVec4( 1.00f, 1.00f, 1.00f, 1.00f );
117 idVec4 colorRed = idVec4( 1.00f, 0.00f, 0.00f, 1.00f );
118 idVec4 colorGreen = idVec4( 0.00f, 1.00f, 0.00f, 1.00f );
119 idVec4 colorBlue = idVec4( 0.00f, 0.00f, 1.00f, 1.00f );
120 idVec4 colorYellow = idVec4( 1.00f, 1.00f, 0.00f, 1.00f );
121 idVec4 colorMagenta= idVec4( 1.00f, 0.00f, 1.00f, 1.00f );
122 idVec4 colorCyan = idVec4( 0.00f, 1.00f, 1.00f, 1.00f );
123 idVec4 colorOrange = idVec4( 1.00f, 0.50f, 0.00f, 1.00f );
124 idVec4 colorPurple = idVec4( 0.60f, 0.00f, 0.60f, 1.00f );
125 idVec4 colorPink = idVec4( 0.73f, 0.40f, 0.48f, 1.00f );
126 idVec4 colorBrown = idVec4( 0.40f, 0.35f, 0.08f, 1.00f );
127 idVec4 colorLtGrey = idVec4( 0.75f, 0.75f, 0.75f, 1.00f );
128 idVec4 colorMdGrey = idVec4( 0.50f, 0.50f, 0.50f, 1.00f );
129 idVec4 colorDkGrey = idVec4( 0.25f, 0.25f, 0.25f, 1.00f );
130 
131 static dword colorMask[2] = { 255, 0 };
132 
133 /*
134 ================
135 ColorFloatToByte
136 ================
137 */
138 ID_INLINE static byte ColorFloatToByte( float c ) {
139  return (byte) ( ( (dword) ( c * 255.0f ) ) & colorMask[FLOATSIGNBITSET(c)] );
140 }
141 
142 /*
143 ================
144 PackColor
145 ================
146 */
148  dword dw, dx, dy, dz;
149 
150  dx = ColorFloatToByte( color.x );
151  dy = ColorFloatToByte( color.y );
152  dz = ColorFloatToByte( color.z );
153  dw = ColorFloatToByte( color.w );
154 
155 #if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__))
156  return ( dx << 0 ) | ( dy << 8 ) | ( dz << 16 ) | ( dw << 24 );
157 #elif (defined(MACOS_X) && defined(__ppc__))
158  return ( dx << 24 ) | ( dy << 16 ) | ( dz << 8 ) | ( dw << 0 );
159 #else
160 #error OS define is required!
161 #endif
162 }
163 
164 /*
165 ================
166 UnpackColor
167 ================
168 */
169 void UnpackColor( const dword color, idVec4 &unpackedColor ) {
170 #if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__))
171  unpackedColor.Set( ( ( color >> 0 ) & 255 ) * ( 1.0f / 255.0f ),
172  ( ( color >> 8 ) & 255 ) * ( 1.0f / 255.0f ),
173  ( ( color >> 16 ) & 255 ) * ( 1.0f / 255.0f ),
174  ( ( color >> 24 ) & 255 ) * ( 1.0f / 255.0f ) );
175 #elif (defined(MACOS_X) && defined(__ppc__))
176  unpackedColor.Set( ( ( color >> 24 ) & 255 ) * ( 1.0f / 255.0f ),
177  ( ( color >> 16 ) & 255 ) * ( 1.0f / 255.0f ),
178  ( ( color >> 8 ) & 255 ) * ( 1.0f / 255.0f ),
179  ( ( color >> 0 ) & 255 ) * ( 1.0f / 255.0f ) );
180 #else
181 #error OS define is required!
182 #endif
183 }
184 
185 /*
186 ================
187 PackColor
188 ================
189 */
191  dword dx, dy, dz;
192 
193  dx = ColorFloatToByte( color.x );
194  dy = ColorFloatToByte( color.y );
195  dz = ColorFloatToByte( color.z );
196 
197 #if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__))
198  return ( dx << 0 ) | ( dy << 8 ) | ( dz << 16 );
199 #elif (defined(MACOS_X) && defined(__ppc__))
200  return ( dy << 16 ) | ( dz << 8 ) | ( dx << 0 );
201 #else
202 #error OS define is required!
203 #endif
204 }
205 
206 /*
207 ================
208 UnpackColor
209 ================
210 */
211 void UnpackColor( const dword color, idVec3 &unpackedColor ) {
212 #if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__))
213  unpackedColor.Set( ( ( color >> 0 ) & 255 ) * ( 1.0f / 255.0f ),
214  ( ( color >> 8 ) & 255 ) * ( 1.0f / 255.0f ),
215  ( ( color >> 16 ) & 255 ) * ( 1.0f / 255.0f ) );
216 #elif (defined(MACOS_X) && defined(__ppc__))
217  unpackedColor.Set( ( ( color >> 16 ) & 255 ) * ( 1.0f / 255.0f ),
218  ( ( color >> 8 ) & 255 ) * ( 1.0f / 255.0f ),
219  ( ( color >> 0 ) & 255 ) * ( 1.0f / 255.0f ) );
220 #else
221 #error OS define is required!
222 #endif
223 }
224 
225 /*
226 ===============
227 idLib::Error
228 ===============
229 */
230 void idLib::Error( const char *fmt, ... ) {
231  va_list argptr;
232  char text[MAX_STRING_CHARS];
233 
234  va_start( argptr, fmt );
235  idStr::vsnPrintf( text, sizeof( text ), fmt, argptr );
236  va_end( argptr );
237 
238  common->Error( "%s", text );
239 }
240 
241 /*
242 ===============
243 idLib::Warning
244 ===============
245 */
246 void idLib::Warning( const char *fmt, ... ) {
247  va_list argptr;
248  char text[MAX_STRING_CHARS];
249 
250  va_start( argptr, fmt );
251  idStr::vsnPrintf( text, sizeof( text ), fmt, argptr );
252  va_end( argptr );
253 
254  common->Warning( "%s", text );
255 }
256 
257 /*
258 ===============================================================================
259 
260  Byte order functions
261 
262 ===============================================================================
263 */
264 
265 // can't just use function pointers, or dll linkage can mess up
266 static short (*_BigShort)( short l );
267 static short (*_LittleShort)( short l );
268 static int (*_BigLong)( int l );
269 static int (*_LittleLong)( int l );
270 static float (*_BigFloat)( float l );
271 static float (*_LittleFloat)( float l );
272 static void (*_BigRevBytes)( void *bp, int elsize, int elcount );
273 static void (*_LittleRevBytes)( void *bp, int elsize, int elcount );
274 static void (*_LittleBitField)( void *bp, int elsize );
275 static void (*_SixtetsForInt)( byte *out, int src );
276 static int (*_IntForSixtets)( byte *in );
277 
278 short BigShort( short l ) { return _BigShort( l ); }
279 short LittleShort( short l ) { return _LittleShort( l ); }
280 int BigLong( int l ) { return _BigLong( l ); }
281 int LittleLong( int l ) { return _LittleLong( l ); }
282 float BigFloat( float l ) { return _BigFloat( l ); }
283 float LittleFloat( float l ) { return _LittleFloat( l ); }
284 void BigRevBytes( void *bp, int elsize, int elcount ) { _BigRevBytes( bp, elsize, elcount ); }
285 void LittleRevBytes( void *bp, int elsize, int elcount ){ _LittleRevBytes( bp, elsize, elcount ); }
286 void LittleBitField( void *bp, int elsize ){ _LittleBitField( bp, elsize ); }
287 
288 void SixtetsForInt( byte *out, int src) { _SixtetsForInt( out, src ); }
289 int IntForSixtets( byte *in ) { return _IntForSixtets( in ); }
290 
291 /*
292 ================
293 ShortSwap
294 ================
295 */
296 short ShortSwap( short l ) {
297  byte b1,b2;
298 
299  b1 = l&255;
300  b2 = (l>>8)&255;
301 
302  return (b1<<8) + b2;
303 }
304 
305 /*
306 ================
307 ShortNoSwap
308 ================
309 */
310 short ShortNoSwap( short l ) {
311  return l;
312 }
313 
314 /*
315 ================
316 LongSwap
317 ================
318 */
319 int LongSwap ( int l ) {
320  byte b1,b2,b3,b4;
321 
322  b1 = l&255;
323  b2 = (l>>8)&255;
324  b3 = (l>>16)&255;
325  b4 = (l>>24)&255;
326 
327  return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
328 }
329 
330 /*
331 ================
332 LongNoSwap
333 ================
334 */
335 int LongNoSwap( int l ) {
336  return l;
337 }
338 
339 /*
340 ================
341 FloatSwap
342 ================
343 */
344 float FloatSwap( float f ) {
345  union {
346  float f;
347  byte b[4];
348  } dat1, dat2;
349 
350 
351  dat1.f = f;
352  dat2.b[0] = dat1.b[3];
353  dat2.b[1] = dat1.b[2];
354  dat2.b[2] = dat1.b[1];
355  dat2.b[3] = dat1.b[0];
356  return dat2.f;
357 }
358 
359 /*
360 ================
361 FloatNoSwap
362 ================
363 */
364 float FloatNoSwap( float f ) {
365  return f;
366 }
367 
368 /*
369 =====================================================================
370 RevBytesSwap
371 
372 Reverses byte order in place.
373 
374 INPUTS
375  bp bytes to reverse
376  elsize size of the underlying data type
377  elcount number of elements to swap
378 
379 RESULTS
380  Reverses the byte order in each of elcount elements.
381 ===================================================================== */
382 void RevBytesSwap( void *bp, int elsize, int elcount ) {
383  register unsigned char *p, *q;
384 
385  p = ( unsigned char * ) bp;
386 
387  if ( elsize == 2 ) {
388  q = p + 1;
389  while ( elcount-- ) {
390  *p ^= *q;
391  *q ^= *p;
392  *p ^= *q;
393  p += 2;
394  q += 2;
395  }
396  return;
397  }
398 
399  while ( elcount-- ) {
400  q = p + elsize - 1;
401  while ( p < q ) {
402  *p ^= *q;
403  *q ^= *p;
404  *p ^= *q;
405  ++p;
406  --q;
407  }
408  p += elsize >> 1;
409  }
410 }
411 
412 /*
413  =====================================================================
414  RevBytesSwap
415 
416  Reverses byte order in place, then reverses bits in those bytes
417 
418  INPUTS
419  bp bitfield structure to reverse
420  elsize size of the underlying data type
421 
422  RESULTS
423  Reverses the bitfield of size elsize.
424  ===================================================================== */
425 void RevBitFieldSwap( void *bp, int elsize) {
426  int i;
427  unsigned char *p, t, v;
428 
429  LittleRevBytes( bp, elsize, 1 );
430 
431  p = (unsigned char *) bp;
432  while ( elsize-- ) {
433  v = *p;
434  t = 0;
435  for (i = 7; i; i--) {
436  t <<= 1;
437  v >>= 1;
438  t |= v & 1;
439  }
440  *p++ = t;
441  }
442 }
443 
444 /*
445 ================
446 RevBytesNoSwap
447 ================
448 */
449 void RevBytesNoSwap( void *bp, int elsize, int elcount ) {
450  return;
451 }
452 
453 /*
454  ================
455  RevBytesNoSwap
456  ================
457  */
458 void RevBitFieldNoSwap( void *bp, int elsize ) {
459  return;
460 }
461 
462 /*
463 ================
464 SixtetsForIntLittle
465 ================
466 */
467 void SixtetsForIntLittle( byte *out, int src) {
468  byte *b = (byte *)&src;
469  out[0] = ( b[0] & 0xfc ) >> 2;
470  out[1] = ( ( b[0] & 0x3 ) << 4 ) + ( ( b[1] & 0xf0 ) >> 4 );
471  out[2] = ( ( b[1] & 0xf ) << 2 ) + ( ( b[2] & 0xc0 ) >> 6 );
472  out[3] = b[2] & 0x3f;
473 }
474 
475 /*
476 ================
477 SixtetsForIntBig
478 TTimo: untested - that's the version from initial base64 encode
479 ================
480 */
481 void SixtetsForIntBig( byte *out, int src) {
482  for( int i = 0 ; i < 4 ; i++ ) {
483  out[i] = src & 0x3f;
484  src >>= 6;
485  }
486 }
487 
488 /*
489 ================
490 IntForSixtetsLittle
491 ================
492 */
494  int ret = 0;
495  byte *b = (byte *)&ret;
496  b[0] |= in[0] << 2;
497  b[0] |= ( in[1] & 0x30 ) >> 4;
498  b[1] |= ( in[1] & 0xf ) << 4;
499  b[1] |= ( in[2] & 0x3c ) >> 2;
500  b[2] |= ( in[2] & 0x3 ) << 6;
501  b[2] |= in[3];
502  return ret;
503 }
504 
505 /*
506 ================
507 IntForSixtetsBig
508 TTimo: untested - that's the version from initial base64 decode
509 ================
510 */
512  int ret = 0;
513  ret |= in[0];
514  ret |= in[1] << 6;
515  ret |= in[2] << 2*6;
516  ret |= in[3] << 3*6;
517  return ret;
518 }
519 
520 /*
521 ================
522 Swap_Init
523 ================
524 */
525 void Swap_Init( void ) {
526  byte swaptest[2] = {1,0};
527 
528  // set the byte swapping variables in a portable manner
529  if ( *(short *)swaptest == 1) {
530  // little endian ex: x86
531  _BigShort = ShortSwap;
532  _LittleShort = ShortNoSwap;
533  _BigLong = LongSwap;
534  _LittleLong = LongNoSwap;
535  _BigFloat = FloatSwap;
536  _LittleFloat = FloatNoSwap;
537  _BigRevBytes = RevBytesSwap;
538  _LittleRevBytes = RevBytesNoSwap;
539  _LittleBitField = RevBitFieldNoSwap;
540  _SixtetsForInt = SixtetsForIntLittle;
541  _IntForSixtets = IntForSixtetsLittle;
542  } else {
543  // big endian ex: ppc
544  _BigShort = ShortNoSwap;
545  _LittleShort = ShortSwap;
546  _BigLong = LongNoSwap;
547  _LittleLong = LongSwap;
548  _BigFloat = FloatNoSwap;
549  _LittleFloat = FloatSwap;
550  _BigRevBytes = RevBytesNoSwap;
551  _LittleRevBytes = RevBytesSwap;
552  _LittleBitField = RevBitFieldSwap;
553  _SixtetsForInt = SixtetsForIntBig;
554  _IntForSixtets = IntForSixtetsBig;
555  }
556 }
557 
558 /*
559 ==========
560 Swap_IsBigEndian
561 ==========
562 */
563 bool Swap_IsBigEndian( void ) {
564  byte swaptest[2] = {1,0};
565  return *(short *)swaptest != 1;
566 }
567 
568 /*
569 ===============================================================================
570 
571  Assertion
572 
573 ===============================================================================
574 */
575 
576 void AssertFailed( const char *file, int line, const char *expression ) {
577  idLib::sys->DebugPrintf( "\n\nASSERTION FAILED!\n%s(%d): '%s'\n", file, line, expression );
578 #ifdef _WIN32
579  __asm int 0x03
580 #elif defined( __linux__ )
581  __asm__ __volatile__ ("int $0x03");
582 #elif defined( MACOS_X )
583  kill( getpid(), SIGINT );
584 #endif
585 }
GLdouble GLdouble GLdouble GLdouble q
Definition: glext.h:2959
static void Test(void)
Definition: Polynomial.cpp:188
byte color[4]
Definition: MegaTexture.cpp:54
unsigned int dword
Definition: Lib.h:77
bool Swap_IsBigEndian(void)
Definition: Lib.cpp:563
idVec4 colorGreen
Definition: Lib.cpp:118
assert(prefInfo.fullscreenBtn)
void AssertFailed(const char *file, int line, const char *expression)
Definition: Lib.cpp:576
static void Warning(const char *fmt,...)
Definition: Lib.cpp:246
static void ShutDown(void)
Definition: Lib.cpp:91
idVec4 colorWhite
Definition: Lib.cpp:116
float y
Definition: Vector.h:811
const GLdouble * v
Definition: glext.h:2936
void UnpackColor(const dword color, idVec4 &unpackedColor)
Definition: Lib.cpp:169
void Set(const float x, const float y, const float z)
Definition: Vector.h:409
float z
Definition: Vector.h:812
float z
Definition: Vector.h:320
case const int
Definition: Callbacks.cpp:52
short ShortNoSwap(short l)
Definition: Lib.cpp:310
void RevBitFieldNoSwap(void *bp, int elsize)
Definition: Lib.cpp:458
virtual void DebugPrintf(const char *fmt,...) id_attribute((format(printf
Definition: Vector.h:316
case const float
Definition: Callbacks.cpp:62
void Mem_Init(void)
Definition: Heap.cpp:1198
dword PackColor(const idVec4 &color)
Definition: Lib.cpp:147
static class idSys * sys
Definition: Lib.h:52
GLuint src
Definition: glext.h:5390
float x
Definition: Vector.h:318
int i
Definition: process.py:33
void LittleBitField(void *bp, int elsize)
Definition: Lib.cpp:286
void SixtetsForIntLittle(byte *out, int src)
Definition: Lib.cpp:467
list l
Definition: prepare.py:17
idVec4 colorLtGrey
Definition: Lib.cpp:127
idVec4 colorRed
Definition: Lib.cpp:117
int IntForSixtetsLittle(byte *in)
Definition: Lib.cpp:493
static void Shutdown(void)
Definition: Simd.cpp:118
idVec4 colorYellow
Definition: Lib.cpp:120
#define FLOATSIGNBITSET(f)
Definition: Math.h:68
static class idFileSystem * fileSystem
Definition: Lib.h:55
float FloatNoSwap(float f)
Definition: Lib.cpp:364
void RevBytesSwap(void *bp, int elsize, int elcount)
Definition: Lib.cpp:382
const GLubyte * c
Definition: glext.h:4677
Definition: Vector.h:808
#define MAX_STRING_CHARS
Definition: Lib.h:95
static void InitMemory(void)
Definition: Str.cpp:1621
#define NULL
Definition: Lib.h:88
void LittleRevBytes(void *bp, int elsize, int elcount)
Definition: Lib.cpp:285
float y
Definition: Vector.h:319
idVec4 colorPink
Definition: Lib.cpp:125
float w
Definition: Vector.h:813
static int frameNumber
Definition: Lib.h:56
idVec4 colorPurple
Definition: Lib.cpp:124
static void Init(void)
Definition: Dict.cpp:627
float BigFloat(float l)
Definition: Lib.cpp:282
int LongSwap(int l)
Definition: Lib.cpp:319
void RevBitFieldSwap(void *bp, int elsize)
Definition: Lib.cpp:425
int LittleLong(int l)
Definition: Lib.cpp:281
static void Init(void)
Definition: Simd.cpp:51
GLubyte GLubyte b
Definition: glext.h:4662
short ShortSwap(short l)
Definition: Lib.cpp:296
idVec4 colorCyan
Definition: Lib.cpp:122
short LittleShort(short l)
Definition: Lib.cpp:279
idVec4 colorOrange
Definition: Lib.cpp:123
static void ShutdownMemory(void)
Definition: Str.cpp:1632
static int static int vsnPrintf(char *dest, int size, const char *fmt, va_list argptr)
Definition: Str.cpp:1502
int IntForSixtets(byte *in)
Definition: Lib.cpp:289
tuple f
Definition: idal.py:89
void BigRevBytes(void *bp, int elsize, int elcount)
Definition: Lib.cpp:284
GLuint in
Definition: glext.h:5388
static void Init(void)
Definition: Lib.cpp:57
unsigned char byte
Definition: Lib.h:75
static class idCVarSystem * cvarSystem
Definition: Lib.h:54
idVec4 colorBrown
Definition: Lib.cpp:126
static void Error(const char *fmt,...)
Definition: Lib.cpp:230
typedef void(APIENTRYP PFNGLBLENDCOLORPROC)(GLclampf red
float FloatSwap(float f)
Definition: Lib.cpp:344
void Swap_Init(void)
Definition: Lib.cpp:525
float LittleFloat(float l)
Definition: Lib.cpp:283
idVec4 colorDkGrey
Definition: Lib.cpp:129
int BigLong(int l)
Definition: Lib.cpp:280
void RevBytesNoSwap(void *bp, int elsize, int elcount)
Definition: Lib.cpp:449
short BigShort(short l)
Definition: Lib.cpp:278
void SixtetsForIntBig(byte *out, int src)
Definition: Lib.cpp:481
idVec4 colorMdGrey
Definition: Lib.cpp:128
static void Shutdown(void)
Definition: Dict.cpp:637
int LongNoSwap(int l)
Definition: Lib.cpp:335
void Mem_Shutdown(void)
Definition: Heap.cpp:1208
int IntForSixtetsBig(byte *in)
Definition: Lib.cpp:511
void SixtetsForInt(byte *out, int src)
Definition: Lib.cpp:288
virtual void Error(const char *fmt,...) id_attribute((format(printf
GLfloat GLfloat p
Definition: glext.h:4674
float x
Definition: Vector.h:810
idVec4 colorBlack
Definition: Lib.cpp:115
idVec4 colorMagenta
Definition: Lib.cpp:121
virtual void virtual void Warning(const char *fmt,...) id_attribute((format(printf
void Set(const float x, const float y, const float z, const float w)
Definition: Vector.h:873
static void Init(void)
Definition: Math.cpp:57
idVec4 colorBlue
Definition: Lib.cpp:119
static class idCommon * common
Definition: Lib.h:53
GLdouble GLdouble t
Definition: glext.h:2943