GLとかなんかやってみる。

結構いろんなライブラリがあって、便利なんだなー、とか眺めていたところ。
ocamlbrowserというのがあって、これでいろいろ眺めることができる。

折角だからGLでTeapotくらい出してみようかなのココロ。

どうやってライブラリ?

ライブラリを利用する方法はいろいろあるっぽいんだけど、トップレベルでもコンパイラでも該当するcmaファイルをコマンドラインに指定すればとりあえず使えるっぽい(optでネイティブ吐くときはcmxaらしい)

quartz% ledit ocaml -I "+lablgl" lablgl.cma lablglut.cma

これで

# Glut.init [|"RGBA"|];;
- : string array = [|"RGBA"|]
# Glut.createWindow("hogerimakuri");;
- : int = 1

おおー出たー。
更に open でpythonのfrom ... import というか import as みたいにもできるけど、それこそ衝突しそうなので自重。あと専用トップレベルをこさえてしまう ocamlmktopみたいなきな臭いものもあるらしい。実験レベルではイラン。

つぎつぎ

browserで見ていくと glClear* -> GlClear.* とか glBegin -> GlDraw.beginとか言うように、GL関数が綺麗にモジュールに分かれてる。判りやすい。更にバリアント型でオプション引数とかが決定されているので確かに安全。
GlClear.color の ?alpha:float という表現がちょっとイミフだったんだけど、とりあえず今は考えずにツキススム。多分、オプション引数*1
トップレベルに関数名を入れるとシグネチャ出るので物凄く判りやすい。

# GluMat.look_at ;;
- : eye:Gl.point3 -> center:Gl.point3 -> up:Gl.vect3 -> unit = <fun>

とりあえず設定までやっちゃう。

# GlMat.mode `projection;;
- : unit = ()
# GlMat.load_identity();;
- : unit = ()
# GluMat.perspective  30. 1. (0.,10.);;;;
- : unit = ()
# GlMat.mode `modelview;;
- : unit = ()
# GlMat.load_identity();;
- : unit = ()
# GluMat.look_at (1., 1., -4.) (0., 0., 0.) (0., 1., 0.);;
- : unit = ()

おお、

# GlClear.color (0., 0., 0.);;
- : unit = ()
# GlClear.clear [`color];;
- : unit = ()
# Glut.wireTeapot(1.);;
- : unit = ()
# Glut.swapBuffers();;
- : unit = ()


力尽きた。でも面白かった。

*1:当たりだった。アクセスするには ~alpha:(float) みたいにするらしい。やっぱりこの当たりの「ふんだんに記号文字使いまくってfunny」な発想が結構キライ。しかも一貫性がない。perlはまだ一貫性があるぶんだけましに感じる。僕にはパーサを簡単にするためだけにしか見えない