started adding more proper physics (forces this time ooooh) and then
ripping flight-sim.lisp into more logically organized smaller files
This commit is contained in:
		
							parent
							
								
									d912f5e768
								
							
						
					
					
						commit
						eccefcefe8
					
				|  | @ -6,5 +6,9 @@ | |||
|                #:cl-glu | ||||
|                #:lispbuilder-sdl) | ||||
|   :components ((:file "package") | ||||
| 	       (:file "util") | ||||
| 	       (:file "math") | ||||
| 	       (:file "model") | ||||
| 	       (:file "phsyics") | ||||
|                (:file "flight-sim"))) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										122
									
								
								flight-sim.lisp
								
								
								
								
							
							
						
						
									
										122
									
								
								flight-sim.lisp
								
								
								
								
							|  | @ -4,81 +4,26 @@ | |||
| 
 | ||||
| ;;; "flight-sim" goes here. Hacks and glory await! | ||||
| 
 | ||||
| (defmacro restartable (&body body) | ||||
|   "Helper macro since we use continue restarts a lot  | ||||
|    (remember to hit C in slime or pick the restart so errors don't kill the app" | ||||
|   `(restart-case | ||||
|        (progn ,@body) | ||||
|      (continue () :report "Continue"))) | ||||
| 
 | ||||
| ;;; degrees to radians | ||||
| (defmacro dtr (d) | ||||
|   `(/ (* ,d pi) 180)) | ||||
| 
 | ||||
| ;;; radians to degress | ||||
| (defmacro rtd (r) | ||||
|   `(/ (* ,r 180) pi)) | ||||
| 
 | ||||
| (defun make-2d-array (h w contents) | ||||
|   (let ((arr (make-array h))) | ||||
|     (do ((i 0 (incf i)) | ||||
| 	 (rest-list contents (rest rest-list))) | ||||
| 	((eql i h))  | ||||
|       (setf (aref arr i) (make-array w :initial-contents (car rest-list)))) | ||||
|     arr)) | ||||
| 
 | ||||
| (deftype point-vector () '(simple-array float (*))) | ||||
| (deftype shape-vector () '(simple-array point-vector (*))) | ||||
| 
 | ||||
| (deftype pos-int () '(integer 0 *)) | ||||
| (deftype ref-vector () '(simple-array pos-int (*))) | ||||
| (deftype shape-ref-vector () '(simple-array ref-vector (*))) | ||||
| 
 | ||||
| (defclass model () | ||||
|   ((vertices :initarg :vertices :accessor vertices :initform (vector) :type shape-vector) | ||||
|    (faces :initarg :faces :accessor faces :initform (vector) :type shape-ref-vector ) | ||||
|    (colors :initarg :colors :reader colors :initform (vector) :type shape-vector) | ||||
|    (face-colors :initarg :face-colors :accessor face-colors :initform (vector) :type shape-ref-vector))) | ||||
| 
 | ||||
| (defmethod scale-colors ((model model)) | ||||
|   (let ((colors (colors model))) | ||||
|     (loop for i from 0 to (1- (length colors)) do  | ||||
| 	 (loop for j from 0 to 2 do | ||||
| 	      (setf (aref (aref colors i) j) (float (/ (aref (aref colors i) j) 255))))))) | ||||
| 
 | ||||
| (defmethod initialize-instance :after ((model model) &key) | ||||
|   (scale-colors model)) | ||||
| 
 | ||||
| (defgeneric (setf colors) (colors model)) | ||||
| 
 | ||||
| (defmethod (setf colors) (colors (model model)) | ||||
|   (setf (slot-value model 'colors) colors) | ||||
|   (scale-colors model)) | ||||
| 
 | ||||
| (defclass motion () | ||||
|   ((coords :initarg :coords :accessor coords :initform (vector 0 0 0)) | ||||
|    (velocity :initarg :velocity :accessor velocity :initform (vector 0 0 0)) | ||||
|    (acceleration :initarg :acceleration :accessor acceleration :initform (vector 0 0 0)) | ||||
|    (jerk :initarg :jerk :accessor jerk :initform (vector 0 0 0)))) | ||||
|     | ||||
| ;; time is time elapsed in seconds (with decimal for sub seconds) | ||||
| (defmethod motion-step ((motion motion) time) | ||||
|   ; x = x +v*t + 1/2 * a * t^2 | ||||
|   (dotimes (i 3) (progn | ||||
| 		   (incf (aref (coords motion) i)  | ||||
| 			 (+ (* (aref (velocity motion) i) time) (* .5 (aref (acceleration motion) i) (expt time 2)))) | ||||
| 		   (incf (aref (velocity motion) i) | ||||
| 			 (* time (aref (acceleration motion) i)))))) | ||||
| 
 | ||||
| 
 | ||||
| (defclass game-object () | ||||
|   ((model :initarg :model :accessor model :initform (make-instance 'model)) | ||||
|    (motion :initarg :motion :accessor motion :initform (make-instance 'motion)) | ||||
|    (angles :initarg :angles :accessor angles :initform (vector 0 0 0)))) | ||||
|    (bosy :initarg :body :accessor body :inotform (make-instance 'body)))) | ||||
| 
 | ||||
| 
 | ||||
| (defclass engine-object (game-object) | ||||
|   ((active :initarg :active :reader active :initform nil) | ||||
|    (start-time :initarg :start-time :reader start-time :initform nil))) | ||||
|    (start-time :initarg :start-time :reader start-time :initform nil) | ||||
|    (forces :initarg :forces :accessor forces :initform '()))) | ||||
| 
 | ||||
| (defgeneric activate-engine (object engine-sym)) | ||||
| 
 | ||||
| (defmethod activate-engine ((object powered-object) engine-sym) | ||||
|   (push :engine-sym (getf (engines object) :active)) | ||||
|   (engine-start (getf (getf (engines object) :engines) engine-sym) (wall-time))) | ||||
| 
 | ||||
| (defgeneric engine-start (engine time)) | ||||
| (defmethod engine-start ((engine engine-object) time) | ||||
|  | @ -102,19 +47,40 @@ | |||
| 					      ; z goes from 0 to 1 in 2 seconds | ||||
| 					      (0.0 0.0 ,(converge 0 1 2 time)))) | ||||
| 			     :point-colors (make-2d-array 4 3 `( | ||||
| 								(,(converge 96 255 2 time) ,(converge 0 255 2 time) 0) | ||||
| 								(,(converge 96 255 2 time) ,(converge 0 255 2 time) 0) | ||||
| 								(,(converge 96 255 2 time) ,(converge 0 255 2 time) 0) | ||||
| 								(,(converge 255 255 2 time) ,(converge 0 255 2 time) ,(converge 0 255 2 time)))))))) | ||||
| 								(,(converge 16 64 2 time) ,(converge 0 132 2 time) ,(converge 32 164 2 time)) | ||||
| 								(,(converge 16 64 2 time) ,(converge 0 132 2 time) ,(converge 32 164 2 time)) | ||||
| 								(,(converge 16 64 2 time) ,(converge 0 132 2 time) ,(converge 32 164 2 time)) | ||||
| 								(,(converge 0 255 2 time) ,(converge 0 255 2 time) ,(converge 64 255 2 time)))))))) | ||||
| 
 | ||||
