basic engine drawing and functions
This commit is contained in:
parent
9992dff618
commit
d912f5e768
|
@ -74,10 +74,45 @@
|
|||
(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))
|
||||
(engine :initarg :engine :accessor engine :initform (make-instance 'game-object))))
|
||||
(angles :initarg :angles :accessor angles :initform (vector 0 0 0))))
|
||||
|
||||
(defclass engine-object (game-object)
|
||||
((active :initarg :active :reader active :initform nil)
|
||||
(start-time :initarg :start-time :reader start-time :initform nil)))
|
||||
|
||||
(defgeneric engine-start (engine time))
|
||||
(defmethod engine-start ((engine engine-object) time)
|
||||
(setf (slot-value engine 'active) t)
|
||||
(setf (slot-value engine 'start-time) time))
|
||||
|
||||
(defgeneric engine-stop (engine))
|
||||
(defmethod engine-stop ((engine engine-object))
|
||||
(setf (slot-value engine 'active) nil))
|
||||
|
||||
;; function to determine value lying on start to end taking time duration at now
|
||||
(defun converge (start end duration now)
|
||||
(float (+ start (* (- end start) (if (eql now 0.0) 0.0 (/ (min now duration) duration))))))
|
||||
|
||||
; take 2 seconds to fully fire
|
||||
(defmethod engine-genmodel ((engine engine-object))
|
||||
(let ((time (- (wall-time) (start-time engine))))
|
||||
(setf (model engine)
|
||||
(make-model-3pyramid (make-2d-array 4 3
|
||||
`((0.0 0.5 0.0) (-2.0 -0.5 0.0) (2.0 -0.5 0.0)
|
||||
; 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))))))))
|
||||
|
||||
|
||||
(defclass powered-object (game-object)
|
||||
;; plist :: ( :objects (plist models) :active (list symbols))
|
||||
((engine :initarg :engine :accessor engine :initform nil)))
|
||||
|
||||
|
||||
;; plist :: ( :objects (plist models) :active (list symbols))
|
||||
;(attachments :initarg :attachments :accessor attachments :initform nil)))
|
||||
|
||||
|
||||
|
@ -102,8 +137,8 @@
|
|||
:face-colors (make-2d-array 4 3 '((196 196 196) (196 196 196) (196 196 196) (32 32 32)))))
|
||||
|
||||
|
||||
(defclass engine ()
|
||||
(
|
||||
;(defclass engine ()
|
||||
; (
|
||||
|
||||
; (make-instance 'model
|
||||
; :vertices (make-2d-array 4 3 '((0 0 0) (0 1 3) (-2 0 3) (2 0 3)))
|
||||
|
@ -231,29 +266,46 @@
|
|||
(gl:vertex (aref v 0) (aref v 1) (aref v 2)))))
|
||||
|
||||
(defun draw-entity (entity)
|
||||
(gl:push-matrix)
|
||||
(gl:translate (aref (coords (motion entity)) 0) (aref (coords (motion entity)) 1) (aref (coords (motion entity)) 2))
|
||||
(gl:rotate (aref (angles entity) 0) 1 0 0)
|
||||
(gl:rotate (aref (angles entity) 1) 0 1 0)
|
||||
(gl:rotate (aref (angles entity) 2) 0 0 1)
|
||||
(loop for i from 0 to (1- (length (faces (model entity)))) do
|
||||
(draw-triangle (get-vertecies (aref (faces (model entity)) i) (vertices (model entity)))
|
||||
(get-vertecies (aref (face-colors (model entity)) i) (colors (model entity)))))
|
||||
(get-vertecies (aref (face-colors (model entity)) i) (colors (model entity))))))
|
||||
|
||||
(defgeneric object-draw (object))
|
||||
|
||||
(defmethod object-draw :before ((object game-object))
|
||||
(gl:push-matrix))
|
||||
|
||||
(defmethod object-draw :after ((object game-object))
|
||||
(gl:pop-matrix))
|
||||
|
||||
(defmethod object-draw ((object game-object))
|
||||
(draw-entity object))
|
||||
|
||||
(defmethod object-draw ((object powered-object))
|
||||
(draw-entity object)
|
||||
(if (eql (active (engine object)) t)
|
||||
(progn
|
||||
(setf (model (engine object)) (engine-genmodel (engine object)))
|
||||
(gl:translate 0 0 0)
|
||||
(object-draw (engine object)))))
|
||||
|
||||
|
||||
(defun draw ()
|
||||
;; clear the buffer
|
||||
(gl:clear :color-buffer-bit :depth-buffer-bit)
|
||||
;; move to eye position
|
||||
(draw-entity (make-instance 'game-object :motion (make-instance 'motion :coords (vector 0 0 -3)) :model *ship-model*))
|
||||
(object-draw (make-instance 'powered-object :motion (make-instance 'motion :coords (vector 0 0 -3)) :model *ship-model* :engine (engine *self*)))
|
||||
|
||||
(gl:translate (- (aref (coords (motion *self*)) 0)) (- (aref (coords (motion *self*)) 1)) (- (aref (coords (motion *self*)) 2))) ;; eye
|
||||
|
||||
(loop for entity across *world* do
|
||||
; only draw if its infront of me
|
||||
(if (< (aref (coords (motion entity)) 2) (+ 10 (aref (coords (motion *self*)) 2)))
|
||||
(draw-entity entity)))
|
||||
(object-draw entity)))
|
||||
|
||||
|
||||
|
||||
|
@ -292,7 +344,10 @@
|
|||
(defun thruster-on (key)
|
||||
(case key
|
||||
((:sdl-key-w) ; + z
|
||||
(setf (aref (acceleration (motion *self*)) 2) (- *acceleration*)))
|
||||
(progn
|
||||
(setf (aref (acceleration (motion *self*)) 2) (- *acceleration*))
|
||||
(engine-start (engine *self*) (wall-time))))
|
||||
|
||||
((:sdl-key-s) ; - z
|
||||
(setf (aref (acceleration (motion *self*)) 2) *acceleration*))
|
||||
((:sdl-key-q) ; + x
|
||||
|
@ -308,7 +363,10 @@
|
|||
(defun thruster-off (key)
|
||||
(case key
|
||||
((:sdl-key-w) ; + z
|
||||
(setf (aref (acceleration (motion *self*)) 2) 0))
|
||||
(progn
|
||||
(setf (aref (acceleration (motion *self*)) 2) 0)
|
||||
(engine-stop (engine *self*))))
|
||||
|
||||
((:sdl-key-s) ; - z
|
||||
(setf (aref (acceleration (motion *self*)) 2) 0))
|
||||
((:sdl-key-q) ; + q
|
||||
|
@ -395,14 +453,12 @@
|
|||
(setf *num-frames* 0)
|
||||
(setf *last-time* *start-time*)
|
||||
(setf *controls-active* '())
|
||||
(setf *self* (make-instance 'game-object
|
||||
(setf *self* (make-instance 'powered-object
|
||||
:motion (make-instance 'motion :coords (vector 0 0 11))
|
||||
:model *ship-model*
|
||||
; :engine
|
||||
; (make-instance 'game-object :motion (make-instance 'motion :coords (vector 0.0 0.5 0.3))
|
||||
; :model (make-model-3pyramid (make-2d-array 4 3 ''(
|
||||
:engine (make-instance 'engine-object
|
||||
:motion (make-instance 'motion :coords (vector 0 0.5 3.0)))
|
||||
))
|
||||
; (reshape)
|
||||
(populate-world)
|
||||
)
|
||||
|
||||
|
|
Loading…
Reference in New Issue