Advertisement
Sk8erPeter

OpenGL: glViewport() testing

Oct 15th, 2013
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.78 KB | None | 0 0
  1. //=============================================================================================
  2. // Szamitogepes grafika hazi feladat keret. Ervenyes 2013-tol.
  3. // A //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. // sorokon beluli reszben celszeru garazdalkodni, mert a tobbit ugyis toroljuk.
  5. // A beadott program csak ebben a fajlban lehet, a fajl 1 byte-os ASCII karaktereket tartalmazhat.
  6. // Tilos:
  7. // - mast "beincludolni", illetve mas konyvtarat hasznalni
  8. // - faljmuveleteket vegezni (printf is fajlmuvelet!)
  9. // - new operatort hivni az onInitialization függvényt kivéve, a lefoglalt adat korrekt felszabadítása nélkül
  10. // - felesleges programsorokat a beadott programban hagyni
  11. // - tovabbi kommenteket a beadott programba irni a forrasmegjelolest kommentjeit kiveve
  12. // ---------------------------------------------------------------------------------------------
  13. // A feladatot ANSI C++ nyelvu forditoprogrammal ellenorizzuk, a Visual Studio-hoz képesti elteresekrol
  14. // es a leggyakoribb hibakrol (pl. ideiglenes objektumot nem lehet referencia tipusnak ertekul adni)
  15. // a hazibeado portal ad egy osszefoglalot.
  16. // ---------------------------------------------------------------------------------------------
  17. // A feladatmegoldasokban csak olyan gl/glu/glut fuggvenyek hasznalhatok, amelyek
  18. // 1. Az oran a feladatkiadasig elhangzottak ES (logikai AND muvelet)
  19. // 2. Az alabbi listaban szerepelnek:
  20. // Rendering pass: glBegin, glVertex[2|3]f, glColor3f, glNormal3f, glTexCoord2f, glEnd, glDrawPixels
  21. // Transzformaciok: glViewport, glMatrixMode, glLoadIdentity, glMultMatrixf, gluOrtho2D,
  22. // glTranslatef, glRotatef, glScalef, gluLookAt, gluPerspective, glPushMatrix, glPopMatrix,
  23. // Illuminacio: glMaterialfv, glMaterialfv, glMaterialf, glLightfv
  24. // Texturazas: glGenTextures, glBindTexture, glTexParameteri, glTexImage2D, glTexEnvi,
  25. // Pipeline vezerles: glShadeModel, glEnable/Disable a kovetkezokre:
  26. // GL_LIGHTING, GL_NORMALIZE, GL_DEPTH_TEST, GL_CULL_FACE, GL_TEXTURE_2D, GL_BLEND, GL_LIGHT[0..7]
  27. //
  28. // NYILATKOZAT
  29. // ---------------------------------------------------------------------------------------------
  30. // Nev    : Haraszin Peter
  31. // Neptun : O70NT3
  32. // ---------------------------------------------------------------------------------------------
  33. // ezennel kijelentem, hogy a feladatot magam keszitettem, es ha barmilyen segitseget igenybe vettem vagy
  34. // mas szellemi termeket felhasznaltam, akkor a forrast es az atvett reszt kommentekben egyertelmuen jeloltem.
  35. // A forrasmegjeloles kotelme vonatkozik az eloadas foliakat es a targy oktatoi, illetve a
  36. // grafhazi doktor tanacsait kiveve barmilyen csatornan (szoban, irasban, Interneten, stb.) erkezo minden egyeb
  37. // informaciora (keplet, program, algoritmus, stb.). Kijelentem, hogy a forrasmegjelolessel atvett reszeket is ertem,
  38. // azok helyessegere matematikai bizonyitast tudok adni. Tisztaban vagyok azzal, hogy az atvett reszek nem szamitanak
  39. // a sajat kontribucioba, igy a feladat elfogadasarol a tobbi resz mennyisege es minosege alapjan szuletik dontes.
  40. // Tudomasul veszem, hogy a forrasmegjeloles kotelmenek megsertese eseten a hazifeladatra adhato pontokat
  41. // negativ elojellel szamoljak el es ezzel parhuzamosan eljaras is indul velem szemben.
  42. //=============================================================================================
  43.  
  44. #include <math.h>
  45. #include <stdlib.h>
  46.  
  47. #if defined(__APPLE__)
  48. #include <OpenGL/gl.h>
  49. #include <OpenGL/glu.h>
  50. #include <GLUT/glut.h>
  51. #else
  52. #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
  53. #include <windows.h>
  54. #endif
  55. #include <GL/gl.h>
  56. #include <GL/glu.h>
  57. #include <GL/glut.h>
  58. #include <stdio.h>
  59. #endif
  60.  
  61. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  62. // Innentol modosithatod...
  63.  
  64. /**
  65.  * 3D Vektor
  66.  */
  67. struct Vector {
  68.   float x, y, z;
  69.  
  70.   Vector() {
  71.     x = y = z = 0;
  72.   }
  73.  
  74.   Vector(float x0, float y0, float z0 = 0) {
  75.     x = x0;
  76.     y = y0;
  77.     z = z0;
  78.   }
  79.  
  80.   Vector operator*(float a) {
  81.     return Vector(x * a, y * a, z * a);
  82.   }
  83.  
  84.   Vector operator+(const Vector& v) {
  85.     return Vector(x + v.x, y + v.y, z + v.z);
  86.   }
  87.  
  88.   Vector operator-(const Vector& v) {
  89.     return Vector(x - v.x, y - v.y, z - v.z);
  90.   }
  91.  
  92.   float operator*(const Vector& v) { // dot product
  93.     return (x * v.x + y * v.y + z * v.z);
  94.   }
  95.  
  96.   Vector operator%(const Vector& v) { // cross product
  97.     return Vector(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x);
  98.   }
  99.  
  100.   float Length() {
  101.     return sqrt(x * x + y * y + z * z);
  102.   }
  103. };
  104.  
  105. /**
  106.  * Spektrum illetve szin
  107.  */
  108. struct Color {
  109.   float r, g, b;
  110.  
  111.   Color() {
  112.     r = g = b = 0;
  113.   }
  114.  
  115.   Color(float r0, float g0, float b0) {
  116.     r = r0;
  117.     g = g0;
  118.     b = b0;
  119.   }
  120.  
  121.   Color operator*(float a) {
  122.     return Color(r * a, g * a, b * a);
  123.   }
  124.  
  125.   Color operator*(const Color& c) {
  126.     return Color(r * c.r, g * c.g, b * c.b);
  127.   }
  128.  
  129.   Color operator+(const Color& c) {
  130.     return Color(r + c.r, g + c.g, b + c.b);
  131.   }
  132. };
  133.  
  134. long time = 0;
  135. long old_time = 0;
  136.  
  137. const int screenWidth = 600; // alkalmazas ablak felbontasa
  138. const int screenHeight = 600;
  139.  
  140. Color image[screenWidth*screenHeight]; // egy alkalmazas ablaknyi kep
  141.  
  142. const float camera_size = 50.0f;
  143.  
  144. /**
  145.  * Inicializacio, a program futasanak kezdeten, az OpenGL-kontextus letrehozasa utan hivodik meg (ld. main() fv.)
  146.  */
  147. void onInitialization() {
  148.   //  glViewport(0, 0, screenWidth, screenHeight);
  149.   // !!! AZ ALÁBBI HATÁSTALAN!!! EGYSZER legalább szükséges meghívni az onDisplay-ben is
  150.   glViewport(0, 0, screenWidth, screenHeight / 2.0);
  151.  
  152.   // Peldakent keszitunk egy kepet az operativ memoriaba
  153.   for (int Y = 0; Y < screenHeight; Y++)
  154.     for (int X = 0; X < screenWidth; X++)
  155.       image[Y * screenWidth + X] = Color((float) X / screenWidth, (float) Y / screenHeight, 0);
  156.  
  157.   glMatrixMode(GL_PROJECTION);
  158.   glLoadIdentity();
  159.   gluOrtho2D(0.0, camera_size, 0.0, camera_size);
  160.  
  161. }
  162.  
  163. bool glViewportAlreadyCalledInOnDisplay = false;
  164.  
  165. /**
  166.  * Rajzolas, ha az alkalmazas ablak ervenytelenne valik, akkor ez a fuggveny hivodik meg
  167.  */
  168. void onDisplay() {
  169.   glClearColor(0.1f, 0.2f, 0.3f, 1.0f); // torlesi szin beallitasa
  170.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // kepernyo torles
  171.  
  172.   //  // HA ITT MÁR EGYETLEN EGYSZER MEGHÍVTAM, AKKOR ÉRVÉNYESÜL, nem módosul ez a beállítás
  173.   //  if(!glViewportAlreadyCalledInOnDisplay){
  174.   //    glViewport(0, 0, screenWidth, screenHeight/2.0);
  175.   //    glViewportAlreadyCalledInOnDisplay = true;
  176.   //  }
  177.  
  178.   // Peldakent atmasoljuk a kepet a rasztertarba
  179.   glDrawPixels(screenWidth, screenHeight, GL_RGB, GL_FLOAT, image);
  180.  
  181.   // bal also
  182.   glBegin(GL_TRIANGLES);
  183.   glColor3f(0.0f, 0.0f, 1.0f);
  184.   glVertex2f(0.0f, 0.0f);
  185.   glVertex2f(10.0f, 0.0f);
  186.   glVertex2f(10.0f, 10.0f);
  187.   glEnd();
  188.  
  189.  
  190.   // kozep
  191.   glBegin(GL_TRIANGLES);
  192.   glColor3f(0.34, 1, 0);
  193.   glVertex2f(10.0f, 20.0f);
  194.   glVertex2f(60.0f, 20.0f);
  195.   glVertex2f(60.0f, 70.0f);
  196.   glEnd();
  197.  
  198.  
  199.   // max koordinátában
  200.   glBegin(GL_TRIANGLES);
  201.   glColor3f(1, 0, 1);
  202.   glVertex2f(60.0f, 80.0f);
  203.   glVertex2f(70.0f, 80.0f);
  204.   glVertex2f(70.0f, 90.0f);
  205.   glEnd();
  206.  
  207.   // jobb fölső sarokban
  208.   glBegin(GL_TRIANGLES);
  209.   glColor3f(1, 0, 0);
  210.   glVertex2f(90.0f, 90.0f);
  211.   glVertex2f(100.0f, 90.0f);
  212.   glVertex2f(100.0f, 100.0f);
  213.   glEnd();
  214.  
  215.  
  216.   // jobb alsó sarokban
  217.   glBegin(GL_TRIANGLES);
  218.   glColor3f(0, 0.5, 0);
  219.   glVertex2f(90.0f, 0.0f);
  220.   glVertex2f(100.0f, 0.0f);
  221.   glVertex2f(100.0f, 10.0f);
  222.   glEnd();
  223.  
  224.   glutSwapBuffers(); // Buffercsere: rajzolas vege
  225.  
  226. }
  227.  
  228. /**
  229.  * Billentyuzetesemenyeket lekezelo fuggveny (lenyomas)
  230.  * @param key
  231.  * @param x
  232.  * @param y
  233.  */
  234. void onKeyboard(unsigned char key, int x, int y) {
  235.   switch (key) {
  236.       // d beture rajzold ujra a kepet
  237.     case 'd':
  238.       glutPostRedisplay();
  239.       break;
  240.       // s pressed
  241.     case 's':
  242.     {
  243.       // most ezt az igen egyszerű tilitolit kiszedtem, nehogy plágiumgyanú érjen bárkit :D
  244.     }
  245.       break;
  246.       // space pressed
  247.     case ' ':
  248.     {
  249.  
  250.     }
  251.       break;
  252.       // Esc pressed
  253.     case 27:
  254.       exit(0);
  255.       break;
  256.     case 'y':
  257.       glMatrixMode(GL_PROJECTION);
  258.       glLoadIdentity();
  259.       gluOrtho2D(0.0, 100.0, 0.0, 100.0);
  260.       glutPostRedisplay();
  261.       break;
  262.     case 'x':
  263.       glMatrixMode(GL_PROJECTION);
  264.       glLoadIdentity();
  265.       gluOrtho2D(0.0, 50.0, 0.0, 50.0);
  266.       glutPostRedisplay();
  267.       break;
  268.     case 'c':
  269.       glMatrixMode(GL_PROJECTION);
  270.       glLoadIdentity();
  271.       gluOrtho2D(25.0, 75.0, 25.0, 75.0);
  272.       glutPostRedisplay();
  273.       break;
  274.     case 'v':
  275.       glMatrixMode(GL_PROJECTION);
  276.       glLoadIdentity();
  277.       gluOrtho2D(50.0, 100.0, 50.0, 100.0);
  278.       glutPostRedisplay();
  279.       break;
  280.     default:
  281.       break;
  282.   }
  283. }
  284.  
  285. /**
  286.  * Billentyuzetesemenyeket lekezelo fuggveny (felengedes)
  287.  * @param key
  288.  * @param x
  289.  * @param y
  290.  */
  291. void onKeyboardUp(unsigned char key, int x, int y) {
  292.  
  293. }
  294.  
  295. /**
  296.  * Egeresemenyeket lekezelo fuggveny
  297.  * @param button
  298.  * @param state
  299.  * @param x
  300.  * @param y
  301.  */
  302. void onMouse(int button, int state, int x, int y) {
  303.   if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) // A GLUT_LEFT_BUTTON / GLUT_RIGHT_BUTTON illetve GLUT_DOWN / GLUT_UP
  304.     glutPostRedisplay(); // Ilyenkor rajzold ujra a kepet
  305. }
  306.  
  307. /**
  308.  * Egermozgast lekezelo fuggveny
  309.  * @param x
  310.  * @param y
  311.  */
  312. void onMouseMotion(int x, int y) {
  313.  
  314. }
  315.  
  316. /**
  317.  * `Idle' esemenykezelo, jelzi, hogy az ido telik, az Idle esemenyek frekvenciajara csak a 0 a garantalt minimalis ertek
  318.  */
  319. void onIdle() {
  320.   old_time = time;
  321.   time = glutGet(GLUT_ELAPSED_TIME); // program inditasa ota eltelt ido
  322.  
  323.   glutPostRedisplay(); // felrajzolás
  324. }
  325.  
  326. // ...Idaig modosithatod
  327. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  328.  
  329. // A C++ program belepesi pontja, a main fuggvenyt mar nem szabad bantani
  330.  
  331. int main(int argc, char **argv) {
  332.   glutInit(&argc, argv); // GLUT inicializalasa
  333.   glutInitWindowSize(600, 600); // Alkalmazas ablak kezdeti merete 600x600 pixel
  334.   glutInitWindowPosition(100, 100); // Az elozo alkalmazas ablakhoz képest hol tunik fel
  335.   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); // 8 bites R,G,B,A + dupla buffer + melyseg buffer
  336.  
  337.   glutCreateWindow("Grafika hazi feladat"); // Alkalmazas ablak megszuletik es megjelenik a kepernyon
  338.  
  339.   glMatrixMode(GL_MODELVIEW); // A MODELVIEW transzformaciot egysegmatrixra inicializaljuk
  340.   glLoadIdentity();
  341.   glMatrixMode(GL_PROJECTION); // A PROJECTION transzformaciot egysegmatrixra inicializaljuk
  342.   glLoadIdentity();
  343.  
  344.   onInitialization(); // Az altalad irt inicializalast lefuttatjuk
  345.  
  346.   glutDisplayFunc(onDisplay); // Esemenykezelok regisztralasa
  347.   glutMouseFunc(onMouse);
  348.   glutIdleFunc(onIdle);
  349.   glutKeyboardFunc(onKeyboard);
  350.   glutKeyboardUpFunc(onKeyboardUp);
  351.   glutMotionFunc(onMouseMotion);
  352.  
  353.   glutMainLoop(); // Esemenykezelo hurok
  354.  
  355.   return 0;
  356. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement