SML# - Resources/ProgrammingExamples/GLUT Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

SML# の[[FFIの機能|FeatureInteroperability]]を用いることで,既存のC言語用のライブラリを直接かつ簡単に利用することができる.ここでは既存のライブラリのうち,OpenGLを取り上げる.

[[glutサンプル|smlsharp:examples/glut/doc/]](配布ソースのsample/glutディレクトリ)は,OpenGLおよびGLUTを用いて2つの回転する立方体を3Dアニメーションで表示するプログラムである.

[[スクリーンショット|http://www.pllab.riec.tohoku.ac.jp/smlsharp/examples/glut/doc/cube.jpg]]

OpenGLやGLUTライブラリには,倍精度浮動小数点数や単精度浮動小数点数,イベント処理のためのコールバック関数などを受け取る関数が多数存在する.
SML#では,このような関数も特殊なプログラムを書くことなく,ただC言語の関数宣言に合わせて[[_import特殊構文|Language/FFI/Import]]を書くだけ利用可能となる._importを用いてOpenGL関連のAPIをバインドするコード例を以下に示す.

val glMaterialfv =
     DynamicLink.dlsym (libgl, "glMaterialfv")
     : _import (word, word, float * float * float * float) -> unit

val gluLookAt =
     DynamicLink.dlsym (libglu, "gluLookAt")
     : _import (real, real, real, real, real, real, real, real, real) -> unit

val glutDisplayFunc =
     DynamicLink.dlsym (libglut, "glutDisplayFunc")
     : _import (()->unit) -> unit

!!サンプルプログラムの実行方法

このサンプルプログラムは実験的な[[CConfigライブラリ|smlsharp:lib/CConfig/doc/api/]]を使用しているため,実行するにはOpenGLライブラリがインストールされている場所などにに合わせて環境変数を適宜設定する必要がある.

UNIX系OSでの例:

env CPPFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib smlsharp cube.sml

Mac OS Xでの例:

env LDD='otool -L' smlsharp cube.sml

Cygwinでの例:

env CPPFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib \
     LIBNAME_SUFFIX=.dll LDD=cygcheck ARCSEP='\' smlsharp cube.sml

!!!MinGWでの実行

最近のWindowsにはOpenGLライブラリが標準で添付されている(opengl32.dll, glu32.dll).GLUTライブラリは[[OpenGLのWebサイト|http://www.opengl.org/resources/libraries/glut/]]から入手できる.ただし,現在のCConfigライブラリはMinGWに対応しておらず,またWindows APIは関数の呼び出し規約が一般のCの関数と異なるため(stdcall),このサンプルプログラムを実行するには[[libglut.sml|smlsharp:examples/glut/doc/Src_sample_glut_libglut_sml.html]]を若干書き換える必要がある.