(in-package #:trial) (define-pool workbench :base 'trial) (define-asset (workbench bullet) texture (#p"bullet.png")) (define-asset (workbench potato) texture (#p"potato.png")) (define-asset (workbench cat) texture (#p"cat.png")) (define-asset (workbench teapot) mesh (#p"teapot.vf") :mesh :teapot01mesh) (define-shader-subject teapot (vertex-subject textured-subject located-entity) () (:default-initargs :texture (asset 'workbench 'cat) :vertex-array (asset 'workbench 'teapot))) (define-shader-subject bullet (sprite-subject located-entity) ((vel :initarg :velocity :accessor vel)) (:default-initargs :texture (asset 'workbench 'bullet) :size (vec2 16 16))) (define-handler (bullet tick) (ev) (nv+ (location bullet) (vel bullet))) (define-shader-subject potato (animated-sprite-subject located-entity) ((vel :initform (vec 0 0 0) :accessor vel)) (:default-initargs :texture (asset 'workbench 'potato) :animations '((0.5 0 3) (1.0 0 3)) :animation 1)) (define-handler (potato tick) (ev) (let ((moving NIL)) (cond ((retained 'key :a) (setf moving T) (setf (vx (vel potato)) -1.2)) ((retained 'key :d) (setf moving T) (setf (vx (vel potato)) +1.2)) (T (setf (vx (vel potato)) 0))) (cond ((retained 'key :w) (setf moving T) (setf (vy (vel potato)) -1.2)) ((retained 'key :s) (setf moving T) (setf (vy (vel potato)) +1.2)) (T (setf (vy (vel potato)) 0))) (if moving (setf (animation potato) 0) (setf (animation potato) 1))) (nv+ (location potato) (vel potato))) (define-handler (potato mouse-press) (ev) (let* ((target (screen->vec (pos ev) (width *context*) (height *context*))) (direction (nvunit (v- target (location potato)))) (spread (deg->rad (- (random 5) 2.5))) (speed 3)) (nvrot direction +vz+ spread) (enter (load (make-instance 'bullet :location (vcopy (location potato)) :velocity (nv* direction speed))) *loop*))) (progn (defmethod setup-scene ((main main)) (let ((scene (scene main))) ;; (enter (make-instance 'potato) scene) ;; (enter (make-instance 'sidescroll-camera :location (vec 400 300 -10)) scene) (enter (make-instance 'teapot) scene) (enter (make-instance 'target-camera :location (vec 0 40 50)) scene))) (maybe-reload-scene)) (progn (defmethod setup-pipeline ((main main)) (let ((pipeline (pipeline main)) (pass1 (make-instance 'render-pass)) (pass2 (make-instance 'low-pass-filter :uniforms `(("threshold" 1.5)))) (pass3 (make-instance 'gaussian-blur-pass :uniforms `(("dir" ,(vec2 1 0)) ("intensity" 1.5)))) (pass4 (make-instance 'gaussian-blur-pass :uniforms `(("dir" ,(vec2 0 1)) ("intensity" 1.5)))) (pass5 (make-instance 'blend-pass))) (register pass1 pipeline) (connect (port pass1 'color) (port pass2 'previous-pass) pipeline) (connect (port pass2 'color) (port pass3 'previous-pass) pipeline) (connect (port pass3 'color) (port pass4 'previous-pass) pipeline) (connect (port pass1 'color) (port pass5 'a-pass) pipeline) (connect (port pass4 'color) (port pass5 'b-pass) pipeline))) (maybe-reload-scene))