/* * SDL OpenGL チュートリアル. * (c) Michael Vance, 2000 * briareos@lokigames.com * * LGPL の条件のもとで配布されています。 */ import opengl; import openglu; import glut; import std.c.stdio; import std.c.stdlib; static GLboolean should_rotate = GL_TRUE; static void draw_screen() { /* 回転角 */ static float angle = 0.0f; /* * 練習: * このひどいごみを頂点配列で置き換え、 * glDrawElements を呼び出せ。 * * 練習: * 上を終えた後、コンパイルされた頂点配列に変更せよ。 * * 練習: * 私の螺旋形状が正しいことを確認せよ。;) */ static GLfloat v0[] = [ -1.0f, -1.0f, 1.0f ]; static GLfloat v1[] = [ 1.0f, -1.0f, 1.0f ]; static GLfloat v2[] = [ 1.0f, 1.0f, 1.0f ]; static GLfloat v3[] = [ -1.0f, 1.0f, 1.0f ]; static GLfloat v4[] = [ -1.0f, -1.0f, -1.0f ]; static GLfloat v5[] = [ 1.0f, -1.0f, -1.0f ]; static GLfloat v6[] = [ 1.0f, 1.0f, -1.0f ]; static GLfloat v7[] = [ -1.0f, 1.0f, -1.0f ]; static GLubyte red[] = [ 255, 0, 0, 255 ]; static GLubyte green[] = [ 0, 255, 0, 255 ]; static GLubyte blue[] = [ 0, 0, 255, 255 ]; static GLubyte white[] = [ 255, 255, 255, 255 ]; static GLubyte yellow[] = [ 0, 255, 255, 255 ]; static GLubyte black[] = [ 0, 0, 0, 255 ]; static GLubyte orange[] = [ 255, 255, 0, 255 ]; static GLubyte purple[] = [ 255, 0, 255, 0 ]; /* 色・デプスバッファを消去 */ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); /* 射影行列は変更したくない */ glMatrixMode( GL_MODELVIEW ); glLoadIdentity( ); /* z 軸の方向に下げる */ glTranslatef( 0.0, 0.0, -5.0 ); /* 回転 */ glRotatef( angle, 0.0, 1.0, 0.0 ); if( should_rotate ) { if( ++angle > 360.0f ) { angle = 0.0f; } } /* 三角形データをパイプラインに送る */ glBegin( GL_TRIANGLES ); glColor4ubv( red ); glVertex3fv( v0 ); glColor4ubv( green ); glVertex3fv( v1 ); glColor4ubv( blue ); glVertex3fv( v2 ); glColor4ubv( red ); glVertex3fv( v0 ); glColor4ubv( blue ); glVertex3fv( v2 ); glColor4ubv( white ); glVertex3fv( v3 ); glColor4ubv( green ); glVertex3fv( v1 ); glColor4ubv( black ); glVertex3fv( v5 ); glColor4ubv( orange ); glVertex3fv( v6 ); glColor4ubv( green ); glVertex3fv( v1 ); glColor4ubv( orange ); glVertex3fv( v6 ); glColor4ubv( blue ); glVertex3fv( v2 ); glColor4ubv( black ); glVertex3fv( v5 ); glColor4ubv( yellow ); glVertex3fv( v4 ); glColor4ubv( purple ); glVertex3fv( v7 ); glColor4ubv( black ); glVertex3fv( v5 ); glColor4ubv( purple ); glVertex3fv( v7 ); glColor4ubv( orange ); glVertex3fv( v6 ); glColor4ubv( yellow ); glVertex3fv( v4 ); glColor4ubv( red ); glVertex3fv( v0 ); glColor4ubv( white ); glVertex3fv( v3 ); glColor4ubv( yellow ); glVertex3fv( v4 ); glColor4ubv( white ); glVertex3fv( v3 ); glColor4ubv( purple ); glVertex3fv( v7 ); glColor4ubv( white ); glVertex3fv( v3 ); glColor4ubv( blue ); glVertex3fv( v2 ); glColor4ubv( orange ); glVertex3fv( v6 ); glColor4ubv( white ); glVertex3fv( v3 ); glColor4ubv( orange ); glVertex3fv( v6 ); glColor4ubv( purple ); glVertex3fv( v7 ); glColor4ubv( green ); glVertex3fv( v1 ); glColor4ubv( red ); glVertex3fv( v0 ); glColor4ubv( yellow ); glVertex3fv( v4 ); glColor4ubv( green ); glVertex3fv( v1 ); glColor4ubv( yellow ); glVertex3fv( v4 ); glColor4ubv( black ); glVertex3fv( v5 ); glEnd( ); /* * 練習: * 'Spc' で回転停止、'Esc' で終了することを * ユーザーに教えるテキストを描画せよ。 * ベクターとテクスチャが貼られた四角形で行え。 */ /* * バッファを交換する。これはバックバッファからの * 次のフレームの描画と、 * フロントバッファであったものに起こる * すべての描画操作の設定をドライバに通知する。 * * ダブルバッファによって、 * 更新中の画面領域へアプリケーションが同時に描画することから起きる、 * 表示の乱れが防止される。 */ glutSwapBuffers( ); } static void setup_opengl( int width, int height ) { float ratio = cast(float) width / cast(float) height; /* シェーディングモデルは Gouraud (なめらか) */ glShadeModel( GL_SMOOTH ); /* 裏面を取り除く */ glCullFace( GL_BACK ); glFrontFace( GL_CCW ); glEnable( GL_CULL_FACE ); /* 消去時の色をセット */ glClearColor( 0, 0, 0, 0 ); /* ビューポートを設定 */ glViewport( 0, 0, width, height ); /* * 射影行列を変更し、ビューボリュームにセット。 */ glMatrixMode( GL_PROJECTION ); glLoadIdentity( ); /* * 練習: * これを glFrustum の呼び出しに置き換えよ。 */ gluPerspective( 60.0, ratio, 1.0, 1024.0 ); } extern (C) void process() { // process_events(); draw_screen(); } int main(char[][] args) { int argc = args.length; char*[] argv; for (int i = 0; i < argc; i++) { argv ~= &args[i][0]; } /* ウィンドウの寸法 */ int width = 0; int height = 0; /* ウィンドウの色のピクセル深度 */ int bpp = 0; /* SDL_SetVideoMode に渡すフラグ */ int flags = 0; glutInit(&argc, &argv[0]); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); width = 640; height = 480; glutInitWindowSize(width, height); glutCreateWindow("SDL_opengl_sample_glut"); /* * ここで、OpenGL の使用のために * ダブルバッファのウィンドウを適切に設定したはず。 */ setup_opengl( width, height ); glutDisplayFunc(&process); glutIdleFunc(&process); glutMainLoop(); /* ここには届かない */ return 0; }