From 322558548e2fd2d1d4574acfa058de40f1c1aab2 Mon Sep 17 00:00:00 2001 From: mk Date: Sun, 29 Aug 2010 22:36:02 +0100 Subject: [PATCH] dispatching opengl settings via closure is powerful. i implemented view center setting in gui. i think i will move zooming there as well --- frontend/draw-model.lisp | 4 +-- gui/gui.lisp | 64 +++++++++++++++++++++++++++++++----------------- gui/packages.lisp | 3 ++- run.lisp | 8 ++++++ 4 files changed, 53 insertions(+), 26 deletions(-) diff --git a/frontend/draw-model.lisp b/frontend/draw-model.lisp index c153d7b..94c9b46 100644 --- a/frontend/draw-model.lisp +++ b/frontend/draw-model.lisp @@ -98,8 +98,8 @@ (1+ (sin (* 2 pi (/ rot 360))))) 3.3))) 0 0 1) - (gl:translate 0 0 (- nf)) - (let ((s (if (cdr scale) + #+nil(gl:translate 0 0 (- nf)) + #+nil(let ((s (if (cdr scale) (pop scale) (car scale)))) (gl:scale s s s)) diff --git a/gui/gui.lisp b/gui/gui.lisp index 7e43fa5..57fb290 100644 --- a/gui/gui.lisp +++ b/gui/gui.lisp @@ -13,20 +13,47 @@ (color 0 0 1) (vertex 0 0 0) (vertex 0 0 1))) :type function))) -(defmethod set-view ((w fenster) &optional (2d nil)) - (load-identity) - (viewport 0 0 (width w) (height w)) - (matrix-mode :projection) - (load-identity) - (if 2d - (ortho 0 (width w) (height w) 0 -1 1) - (progn - (glu:perspective 30 (/ (width w) (height w)) .01 100) - (glu:look-at 20 30 10 - 0 0 0 - 0 0 1))) - (matrix-mode :modelview) - (load-identity)) +(let ((view-center (list (v)))) + (defun set-view-center (vec-list) + "This function can be called from outside an OpenGL context. The +supplied list will be used to set the viewpoint with glLookAt. It is +consumed from the front." + (declare (cons vec-list)) + (assert (equal (type-of (car vec-list)) + (type-of (v)))) + (setf view-center vec-list)) + + (defmethod set-view ((w fenster) &optional (2d nil) (view-center (v))) + (load-identity) + (viewport 0 0 (width w) (height w)) + (matrix-mode :projection) + (load-identity) + (if 2d + (ortho 0 (width w) (height w) 0 -1 1) + (let ((x (vec-x view-center)) + (y (vec-y view-center)) + (z (vec-z view-center))) + (glu:perspective 30 (/ (width w) (height w)) .01 100) + (glu:look-at 20 30 10 + x y z + 0 0 1))) + (matrix-mode :modelview) + (load-identity)) + + (defmethod ensure-uptodate-view-center ((w fenster)) + (if (cdr view-center) + (set-vew w nil (pop view-center)) + (set-view w nil (car view-center)))) + (defmethod display ((w fenster)) + (ensure-uptodate-view-center w) + (clear :color-buffer-bit :depth-buffer-bit) + (load-identity) + + (funcall (draw-func w)) + + (swap-buffers) + (sleep (/ 20)) + (post-redisplay))) (defmethod reshape ((w fenster) x y) (setf (width w) x @@ -36,15 +63,6 @@ (defmethod display-window :before ((w fenster)) (set-view w)) -(defmethod display ((w fenster)) - (clear :color-buffer-bit :depth-buffer-bit) - (load-identity) - - (funcall (draw-func w)) - - (swap-buffers) - (sleep (/ 20)) - (post-redisplay)) (defmethod passive-motion ((w fenster) x y) (setf (aref (cursor-position w) 0) x diff --git a/gui/packages.lisp b/gui/packages.lisp index 1704807..bb54e22 100644 --- a/gui/packages.lisp +++ b/gui/packages.lisp @@ -13,4 +13,5 @@ #:bind-tex #:draw-axes #:draw-xz - #:draw-wire-box)) + #:draw-wire-box + #:set-view-center)) diff --git a/run.lisp b/run.lisp index 84e9fbb..53eb1bf 100644 --- a/run.lisp +++ b/run.lisp @@ -61,6 +61,14 @@ (update-scale 1 40) +#+nil +(let* ((obj (lens:make-objective)) + (n (lens::immersion-index obj)) + (f (lens::focal-length obj))) + (gui:set-view-center (list + (v+ (first (centers-mm *model*)) + (make-vec 0d0 0d0 (* n f)))))) + #+nil (with-gui (draw-all)) -- 2.11.4.GIT