freeglut_misc.c
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2.  * freeglut_misc.c
  3.  *
  4.  * Functions that didn't fit anywhere else...
  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. #include <GL/freeglut.h>
  28. #include "freeglut_internal.h"
  29. /*
  30.  * TODO BEFORE THE STABLE RELEASE:
  31.  *
  32.  *  glutSetColor()     --
  33.  *  glutGetColor()     --
  34.  *  glutCopyColormap() --
  35.  *  glutSetKeyRepeat() -- this is evil and should be removed from API
  36.  */
  37. /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
  38. /*
  39.  * This functions checks if an OpenGL extension is supported or not
  40.  *
  41.  * XXX Wouldn't this be simpler and clearer if we used strtok()?
  42.  */
  43. int FGAPIENTRY glutExtensionSupported( const char* extension )
  44. {
  45.   const char *extensions, *start;
  46.   const size_t len = strlen( extension );
  47.   /* Make sure there is a current window, and thus a current context available */
  48.   FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutExtensionSupported" );
  49.   freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );
  50.   if (strchr(extension, ' '))
  51.     return 0;
  52.   start = extensions = (const char *) glGetString(GL_EXTENSIONS);
  53.   /* XXX consider printing a warning to stderr that there's no current
  54.    * rendering context.
  55.    */
  56.   freeglut_return_val_if_fail( extensions != NULL, 0 );
  57.   while (1) {
  58.      const char *p = strstr(extensions, extension);
  59.      if (!p)
  60.         return 0;  /* not found */
  61.      /* check that the match isn't a super string */
  62.      if ((p == start || p[-1] == ' ') && (p[len] == ' ' || p[len] == 0))
  63.         return 1;
  64.      /* skip the false match and continue */
  65.      extensions = p + len;
  66.   }
  67.   return 0 ;
  68. }
  69. #ifndef GL_INVALID_FRAMEBUFFER_OPERATION
  70. #ifdef GL_INVALID_FRAMEBUFFER_OPERATION_EXT
  71. #define GL_INVALID_FRAMEBUFFER_OPERATION GL_INVALID_FRAMEBUFFER_OPERATION_EXT
  72. #else
  73. #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
  74. #endif
  75. #endif
  76. #ifndef GL_TABLE_TOO_LARGE
  77. #ifdef GL_TABLE_TOO_LARGE_EXT
  78. #define GL_TABLE_TOO_LARGE GL_TABLE_TOO_LARGE_EXT
  79. #else
  80. #define GL_TABLE_TOO_LARGE 0x8031
  81. #endif
  82. #endif
  83. #ifndef GL_TEXTURE_TOO_LARGE
  84. #ifdef GL_TEXTURE_TOO_LARGE_EXT
  85. #define GL_TEXTURE_TOO_LARGE GL_TEXTURE_TOO_LARGE_EXT
  86. #else
  87. #define GL_TEXTURE_TOO_LARGE 0x8065
  88. #endif
  89. #endif
  90. /*
  91.  * A cut-down local version of gluErrorString to avoid depending on GLU.
  92.  */
  93. static const char* fghErrorString( GLenum error )
  94. {
  95.   switch ( error ) {
  96.   case GL_INVALID_ENUM: return "invalid enumerant";
  97.   case GL_INVALID_VALUE: return "invalid value";
  98.   case GL_INVALID_OPERATION: return "invalid operation";
  99.   case GL_STACK_OVERFLOW: return "stack overflow";
  100.   case GL_STACK_UNDERFLOW: return "stack underflow";
  101.   case GL_OUT_OF_MEMORY: return "out of memory";
  102.   case GL_TABLE_TOO_LARGE: return "table too large";
  103.   case GL_INVALID_FRAMEBUFFER_OPERATION: return "invalid framebuffer operation";
  104.   case GL_TEXTURE_TOO_LARGE: return "texture too large";
  105.   default: return "unknown GL error";
  106.   }
  107. }
  108. /*
  109.  * This function reports all the OpenGL errors that happened till now
  110.  */
  111. void FGAPIENTRY glutReportErrors( void )
  112. {
  113.     GLenum error;
  114.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReportErrors" );
  115.     while( ( error = glGetError() ) != GL_NO_ERROR )
  116.         fgWarning( "GL error: %s", fghErrorString( error ) );
  117. }
  118. /*
  119.  * Control the auto-repeat of keystrokes to the current window
  120.  */
  121. void FGAPIENTRY glutIgnoreKeyRepeat( int ignore )
  122. {
  123.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIgnoreKeyRepeat" );
  124.     FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIgnoreKeyRepeat" );
  125.     fgStructure.CurrentWindow->State.IgnoreKeyRepeat = ignore ? GL_TRUE : GL_FALSE;
  126. }
  127. /*
  128.  * Set global auto-repeat of keystrokes
  129.  *
  130.  * RepeatMode should be either:
  131.  *    GLUT_KEY_REPEAT_OFF
  132.  *    GLUT_KEY_REPEAT_ON
  133.  *    GLUT_KEY_REPEAT_DEFAULT
  134.  */
  135. void FGAPIENTRY glutSetKeyRepeat( int repeatMode )
  136. {
  137.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetKeyRepeat" );
  138.     switch( repeatMode )
  139.     {
  140.     case GLUT_KEY_REPEAT_OFF:
  141.     case GLUT_KEY_REPEAT_ON:
  142.      fgState.KeyRepeat = repeatMode;
  143.      break;
  144.     case GLUT_KEY_REPEAT_DEFAULT:
  145.      fgState.KeyRepeat = GLUT_KEY_REPEAT_ON;
  146.      break;
  147.     default:
  148.         fgError ("Invalid glutSetKeyRepeat mode: %d", repeatMode);
  149.         break;
  150.     }
  151. }
  152. /*
  153.  * Forces the joystick callback to be executed
  154.  */
  155. void FGAPIENTRY glutForceJoystickFunc( void )
  156. {
  157.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutForceJoystickFunc" );
  158. #if !defined(_WIN32_WCE)
  159.     freeglut_return_if_fail( fgStructure.CurrentWindow != NULL );
  160.     freeglut_return_if_fail( FETCH_WCB( *( fgStructure.CurrentWindow ), Joystick ) );
  161.     fgJoystickPollWindow( fgStructure.CurrentWindow );
  162. #endif /* !defined(_WIN32_WCE) */
  163. }
  164. /*
  165.  *
  166.  */
  167. void FGAPIENTRY glutSetColor( int nColor, GLfloat red, GLfloat green, GLfloat blue )
  168. {
  169.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetColor" );
  170.     /* We really need to do something here. */
  171. }
  172. /*
  173.  *
  174.  */
  175. GLfloat FGAPIENTRY glutGetColor( int color, int component )
  176. {
  177.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetColor" );
  178.     /* We really need to do something here. */
  179.     return( 0.0f );
  180. }
  181. /*
  182.  *
  183.  */
  184. void FGAPIENTRY glutCopyColormap( int window )
  185. {
  186.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCopyColormap" );
  187.     /* We really need to do something here. */
  188. }
  189. /*** END OF FILE ***/