Advertisement
Guest User

Tutka_3

a guest
Dec 11th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.35 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 240
  9. #define WINDOWWIDTH 360
  10.  
  11. struct{ GLubyte red, green, blue; } pixel;
  12.  
  13. const float PI = 3.141592f;
  14.  
  15. float x, y, z, alpha, beta; // Storage for coordinates and angles
  16. float radius = 1.0f;
  17. int gradation = 20;
  18.  
  19. //Параметры цилиндра
  20. const float l = 2.0f;
  21. const float r = 0.2f;
  22.  
  23. void DrawGLScene();
  24.  
  25.  
  26. int main(int argc, char* argv[]){
  27.  
  28.  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ){
  29.    printf("Unable to init SDL: %s\n", SDL_GetError());
  30.    exit(1);
  31.  }
  32.  
  33.  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  34.  SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
  35.  SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
  36.  SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
  37.  
  38.  SDL_Window* window = SDL_CreateWindow("SDL2/OpenGL Demo", 60, 60, WINDOWWIDTH, WINDOWHEIGHT, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
  39.  SDL_Window* render = SDL_CreateWindow("SDL2/Raytracing", 100+WINDOWWIDTH, 60, WINDOWWIDTH, WINDOWHEIGHT, SDL_WINDOW_RESIZABLE); //приплюсовали чтобы окна стояли рядом, а не на друг друге
  40.  
  41.  SDL_Renderer* renderer = SDL_CreateRenderer(render, -1, SDL_RENDERER_ACCELERATED); // создание рендера
  42.  
  43.  if ( window == NULL ){
  44.    printf("Unable to set 640x480 video: %s\n", SDL_GetError());
  45.    exit(1);
  46.  }
  47.  if ( render == NULL ){
  48.    printf("Unable to set 640x480 render: %s\n", SDL_GetError());
  49.    exit(1);
  50.  }
  51.  
  52. /* Create an OpenGL context associated with the window. */
  53.  SDL_GLContext glcontext = SDL_GL_CreateContext(window);
  54.  
  55.  /* This makes our buffer swap syncronized with the monitor's vertical refresh */
  56.  
  57.  /* Clear context */
  58.  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  59.  glClearDepth(1.0);
  60.  glDepthFunc(GL_LESS);
  61.  glEnable(GL_DEPTH_TEST);
  62.  glShadeModel(GL_SMOOTH);
  63.  glMatrixMode(GL_PROJECTION); // Apply following to projection matrix - is this correct?
  64.  glLoadIdentity(); // Reset first
  65.  gluPerspective(45.0f,640/480,0.1f,200.0f); // Set perspective
  66.  glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here?
  67.  
  68.  int done=0;
  69.  while(done == 0){
  70.  
  71.  //QUIT PROGRAMM BY PRESSING ESCAPE BUTTON
  72.    SDL_Event event;
  73.  
  74.    while ( SDL_PollEvent(&event) ){
  75.      if ( event.type == SDL_QUIT ){
  76.       done = 1;
  77.      }
  78.      if ( event.type == SDL_KEYDOWN ){
  79.        if ( event.key.keysym.sym == SDLK_ESCAPE ){
  80.          done = 1;
  81.        }
  82.      }
  83.    }
  84. /* Swap our buffer to display the current contents of buffer on screen */
  85.    DrawGLScene();
  86.    glFlush();
  87.    SDL_GL_SwapWindow(window);
  88.  
  89. // Перерисовка нашего файтера
  90.  
  91. for (int j = 0; j < WINDOWHEIGHT; j++){
  92.                      for (int i = 0; i < WINDOWWIDTH; i++){
  93.                             glReadPixels(i, j, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
  94.                                 if (pixel.red > 0 || pixel.green > 0 || pixel.blue > 0){
  95.  
  96.  
  97.  
  98.  
  99.                                 SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
  100.                                 SDL_RenderDrawPoint(renderer, i, WINDOWHEIGHT-j);
  101.                                 SDL_RenderPresent(renderer);
  102.                                 }
  103.                             }
  104.             };
  105.  
  106.    //fps++;
  107.  }
  108. return 0;
  109.  
  110. }
  111.  
  112. void DrawGLScene(){
  113.  
  114.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  115.  
  116.   glLoadIdentity();
  117.   glTranslatef(0.0f,0.0f,-8.0f); // сдвиг системы координат - в нашем случае по z
  118.  
  119.   glRotatef(400, 1.0f, 0.0f, 0.0f); // вращение вокруг оси x на угол xrf
  120.   glRotatef(400, 0.0f, 1.0f, 0.0f); // вращение вокруг оси y на угол yrf
  121.   glRotatef(400, 0.0f, 0.0f, 1.0f); // вращение вокруг оси z на угол zrf
  122.  
  123.  
  124. //Отрисовка шара
  125.  
  126. for (alpha = 0.0; alpha < PI; alpha += PI/gradation)
  127. {
  128.     glBegin(GL_TRIANGLE_STRIP);
  129.     for (beta = 0.0; beta < 2.01*PI; beta += PI/gradation)
  130.     {
  131.         x = radius*cos(beta)*sin(alpha);
  132.         y = radius*sin(beta)*sin(alpha);
  133.         z = radius*cos(alpha);
  134.         glColor3f(x, y, z);
  135.         glVertex3f(x, y, z);
  136.         x = radius*cos(beta)*sin(alpha + PI/gradation);
  137.         y = radius*sin(beta)*sin(alpha + PI/gradation);
  138.         z = radius*cos(alpha + PI/gradation);
  139.         glColor3f(x, y, z);
  140.         glVertex3f(x, y, z);
  141.     }
  142.     glEnd();
  143. }
  144.  
  145.  
  146. //Отрисовка цилиндра
  147.  
  148.     glBegin(GL_QUAD_STRIP);
  149.     alpha = 0.0f;
  150.         while(alpha < 2*PI ) {
  151.             x = r * cos(alpha);
  152.             y = r * sin(alpha);
  153.             glColor3f(x, y, l);
  154.             glVertex3f(x, y , l);
  155.             glVertex3f(x, y , -l);
  156.             alpha = alpha + PI/gradation;
  157.         }
  158.         glColor3f(r, 0.0f, l);
  159.         glVertex3f(r, 0.0f, l);
  160.         glVertex3f(r, 0.0f, -l);
  161.     glEnd();
  162.  
  163. //Отрисовка крыла 1
  164.  
  165.     glBegin(GL_POLYGON);
  166.     glColor3f(0.0f,0.5f,1.0f);
  167.  
  168.     for (alpha = 0.0; alpha < 2.01*PI; alpha += PI/3)
  169.     {
  170.     glVertex3f(2*radius*cos(alpha),2*radius*sin(alpha),l);
  171.     }
  172.  
  173.     glEnd();
  174.  
  175. //Отрисовка крыла 2
  176.  
  177.     glBegin(GL_POLYGON);
  178.     glColor3f(0.0f,0.5f,1.0f);
  179.  
  180.     for (alpha = 0.0; alpha < 2.01*PI; alpha += PI/3)
  181.     {
  182.     glVertex3f(2*radius*cos(alpha),2*radius*sin(alpha),-l);
  183.     }
  184.  
  185.     glEnd();
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement