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) or defined(freebsd) or defined(dragonfly)} 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