Advertisement
arstotzka_ctzen

C SDL2 OpenGL Cube

Dec 9th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.46 KB | None | 0 0
  1. #include "SDL2/SDL.h"
  2. #include "GL/gl.h"
  3. #include "GL/glu.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. float xrf, yrf, zrf;
  8. int fps=0;
  9.  
  10. void DrawGLScene();
  11. Uint32 my_callbackfunc(Uint32 interval, void *param);
  12. void* my_callback_param;
  13.  
  14. int main(int argc, char* argv[]){
  15.  
  16.  if ( SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO) < 0 ){
  17.    printf("Unable to init SDL: %s\n", SDL_GetError());
  18.    exit(1);
  19.  }
  20.  
  21.  atexit(SDL_Quit);
  22.  
  23.  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  24.  SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
  25.  SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
  26.  SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
  27.  
  28.  SDL_Window* window = SDL_CreateWindow("SDL2/OpenGL Demo", 30, 30, 640, 480, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
  29.  
  30.  if ( window == NULL ){
  31.    printf("Unable to set 640x480 video: %s\n", SDL_GetError());
  32.    exit(1);
  33.  }
  34. /* Create an OpenGL context associated with the window. */
  35.  SDL_GLContext glcontext = SDL_GL_CreateContext(window);
  36.  
  37.  SDL_GL_SetSwapInterval(1);
  38.  /* This makes our buffer swap syncronized with the monitor's vertical refresh */
  39.  
  40.  /* Clear context */
  41.  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  42.  glClearDepth(1.0);
  43.  glDepthFunc(GL_LESS);
  44.  glEnable(GL_DEPTH_TEST);
  45.  glShadeModel(GL_SMOOTH);
  46.  glMatrixMode(GL_PROJECTION);
  47.  glLoadIdentity();
  48.  gluPerspective(45.0f,640/480,0.1f,100.0f);
  49.  glMatrixMode(GL_MODELVIEW);
  50.  
  51.  SDL_TimerID my_timer_id = SDL_AddTimer(1000, my_callbackfunc, my_callback_param);
  52.  
  53.  int done=0;
  54.  while(done == 0){
  55.  
  56.    SDL_Event event;
  57.  
  58.    while ( SDL_PollEvent(&event) ){
  59.      if ( event.type == SDL_QUIT ){
  60.       done = 1;
  61.      }
  62.      if ( event.type == SDL_KEYDOWN ){
  63.        if ( event.key.keysym.sym == SDLK_ESCAPE ){
  64.          done = 1;
  65.        }
  66.      }
  67.    }
  68. /* Swap our buffer to display the current contents of buffer on screen */
  69.    DrawGLScene();
  70.    glFlush();
  71.    SDL_GL_SwapWindow(window);
  72.    fps++;
  73.  }
  74.  
  75.  return 0;
  76.  
  77. }
  78.  
  79. void DrawGLScene(){
  80.  
  81.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  82.  
  83.   glLoadIdentity();
  84.   glTranslatef(0.0f,0.0f,-10.0f); // сдвиг системы координат - в нашем случае по z
  85.  
  86.   glRotatef(xrf, 1.0f, 0.0f, 0.0f); // вращение вокруг оси x на угол xrf
  87.   glRotatef(yrf, 0.0f, 1.0f, 0.0f); // вращение вокруг оси y на угол yrf
  88.   glRotatef(zrf, 0.0f, 0.0f, 1.0f); // вращение вокруг оси z на угол zrf
  89.  
  90.   glBegin(GL_QUADS); // задание примитива GL_QUADS - каждые четыре вершины образуют четырехугольник
  91.  
  92.   /*
  93.   В качестве параметра команде glBegin передается тип примитивов,
  94.   которые будут описываться между командами glBegin/glEnd.
  95.   Внутри указываются координаты вершин примитива.
  96.   */
  97.  
  98.   /*
  99.   Обратите внимание на формат команды glVertex3f. Тройка означает, что команде передаются три аргумента.
  100.   В данном случае это координаты в формате (x, y, z).
  101.   Сигнатура f означает, что параметры этой команды имеют тип float.
  102.   */
  103.  
  104.     glColor3f(0.0f,1.0f,0.0f);
  105.     glVertex3f( 1.0f, 1.0f,-1.0f);
  106.     glVertex3f(-1.0f, 1.0f,-1.0f);
  107.     glVertex3f(-1.0f, 1.0f, 1.0f);
  108.     glVertex3f( 1.0f, 1.0f, 1.0f);
  109.  
  110.     glColor3f(1.0f,0.5f,0.0f);
  111.     glVertex3f( 1.0f,-1.0f, 1.0f);
  112.     glVertex3f(-1.0f,-1.0f, 1.0f);
  113.     glVertex3f(-1.0f,-1.0f,-1.0f);
  114.     glVertex3f( 1.0f,-1.0f,-1.0f);
  115.  
  116.     glColor3f(1.0f,0.0f,0.0f);
  117.     glVertex3f( 1.0f, 1.0f, 1.0f);
  118.     glVertex3f(-1.0f, 1.0f, 1.0f);
  119.     glVertex3f(-1.0f,-1.0f, 1.0f);
  120.     glVertex3f( 1.0f,-1.0f, 1.0f);
  121.  
  122.     glColor3f(1.0f,1.0f,0.0f);
  123.     glVertex3f( 1.0f,-1.0f,-1.0f);
  124.     glVertex3f(-1.0f,-1.0f,-1.0f);
  125.     glVertex3f(-1.0f, 1.0f,-1.0f);
  126.     glVertex3f( 1.0f, 1.0f,-1.0f);
  127.  
  128.     glColor3f(0.0f,0.0f,1.0f);
  129.     glVertex3f(-1.0f, 1.0f, 1.0f);
  130.     glVertex3f(-1.0f, 1.0f,-1.0f);
  131.     glVertex3f(-1.0f,-1.0f,-1.0f);
  132.     glVertex3f(-1.0f,-1.0f, 1.0f);
  133.  
  134.     glColor3f(1.0f,0.0f,1.0f);
  135.     glVertex3f( 1.0f, 1.0f,-1.0f);
  136.     glVertex3f( 1.0f, 1.0f, 1.0f);
  137.     glVertex3f( 1.0f,-1.0f, 1.0f);
  138.     glVertex3f( 1.0f,-1.0f,-1.0f);
  139.  
  140.   glEnd();
  141.  
  142.   xrf -= 0.15;
  143.   yrf -= 0.2;
  144.   zrf -= 0.25;
  145. }
  146.  
  147. Uint32 my_callbackfunc(Uint32 interval, void *param){
  148.  printf("FPS = %d\n", fps);
  149.  fps=0;
  150.  return interval;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement