glut.pp 31 KB

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