| 
 | ||||
| (defclass powered-object (game-object) | ||||
|   ;; plist :: ( :objects (plist models) :active (list symbols)) | ||||
|   ((engine :initarg :engine :accessor engine :initform nil))) | ||||
|   ((engines :initarg :engines :accessor engines :initform '(:engines () :active ())))) | ||||
| ;  ((engine :initarg :engine :accessor engine :initform nil))) | ||||
| 
 | ||||
| 
 | ||||
|    ;(attachments :initarg :attachments :accessor attachments :initform nil))) | ||||
| 
 | ||||
| ;; time is time elapsed in seconds (with decimal for sub seconds) | ||||
| (defmethod time-step ((engine engine) object time) | ||||
|   ; f = ma | ||||
|   (let ((accel (/ (force engine) (mass object))))  | ||||
|   ; x = x +v*t + 1/2 * a * t^2 | ||||
|   (dotimes (i 3) (progn | ||||
| 		   (incf (aref (coords motion) i)  | ||||
| 			 (+ (* (aref (velocity motion) i) time) (* .5 (aref (acceleration motion) i) (expt time 2)))) | ||||
| 		   (incf (aref (velocity motion) i) | ||||
| 			 (* time (aref (acceleration motion) i)))))) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| (defmethod time-step ((object powered-object) time)   | ||||
|   (loop for engine in (loop for engine-sym in (getf (engines object) :active) collecting (getf (engines engines) engine-sym)) do | ||||
|        (time-step engine object time)))	  | ||||
|  ; (motion-step (motion *self*) time)) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| (defparameter *diamond-model*  | ||||
|   (make-instance 'model | ||||
|  | @ -328,7 +294,8 @@ | |||
|    (sdl:update-display)) | ||||
| 
 | ||||
| (defun phys-step (time) | ||||
|   (motion-step (motion *self*) time)) | ||||
|   (time-step *self* time)) | ||||
| 
 | ||||
