sdl-opengl-bare-d/sdl_opengl_bare.d

99 lines
2.1 KiB
D

import std.stdio;
import derelict.sdl.sdl;
import derelict.opengl.gl;
import derelict.opengl.glu;
enum int WIDTH = 800;
enum int HEIGHT = 600;
static bool drawing = false;
void init()
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glViewport(0, 0, WIDTH, HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, cast(GLfloat)WIDTH/cast(GLfloat)HEIGHT, 1.0, 30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, -10.0);
}
void display()
{
drawing = true;
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(SDL_GetTicks() * 90.0 / 1000, 0, 0, 1);
glBegin(GL_QUADS);
glColor3f(1, 1, 1);
glVertex3f(5.0, 5.0, 0.0);
glColor3f(1, 0, 0);
glVertex3f(-5.0, 5.0, 0.0);
glColor3f(0, 0, 1);
glVertex3f(-5.0, -5.0, 0.0);
glColor3f(0, 1, 0);
glVertex3f(5.0, -5.0, 0.0);
glEnd();
glPopMatrix();
drawing = false;
SDL_GL_SwapBuffers();
}
extern (C) Uint32 timer_callback(Uint32 interval, void *param)
{
if (!drawing)
{
SDL_Event event;
event.type = SDL_USEREVENT;
SDL_PushEvent(&event);
}
return interval;
}
int main(char[][] args)
{
DerelictSDL.load();
DerelictGL.load();
DerelictGLU.load();
if (SDL_Init(SDL_INIT_EVERYTHING))
{
writefln("Failed to initialize SDL!");
return 1;
}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_Surface *screen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL);
if (screen == null)
{
printf("Failed to set video mode!\n");
SDL_Quit();
return 2;
}
init();
SDL_Event event;
SDL_AddTimer(1000 / 60, &timer_callback, null);
while (SDL_WaitEvent(&event))
{
if (event.type == SDL_QUIT)
break;
else if (event.type == SDL_KEYDOWN)
{
if (event.key.keysym.sym == SDLK_ESCAPE)
break;
}
else if (event.type == SDL_USEREVENT)
{
display();
}
}
SDL_Quit();
return 0;
}