GLUT

HaskellC#OpenGL をやるには、GLUT あたりまででなんとか頑張ったほうが良さそうだ。
しかしいままで SDL と GLFW しかやったことがないので、GLUT を使ったやり方が分からない。
分からないんだから調べながらやってみることにする。


一番のネックである終了処理は、そのまま exit() してしまうのが良いようだ。
exit() なら atexit() で最後に実行する関数が指定できるので、リソースの解放はここで行えばいいや。


main.h

/**
 * main.h
 */
#ifndef _MAIN_H_
#define _MAIN_H_

#import <objc/Object.h>

@interface CMyClass : Object
{
	int hoge;
}

-(id) init;
-(id) free;
@end

#endif

main.m

/**
 * main.m
 */
#import "main.h"
#import <stdio.h>
#import <stdlib.h>
#import <glut.h>

static id obj;

@implementation CMyClass
// コンストラクタのようなもの
-(id) init
{
	[ super init ];
	printf("Constructed.?n");
	return self;
}

// デストラクタのようなもの
-(id) free
{
	printf("Destructed.?n");
	return [ super free ];
}
@end

// 表示しまっす
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glFlush();
}

// キー処理をしまっす
void keyboard(unsigned char key, int x, int y)
{
	switch (key)
	{
	case 'q':
	case 'Q':
	case '?033':  /* '?033' は ESC の ASCII コード */
		exit(0);
	default:
		break;
	}
}

// 初期化しまっす
void init(void)
{
	glClearColor(0.0, 0.0, 1.0, 1.0);
}

/**
 * 終了しまっす
 */
void myquit( void )
{
	[ obj free ];
	printf("Quit.?n");
}

// メイン
int main(int argc, char *argv[])
{
	// 取り敢えず作ってみる
	obj = [ [ CMyClass alloc ] init ];

	glutInitWindowSize( 320, 240 );
	glutInit          ( &argc, argv );
	glutInitDisplayMode( GLUT_RGBA );

	//
	atexit( &myquit );

	glutCreateWindow( argv[0] );

	glutDisplayFunc( display );
	glutKeyboardFunc( keyboard );
	init();
	glutMainLoop();

	return 0;
}

GLUT でググってひっかかったサイトのサンプルをほとんどそのまま持ってきた。動きとしては良さそう。
あとは glutTimerFunc() でタイマ処理すべき処理を書けば上手くいきそう。
なんか少し気持ちが悪いが、こういうものだと思い込むことにする。