www.pudn.com > terra-0_7.zip > glHacks.h


#ifndef GLHACKS_INCLUDED // -*- C++ -*-
#define GLHACKS_INCLUDED

#include 
#include 
#include 


/*************************************************************************
 *
 * Yes, here it is.  A bunch of nice overloaded routines to make it
 * easier on the fingers to write OpenGL drawing code.
 *
 * The general stuff provided here is:
 *
 *      - glV
 *      - glN
 *      - glC
 *      - glLoadMatrix/glGetMatrix
 *
 *************************************************************************/



inline void glV(GLdouble x, GLdouble y) { glVertex2d(x,y); }
inline void glV(GLfloat x, GLfloat y) { glVertex2f(x,y); }
inline void glV(GLint x, GLint y) {  glVertex2i(x,y); }
inline void glV(GLshort x, GLshort y) { glVertex2s(x,y); }

inline void glV(GLdouble x, GLdouble y, GLdouble z) { glVertex3d(x,y,z); }
inline void glV(GLfloat x, GLfloat y, GLfloat z) { glVertex3f(x,y,z); }
inline void glV(GLint x, GLint y, GLint z) { glVertex3i(x,y,z); }
inline void glV(GLshort x, GLshort y, GLshort z) { glVertex3s(x,y,z); }


inline void glV(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
            { glVertex4d(x,y,z,w); }
inline void glV(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
            { glVertex4f(x,y,z,w); }
inline void glV(GLint x, GLint y, GLint z, GLint w) { glVertex4i(x,y,z,w); }
inline void glV(GLshort x, GLshort y, GLshort z, GLshort w )
            { glVertex4s(x,y,z,w); }

inline void glV2(const GLdouble *v) { glVertex2dv(v); }
inline void glV2(const GLfloat *v) { glVertex2fv(v); }
inline void glV2(const GLint *v) { glVertex2iv(v); }
inline void glV2(const GLshort *v) { glVertex2sv(v); }


inline void glV3(const GLdouble *v) { glVertex3dv(v); }
inline void glV3(const GLfloat *v) { glVertex3fv(v); }
inline void glV3(const GLint *v) { glVertex3iv(v); }
inline void glV3(const GLshort *v) { glVertex3sv(v); }


inline void glV4(const GLdouble *v) { glVertex4dv(v); }
inline void glV4(const GLfloat *v) { glVertex4fv(v); }
inline void glV4(const GLint *v) { glVertex4iv(v); }
inline void glV4(const GLshort *v) { glVertex4sv(v); }



inline void glN(GLdouble x, GLdouble y, GLdouble z) { glNormal3d(x,y,z); }
inline void glN(GLfloat x, GLfloat y, GLfloat z) { glNormal3f(x,y,z); }
inline void glN(GLint x, GLint y, GLint z) { glNormal3i(x,y,z); }
inline void glN(GLshort x, GLshort y, GLshort z) { glNormal3s(x,y,z); }

inline void glN3(const GLdouble *v) { glNormal3dv(v); }
inline void glN3(const GLfloat *v) { glNormal3fv(v); }
inline void glN3(const GLint *v) { glNormal3iv(v); }
inline void glN3(const GLshort *v) { glNormal3sv(v); }



inline void glC(GLdouble x, GLdouble y, GLdouble z) { glColor3d(x,y,z); }
inline void glC(GLfloat x, GLfloat y, GLfloat z) { glColor3f(x,y,z); }
inline void glC(GLint x, GLint y, GLint z) { glColor3i(x,y,z); }
inline void glC(GLshort x, GLshort y, GLshort z) { glColor3s(x,y,z); }

inline void glC(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
            { glColor4d(x,y,z,w); }
inline void glC(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
            { glColor4f(x,y,z,w); }
inline void glC(GLint x, GLint y, GLint z, GLint w) { glColor4i(x,y,z,w); }
inline void glC(GLshort x, GLshort y, GLshort z, GLshort w )
            { glColor4s(x,y,z,w); }

inline void glC3(const GLdouble *v) { glColor3dv(v); }
inline void glC3(const GLfloat *v) { glColor3fv(v); }
inline void glC3(const GLint *v) { glColor3iv(v); }
inline void glC3(const GLshort *v) { glColor3sv(v); }

inline void glC4(const GLdouble *v) { glColor4dv(v); }
inline void glC4(const GLfloat *v) { glColor4fv(v); }
inline void glC4(const GLint *v) { glColor4iv(v); }
inline void glC4(const GLshort *v) { glColor4sv(v); }



inline void glLoadMatrix(const GLdouble *m) { glLoadMatrixd(m); }
inline void glLoadMatrix(const GLfloat *m) { glLoadMatrixf(m); }

inline void glGetMatrix(GLdouble *m,GLenum src=GL_PROJECTION_MATRIX)
{ glGetDoublev(src,m); }
inline void glGetMatrix(GLfloat *m,GLenum src=GL_PROJECTION_MATRIX)
{ glGetFloatv(src,m); }



/*************************************************************************
 *
 * Here are some more generally useful things.
 *
 *************************************************************************/

extern void glGetViewport(int *x, int *y, int *w, int *h);
extern void glUnproject(int win_x, int win_y, int win_z,
			double *x, double *y, double *z);

typedef union {
    unsigned int pixel;
    struct { unsigned char r,g,b,a; } channel;
} gfxPixel;


inline gfxPixel *glSnapshot(int x, int y, int w, int h)
{
    gfxPixel *data = new gfxPixel[w*h];

    glReadBuffer(GL_FRONT);
    glReadPixels(x,y,w,h,
		 GL_RGBA,
		 GL_UNSIGNED_BYTE,
		 data);

    return data;
}

#ifdef __STDIO_H__
inline void glToPPM(FILE *out)
{
    int x,y,w,h;
    
    glGetViewport(&x, &y, &w, &h);
    gfxPixel *data = glSnapshot(x,y,w,h);

    fprintf(out,"P6 %u %u 255\n",w,h);
    int i,j;
    for(j=h-1;j>=0;j--)
	for(i=0;i=0;j--)
	for(i=0;i