| ;  (format t "z-position: ~a z-velocity: ~a z-acceleration: ~a~%" (aref (coords *self*) 2) (aref (velocity *self*) 2) (aref (acceleration *self*) 2)) | ||||
| ;  (format t "y-position: ~a y-velocity: ~a y-acceleration: ~a~%" (aref (coords *self*) 1) (aref (velocity *self*) 1) (aref (acceleration *self*) 1)) | ||||
| ;  (format t "x-position: ~a x-velocity: ~a x-acceleration: ~a~%" (aref (coords *self*) 0) (aref (velocity *self*) 0) (aref (acceleration *self*) 0))) | ||||
|  | @ -345,8 +312,9 @@ | |||
|   (case key  | ||||
|     ((:sdl-key-w) ; + z | ||||
|      (progn | ||||
|        (setf (aref (acceleration (motion *self*)) 2) (- *acceleration*)) | ||||
|        (engine-start (engine *self*) (wall-time)))) | ||||
|        ;(setf (aref (acceleration (motion *self*)) 2) (- *acceleration*)) | ||||
|        ;(engine-start (engine *self*) (wall-time)))) | ||||
|        (activate-engine *self* :thrust)))  | ||||
|       | ||||
|     ((:sdl-key-s) ; - z | ||||
|      (setf (aref (acceleration (motion *self*)) 2) *acceleration*)) | ||||
|  | @ -456,9 +424,11 @@ | |||
|   (setf *self* (make-instance 'powered-object  | ||||
| 			      :motion (make-instance 'motion :coords (vector 0 0 11)) | ||||
| 			      :model *ship-model* | ||||
| 			      :engine (make-instance 'engine-object  | ||||
| 						     :motion (make-instance 'motion :coords (vector 0 0.5 3.0))) | ||||
| 					     )) | ||||
| 			      :engines (list :engines (list :thrust  | ||||
| 						       (make-instance 'engine-object  | ||||
| 								      :motion (make-instance 'motion :coords (vector 0 0.5 3.0)) | ||||
| 								      :forces (list (make-instance 'force :newtons 10 :direction '(0 0 1)))))))) | ||||
| 					      | ||||
|   (populate-world) | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,19 @@ | |||
| (in-package #:flight-sim) | ||||
| 
 | ||||
| ;;; degrees to radians | ||||
| (defmacro dtr (d) | ||||
|   `(/ (* ,d pi) 180)) | ||||
| 
 | ||||
| ;;; radians to degress | ||||
| (defmacro rtd (r) | ||||
|   `(/ (* ,r 180) pi)) | ||||
| 
 | ||||
| (deftype point-vector () '(simple-array float (*))) | ||||
| (deftype shape-vector () '(simple-array point-vector (*))) | ||||
| 
 | ||||
| (deftype pos-int () '(integer 0 *)) | ||||
| (deftype ref-vector () '(simple-array pos-int (*))) | ||||
| (deftype shape-ref-vector () '(simple-array ref-vector (*))) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | @ -0,0 +1,22 @@ | |||
| (in-package #:flight-sim) | ||||
| 
 | ||||
| (defclass model () | ||||
|   ((vertices :initarg :vertices :accessor vertices :initform (vector) :type shape-vector) | ||||
|    (faces :initarg :faces :accessor faces :initform (vector) :type shape-ref-vector ) | ||||
|    (colors :initarg :colors :reader colors :initform (vector) :type shape-vector) | ||||
|    (face-colors :initarg :face-colors :accessor face-colors :initform (vector) :type shape-ref-vector))) | ||||
| 
 | ||||
| (defmethod scale-colors ((model model)) | ||||
|   (let ((colors (colors model))) | ||||
|     (loop for i from 0 to (1- (length colors)) do  | ||||
| 	 (loop for j from 0 to 2 do | ||||
| 	      (setf (aref (aref colors i) j) (float (/ (aref (aref colors i) j) 255))))))) | ||||
| 
 | ||||
| (defmethod initialize-instance :after ((model model) &key) | ||||
|   (scale-colors model)) | ||||
| 
 | ||||
| (defgeneric (setf colors) (colors model)) | ||||
| 
 | ||||
| (defmethod (setf colors) (colors (model model)) | ||||
|   (setf (slot-value model 'colors) colors) | ||||
|   (scale-colors model)) | ||||
|  | @ -0,0 +1,18 @@ | |||
| (in-package #:flight-sim) | ||||
| 
 | ||||
| (defclass motion () | ||||
|   ((velocity :initarg :velocity :accessor velocity :initform (vector 0 0 0)) | ||||
|    (acceleration :initarg :acceleration :accessor acceleration :initform (vector 0 0 0)) | ||||
|    (jerk :initarg :jerk :accessor jerk :initform (vector 0 0 0)))) | ||||
| 
 | ||||
| 
 | ||||
| (defclass body () | ||||
|   ((motion :initarg :motion :accessor motion :initform (make-instance 'motion)) | ||||
|    (coords :initarg :coords :accessor coords :initform (vector 0 0 0)) | ||||
|    (mass :initarg :mass :accessor mass :initform 0.0) | ||||
|    (angles :initarg :angles :accessor angles :initform (vector 0 0 0)))) | ||||
| 
 | ||||
| 
 | ||||
| (defclass force () | ||||
|   ((newtons :initarg :newtons :accessor newtons :initform 0) | ||||
|    (direction :initarg :direction :accessor direction :initform (vector)))) | ||||
|  | @ -0,0 +1,16 @@ | |||
| (in-package #:flight-sim) | ||||
| 
 | ||||
| (defmacro restartable (&body body) | ||||
|   "Helper macro since we use continue restarts a lot  | ||||
|    (remember to hit C in slime or pick the restart so errors don't kill the app" | ||||
|   `(restart-case | ||||
|        (progn ,@body) | ||||
|      (continue () :report "Continue"))) | ||||
| 
 | ||||
| (defun make-2d-array (h w contents) | ||||
|   (let ((arr (make-array h))) | ||||
|     (do ((i 0 (incf i)) | ||||
| 	 (rest-list contents (rest rest-list))) | ||||
| 	((eql i h))  | ||||
|       (setf (aref arr i) (make-array w :initial-contents (car rest-list)))) | ||||
|     arr)) | ||||
		Loading…
	
		Reference in New Issue