[corman-sdl-cvs] CVS update: corman-sdl/examples/rotating-cube_3.lisp

Luke J Crook lcrook at common-lisp.net
Sat Apr 17 00:02:09 UTC 2004


Update of /project/corman-sdl/cvsroot/corman-sdl/examples
In directory common-lisp.net:/tmp/cvs-serv21416/examples

Modified Files:
	rotating-cube_3.lisp 
Log Message:

Date: Fri Apr 16 20:02:09 2004
Author: lcrook

Index: corman-sdl/examples/rotating-cube_3.lisp
diff -u corman-sdl/examples/rotating-cube_3.lisp:1.2 corman-sdl/examples/rotating-cube_3.lisp:1.3
--- corman-sdl/examples/rotating-cube_3.lisp:1.2	Wed Apr 14 18:08:54 2004
+++ corman-sdl/examples/rotating-cube_3.lisp	Fri Apr 16 20:02:09 2004
@@ -1,18 +1,17 @@
 ;;; A rotating cube example.
-;;; Taken from the SDL example http://sdldoc.csn.ul.ie/guidevideoopengl.php
+;;; Taken from the SDL example at http://sdldoc.csn.ul.ie/guidevideoopengl.php
 ;;; Author: Luke J Crook, luke at balooga.com
 ;;;
 ;;; Operation:
-;;; - Click any mouse button to pause/restart rotation. 
+;;; - Press any key (except Escape) to pause/restart rotation.
+;;; - Press Escape to exit.
+;;; - Left-click and use the mouse to rotate the cube around the x/y axises.
 ;;; 
 ;;; Issues:
 ;;; - Rotation is not scaled to time but is based on frame-rate. Therefore the rotation is crazy-fast on decent
 ;;;   hardware.
-;;; - Tends to crash the CCL IDE after being run a few times, so SAVE YOUR WORK. Author is not responsible for
-;;    any damage to hardware, loss of data, weight gain, hair loss etc. Use at your own risk.
 ;;
-;; 26 Feb, 2004
-;; Version 0.2
+;; 16 Feb, 2004
 
 (require :mp)
 (require 'sdl)
@@ -26,6 +25,9 @@
 
 (defparameter *angle* 0)
 (defparameter *rotate* t)
+(defparameter *rotatex* 0.0)
+(defparameter *rotatey* 0.0)
+(defparameter *rotatez* 0.0)
 
 ; Many thanks, Chris Double
 (defmacro with-glBegin (type &body body)
@@ -57,6 +59,28 @@
     (gethash id (get-palette-table)))
 
 
+(defun create-palette ()
+    (let ((palette '(
+                    (red 255 0 0 255)
+                    (green 0 255 0 255)
+                    (blue 0 0 255 255)
+                    (white 255 255 255 255)
+                    (yellow 0 255 255 255)
+                    (black 0 0 0 255)
+                    (orange 255 255 0 255)
+                    (purple 255 0 255 0))))
+        
+        (mapcar #'(lambda (color)
+                (let (
+                        (color-array (ct:malloc (ct:sizeof 'colour-arrayu)))
+                        (col (first color))
+                        (rgb (rest color)))
+                    
+                    (add-color col color-array)
+                    (sdl:for i 0 3
+                        (setf (ct:cref colour-arrayu color-array i) (nth i rgb)))))
+            palette)))
+
 (defun create-object ()
     (let ((cube '(
                     (-1.0 -1.0 1.0)
@@ -71,10 +95,6 @@
             (colors nil)
             (polys nil))
     
-        ;v0[0] = -1.0f;
-        ;v0[1] = -1.0f;
-        ;v0[2] = 1.0f;
-        
         ;;Create the vertices
         (setf vertices 
             (mapcar #'(lambda (vertex)
@@ -83,9 +103,9 @@
                         (setf (ct:cref vertex-arrayf v-array i) (nth i vertex)))
                     v-array))
             cube))
-        
-        
-        ;;Assign a color to each vertex
+                
+        ;;Assign a color to each vertex. Assignment is based on position in the list, 
+        ;;so the first color in the colors list is assigned to the first vertex in the vertices list.
         (setf colors (list 
                 (get-color 'red)
                 (get-color 'green)
@@ -111,33 +131,12 @@
                 (1 0 4)
                 (1 4 5)))
         
+        ;Return an 'object' with the vertices, color assignment and list of polygons
         `(
             (vertices ,vertices)
             (colors ,colors)
             (polys ,polys))))
 
-(defun create-palette ()
-    (let ((palette '(
-                    (red 255 0 0 255)
-                    (green 0 255 0 255)
-                    (blue 0 0 255 255)
-                    (white 255 255 255 255)
-                    (yellow 0 255 255 255)
-                    (black 0 0 0 255)
-                    (orange 255 255 0 255)
-                    (purple 255 0 255 0))))
-        
-        (mapcar #'(lambda (color)
-                (let (
-                        (color-array (ct:malloc (ct:sizeof 'colour-arrayu)))
-                        (col (first color))
-                        (rgb (rest color)))
-                    
-                    (add-color col color-array)
-                    (sdl:for i 0 3
-                        (setf (ct:cref colour-arrayu color-array i) (nth i rgb)))))
-            palette)))
-
 (defun assoc-data (key assoc-list)
     (first (rest (assoc key assoc-list))))
 
@@ -150,8 +149,10 @@
     (glLoadIdentity)
     
     (glTranslatef 0.0 0.0 -5.0)
-    (glRotatef (coerce *angle* 'single-float) 0.0 1.0 0.0)
-        
+    (glRotatef (+ (coerce *angle* 'single-float) (coerce *rotatex* 'single-float)) 0.0 1.0 0.0)
+    (glRotatef (coerce *rotatey* 'single-float) 1.0 0.0 0.0)    
+    (glRotatef (coerce *rotatez* 'single-float) 0.0 0.0 1.0)
+           
     (if (> *angle* 360.0)
         (setf *angle* 0.0))
     
@@ -211,6 +212,11 @@
                         (sdl:push-quitevent))
                     (when (sdl:is-key keysym sdl:SDLK_SPACE)
                         (setf *rotate* (not *rotate*))))
+                (:mousemotion (state x y xrel yrel)
+                    (cond
+                        ((eql state 1)
+                            (setf *rotatex* (+ *rotatex* xrel))
+                            (setf *rotatey* (+ *rotatey* yrel )))))
                 (:idle
                     (draw-screen cube))))
         





More information about the Corman-sdl-cvs mailing list