| 1 | /* |
| 2 | * fg_ext.c |
| 3 | * |
| 4 | * Functions related to OpenGL extensions. |
| 5 | * |
| 6 | * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. |
| 7 | * Written by Pawel W. Olszta, <olszta@sourceforge.net> |
| 8 | * Creation date: Thu Dec 9 1999 |
| 9 | * |
| 10 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 11 | * copy of this software and associated documentation files (the "Software"), |
| 12 | * to deal in the Software without restriction, including without limitation |
| 13 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| 14 | * and/or sell copies of the Software, and to permit persons to whom the |
| 15 | * Software is furnished to do so, subject to the following conditions: |
| 16 | * |
| 17 | * The above copyright notice and this permission notice shall be included |
| 18 | * in all copies or substantial portions of the Software. |
| 19 | * |
| 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| 21 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 22 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| 23 | * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
| 24 | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| 25 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 26 | */ |
| 27 | |
| 28 | #define GLX_GLXEXT_PROTOTYPES |
| 29 | #include <GL/freeglut.h> |
| 30 | #include "fg_internal.h" |
| 31 | |
| 32 | extern SFG_Proc fgPlatformGetProcAddress( const char *procName ); |
| 33 | extern GLUTproc fgPlatformGetGLUTProcAddress( const char *procName ); |
| 34 | |
| 35 | static GLUTproc fghGetGLUTProcAddress( const char* procName ) |
| 36 | { |
| 37 | /* optimization: quick initial check */ |
| 38 | if( strncmp( procName, "glut" , 4 ) != 0 ) |
| 39 | return NULL; |
| 40 | |
| 41 | #define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x; |
| 42 | CHECK_NAME(glutInit); |
| 43 | CHECK_NAME(glutInitDisplayMode); |
| 44 | CHECK_NAME(glutInitDisplayString); |
| 45 | CHECK_NAME(glutInitWindowPosition); |
| 46 | CHECK_NAME(glutInitWindowSize); |
| 47 | CHECK_NAME(glutMainLoop); |
| 48 | CHECK_NAME(glutExit); |
| 49 | CHECK_NAME(glutCreateWindow); |
| 50 | CHECK_NAME(glutCreateSubWindow); |
| 51 | CHECK_NAME(glutDestroyWindow); |
| 52 | CHECK_NAME(glutPostRedisplay); |
| 53 | CHECK_NAME(glutPostWindowRedisplay); |
| 54 | CHECK_NAME(glutSwapBuffers); |
| 55 | CHECK_NAME(glutGetWindow); |
| 56 | CHECK_NAME(glutSetWindow); |
| 57 | CHECK_NAME(glutSetWindowTitle); |
| 58 | CHECK_NAME(glutSetIconTitle); |
| 59 | CHECK_NAME(glutPositionWindow); |
| 60 | CHECK_NAME(glutReshapeWindow); |
| 61 | CHECK_NAME(glutPopWindow); |
| 62 | CHECK_NAME(glutPushWindow); |
| 63 | CHECK_NAME(glutIconifyWindow); |
| 64 | CHECK_NAME(glutShowWindow); |
| 65 | CHECK_NAME(glutHideWindow); |
| 66 | CHECK_NAME(glutFullScreen); |
| 67 | CHECK_NAME(glutSetCursor); |
| 68 | CHECK_NAME(glutWarpPointer); |
| 69 | CHECK_NAME(glutEstablishOverlay); |
| 70 | CHECK_NAME(glutRemoveOverlay); |
| 71 | CHECK_NAME(glutUseLayer); |
| 72 | CHECK_NAME(glutPostOverlayRedisplay); |
| 73 | CHECK_NAME(glutPostWindowOverlayRedisplay); |
| 74 | CHECK_NAME(glutShowOverlay); |
| 75 | CHECK_NAME(glutHideOverlay); |
| 76 | CHECK_NAME(glutCreateMenu); |
| 77 | CHECK_NAME(glutDestroyMenu); |
| 78 | CHECK_NAME(glutGetMenu); |
| 79 | CHECK_NAME(glutSetMenu); |
| 80 | CHECK_NAME(glutAddMenuEntry); |
| 81 | CHECK_NAME(glutAddSubMenu); |
| 82 | CHECK_NAME(glutChangeToMenuEntry); |
| 83 | CHECK_NAME(glutChangeToSubMenu); |
| 84 | CHECK_NAME(glutRemoveMenuItem); |
| 85 | CHECK_NAME(glutAttachMenu); |
| 86 | CHECK_NAME(glutDetachMenu); |
| 87 | CHECK_NAME(glutDisplayFunc); |
| 88 | CHECK_NAME(glutReshapeFunc); |
| 89 | CHECK_NAME(glutPositionFunc); |
| 90 | CHECK_NAME(glutKeyboardFunc); |
| 91 | CHECK_NAME(glutMouseFunc); |
| 92 | CHECK_NAME(glutMultiEntryFunc); |
| 93 | CHECK_NAME(glutMultiMotionFunc); |
| 94 | CHECK_NAME(glutMultiButtonFunc); |
| 95 | CHECK_NAME(glutMultiPassiveFunc); |
| 96 | CHECK_NAME(glutMotionFunc); |
| 97 | CHECK_NAME(glutPassiveMotionFunc); |
| 98 | CHECK_NAME(glutEntryFunc); |
| 99 | CHECK_NAME(glutVisibilityFunc); |
| 100 | CHECK_NAME(glutIdleFunc); |
| 101 | CHECK_NAME(glutTimerFunc); |
| 102 | CHECK_NAME(glutMenuStateFunc); |
| 103 | CHECK_NAME(glutSpecialFunc); |
| 104 | CHECK_NAME(glutSpaceballMotionFunc); |
| 105 | CHECK_NAME(glutSpaceballRotateFunc); |
| 106 | CHECK_NAME(glutSpaceballButtonFunc); |
| 107 | CHECK_NAME(glutButtonBoxFunc); |
| 108 | CHECK_NAME(glutDialsFunc); |
| 109 | CHECK_NAME(glutTabletMotionFunc); |
| 110 | CHECK_NAME(glutTabletButtonFunc); |
| 111 | CHECK_NAME(glutMenuStatusFunc); |
| 112 | CHECK_NAME(glutOverlayDisplayFunc); |
| 113 | CHECK_NAME(glutWindowStatusFunc); |
| 114 | CHECK_NAME(glutKeyboardDownFunc); |
| 115 | CHECK_NAME(glutKeyboardUpFunc); |
| 116 | CHECK_NAME(glutSpecialUpFunc); |
| 117 | CHECK_NAME(glutSetColor); |
| 118 | CHECK_NAME(glutGetColor); |
| 119 | CHECK_NAME(glutCopyColormap); |
| 120 | CHECK_NAME(glutGet); |
| 121 | CHECK_NAME(glutDeviceGet); |
| 122 | CHECK_NAME(glutExtensionSupported); |
| 123 | CHECK_NAME(glutGetModifiers); |
| 124 | CHECK_NAME(glutLayerGet); |
| 125 | CHECK_NAME(glutBitmapCharacter); |
| 126 | CHECK_NAME(glutBitmapWidth); |
| 127 | CHECK_NAME(glutStrokeCharacter); |
| 128 | CHECK_NAME(glutStrokeWidth); |
| 129 | CHECK_NAME(glutStrokeWidthf); |
| 130 | CHECK_NAME(glutBitmapLength); |
| 131 | CHECK_NAME(glutStrokeLength); |
| 132 | CHECK_NAME(glutStrokeLengthf); |
| 133 | CHECK_NAME(glutWireSphere); |
| 134 | CHECK_NAME(glutSolidSphere); |
| 135 | CHECK_NAME(glutWireCone); |
| 136 | CHECK_NAME(glutSolidCone); |
| 137 | CHECK_NAME(glutWireTorus); |
| 138 | CHECK_NAME(glutSolidTorus); |
| 139 | CHECK_NAME(glutWireCylinder); |
| 140 | CHECK_NAME(glutSolidCylinder); |
| 141 | CHECK_NAME(glutWireTeapot); |
| 142 | CHECK_NAME(glutSolidTeapot); |
| 143 | CHECK_NAME(glutWireTeacup); |
| 144 | CHECK_NAME(glutSolidTeacup); |
| 145 | CHECK_NAME(glutWireTeaspoon); |
| 146 | CHECK_NAME(glutSolidTeaspoon); |
| 147 | CHECK_NAME(glutWireCube); |
| 148 | CHECK_NAME(glutSolidCube); |
| 149 | CHECK_NAME(glutWireDodecahedron); |
| 150 | CHECK_NAME(glutSolidDodecahedron); |
| 151 | CHECK_NAME(glutWireOctahedron); |
| 152 | CHECK_NAME(glutSolidOctahedron); |
| 153 | CHECK_NAME(glutWireTetrahedron); |
| 154 | CHECK_NAME(glutSolidTetrahedron); |
| 155 | CHECK_NAME(glutWireIcosahedron); |
| 156 | CHECK_NAME(glutSolidIcosahedron); |
| 157 | CHECK_NAME(glutWireRhombicDodecahedron); |
| 158 | CHECK_NAME(glutSolidRhombicDodecahedron); |
| 159 | CHECK_NAME(glutWireSierpinskiSponge); |
| 160 | CHECK_NAME(glutSolidSierpinskiSponge); |
| 161 | CHECK_NAME(glutVideoResizeGet); |
| 162 | CHECK_NAME(glutSetupVideoResizing); |
| 163 | CHECK_NAME(glutStopVideoResizing); |
| 164 | CHECK_NAME(glutVideoResize); |
| 165 | CHECK_NAME(glutVideoPan); |
| 166 | CHECK_NAME(glutReportErrors); |
| 167 | CHECK_NAME(glutIgnoreKeyRepeat); |
| 168 | CHECK_NAME(glutSetKeyRepeat); |
| 169 | |
| 170 | /* freeglut extensions */ |
| 171 | CHECK_NAME(glutMainLoopEvent); |
| 172 | CHECK_NAME(glutLeaveMainLoop); |
| 173 | CHECK_NAME(glutCloseFunc); |
| 174 | CHECK_NAME(glutWMCloseFunc); |
| 175 | CHECK_NAME(glutMenuDestroyFunc); |
| 176 | CHECK_NAME(glutFullScreenToggle); |
| 177 | CHECK_NAME(glutLeaveFullScreen); |
| 178 | CHECK_NAME(glutSetMenuFont); |
| 179 | CHECK_NAME(glutSetOption); |
| 180 | CHECK_NAME(glutGetModeValues); |
| 181 | CHECK_NAME(glutSetWindowData); |
| 182 | CHECK_NAME(glutGetWindowData); |
| 183 | CHECK_NAME(glutSetMenuData); |
| 184 | CHECK_NAME(glutGetMenuData); |
| 185 | CHECK_NAME(glutBitmapHeight); |
| 186 | CHECK_NAME(glutStrokeHeight); |
| 187 | CHECK_NAME(glutBitmapString); |
| 188 | CHECK_NAME(glutStrokeString); |
| 189 | CHECK_NAME(glutGetProcAddress); |
| 190 | CHECK_NAME(glutKeyboardExtFunc); |
| 191 | CHECK_NAME(glutMouseWheelFunc); |
| 192 | CHECK_NAME(glutGetClipboard); |
| 193 | CHECK_NAME(glutSetClipboard); |
| 194 | CHECK_NAME(glutJoystickGetNumAxes); |
| 195 | CHECK_NAME(glutJoystickGetNumButtons); |
| 196 | CHECK_NAME(glutJoystickNotWorking); |
| 197 | CHECK_NAME(glutJoystickGetDeadBand); |
| 198 | CHECK_NAME(glutJoystickSetDeadBand); |
| 199 | CHECK_NAME(glutJoystickGetSaturation); |
| 200 | CHECK_NAME(glutJoystickSetSaturation); |
| 201 | CHECK_NAME(glutJoystickSetMinRange); |
| 202 | CHECK_NAME(glutJoystickSetMaxRange); |
| 203 | CHECK_NAME(glutJoystickSetCenter); |
| 204 | CHECK_NAME(glutJoystickGetMinRange); |
| 205 | CHECK_NAME(glutJoystickGetMaxRange); |
| 206 | CHECK_NAME(glutJoystickGetCenter); |
| 207 | CHECK_NAME(glutInitContextVersion); |
| 208 | CHECK_NAME(glutInitContextFlags); |
| 209 | CHECK_NAME(glutInitContextProfile); |
| 210 | CHECK_NAME(glutInitErrorFunc); |
| 211 | CHECK_NAME(glutInitWarningFunc); |
| 212 | CHECK_NAME(glutInitContextFunc); |
| 213 | CHECK_NAME(glutAppStatusFunc); |
| 214 | CHECK_NAME(glutSetVertexAttribCoord3); |
| 215 | CHECK_NAME(glutSetVertexAttribNormal); |
| 216 | CHECK_NAME(glutSetVertexAttribTexCoord2); |
| 217 | #undef CHECK_NAME |
| 218 | |
| 219 | return NULL; |
| 220 | } |
| 221 | |
| 222 | |
| 223 | |
| 224 | GLUTproc FGAPIENTRY |
| 225 | glutGetProcAddress( const char *procName ) |
| 226 | { |
| 227 | GLUTproc p; |
| 228 | FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetProcAddress" ); |
| 229 | |
| 230 | /* Try GLUT functions first, then core GL functions */ |
| 231 | p = fghGetGLUTProcAddress( procName ); |
| 232 | |
| 233 | /* Some GLUT functions are platform-specific: */ |
| 234 | if ( !p ) |
| 235 | p = fgPlatformGetGLUTProcAddress( procName ); |
| 236 | |
| 237 | return ( p != NULL ) ? p : fgPlatformGetProcAddress( procName ); |
| 238 | } |
| 239 | |