1{
2
3  Adaption of the delphi3d.net OpenGL units to FreePascal
4  Sebastian Guenther (sg@freepascal.org) in 2002
5  These units are free to use
6}
7
8{$MACRO ON}
9{$MODE Delphi}
10{$IFDEF Windows}
11  {$DEFINE extdecl := stdcall}
12{$ELSE}
13  {$DEFINE extdecl := cdecl}
14{$ENDIF}
15
16{$IFDEF MORPHOS}
17{$INLINE ON}
18{$DEFINE GLUT_UNIT}
19{$ENDIF}
20
21unit Glut;
22
23// Copyright (c) Mark J. Kilgard, 1994, 1995, 1996. */
24
25(* This program is freely distributable without licensing fees  and is
26   provided without guarantee or warrantee expressed or  implied. This
27   program is -not- in the public domain. *)
28
29{******************************************************************************}
30{ Converted to Delphi by Tom Nuydens (tom@delphi3d.net)                        }
31{   Contributions by Igor Karpov (glygrik@hotbox.ru)                           }
32{   For the latest updates, visit Delphi3D: http://www.delphi3d.net            }
33{******************************************************************************}
34
35interface
36
37uses
38  SysUtils,
39  {$IFDEF Windows}
40  Windows, dynlibs,
41  {$ELSE}
42  {$IFDEF MORPHOS}
43  TinyGL,
44  {$ELSE}
45  dynlibs,
46  {$ENDIF}
47  {$ENDIF}
48  GL;
49
50type
51  TGlutVoidCallback = procedure; cdecl;
52  TGlut1IntCallback = procedure(value: Integer); cdecl;
53  TGlut2IntCallback = procedure(v1, v2: Integer); cdecl;
54  TGlut3IntCallback = procedure(v1, v2, v3: Integer); cdecl;
55  TGlut4IntCallback = procedure(v1, v2, v3, v4: Integer); cdecl;
56  TGlut1Char2IntCallback = procedure(c: Byte; v1, v2: Integer); cdecl;
57  TGlut1UInt3IntCallback = procedure(u: Cardinal; v1, v2, v3: Integer); cdecl;
58
59const
60  GLUT_API_VERSION                = 3;
61  GLUT_XLIB_IMPLEMENTATION        = 12;
62  // Display mode bit masks.
63  GLUT_RGB                        = 0;
64  GLUT_RGBA                       = GLUT_RGB;
65  GLUT_INDEX                      = 1;
66  GLUT_SINGLE                     = 0;
67  GLUT_DOUBLE                     = 2;
68  GLUT_ACCUM                      = 4;
69  GLUT_ALPHA                      = 8;
70  GLUT_DEPTH                      = 16;
71  GLUT_STENCIL                    = 32;
72  GLUT_MULTISAMPLE                = 128;
73  GLUT_STEREO                     = 256;
74  GLUT_LUMINANCE                  = 512;
75
76  // Mouse buttons.
77  GLUT_LEFT_BUTTON                = 0;
78  GLUT_MIDDLE_BUTTON              = 1;
79  GLUT_RIGHT_BUTTON               = 2;
80
81  // Mouse button state.
82  GLUT_DOWN                       = 0;
83  GLUT_UP                         = 1;
84
85  // function keys
86  GLUT_KEY_F1                     = 1;
87  GLUT_KEY_F2                     = 2;
88  GLUT_KEY_F3                     = 3;
89  GLUT_KEY_F4                     = 4;
90  GLUT_KEY_F5                     = 5;
91  GLUT_KEY_F6                     = 6;
92  GLUT_KEY_F7                     = 7;
93  GLUT_KEY_F8                     = 8;
94  GLUT_KEY_F9                     = 9;
95  GLUT_KEY_F10                    = 10;
96  GLUT_KEY_F11                    = 11;
97  GLUT_KEY_F12                    = 12;
98  // directional keys
99  GLUT_KEY_LEFT                   = 100;
100  GLUT_KEY_UP                     = 101;
101  GLUT_KEY_RIGHT                  = 102;
102  GLUT_KEY_DOWN                   = 103;
103  GLUT_KEY_PAGE_UP                = 104;
104  GLUT_KEY_PAGE_DOWN              = 105;
105  GLUT_KEY_HOME                   = 106;
106  GLUT_KEY_END                    = 107;
107  GLUT_KEY_INSERT                 = 108;
108
109  // Entry/exit  state.
110  GLUT_LEFT                       = 0;
111  GLUT_ENTERED                    = 1;
112
113  // Menu usage state.
114  GLUT_MENU_NOT_IN_USE            = 0;
115  GLUT_MENU_IN_USE                = 1;
116
117  // Visibility  state.
118  GLUT_NOT_VISIBLE                = 0;
119  GLUT_VISIBLE                    = 1;
120
121  // Window status  state.
122  GLUT_HIDDEN                     = 0;
123  GLUT_FULLY_RETAINED             = 1;
124  GLUT_PARTIALLY_RETAINED         = 2;
125  GLUT_FULLY_COVERED              = 3;
126
127  // Color index component selection values.
128  GLUT_RED                        = 0;
129  GLUT_GREEN                      = 1;
130  GLUT_BLUE                       = 2;
131
132  // Layers for use.
133  GLUT_NORMAL                     = 0;
134  GLUT_OVERLAY                    = 1;
135
136{$ifdef Windows}
137  // Stroke font constants (use these in GLUT program).
138  GLUT_STROKE_ROMAN               = Pointer(0);
139  GLUT_STROKE_MONO_ROMAN          = Pointer(1);
140
141  // Bitmap font constants (use these in GLUT program).
142  GLUT_BITMAP_9_BY_15             = Pointer(2);
143  GLUT_BITMAP_8_BY_13             = Pointer(3);
144  GLUT_BITMAP_TIMES_ROMAN_10      = Pointer(4);
145  GLUT_BITMAP_TIMES_ROMAN_24      = Pointer(5);
146  GLUT_BITMAP_HELVETICA_10        = Pointer(6);
147  GLUT_BITMAP_HELVETICA_12        = Pointer(7);
148  GLUT_BITMAP_HELVETICA_18        = Pointer(8);
149{$else Windows}
150var
151  // Stroke font constants (use these in GLUT program).
152  GLUT_STROKE_ROMAN               : Pointer;
153  GLUT_STROKE_MONO_ROMAN          : Pointer;
154
155  // Bitmap font constants (use these in GLUT program).
156  GLUT_BITMAP_9_BY_15             : Pointer;
157  GLUT_BITMAP_8_BY_13             : Pointer;
158  GLUT_BITMAP_TIMES_ROMAN_10      : Pointer;
159  GLUT_BITMAP_TIMES_ROMAN_24      : Pointer;
160  GLUT_BITMAP_HELVETICA_10        : Pointer;
161  GLUT_BITMAP_HELVETICA_12        : Pointer;
162  GLUT_BITMAP_HELVETICA_18        : Pointer;
163
164const
165{$endif Windows}
166
167  // glutGet parameters.
168  GLUT_WINDOW_X                   = 100;
169  GLUT_WINDOW_Y                   = 101;
170  GLUT_WINDOW_WIDTH               = 102;
171  GLUT_WINDOW_HEIGHT              = 103;
172  GLUT_WINDOW_BUFFER_SIZE         = 104;
173  GLUT_WINDOW_STENCIL_SIZE        = 105;
174  GLUT_WINDOW_DEPTH_SIZE          = 106;
175  GLUT_WINDOW_RED_SIZE            = 107;
176  GLUT_WINDOW_GREEN_SIZE          = 108;
177  GLUT_WINDOW_BLUE_SIZE           = 109;
178  GLUT_WINDOW_ALPHA_SIZE          = 110;
179  GLUT_WINDOW_ACCUM_RED_SIZE      = 111;
180  GLUT_WINDOW_ACCUM_GREEN_SIZE    = 112;
181  GLUT_WINDOW_ACCUM_BLUE_SIZE     = 113;
182  GLUT_WINDOW_ACCUM_ALPHA_SIZE    = 114;
183  GLUT_WINDOW_DOUBLEBUFFER        = 115;
184  GLUT_WINDOW_RGBA                = 116;
185  GLUT_WINDOW_PARENT              = 117;
186  GLUT_WINDOW_NUM_CHILDREN        = 118;
187  GLUT_WINDOW_COLORMAP_SIZE       = 119;
188  GLUT_WINDOW_NUM_SAMPLES         = 120;
189  GLUT_WINDOW_STEREO              = 121;
190  GLUT_WINDOW_CURSOR              = 122;
191  GLUT_SCREEN_WIDTH               = 200;
192  GLUT_SCREEN_HEIGHT              = 201;
193  GLUT_SCREEN_WIDTH_MM            = 202;
194  GLUT_SCREEN_HEIGHT_MM           = 203;
195  GLUT_MENU_NUM_ITEMS             = 300;
196  GLUT_DISPLAY_MODE_POSSIBLE      = 400;
197  GLUT_INIT_WINDOW_X              = 500;
198  GLUT_INIT_WINDOW_Y              = 501;
199  GLUT_INIT_WINDOW_WIDTH          = 502;
200  GLUT_INIT_WINDOW_HEIGHT         = 503;
201  GLUT_INIT_DISPLAY_MODE          = 504;
202  GLUT_ELAPSED_TIME               = 700;
203  GLUT_WINDOW_FORMAT_ID		  = 123;
204
205  // glutDeviceGet parameters.
206  GLUT_HAS_KEYBOARD               = 600;
207  GLUT_HAS_MOUSE                  = 601;
208  GLUT_HAS_SPACEBALL              = 602;
209  GLUT_HAS_DIAL_AND_BUTTON_BOX    = 603;
210  GLUT_HAS_TABLET                 = 604;
211  GLUT_NUM_MOUSE_BUTTONS          = 605;
212  GLUT_NUM_SPACEBALL_BUTTONS      = 606;
213  GLUT_NUM_BUTTON_BOX_BUTTONS     = 607;
214  GLUT_NUM_DIALS                  = 608;
215  GLUT_NUM_TABLET_BUTTONS         = 609;
216  GLUT_DEVICE_IGNORE_KEY_REPEAT   = 610;
217  GLUT_DEVICE_KEY_REPEAT          = 611;
218  GLUT_HAS_JOYSTICK               = 612;
219  GLUT_OWNS_JOYSTICK              = 613;
220  GLUT_JOYSTICK_BUTTONS           = 614;
221  GLUT_JOYSTICK_AXES              = 615;
222  GLUT_JOYSTICK_POLL_RATE         = 616;
223
224
225  // glutLayerGet parameters.
226  GLUT_OVERLAY_POSSIBLE           = 800;
227  GLUT_LAYER_IN_USE               = 801;
228  GLUT_HAS_OVERLAY                = 802;
229  GLUT_TRANSPARENT_INDEX          = 803;
230  GLUT_NORMAL_DAMAGED             = 804;
231  GLUT_OVERLAY_DAMAGED            = 805;
232
233  // glutVideoResizeGet parameters.
234  GLUT_VIDEO_RESIZE_POSSIBLE       = 900;
235  GLUT_VIDEO_RESIZE_IN_USE         = 901;
236  GLUT_VIDEO_RESIZE_X_DELTA        = 902;
237  GLUT_VIDEO_RESIZE_Y_DELTA        = 903;
238  GLUT_VIDEO_RESIZE_WIDTH_DELTA    = 904;
239  GLUT_VIDEO_RESIZE_HEIGHT_DELTA   = 905;
240  GLUT_VIDEO_RESIZE_X              = 906;
241  GLUT_VIDEO_RESIZE_Y              = 907;
242  GLUT_VIDEO_RESIZE_WIDTH          = 908;
243  GLUT_VIDEO_RESIZE_HEIGHT         = 909;
244
245  // glutGetModifiers return mask.
246  GLUT_ACTIVE_SHIFT                = 1;
247  GLUT_ACTIVE_CTRL                 = 2;
248  GLUT_ACTIVE_ALT                  = 4;
249
250  // glutSetCursor parameters.
251  // Basic arrows.
252  GLUT_CURSOR_RIGHT_ARROW          = 0;
253  GLUT_CURSOR_LEFT_ARROW           = 1;
254  // Symbolic cursor shapes.
255  GLUT_CURSOR_INFO                 = 2;
256  GLUT_CURSOR_DESTROY              = 3;
257  GLUT_CURSOR_HELP                 = 4;
258  GLUT_CURSOR_CYCLE                = 5;
259  GLUT_CURSOR_SPRAY                = 6;
260  GLUT_CURSOR_WAIT                 = 7;
261  GLUT_CURSOR_TEXT                 = 8;
262  GLUT_CURSOR_CROSSHAIR            = 9;
263  // Directional cursors.
264  GLUT_CURSOR_UP_DOWN              = 10;
265  GLUT_CURSOR_LEFT_RIGHT           = 11;
266  // Sizing cursors.
267  GLUT_CURSOR_TOP_SIDE             = 12;
268  GLUT_CURSOR_BOTTOM_SIDE          = 13;
269  GLUT_CURSOR_LEFT_SIDE            = 14;
270  GLUT_CURSOR_RIGHT_SIDE           = 15;
271  GLUT_CURSOR_TOP_LEFT_CORNER      = 16;
272  GLUT_CURSOR_TOP_RIGHT_CORNER     = 17;
273  GLUT_CURSOR_BOTTOM_RIGHT_CORNER  = 18;
274  GLUT_CURSOR_BOTTOM_LEFT_CORNER   = 19;
275  // Inherit from parent window.
276  GLUT_CURSOR_INHERIT              = 100;
277  // Blank cursor.
278  GLUT_CURSOR_NONE                 = 101;
279  // Fullscreen crosshair (if available).
280  GLUT_CURSOR_FULL_CROSSHAIR       = 102;
281
282  // GLUT device control sub-API.
283  // glutSetKeyRepeat modes.
284  GLUT_KEY_REPEAT_OFF      = 0;
285  GLUT_KEY_REPEAT_ON       = 1;
286  GLUT_KEY_REPEAT_DEFAULT  = 2;
287
288// Joystick button masks.
289  GLUT_JOYSTICK_BUTTON_A = 1;
290  GLUT_JOYSTICK_BUTTON_B = 2;
291  GLUT_JOYSTICK_BUTTON_C = 4;
292  GLUT_JOYSTICK_BUTTON_D = 8;
293
294  // GLUT game mode sub-API.
295  // glutGameModeGet.
296  GLUT_GAME_MODE_ACTIVE           = 0;
297  GLUT_GAME_MODE_POSSIBLE         = 1;
298  GLUT_GAME_MODE_WIDTH            = 2;
299  GLUT_GAME_MODE_HEIGHT           = 3;
300  GLUT_GAME_MODE_PIXEL_DEPTH      = 4;
301  GLUT_GAME_MODE_REFRESH_RATE     = 5;
302  GLUT_GAME_MODE_DISPLAY_CHANGED  = 6;
303
304{$IFDEF MORPHOS}
305
306{ MorphOS GL works differently due to different dynamic-library handling on Amiga-like }
307{ systems, so its headers are included here. }
308{$INCLUDE tinyglh.inc}
309
310{$ELSE MORPHOS}
311
312var
313// GLUT initialization sub-API.
314  glutInit: procedure(argcp: PInteger; argv: PPChar); extdecl;
315  glutInitDisplayMode: procedure(mode: Cardinal); extdecl;
316  glutInitDisplayString: procedure(const str: PChar); extdecl;
317  glutInitWindowPosition: procedure(x, y: Integer); extdecl;
318  glutInitWindowSize: procedure(width, height: Integer); extdecl;
319  glutMainLoop: procedure; extdecl;
320
321// GLUT window sub-API.
322  glutCreateWindow: function(const title: PChar): Integer; extdecl;
323  glutCreateSubWindow: function(win, x, y, width, height: Integer): Integer; extdecl;
324  glutDestroyWindow: procedure(win: Integer); extdecl;
325  glutPostRedisplay: procedure; extdecl;
326  glutPostWindowRedisplay: procedure(win: Integer); extdecl;
327  glutSwapBuffers: procedure; extdecl;
328  glutGetWindow: function: Integer; extdecl;
329  glutSetWindow: procedure(win: Integer); extdecl;
330  glutSetWindowTitle: procedure(const title: PChar); extdecl;
331  glutSetIconTitle: procedure(const title: PChar); extdecl;
332  glutPositionWindow: procedure(x, y: Integer); extdecl;
333  glutReshapeWindow: procedure(width, height: Integer); extdecl;
334  glutPopWindow: procedure; extdecl;
335  glutPushWindow: procedure; extdecl;
336  glutIconifyWindow: procedure; extdecl;
337  glutShowWindow: procedure; extdecl;
338  glutHideWindow: procedure; extdecl;
339  glutFullScreen: procedure; extdecl;
340  glutSetCursor: procedure(cursor: Integer); extdecl;
341  glutWarpPointer: procedure(x, y: Integer); extdecl;
342
343// GLUT overlay sub-API.
344  glutEstablishOverlay: procedure; extdecl;
345  glutRemoveOverlay: procedure; extdecl;
346  glutUseLayer: procedure(layer: GLenum); extdecl;
347  glutPostOverlayRedisplay: procedure; extdecl;
348  glutPostWindowOverlayRedisplay: procedure(win: Integer); extdecl;
349  glutShowOverlay: procedure; extdecl;
350  glutHideOverlay: procedure; extdecl;
351
352// GLUT menu sub-API.
353  glutCreateMenu: function(callback: TGlut1IntCallback): Integer; extdecl;
354  glutDestroyMenu: procedure(menu: Integer); extdecl;
355  glutGetMenu: function: Integer; extdecl;
356  glutSetMenu: procedure(menu: Integer); extdecl;
357  glutAddMenuEntry: procedure(const caption: PChar; value: Integer); extdecl;
358  glutAddSubMenu: procedure(const caption: PChar; submenu: Integer); extdecl;
359  glutChangeToMenuEntry: procedure(item: Integer; const caption: PChar; value: Integer); extdecl;
360  glutChangeToSubMenu: procedure(item: Integer; const caption: PChar; submenu: Integer); extdecl;
361  glutRemoveMenuItem: procedure(item: Integer); extdecl;
362  glutAttachMenu: procedure(button: Integer); extdecl;
363  glutDetachMenu: procedure(button: Integer); extdecl;
364
365// GLUT window callback sub-API.
366  glutDisplayFunc: procedure(f: TGlutVoidCallback); extdecl;
367  glutReshapeFunc: procedure(f: TGlut2IntCallback); extdecl;
368  glutKeyboardFunc: procedure(f: TGlut1Char2IntCallback); extdecl;
369  glutMouseFunc: procedure(f: TGlut4IntCallback); extdecl;
370  glutMotionFunc: procedure(f: TGlut2IntCallback); extdecl;
371  glutPassiveMotionFunc: procedure(f: TGlut2IntCallback); extdecl;
372  glutEntryFunc: procedure(f: TGlut1IntCallback); extdecl;
373  glutVisibilityFunc: procedure(f: TGlut1IntCallback); extdecl;
374  glutIdleFunc: procedure(f: TGlutVoidCallback); extdecl;
375  glutTimerFunc: procedure(millis: Cardinal; f: TGlut1IntCallback; value: Integer); extdecl;
376  glutMenuStateFunc: procedure(f: TGlut1IntCallback); extdecl;
377  glutSpecialFunc: procedure(f: TGlut3IntCallback); extdecl;
378  glutSpaceballMotionFunc: procedure(f: TGlut3IntCallback); extdecl;
379  glutSpaceballRotateFunc: procedure(f: TGlut3IntCallback); extdecl;
380  glutSpaceballButtonFunc: procedure(f: TGlut2IntCallback); extdecl;
381  glutButtonBoxFunc: procedure(f: TGlut2IntCallback); extdecl;
382  glutDialsFunc: procedure(f: TGlut2IntCallback); extdecl;
383  glutTabletMotionFunc: procedure(f: TGlut2IntCallback); extdecl;
384  glutTabletButtonFunc: procedure(f: TGlut4IntCallback); extdecl;
385  glutMenuStatusFunc: procedure(f: TGlut3IntCallback); extdecl;
386  glutOverlayDisplayFunc: procedure(f:TGlutVoidCallback); extdecl;
387  glutWindowStatusFunc: procedure(f: TGlut1IntCallback); extdecl;
388  glutKeyboardUpFunc: procedure(f: TGlut1Char2IntCallback); extdecl;
389  glutSpecialUpFunc: procedure(f: TGlut3IntCallback); extdecl;
390  glutJoystickFunc: procedure(f: TGlut1UInt3IntCallback; pollInterval: Integer); extdecl;
391
392// GLUT color index sub-API.
393  glutSetColor: procedure(cell: Integer; red, green, blue: GLfloat); extdecl;
394  glutGetColor: function(ndx, component: Integer): GLfloat; extdecl;
395  glutCopyColormap: procedure(win: Integer); extdecl;
396
397// GLUT state retrieval sub-API.
398  glutGet: function(t: GLenum): Integer; extdecl;
399  glutDeviceGet: function(t: GLenum): Integer; extdecl;
400
401// GLUT extension support sub-API
402  glutExtensionSupported: function(const name: PChar): Integer; extdecl;
403  glutGetModifiers: function: Integer; extdecl;
404  glutLayerGet: function(t: GLenum): Integer; extdecl;
405
406// GLUT font sub-API
407  glutBitmapCharacter: procedure(font : pointer; character: Integer); extdecl;
408  glutBitmapWidth: function(font : pointer; character: Integer): Integer; extdecl;
409  glutStrokeCharacter: procedure(font : pointer; character: Integer); extdecl;
410  glutStrokeWidth: function(font : pointer; character: Integer): Integer; extdecl;
411  glutBitmapLength: function(font: pointer; const str: PChar): Integer; extdecl;
412  glutStrokeLength: function(font: pointer; const str: PChar): Integer; extdecl;
413
414// GLUT pre-built models sub-API
415  glutWireSphere: procedure(radius: GLdouble; slices, stacks: GLint); extdecl;
416  glutSolidSphere: procedure(radius: GLdouble; slices, stacks: GLint); extdecl;
417  glutWireCone: procedure(base, height: GLdouble; slices, stacks: GLint); extdecl;
418  glutSolidCone: procedure(base, height: GLdouble; slices, stacks: GLint); extdecl;
419  glutWireCube: procedure(size: GLdouble); extdecl;
420  glutSolidCube: procedure(size: GLdouble); extdecl;
421  glutWireTorus: procedure(innerRadius, outerRadius: GLdouble; sides, rings: GLint); extdecl;
422  glutSolidTorus: procedure(innerRadius, outerRadius: GLdouble; sides, rings: GLint); extdecl;
423  glutWireDodecahedron: procedure; extdecl;
424  glutSolidDodecahedron: procedure; extdecl;
425  glutWireTeapot: procedure(size: GLdouble); extdecl;
426  glutSolidTeapot: procedure(size: GLdouble); extdecl;
427  glutWireOctahedron: procedure; extdecl;
428  glutSolidOctahedron: procedure; extdecl;
429  glutWireTetrahedron: procedure; extdecl;
430  glutSolidTetrahedron: procedure; extdecl;
431  glutWireIcosahedron: procedure; extdecl;
432  glutSolidIcosahedron: procedure; extdecl;
433
434// GLUT video resize sub-API.
435  glutVideoResizeGet: function(param: GLenum): Integer; extdecl;
436  glutSetupVideoResizing: procedure; extdecl;
437  glutStopVideoResizing: procedure; extdecl;
438  glutVideoResize: procedure(x, y, width, height: Integer); extdecl;
439  glutVideoPan: procedure(x, y, width, height: Integer); extdecl;
440
441// GLUT debugging sub-API.
442  glutReportErrors: procedure; extdecl;
443
444// GLUT device control sub-API.
445
446  glutIgnoreKeyRepeat: procedure(ignore: Integer); extdecl;
447  glutSetKeyRepeat: procedure(repeatMode: Integer); extdecl;
448  glutForceJoystickFunc: procedure; extdecl;
449
450// GLUT game mode sub-API.
451
452  //example glutGameModeString('1280x1024:32@75');
453  glutGameModeString : procedure (const AString : PChar); extdecl;
454  glutEnterGameMode : function : integer; extdecl;
455  glutLeaveGameMode : procedure; extdecl;
456  glutGameModeGet : function (mode : GLenum) : integer; extdecl;
457{$ENDIF MORPHOS}
458
459procedure LoadGlut(const dll: String);
460procedure UnloadGlut;
461
462implementation
463
464{$IFDEF MORPHOS}
465
466{ MorphOS GL works differently due to different dynamic-library handling on Amiga-like }
467{ systems, so its functions are included here. }
468{$INCLUDE tinygl.inc}
469
470{$ELSE MORPHOS}
471uses FreeGlut;
472
473var
474  hDLL: TLibHandle;
475{$ENDIF MORPHOS}
476
477procedure UnloadGlut;
478begin
479{$IFDEF MORPHOS}
480  // MorphOS's GL will closed down by TinyGL unit, nothing is needed here.
481{$ELSE MORPHOS}
482
483  if (hDLL <> 0) then
484    FreeLibrary(hDLL);
485
486  @glutInit := nil;
487  @glutInitDisplayMode := nil;
488  @glutInitDisplayString := nil;
489  @glutInitWindowPosition := nil;
490  @glutInitWindowSize := nil;
491  @glutMainLoop := nil;
492  @glutCreateWindow := nil;
493  @glutCreateSubWindow := nil;
494  @glutDestroyWindow := nil;
495  @glutPostRedisplay := nil;
496  @glutPostWindowRedisplay := nil;
497  @glutSwapBuffers := nil;
498  @glutGetWindow := nil;
499  @glutSetWindow := nil;
500  @glutSetWindowTitle := nil;
501  @glutSetIconTitle := nil;
502  @glutPositionWindow := nil;
503  @glutReshapeWindow := nil;
504  @glutPopWindow := nil;
505  @glutPushWindow := nil;
506  @glutIconifyWindow := nil;
507  @glutShowWindow := nil;
508  @glutHideWindow := nil;
509  @glutFullScreen := nil;
510  @glutSetCursor := nil;
511  @glutWarpPointer := nil;
512  @glutEstablishOverlay := nil;
513  @glutRemoveOverlay := nil;
514  @glutUseLayer := nil;
515  @glutPostOverlayRedisplay := nil;
516  @glutPostWindowOverlayRedisplay := nil;
517  @glutShowOverlay := nil;
518  @glutHideOverlay := nil;
519  @glutCreateMenu := nil;
520  @glutDestroyMenu := nil;
521  @glutGetMenu := nil;
522  @glutSetMenu := nil;
523  @glutAddMenuEntry := nil;
524  @glutAddSubMenu := nil;
525  @glutChangeToMenuEntry := nil;
526  @glutChangeToSubMenu := nil;
527  @glutRemoveMenuItem := nil;
528  @glutAttachMenu := nil;
529  @glutDetachMenu := nil;
530  @glutDisplayFunc := nil;
531  @glutReshapeFunc := nil;
532  @glutKeyboardFunc := nil;
533  @glutMouseFunc := nil;
534  @glutMotionFunc := nil;
535  @glutPassiveMotionFunc := nil;
536  @glutEntryFunc := nil;
537  @glutVisibilityFunc := nil;
538  @glutIdleFunc := nil;
539  @glutTimerFunc := nil;
540  @glutMenuStateFunc := nil;
541  @glutSpecialFunc := nil;
542  @glutSpaceballMotionFunc := nil;
543  @glutSpaceballRotateFunc := nil;
544  @glutSpaceballButtonFunc := nil;
545  @glutButtonBoxFunc := nil;
546  @glutDialsFunc := nil;
547  @glutTabletMotionFunc := nil;
548  @glutTabletButtonFunc := nil;
549  @glutMenuStatusFunc := nil;
550  @glutOverlayDisplayFunc := nil;
551  @glutWindowStatusFunc := nil;
552  @glutKeyboardUpFunc := nil;
553  @glutSpecialUpFunc := nil;
554  @glutJoystickFunc := nil;
555  @glutSetColor := nil;
556  @glutGetColor := nil;
557  @glutCopyColormap := nil;
558  @glutGet := nil;
559  @glutDeviceGet := nil;
560  @glutExtensionSupported := nil;
561  @glutGetModifiers := nil;
562  @glutLayerGet := nil;
563  @glutBitmapCharacter := nil;
564  @glutBitmapWidth := nil;
565  @glutStrokeCharacter := nil;
566  @glutStrokeWidth := nil;
567  @glutBitmapLength := nil;
568  @glutStrokeLength := nil;
569  @glutWireSphere := nil;
570  @glutSolidSphere := nil;
571  @glutWireCone := nil;
572  @glutSolidCone := nil;
573  @glutWireCube := nil;
574  @glutSolidCube := nil;
575  @glutWireTorus := nil;
576  @glutSolidTorus := nil;
577  @glutWireDodecahedron := nil;
578  @glutSolidDodecahedron := nil;
579  @glutWireTeapot := nil;
580  @glutSolidTeapot := nil;
581  @glutWireOctahedron := nil;
582  @glutSolidOctahedron := nil;
583  @glutWireTetrahedron := nil;
584  @glutSolidTetrahedron := nil;
585  @glutWireIcosahedron := nil;
586  @glutSolidIcosahedron := nil;
587  @glutVideoResizeGet := nil;
588  @glutSetupVideoResizing := nil;
589  @glutStopVideoResizing := nil;
590  @glutVideoResize := nil;
591  @glutVideoPan := nil;
592  @glutReportErrors := nil;
593  @glutIgnoreKeyRepeat := nil;
594  @glutSetKeyRepeat := nil;
595  @glutForceJoystickFunc := nil;
596  @glutGameModeString := nil;
597  @glutEnterGameMode := nil;
598  @glutLeaveGameMode := nil;
599  @glutGameModeGet := nil;
600
601  UnloadFreeGlut;
602{$ENDIF MORPHOS}
603end;
604
605procedure LoadGlut(const dll: String);
606{$IFDEF MORPHOS}
607begin
608  // MorphOS's GL has own initialization in TinyGL unit, nothing is needed here.
609end;
610{$ELSE MORPHOS}
611var
612  MethodName: string = '';
613
614  function GetGLutProcAddress(Lib: PtrInt; ProcName: PChar): Pointer;
615  begin
616    MethodName:=ProcName;
617    Result:=GetProcAddress(Lib, ProcName);
618  end;
619
620begin
621
622  UnloadGlut;
623
624  hDLL := LoadLibrary(PChar(dll));
625  if hDLL = 0 then raise Exception.Create('Could not load Glut from ' + dll);
626  try
627    @glutInit := GetGLutProcAddress(hDLL, 'glutInit');
628    @glutInitDisplayMode := GetGLutProcAddress(hDLL, 'glutInitDisplayMode');
629    @glutInitDisplayString := GetGLutProcAddress(hDLL, 'glutInitDisplayString');
630    @glutInitWindowPosition := GetGLutProcAddress(hDLL, 'glutInitWindowPosition');
631    @glutInitWindowSize := GetGLutProcAddress(hDLL, 'glutInitWindowSize');
632    @glutMainLoop := GetGLutProcAddress(hDLL, 'glutMainLoop');
633    @glutCreateWindow := GetGLutProcAddress(hDLL, 'glutCreateWindow');
634    @glutCreateSubWindow := GetGLutProcAddress(hDLL, 'glutCreateSubWindow');
635    @glutDestroyWindow := GetGLutProcAddress(hDLL, 'glutDestroyWindow');
636    @glutPostRedisplay := GetGLutProcAddress(hDLL, 'glutPostRedisplay');
637    @glutPostWindowRedisplay := GetGLutProcAddress(hDLL, 'glutPostWindowRedisplay');
638    @glutSwapBuffers := GetGLutProcAddress(hDLL, 'glutSwapBuffers');
639    @glutGetWindow := GetGLutProcAddress(hDLL, 'glutGetWindow');
640    @glutSetWindow := GetGLutProcAddress(hDLL, 'glutSetWindow');
641    @glutSetWindowTitle := GetGLutProcAddress(hDLL, 'glutSetWindowTitle');
642    @glutSetIconTitle := GetGLutProcAddress(hDLL, 'glutSetIconTitle');
643    @glutPositionWindow := GetGLutProcAddress(hDLL, 'glutPositionWindow');
644    @glutReshapeWindow := GetGLutProcAddress(hDLL, 'glutReshapeWindow');
645    @glutPopWindow := GetGLutProcAddress(hDLL, 'glutPopWindow');
646    @glutPushWindow := GetGLutProcAddress(hDLL, 'glutPushWindow');
647    @glutIconifyWindow := GetGLutProcAddress(hDLL, 'glutIconifyWindow');
648    @glutShowWindow := GetGLutProcAddress(hDLL, 'glutShowWindow');
649    @glutHideWindow := GetGLutProcAddress(hDLL, 'glutHideWindow');
650    @glutFullScreen := GetGLutProcAddress(hDLL, 'glutFullScreen');
651    @glutSetCursor := GetGLutProcAddress(hDLL, 'glutSetCursor');
652    @glutWarpPointer := GetGLutProcAddress(hDLL, 'glutWarpPointer');
653    @glutEstablishOverlay := GetGLutProcAddress(hDLL, 'glutEstablishOverlay');
654    @glutRemoveOverlay := GetGLutProcAddress(hDLL, 'glutRemoveOverlay');
655    @glutUseLayer := GetGLutProcAddress(hDLL, 'glutUseLayer');
656    @glutPostOverlayRedisplay := GetGLutProcAddress(hDLL, 'glutPostOverlayRedisplay');
657    @glutPostWindowOverlayRedisplay := GetGLutProcAddress(hDLL, 'glutPostWindowOverlayRedisplay');
658    @glutShowOverlay := GetGLutProcAddress(hDLL, 'glutShowOverlay');
659    @glutHideOverlay := GetGLutProcAddress(hDLL, 'glutHideOverlay');
660    @glutCreateMenu := GetGLutProcAddress(hDLL, 'glutCreateMenu');
661    @glutDestroyMenu := GetGLutProcAddress(hDLL, 'glutDestroyMenu');
662    @glutGetMenu := GetGLutProcAddress(hDLL, 'glutGetMenu');
663    @glutSetMenu := GetGLutProcAddress(hDLL, 'glutSetMenu');
664    @glutAddMenuEntry := GetGLutProcAddress(hDLL, 'glutAddMenuEntry');
665    @glutAddSubMenu := GetGLutProcAddress(hDLL, 'glutAddSubMenu');
666    @glutChangeToMenuEntry := GetGLutProcAddress(hDLL, 'glutChangeToMenuEntry');
667    @glutChangeToSubMenu := GetGLutProcAddress(hDLL, 'glutChangeToSubMenu');
668    @glutRemoveMenuItem := GetGLutProcAddress(hDLL, 'glutRemoveMenuItem');
669    @glutAttachMenu := GetGLutProcAddress(hDLL, 'glutAttachMenu');
670    @glutDetachMenu := GetGLutProcAddress(hDLL, 'glutDetachMenu');
671    @glutDisplayFunc := GetGLutProcAddress(hDLL, 'glutDisplayFunc');
672    @glutReshapeFunc := GetGLutProcAddress(hDLL, 'glutReshapeFunc');
673    @glutKeyboardFunc := GetGLutProcAddress(hDLL, 'glutKeyboardFunc');
674    @glutMouseFunc := GetGLutProcAddress(hDLL, 'glutMouseFunc');
675    @glutMotionFunc := GetGLutProcAddress(hDLL, 'glutMotionFunc');
676    @glutPassiveMotionFunc := GetGLutProcAddress(hDLL, 'glutPassiveMotionFunc');
677    @glutEntryFunc := GetGLutProcAddress(hDLL, 'glutEntryFunc');
678    @glutVisibilityFunc := GetGLutProcAddress(hDLL, 'glutVisibilityFunc');
679    @glutIdleFunc := GetGLutProcAddress(hDLL, 'glutIdleFunc');
680    @glutTimerFunc := GetGLutProcAddress(hDLL, 'glutTimerFunc');
681    @glutMenuStateFunc := GetGLutProcAddress(hDLL, 'glutMenuStateFunc');
682    @glutSpecialFunc := GetGLutProcAddress(hDLL, 'glutSpecialFunc');
683    @glutSpaceballMotionFunc := GetGLutProcAddress(hDLL, 'glutSpaceballMotionFunc');
684    @glutSpaceballRotateFunc := GetGLutProcAddress(hDLL, 'glutSpaceballRotateFunc');
685    @glutSpaceballButtonFunc := GetGLutProcAddress(hDLL, 'glutSpaceballButtonFunc');
686    @glutButtonBoxFunc := GetGLutProcAddress(hDLL, 'glutButtonBoxFunc');
687    @glutDialsFunc := GetGLutProcAddress(hDLL, 'glutDialsFunc');
688    @glutTabletMotionFunc := GetGLutProcAddress(hDLL, 'glutTabletMotionFunc');
689    @glutTabletButtonFunc := GetGLutProcAddress(hDLL, 'glutTabletButtonFunc');
690    @glutMenuStatusFunc := GetGLutProcAddress(hDLL, 'glutMenuStatusFunc');
691    @glutOverlayDisplayFunc := GetGLutProcAddress(hDLL, 'glutOverlayDisplayFunc');
692    @glutWindowStatusFunc := GetGLutProcAddress(hDLL, 'glutWindowStatusFunc');
693    @glutKeyboardUpFunc := GetGLutProcAddress(hDLL, 'glutKeyboardUpFunc');
694    @glutSpecialUpFunc := GetGLutProcAddress(hDLL, 'glutSpecialUpFunc');
695    @glutJoystickFunc := GetGLutProcAddress(hDLL, 'glutJoystickFunc');
696    @glutSetColor := GetGLutProcAddress(hDLL, 'glutSetColor');
697    @glutGetColor := GetGLutProcAddress(hDLL, 'glutGetColor');
698    @glutCopyColormap := GetGLutProcAddress(hDLL, 'glutCopyColormap');
699    @glutGet := GetGLutProcAddress(hDLL, 'glutGet');
700    @glutDeviceGet := GetGLutProcAddress(hDLL, 'glutDeviceGet');
701    @glutExtensionSupported := GetGLutProcAddress(hDLL, 'glutExtensionSupported');
702    @glutGetModifiers := GetGLutProcAddress(hDLL, 'glutGetModifiers');
703    @glutLayerGet := GetGLutProcAddress(hDLL, 'glutLayerGet');
704    @glutBitmapCharacter := GetGLutProcAddress(hDLL, 'glutBitmapCharacter');
705    @glutBitmapWidth := GetGLutProcAddress(hDLL, 'glutBitmapWidth');
706    @glutStrokeCharacter := GetGLutProcAddress(hDLL, 'glutStrokeCharacter');
707    @glutStrokeWidth := GetGLutProcAddress(hDLL, 'glutStrokeWidth');
708    @glutBitmapLength := GetGLutProcAddress(hDLL, 'glutBitmapLength');
709    @glutStrokeLength := GetGLutProcAddress(hDLL, 'glutStrokeLength');
710    @glutWireSphere := GetGLutProcAddress(hDLL, 'glutWireSphere');
711    @glutSolidSphere := GetGLutProcAddress(hDLL, 'glutSolidSphere');
712    @glutWireCone := GetGLutProcAddress(hDLL, 'glutWireCone');
713    @glutSolidCone := GetGLutProcAddress(hDLL, 'glutSolidCone');
714    @glutWireCube := GetGLutProcAddress(hDLL, 'glutWireCube');
715    @glutSolidCube := GetGLutProcAddress(hDLL, 'glutSolidCube');
716    @glutWireTorus := GetGLutProcAddress(hDLL, 'glutWireTorus');
717    @glutSolidTorus := GetGLutProcAddress(hDLL, 'glutSolidTorus');
718    @glutWireDodecahedron := GetGLutProcAddress(hDLL, 'glutWireDodecahedron');
719    @glutSolidDodecahedron := GetGLutProcAddress(hDLL, 'glutSolidDodecahedron');
720    @glutWireTeapot := GetGLutProcAddress(hDLL, 'glutWireTeapot');
721    @glutSolidTeapot := GetGLutProcAddress(hDLL, 'glutSolidTeapot');
722    @glutWireOctahedron := GetGLutProcAddress(hDLL, 'glutWireOctahedron');
723    @glutSolidOctahedron := GetGLutProcAddress(hDLL, 'glutSolidOctahedron');
724    @glutWireTetrahedron := GetGLutProcAddress(hDLL, 'glutWireTetrahedron');
725    @glutSolidTetrahedron := GetGLutProcAddress(hDLL, 'glutSolidTetrahedron');
726    @glutWireIcosahedron := GetGLutProcAddress(hDLL, 'glutWireIcosahedron');
727    @glutSolidIcosahedron := GetGLutProcAddress(hDLL, 'glutSolidIcosahedron');
728    @glutVideoResizeGet := GetGLutProcAddress(hDLL, 'glutVideoResizeGet');
729    @glutSetupVideoResizing := GetGLutProcAddress(hDLL, 'glutSetupVideoResizing');
730    @glutStopVideoResizing := GetGLutProcAddress(hDLL, 'glutStopVideoResizing');
731    @glutVideoResize := GetGLutProcAddress(hDLL, 'glutVideoResize');
732    @glutVideoPan := GetGLutProcAddress(hDLL, 'glutVideoPan');
733    @glutReportErrors := GetGLutProcAddress(hDLL, 'glutReportErrors');
734    @glutIgnoreKeyRepeat := GetGLutProcAddress(hDLL, 'glutIgnoreKeyRepeat');
735    @glutSetKeyRepeat := GetGLutProcAddress(hDLL, 'glutSetKeyRepeat');
736    @glutForceJoystickFunc := GetGLutProcAddress(hDLL, 'glutForceJoystickFunc');
737    @glutGameModeString := GetGLutProcAddress(hDLL, 'glutGameModeString');
738    @glutEnterGameMode := GetGLutProcAddress(hDLL, 'glutEnterGameMode');
739    @glutLeaveGameMode := GetGLutProcAddress(hDLL, 'glutLeaveGameMode');
740    @glutGameModeGet := GetGLutProcAddress(hDLL, 'glutGameModeGet');
741{$ifndef Windows}
742    GLUT_STROKE_ROMAN := GetGLutProcAddress(hDll, 'glutStrokeRoman');
743    GLUT_STROKE_MONO_ROMAN := GetGLutProcAddress(hDll,'glutStrokeMonoRoman');
744    GLUT_BITMAP_9_BY_15 := GetGLutProcAddress(hDll, 'glutBitmap9By15');
745    GLUT_BITMAP_8_BY_13 := GetGLutProcAddress(hDll, 'glutBitmap8By13');
746    GLUT_BITMAP_TIMES_ROMAN_10 := GetGLutProcAddress(hDll, 'glutBitmapTimesRoman10');
747    GLUT_BITMAP_TIMES_ROMAN_24 := GetGLutProcAddress(hDll, 'glutBitmapTimesRoman24');
748    GLUT_BITMAP_HELVETICA_10 := GetGLutProcAddress(hDll, 'glutBitmapHelvetica10');
749    GLUT_BITMAP_HELVETICA_12 := GetGLutProcAddress(hDll, 'glutBitmapHelvetica12');
750    GLUT_BITMAP_HELVETICA_18 := GetGLutProcAddress(hDll, 'glutBitmapHelvetica18');
751{$endif Windows}
752  except
753    raise Exception.Create('Could not load ' + MethodName + ' from ' + dll);
754  end;
755  LoadFreeGlut(hDLL);
756end;
757{$ENDIF MORPHOS}
758
759
760initialization
761
762  {$if defined(Windows)}
763  LoadGlut('glut32.dll');
764  {$elseif defined(OS2)}
765  LoadGlut('glut.dll');
766  {$elseif defined(darwin)}
767  LoadGlut('/System/Library/Frameworks/GLUT.framework/GLUT');
768  {$elseif defined(haiku) or defined(OpenBSD)}
769  LoadGlut('libglut.so');
770  {$elseif defined(MORPHOS)}
771  {nothing}
772  {$else}
773  LoadGlut('libglut.so.3');
774  {$endif}
775
776finalization
777
778  UnloadGlut;
779
780end.
781