newlisp/examples/opengl-demo.lsp

197 lines
6 KiB
Text

#!/usr/bin/env newlisp
# OpenGL and GLUT demo - opengl-demo.lsp
# using simple import and callback API
# tested on Windows and OS X (Intel) 32-bit only!
# version 1.2, July 2009 - make drawObject working with motion
# this version runs only on 32-bit newLISP and libraries
# for 64-bit newlisp use http://www.newlisp.org/downloads/OpenGL/opengl-demo-ffi-lsp.txt,
# which runs both 32/64 versions of newLISP. For this extended ffi version newLISP 10.4.0
# or later is required. The extended ffi interface is present in all binary distributions
# (Windows, OSX, Ubuntu)
# WIn32
# opengl32.dll - should be already on you WindowsXP installation or at www.opengl.org
# glut32.dll - available here: http://www.opengl.org/resources/libraries/glut/
# Note! on Windows 7 glut32.dll should be installed c:/Windows/SysWOW64/ not system32
#
# Linux/UNIX - not tested
# libGLU.so - should be on your Linux/UNIX installation or at www.opengl.org
# glut-3.7.so - already on your system or at:
# http://www.opengl.org/resources/libraries/glut/
#
# Mac OS X - works well on Intel based Mac OS X, will not work on PPC
# nothing needs to be installed on Mac OX X 10.4 and later
# libGL.dylib - in /System/Library/Frameworks/OpenGL.Framework
# GLUT - in /System/Library/Frameworks/GLUT.Framework
#
# for a complete function reference for OpenGL look here:
# http://www.opengl.org/documentation/
#
# for descriptions and refence to GLU see here:
# http://www.opengl.org/resources/libraries/glut/
#
# Calling patterns for OpenGL functions:
# Functions are described in the manual with the following types:
#
# All the following integer types are passed as is or with (int ...):
# GLenum GLboolean GLbitfield GLbyte GLshort GLint GLsizei GLubyte GLushort GLuint
# and types ending in: 3b, si, 3s
#
# The following double float types are passed as is or with (float ...):
# GLdouble GLclampd
# and types ending in: 3d
#
# The following small float types are must with (flt ...) conversion:
# GLfloat GLclampf
# and all types ending 3f:
#
(when (= 256 (& 256 (last (sys-info)))) ; if it is 64 bit version
(println "This file can run only on the 32-bit version of newLISP")
(println "Use opengl-demo-ffi.lsp, which runs on both, 32-bit and 64-bit")
(exit))
(if
(= ostype "OSX") ;; drawings will be visible only on x86 based OS X
(begin
(set 'GL_LIB "/System/Library/Frameworks/OpenGL.Framework/Libraries/libGL.dylib")
(set 'GLUT_LIB "/System/Library/Frameworks/GLUT.Framework/GLUT")
)
(find ostype '("Windows", "Cygwin"))
(begin
(set 'GL_LIB "opengl32.dll")
(set 'GLUT_LIB "glut32.dll"))
(= ostype "Linux") ;; not tested
(begin
(set 'GL_LIB "libGL.so")
(set 'GLUT_LIB "libglut.so"))
)
(import GL_LIB "glClear")
(import GL_LIB "glClearColor")
(import GL_LIB "glEnable")
(import GL_LIB "glHint")
(import GL_LIB "glColor3d")
(import GL_LIB "glBegin")
(import GL_LIB "glEnd")
(import GL_LIB "glVertex3d")
(import GL_LIB "glFlush")
(import GL_LIB "glFinish")
(import GL_LIB "glRotated")
(import GL_LIB "glLineWidth")
(import GLUT_LIB "glutInit")
(import GLUT_LIB "glutDisplayFunc")
(import GLUT_LIB "glutInitWindowSize")
(import GLUT_LIB "glutInitDisplayMode")
(import GLUT_LIB "glutInitWindowPosition")
(import GLUT_LIB "glutDisplayFunc")
(import GLUT_LIB "glutKeyboardFunc")
(import GLUT_LIB "glutMouseFunc")
(import GLUT_LIB "glutJoystickFunc")
(import GLUT_LIB "glutMotionFunc")
(import GLUT_LIB "glutIdleFunc")
(import GLUT_LIB "glutCreateWindow")
(import GLUT_LIB "glutCreateSubWindow")
(import GLUT_LIB "glutMainLoop")
(import GLUT_LIB "glutSwapBuffers")
(import GLUT_LIB "glutPostRedisplay")
(import GLUT_LIB "glutSolidCube")
(import GLUT_LIB "glutSolidTeapot")
(import GLUT_LIB "glutWireCube")
(import GLUT_LIB "glutWireTeapot")
(constant 'GL_COLOR_BUFFER_BIT 0x00004000)
(constant 'GL_TRIANGLES 0x0004)
(constant 'GL_BLEND 0x0BE2)
(constant 'GL_LINE_SMOOTH 0x0B20)
(constant 'GL_DONT_CARE 0x1100)
(constant 'GL_LINE_SMOOTH_HINT 0x0C52)
(constant 'GLUT_DOUBLE 0x0002)
(constant 'GLUT_SINGLE 0x0000)
(constant 'GLUT_RGB 0x0000)
(constant 'GLUT_RGBA 0x0000)
(set 'argc 0)
(set 'argv1 "")
(set 'argv (pack "lu" argv1))
(set 'rotx 0.0)
(set 'roty 0.0)
(set 'PI (mul (acos 0) 2))
(define (draw)
(glClear GL_COLOR_BUFFER_BIT )
(glRotated rotx 0.0 1.0 0.0)
(glRotated roty 1.0 0.0 0.0)
(glutWireTeapot 0.5)
(glutSwapBuffers)
)
(define (drawObject)
(glClear GL_COLOR_BUFFER_BIT )
(glColor3d 1.0 0.85 0.35)
(glRotated rotx 0.0 1.0 0.0)
(glRotated roty 1.0 0.0 0.0)
(glBegin GL_TRIANGLES)
(glVertex3d 0.0 0.6 0.0)
(glVertex3d -0.2 -0.3 0.0)
(glVertex3d 0.2 -0.3 0.0)
(glEnd)
(glutSwapBuffers)
)
(define (rotation)
(set 'rotx (mod (sub rotx .01) PI))
(set 'roty (mod (sub roty .012) PI))
(sleep 10)
(glutPostRedisplay)
)
(define (keyboard key x y)
(if (= (& key 0xFF) 27) (exit)) ; 0xFF mask necessary in Windows
(println "key:" (& key 0xFF) " x:" x " y:" y))
(define (mouse button state x y)
(if (= state 0)
(glutIdleFunc 0) ; auto-motion off on button press
(glutIdleFunc (callback 4 'rotation))) ; auto-motion on
(println "mouse button: " button " state:" state " x:" x " y:" y))
(define (joystick button x y z)
(println "joystick button: " button " x: " x " y: " y " z: " z))
(define (motion x y)
(set 'rotx (mul (div 200 x) PI))
(set 'roty (mul (div 150 y) PI))
(glutPostRedisplay)
(println "x:" x " y:" y)
(reset))
(glutInit (address argc) (address argv))
(glutInitDisplayMode (| GLUT_RGB GLUT_DOUBLE ))
(glutInitWindowSize 800 600)
(glutInitWindowPosition 80 80)
(set 'id (glutCreateWindow "OpenGL and newLISP - drag mouse - ESC to exit"))
(glClearColor (flt 0.5) (flt 0.3) (flt 0.3) (flt 0.0))
(glColor3d 1.0 0.85 0.35)
(glutDisplayFunc (callback 0 'draw))
;(glutDisplayFunc (callback 0 'drawObject))
(glutKeyboardFunc (callback 1 'keyboard))
(glutMouseFunc (callback 2 'mouse))
(glutMotionFunc (callback 3 'motion))
(glutIdleFunc (callback 4 'rotation))
(glutJoystickFunc (callback 5 'joystick) 50)
(glutMainLoop)
;; eof
;(glEnable GL_BLEND)
;(glEnable GL_LINE_SMOOTH) ; turn on antialiasing
;(glHint GL_LINE_SMOOTH_HINT GL_DONT_CARE)
;(glLineWidth 3)