Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <SDL.h>
- #include <GL/glu.h>
- #include <GL/glext.h>
- #include <GL/glx.h>
- #include <GL/glxext.h>
- #include <math.h>
- #include <time.h>
- #include <unistd.h>
- #include "shader.h"
- PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
- PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
- PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
- PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
- PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL;
- PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
- PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL;
- PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
- PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
- PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
- PFNGLUNIFORM1FARBPROC glUniform1f = NULL;
- PFNGLUNIFORM2FARBPROC glUniform2f = NULL;
- PFNGLUNIFORM3FARBPROC glUniform3f = NULL;
- PFNGLUNIFORM1IARBPROC glUniform1i = NULL;
- #define glXGetProcAddress(x) (*glXGetProcAddressARB)((const GLubyte*)x)
- static SDL_Surface* gDrawSurface = NULL;
- static int width = 1024;
- static int height = 720;
- static float ratio = (float)width/height;
- static int program, vert_shader, frag_shader;
- static int lastFrame = 0;
- static int frames = 0;
- static uint t0 = 0;
- static uint t;
- static float view_angle = 45.0f;
- static float quad_dist = 1.135f/tan(view_angle/4.0f/M_PI);
- static float rot[] = {0.0f,0.0f,0.0f};
- void DrawScene()
- {
- float tf = (float)t/1000.0;
- uint dt = t-t0;
- t0 = t;
- float dtf = (float)dt/1000.0f;
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- //generate rotations
- rot[0] += dtf*10.0f;
- rot[1] += dtf*10.0f;
- rot[2] += dtf*10.0f;
- glLoadIdentity();
- glTranslatef(0.0,0.0,-quad_dist);
- glRotatef(rot[0],1,0,0);
- glRotatef(rot[1],0,1,0);
- glRotatef(rot[2],0,0,1);
- glUniform1f(glGetUniformLocationARB(program,"t"),tf);
- //draw full-screen quad
- glBegin(GL_QUADS);
- glTexCoord2f(-1.0f,-1.0f);
- glVertex2f(-1.0f,-1.0f);
- glTexCoord2f(1.0f,-1.0f);
- glVertex2f(1.0f,-1.0f);
- glTexCoord2f(1.0f,1.0f);
- glVertex2f(1.0f,1.0f);
- glTexCoord2f(-1.0f,1.0f);
- glVertex2f(-1.0f,1.0f);
- glEnd();
- glPopMatrix();
- SDL_GL_SwapBuffers();
- frames++;
- }
- void SetupGLSLProcs()
- {
- glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glXGetProcAddress("glCreateProgramObjectARB");
- glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glXGetProcAddress("glCreateShaderObjectARB");
- glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glXGetProcAddress("glShaderSourceARB");
- glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glXGetProcAddress("glCompileShaderARB");
- glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glXGetProcAddress("glGetObjectParameterivARB");
- glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glXGetProcAddress("glAttachObjectARB");
- glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glXGetProcAddress("glGetInfoLogARB");
- glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glXGetProcAddress("glLinkProgramARB");
- glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glXGetProcAddress("glUseProgramObjectARB");
- glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glXGetProcAddress("glGetUniformLocationARB");
- glUniform1f = (PFNGLUNIFORM1FARBPROC)glXGetProcAddress("glUniform1fARB");
- glUniform2f = (PFNGLUNIFORM2FARBPROC)glXGetProcAddress("glUniform2fARB");
- glUniform3f = (PFNGLUNIFORM3FARBPROC)glXGetProcAddress("glUniform3fARB");
- glUniform1i = (PFNGLUNIFORM1IARBPROC)glXGetProcAddress("glUniform1iARB");
- }
- int resizeWindow(int width,int height)
- {
- GLfloat ratio;
- if (height == 0) height = 1;
- ratio = (GLfloat)width/(GLfloat)height;
- glViewport(0,0,(GLsizei)width,(GLsizei)height);
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- gluPerspective(view_angle,ratio,0.1f,10000.0f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- return(1);
- }
- void handleKeyPress(SDL_keysym *keysym)
- {
- switch (keysym->sym)
- {
- case SDLK_ESCAPE:
- exit(0);
- break;
- case SDLK_F1:
- SDL_WM_ToggleFullScreen(gDrawSurface);
- break;
- default:
- printf("key: %d\n", keysym->sym);
- break;
- }
- return;
- }
- void handleKeyRelease(SDL_keysym *keysym)
- {
- switch (keysym->sym)
- {
- //keys here
- }
- return;
- }
- void LoopSDL()
- {
- SDL_Event event;
- while(1)
- {
- while(SDL_PollEvent(&event))
- {
- switch(event.type)
- {
- case SDL_QUIT:
- exit(0);
- break;
- case SDL_KEYDOWN:
- handleKeyPress(&event.key.keysym);
- break;
- case SDL_KEYUP:
- handleKeyRelease(&event.key.keysym);
- break;
- }
- }
- #if DRAWONCE
- if(!done)
- {
- done = 1;
- #endif
- DrawScene();
- t = SDL_GetTicks();
- if(t > lastFrame + 1000)
- {
- printf("fps=%d\n", frames);
- lastFrame = t;
- //I++;
- frames = 0;
- }
- #if DRAWONCE
- }
- #endif
- }
- }
- void SetupSDL(void)
- {
- const SDL_VideoInfo* vidinfo;
- if(SDL_Init(SDL_INIT_VIDEO)<0);
- atexit(SDL_Quit);
- vidinfo = SDL_GetVideoInfo();
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE,5);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,5);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,5);
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,16);
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
- gDrawSurface = SDL_SetVideoMode(width,height,vidinfo->vfmt->BitsPerPixel,SDL_OPENGL);
- glViewport(0,0,width,height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective( 45.0f, (float)width/height, .00001f, 100.0f);
- glMatrixMode(GL_MODELVIEW);
- glClearColor(0.0f, 0.0f, 0.0f, 0.0);
- glClearDepth(1.0f);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- //create shaders
- char str[1024];
- program = glCreateProgramObjectARB();
- //vertex shader
- vert_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER);
- glShaderSourceARB(vert_shader,1,&vs,0);
- glCompileShaderARB(vert_shader);
- glAttachObjectARB(program,vert_shader);
- //fragment shader
- frag_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER);
- glShaderSourceARB(frag_shader,1,&fs,0);
- glCompileShaderARB(frag_shader);
- glAttachObjectARB(program,frag_shader);
- glLinkProgramARB(program);
- glUseProgramObjectARB(program);
- glGetInfoLogARB(program,sizeof(str),0,str);
- printf("glsl program log:\n%s\n",str);
- }
- int main(int argc, char** argv)
- {
- SetupGLSLProcs();
- SetupSDL();
- LoopSDL();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement