2 ;;; Copyright (C) 2013 Daniel Hartwig <mandyke@gmail.com>
4 ;;; Figl is free software: you can redistribute it and/or modify it
5 ;;; under the terms of the GNU Lesser General Public License as
6 ;;; published by the Free Software Foundation, either version 3 of the
7 ;;; License, or (at your option) any later version.
9 ;;; Figl is distributed in the hope that it will be useful, but WITHOUT
10 ;;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 ;;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
12 ;;; Public License for more details.
14 ;;; You should have received a copy of the GNU Lesser General Public
15 ;;; License along with this program. If not, see
16 ;;; <http://www.gnu.org/licenses/>.
20 ;; These bindings are direct mappings to the OpenGL Utility Library
21 ;; (GLUT) Programming Interface, API Version 3.
23 ;; Care should be taken to avoid errors as GLUT implementations may
24 ;; exit() on error condition. See section 14.3 of the specification.
28 (define-module (figl glut low-level)
29 #:use-module (figl runtime)
30 #:use-module (figl gl types)
31 #:use-module ((system foreign) #:renamer (symbol-prefix-proc 'ffi:))
32 #:use-module (srfi srfi-26) ; cut
33 #:export (;; 2 Initialization
35 glutInitWindowPosition
39 ;; 3 Begin Event Processing
42 ;; 4 Window Management
62 ;; 5 Overlay Management
66 glutPostOverlayRedisplay
83 ;; 7 Callback Registration
85 glutOverlayDisplayFunc
94 glutSpaceballMotionFunc
95 glutSpaceballRotateFunc
96 glutSpaceballButtonFunc
106 ;; 8 Color Index Colormap Management
116 glutExtensionSupported
124 ;; 11 Geometric Object Rendering
133 glutSolidDodecahedron
145 (define libglut (dynamic-link "libglut"))
147 (define (glut-resolver name)
148 (dynamic-pointer name libglut))
150 (current-resolver glut-resolver)
152 (define-simple-foreign-type int ffi:int)
153 (define-simple-foreign-type unsigned-int ffi:unsigned-int)
155 ;; GLUT specifies that all strings are ASCII encoded.
156 (define-foreign-type char-* '*
157 (cut ffi:string->pointer <> "ASCII")
158 (cut ffi:pointer->string <> -1 "ASCII"))
160 (define-simple-foreign-type int-* '*)
161 (define-simple-foreign-type char-** '*)
167 (define-foreign-procedure
168 (glutInit (argcp int-*) (argv char-**) -> void)
171 (define-foreign-procedure
172 (glutInitWindowPosition (x int) (y int) -> void)
175 (define-foreign-procedure
176 (glutInitWindowSize (width int) (height int) -> void)
179 (define-foreign-procedure
180 (glutInitDisplayMode (mode unsigned-int) -> void)
184 ;;; 3 Begin Event Processing
187 (define-foreign-procedure
188 (glutMainLoop -> void)
192 ;;; 4 Window Management
195 (define-foreign-procedure
196 (glutCreateWindow (name char-*) -> int)
199 (define-foreign-procedure
200 (glutCreateSubWindow (win int)
209 (define-foreign-procedure
210 (glutSetWindow (win int) -> void)
213 (define-foreign-procedure
214 (glutGetWindow -> int)
217 (define-foreign-procedure
218 (glutDestroyWindow (win int) -> void)
221 (define-foreign-procedure
222 (glutPostRedisplay -> void)
225 (define-foreign-procedure
226 (glutSwapBuffers -> void)
229 (define-foreign-procedure
230 (glutPositionWindow (x int) (y int) -> void)
233 (define-foreign-procedure
234 (glutReshapeWindow (width int) (height int) -> void)
237 (define-foreign-procedure
238 (glutFullScreen -> void)
241 (define-foreign-procedure
242 (glutPopWindow -> void)
245 (define-foreign-procedure
246 (glutPushWindow -> void)
249 (define-foreign-procedure
250 (glutShowWindow -> void)
253 (define-foreign-procedure
254 (glutHideWindow -> void)
257 (define-foreign-procedure
258 (glutIconifyWindow -> void)
261 (define-foreign-procedure
262 (glutSetWindowTitle (name char-*) -> void)
265 (define-foreign-procedure
266 (glutSetIconTitle (name char-*) -> void)
269 (define-foreign-procedure
270 (glutSetCursor (cursor int) -> void)
275 ;;; 5 Overlay Management
278 (define-foreign-procedure
279 (glutEstablishOverlay -> void)
282 (define-foreign-procedure
283 (glutUseLayer (layer GLenum) -> void)
286 (define-foreign-procedure
287 (glutRemoveOverlay -> void)
290 (define-foreign-procedure
291 (glutPostOverlayRedisplay -> void)
294 (define-foreign-procedure
295 (glutShowOverlay -> void)
298 (define-foreign-procedure
299 (glutHideOverlay -> void)
304 ;;; 6 Menu Management
307 (define-foreign-procedure
308 (glutCreateMenu (func void-*) -> int)
311 (define-foreign-procedure
312 (glutSetMenu (menu int) -> void)
315 (define-foreign-procedure
319 (define-foreign-procedure
320 (glutDestroyMenu (menu int) -> void)
323 (define-foreign-procedure
324 (glutAddMenuEntry (name char-*) (value int) -> void)
327 (define-foreign-procedure
328 (glutAddSubMenu (name char-*) (menu int) -> void)
331 (define-foreign-procedure
332 (glutChangeToMenuEntry (entry int)
339 (define-foreign-procedure
340 (glutChangeToSubMenu (entry int)
347 (define-foreign-procedure
348 (glutRemoveMenuItem (entry int) -> void)
351 (define-foreign-procedure
352 (glutAttachMenu (button int) -> void)
355 (define-foreign-procedure
356 (glutDetachMenu (button int) -> void)
361 ;;; 7 Callback Registration
364 (define-foreign-procedure
365 (glutDisplayFunc (func void-*) -> void)
368 (define-foreign-procedure
369 (glutOverlayDisplayFunc (func void-*) -> void)
372 (define-foreign-procedure
373 (glutReshapeFunc (func void-*) -> void)
376 (define-foreign-procedure
377 (glutKeyboardFunc (func void-*) -> void)
380 (define-foreign-procedure
381 (glutMouseFunc (func void-*) -> void)
384 (define-foreign-procedure
385 (glutMotionFunc (func void-*) -> void)
388 (define-foreign-procedure
389 (glutPassiveMotionFunc (func void-*) -> void)
392 (define-foreign-procedure
393 (glutVisibilityFunc (func void-*) -> void)
396 (define-foreign-procedure
397 (glutEntryFunc (func void-*) -> void)
400 (define-foreign-procedure
401 (glutSpecialFunc (func void-*) -> void)
404 (define-foreign-procedure
405 (glutSpaceballMotionFunc (func void-*) -> void)
408 (define-foreign-procedure
409 (glutSpaceballRotateFunc (func void-*) -> void)
412 (define-foreign-procedure
413 (glutSpaceballButtonFunc (func void-*) -> void)
416 (define-foreign-procedure
417 (glutButtonBoxFunc (func void-*) -> void)
420 (define-foreign-procedure
421 (glutDialsFunc (func void-*) -> void)
424 (define-foreign-procedure
425 (glutTabletMotionFunc (func void-*) -> void)
428 (define-foreign-procedure
429 (glutTabletButtonFunc (func void-*) -> void)
432 (define-foreign-procedure
433 (glutMenuStatusFunc (func void-*) -> void)
436 (define-foreign-procedure
437 (glutMenuStateFunc (func void-*) -> void)
440 (define-foreign-procedure
441 (glutIdleFunc (func void-*) -> void)
444 (define-foreign-procedure
445 (glutTimerFunc (msecs unsigned-int)
454 ;;; 8 Color Index Colormap Management
457 (define-foreign-procedure
458 (glutSetColor (cell int)
466 (define-foreign-procedure
467 (glutGetColor (cell int) (component int) -> GLfloat)
470 (define-foreign-procedure
471 (glutCopyColormap (win int) -> void)
475 ;;; 9 State Retrieval
478 (define-foreign-procedure
479 (glutGet (state GLenum) -> int)
482 (define-foreign-procedure
483 (glutLayerGet (info GLenum) -> int)
486 (define-foreign-procedure
487 (glutDeviceGet (info GLenum) -> int)
490 (define-foreign-procedure
491 (glutGetModifiers -> int)
494 (define-foreign-procedure
495 (glutExtensionSupported (extension char-*) -> int)
499 ;;; 10 Font Rendering
502 (define-foreign-procedure
503 (glutBitmapCharacter (font void-*) (character int) -> void)
506 (define-foreign-procedure
507 (glutBitmapWidth (font void-*) (character int) -> int)
510 (define-foreign-procedure
511 (glutStrokeCharacter (font void-*) (character int) -> void)
514 (define-foreign-procedure
515 (glutStrokeWidth (font void-*) (character int) -> void)
520 ;;; 11 Geometric Object Rendering
523 (define-foreign-procedure
524 (glutSolidSphere (radius GLdouble)
531 (define-foreign-procedure
532 (glutWireSphere (radius GLdouble)
539 (define-foreign-procedure
540 (glutSolidCube (size GLdouble) -> void)
543 (define-foreign-procedure
544 (glutWireCube (size GLdouble) -> void)
547 (define-foreign-procedure
548 (glutSolidCone (base GLdouble)
556 (define-foreign-procedure
557 (glutWireCone (base GLdouble)
565 (define-foreign-procedure
566 (glutSolidTorus (inner-radius GLdouble)
567 (outer-radius GLdouble)
574 (define-foreign-procedure
575 (glutWireTorus (inner-radius GLdouble)
576 (outer-radius GLdouble)
583 (define-foreign-procedure
584 (glutSolidDodecahedron -> void)
587 (define-foreign-procedure
588 (glutWireDodecahedron -> void)
591 (define-foreign-procedure
592 (glutSolidOctahedron -> void)
595 (define-foreign-procedure
596 (glutWireOctahedron -> void)
599 (define-foreign-procedure
600 (glutSolidTetrahedron -> void)
603 (define-foreign-procedure
604 (glutWireTetrahedron -> void)
607 (define-foreign-procedure
608 (glutSolidIcosahedron -> void)
611 (define-foreign-procedure
612 (glutWireIcosahedron -> void)
615 (define-foreign-procedure
616 (glutSolidTeapot (size GLdouble) -> void)
619 (define-foreign-procedure
620 (glutWireTeapot (size GLdouble) -> void)