/* Copyright (C) 1999-2007 id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ //----------------------------------------------------------------------------- // // // DESCRIPTION: // all purpose OpenGL interface for Q3Radiant plugins // #ifndef __IGL_H__ #define __IGL_H__ #if defined (__linux__) || defined (__APPLE__) #include #endif // we use these classes to let plugins draw inside the Radiant windows // 2D window like YZ XZ XY class IGL2DWindow { public: virtual ~IGL2DWindow() { } // Increment the number of references to this object virtual void IncRef () = 0; // Decrement the reference count virtual void DecRef () = 0; virtual void Draw2D( VIEWTYPE vt ) = 0; }; // 3D window class IGL3DWindow { public: virtual ~IGL3DWindow() { } // Increment the number of references to this object virtual void IncRef () = 0; // Decrement the reference count virtual void DecRef () = 0; virtual void Draw3D() = 0; }; #define QGL_MAJOR "qgl" #include typedef void (APIENTRY* PFN_QGLALPHAFUNC) (GLenum func, GLclampf ref); typedef void (APIENTRY* PFN_QGLBEGIN) (GLenum); typedef void (APIENTRY* PFN_QGLBINDTEXTURE) (GLenum target, GLuint texture); typedef void (APIENTRY* PFN_QGLBLENDFUNC) (GLenum sfactor, GLenum dfactor); typedef void (APIENTRY* PFN_QGLCALLLIST) (GLuint list); typedef void (APIENTRY* PFN_QGLCALLLISTS) (GLsizei n, GLenum type, const GLvoid *lists); typedef void (APIENTRY* PFN_QGLCLEAR) (GLbitfield mask); typedef void (APIENTRY* PFN_QGLCLEARCOLOR) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); typedef void (APIENTRY* PFN_QGLCLEARDEPTH) (GLclampd depth); typedef void (APIENTRY* PFN_QGLCOLOR3F) (GLfloat red, GLfloat green, GLfloat blue); typedef void (APIENTRY* PFN_QGLCOLOR3FV) (const GLfloat *v); typedef void (APIENTRY* PFN_QGLCOLOR4F) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (APIENTRY* PFN_QGLCOLOR4FV) (const GLfloat *v); typedef void (APIENTRY* PFN_QGLCOLOR4UBV) (const GLubyte *v); typedef void (APIENTRY* PFN_QGLCOLORPOINTER) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRY* PFN_QGLCULLFACE) (GLenum mode); typedef void (APIENTRY* PFN_QGLDELETELISTS) (GLuint list, GLsizei range); typedef void (APIENTRY* PFN_QGLDELETETEXTURES) (GLsizei n, const GLuint *textures); typedef void (APIENTRY* PFN_QGLDEPTHFUNC) (GLenum func); typedef void (APIENTRY* PFN_QGLDEPTHMASK) (GLboolean flag); typedef void (APIENTRY* PFN_QGLDISABLE) (GLenum cap); typedef void (APIENTRY* PFN_QGLDISABLECLIENTSTATE) (GLenum array); typedef void (APIENTRY* PFN_QGLDRAWELEMENTS) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); typedef void (APIENTRY* PFN_QGLENABLE) (GLenum cap); typedef void (APIENTRY* PFN_QGLENABLECLIENTSTATE) (GLenum array); typedef void (APIENTRY* PFN_QGLEND) (); typedef void (APIENTRY* PFN_QGLENDLIST) (); typedef void (APIENTRY* PFN_QGLFOGF) (GLenum pname, GLfloat param); typedef void (APIENTRY* PFN_QGLFOGFV) (GLenum pname, const GLfloat *params); typedef void (APIENTRY* PFN_QGLFOGFI) (GLenum pname, GLint param); typedef GLuint (APIENTRY* PFN_QGLGENLISTS) (GLsizei range); typedef void (APIENTRY *PFN_QGLGENTEXTURES) (GLsizei n, GLuint *textures); typedef void (APIENTRY* PFN_QGLGETDOUBLEV) (GLenum pname, GLdouble *params); typedef void (APIENTRY* PFN_QGLHINT) (GLenum target, GLenum mode); typedef void (APIENTRY* PFN_QGLGETINTEGERV) (GLenum pname, GLint *params); typedef void (APIENTRY* PFN_QGLLIGHTFV) (GLenum light, GLenum pname, const GLfloat *params); typedef void (APIENTRY* PFN_QGLLINEWIDTH) (GLfloat size); typedef void (APIENTRY* PFN_QGLLINESTIPPLE) (GLint factor, GLushort pattern); typedef void (APIENTRY* PFN_QGLLINEWIDTH) (GLfloat size); typedef void (APIENTRY* PFN_QGLLISTBASE) (GLuint base); typedef void (APIENTRY* PFN_QGLLOADIDENTITY) (); typedef void (APIENTRY* PFN_QGLMATERIALF) (GLenum face, GLenum pname, GLfloat param); typedef void (APIENTRY* PFN_QGLMATERIALFV) (GLenum face, GLenum pname, const GLfloat *params); typedef void (APIENTRY* PFN_QGLMATRIXMODE) (GLenum mode); typedef void (APIENTRY* PFN_QGLMULTMATRIXF) (const GLfloat *m); typedef void (APIENTRY* PFN_QGLNEWLIST) (GLuint list, GLenum mode); typedef void (APIENTRY* PFN_QGLNORMAL3F) (GLfloat nx, GLfloat ny, GLfloat nz); typedef void (APIENTRY* PFN_QGLNORMAL3FV) (const GLfloat *n); typedef void (APIENTRY* PFN_QGLNORMALPOINTER) (GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRY* PFN_QGLORTHO) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); typedef void (APIENTRY* PFN_QGLPOINTSIZE) (GLfloat size); typedef void (APIENTRY* PFN_QGLPOLYGONMODE) (GLenum face, GLenum mode); typedef void (APIENTRY* PFN_QGLPOPATTRIB) (); typedef void (APIENTRY* PFN_QGLPOPMATRIX) (); typedef void (APIENTRY* PFN_QGLPUSHATTRIB) (GLbitfield mask); typedef void (APIENTRY* PFN_QGLPUSHMATRIX) (); typedef void (APIENTRY* PFN_QGLRASTERPOS3FV) (const GLfloat *v); typedef void (APIENTRY* PFN_QGLROTATED) (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRY* PFN_QGLROTATEF) (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY* PFN_QGLSCALEF) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY* PFN_QGLSCISSOR) (GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRY* PFN_QGLSCALEF) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY* PFN_QGLSHADEMODEL) (GLenum mode); typedef void (APIENTRY* PFN_QGLTEXCOORD2F) (GLfloat s, GLfloat t); typedef void (APIENTRY* PFN_QGLTEXCOORD2FV) (const GLfloat *v); typedef void (APIENTRY* PFN_QGLTEXCOORDPOINTER) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRY* PFN_QGLTEXENVF) (GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRY* PFN_QGLTEXGENF) (GLenum coord, GLenum pname, GLfloat param); typedef void (APIENTRY* PFN_QGLTEXIMAGE1D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRY* PFN_QGLTEXIMAGE2D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRY* PFN_QGLTEXPARAMETERF) (GLenum target, GLenum pname, GLfloat param); typedef void (APIENTRY* PFN_QGLTEXPARAMETERFV) (GLenum target, GLenum pname, const GLfloat *params); typedef void (APIENTRY* PFN_QGLTEXPARAMETERI) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRY* PFN_QGLTEXPARAMETERIV) (GLenum target, GLenum pname, const GLint *params); typedef void (APIENTRY* PFN_QGLTEXSUBIMAGE1D) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRY* PFN_QGLTEXSUBIMAGE2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRY* PFN_QGLTRANSLATED) (GLdouble x, GLdouble y, GLdouble z); typedef void (APIENTRY* PFN_QGLTRANSLATEF) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY* PFN_QGLVERTEX2F) (GLfloat x, GLfloat y); typedef void (APIENTRY* PFN_QGLVERTEX3F) (GLfloat x, GLfloat y, GLfloat z); typedef void (APIENTRY* PFN_QGLVERTEX3FV) (const GLfloat *v); typedef void (APIENTRY* PFN_QGLVERTEXPOINTER) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRY* PFN_QGLVIEWPORT) (GLint x, GLint y, GLsizei width, GLsizei height); typedef void (WINAPI* PFN_QE_CHECKOPENGLFORERRORS) (); // glu stuff // TTimo: NOTE: relying on glu might not be such a good idea. On many systems, the GLU lib is outdated, misversioned etc. typedef void (APIENTRY * PFN_QGLUPERSPECTIVE) (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); typedef void (APIENTRY * PFN_QGLULOOKAT) (GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); //++timo gluErrorString is defined but not exposed in the IGL interface // plugins drawing inside the GL windows //++timo TODO: add hooking into other windows (Z and .. texture??) //+timo NOTE: this could be moved to the messaging system instead of having a dedicated interface <- yet I don't know how typedef void (WINAPI* PFN_QERAPP_HOOKGL2DWINDOW) (IGL2DWindow *); typedef void (WINAPI* PFN_QERAPP_UNHOOKGL2DWINDOW) (IGL2DWindow *); typedef void (WINAPI* PFN_QERAPP_HOOKGL3DWINDOW) (IGL3DWindow *); typedef void (WINAPI* PFN_QERAPP_UNHOOKGL3DWINDOW) (IGL3DWindow *); struct _QERQglTable { //++timo do we really wanna play with versions ? // float m_fVersion; int m_nSize; PFN_QGLALPHAFUNC m_pfn_qglAlphaFunc; PFN_QGLBEGIN m_pfn_qglBegin; PFN_QGLBINDTEXTURE m_pfn_qglBindTexture; PFN_QGLBLENDFUNC m_pfn_qglBlendFunc; PFN_QGLCALLLIST m_pfn_qglCallList; PFN_QGLCLEAR m_pfn_qglClear; PFN_QGLCLEARCOLOR m_pfn_qglClearColor; PFN_QGLCALLLISTS m_pfn_qglCallLists; PFN_QGLCLEARDEPTH m_pfn_qglClearDepth; PFN_QGLCOLOR3F m_pfn_qglColor3f; PFN_QGLCOLOR3FV m_pfn_qglColor3fv; PFN_QGLCOLOR4F m_pfn_qglColor4f; PFN_QGLCOLOR4FV m_pfn_qglColor4fv; PFN_QGLCOLOR4UBV m_pfn_qglColor4ubv; // ydnar PFN_QGLCOLORPOINTER m_pfn_qglColorPointer; PFN_QGLCULLFACE m_pfn_qglCullFace; PFN_QGLDELETELISTS m_pfn_qglDeleteLists; PFN_QGLDELETETEXTURES m_pfn_qglDeleteTextures; PFN_QGLDEPTHFUNC m_pfn_qglDepthFunc; PFN_QGLDEPTHMASK m_pfn_qglDepthMask; PFN_QGLDISABLE m_pfn_qglDisable; PFN_QGLDISABLECLIENTSTATE m_pfn_qglDisableClientState; PFN_QGLDRAWELEMENTS m_pfn_qglDrawElements; PFN_QGLENABLE m_pfn_qglEnable; PFN_QGLENABLECLIENTSTATE m_pfn_qglEnableClientState; PFN_QGLEND m_pfn_qglEnd; PFN_QGLENDLIST m_pfn_qglEndList; PFN_QGLFOGF m_pfn_qglFogf; PFN_QGLFOGFV m_pfn_qglFogfv; PFN_QGLFOGFI m_pfn_qglFogi; PFN_QGLGENLISTS m_pfn_qglGenLists; PFN_QGLGENTEXTURES m_pfn_qglGenTextures; PFN_QGLGETDOUBLEV m_pfn_qglGetDoublev; PFN_QGLGETINTEGERV m_pfn_qglGetIntegerv; PFN_QGLHINT m_pfn_qglHint; PFN_QGLLIGHTFV m_pfn_qglLightfv; PFN_QGLLINESTIPPLE m_pfn_qglLineStipple; PFN_QGLLINEWIDTH m_pfn_qglLineWidth; PFN_QGLLISTBASE m_pfn_qglListBase; PFN_QGLLOADIDENTITY m_pfn_qglLoadIdentity; PFN_QGLMATERIALF m_pfn_qglMaterialf; PFN_QGLMATERIALFV m_pfn_qglMaterialfv; PFN_QGLMATRIXMODE m_pfn_qglMatrixMode; PFN_QGLMULTMATRIXF m_pfn_qglMultMatrixf; PFN_QGLNEWLIST m_pfn_qglNewList; PFN_QGLNORMAL3F m_pfn_qglNormal3f; PFN_QGLNORMAL3FV m_pfn_qglNormal3fv; PFN_QGLNORMALPOINTER m_pfn_qglNormalPointer; PFN_QGLORTHO m_pfn_qglOrtho; PFN_QGLPOINTSIZE m_pfn_qglPointSize; PFN_QGLPOLYGONMODE m_pfn_qglPolygonMode; PFN_QGLPOPATTRIB m_pfn_qglPopAttrib; PFN_QGLPOPMATRIX m_pfn_qglPopMatrix; PFN_QGLPUSHATTRIB m_pfn_qglPushAttrib; PFN_QGLPUSHMATRIX m_pfn_qglPushMatrix; PFN_QGLRASTERPOS3FV m_pfn_qglRasterPos3fv; PFN_QGLROTATED m_pfn_qglRotated; PFN_QGLROTATEF m_pfn_qglRotatef; PFN_QGLSCALEF m_pfn_qglScalef; PFN_QGLSCISSOR m_pfn_qglScissor; PFN_QGLSHADEMODEL m_pfn_qglShadeModel; PFN_QGLTEXCOORD2F m_pfn_qglTexCoord2f; PFN_QGLTEXCOORD2FV m_pfn_qglTexCoord2fv; PFN_QGLTEXCOORDPOINTER m_pfn_qglTexCoordPointer; PFN_QGLTEXENVF m_pfn_qglTexEnvf; PFN_QGLTEXGENF m_pfn_qglTexGenf; PFN_QGLTEXIMAGE1D m_pfn_qglTexImage1D; PFN_QGLTEXIMAGE2D m_pfn_qglTexImage2D; PFN_QGLTEXPARAMETERF m_pfn_qglTexParameterf; PFN_QGLTEXPARAMETERFV m_pfn_qglTexParameterfv; PFN_QGLTEXPARAMETERI m_pfn_qglTexParameteri; PFN_QGLTEXPARAMETERIV m_pfn_qglTexParameteriv; PFN_QGLTEXSUBIMAGE1D m_pfn_qglTexSubImage1D; PFN_QGLTEXSUBIMAGE2D m_pfn_qglTexSubImage2D; PFN_QGLTRANSLATED m_pfn_qglTranslated; PFN_QGLTRANSLATEF m_pfn_qglTranslatef; PFN_QGLVERTEX2F m_pfn_qglVertex2f; PFN_QGLVERTEX3F m_pfn_qglVertex3f; PFN_QGLVERTEX3FV m_pfn_qglVertex3fv; PFN_QGLVERTEXPOINTER m_pfn_qglVertexPointer; PFN_QGLVIEWPORT m_pfn_qglViewport; PFN_QE_CHECKOPENGLFORERRORS m_pfn_QE_CheckOpenGLForErrors; // glu stuff PFN_QGLUPERSPECTIVE m_pfn_qgluPerspective; PFN_QGLULOOKAT m_pfn_qgluLookAt; // plugin entities drawing inside Radiant windows PFN_QERAPP_HOOKGL2DWINDOW m_pfnHookGL2DWindow; PFN_QERAPP_UNHOOKGL2DWINDOW m_pfnUnHookGL2DWindow; PFN_QERAPP_HOOKGL3DWINDOW m_pfnHookGL3DWindow; PFN_QERAPP_UNHOOKGL3DWINDOW m_pfnUnHookGL3DWindow; }; #endif