/** @file glcalls.h Maps OpenGL calls to G3D data types @maintainer Morgan McGuire, matrix@graphics3d.com @created 2002-08-07 @edited 2006-05-05 Copyright 2002-2006, Morgan McGuire. All rights reserved. */ #ifndef G3D_GLCALLS_H #define G3D_GLCALLS_H #include "G3D/platform.h" #include "G3D/Vector2.h" #include "G3D/Vector3.h" #include "G3D/Vector3int16.h" #include "G3D/Vector4.h" #include "G3D/Color3.h" #include "G3D/Color3uint8.h" #include "G3D/Color4.h" #include "G3D/Color4uint8.h" #include "G3D/debugAssert.h" #include "GLG3D/glheaders.h" #ifdef _DEBUG // Needed for debugAssertGLOk # include "GLG3D/getOpenGLState.h" #endif namespace G3D { class CoordinateFrame; class Matrix3; class Matrix4; /** Produces a debugAssert that no OpenGL error has been produced. */ #ifdef _DEBUG # define debugAssertGLOk() {GLenum e = glGetError(); debugAssertM(e == GL_NO_ERROR, G3D::GLenumToString(e));} #else # define debugAssertGLOk() #endif /** A functional version of glGetIntegerv */ GLint glGetInteger(GLenum which); /** A functional version of glGetFloatv */ GLfloat glGetFloat(GLenum which); /** A functional version of glGetDoublev */ GLboolean glGetBoolean(GLenum which); /** A functional version of glGetDoublev */ GLdouble glGetDouble(GLenum which); /** Safe to call even if the glGet would return more than 2 values */ Vector2 glGetVector2(GLenum which); Vector3 glGetVector3(GLenum which); Vector4 glGetVector4(GLenum which); #ifdef G3D_WIN32 /** OpenGL context (argument to glMakeCurrent, return value of glGetCurrentContext). BETA API-- subject to change */ typedef HGLRC GLContext; /** Returns the current OpenGL context if more than one is in use. BETA API-- subject to change */ inline GLContext glGetCurrentContext() { return wglGetCurrentContext(); } #elif defined(G3D_LINUX) || defined(G3D_FREEBSD) typedef GLXContext GLContext; inline GLContext glGetCurrentContext() { return glXGetCurrentContext(); } #elif defined(G3D_OSX) typedef CGLContextObj GLContext; inline GLContext glGetCurrentContext() { return CGLGetCurrentContext(); } #endif inline void glMultiTexCoord(GLint unit, float v) { glMultiTexCoord1fARB(unit, v); } inline void glMultiTexCoord(GLint unit, const G3D::Vector2& v) { glMultiTexCoord2fvARB(unit, (const float*)&v); } inline void glMultiTexCoord(GLint unit, const G3D::Vector2int16& v) { glMultiTexCoord(unit, Vector2(v.x, v.y)); } inline void glMultiTexCoord(GLint unit, const G3D::Vector3& v) { glMultiTexCoord3fvARB(unit, (const float*)&v); } inline void glMultiTexCoord(GLint unit, const G3D::Vector3int16& v) { glMultiTexCoord(unit, Vector3(v.x, v.y, v.z)); } inline void glMultiTexCoord(GLint unit, const G3D::Vector4& v) { glMultiTexCoord4fvARB(unit, (const float*)&v); } inline void glVertex(const G3D::Vector2& v) { glVertex2fv((const float*)&v); } inline void glVertex(const G3D::Vector2int16& v) { glVertex2i(v.x, v.y); } inline void glVertex(const G3D::Vector3& v) { glVertex3fv((const float*)&v); } inline void glVertex(const G3D::Vector3int16& v) { glVertex3i(v.x, v.y, v.z); } inline void glVertex(const G3D::Vector4& v) { glVertex4fv((const float*)&v); } inline void glColor(const G3D::Color3 &c) { glColor3fv((const float*)&c); } inline void glColor(const G3D::Color4& c) { glColor4fv((const float*)&c); } inline void glColor(float r, float g, float b, float a) { glColor4f(r, g, b, a); } inline void glColor(float r, float g, float b) { glColor3f(r, g, b); } inline void glNormal(const G3D::Vector3& n) { glNormal3fv((const float*)&n); } inline void glTexCoord(const G3D::Vector4& t) { glTexCoord4fv((const float*)&t); } inline void glTexCoord(const G3D::Vector3& t) { glTexCoord3fv((const float*)&t); } inline void glTexCoord(const G3D::Vector2& t) { glTexCoord2fv((const float*)&t); } inline void glTexCoord(const float t) { glTexCoord1f(t); } /** Loads a coordinate frame into the current OpenGL matrix slot. */ void glLoadMatrix(const CoordinateFrame& cf); void glLoadMatrix(const Matrix4& m); void glGetMatrix(GLenum name, Matrix4& m); Matrix4 glGetMatrix(GLenum name); /** Loads the inverse of a coordinate frame into the current OpenGL matrix slot. */ void glLoadInvMatrix(const CoordinateFrame& cf); /** Multiplies the current GL matrix slot by the inverse of a matrix. */ void glMultInvMatrix(const CoordinateFrame& cf); /** Multiplies the current GL matrix slot by this matrix. */ void glMultMatrix(const CoordinateFrame& cf); /** Platform independent version of wglGetProcAddress/glXGetProcAddress/NSGLGetProcAddress */ void* glGetProcAddress(const char * name); /** Takes an object space point to screen space using the current MODELVIEW and PROJECTION matrices. The resulting xy values are in pixels, the z value is on the glDepthRange scale, and the w value contains rhw (-1/z for camera space z), which is useful for scaling line and point size. */ Vector4 glToScreen(const Vector4& v); /** Calls glDisable() for all supported texture types: 1D, 2D, 3D, cube, rectangle. */ void glDisableAllTextures(); } // namespace #endif