Advertisement
Guest User

LAB 6 - Snegur T

a guest
May 27th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.30 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  GLFW Lab 3.1
  4. //
  5. //  Created by Кирилл Снегур on 19.03.2019.
  6. //  Copyright © 2019 ALLMIGHT DEVELOPMENT. All rights reserved.
  7. //
  8. //
  9. #include <iostream>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <iostream>
  13. #include <sstream>
  14. #include <fstream>
  15. #include <GL/glew.h>
  16. #include <GLFW/glfw3.h>
  17. #include <cmath>
  18. #include <math.h>
  19.  
  20. using namespace std;
  21.  
  22. int WIDTH = 800, HEIGHT = 800;
  23.  
  24. float x = 0, y = 0, z = 0;
  25. float RotateX = 0.0f, RotateY = 0.0f, RotateZ = 0.0f;
  26. float PositionX = 1.0f, PositionY = 1.0f, PositionZ = 1.0f;
  27.  
  28. bool animation = false;
  29. bool timingWayUp = true;
  30. float timing = 0;
  31. float timingX, timingY, timingZ;
  32.  
  33. typedef struct {
  34.     float x, y, z;
  35. } pointer;
  36.  
  37.  
  38. pointer pOne {0, 0, 0}, pTwo {0.5f, 0.9f, 0}, pThree {0, 0.5f, 0};
  39.  
  40. int circleVelue = 30, triangleValue = 20;
  41.  
  42. GLfloat PologonModeValue = GL_FILL;
  43.  
  44. GLfloat phi = asin(0.25 / sqrt(2.0));
  45. GLfloat teta = asin(0.25 / sqrt(2.0 - 0.25 * 0.25));
  46.  
  47. GLfloat TransformationMatrix[4][4] = {
  48.     {1, 0, 0, 0},
  49.     {0, 1, 0, 0},
  50.     {0, 0, 1, 0},
  51.     {0, 0, 0, 1},
  52. };
  53.  
  54.  
  55. static double PI = 3.1415926535897932384626433832795;
  56.  
  57. struct RGBA {
  58.     float r, g, b, a;
  59. };
  60.  
  61. bool lighting = true;
  62. RGBA globalAmbient { 0.5f, 0.5f, 0.5f, 1 };
  63. RGBA Ambient = { 0.5, 0.5, 0.5, 1 };
  64. RGBA Diffuse = { 0.5, 0.5, 0.5, 1 };
  65. RGBA Specular = { 0.5, 0.5, 0.5, 1 };
  66. float Shininess = 5.5f;
  67.  
  68. bool texture = true;
  69. int textureValue = 0;
  70.  
  71. int getTextureValue(const char *path) {
  72.     ifstream texture(path);
  73.     ostringstream bufferStream;
  74.     bufferStream << texture.rdbuf();
  75.     const char* binareTexture = bufferStream.str().c_str();
  76.     texture.close();
  77.    
  78.     int width = *(int*)&(binareTexture[0x12]);
  79.     int height = *(int*)&(binareTexture[0x16]);
  80.    
  81.     GLuint textureVal;
  82.     glGenTextures(1, &textureVal);
  83.     glBindTexture(GL_TEXTURE_2D, textureVal);
  84.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  85.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  86.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  87.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  88.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, binareTexture /*+ dataPos*/);
  89.     glBindTexture(GL_TEXTURE_2D, 0);
  90.     return textureVal;
  91. }
  92.  
  93. void uploadData() {
  94.     std::ofstream st("../scene.txt");
  95.     st << WIDTH << " " << HEIGHT << endl;
  96.    
  97.     st << x << " " << y << " " << z << endl;
  98.     st << RotateX << " " << RotateY << " " << RotateZ << endl;
  99.     st << PositionX << " " << PositionY << " " << PositionZ << endl;
  100.    
  101.     st << animation << endl;
  102.     st << timingWayUp << endl;
  103.     st << timing << " " << timingX << " " << timingY << " " << timingZ << endl;
  104.    
  105.     pointer pOne {0, 0, 0}, pTwo {0.0f, 0.5f, 0}, pThree {0, 0.5f, 0};
  106.    
  107.     st << pOne.x << " " << pOne.y << " " << pOne.z << endl;
  108.     st << pTwo.x << " " << pTwo.y << " " << pTwo.z << endl;
  109.     st << pThree.x << " " << pThree.y << " " << pThree.z << endl;
  110.    
  111.     st << circleVelue << " " << triangleValue << endl;
  112.    
  113.     st << PologonModeValue << endl;
  114.    
  115.     st << globalAmbient.r << " " << globalAmbient.g << " " << globalAmbient.b << endl;
  116.     st << Ambient.r << " " << Ambient.g << " " << Ambient.b << endl;
  117.     st << Diffuse.r << " " << Diffuse.g << " " << Diffuse.b << endl;
  118.     st << Specular.r << " " << Specular.g << " " << Specular.b << endl;
  119.    
  120.     st << texture << endl;
  121.    
  122.     st.close();
  123. }
  124.  
  125. void downloadData() {
  126.     std::ifstream st("../scene.txt");
  127.     st >> WIDTH >> HEIGHT;
  128.    
  129.     st >> x >> y >> z;
  130.     st >> RotateX >> RotateY >> RotateZ;
  131.     st >> PositionX >> PositionY >> PositionZ;
  132.    
  133.     st >> animation;
  134.     st >> timingWayUp;
  135.     st >> timing >> timingX >> timingY >> timingZ;
  136.    
  137.    
  138.     st >> pOne.x >> pOne.y >> pOne.z;
  139.     st >> pTwo.x >> pTwo.y >> pTwo.z;
  140.     st >> pThree.x >> pThree.y >> pThree.z;
  141.    
  142.     st >> circleVelue >> triangleValue;
  143.    
  144.     st >> PologonModeValue;
  145.    
  146.     st >> globalAmbient.r >> globalAmbient.g >> globalAmbient.b;
  147.     st >> Ambient.r >> Ambient.g >> Ambient.b;
  148.     st >> Diffuse.r >> Diffuse.g >> Diffuse.b;
  149.     st >> Specular.r >> Specular.g >> Specular.b;
  150.    
  151.     st >> texture;
  152.    
  153.     st.close();
  154. }
  155.  
  156.  
  157.  
  158. void framebuffer_size_callback(GLFWwindow* window, int width, int height){
  159.     if(width>height)
  160.     {
  161.         glViewport((width-height)/2, 0, std::min(width,height), std::min(width,height));
  162.     }
  163.     else
  164.         glViewport(0, (height-width)/2, std::min(width,height), std::min(width,height));
  165. };
  166.  
  167. void keyCallback(GLFWwindow * window, int key, int scancode, int action, int mode){
  168.     GLfloat step = 0.05f;
  169.     GLfloat rotateStep = 5.0f;
  170.     GLfloat valueStep = 1.0f;
  171.     if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
  172.         glfwSetWindowShouldClose(window, GL_TRUE);
  173.    
  174.     if (action == GLFW_PRESS || action == GLFW_REPEAT) {
  175.         switch (key) {
  176.             case GLFW_KEY_D:
  177.                 RotateX -= rotateStep;
  178.                 break;
  179.             case GLFW_KEY_A:
  180.                 RotateX += rotateStep;
  181.                 break;
  182.             case GLFW_KEY_S:
  183.                 RotateY -= rotateStep;
  184.                 break;
  185.             case GLFW_KEY_W:
  186.                 RotateY += rotateStep;
  187.                 break;
  188.             case GLFW_KEY_Q:
  189.                 RotateZ += rotateStep;
  190.                 break;
  191.             case GLFW_KEY_E:
  192.                 RotateZ -= rotateStep;
  193.                 break;
  194.             case GLFW_KEY_LEFT:
  195.                 x -= step;
  196.                 break;
  197.             case GLFW_KEY_RIGHT:
  198.                 x += step;
  199.                 break;
  200.             case GLFW_KEY_UP:
  201.                 y += step;
  202.                 break;
  203.             case GLFW_KEY_DOWN:
  204.                 y -= step;
  205.                 break;
  206.             case GLFW_KEY_C:
  207.                 circleVelue -= valueStep;
  208.                 break;
  209.             case GLFW_KEY_V:
  210.                 circleVelue += valueStep;
  211.                 break;
  212.             case GLFW_KEY_R:
  213.                 triangleValue -= valueStep;
  214.                 break;
  215.             case GLFW_KEY_F:
  216.                 triangleValue += valueStep;
  217.                 break;
  218.             case GLFW_KEY_1:
  219.                 PologonModeValue = GL_FILL;
  220.                 break;
  221.             case GLFW_KEY_2:
  222.                 PologonModeValue = GL_LINE;
  223.                 break;
  224.             case GLFW_KEY_T:
  225.                 texture = !texture;
  226.                 break;
  227.             case GLFW_KEY_P:
  228.                 globalAmbient.r += .1f;
  229.                 break;
  230.             case GLFW_KEY_L:
  231.                 globalAmbient.r -= .1f;
  232.                 break;
  233.             case GLFW_KEY_LEFT_BRACKET:
  234.                 globalAmbient.g += .1f;
  235.                 break;
  236.             case GLFW_KEY_SEMICOLON:
  237.                 globalAmbient.g -= .1f;
  238.                 break;
  239.             case GLFW_KEY_RIGHT_BRACKET:
  240.                 globalAmbient.b += .1f;
  241.                 break;
  242.             case GLFW_KEY_APOSTROPHE:
  243.                 globalAmbient.b -= .1f;
  244.                 break;
  245.             case GLFW_KEY_SPACE:
  246.                 animation = !animation;
  247.                 break;
  248.             case GLFW_KEY_COMMA:
  249.                 uploadData();
  250.                 break;
  251.             case GLFW_KEY_PERIOD:
  252.                 downloadData();
  253.                 break;
  254.         }
  255.     }
  256. }
  257.  
  258. void scroll_callback(GLFWwindow* window, double xoffset, double yoffset){
  259.     PositionX += 0.5 * yoffset;
  260.     PositionY += 0.5 * yoffset;
  261.     PositionZ += 0.5 * yoffset;
  262. }
  263.  
  264. void Draw_Cube(GLfloat size){
  265.     glBegin(GL_QUADS);
  266.    
  267.     glVertex3f( -size / 2, -size / 2, -size / 2);
  268.     glVertex3f( -size / 2,  size / 2, -size / 2);
  269.     glVertex3f( -size / 2,  size / 2,  size / 2);
  270.     glVertex3f( -size / 2, -size / 2,  size / 2);
  271.    
  272.     glVertex3f(  size / 2, -size / 2, -size / 2);
  273.     glVertex3f(  size / 2, -size / 2,  size / 2);
  274.     glVertex3f(  size / 2,  size / 2,  size / 2);
  275.     glVertex3f(  size / 2,  size / 2, -size / 2);
  276.    
  277.     glVertex3f( -size / 2, -size / 2, -size / 2);
  278.     glVertex3f( -size / 2, -size / 2,  size / 2);
  279.     glVertex3f(  size / 2, -size / 2,  size / 2);
  280.     glVertex3f(  size / 2, -size / 2, -size / 2);
  281.    
  282.     glVertex3f( -size / 2, size / 2, -size / 2);
  283.     glVertex3f( -size / 2, size / 2,  size / 2);
  284.     glVertex3f(  size / 2, size / 2,  size / 2);
  285.     glVertex3f(  size / 2, size / 2, -size / 2);
  286.    
  287.     glVertex3f( -size / 2, -size / 2, -size / 2);
  288.     glVertex3f(  size / 2, -size / 2, -size / 2);
  289.     glVertex3f(  size / 2,  size / 2, -size / 2);
  290.     glVertex3f( -size / 2,  size / 2, -size / 2);
  291.    
  292.     glVertex3f( -size / 2, -size / 2,  size / 2);
  293.     glVertex3f(  size / 2, -size / 2,  size / 2);
  294.     glVertex3f(  size / 2,  size / 2,  size / 2);
  295.     glVertex3f( -size / 2,  size / 2,  size / 2);
  296.     glEnd();
  297. }
  298.  
  299.  
  300. void Draw_Tor(int roundValue, int shapesValue, float externalRadDelta, float interiorRadDelta) {
  301.    
  302. //    if (animation) {
  303. //        timing += timingWayUp ? 0.01f : -0.01f;
  304. //        timingX = (1 - timing) * (1 - timing)* pOne.x + 2 * timing * (1 - timing) * pTwo.x + timing * timing * pThree.x;
  305. //        timingY = (1 - timing) * (1 - timing)* pOne.y + 2 * timing * (1 - timing) * pTwo.y + timing * timing * pThree.y;
  306. //        timingZ = (1 - timing) * (1 - timing)* pOne.z + 2 * timing * (1 - timing) * pTwo.z + timing * timing * pThree.z;
  307. //        //timingWayUp = (timing > 1 || timing < 0) ? !timingWayUp : timingWayUp;
  308. //        if (timing > 1 || timing < 0) {
  309. //            timingWayUp = !timingWayUp;
  310. //            pTwo.x = -pTwo.x;
  311. //        }
  312. //    }
  313.    
  314.     if (animation) {
  315.         timing += timingWayUp ? 0.01f : -0.01f;
  316.         externalRadDelta += (1 - timing) * (1 - timing)* pOne.x + 2 * timing * (1 - timing) * pTwo.x + timing * timing * pThree.x;
  317.  //        timingX = (1 - timing) * (1 - timing)* pOne.x + 2 * timing * (1 - timing) * pTwo.x + timing * timing * pThree.x;
  318. //        timingY = (1 - timing) * (1 - timing)* pOne.y + 2 * timing * (1 - timing) * pTwo.y + timing * timing * pThree.y;
  319. //        timingZ = (1 - timing) * (1 - timing)* pOne.z + 2 * timing * (1 - timing) * pTwo.z + timing * timing * pThree.z;
  320. //        //timingWayUp = (timing > 1 || timing < 0) ? !timingWayUp : timingWayUp;
  321.         if (timing > 1 || timing < 0) {
  322.             timingWayUp = !timingWayUp;
  323.             pTwo.x = -pTwo.x;
  324.         }
  325.     }
  326.    
  327.     glMatrixMode(GL_MODELVIEW);
  328.     glLoadIdentity();
  329.     glTranslatef(x + timingX, y + timingY, z + timingZ);
  330.    
  331.     glRotatef(RotateX, 0, 1, 0);
  332.     glRotatef(RotateY, 1, 0, 0);
  333.     glRotatef(RotateZ, 0, 0, 1);
  334.    
  335.     glScaled(PositionX, PositionY, PositionZ);
  336.    
  337.     glPolygonMode(GL_FRONT_AND_BACK, PologonModeValue);
  338.    
  339.     glMaterialfv(GL_FRONT, GL_AMBIENT, (float*)&Ambient);
  340.     glMaterialfv(GL_FRONT, GL_DIFFUSE, (float*)&Diffuse);
  341.     glMaterialfv(GL_FRONT, GL_SPECULAR, (float*)&Specular);
  342.     glMaterialf(GL_FRONT, GL_SHININESS, Shininess);
  343.     glEnable(GL_NORMALIZE);
  344.    
  345.     glEnable(GL_DEPTH_TEST);
  346.     glEnable(GL_LIGHT0);
  347.     glEnable(GL_BLEND);
  348.     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  349.    
  350.    
  351.     double externalRad = 2.0 * PI / roundValue;
  352.     double interiorRad = 2.0 * PI / shapesValue;
  353.    
  354.    
  355.     for (int i = 0; i < roundValue; i++) {
  356.         double stepOne = i * externalRad;
  357.         double stepTwo = stepOne + externalRad;
  358.        
  359.         GLdouble HorizontalStepOne = cos(stepOne);
  360.         GLdouble VerticalStepOne = sin(stepOne);
  361.         GLdouble HorizontalStepTwo = cos(stepTwo);
  362.         GLdouble VerticalStepTwo = sin(stepTwo);
  363.        
  364.        
  365.         glBegin(GL_TRIANGLE_STRIP);
  366.        
  367.         for (int j = 0; j <= shapesValue; j++) {
  368.             double b = j * interiorRad;
  369.            
  370.             GLdouble externalRadValue = interiorRadDelta * cos(b) + externalRadDelta;
  371.             GLdouble interiorRadValue = interiorRadDelta * sin(b);
  372.            
  373.             glNormal3d(-HorizontalStepOne * cos(b), -VerticalStepOne * cos(b), -interiorRadValue / interiorRadDelta);
  374.             glTexCoord2d(i / (GLdouble) roundValue, j / (GLdouble) shapesValue);
  375.             glVertex3d(HorizontalStepTwo * externalRadValue,
  376.                        VerticalStepTwo * externalRadValue, interiorRadValue);
  377.            
  378.             glNormal3d(-HorizontalStepTwo * cos(b), -VerticalStepTwo * cos(b), -interiorRadValue / interiorRadDelta);
  379.             glTexCoord2d((i + 1) / (GLdouble) roundValue, j / (GLdouble) shapesValue);
  380.             glVertex3d(HorizontalStepOne * externalRadValue, VerticalStepOne * externalRadValue, interiorRadValue);
  381.         }
  382.         glEnd();
  383.     }
  384. }
  385.  
  386.  
  387.  
  388. void Draw_dimetrialProection() {
  389.    
  390.     glMatrixMode(GL_MODELVIEW);
  391.     glLoadIdentity();
  392.     glRotatef(-phi*(180/3.14) , 1.0, 0.0, 0.0);
  393.     glRotatef(-teta*(180/3.14) , 0.0, 1.0, 0.0);
  394.     glTranslatef(-0.9, -0.7, -0.5);
  395.    
  396.     glScaled(0.2, 0.2, 0.2);
  397.     Draw_Cube(1);
  398. }
  399.  
  400. int main(void) {
  401.     if (!glfwInit()) {
  402.         return -1;
  403.     }
  404.    
  405.     GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "Lab6", NULL, NULL);
  406.     glfwMakeContextCurrent(window);
  407.    
  408.     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  409.     glfwSetKeyCallback(window, keyCallback);
  410.     glfwSetScrollCallback(window, scroll_callback);
  411.    
  412.     textureValue = getTextureValue("/Users/kir_snegir/Desktop/Graphics Labs/Lab6/Lab6/Red_Bricks.bmp");
  413.    
  414.    
  415.     while (!glfwWindowShouldClose(window)) {
  416.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  417.        
  418.         glMatrixMode(GL_PROJECTION);
  419.         glLoadIdentity();
  420.         glMultMatrixf(*TransformationMatrix);
  421.        
  422.         if (lighting) {
  423.             glEnable(GL_LIGHTING);
  424.             glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (float*)&globalAmbient);
  425.         }
  426.        
  427.         if (texture) {
  428.             glEnable(GL_TEXTURE_2D);
  429.             glBindTexture(GL_TEXTURE_2D, textureValue);
  430.             glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  431.         }
  432.        
  433.         Draw_dimetrialProection();
  434.        
  435.         Draw_Tor(circleVelue,triangleValue, 0.2f , 0.1f);
  436.        
  437.         glDisable(GL_TEXTURE_2D);
  438.         glLoadIdentity();
  439.        
  440.         glfwPollEvents();
  441.         glfwSwapBuffers(window);
  442.     }
  443.    
  444.     glfwDestroyWindow(window);
  445.     glfwTerminate();
  446. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement