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 = ()