Advertisement
arstotzka_ctzen

C SDL2 OpenGL Draw

Dec 10th, 2019
629
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.94 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. #include <math.h>
  7. //задаем размеры окна
  8. #define WINDOWHEIGHT 480
  9. #define WINDOWWIDTH 640
  10.  
  11. const float PI = 3.141592f;
  12.  
  13. float x, y, z, alpha, beta; // Storage for coordinates and angles
  14. float radius = 1.0f;
  15. int gradation = 20;
  16.  
  17. //Параметры цилиндра
  18. const float l = 2.0f;
  19. const float r = 0.2f;
  20.  
  21. float xrf, yrf, zrf;
  22. int fps=0;
  23.  
  24. void DrawGLScene();
  25. Uint32 my_callbackfunc(Uint32 interval, void *param);
  26. void* my_callback_param;
  27.  
  28. int main(int argc, char* argv[]){
  29.  
  30.  if ( SDL_Init(/*SDL_INIT_TIMER|*/SDL_INIT_VIDEO) < 0 ){
  31.    printf("Unable to init SDL: %s\n", SDL_GetError());
  32.    exit(1);
  33.  }
  34.  
  35.  atexit(SDL_Quit);
  36.  
  37.  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  38.  SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
  39.  SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
  40.  SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
  41.  
  42.  SDL_Window* window = SDL_CreateWindow("SDL2/OpenGL Demo", 30, 30, WINDOWWIDTH, WINDOWHEIGHT, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
  43.  //SDL_Window* render = SDL_CreateWindow("SDL2/Raytracing", 30+WINDOWWIDTH, 30, WINDOWWIDTH, WINDOWHEIGHT, SDL_WINDOW_RESIZABLE); //приплюсовали чтобы окна стояли рядом, а не на друг друге
  44.  if ( window == NULL ){
  45.    printf("Unable to set 640x480 video: %s\n", SDL_GetError());
  46.    exit(1);
  47.  }
  48.  /* if ( render == NULL ){
  49.    printf("Unable to set 640x480 render: %s\n", SDL_GetError());
  50.    exit(1);
  51.  } */
  52. /* Create an OpenGL context associated with the window. */
  53.  SDL_GLContext glcontext = SDL_GL_CreateContext(window);
  54.  
  55.  //SDL_GL_SetSwapInterval(1);
  56.  /* This makes our buffer swap syncronized with the monitor's vertical refresh */
  57.  
  58.  /* Clear context */
  59.  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  60.  glClearDepth(1.0);
  61.  glDepthFunc(GL_LESS);
  62.  glEnable(GL_DEPTH_TEST);
  63.  glShadeModel(GL_SMOOTH);
  64.  glMatrixMode(GL_PROJECTION); // Apply following to projection matrix - is this correct?
  65.  glLoadIdentity(); // Reset first
  66.  gluPerspective(45.0f,640/480,0.4f,100.0f); // Set perspective
  67.  glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here?
  68. // SDL_TimerID my_timer_id = SDL_AddTimer(1000, my_callbackfunc, my_callback_param);
  69.  
  70.  int done=0;
  71.  //while(done == 0){
  72.  
  73.  //QUIT PROGRAMM BY PRESSING ESCAPE BUTTON
  74.    SDL_Event event;
  75. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  76.    /*while ( SDL_PollEvent(&event) ){
  77.      if ( event.type == SDL_QUIT ){
  78.       done = 1;
  79.      }
  80.      if ( event.type == SDL_KEYDOWN ){
  81.        if ( event.key.keysym.sym == SDLK_ESCAPE ){
  82.          done = 1;
  83.        }
  84.      }
  85.    } */
  86. /* Swap our buffer to display the current contents of buffer on screen */
  87.    DrawGLScene();
  88.    glFlush();
  89.  
  90.  
  91.    //struct{ GLubyte red, green, blue; } pixel;
  92.    //struct{ GLuint red, green, blue; } pixel2;
  93.    //     pixel2.red = 255;
  94.    //     pixel2.green = 255;
  95.     //    pixel2.blue = 255;
  96.     GLubyte data[WINDOWWIDTH][WINDOWHEIGHT][3];
  97.     //glDrawBuffer(GL_FRONT_AND_BACK);
  98.     //glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  99.  
  100.    //glReadPixels(320, 240, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
  101.    //printf("%d %d %d ", pixel.red, pixel.green, pixel.blue);
  102.  
  103.  
  104.   for(int jp=0; jp<WINDOWHEIGHT; jp++) {
  105.   for(int ip=0; ip<WINDOWWIDTH; ip++) {
  106.         //glReadPixels(ip, jp, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
  107.         data[ip][jp][0]=250;
  108.         data[ip][jp][1]=230;
  109.         data[ip][jp][2]=10;
  110.  
  111.         glRasterPos3i(ip, jp-240, 1);
  112.  
  113.         glDrawPixels(1, 1, GL_RGB, GL_UNSIGNED_BYTE, data);
  114.  
  115.         glFlush();
  116.         //glDrawPixels(ip, jp, GL_RGB, GL_UNSIGNED_BYTE, &data[ip][jp][0]);
  117.    };
  118.   };
  119. glPixelStorei(GL_PACK_ALIGNMENT, 1);
  120. //glDrawBuffer(GL_FRONT_AND_BACK);
  121. SDL_GL_SwapWindow(window);
  122.     // осторожно, не дает считать РГБ!!!
  123.    //fps++;
  124. SDL_Delay(4000);
  125. //}
  126.  
  127.  return 0;
  128.  
  129. }
  130.  
  131. void DrawGLScene(){
  132.  
  133.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  134.  
  135.   glLoadIdentity();
  136.   glTranslatef(0.0f,0.0f,-50.0f); // сдвиг системы координат - в нашем случае по z
  137.  
  138.   glRotatef(400, 1.0f, 0.0f, 0.0f); // вращение вокруг оси x на угол xrf
  139.   glRotatef(400, 0.0f, 1.0f, 0.0f); // вращение вокруг оси y на угол yrf
  140.   glRotatef(400, 0.0f, 0.0f, 1.0f); // вращение вокруг оси z на угол zrf
  141.  
  142.  // glBegin(GL_QUADS); // задание примитива GL_QUADS - каждые четыре вершины образуют четырехугольник
  143.  
  144.   /*
  145.   В качестве параметра команде glBegin передается тип примитивов,
  146.   которые будут описываться между командами glBegin/glEnd.
  147.   Внутри указываются координаты вершин примитива.
  148.   */
  149.  
  150.   /*
  151.   Обратите внимание на формат команды glVertex3f. Тройка означает, что команде передаются три аргумента.
  152.   В данном случае это координаты в формате (x, y, z).
  153.   Сигнатура f означает, что параметры этой команды имеют тип float.
  154.   */
  155.  
  156. //Отрисовка шара
  157.  
  158. for (alpha = 0.0; alpha < PI; alpha += PI/gradation)
  159. {
  160.     glBegin(GL_TRIANGLE_STRIP);
  161.     for (beta = 0.0; beta < 2.01*PI; beta += PI/gradation)
  162.     {
  163.         x = radius*cos(beta)*sin(alpha);
  164.         y = radius*sin(beta)*sin(alpha);
  165.         z = radius*cos(alpha);
  166.         glColor3f(x, y, z);
  167.         glVertex3f(x, y, z);
  168.         x = radius*cos(beta)*sin(alpha + PI/gradation);
  169.         y = radius*sin(beta)*sin(alpha + PI/gradation);
  170.         z = radius*cos(alpha + PI/gradation);
  171.         glColor3f(x, y, z);
  172.         glVertex3f(x, y, z);
  173.     }
  174.     glEnd();
  175. }
  176.  
  177.  
  178. //Отрисовка цилиндра
  179.  
  180.     glBegin(GL_QUAD_STRIP);
  181.     alpha = 0.0f;
  182.         while(alpha < 2*PI ) {
  183.             x = r * cos(alpha);
  184.             y = r * sin(alpha);
  185.             glColor3f(x, y, l);
  186.             glVertex3f(x, y , l);
  187.             glVertex3f(x, y , -l);
  188.             alpha = alpha + PI/gradation;
  189.         }
  190.         glColor3f(r, 0.0f, l);
  191.         glVertex3f(r, 0.0f, l);
  192.         glVertex3f(r, 0.0f, -l);
  193.     glEnd();
  194.  
  195. //Отрисовка крыла 1
  196.  
  197.     glBegin(GL_POLYGON);
  198.     glColor3f(0.0f,0.5f,1.0f);
  199.  
  200.     for (alpha = 0.0; alpha < 2.01*PI; alpha += PI/3)
  201.     {
  202.     glVertex3f(2*radius*cos(alpha),2*radius*sin(alpha),l);
  203.     }
  204.  
  205.     glEnd();
  206.  
  207. //Отрисовка крыла 2
  208.  
  209.     glBegin(GL_POLYGON);
  210.     glColor3f(0.0f,0.5f,1.0f);
  211.  
  212.     for (alpha = 0.0; alpha < 2.01*PI; alpha += PI/3)
  213.     {
  214.     glVertex3f(2*radius*cos(alpha),2*radius*sin(alpha),-l);
  215.     }
  216.  
  217.     glEnd();
  218.  
  219.  
  220.   //xrf -= 0.15;
  221.   //yrf -= 0.2;
  222.   //zrf -= 0.25;
  223. }
  224.  
  225. Uint32 my_callbackfunc(Uint32 interval, void *param){
  226.  printf("FPS = %d\n", fps);
  227.  fps=0;
  228.  return interval;
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement