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>
- #include <math.h>
- //задаем размеры окна
- #define WINDOWHEIGHT 240
- #define WINDOWWIDTH 360
- struct{ GLubyte red, green, blue; } pixel;
- const float PI = 3.141592f;
- float x, y, z, alpha, beta; // Storage for coordinates and angles
- float radius = 1.0f;
- int gradation = 20;
- //Параметры цилиндра
- const float l = 2.0f;
- const float r = 0.2f;
- void DrawGLScene();
- int main(int argc, char* argv[]){
- if ( SDL_Init(SDL_INIT_VIDEO) < 0 ){
- printf("Unable to init SDL: %s\n", SDL_GetError());
- exit(1);
- }
- 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", 60, 60, WINDOWWIDTH, WINDOWHEIGHT, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
- SDL_Window* render = SDL_CreateWindow("SDL2/Raytracing", 100+WINDOWWIDTH, 60, WINDOWWIDTH, WINDOWHEIGHT, SDL_WINDOW_RESIZABLE); //приплюсовали чтобы окна стояли рядом, а не на друг друге
- SDL_Renderer* renderer = SDL_CreateRenderer(render, -1, SDL_RENDERER_ACCELERATED); // создание рендера
- if ( window == NULL ){
- printf("Unable to set 640x480 video: %s\n", SDL_GetError());
- exit(1);
- }
- if ( render == NULL ){
- printf("Unable to set 640x480 render: %s\n", SDL_GetError());
- exit(1);
- }
- /* Create an OpenGL context associated with the window. */
- SDL_GLContext glcontext = SDL_GL_CreateContext(window);
- /* 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); // Apply following to projection matrix - is this correct?
- glLoadIdentity(); // Reset first
- gluPerspective(45.0f,640/480,0.1f,200.0f); // Set perspective
- glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here?
- int done=0;
- while(done == 0){
- //QUIT PROGRAMM BY PRESSING ESCAPE BUTTON
- 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);
- // Перерисовка нашего файтера
- for (int j = 0; j < WINDOWHEIGHT; j++){
- for (int i = 0; i < WINDOWWIDTH; i++){
- glReadPixels(i, j, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
- if (pixel.red > 0 || pixel.green > 0 || pixel.blue > 0){
- SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
- SDL_RenderDrawPoint(renderer, i, WINDOWHEIGHT-j);
- SDL_RenderPresent(renderer);
- }
- }
- };
- //fps++;
- }
- return 0;
- }
- void DrawGLScene(){
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(0.0f,0.0f,-8.0f); // сдвиг системы координат - в нашем случае по z
- glRotatef(400, 1.0f, 0.0f, 0.0f); // вращение вокруг оси x на угол xrf
- glRotatef(400, 0.0f, 1.0f, 0.0f); // вращение вокруг оси y на угол yrf
- glRotatef(400, 0.0f, 0.0f, 1.0f); // вращение вокруг оси z на угол zrf
- //Отрисовка шара
- for (alpha = 0.0; alpha < PI; alpha += PI/gradation)
- {
- glBegin(GL_TRIANGLE_STRIP);
- for (beta = 0.0; beta < 2.01*PI; beta += PI/gradation)
- {
- x = radius*cos(beta)*sin(alpha);
- y = radius*sin(beta)*sin(alpha);
- z = radius*cos(alpha);
- glColor3f(x, y, z);
- glVertex3f(x, y, z);
- x = radius*cos(beta)*sin(alpha + PI/gradation);
- y = radius*sin(beta)*sin(alpha + PI/gradation);
- z = radius*cos(alpha + PI/gradation);
- glColor3f(x, y, z);
- glVertex3f(x, y, z);
- }
- glEnd();
- }
- //Отрисовка цилиндра
- glBegin(GL_QUAD_STRIP);
- alpha = 0.0f;
- while(alpha < 2*PI ) {
- x = r * cos(alpha);
- y = r * sin(alpha);
- glColor3f(x, y, l);
- glVertex3f(x, y , l);
- glVertex3f(x, y , -l);
- alpha = alpha + PI/gradation;
- }
- glColor3f(r, 0.0f, l);
- glVertex3f(r, 0.0f, l);
- glVertex3f(r, 0.0f, -l);
- glEnd();
- //Отрисовка крыла 1
- glBegin(GL_POLYGON);
- glColor3f(0.0f,0.5f,1.0f);
- for (alpha = 0.0; alpha < 2.01*PI; alpha += PI/3)
- {
- glVertex3f(2*radius*cos(alpha),2*radius*sin(alpha),l);
- }
- glEnd();
- //Отрисовка крыла 2
- glBegin(GL_POLYGON);
- glColor3f(0.0f,0.5f,1.0f);
- for (alpha = 0.0; alpha < 2.01*PI; alpha += PI/3)
- {
- glVertex3f(2*radius*cos(alpha),2*radius*sin(alpha),-l);
- }
- glEnd();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement