Advertisement
arstotzka_ctzen

na puti k prozreniu

Dec 10th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.63 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.1f,200.0f); // Set perspective
  67.  glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here?
  68.  
  69. // SDL_TimerID my_timer_id = SDL_AddTimer(1000, my_callbackfunc, my_callback_param);
  70.  
  71.  int done=0;
  72.  //while(done == 0){
  73.  
  74.  //QUIT PROGRAMM BY PRESSING ESCAPE BUTTON
  75.    SDL_Event event;
  76.  
  77.    /*while ( SDL_PollEvent(&event) ){
  78.      if ( event.type == SDL_QUIT ){
  79.       done = 1;
  80.      }
  81.      if ( event.type == SDL_KEYDOWN ){
  82.        if ( event.key.keysym.sym == SDLK_ESCAPE ){
  83.          done = 1;
  84.        }
  85.      }
  86.    } */
  87. /* Swap our buffer to display the current contents of buffer on screen */
  88.    DrawGLScene();
  89.  
  90.    glFlush();
  91.  
  92.    //struct{ GLubyte red, green, blue; } pixel;
  93.    //struct{ GLuint red, green, blue; } pixel2;
  94.    //     pixel2.red = 255;
  95.    //     pixel2.green = 255;
  96.     //    pixel2.blue = 255;
  97.     GLubyte data[WINDOWWIDTH][WINDOWHEIGHT][3];
  98.  
  99.    //glReadPixels(320, 240, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
  100.    //printf("%d %d %d ", pixel.red, pixel.green, pixel.blue);
  101.   for(int jp=0; jp<WINDOWHEIGHT/5; jp++) {
  102.     for(int ip=0; ip<WINDOWWIDTH/5; ip++) {
  103.         //glReadPixels(ip, jp, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
  104.         data[ip][jp][0]=250;
  105.         data[ip][jp][1]=250;
  106.         data[ip][jp][2]=250;
  107.         glDrawPixels(ip, jp, GL_RGB, GL_UNSIGNED_BYTE, &data[ip][jp][0]);
  108.     };
  109.    };
  110.  
  111.  
  112.    SDL_GL_SwapWindow(window); // осторожно, не дает считать РГБ!!!
  113.    //fps++;
  114. SDL_Delay(4000);
  115. //}
  116.  
  117.  return 0;
  118.  
  119. }
  120.  
  121. void DrawGLScene(){
  122.  
  123.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  124.  
  125.   glLoadIdentity();
  126.   glTranslatef(0.0f,0.0f,-10.0f); // сдвиг системы координат - в нашем случае по z
  127.  
  128.   glRotatef(400, 1.0f, 0.0f, 0.0f); // вращение вокруг оси x на угол xrf
  129.   glRotatef(400, 0.0f, 1.0f, 0.0f); // вращение вокруг оси y на угол yrf
  130.   glRotatef(400, 0.0f, 0.0f, 1.0f); // вращение вокруг оси z на угол zrf
  131.  
  132.  // glBegin(GL_QUADS); // задание примитива GL_QUADS - каждые четыре вершины образуют четырехугольник
  133.  
  134.   /*
  135.   В качестве параметра команде glBegin передается тип примитивов,
  136.   которые будут описываться между командами glBegin/glEnd.
  137.   Внутри указываются координаты вершин примитива.
  138.   */
  139.  
  140.   /*
  141.   Обратите внимание на формат команды glVertex3f. Тройка означает, что команде передаются три аргумента.
  142.   В данном случае это координаты в формате (x, y, z).
  143.   Сигнатура f означает, что параметры этой команды имеют тип float.
  144.   */
  145.  
  146. //Отрисовка шара
  147.  
  148. for (alpha = 0.0; alpha < PI; alpha += PI/gradation)
  149. {
  150.     glBegin(GL_TRIANGLE_STRIP);
  151.     for (beta = 0.0; beta < 2.01*PI; beta += PI/gradation)
  152.     {
  153.         x = radius*cos(beta)*sin(alpha);
  154.         y = radius*sin(beta)*sin(alpha);
  155.         z = radius*cos(alpha);
  156.         glColor3f(x, y, z);
  157.         glVertex3f(x, y, z);
  158.         x = radius*cos(beta)*sin(alpha + PI/gradation);
  159.         y = radius*sin(beta)*sin(alpha + PI/gradation);
  160.         z = radius*cos(alpha + PI/gradation);
  161.         glColor3f(x, y, z);
  162.         glVertex3f(x, y, z);
  163.     }
  164.     glEnd();
  165. }
  166.  
  167.  
  168. //Отрисовка цилиндра
  169.  
  170.     glBegin(GL_QUAD_STRIP);
  171.     alpha = 0.0f;
  172.         while(alpha < 2*PI ) {
  173.             x = r * cos(alpha);
  174.             y = r * sin(alpha);
  175.             glColor3f(x, y, l);
  176.             glVertex3f(x, y , l);
  177.             glVertex3f(x, y , -l);
  178.             alpha = alpha + PI/gradation;
  179.         }
  180.         glColor3f(r, 0.0f, l);
  181.         glVertex3f(r, 0.0f, l);
  182.         glVertex3f(r, 0.0f, -l);
  183.     glEnd();
  184.  
  185. //Отрисовка крыла 1
  186.  
  187.     glBegin(GL_POLYGON);
  188.     glColor3f(0.0f,0.5f,1.0f);
  189.  
  190.     for (alpha = 0.0; alpha < 2.01*PI; alpha += PI/3)
  191.     {
  192.     glVertex3f(2*radius*cos(alpha),2*radius*sin(alpha),l);
  193.     }
  194.  
  195.     glEnd();
  196.  
  197. //Отрисовка крыла 2
  198.  
  199.     glBegin(GL_POLYGON);
  200.     glColor3f(0.0f,0.5f,1.0f);
  201.  
  202.     for (alpha = 0.0; alpha < 2.01*PI; alpha += PI/3)
  203.     {
  204.     glVertex3f(2*radius*cos(alpha),2*radius*sin(alpha),-l);
  205.     }
  206.  
  207.     glEnd();
  208.  
  209.  
  210.   //xrf -= 0.15;
  211.   //yrf -= 0.2;
  212.   //zrf -= 0.25;
  213. }
  214.  
  215. Uint32 my_callbackfunc(Uint32 interval, void *param){
  216.  printf("FPS = %d\n", fps);
  217.  fps=0;
  218.  return interval;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement