1 /* **************************************************************************
3 * **************************************************************************
5 * Copyright (C) 1998 Uwe Maurer - uwe_maurer@t-online.de
6 * Copyright (C) 1999 James Simmons
7 * Copyright (C) 1999 Jon Taylor
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library; if not, write to the Free
21 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 * **************************************************************************
25 * - Make everything use the portable ggi_* types
29 #define BUILDING_GGIGLUT
33 #define GRAPHTYPE_RGB GT_16BIT
34 #define GRAPHTYPE_INDEX GT_8BIT
36 /*************************************************************************/
44 #include "GL/ggimesa.h"
50 int _ggiglutDebugSync
= 0;
51 uint32 _ggiglutDebugState
= 0;
53 char *__glutProgramName
= "GGI";
55 static ggi_visual_t __glut_vis
;
57 static ggi_mesa_context_t __glut_ctx
;
59 //static int __glut_width = WIDTH;
60 //static int __glut_height = HEIGHT;
61 //static ggi_graphtype __glut_gt_rgb = GRAPHTYPE_RGB;
62 //static ggi_graphtype __glut_gt_index = GRAPHTYPE_INDEX;
63 static int __glut_width
= GGI_AUTO
;
64 static int __glut_height
= GGI_AUTO
;
65 static ggi_graphtype __glut_gt_rgb
= GT_AUTO
;
66 static ggi_graphtype __glut_gt_index
= GT_8BIT
;
67 static int __glut_init
= GL_FALSE
;
69 static int mousex
= WIDTH
/ 2;
70 static int mousey
= HEIGHT
/ 2;
71 static int mouse_moved
= GL_FALSE
;
72 static int mouse_down
= GL_FALSE
;
73 static int mouse_showcursor
= GL_FALSE
;
75 static void (*__glut_reshape
)(int, int);
76 static void (*__glut_display
)(void);
77 static void (*__glut_idle
)(void);
78 static void (*__glut_keyboard
)(unsigned char, int, int);
79 static void (*__glut_special
)(int, int, int);
80 static void (*__glut_mouse
)(int, int, int, int);
81 static void (*__glut_motion
)(int, int);
82 static void (*__glut_passive_motion
)(int, int);
83 static void (*__glut_visibility
)(int);
85 static unsigned int __glut_mode
= GLUT_RGB
| GLUT_SINGLE
| GLUT_DEPTH
;
87 static int __glut_mod_keys
= 0;
89 static int __glut_redisplay
= GL_FALSE
;
92 static int __glut_menubutton
= -1;
93 static int __glut_menuactive
= GL_FALSE
;
95 #define MAX_ENTRIES 64
99 char *label
[MAX_ENTRIES
];
100 int value
[MAX_ENTRIES
];
101 struct menu_s
* submenu
[MAX_ENTRIES
];
107 static menu_t
*mainmenu
;
108 static menu_t
*curmenu
;
109 static menu_t
*activemenu
;
111 void glutInit(int *argc
, char **argv
)
117 GGIGLUTDPRINT_CORE("glutInit() called\n");
119 #define REMOVE {for (k=i;k<*argc-1;k++) argv[k]=argv[k+1]; \
122 if (__glut_init
) return;
124 str
= getenv("GGIGLUT_DEBUG");
126 _ggiglutDebugState
= atoi(str
);
127 fprintf(stderr
, "Debugging=%d\n", _ggiglutDebugState
);
128 GGIGLUTDPRINT_CORE("Debugging=%d\n", _ggiglutDebugState
);
131 str
= getenv("GGIGLUT_DEBUGSYNC");
133 _ggiglutDebugSync
= 1;
139 for (i
= 1; i
< *argc
; i
++)
141 if (strcmp(argv
[i
], "-mouse") == 0)
143 mouse_showcursor
= GL_TRUE
;
147 if (strcmp(argv
[i
], "-bpp") == 0 && (i
+ 1) < (*argc
))
149 switch(atoi(argv
[i
+ 1]))
151 case 4: gt
= GT_4BIT
; break;
152 case 8: gt
= GT_8BIT
; break;
153 case 15: gt
= GT_15BIT
; break;
154 case 16: gt
= GT_16BIT
; break;
155 case 24: gt
= GT_24BIT
; break;
156 case 32: gt
= GT_32BIT
; break;
158 ggiPanic("\"%s\" bits per pixel?\n", argv
[i
+1]);
160 __glut_gt_rgb
= __glut_gt_index
= gt
;
165 if (strcmp(argv
[i
], "-size") == 0 && (i
+ 2) < (*argc
))
167 __glut_width
= atoi(argv
[i
+ 1]);
168 __glut_height
= atoi(argv
[i
+ 2]);
178 ggiPanic("ggiInit() failed!\n");
180 __glut_init
= GL_TRUE
;
185 void glutInitWindowPosition(int x
, int y
)
187 GGIGLUTDPRINT_CORE("glutInitWindowPosition() called\n");
190 void glutInitWindowSize(int x
, int y
)
192 GGIGLUTDPRINT_CORE("glutInitWindowsSize() called\n");
195 void glutFullScreen(void)
197 GGIGLUTDPRINT_CORE("glutFullScreen() called\n");
200 void glutInitDisplayMode(unsigned int mode
)
202 GGIGLUTDPRINT_CORE("glutInitDisplayMode() called\n");
207 void glutInitDisplayString(const char *string
)
209 GGIGLUTDPRINT_CORE("glutInitDisplayString(%s) called\n", string
);
212 int glutCreateWindow(const char *title
)
218 { GGI_AUTO
, GGI_AUTO
},
219 { GGI_AUTO
, GGI_AUTO
},
222 { GGI_AUTO
, GGI_AUTO
}
228 GGIGLUTDPRINT_CORE("glutCreateWindow() called\n");
231 glutInit(NULL
, NULL
);
233 GGIGLUTDPRINT("GGIGLUT: %s\n", title
);
235 rgb
= !(__glut_mode
& GLUT_INDEX
);
236 frames
= (__glut_mode
& GLUT_DOUBLE
) ? 2 : 1;
238 gt
= (rgb
) ? __glut_gt_rgb
: __glut_gt_index
;
240 __glut_vis
= ggiOpen(NULL
);
241 if (__glut_vis
== NULL
)
243 ggiPanic("ggiOpen() failed!\n");
244 /* return GL_FALSE; */
247 ggiSetFlags(__glut_vis
, GGIFLAG_ASYNC
);
249 ggiCheckMode(__glut_vis
, &mode
);
251 err
= ggiSetMode(__glut_vis
, &mode
);
254 ggiPanic("Can't set graphic mode!\n");
255 /* return GL_FALSE; */
258 if (ggiMesaExtendVisual(__glut_vis
, GL_FALSE
, GL_FALSE
,
259 16, 0, 0, 0, 0, 0, 1) < 0)
261 ggiPanic("GGIMesaSetVisual failed!\n");
264 __glut_ctx
= ggiMesaCreateContext(__glut_vis
);
266 if (__glut_ctx
== NULL
)
267 ggiPanic("Can't create mesa-context\n");
269 ggiGetMode(__glut_vis
, &mode
);
272 __glut_width
= mode
.visible
.x
;
273 __glut_height
= mode
.visible
.y
;
275 mousex
= mode
.visible
.x
/ 2;
276 mousey
= mode
.visible
.y
/ 2;
278 ggiMesaMakeCurrent(__glut_ctx
, __glut_vis
);
281 __glut_reshape(__glut_width
, __glut_height
);
286 void glutReshapeFunc(void (*func
)(int, int))
288 GGIGLUTDPRINT_CORE("glutReshapeFunc() called\n");
290 __glut_reshape
= func
;
291 if (__glut_vis
&& __glut_reshape
)
292 __glut_reshape(__glut_width
, __glut_height
);
295 void glutKeyboardFunc(void (*keyboard
)(unsigned char key
, int x
, int y
))
297 GGIGLUTDPRINT_CORE("glutKeyBoardFunc() called\n");
299 __glut_keyboard
= keyboard
;
302 int glutGetModifiers(void)
304 GGIGLUTDPRINT_CORE("glutGetModifiers() called\n");
306 return __glut_mod_keys
;
309 void glutEntryFunc(void (*func
)(int state
))
311 GGIGLUTDPRINT_CORE("glutEntryFunc() called\n");
314 void glutVisibilitFunc(void (*func
)(int state
))
316 GGIGLUTDPRINT_CORE("glutVisibilityFunc() called\n");
319 void glutTimerFunc(unsigned int millis
, void (*func
)(int value
), int value
)
321 GGIGLUTDPRINT_CORE("glutTimerFunc() called\n");
324 void glutMenuStateFunc(void (*func
)(int state
))
326 GGIGLUTDPRINT_CORE("glutMenuStateFunc() called\n");
329 int glutGet(GLenum type
)
331 GGIGLUTDPRINT_CORE("glutGet() called\n");
339 case GLUT_WINDOW_WIDTH
:
341 case GLUT_WINDOW_HEIGHT
:
342 return __glut_height
;
343 case GLUT_MENU_NUM_ITEMS
:
345 return curmenu
->num_entries
;
349 GGIGLUTDPRINT("glutGet: unknown type %i\n", type
);
354 void glutSpecialFunc(void (*special
)(int key
, int x
, int y
))
356 GGIGLUTDPRINT_CORE("glutSpecialFunc() called\n");
358 __glut_special
=special
;
361 void glutDisplayFunc(void (*disp
)(void))
363 GGIGLUTDPRINT_CORE("glutDisplayFunc() called\n");
367 void glutSetColor(int index
, GLfloat red
, GLfloat green
, GLfloat blue
)
372 GGIGLUTDPRINT_CORE("glutSetColor() called\n");
374 if (red
> 1.0) red
= 1.0;
375 if (red
< 0.0) red
= 0.0;
376 if (green
> 1.0) green
= 1.0;
377 if (green
< 0.0) green
= 0.0;
378 if (blue
> 1.0) blue
= 1.0;
379 if (blue
< 0.0) blue
= 0.0;
381 max
= (float)((1 << GGI_COLOR_PRECISION
) - 1);
383 c
.r
= (int)(max
* red
);
384 c
.g
= (int)(max
* green
);
385 c
.b
= (int)(max
* blue
);
386 ggiSetPalette(__glut_vis
, index
, 1, &c
);
389 void glutPostRedisplay(void)
391 GGIGLUTDPRINT_CORE("glutPostRedisplay() called\n");
393 __glut_redisplay
= GL_TRUE
;
396 void glutPostWindowRedisplay(int win
)
398 GGIGLUTDPRINT_CORE("glutPostWindowRedisplay() called\n");
400 __glut_redisplay
= GL_TRUE
;
403 void glutSwapBuffers(void)
405 GGIGLUTDPRINT_CORE("glutSwapBuffers() called\n");
407 ggiMesaSwapBuffers();
410 void glutIdleFunc(void (*idle
)(void))
412 GGIGLUTDPRINT_CORE("glutIdleFunc() called\n");
417 static void keyboard(ggi_event
*ev
)
420 int modifer
= 0, key
= 0;
422 GGIGLUTDPRINT_CORE("keyboard() called\n");
426 modifer
= ev
->key
.modifiers
;
427 if (modifer
== GII_KM_SHIFT
)
428 __glut_mod_keys
|= GLUT_ACTIVE_SHIFT
;
429 if (modifer
== GII_KM_CTRL
)
430 __glut_mod_keys
|= GLUT_ACTIVE_CTRL
;
431 if (modifer
== GII_KM_ALT
)
432 __glut_mod_keys
|= GLUT_ACTIVE_ALT
;
434 /* if (__glut_special && key) __glut_special(GII_KTYP(key),0,0); */
437 // __glut_keyboard(GII_UNICODE(sym), 0, 0);
438 __glut_keyboard(sym
, 0, 0);
441 static void mouseabs(ggi_event
*ev
)
446 mousex
= ev
->pmove
.x
;
447 mousey
= ev
->pmove
.y
;
449 if (mousex
< 0) mousex
= 0;
450 if (mousey
< 0) mousey
= 0;
451 if (mousex
>= __glut_width
) mousex
= __glut_width
- 1;
452 if (mousey
>= __glut_height
) mousey
= __glut_height
- 1;
454 if (mousex
!= oldx
|| mousey
!= oldy
) mouse_moved
= GL_TRUE
;
457 static void mouse(ggi_event
*ev
)
462 GGIGLUTDPRINT_CORE("mouse() called\n");
464 mousex
+= ev
->pmove
.x
>> 1;
465 mousey
+= ev
->pmove
.y
>> 1;
467 if (mousex
< 0) mousex
= 0;
468 if (mousey
< 0) mousey
= 0;
469 if (mousex
>= __glut_width
) mousex
= __glut_width
- 1;
470 if (mousey
>= __glut_height
) mousey
= __glut_height
- 1;
472 if (mousex
!= oldx
|| mousey
!= oldy
) mouse_moved
= GL_TRUE
;
476 static void showmenu(void);
477 static int clickmenu(void);
478 static void updatemouse(void);
479 static void drawmouse(void);
481 static void mousemove(void)
483 GGIGLUTDPRINT_CORE("mousemove() called\n");
486 if (__glut_motion
&& mouse_down
) {
487 __glut_motion(mousex
,mousey
);
490 if (__glut_passive_motion
&& (!mouse_down
)) {
491 __glut_passive_motion(mousex
,mousey
);
494 if (__glut_menuactive
) updatemouse();
495 mouse_moved
=GL_FALSE
;
499 static void button(ggi_event
*ev
)
509 GGIGLUTDPRINT_CORE("button() called\n");
513 if (ev
->pbutton
.button
<= 3) { /* GGI can have >3 buttons ! */
514 char state
= ev
->any
.type
== evPtrButtonPress
? GLUT_DOWN
: GLUT_UP
;
515 if (__glut_menuactive
) {
516 if (state
== GLUT_UP
&& clickmenu()) {
518 __glut_menuactive
= GL_FALSE
;
521 if (btn
[ev
->pbutton
.button
] == __glut_menubutton
) {
522 __glut_menuactive
= GL_TRUE
;
523 activemenu
= mainmenu
;
527 __glut_mouse(btn
[ev
->pbutton
.button
], state
, mousex
, mousey
);
529 if (state
== GLUT_DOWN
) {
530 mouse_down
|= (1 << (ev
->pbutton
.button
- 1));
532 else mouse_down
&= ~( 1 << (ev
->pbutton
.button
- 1));
536 void glutMainLoop(void)
539 ggi_event_mask evmask
= (emKeyPress
| emKeyRepeat
| emPtrMove
| emPtrButton
);
541 GGIGLUTDPRINT_CORE("glutMainLoop() called\n");
543 ggiSetEventMask(__glut_vis
, evmask
);
547 if (__glut_visibility
)
548 __glut_visibility(GLUT_VISIBLE
);
552 if (!__glut_menuactive
)
556 if (__glut_redisplay
&& __glut_display
)
558 __glut_redisplay
= GL_FALSE
;
565 struct timeval t
= {0, 0};
567 if (ggiEventPoll(__glut_vis
, evmask
, &t
) == 0)
570 ggiEventRead(__glut_vis
, &ev
, evmask
);
584 case evPtrButtonPress
:
585 case evPtrButtonRelease
:
594 static void showmenu()
597 ggi_color col
= { 0xffff, 0xffff, 0xffff };
599 GGIGLUTDPRINT_CORE("showmenu() called\n");
601 ggiSetGCForeground(__glut_vis
,ggiMapColor(__glut_vis
,&col
));
602 ggiSetOrigin(__glut_vis
,0,0);
604 for (y
= i
= 0; i
< activemenu
->num_entries
; i
++, y
+= 8) {
605 ggiPuts(__glut_vis
, 0, y
, activemenu
->label
[i
]);
610 static int clickmenu(void)
615 GGIGLUTDPRINT_CORE("clickmenu() called\n");
619 if (i
>= activemenu
->num_entries
) return GL_TRUE
;
620 if (mousex
>= 8 * strlen(activemenu
->label
[i
])) return GL_TRUE
;
622 if (activemenu
->submenu
[i
]) {
623 ggi_color col
={0,0,0};
624 ggiSetGCForeground(__glut_vis
,ggiMapColor(__glut_vis
,&col
));
625 h
=activemenu
->num_entries
*8;
626 w
=activemenu
->max_strlen
*8;
627 ggiDrawBox(__glut_vis
,0,0,w
,h
);
628 activemenu
=activemenu
->submenu
[i
];
633 activemenu
->func(activemenu
->value
[i
]);
639 static char buffer
[16*16*4];
641 static void updatemouse()
643 GGIGLUTDPRINT_CORE("updatemouse() called\n");
645 ggiPutBox(__glut_vis
,oldx
,oldy
,16,16,buffer
);
649 static void drawmouse()
653 GGIGLUTDPRINT_CORE("drawmouse() called\n");
659 ggiGetBox(__glut_vis
,x
,y
,16,16,buffer
);
660 ggiDrawLine(__glut_vis
,mousex
-2,mousey
,mousex
+2,mousey
);
661 ggiDrawLine(__glut_vis
,mousex
,mousey
-2,mousex
,mousey
+2);
666 int glutCreateMenu(void(*func
)(int))
670 GGIGLUTDPRINT_CORE("glutCreateMenu() called\n");
672 m
=malloc(sizeof(menu_t
));
673 memset(m
,0,sizeof(menu_t
));
679 static void addEntry(const char *label
,int value
,menu_t
*submenu
)
681 int i
=curmenu
->num_entries
;
683 GGIGLUTDPRINT_CORE("addEntry() called\n");
685 /* printf("%i %i %s %p\n",i,value,label,submenu); */
687 curmenu
->label
[i
]=strdup(label
);
688 curmenu
->value
[i
]=value
;
689 curmenu
->submenu
[i
]=submenu
;
691 if (strlen(label
)>curmenu
->max_strlen
)
692 curmenu
->max_strlen
=strlen(label
);
693 curmenu
->num_entries
++;
697 void glutAddMenuEntry(const char *label
,int value
)
699 GGIGLUTDPRINT_CORE("glutAddMenuEntry() called\n");
701 addEntry(label
,value
,NULL
);
704 void glutAddSubMenu(const char *label
,int submenu
)
708 GGIGLUTDPRINT_CORE("glutAddSubMenu() called\n");
710 if (!curmenu
) return;
711 strncpy(text
,label
,98);
713 text
[strlen(text
)+1]=0;
714 text
[strlen(text
)]='>';
716 addEntry(text
,0,(menu_t
*) submenu
);
719 void glutAttachMenu(int button
)
721 GGIGLUTDPRINT_CORE("glutAttachMenu() called\n");
724 __glut_menubutton
=button
;
727 void glutDetachMenu(int button
)
729 GGIGLUTDPRINT_CORE("glutDetachMenu() called\n");
732 void glutVisibilityFunc(void (*func
)(int state
))
734 GGIGLUTDPRINT_CORE("glutVisibilityFunc() called\n");
736 __glut_visibility
=func
;
739 void glutMouseFunc(void (*mouse
)(int, int, int, int))
741 GGIGLUTDPRINT_CORE("glutMouseFunc() called\n");
746 void glutMotionFunc(void (*motion
)(int,int))
748 GGIGLUTDPRINT_CORE("glutMotionFunc() called\n");
750 __glut_motion
=motion
;
753 void glutPassiveMotionFunc(void (*motion
)(int,int))
755 GGIGLUTDPRINT_CORE("glutPassiveMotionFunc() called\n");
757 __glut_passive_motion
=motion
;
760 void glutSetWindowTitle(const char *title
)
762 GGIGLUTDPRINT_CORE("glutSetWindowTitle() called\n");
765 void glutSetIconTitle(const char *title
)
767 GGIGLUTDPRINT_CORE("glutSetIconTitle() called\n");
770 void glutChangeToMenuEntry(int item
,const char *label
,int value
)
772 GGIGLUTDPRINT_CORE("glutChangeToMenuEntry() called\n");
774 if (item
>0 && item
<=curmenu
->num_entries
) {
776 free(curmenu
->label
[item
]);
777 curmenu
->label
[item
]=strdup(label
);
778 curmenu
->value
[item
]=value
;
779 curmenu
->submenu
[item
]=NULL
;
782 void glutChangeToSubMenu(int item
,const char *label
,int submenu
)
784 GGIGLUTDPRINT_CORE("glutChengeToSubMenu() called\n");
786 if (item
>0 && item
<=curmenu
->num_entries
) {
788 free(curmenu
->label
[item
]);
789 curmenu
->label
[item
]=strdup(label
);
790 curmenu
->value
[item
]=0;
791 curmenu
->submenu
[item
]=(menu_t
*)submenu
;
795 void glutDestroyMenu(int menu
)
797 menu_t
*m
=(menu_t
*)menu
;
800 GGIGLUTDPRINT_CORE("glutDestroyMenu() called\n");
802 for (i
=0;i
<m
->num_entries
;i
++) {
808 int glutCreateSubWindow(int win
,int x
,int y
,int w
,int h
)
810 GGIGLUTDPRINT_CORE("glutCreateSubWindow() called\n");
815 void glutDestroyWindow(int win
)
817 GGIGLUTDPRINT_CORE("glutDestroyWindow() called\n");
820 int glutGetWindow(void)
822 GGIGLUTDPRINT_CORE("glutGetWindow() called\n");
827 void glutSetWindow(int win
)
829 GGIGLUTDPRINT_CORE("glutSetWindow() called\n");
832 void glutPositionWindow(int x
,int y
)
834 GGIGLUTDPRINT_CORE("glutPositionWindow() called\n");
837 void glutReshapeWindow(int x
,int y
)
839 GGIGLUTDPRINT_CORE("glutReshapeWindow() called\n");
842 void glutPushWindow(void)
844 GGIGLUTDPRINT_CORE("glutPushWindow() called\n");
847 void glutPopWindow(void)
849 GGIGLUTDPRINT_CORE("glutPopWindow() called\n");
852 void glutIconifyWindow(void)
854 GGIGLUTDPRINT_CORE("glutIconifyWindow() called\n");
857 void glutShowWindow()
859 GGIGLUTDPRINT_CORE("glutShowWindow() called\n");
862 void glutHideWindow()
864 GGIGLUTDPRINT_CORE("glutHideWindow() called\n");
867 void glutSetCursor(int cursor
)
869 GGIGLUTDPRINT_CORE("glutSetCursor() called\n");
872 void glutWarpPointer(int x
,int y
)
874 GGIGLUTDPRINT_CORE("glutWarpPointer() called\n");
877 void glutEstablishOverlay(void)
879 GGIGLUTDPRINT_CORE("glutEstablishOverlay() called\n");
882 void glutRemoveOverlay(void)
884 GGIGLUTDPRINT_CORE("glutRemoveOverlay() called\n");
887 void glutUseLayer(GLenum layer
)
889 GGIGLUTDPRINT_CORE("glutUseLayer() called\n");
892 int glutLayerGet(GLenum type
)
894 GGIGLUTDPRINT_CORE("glutLayerGet() called\n");
898 void glutPostOverlayRedisplay(void)
900 GGIGLUTDPRINT_CORE("glutPostOverlayRedisplay() called\n");
903 void glutPostWindowOverlayRedisplay(int w
)
905 GGIGLUTDPRINT_CORE("glutPostWindowOverlayRedisplay() called\n");
908 void glutShowOverlay(void)
910 GGIGLUTDPRINT_CORE("glutShowOverlay() called\n");
913 void glutHideOverlay(void)
915 GGIGLUTDPRINT_CORE("glutHideOverlay() called\n");
918 int glutGetMenu(void)
920 GGIGLUTDPRINT_CORE("glutGetMenu() called\n");
924 void glutSetMenu(int menu
)
926 GGIGLUTDPRINT_CORE("glutSetMenu() called\n");
929 void glutRemoveMenuItem(int item
)
931 GGIGLUTDPRINT_CORE("glutRemoveMenuItem() called\n");
934 void glutSpaceBallMotionFunc(void (*func
)(int key
,int x
,int y
))
936 GGIGLUTDPRINT_CORE("glutSpaceBallMotionFunc() called\n");
939 void glutSpaceBallRotateFunc(void (*func
)(int x
,int y
,int z
))
941 GGIGLUTDPRINT_CORE("glutSpaceBallRotateFunc() called\n");
944 void glutSpaceBallButtonFunc(void (*func
)(int button
,int state
))
946 GGIGLUTDPRINT_CORE("glutSpaceBallButtonFunc() called\n");
949 void glutCopyColormap(int win
)
951 GGIGLUTDPRINT_CORE("glutCopyColormap() called\n");
954 int glutDeviceGet(GLenum param
)
956 GGIGLUTDPRINT_CORE("glutDeviceGet() called\n");