2009年10月22日木曜日

CL-GLFW

Common LispでGLFW(OpenGLのフレームワーク)を動かすライブラリがあるので利用して遊んでみる。

とりあえず2Dの表示をやってみた。

(require :asdf)
(asdf:oos 'asdf:load-op :cl-glfw)
(asdf:oos 'asdf:load-op :cl-glfw-opengl)
(asdf:oos 'asdf:load-op :cl-glfw-glu)

(defpackage glfw-test
(:use :cl))

(in-package :glfw-test)

;;(test-modes)
;;(test-2d)

(defun test-modes (video-mode-max)
(glfw:init)
(format t "mode=(Width Height RedBits GreenBits BlueBits)~%")
(format t "Desktop-mode:~A~%" (glfw:get-desktop-mode))
(format t "Video-mode:~A~%" (glfw:get-video-modes video-mode-max))
(glfw:terminate))

;;;640x480
(defun test-2d ()
(let ((frames 0)
(quad (glu:new-quadric))
t0 t1)
(glfw:do-window ("test-2d" 640 480)
((gl:with-setup-projection
(glu:perspective 45d0
(coerce 4/3 'double-float)
0.1d0
50d0))
(setf t0 (glfw:get-time)
t1 (glfw:get-time)))

;;;calc FPS
(setf t1 (glfw:get-time))
(when (> (- t1 t0) 1.0)
(glfw:set-window-title
(format nil "test-2d(~,1f FPS)" (/ frames (- t1 t0))))
(setf frames 0
t0 t1))
(incf frames)

(gl:clear gl:+color-buffer-bit+)
(gl:load-identity)
(gl:translate-f 0.0 0.0 -5.0)

;;draw-line
(gl:with-begin gl:+line+
(gl:color-3f 1.0 0.0 0.0) ;red
(gl:vertex-2f 0.0 0.0) ;(0 0) -> (1 1)
(gl:vertex-2f 1.0 1.0)
(gl:color-3f 0.0 1.0 0.0) ;green
(gl:vertex-2f 1.0 0.0) ;(1 0) -> (0 1)
(gl:vertex-2f 0.0 1.0)
(gl:color-3f 0.0 0.0 1.0) ;blue
(gl:vertex-3f 0.0 0.0 0.0) ;(0 0 0) -> (0 1 0)
(gl:vertex-3f 0.0 1.0 0.0))

;;draw-point
(gl:with-begin gl:+point+
(gl:color-3f 1.0 0.0 0.0) ;red
(gl:vertex-2f 0.2 0.5)
(gl:color-3f 0.0 1.0 0.0) ;green
(gl:vertex-3f 0.7 0.5 0.0))

;;draw-triangle
;;(0 0)-(-1 0)-(0 -1)
(gl:with-begin gl:+triangles+
(gl:color-3f 1.0 0.0 0.0) ;red
(gl:vertex-2f 0.0 0.0)
(gl:color-3f 0.0 1.0 0.0) ;green
(gl:vertex-2f -1.0 0.0)
(gl:color-3f 0.0 0.0 1.0) ;blue
(gl:vertex-2f 0.0 -1.0) )

;;draw disk(circle)
(glu:quadric-draw-style quad glu:+fill+)
(gl:color-3f 0.0 0.0 1.0) ;blue
;;gluオブジェクトは原点に描画される
(gl:translate-f 0.5 -0.5 0.0)
;;(30角形?)
(glu:disk quad 0d0 0.5d0 30 1)
(gl:translate-f -0.5 0.5 0.0))
;;end of 'do-window'
(glu:delete-quadric quad)))

おそらくCで書いてもほとんど同じコードになるんだろうなぁ。

0 件のコメント:

コメントを投稿