\section{OpenGL インターフェース}
¥markright{¥arabic{section}. OpenGL}
EusLisp OpenGL インターフェースは、EusLisp に OpenGL 
インターフェースを実現し、プラットフォーム非依存の３次元グラフィクス環
境を EusLisp 処理系で実現する。¥¥

OpenGL アプリケーションインターフェースは、Silicon Graphics 社製 WS
DIGITAL EQUIPMENTS 社製 WS を始め、Windows-NT、Windows-95（予定）、さ
らにサードパーティ¥footnote{Template Graphics,.Inc 等}のソフトウエア製
品の追加により Sun WS (Solaris2)、PC-UNIX （LINUX 等）の上でも動作する。¥¥

また、フリーの OpenGL エミュレーション・ライブラリである、Mesa GL と併
用すると、通常の X 端末にも同等の絵の描画を行なうことができる。¥¥

¥subsection{OpenGL 機能拡張}

EusLisp の OpenGL 機能拡張は、OpenGL ライブラリとのインターフェース、
viewsurface クラスのサブクラスである glviewsurface、geo:viewer の 
:draw-one メソッドの書き換え、gldraw ユーティリティ・ルーチンにより実
装される。¥¥

¥classdesc{glviewsurface}{geometry:viewsurface}{}{
OpenGL 用 viewsurface。 viewer への描画リクエストを OpenGL の描画リク
エストに翻訳する。
}

¥methoddesc{:create}{}{ ¥&key (x 0) (y 0) (size 256) (w size) (h size)
		      (title (string (gensym "GL")))
		      (displaymode (logior gl:AUX¥_DOUBLE gl:AUX¥_RGB gl:AUX¥_DEPTH))
		      ¥&allow-other-keys}{
{¥relax glviewsurface} を作成、初期化する。
}
¥methoddesc{:material}{ambient diffuse specular emission shininess}{
現在のマテリアル・カラーを変更する。
}
¥methoddesc{:color}{color-vector}{
現在のカラーを変更する。
}
¥methoddesc{:3d-mode}{}{
射影変換を透視法射影モードにし、デプス検査、ライティングをイネーブルす
る。３次元モデル──シーンの描画に適したモードにする。
}
¥methoddesc{:2d-mode}{}{
射影変換を正射影にし、デプス検査、ライティングをディスエーブルする。
２次元の描画要素の描画に適したモードにする。
}
¥methoddesc{:clear}{mask ¥&key (color)}{
{¥relax mask} で指定される、フレームバッファの内容を消去する。
{¥relax color} は指定があれば、消去時に用いられる色を設定し直す。
}
¥methoddesc{:init}{¥&key ¥&allow-other-keys}{
初期化メソッド。
}
¥methoddesc{:point}{x y}{
２次元モードで、点を描く。
}
¥methoddesc{:line}{x1 y1 x2 y2}{
２次元モードで、直線を描く。
}
¥methoddesc{:3d-point}{pos}{
３次元モードで点を描く。
}
¥methoddesc{:3d-line}{start end}{
３次元モードで直線を描く。
}
¥methoddesc{:draw-faces}{faces}{
３次元モードで面（ポリゴン）を描く。
}
¥methoddesc{:rectangle}{x y w h}{
２次元モードで矩形を描く。
}
¥methoddesc{:draw-point}{p}{
２次元モードで、点を描く。
}
¥methoddesc{:draw-line}{from to}{
２次元モードで、直線を描く。
}
¥methoddesc{:draw-rectangle}{}{
２次元モードで矩形を描く。
}
¥classdesc{colormaterial}{object}{}{
モデルのマテリアル指定に用いるデータ構造。
}
¥funcdesc{gl:draw-face}{face}{
ポリゴンの描画単位。凸でホールのない、ポリゴンは glVertex3fv¥(¥) を用
いて、そのまま描かれる。そうでないものは GLU ライブラリの tesselation 
機能を用いて描かれる。
}
¥funcdesc{gl:draw-body}{abody}{
{¥relax body} の描画単位。¥¥

{¥relax body} の描画手順は一度、各面毎の描画要求の列として、その {¥relax
body} を描く手順が OpenGL の Display List として定義され、実際の描画は
その後、その Display List を呼び出すことにより描画が行なわれる。¥¥

Display List の記録は {¥relax body} の plist に attribute {¥relax
:GL-DISPLAYLIST-ID} で put される。
}
¥classdesc{linecolor}{object}{}{
点、直線の色指定に用いるデータ構造。
}

¥funcdesc{cls}{}{
画面をクリアする。
}
¥funcdesc{swapb}{}{
ダブルバッファ・モードのときのバッファ・スワップを行なう。
}
¥funcdesc{resetperspective}{}{
現在の{¥relax ¥*viewing¥*} から視点、注視点位置を取り出し、GL のコンテキ
ストに反映させる。
}
¥funcdesc{gldraw}{¥&rest things}{
視点の再設定 {¥relax (resetperspective)}、
フレームバッファのクリア {¥relax (cls)}、
描画 {¥relax (apply ¥#'draw things)}、
ダブルバッファの交換 {¥relax (swapb)}
を順に行ない、シーンの描画を行なう。¥¥

things は左から右に順に処理され、その要素が、クラス colormaterial、
linecolor のインスタンスの時は、GL のカレントコンテキストの色が変更さ
れる。すなわち、(gldraw *color1* *obj1* *color2* *obj2*) では、
*obj1* が *color1* で描かれ、*obj2* が *color2* で描かれる。
}

¥subsection{起動方法}
eusgl は OpenGL の補助ライブラリ aux、glx を用いるのため、環境変数 
DISPLAY、LD¥_LIBRARY¥_PATH が適当な値にセットされている必要がある。aux 
ライブラリは irix5 ではデフォルトでインストールされていないが、
/usr/share/src/OpenGL 下にソースコードがあるほか、
http://www.sgi.com/Technology/openGL/opengl.html または 
ftp://sgigate.sgi.com/pub/opengl/ 等から取得できる。¥¥

Mesa GL ライブラリを用いる場合は、LD¥_LIBRARY¥_PATH の変更のみ
で、切替ができる。詳細は /usr/local/eus/gl/src/README.Mesa を参照のこ
と。Mesa GL は、http://www.ssec.wisc.edu/¥‾brianp/Mesa.html または 
ftp://iris.ssec.wisc.edu/pub/Mesa/ 等から入手できる。¥¥

プログラム名 eusgl として起動することで、OpenGL 拡張機能つきの Euslisp
が立ち上がる。¥¥

eta3 マニピュレータを描くサンプル /usr/local/eus/gl/src/Sample.l が
用意してあり、

¥begin{verbatim}
eusgl$ (load "/usr/local/eus/gl/src/Sample.l")
eusgl$ (load "view")
eusgl$ (gldraw *scene*)
¥end{verbatim}

等とすると絵が表示できる。

