Easy-ISLispでOpenGLを


はじめに

Easy-ISLisp(以下「EISL」)からOpenGLを扱うことに取り組んでいます。うまくいきました。ご紹介します。

OpenGLのインストール

予めOpenGLがインストールされている必要があります。LinuxMINTへのインストールは簡単です。下記をご参照ください。
https://qiita.com/sym_num/items/90cf5a22e623e1ad6578

Cラッパを利用したライブラリ

EISLにはC言語へのラッパが用意されています。Lisp関数にC言語コードを埋め込むことができます。これを利用してOpenGLを呼び出す関数を記述しています。


(defun glut::init-window-size (hight width)
    (c-lang "glutInitWindowSize((INT_MASK & HIGHT), (INT_MASK & WIDTH));"))

(defun glut::init-window-position (hight width)
    (c-lang "glutInitWindowPosition((INT_MASK & HIGHT), (INT_MASK & WIDTH));"))

(defun glut::create-window (x)
    (c-lang "glutCreateWindow(Fgetname(X));"))


インタプリタでもOK

GLUTの関数を利用して画面を描画する関数を呼び出しています。ここにLispの関数を記述できるようにしてあります。このためインタプリタでもOpenGLを動作させることができます。試行錯誤するにはインタプリタの方が楽です。すっかり動作確認ができたならコンパイルすることも可能です。

callback関数が事前にvoid型として定義されています。Lispで記述された描画関数のアドレスを大域変数、callbackfuncに代入し、callback関数はLispのEvalを呼び出しています。

整備中

以下のような簡単なものは動作することが確認できました。あとはひたすら必要なOpenGLの関数をライブラリに補充すればOKです。ISLispでゲームも記述できるようになることでしょう。


(import "opengl")

(defun main ()
  (glut::init)
  (glut::init-display-mode 'glut-single)
  (glut::init-window-size 400 300)
  (glut::init-window-position 200 300)

  (glut::create-window "GLUT test")
  (glut::init-display-mode "GLUT_RGBA")
  (gl::clear-color 1.0 1.0 1.0 1.0)

  (glut::display-func 'show)
  (glut::main-loop)
)

(defun show ()
  (gl::clear 'gl_color_buffer_bit)
  (gl::color3d 1.0 0.0 0.0)
  (gl::begin)

  (gl::vertex2d -0.5 -0.5)
  (gl::vertex2d -0.5 0.5)
  (gl::vertex2d 0.5 0.5)
  (gl::vertex2d 0.5 -0.5)

  (gl::end)
  (gl::flush)
)


githubにおいてあります。
https://github.com/sasagawa888/eisl