[cells-gtk-devel] can't run testprogram
Peter Hildebrandt
peter.hildebrandt at gmail.com
Wed Nov 19 20:37:48 UTC 2008
Hello Martin,
as to (1), I think creating your own model derived from
gl-drawing-area is the right approach, and I'd leave it as it is.
As to (2), you might like (timeout-add ...) Check
test-gtk/test-display.lisp for an exemplary usage.
HTH,
Peter
2008/10/30 Martin Kielhorn <kielhorn.martin at googlemail.com>:
>
>
> 2008/10/27 Peter Hildebrandt <peter.hildebrandt at gmail.com>
>>
>> Lemme know if I can help.
>
> Right now I figure out if it is feasible to control a microscope with cells.
> In the end I would capture from a camera, move the focus, change
> objectives...
>
> But for the beginning I just try to create something similar to baudline
> (http://www.baudline.com/).
> Just capture sound, fft and display in an opengl texture. That should be
> easier as there is not as
> much hardware involved.
>
> What I've come up with is the following code. And I have several questions:
>
> 1) Can how somehow prevent the introduction of the extra defmodel graphics
> with the
> cell rotation and just connect my the hscale value to the gl-rotate?
>
> 2) What's the best way to continuously call the draw function in graphics,
> so that the
> display gets updated with 30 Hz? I searched the graphics instance with
> (inspect *win*)
> but I didn't find it. Otherwise I could have called (redraw (graphics
> (vbox *win*))) from an endless
> loop in another thread.
>
> Ideally I want to have the application running in several threads. One
> thread should capture sound and fill it in a queue.
> That should be easy in sbcl:
> http://www.sbcl.org/manual/Waitqueue_002fcondition-variables.html#Waitqueue_002fcondition-variables
> when 2) is solved.
>
> remark:
> I think :resize isn't called when my program starts. (In early versions of
> my program it was called. I don't know what
> change introduced this bug)
>
> (require :asdf)
> (require :cells-gtk)
> (require :sb-simple-audio)
>
> (defpackage :martin (:use :cl :cgtk :cells))
>
> (in-package :martin)
>
> (defparameter *tex* #x0)
> (defparameter *field* (cffi:make-shareable-byte-vector (* 256 256 3)))
> (defparameter *sound-buf-n* 1024)
> (defparameter *sound-buf* (make-array *sound-buf-n*))
> (defparameter *sound-stream* (sb-simple-audio:open-audio :sample-rate 8000
> :direction :input))
>
>
> (defun plot (x y r g b)
> (setf (aref *field* (+ 0 (* 3 (+ x (* 256 y))))) r)
> (setf (aref *field* (+ 1 (* 3 (+ x (* 256 y))))) g)
> (setf (aref *field* (+ 2 (* 3 (+ x (* 256 y))))) b))
>
> (defmodel graphics (gl-drawing-area)
> ((rotation :cell t :initarg :rotation :initform 0 :accessor rotation))
> (:default-initargs
> :expand t :fill t
> :init #'(lambda (self)
> ;;(declare (ignorable self))
> (loop for i below 256 do
> (loop for j below 256 do
> (plot i j i j 0)))
> (setf *tex* (first (gl:gen-textures 1)))
> (gl:bind-texture :texture-2d *tex*)
> (gl:tex-parameter :texture-2d :texture-mag-filter :nearest)
> (gl:tex-parameter :texture-2d :texture-min-filter :nearest)
> (cffi::with-pointer-to-vector-data (addr *field*)
> (gl:tex-image-2d :texture-2d 0 :rgba 256 256 0 :rgb
> :unsigned-byte addr)))
> :resize #'(lambda (self)
> (format t "RESIZE~%")
> (with-matrix-mode (:projection)
> (glu:perspective 50 (/ (allocated-width self)
> (allocated-height self))
> .5 20)))
> :draw #'(lambda (self)
> (declare (ignorable self))
> (gl:clear :color-buffer-bit)
> (gl:load-identity)
> ;(gl:translate 0 0 -5)
> (gl:rotate (* 360 (rotation self)) 0 0 1)
> (gl:color 1 1 1)
> (gl:enable :texture-2d)
> (gl:with-primitive :quads
> (gl:tex-coord 0 0)(gl:vertex 0 0)
> (gl:tex-coord 1 0)(gl:vertex 1 0)
> (gl:tex-coord 1 1)(gl:vertex 1 1)
> (gl:tex-coord 0 1)(gl:vertex 0 1))
> (read-sequence *sound-buf* *sound-stream*)
> ;;(format t "~a~%" *sound-buf*)
> (gl:disable :texture-2d)
> (gl:with-primitive :points
> (loop for i below *sound-buf-n* do
> (gl:vertex (/ i *sound-buf-n*)
> (/ (aref *sound-buf* i) 5000))))
> (gl:flush))))
>
>
> (defobserver rotation ((self graphics))
> (redraw self))
>
> (defmodel my-app (gtk-app)
> ()
> (:default-initargs :title "minimal gl control test"
> :position :center :width 500 :height 380
> :kids
> (kids-list? (mk-vbox :kids
> (kids-list?
> (mk-hscale :md-name :scale :value-type 'single-float
> :min .01 :max 1. :step .01 :init .5)
> (make-kid 'graphics :md-name :graphics
> :height 300
> :rotation (c? (widget-value :scale))))))))
>
> (cells-gtk-init)
>
> ;(defparameter *win* (start-win 'my-app))
>
> (start-app 'my-app)
>
> (*
> (inspect *win*)
> (sb-thread:list-all-threads)
> (make-thread (lambda () (write-line "test")))
> *)
>
> _______________________________________________
> cells-gtk-devel site list
> cells-gtk-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/cells-gtk-devel
>
More information about the cells-gtk-devel
mailing list