next up previous
Next: 4.2 アニメーションの例 demo7.l Up: 4 物体操作の記述 Previous: 4 物体操作の記述

4.1 eus/lib/llib/animation.l

アニメーション表示のためのクラスが animation.lにある.

;;;;
;;;; animation.l
;;;;        make continuous motion pictures (on xwindow)
;;;;        1989/Apr/7
;;;;        Copyright (c) 1989, Toshihiro MATSUI, ETL
;;;;

;; draw pictures in a list of pixmaps successively

(defvar *animation-count* 0)

(provide :animation)

;; pixmap-animation repeats evaluating
;; user-provided drawing forms.
;; When each drawing finishes,
;; the content of current viewsurface
;; is copied to a newly created pixmap.
;; pixmap-animation returns
;; a list of pixmaps which can be played
;; back by playback-pixmaps.
;; When the X server's memory is tight,
;; creation of a new pixmap
;; may fail, which will lead the euslisp to die.

(defmacro pixmap-animation (count &rest forms)
   (let* ((w (send *viewsurface* :width))
          (h (send *viewsurface* :height))
          (gc (send *viewsurface* :gc)))
     `(let ((pixmaps) (pm))
         (dotimes (*animation-count* ,count)
            (cls)
            (progn . ,forms)
            (setq pm (instance x:Xpixmap
              :create :width ,w :height ,h :gc ,gc))
            (push pm pixmaps)
            (send pm :copy-from *viewsurface*))
         (nreverse pixmaps)) ))

(defun playback-pixmaps
 (pixmaps &optional (win *viewsurface*))
   (dolist (p pixmaps) 
      (send win :copy-from p)))

;; reapeat hid and return accumulate
;; visible line segments
;; forms should include calls to 'hid'

(defmacro hid-lines-animation (count &rest forms)
  `(let ((lines))
     (dotimes (*animation-count* ,count)
       (cls)
       (progn . ,forms)
       (push (list-visible-segments *hid*) lines))
     (nreverse lines)) )

(defun draw-hid-lines (lines &optional (view *viewer*))
  (dolist (l lines)
    (send view :draw-line-ndc (first l) (second l) nil)) )

(defun playback-hid-lines
  (lines &optional (view *viewer*))
;;
;; Make smooth-animation using
;; double-buffering technique
;; A series of pictures are drawn in
;; a pixmap which cannot be seen
;; on screen, and the pixmaps are
;; then copied to xwindow surface.
;;
   (send view :adjust-viewport)
   (let* ((win (send view :viewsurface))
          (pix (instance
                  x:xpixmap :create
                  :width (send win :width)
                  :height (send win :height))) )
        (setf (viewer-surface view) pix)
        (unwind-protect
           (dolist (ln lines)
              (send pix :clear)
              (draw-hid-lines ln)
              (send win :copy-from pix)
              (xflush))
           (setf (viewer-surface view) win)
           (send pix :destroy))))

;;
;; extract visible line segments out of edge-image structures
;;
(defun list-visible-segments (&optional (hid *hid*))
   (apply #'append (send-all hid :visible-segments)))



#|

;; a simple demonstration

(setq a (make-cylinder 50 100) b (make-cube 300 400 200))
(send a :translate #f(0 0 150))

(defun test ()
      (send a :rotate 0.2 :x) (send b :rotate -0.2 :y)
      (hid a b))

(setq pmaps (pixmap-animation 10 (test)))
(playback-pixmaps pmaps)

(setq hlines (hid-lines-animation 20 (test)))
(playback-hid-lines hlines)

|#


generated through LaTeX2HTML. M.Inaba 平成18年5月7日