From fb87c204b8943fb6bb9f8f4af407d82ff5b62613 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Mon, 4 Jul 2011 07:55:29 -0700 Subject: [PATCH] -reimplemented most of lists as arrays or arrays of arrays -wrote basic matrix* and rotation matrix generation function -almost got math right --- 3bb-1.lisp | 52 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/3bb-1.lisp b/3bb-1.lisp index 5e66300..14da5d9 100644 --- a/3bb-1.lisp +++ b/3bb-1.lisp @@ -24,8 +24,8 @@ ;;(defparameter *t1* '( (-0.5 -0.5 0) (0 0.5 0) (0.5 -0.5 0))) -(defun get-vertecies (face) - (loop for f in (elt *faces* face) collecting (elt *v* f))) +(defun get-vertecies (faces) + (loop for i from 0 to (1- (length faces)) collecting (aref *v* (aref faces i)))) (let ((time-units (/ 1.0 internal-time-units-per-second))) (defun wall-time (&key (offset 0)) @@ -43,6 +43,26 @@ (/ (+ (* (sin (+ (* 0.3 time) (* 4/3 PI))) 127) 128) 255))) +(defun make-rotation-matrix (xa ya za) + (let ((sxa (sin xa)) + (cxa (cos xa)) + (sya (sin ya)) + (cya (cos ya)) + (sza (sin za)) + (cza (cos za))) + (make-array '(3 3) :initial-contents (list (list (* cya cza) (+ (- (* cxa sza)) (* sxa sya cza)) (+ (* sxa sza) (* cxa sya cza))) + (list (* cya sza) (+ (* cxa cza) (* sxa sya sza)) (+ (- (* sxa cza)) (* cxa sya sza))) + (list (- sya) (* sxa cya) (* cxa cya)))))) + +(defun rotate* (m v) + (let ((result (make-array 3 :initial-element 0))) + (dotimes (x 3) + (let ((cell (aref v x))) + (dotimes (y 3) + (incf (aref result x) (* cell (aref m x y)))))) + result)) + + (defun rotate-vertex-2d (v rM) v) ;; (let ((result (lm:* rM (lm:vector (first v) (second v))))) @@ -56,30 +76,30 @@ ; (list (+ (first v) (/ (sin time) 2)) (+ (second v) (/ (cos time) 2)) (third v))) (defun rotate-triangle (tri time) - (let* ((angle (/ time 1000)) - (cos-a (cos angle)) - (sin-a (sin angle)) - (rM (lm:make-matrix 2 2 :initial-elements - '(cos-a sin-a - (- sin-a) cos-a)))) - (list (append (rotate-vertex-2d (first tri) rM) '((third (firt tri)))) - (append (rotate-vertex-2d (second tri) rM) '((third (second tri)))) - (append (rotate-vertex-2d (third tri) rM) (third (third tri)))))) - + (list + (rotate* (make-rotation-matrix 0 0 time) (first tri)) + (rotate* (make-rotation-matrix 0 0 time) (second tri)) + (rotate* (make-rotation-matrix 0 0 time) (third tri)))) +; (let* ((angle (/ time 1000)) +; (cos-a (cos angle)) +; (sin-a (sin angle)) +; (rM nil)) ;lm:make-matrix 2 2 :initial-elements +; ; '(cos-a sin-a +; ; (- sin-a) cos-a)))) + ; (list (append (rotate-vertex-2d (first tri) rM) '((third (firt tri)))) +; (append (rotate-vertex-2d (second tri) rM) '((third (second tri)))) +; (append (rotate-vertex-2d (third tri) rM) (third (third tri)))))) +; (defun draw () "draw a frame" - (format t "draw~%") (let* ((time (- (wall-time) *start-time*)) (t1 (rotate-triangle (get-vertecies (aref *faces* 0)) time))) - (format t "after let~%") (gl:clear :color-buffer-bit) ;;; draw a triangle (gl:with-primitive :triangles - (format t "color1~%") (multiple-value-bind (red green blue) (shift-color time) (gl:color red green blue)) - (format t "vertex1~%") (let ((v (first t1))) (gl:vertex (aref v 0) (aref v 1) (aref v 2)))