Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.60 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <glew.h>
  5. #include <vector>
  6. #include <cmath>
  7. #include <ctime>
  8. #include "SOIL.h"
  9. #include <fstream>
  10. #include <glfw3.h>
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <math.h>
  14. #include <iostream>
  15. #include <vector>
  16. #include <string>
  17.  
  18. const double M_PI = 3.14;
  19.  
  20. bool modA = true, modT = false;
  21.  
  22.  
  23. GLint red = 0;
  24.  
  25. GLint green = 255;
  26. GLint blue = 255;
  27.  
  28. GLint MOVE_X = 0;
  29. GLint MOVE_Y = 0;
  30. GLint MOVE_Z = 0;
  31.  
  32. GLint ROTATE_X = 0;
  33. GLint ROTATE_Y = 0;
  34. GLint ROTATE_Z = 0;
  35.  
  36. GLboolean global_ambient = false;
  37. GLboolean two_side = true;
  38. GLboolean local_viewer = true;
  39.  
  40. GLboolean IS_FILL = false;
  41.  
  42. GLfloat Amount = 10;
  43.  
  44. GLfloat SIZE = 1.0f;
  45.  
  46. GLint floors = 7;
  47.  
  48. const GLfloat kVerts[] = {
  49. 1, 0, 0, 0,
  50. 0, 1, 0, 0,
  51. 0, 0, 1, 0,
  52. 0, 0, 0, 1
  53. };
  54.  
  55. GLfloat material_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
  56. GLuint textureID;
  57. GLfloat light0_diffuse[] = { 1,1,0 };
  58. GLfloat light0_position[] = { 1.0, 1.0, 1.0, 1.0 };
  59. GLfloat light0_ambient[] = { 1, 1, 1 };
  60. GLfloat light0_spot_direction[] = { -1.0, -1.0, -1.0 };
  61.  
  62. void key(GLFWwindow * window, int key, int scancode, int action, int mods)
  63. {
  64. if (action == GLFW_PRESS || action == GLFW_REPEAT) {
  65. switch (key) {
  66. case GLFW_KEY_ESCAPE:
  67. glfwSetWindowShouldClose(window, GLFW_TRUE);
  68. break;
  69. case GLFW_KEY_UP:
  70. MOVE_Y += 10;
  71. break;
  72. case GLFW_KEY_DOWN:
  73. MOVE_Y -= 10;
  74. break;
  75. case GLFW_KEY_LEFT:
  76. MOVE_X -= 10;
  77. break;
  78. case GLFW_KEY_RIGHT:
  79. MOVE_X += 10;
  80. break;
  81. case GLFW_KEY_3:
  82. MOVE_Z += 100;
  83. break;
  84. case GLFW_KEY_4:
  85. MOVE_Z -= 100;
  86. break;
  87. case GLFW_KEY_W:
  88. ROTATE_X += 2;
  89. break;
  90. case GLFW_KEY_S:
  91. ROTATE_X -= 2;
  92. break;
  93. case GLFW_KEY_A:
  94. ROTATE_Y += 2;
  95. break;
  96. case GLFW_KEY_D:
  97. ROTATE_Y -= 2;
  98. break;
  99. case GLFW_KEY_5:
  100. ROTATE_Z += 2;
  101. break;
  102. case GLFW_KEY_6:
  103. ROTATE_Z -= 2;
  104. break;
  105. case GLFW_KEY_F:
  106. IS_FILL = !IS_FILL;
  107. break;
  108. case GLFW_KEY_1:
  109. SIZE += 0.1f;
  110. break;
  111. case GLFW_KEY_2:
  112. SIZE -= 0.1f;
  113. break;
  114. case GLFW_KEY_R:
  115. red = 255;
  116. green = 0;
  117. blue = 0;
  118. break;
  119. case GLFW_KEY_G:
  120. red = 0;
  121. green = 255;
  122. blue = 0;
  123. break;
  124. case GLFW_KEY_B:
  125. red = 0.0;
  126. green = 0.0;
  127. blue = 255;
  128. break;
  129.  
  130. case GLFW_KEY_T:
  131. modT = !modT;
  132. break;
  133.  
  134. //Разбиение
  135. case GLFW_KEY_Z:
  136. Amount += 1;
  137. break;
  138. case GLFW_KEY_X:
  139. Amount -= 1;
  140. break;
  141.  
  142.  
  143. case GLFW_KEY_PAGE_UP:
  144. floors++;
  145. break;
  146. case GLFW_KEY_PAGE_DOWN:
  147. floors--;
  148. break;
  149. }
  150. }
  151. }
  152.  
  153. void makeTexture(float xCenterUp, float yCenterUp, float xCenterDown, float yCenterDown,
  154. float length, float rx, float ry, float pointCount) {
  155. if (pointCount < 3) pointCount = 3;
  156. const float step = float(2 * M_PI) / pointCount;
  157.  
  158. float dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0;
  159. float dx1temp = 0, dy1temp = 0, dx2temp = 0, dy2temp = 0;
  160. float xCenterUpTemp = 0;
  161. float yCenterUpTemp = 0;
  162.  
  163. float angle = 0;
  164.  
  165. float len = length / 2;
  166.  
  167. GLint i = 1;
  168.  
  169. glPolygonMode(GL_FRONT_AND_BACK, IS_FILL ? GL_FILL : GL_LINE);
  170. glFrontFace(GL_CW);
  171. glColor3d(1, 1, 1);
  172.  
  173. for (float angle = 0; angle <= float(2 * M_PI); angle += step) {
  174. dx1 = rx * cosf(angle);
  175. dy1 = ry * sinf(angle);
  176. dx2 = rx * cosf(angle + step);
  177. dy2 = ry * sinf(angle + step);
  178.  
  179.  
  180. //glBindTexture(GL_TEXTURE_2D, textureID);
  181. glBegin(GL_TRIANGLES);
  182. glTexCoord2f(0.0f, 0.0f);
  183. glVertex3f(xCenterDown, yCenterDown, -len); // Бок
  184. glTexCoord2f(1.0f, 0.0f);
  185. glVertex3f(dx1 + xCenterUp, dy1 + yCenterUp, len);
  186. glTexCoord2f(0.5f, 1.0f);
  187. glVertex3f(dx2 + xCenterUp, dy2 + yCenterUp, len);
  188. glEnd();
  189. //glBindTexture(GL_TEXTURE_2D, 0);
  190.  
  191. glColor3d(0, 1, 0); // Основание
  192.  
  193. glBegin(GL_TRIANGLES);
  194. //glTexCoord2f(0.0f, 0.0f);
  195. glVertex3f(xCenterUp, yCenterUp, len);
  196. //glTexCoord2f(1.0f, 0.0f);
  197. glVertex3f(dx1 + xCenterUp, dy1 + yCenterUp, len);
  198. //glTexCoord2f(0.5f, 1.0f);
  199. glVertex3f(dx2 + xCenterUp, dy2 + yCenterUp, len);
  200. glEnd();
  201.  
  202.  
  203. }
  204. glDisable(GL_TEXTURE_2D);
  205.  
  206.  
  207. }
  208.  
  209.  
  210. void makeLight() {
  211. float light0_diffuse[] = { 0.8f, 0.8f, 0.8f };
  212. float light0_position[] = { -390, 290, 300, 1.0 };
  213. float light0_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
  214. //float specular[] = { 1.0f, 1.0f, 1.0f, 1.0f};
  215. float light0_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  216. float ambient[] = { 0.5f, 0.2f, 0.2f, 1.0f };
  217. float default_amb[] = { 0.2f, 0.2f, 0.2f, 1.0f };
  218. glEnable(GL_NORMALIZE);
  219. glEnable(GL_LIGHTING);
  220. glEnable(GL_LIGHT0);
  221. if (global_ambient)
  222. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
  223. else
  224. glLightModelfv(GL_LIGHT_MODEL_AMBIENT, default_amb);
  225. if (two_side)
  226. glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  227. else
  228. glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
  229. if (local_viewer)
  230. glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
  231. else
  232. glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
  233.  
  234. glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
  235. glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
  236. glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);
  237. glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
  238. }
  239.  
  240.  
  241. void save() {
  242. std::ofstream t;
  243. t.open("./textfile.txt");
  244. if (t.is_open()) {
  245. t << "movex = (" << MOVE_X << ") movey = (" << MOVE_Y << ") movez = (" << MOVE_Z
  246. << ") rotatex = (" << ROTATE_X << ") rotatey = (" << ROTATE_Y << ") rotatez = (" << ROTATE_Z << ")"
  247. << ") amount = (" << Amount << ") size = (" << SIZE << ") floors = (" << floors << ")";
  248. }
  249. }
  250.  
  251. void DrawFigure(float xCenterUp, float yCenterUp, float xCenterDown, float yCenterDown,
  252. float length, float rx, float ry, float pointCount) {
  253. glBindTexture(GL_TEXTURE_2D, textureID);
  254.  
  255.  
  256.  
  257. //glEnable(GL_TEXTURE_2D);
  258. //glBindTexture(GL_TEXTURE_2D, textureID);
  259.  
  260. if (pointCount < 3) pointCount = 3;
  261. const float step = float(2 * M_PI) / pointCount;
  262.  
  263. float dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0;
  264. float dx1temp = 0, dy1temp = 0, dx2temp = 0, dy2temp = 0;
  265. float xCenterUpTemp = 0;
  266. float yCenterUpTemp = 0;
  267.  
  268. float angle = 0;
  269.  
  270. float len = length / 2;
  271.  
  272. GLint i = 1;
  273.  
  274. glPolygonMode(GL_FRONT_AND_BACK, IS_FILL ? GL_FILL : GL_LINE);
  275.  
  276. for (float angle = 0; angle <= float(2 * M_PI); angle += step) {
  277. dx1 = rx * cosf(angle);
  278. dy1 = ry * sinf(angle);
  279. dx2 = rx * cosf(angle + step);
  280. dy2 = ry * sinf(angle + step);
  281.  
  282. for (GLint i = 1; i < floors; i++) {
  283. dx1temp = (dx1 / floors) * (floors - i);
  284. dx2temp = (dx2 / floors) * (floors - i);
  285. dy1temp = (dy1 / floors) * (floors - i);
  286. dy2temp = (dy2 / floors) * (floors - i);
  287. xCenterUpTemp = -(xCenterDown / floors) * (floors - i) + xCenterDown;
  288. yCenterUpTemp = -(yCenterDown / floors) * (floors - i) + yCenterDown;
  289.  
  290.  
  291. glColor3d(0, 1, 0); //Основание
  292. //glBindTexture(GL_TEXTURE_2D, textureID);
  293. glBegin(GL_TRIANGLES);
  294. //glTexCoord2f(0.0f, 0.0f);
  295. glVertex3f(xCenterUpTemp, yCenterUpTemp, len - length / floors * i);
  296. //glTexCoord2f(1.0f, 0.0f);
  297. glVertex3f(dx1temp + xCenterUpTemp, dy1temp + yCenterUpTemp, len - length / floors * i);
  298. //glTexCoord2f(0.5f, 1.0f);
  299. glVertex3f(dx2temp + xCenterUpTemp, dy2temp + yCenterUpTemp, len - length / floors * i);
  300. glEnd();
  301. }
  302. glColor3d(1, 1, 1);
  303. glBegin(GL_TRIANGLES);
  304. //glTexCoord2f(0.0f, 0.0f);
  305. glVertex3f(xCenterDown, yCenterDown, -len); // Бок
  306. //glTexCoord2f(1.0f, 0.0f);
  307. glVertex3f(dx1 + xCenterUp, dy1 + yCenterUp, len);
  308. //glTexCoord2f(0.5f, 1.0f);
  309. glVertex3f(dx2 + xCenterUp, dy2 + yCenterUp, len);
  310. glEnd();
  311.  
  312. //glColor3d(0, 1, 0); // Основание
  313. //glBindTexture(GL_TEXTURE_2D, textureID);
  314. glBegin(GL_TRIANGLES);
  315. //glTexCoord2f(0.0f, 0.0f);
  316. glVertex3f(xCenterUp, yCenterUp, len);
  317. //glTexCoord2f(1.0f, 0.0f);
  318. glVertex3f(dx1 + xCenterUp, dy1 + yCenterUp, len);
  319. //glTexCoord2f(0.5f, 1.0f);
  320. glVertex3f(dx2 + xCenterUp, dy2 + yCenterUp, len);
  321. glEnd();
  322.  
  323. }
  324. //glDisable(GL_TEXTURE_2D);
  325.  
  326.  
  327. }
  328.  
  329.  
  330. void display(GLFWwindow * window)
  331. {
  332. int width, height;
  333.  
  334. glfwGetFramebufferSize(window, &width, &height);
  335.  
  336. //Static cube
  337.  
  338. glViewport(0, 0, width / 2, height / 2);
  339. glEnable(GL_DEPTH_TEST);
  340.  
  341. glMatrixMode(GL_PROJECTION);
  342. glLoadIdentity();
  343. glOrtho(-width, width, -height, height, -1000, 1000);
  344. glMatrixMode(GL_MODELVIEW);
  345. glLoadIdentity();
  346.  
  347. //Подключение текстуры
  348.  
  349. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  350. glMatrixMode(GL_MODELVIEW);
  351. glLoadIdentity();
  352.  
  353. glPushMatrix();
  354. glTranslatef(-1000, -350, 300);
  355. glRotatef(-20, 1, 0, 0);
  356. glRotatef(-20, 0, 1, 0);
  357. //DrawObjects(3);
  358. glPopMatrix();
  359.  
  360. //projection Ozy Вверху слева
  361.  
  362. glViewport(0, height / 2 + 1, width / 2 + 1, height / 2);
  363. glEnable(GL_DEPTH_TEST);
  364.  
  365. glMatrixMode(GL_PROJECTION);
  366. glLoadIdentity();
  367. glOrtho(-width, width, -height, height, -1000, 1000);
  368. glRotatef(90, 1, 0, 0);
  369. glMatrixMode(GL_MODELVIEW);
  370. glLoadIdentity();
  371.  
  372. glTranslatef(-200, -200, 500);
  373. glTranslatef(MOVE_X + 350, MOVE_Y + 350, MOVE_Z - 500);
  374. glScaled(SIZE, SIZE, SIZE);
  375. glRotatef(ROTATE_X, 1, 0, 0);
  376. glRotatef(ROTATE_Y, 0, 1, 0);
  377. glRotatef(ROTATE_Z, 0, 0, 1);
  378. DrawFigure(0, 0, 30, 30, 200, 50, 100, Amount);
  379. //drawAxis(250, 150, -450);
  380.  
  381. //projection Oxy Вверху справа
  382.  
  383. glViewport(width / 2 + 1, height / 2 + 1, width / 2, height / 2);
  384. glEnable(GL_DEPTH_TEST);
  385.  
  386. glMatrixMode(GL_PROJECTION);
  387. glLoadIdentity();
  388. glOrtho(-width, width, -height, height, -1000, 1000);
  389. glMatrixMode(GL_MODELVIEW);
  390. glLoadIdentity();
  391.  
  392. glTranslatef(MOVE_X, MOVE_Y, MOVE_Z - 500);
  393. glScaled(SIZE, SIZE, SIZE);
  394. glRotatef(ROTATE_X, 1, 0, 0);
  395. glRotatef(ROTATE_Y, 0, 1, 0);
  396. glRotatef(ROTATE_Z, 0, 0, 1);
  397. DrawFigure(0, 0, 30, 30, 200, 50, 100, Amount);
  398.  
  399. //projection Oxz Внизу справа
  400.  
  401. glViewport(width / 2 + 1, 0, width / 2, height / 2);
  402. glEnable(GL_DEPTH_TEST);
  403.  
  404. glMatrixMode(GL_PROJECTION);
  405. glLoadIdentity();
  406. glOrtho(-width, width, -height, height, -1000, 1000);
  407. glRotatef(90, 0, 1, 0);
  408. glMatrixMode(GL_MODELVIEW);
  409. glLoadIdentity();
  410.  
  411. glTranslatef(-200, -200, 500);
  412. glTranslatef(MOVE_X + 350, MOVE_Y + 350, MOVE_Z - 500);
  413. glScaled(SIZE, SIZE, SIZE);
  414. glRotatef(ROTATE_X, 1, 0, 0);
  415. glRotatef(ROTATE_Y, 0, 1, 0);
  416. glRotatef(ROTATE_Z, 0, 0, 1);
  417. //DrawFigure(0, 0, 30, 30, 200, 50, 100, Amount);
  418. glEnable(GL_TEXTURE_2D);
  419. makeTexture(0, 0, 30, 30, 200, 50, 100, Amount);
  420. }
  421.  
  422. int main()
  423. {
  424. if (!glfwInit())
  425. exit(1);
  426.  
  427. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  428. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
  429.  
  430. GLFWwindow * window = glfwCreateWindow(800, 600, "Laba", NULL, NULL);
  431. if (!window)
  432. {
  433. glfwTerminate();
  434. exit(1);
  435. }
  436.  
  437. glfwMakeContextCurrent(window);
  438. glfwSetKeyCallback(window, key);
  439.  
  440. makeLight();
  441.  
  442. int w = 512, h = 512;
  443. unsigned char* image = SOIL_load_image("./met.bmp", &w, &h, 0, SOIL_LOAD_RGB);
  444. glGenTextures(1, &textureID);
  445. glBindTexture(GL_TEXTURE_2D, textureID);
  446.  
  447. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  448. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  449. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  450. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  451. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
  452. SOIL_free_image_data(image);
  453. glBindTexture(GL_TEXTURE_2D, 0);
  454.  
  455.  
  456. while (!glfwWindowShouldClose(window)) {
  457.  
  458. if (modT) {
  459. glEnable(GL_TEXTURE_2D);
  460. }
  461. else {
  462. glDisable(GL_TEXTURE_2D);
  463. }
  464. display(window); //рисует
  465. glfwSwapBuffers(window); //Меняет буферы
  466. glfwPollEvents(); //Слушает нажатия
  467. }
  468. glfwDestroyWindow(window);
  469. glfwTerminate();
  470.  
  471. return 0;
  472. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement