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

游戏引擎

开发平台:

Visual C++

  1. /*
  2.  * freeglut_callbacks.c
  3.  *
  4.  * The callbacks setting methods.
  5.  *
  6.  * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
  7.  * Written by Pawel W. Olszta, <olszta@sourceforge.net>
  8.  * Creation date: Fri Dec 3 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. /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
  30. /*
  31.  * All of the callbacks setting methods can be generalized to this:
  32.  */
  33. #define SET_CALLBACK(a)                                         
  34. do                                                              
  35. {                                                               
  36.     if( fgStructure.CurrentWindow == NULL )                     
  37.         return;                                                 
  38.     SET_WCB( ( *( fgStructure.CurrentWindow ) ), a, callback ); 
  39. } while( 0 )
  40. /*
  41.  * Sets the Display callback for the current window
  42.  */
  43. void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) )
  44. {
  45.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDisplayFunc" );
  46.     if( !callback )
  47.         fgError( "Fatal error in program.  NULL display callback not "
  48.                  "permitted in GLUT 3.0+ or freeglut 2.0.1+" );
  49.     SET_CALLBACK( Display );
  50. }
  51. /*
  52.  * Sets the Reshape callback for the current window
  53.  */
  54. void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) )
  55. {
  56.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeFunc" );
  57.     SET_CALLBACK( Reshape );
  58. }
  59. /*
  60.  * Sets the Keyboard callback for the current window
  61.  */
  62. void FGAPIENTRY glutKeyboardFunc( void (* callback)
  63.                                   ( unsigned char, int, int ) )
  64. {
  65.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardFunc" );
  66.     SET_CALLBACK( Keyboard );
  67. }
  68. /*
  69.  * Sets the Special callback for the current window
  70.  */
  71. void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) )
  72. {
  73.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialFunc" );
  74.     SET_CALLBACK( Special );
  75. }
  76. /*
  77.  * Sets the global idle callback
  78.  */
  79. void FGAPIENTRY glutIdleFunc( void (* callback)( void ) )
  80. {
  81.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIdleFunc" );
  82.     fgState.IdleCallback = callback;
  83. }
  84. /*
  85.  * Sets the Timer callback for the current window
  86.  */
  87. void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ),
  88.                                int timerID )
  89. {
  90.     SFG_Timer *timer, *node;
  91.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTimerFunc" );
  92.     if( (timer = fgState.FreeTimers.Last) )
  93.     {
  94.         fgListRemove( &fgState.FreeTimers, &timer->Node );
  95.     }
  96.     else
  97.     {
  98.         if( ! (timer = malloc(sizeof(SFG_Timer))) )
  99.             fgError( "Fatal error: "
  100.                      "Memory allocation failure in glutTimerFunc()" );
  101.     }
  102.     timer->Callback  = callback;
  103.     timer->ID        = timerID;
  104.     timer->TriggerTime = fgElapsedTime() + timeOut;
  105.     for( node = fgState.Timers.First; node; node = node->Node.Next )
  106.     {
  107.         if( node->TriggerTime > timer->TriggerTime )
  108.             break;
  109.     }
  110.     fgListInsert( &fgState.Timers, &node->Node, &timer->Node );
  111. }
  112. /*
  113.  * Sets the Visibility callback for the current window.
  114.  */
  115. static void fghVisibility( int status )
  116. {
  117.     int glut_status = GLUT_VISIBLE;
  118.     FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Visibility Callback" );
  119.     freeglut_return_if_fail( fgStructure.CurrentWindow );
  120.     if( ( GLUT_HIDDEN == status )  || ( GLUT_FULLY_COVERED == status ) )
  121.         glut_status = GLUT_NOT_VISIBLE;
  122.     INVOKE_WCB( *( fgStructure.CurrentWindow ), Visibility, ( glut_status ) );
  123. }
  124. void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) )
  125. {
  126.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutVisibilityFunc" );
  127.     SET_CALLBACK( Visibility );
  128.     if( callback )
  129.         glutWindowStatusFunc( fghVisibility );
  130.     else
  131.         glutWindowStatusFunc( NULL );
  132. }
  133. /*
  134.  * Sets the keyboard key release callback for the current window
  135.  */
  136. void FGAPIENTRY glutKeyboardUpFunc( void (* callback)
  137.                                     ( unsigned char, int, int ) )
  138. {
  139.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardUpFunc" );
  140.     SET_CALLBACK( KeyboardUp );
  141. }
  142. /*
  143.  * Sets the special key release callback for the current window
  144.  */
  145. void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) )
  146. {
  147.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialUpFunc" );
  148.     SET_CALLBACK( SpecialUp );
  149. }
  150. /*
  151.  * Sets the joystick callback and polling rate for the current window
  152.  */
  153. void FGAPIENTRY glutJoystickFunc( void (* callback)
  154.                                   ( unsigned int, int, int, int ),
  155.                                   int pollInterval )
  156. {
  157.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickFunc" );
  158.     fgInitialiseJoysticks ();
  159.     SET_CALLBACK( Joystick );
  160.     fgStructure.CurrentWindow->State.JoystickPollRate = pollInterval;
  161.     fgStructure.CurrentWindow->State.JoystickLastPoll =
  162.         fgElapsedTime() - fgStructure.CurrentWindow->State.JoystickPollRate;
  163.     if( fgStructure.CurrentWindow->State.JoystickLastPoll < 0 )
  164.         fgStructure.CurrentWindow->State.JoystickLastPoll = 0;
  165. }
  166. /*
  167.  * Sets the mouse callback for the current window
  168.  */
  169. void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) )
  170. {
  171.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseFunc" );
  172.     SET_CALLBACK( Mouse );
  173. }
  174. /*
  175.  * Sets the mouse wheel callback for the current window
  176.  */
  177. void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) )
  178. {
  179.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseWheelFunc" );
  180.     SET_CALLBACK( MouseWheel );
  181. }
  182. /*
  183.  * Sets the mouse motion callback for the current window (one or more buttons
  184.  * are pressed)
  185.  */
  186. void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) )
  187. {
  188.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMotionFunc" );
  189.     SET_CALLBACK( Motion );
  190. }
  191. /*
  192.  * Sets the passive mouse motion callback for the current window (no mouse
  193.  * buttons are pressed)
  194.  */
  195. void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) )
  196. {
  197.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPassiveMotionFunc" );
  198.     SET_CALLBACK( Passive );
  199. }
  200. /*
  201.  * Window mouse entry/leave callback
  202.  */
  203. void FGAPIENTRY glutEntryFunc( void (* callback)( int ) )
  204. {
  205.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEntryFunc" );
  206.     SET_CALLBACK( Entry );
  207. }
  208. /*
  209.  * Window destruction callbacks
  210.  */
  211. void FGAPIENTRY glutCloseFunc( void (* callback)( void ) )
  212. {
  213.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCloseFunc" );
  214.     SET_CALLBACK( Destroy );
  215. }
  216. void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) )
  217. {
  218.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWMCloseFunc" );
  219.     glutCloseFunc( callback );
  220. }
  221. /* A. Donev: Destruction callback for menus */
  222. void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) )
  223. {
  224.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuDestroyFunc" );
  225.     if( fgStructure.CurrentMenu )
  226.         fgStructure.CurrentMenu->Destroy = callback;
  227. }
  228. /*
  229.  * Deprecated version of glutMenuStatusFunc callback setting method
  230.  */
  231. void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) )
  232. {
  233.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStateFunc" );
  234.     fgState.MenuStateCallback = callback;
  235. }
  236. /*
  237.  * Sets the global menu status callback for the current window
  238.  */
  239. void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) )
  240. {
  241.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStatusFunc" );
  242.     fgState.MenuStatusCallback = callback;
  243. }
  244. /*
  245.  * Sets the overlay display callback for the current window
  246.  */
  247. void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) )
  248. {
  249.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutOverlayDisplayFunc" );
  250.     SET_CALLBACK( OverlayDisplay );
  251. }
  252. /*
  253.  * Sets the window status callback for the current window
  254.  */
  255. void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) )
  256. {
  257.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWindowStatusFunc" );
  258.     SET_CALLBACK( WindowStatus );
  259. }
  260. /*
  261.  * Sets the spaceball motion callback for the current window
  262.  */
  263. void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) )
  264. {
  265.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballMotionFunc" );
  266.     fgInitialiseSpaceball();
  267.     SET_CALLBACK( SpaceMotion );
  268. }
  269. /*
  270.  * Sets the spaceball rotate callback for the current window
  271.  */
  272. void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) )
  273. {
  274.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballRotateFunc" );
  275.     fgInitialiseSpaceball();
  276.     SET_CALLBACK( SpaceRotation );
  277. }
  278. /*
  279.  * Sets the spaceball button callback for the current window
  280.  */
  281. void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) )
  282. {
  283.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballButtonFunc" );
  284.     fgInitialiseSpaceball();
  285.     SET_CALLBACK( SpaceButton );
  286. }
  287. /*
  288.  * Sets the button box callback for the current window
  289.  */
  290. void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) )
  291. {
  292.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutButtonBoxFunc" );
  293.     SET_CALLBACK( ButtonBox );
  294. }
  295. /*
  296.  * Sets the dials box callback for the current window
  297.  */
  298. void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) )
  299. {
  300.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDialsFunc" );
  301.     SET_CALLBACK( Dials );
  302. }
  303. /*
  304.  * Sets the tablet motion callback for the current window
  305.  */
  306. void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) )
  307. {
  308.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletMotionFunc" );
  309.     SET_CALLBACK( TabletMotion );
  310. }
  311. /*
  312.  * Sets the tablet buttons callback for the current window
  313.  */
  314. void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) )
  315. {
  316.     FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletButtonFunc" );
  317.     SET_CALLBACK( TabletButton );
  318. }
  319. /*** END OF FILE ***/