Gauche:gl:repl

Gauche:gl:repl

OpenGLで描画を続けながらREPLも走らせるには

Shiro(2011/01/01 11:07:48 PST): glutではmain-loopを呼んだら戻ってこない。REPLを並行して走らせたい場合にどうするか。

別スレッドでread-eval-print-loopを走らせるのが一番簡単だが、0.9.1現在、 Windows版はスレッドが未サポート。

gauche.listenerはこういう時のためにあるので、試しに書いてみた。

sasagawa?(2011/01/01 18:16:09 PST): わ~~、動きました。すごい、これです、こういう動作をさせたかったんです。ChezEditが呼び出したcmd.exe経由で問題なく動いています。gl-colorの設定をdispからはずしてinitに入れておき、listenerから(gl-color 1 0 0)とやると物体の色が赤に変わります。gauche.listenerの使い方をよく読んでみます。

(use gl)
(use gl.glut)
(use gauche.listener)

(define *spin* 0.0)
(define *speed* 2.0)

(define eval-handler #f)                ;set by init

(define (init)
  (gl-clear-color 0.0 0.0 0.0 0.0)
  (gl-shade-model GL_FLAT)
  (let1 listener (make <listener>)
    (set! eval-handler (listener-read-handler listener))
    (listener-show-prompt listener))
  (set! (port-buffering (current-input-port)) :none))

(define (disp)
  (gl-clear GL_COLOR_BUFFER_BIT)
  (gl-push-matrix)
  (gl-rotate *spin* 0.0 0.0 1.0)
  (gl-color '#f32(1.0 1.0 1.0))
  (gl-rect '#f32(-25.0 -25.0) '#f32(25.0 25.0))
  (gl-pop-matrix)
  (glut-swap-buffers))

(define (idle)
  (set! *spin* (modulo (+ *spin* *speed*) 360.0))
  (when (char-ready? (current-input-port))
    (eval-handler))
  (glut-post-redisplay))

(define (reshape w h)
  (gl-viewport 0 0 w h)
  (gl-matrix-mode GL_PROJECTION)
  (gl-load-identity)
  (gl-ortho -50.0 50.0 -50.0 50.0 -1.0 1.0)
  (gl-matrix-mode GL_MODELVIEW)
  (gl-load-identity))

(define (keyboard key x y)
  (cond [(= key 27) (exit 0)]))         ;ESC

(define (main args)
  (glut-init args)
  (glut-init-display-mode (logior GLUT_DOUBLE GLUT_RGB))
  (glut-init-window-size 250 250)
  (glut-init-window-position 100 100)
  (glut-create-window *program-name*)
  (init)
  (glut-display-func disp)
  (glut-reshape-func reshape)
  (glut-keyboard-func keyboard)
  (glut-idle-func idle)
  (glut-main-loop)
  0)

ところが、EmacsからM-x shellでcmd.exeを走らせて、そこから実行すると ちゃんとreplできるんだけど、コマンドプロンプト窓やMSYS窓からだと うまくいかない。最初のchar-ready?で(何も入力してなくても) #tが帰っちゃうのが 問題っぽい。port-bufferingを:noneにセットするのがうまくいってないのかな。調査中。

Tags: REPL, gl

More ...