#include <stdio.h>
#include <math.h>
#include <SDL.h>
#ifdef DREAMCAST
#include <SDL_dreamcast.h>
#endif
#include <SDL_opengl.h>
unsigned short texturebuffer[16*16*16];
GLint texture;
#ifdef DREAMCAST
#define FILTER GL_FILTER_BILINEAR
#define FORMAT_SRC GL_ARGB1555
#define FORMAT_DST GL_ARGB1555
#else
#define FILTER GL_LINEAR
#define FORMAT_SRC GL_RGBA
#define FORMAT_DST GL_BGRA
#endif
void genTexture(void)
{
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D,texture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,FILTER);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,FILTER);
glTexEnvi(GL_TEXTURE_2D,GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D,0,FORMAT_SRC,16,16,0,FORMAT_DST,GL_UNSIGNED_SHORT_1_5_5_5_REV,(void *)&texturebuffer);
}
void display(void)
{
static double angle1=0.0,angle2=0.0;
double addx1=sin(angle1);
double addx2=sin(angle2);
double z1=addx1/10.0;
double z2=addx2/10.0;
angle1+=M_PI/75.0;
if (angle1>(M_PI*2.0))
angle1-=(M_PI*2.0);
angle2+=M_PI/96.0;
if (angle2>(M_PI*2.0))
angle2-=(M_PI*2.0);
/* ONLY FOR DREAMCAST (transparency list) */
#ifdef DREAMCAST
glKosFinishList();
#endif
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);
glVertex3f(addx1-0.3,0.1,z1);
glTexCoord2f(1.0,0.0);
glVertex3f(addx1+0.1,0.1,z1);
glTexCoord2f(1.0,1.0);
glVertex3f(addx1+0.1,-0.2,z1);
glTexCoord2f(0.0,1.0);
glVertex3f(addx1-0.3,-0.2,z1);
glEnd();
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);
glVertex3f(addx2-0.5,0.5,z2);
glTexCoord2f(1.0,0.0);
glVertex3f(addx2+0.5,0.5,z2);
glTexCoord2f(1.0,1.0);
glVertex3f(addx2+0.5,-0.5,z2);
glTexCoord2f(0.0,1.0);
glVertex3f(addx2+-0.5,-0.5,z2);
glEnd();
glFlush();
SDL_GL_SwapBuffers();
}
void clear_events(void)
{
SDL_Event event;
SDL_Delay(100);
while(SDL_PollEvent(&event))
SDL_Delay(10);
}
int main(int argc, char ** argv)
{
int i,j;
for(j=0;j<16;j++)
for(i=0;i<16;i++)
texturebuffer[i+(j*16)]=(i*0x11)|(j*0x0100)|0x8000;
for(j=4;j<12;j++)
for(i=4;i<12;i++)
texturebuffer[i+(j*16)]=0x1; /* Transparency */
int theend=0;
#ifdef DREAMCAST
SDL_DC_ShowAskHz(SDL_FALSE);
#endif
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
SDL_JoystickEventState(SDL_ENABLE);
SDL_JoystickOpen(0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 1);
SDL_SetVideoMode(640,480,16,SDL_DOUBLEBUF | SDL_SWSURFACE | SDL_OPENGL);
glDisable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glDepthMask(1);
glClearDepth(1.0);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glClearColor(0.0,0.0,0.0,0.0);
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
genTexture();
clear_events();
while(!theend)
{
SDL_Event event;
display();
while(SDL_PollEvent(&event))
switch(event.type)
{
case SDL_QUIT:
case SDL_KEYDOWN:
case SDL_JOYBUTTONDOWN:
theend=1;
}
#ifndef DREAMCAST
SDL_Delay(50);
#endif
}
SDL_Quit();
return 0;
}