(let ((current-craft (make-model-uri :pathname #P"crafts/crafts.lisp" :model-name "ray")) (draw-layers (list 1))) (make-vbox () (make-hbox (:column-widths '((:expand . 400) (:expand . 100))) (make-osd-viewport (:width 400 :height 300) (gl:with-projection-matrix ((glu:perspective *fov* (float 4/3) (float 1/16) 16.0)) (gl:with-push-attrib (gl:+depth-buffer-bit+) (gl:enable gl:+depth-test+) (gl:with-push-matrix (gl:load-identity) (gl:translate-f 0 0 -8) (gl:rotate-f 45 -1 0 0) (gl:rotate-f (* (glfw:get-time) 15) 0 0 1) (let ((*draw-layers* draw-layers)) (draw (get-model current-craft))))))) (let ((model-uris (remove-if #'(lambda (model-uri) (slot-boundp (get-model model-uri) 'matrix)) (load-model-file #P"crafts/crafts.lisp")))) (make-instance 'osd-container :row-heights (make-list (length model-uris) :initial-element '(:expand . 10)) :contents (mapcar #'(lambda (model-uri) (list (make-button () (model-uri-model-name model-uri) (setf current-craft model-uri)))) model-uris)))) (flet ((toggle-layer (osd-element layer) (let ((style (if (find layer draw-layers) (progn (setf draw-layers (delete layer draw-layers)) :button) (progn (push layer draw-layers) :depressed-button)))) (set-osd-element-style osd-element style)))) (macrolet ((layer-toggle (layer) `(let (button) (setf button (make-button (:style (if (find ,layer draw-layers) :depressed-button :button)) ,(format nil "~a" layer) (toggle-layer button ,layer)))))) (make-hbox () (make-label "Draw Layers") (layer-toggle 1) (layer-toggle 2)))))) ;; makes this: http://wvr.me.uk/picture/16116?width=808