Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "SDL2/SDL.h"
- #include "GL/gl.h"
- #include "GL/glu.h"
- #include <stdio.h>
- #include <stdlib.h>
- float xrf, yrf, zrf;
- int fps=0;
- void DrawGLScene();
- Uint32 my_callbackfunc(Uint32 interval, void *param);
- void* my_callback_param;
- int main(int argc, char* argv[]){
- if ( SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) < 0 ){
- printf("Unable to init SDL: %s\n", SDL_GetError());
- exit(1);
- }
- atexit(SDL_Quit);
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
- SDL_Window* window = SDL_CreateWindow("SDL2/OpenGL Demo", 30, 30, 640, 480, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
- if ( window == NULL ){
- printf("Unable to set 640x480 video: %s\n", SDL_GetError());
- exit(1);
- }
- /* Create an OpenGL context associated with the window. */
- SDL_GLContext glcontext = SDL_GL_CreateContext(window);
- SDL_GL_SetSwapInterval(1);
- /* This makes our buffer swap syncronized with the monitor's vertical refresh */
- /* Clear context */
- glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
- glClearDepth(1.0);
- glDepthFunc(GL_LESS);
- glEnable(GL_DEPTH_TEST);
- glShadeModel(GL_SMOOTH);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45.0f,640/480,0.1f,100.0f);
- glMatrixMode(GL_MODELVIEW);
- SDL_TimerID my_timer_id = SDL_AddTimer(1000, my_callbackfunc, my_callback_param);
- int done=0;
- while(done == 0){
- SDL_Event event;
- while ( SDL_PollEvent(&event) ){
- if ( event.type == SDL_QUIT ){
- done = 1;
- }
- if ( event.type == SDL_KEYDOWN ){
- if ( event.key.keysym.sym == SDLK_ESCAPE ){
- done = 1;
- }
- }
- }
- /* Swap our buffer to display the current contents of buffer on screen */
- DrawGLScene();
- glFlush();
- SDL_GL_SwapWindow(window);
- fps++;
- }
- return 0;
- }
- void DrawGLScene(){
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(0.0f,0.0f,-10.0f); // сдвиг системы координат - в нашем случае по z
- glRotatef(xrf, 1.0f, 0.0f, 0.0f); // вращение вокруг оси x на угол xrf
- glRotatef(yrf, 0.0f, 1.0f, 0.0f); // вращение вокруг оси y на угол yrf
- glRotatef(zrf, 0.0f, 0.0f, 1.0f); // вращение вокруг оси z на угол zrf
- glBegin(GL_QUADS); // задание примитива GL_QUADS - каждые четыре вершины образуют четырехугольник
- /*
- В качестве параметра команде glBegin передается тип примитивов,
- которые будут описываться между командами glBegin/glEnd.
- Внутри указываются координаты вершин примитива.
- */
- /*
- Обратите внимание на формат команды glVertex3f. Тройка означает, что команде передаются три аргумента.
- В данном случае это координаты в формате (x, y, z).
- Сигнатура f означает, что параметры этой команды имеют тип float.
- */
- glColor3f(0.0f,1.0f,0.0f);
- glVertex3f( 1.0f, 1.0f,-1.0f);
- glVertex3f(-1.0f, 1.0f,-1.0f);
- glVertex3f(-1.0f, 1.0f, 1.0f);
- glVertex3f( 1.0f, 1.0f, 1.0f);
- glColor3f(1.0f,0.5f,0.0f);
- glVertex3f( 1.0f,-1.0f, 1.0f);
- glVertex3f(-1.0f,-1.0f, 1.0f);
- glVertex3f(-1.0f,-1.0f,-1.0f);
- glVertex3f( 1.0f,-1.0f,-1.0f);
- glColor3f(1.0f,0.0f,0.0f);
- glVertex3f( 1.0f, 1.0f, 1.0f);
- glVertex3f(-1.0f, 1.0f, 1.0f);
- glVertex3f(-1.0f,-1.0f, 1.0f);
- glVertex3f( 1.0f,-1.0f, 1.0f);
- glColor3f(1.0f,1.0f,0.0f);
- glVertex3f( 1.0f,-1.0f,-1.0f);
- glVertex3f(-1.0f,-1.0f,-1.0f);
- glVertex3f(-1.0f, 1.0f,-1.0f);
- glVertex3f( 1.0f, 1.0f,-1.0f);
- glColor3f(0.0f,0.0f,1.0f);
- glVertex3f(-1.0f, 1.0f, 1.0f);
- glVertex3f(-1.0f, 1.0f,-1.0f);
- glVertex3f(-1.0f,-1.0f,-1.0f);
- glVertex3f(-1.0f,-1.0f, 1.0f);
- glColor3f(1.0f,0.0f,1.0f);
- glVertex3f( 1.0f, 1.0f,-1.0f);
- glVertex3f( 1.0f, 1.0f, 1.0f);
- glVertex3f( 1.0f,-1.0f, 1.0f);
- glVertex3f( 1.0f,-1.0f,-1.0f);
- glEnd();
- xrf -= 0.15;
- yrf -= 0.2;
- zrf -= 0.25;
- }
- Uint32 my_callbackfunc(Uint32 interval, void *param){
- printf("FPS = %d\n", fps);
- fps=0;
- return interval;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement