📄 extgl.h
字号:
extern "C" {
#endif
/* stuff for NV_half_float extension (datatype and conversion functions)
I hope this type will be reused for other 2 byte float extensions */
union ieee_half /* ieee-like 16 bit float */
{
unsigned short bits;
struct
{
unsigned long m : 10; /* mantissa */
unsigned long e : 5; /* exponent */
unsigned long s : 1; /* sign */
} ieee;
};
union ieee_single /* ieee-754 single floating point type */
{
float f;
struct
{
unsigned long m : 23; /* mantissa */
unsigned long e : 8; /* exponent */
unsigned long s : 1; /* sign */
} ieee;
};
/* the actual typedef */
typedef unsigned short GLhalf;
/* conversion functions */
/* half to float */
__inline static float htof(GLhalf val)
{
union ieee_half h;
union ieee_single sng;
h.bits = val;
sng.ieee.s = h.ieee.s;
/* special cases */
if ((h.ieee.e==0) && (h.ieee.m==0))
{ /* zero */
sng.ieee.m=0;
sng.ieee.e=0;
}
else if ((h.ieee.e==0) && (h.ieee.m!=0))
{ /* denorm -- denorm half will fit in non-denorm single */
const float half_denorm = (1.0f/16384.0f); // 2^-14
float mantissa = ((float)(h.ieee.m)) / 1024.0f;
float sgn = (h.ieee.s)? -1.0f :1.0f;
sng.f = sgn*mantissa*half_denorm;
}
else if ((h.ieee.e==31) && (h.ieee.m==0))
{ /* infinity */
sng.ieee.e = 0xff;
sng.ieee.m = 0;
}
else if ((h.ieee.e==31) && (h.ieee.m!=0))
{ /* NaN */
sng.ieee.e = 0xff;
sng.ieee.m = 1;
}
else
{
sng.ieee.e = h.ieee.e+112;
sng.ieee.m = (h.ieee.m << 13);
}
return sng.f;
}
/* float to half */
__inline static GLhalf ftoh(float val)
{
union ieee_single f;
union ieee_half h;
f.f = val;
h.ieee.s = f.ieee.s;
/* special cases */
if ((f.ieee.e==0) && (f.ieee.m==0))
{ /* zero */
h.ieee.m = 0;
h.ieee.e = 0;
}
else if ((f.ieee.e==0) && (f.ieee.m!=0))
{ /* denorm -- denorm float maps to 0 half */
h.ieee.m = 0;
h.ieee.e = 0;
}
else if ((f.ieee.e==0xff) && (f.ieee.m==0))
{ /* infinity */
h.ieee.m = 0;
h.ieee.e = 31;
}
else if ((f.ieee.e==0xff) && (f.ieee.m!=0))
{ /* NaN */
h.ieee.m = 1;
h.ieee.e = 31;
}
else
{ /* normal case */
int new_exp = f.ieee.e-127;
if (new_exp<-24)
{ /* half can't map such numbers */
h.ieee.m = 0;
h.ieee.e = 0;
}
if (new_exp<-14)
{ /* this maps to a denorm */
unsigned int exp_val = (unsigned int) (-14 - new_exp); // 2^-exp_val
h.ieee.e = 0;
switch (exp_val)
{
case 0: h.ieee.m = 0; break; /* logical error */
case 1: h.ieee.m = 512 + (f.ieee.m>>14); break;
case 2: h.ieee.m = 256 + (f.ieee.m>>15); break;
case 3: h.ieee.m = 128 + (f.ieee.m>>16); break;
case 4: h.ieee.m = 64 + (f.ieee.m>>17); break;
case 5: h.ieee.m = 32 + (f.ieee.m>>18); break;
case 6: h.ieee.m = 16 + (f.ieee.m>>19); break;
case 7: h.ieee.m = 8 + (f.ieee.m>>20); break;
case 8: h.ieee.m = 4 + (f.ieee.m>>21); break;
case 9: h.ieee.m = 2 + (f.ieee.m>>22); break;
case 10: h.ieee.m = 1; break;
}
}
else if (new_exp>15)
{ /* map this value to infinity */
h.ieee.m = 0;
h.ieee.e = 31;
}
else
{
h.ieee.e = new_exp+15;
h.ieee.m = (f.ieee.m >> 13);
}
}
return h.bits;
}
/* OpenGL 1.1 definition */
typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef unsigned int GLbitfield;
typedef signed char GLbyte;
typedef short GLshort;
typedef int GLint;
typedef int GLsizei;
typedef unsigned char GLubyte;
typedef unsigned short GLushort;
typedef unsigned int GLuint;
typedef float GLfloat;
typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;
#if !defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MINGW32__)
#include <GL/glx.h>
#endif /* _WIN32 */
/* for mingw compatibility */
typedef void (*_GLfuncptr)();
#define GL_VERSION_1_1 1
#define GL_ACCUM 0x0100
#define GL_LOAD 0x0101
#define GL_RETURN 0x0102
#define GL_MULT 0x0103
#define GL_ADD 0x0104
#define GL_NEVER 0x0200
#define GL_LESS 0x0201
#define GL_EQUAL 0x0202
#define GL_LEQUAL 0x0203
#define GL_GREATER 0x0204
#define GL_NOTEQUAL 0x0205
#define GL_GEQUAL 0x0206
#define GL_ALWAYS 0x0207
#define GL_CURRENT_BIT 0x00000001
#define GL_POINT_BIT 0x00000002
#define GL_LINE_BIT 0x00000004
#define GL_POLYGON_BIT 0x00000008
#define GL_POLYGON_STIPPLE_BIT 0x00000010
#define GL_PIXEL_MODE_BIT 0x00000020
#define GL_LIGHTING_BIT 0x00000040
#define GL_FOG_BIT 0x00000080
#define GL_DEPTH_BUFFER_BIT 0x00000100
#define GL_ACCUM_BUFFER_BIT 0x00000200
#define GL_STENCIL_BUFFER_BIT 0x00000400
#define GL_VIEWPORT_BIT 0x00000800
#define GL_TRANSFORM_BIT 0x00001000
#define GL_ENABLE_BIT 0x00002000
#define GL_COLOR_BUFFER_BIT 0x00004000
#define GL_HINT_BIT 0x00008000
#define GL_EVAL_BIT 0x00010000
#define GL_LIST_BIT 0x00020000
#define GL_TEXTURE_BIT 0x00040000
#define GL_SCISSOR_BIT 0x00080000
#define GL_ALL_ATTRIB_BITS 0x000fffff
#define GL_POINTS 0x0000
#define GL_LINES 0x0001
#define GL_LINE_LOOP 0x0002
#define GL_LINE_STRIP 0x0003
#define GL_TRIANGLES 0x0004
#define GL_TRIANGLE_STRIP 0x0005
#define GL_TRIANGLE_FAN 0x0006
#define GL_QUADS 0x0007
#define GL_QUAD_STRIP 0x0008
#define GL_POLYGON 0x0009
#define GL_ZERO 0
#define GL_ONE 1
#define GL_SRC_COLOR 0x0300
#define GL_ONE_MINUS_SRC_COLOR 0x0301
#define GL_SRC_ALPHA 0x0302
#define GL_ONE_MINUS_SRC_ALPHA 0x0303
#define GL_DST_ALPHA 0x0304
#define GL_ONE_MINUS_DST_ALPHA 0x0305
#define GL_DST_COLOR 0x0306
#define GL_ONE_MINUS_DST_COLOR 0x0307
#define GL_SRC_ALPHA_SATURATE 0x0308
#define GL_TRUE 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -