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 480
- #define WINDOWWIDTH 640
- 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;
- float xrf, yrf, zrf;
- int fps=0;
- void DrawGLScene();
- Uint32 my_callbackfunc(Uint32 interval, void *param);
- void* my_callback_param;
- int main(int argc, char* argv[]){
- if ( SDL_Init(/*SDL_INIT_TIMER|*/SDL_INIT_VIDEO) < 0 ){
- printf("Unable to init SDL: %s\n", SDL_GetError());
- exit(1);
- }
- atexit(SDL_Quit);
- 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", 30, 30, WINDOWWIDTH, WINDOWHEIGHT, SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
- //SDL_Window* render = SDL_CreateWindow("SDL2/Raytracing", 30+WINDOWWIDTH, 30, WINDOWWIDTH, WINDOWHEIGHT, SDL_WINDOW_RESIZABLE); //приплюсовали чтобы окна стояли рядом, а не на друг друге
- 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);
- //SDL_GL_SetSwapInterval(1);
- /* 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.4f,100.0f); // Set perspective
- glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here?
- // SDL_TimerID my_timer_id = SDL_AddTimer(1000, my_callbackfunc, my_callback_param);
- int done=0;
- //while(done == 0){
- //QUIT PROGRAMM BY PRESSING ESCAPE BUTTON
- SDL_Event event;
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- /*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();
- //struct{ GLubyte red, green, blue; } pixel;
- //struct{ GLuint red, green, blue; } pixel2;
- // pixel2.red = 255;
- // pixel2.green = 255;
- // pixel2.blue = 255;
- GLubyte data[WINDOWWIDTH][WINDOWHEIGHT][3];
- //glDrawBuffer(GL_FRONT_AND_BACK);
- //glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- //glReadPixels(320, 240, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
- //printf("%d %d %d ", pixel.red, pixel.green, pixel.blue);
- for(int jp=0; jp<WINDOWHEIGHT; jp++) {
- for(int ip=0; ip<WINDOWWIDTH; ip++) {
- //glReadPixels(ip, jp, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pixel);
- data[ip][jp][0]=250;
- data[ip][jp][1]=230;
- data[ip][jp][2]=10;
- glRasterPos3i(ip, jp-240, 1);
- glDrawPixels(1, 1, GL_RGB, GL_UNSIGNED_BYTE, data);
- glFlush();
- //glDrawPixels(ip, jp, GL_RGB, GL_UNSIGNED_BYTE, &data[ip][jp][0]);
- };
- };
- glPixelStorei(GL_PACK_ALIGNMENT, 1);
- //glDrawBuffer(GL_FRONT_AND_BACK);
- SDL_GL_SwapWindow(window);
- // осторожно, не дает считать РГБ!!!
- //fps++;
- SDL_Delay(4000);
- //}
- return 0;
- }
- void DrawGLScene(){
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(0.0f,0.0f,-50.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
- // glBegin(GL_QUADS); // задание примитива GL_QUADS - каждые четыре вершины образуют четырехугольник
- /*
- В качестве параметра команде glBegin передается тип примитивов,
- которые будут описываться между командами glBegin/glEnd.
- Внутри указываются координаты вершин примитива.
- */
- /*
- Обратите внимание на формат команды glVertex3f. Тройка означает, что команде передаются три аргумента.
- В данном случае это координаты в формате (x, y, z).
- Сигнатура f означает, что параметры этой команды имеют тип float.
- */
- //Отрисовка шара
- 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();
- //xrf -= 0.15;
- //yrf -= 0.2;
- //zrf -= 0.25;
- }
- Uint32 my_callbackfunc(Uint32 interval, void *param){
- printf("FPS = %d\n", fps);
- fps=0;
- return interval;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement