started work on accelerator class. added circle accel. readded velocity mod coord code to phys-step, made objects orbint in slowly greater eccentric circles only on zx plane :/.....
This commit is contained in:
		
							parent
							
								
									1dd2eae816
								
							
						
					
					
						commit
						e4765f3682
					
				| 
						 | 
				
			
			@ -27,13 +27,39 @@
 | 
			
		|||
      (setf (aref arr i) (make-array w :initial-contents (car rest-list))))
 | 
			
		||||
    arr))
 | 
			
		||||
 | 
			
		||||
(defclass accelerator () nil)
 | 
			
		||||
 | 
			
		||||
(defclass circle-accel (accelerator)
 | 
			
		||||
  ((origin :initarg :origin :accessor origin :initform (vector 0 0 0))))
 | 
			
		||||
 | 
			
		||||
(defgeneric accel (accelerator motion time)
 | 
			
		||||
  (:documentation "apply some modifications to a motion class based on some rules"))
 | 
			
		||||
 | 
			
		||||
(defmethod accel ((accelerator accelerator) entity time)
 | 
			
		||||
  nil)
 | 
			
		||||
 | 
			
		||||
(defmethod accel ((accelerator circle-accel) entity time)
 | 
			
		||||
  (format t "(circle-accel::accel)~%")
 | 
			
		||||
  (let* ((o-vector (vector 
 | 
			
		||||
		    (- (aref (origin accelerator) 0) (aref (coords entity) 0))
 | 
			
		||||
		    (- (aref (origin accelerator) 1) (aref (coords entity) 1))
 | 
			
		||||
		    (- (aref (origin accelerator) 2) (aref (coords entity) 2))))
 | 
			
		||||
	 (t-vector (rotate* (make-rotation-matrix (/ pi 2) (/ pi 2) (/ pi 2)) o-vector)))
 | 
			
		||||
    (setf (velocities (motion entity)) t-vector)))
 | 
			
		||||
;    (setf (aref (velocities (motion entity) 0) (* time (aref t-vector 0)))
 | 
			
		||||
;    (setf (aref (velocities (motion entity)) 0) (* time (aref t-vector 0)))
 | 
			
		||||
;    (setf (aref (velocities (motion entity)) 0) (* time (aref t-vector 0)))))
 | 
			
		||||
	 
 | 
			
		||||
 | 
			
		||||
(defclass model ()
 | 
			
		||||
  ((vertices :initarg :vertices :accessor vertices :initform (vector))
 | 
			
		||||
   (faces :initarg :faces :accessor faces :initform (vector))))
 | 
			
		||||
 | 
			
		||||
(defclass motion ()
 | 
			
		||||
  ((velocities :initarg :velocities :accessor velocities :initform (vector 0 0 0))
 | 
			
		||||
   (angles :initarg :angles :accessor angles :initform (vector 0 0 0))))
 | 
			
		||||
   (angles :initarg :angles :accessor angles :initform (vector 0 0 0))
 | 
			
		||||
   (accelerator :initarg :accelerator :accessor accelerator :initform (make-instance 'accelerator))
 | 
			
		||||
   ))
 | 
			
		||||
   
 | 
			
		||||
 | 
			
		||||
(defclass game-object ()
 | 
			
		||||
| 
						 | 
				
			
			@ -153,6 +179,7 @@
 | 
			
		|||
;
 | 
			
		||||
 | 
			
		||||
(defun draw-triangle (tri time) 
 | 
			
		||||
  (let ((time (- (wall-time) *start-time*)))
 | 
			
		||||
  (gl:with-primitive :triangles
 | 
			
		||||
    (multiple-value-bind (red green blue) (shift-color time)
 | 
			
		||||
      (gl:color red green blue))
 | 
			
		||||
| 
						 | 
				
			
			@ -167,7 +194,7 @@
 | 
			
		|||
    (multiple-value-bind (blue green red) (shift-color time)
 | 
			
		||||
      (gl:color red green blue))
 | 
			
		||||
    (let ((v (aref tri 2)))
 | 
			
		||||
      (gl:vertex (aref v 0) (aref v 1) (aref v 2)))))
 | 
			
		||||
      (gl:vertex (aref v 0) (aref v 1) (aref v 2))))))
 | 
			
		||||
 | 
			
		||||
(defun draw (time)
 | 
			
		||||
  ;; clear the buffer
 | 
			
		||||
| 
						 | 
				
			
			@ -203,6 +230,12 @@
 | 
			
		|||
 | 
			
		||||
(defun phys-step (time)
 | 
			
		||||
  (loop for entity across *world* do
 | 
			
		||||
       (accel (accelerator (motion entity)) entity time)
 | 
			
		||||
       (let ((velocities (velocities (motion entity)))
 | 
			
		||||
	     (coords (coords entity)))
 | 
			
		||||
	 (incf (aref coords 0) (* time (aref velocities 0)))
 | 
			
		||||
	 (incf (aref coords 1) (* time (aref velocities 1)))
 | 
			
		||||
	 (incf (aref coords 2) (* time (aref velocities 2))))
 | 
			
		||||
       (let ((v-angles (angles (motion entity)))
 | 
			
		||||
	     (angles (angles entity)))
 | 
			
		||||
	 (incf (aref angles 0) (* time (aref v-angles 0)))
 | 
			
		||||
| 
						 | 
				
			
			@ -276,7 +309,8 @@
 | 
			
		|||
							       :angles (vector 
 | 
			
		||||
									(- (random 620) 310)
 | 
			
		||||
									(- (random 620) 310) 
 | 
			
		||||
									(- (random 620) 310))))))))
 | 
			
		||||
									(- (random 620) 310))
 | 
			
		||||
							       :accelerator (make-instance 'circle-accel :origin (vector 0 0 0))))))))
 | 
			
		||||
									
 | 
			
		||||
		     
 | 
			
		||||
			    
 | 
			
		||||
| 
						 | 
				
			
			@ -293,7 +327,7 @@
 | 
			
		|||
(defun main-loop () 
 | 
			
		||||
  (init)
 | 
			
		||||
  (sdl:with-init ()
 | 
			
		||||
    (sdl:window 320 240 :flags sdl:sdl-opengl)
 | 
			
		||||
    (sdl:window 640 480 :flags sdl:sdl-opengl)
 | 
			
		||||
    ;; cl-opengl needs platform specific support to be able to load GL
 | 
			
		||||
    ;; extensions, so we need to tell it how to do so in lispbuilder-sdl
 | 
			
		||||
    (reshape)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue