Advertisement
Aveneid

Untitled

Jan 19th, 2021
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.14 KB | None | 0 0
  1. //#include <GL/glut.h>
  2. #include <iostream>
  3. #include "GL/glut.h"
  4. #include <stdlib.h>
  5. #include <cmath>
  6. #include <iostream>
  7. #include <windows.h>
  8. #include <string>
  9. #include <ctime>
  10.  
  11. #include "GL/freeglut.h"
  12. #define MAXFOV 120
  13. #define MINFOV 15
  14.  
  15. #define RED glColor3f(1,0,0);
  16. #define GREEN glColor3f(0,1,0);
  17. #define BLUE glColor3f(0,0,1);
  18.  
  19.  
  20.  
  21. #define STB_IMAGE_IMPLEMENTATION
  22. #include "stb/stb_image.h"
  23. #define STB_IMAGE_WRITE_IMPLEMENTATION
  24. #include "stb/stb_image_write.h"
  25.  
  26.  
  27. using namespace std;
  28. int fps = 1000 / 50;
  29. int width, height;
  30. char view;
  31.  
  32.  
  33. struct v3f {
  34. float x;
  35. float y;
  36. float z;
  37. };
  38.  
  39. struct v2i {
  40. int x;
  41. int y;
  42. };
  43. v3f camPos = { 0,0,-6 };
  44. v3f camLook = { -160,0,0 };
  45. v2i mousePos;
  46.  
  47. float lightPos[4] = { 1,-3,0, 1.0 };
  48. float lightPos2[4] = { 0, 0, 0, 1.0 };
  49.  
  50. int max_carts = 3;
  51. float angle = 0.0f;
  52.  
  53.  
  54. void initGL()
  55. {
  56. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  57. glEnable(GL_COLOR_MATERIAL);
  58. }
  59.  
  60. void idle()
  61. {
  62. glutPostRedisplay(); // Post a re-paint request to activate display()
  63. }
  64.  
  65. void Timer(int value) {
  66. glutPostRedisplay();
  67. glutTimerFunc(fps, Timer, 0);
  68. }
  69.  
  70. void drawRails() {
  71. glPushMatrix();
  72. glRotatef(90, 1, 0, 0);
  73. glColor3f(1, 1, 1);
  74. glutSolidTorus(0.005, 2, 30, 30);
  75. glutSolidTorus(0.005, 2.2, 30, 30);
  76. glRotatef(90, 1, 0, 0);
  77. glPushMatrix();
  78. glScalef(0.1, 0.05, 0.1);
  79. glColor3f(0.6, 0.3, 0.1);
  80. for (int i = 0;i < 360;i += 12) {
  81. glPushMatrix();
  82. glRotatef(i, 0, 1, 0);
  83. glTranslatef(21, 0, 0);
  84. glScalef(2.75, 1, 0.5);
  85. glutSolidCube(1);
  86. glPopMatrix();
  87. }
  88. glPopMatrix();
  89.  
  90. glPopMatrix();
  91. }
  92.  
  93. void drawCarts() {
  94. glTranslatef(0, -0.11, 0);
  95. glPushMatrix();
  96. RED;
  97. glTranslatef(-sin(angle) * 2.1, 0, -cos(angle) * 2.1);
  98. glRotatef(-angle * 55 + 20, 0, 1, 0);
  99. glScalef(0.1, 0.1, 0.1);
  100. glutSolidCube(2);
  101. glPopMatrix();
  102. glPushMatrix();
  103. BLUE;
  104. glTranslatef(-sin(angle + 0.125) * 2.1, 0, -cos(angle + 0.125) * 2.1);
  105. glRotatef(-angle * 55 + 20, 0, 1, 0);
  106. glScalef(0.1, 0.1, 0.1);
  107. glutSolidCube(2);
  108. glPopMatrix();
  109. glPushMatrix();
  110. GREEN;
  111. glTranslatef(-sin(angle + 0.25) * 2.1, 0, -cos(angle + 0.25) * 2.1);
  112. glRotatef(-angle * 55 + 20, 0, 1, 0);
  113. glScalef(0.1, 0.1, 0.1);
  114. glutSolidCube(2);
  115. glPopMatrix();
  116. }
  117. GLuint tex;
  118. GLbyte* loadTexture(const char* FileName, GLint* w, GLint* h, GLint* ImComponents, GLenum* ImFormat) {
  119. GLbyte* image;
  120. int ch;
  121.  
  122. *ImComponents = GL_RGB8;
  123. *ImFormat = GL_BGR_EXT;
  124. GLbyte* pbitsperpixel = NULL;
  125.  
  126. image = (GLbyte*)stbi_load(FileName, w, h, &ch, 0);
  127. if (image == NULL) {
  128. std::cout << "error";
  129. exit(1);
  130. }
  131.  
  132. switch (ch)
  133. {
  134. case 3:
  135. *ImFormat = GL_BGR_EXT;
  136. *ImComponents = GL_RGB8;
  137. break;
  138. case 4:
  139. *ImFormat = GL_BGRA_EXT;
  140. *ImComponents = GL_RGBA8;
  141. break;
  142. case 1:
  143. *ImFormat = GL_LUMINANCE;
  144. *ImComponents = GL_LUMINANCE8;
  145. break;
  146. };
  147. return image;
  148. }
  149.  
  150. void InitText(const char* FileName) {
  151. GLbyte* pBytes;
  152. GLint ImWidth, ImHeight, ImComponents;
  153. GLenum ImFormat;
  154.  
  155. glEnable(GL_CULL_FACE);
  156. //glEnable(GL_TEXTURE_2D);
  157. glCullFace(GL_FRONT);
  158. pBytes = loadTexture(FileName, &ImWidth, &ImHeight, &ImComponents, &ImFormat);
  159. glTexImage2D(GL_TEXTURE_2D, 0, ImComponents, ImWidth, ImHeight, 0, ImFormat, GL_UNSIGNED_BYTE, pBytes);
  160. free(pBytes);
  161. glEnable(GL_TEXTURE_2D);
  162. //glBindTexture(GL_TEXTURE_2D, 0);
  163. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  164. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  165. //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  166. }
  167. void light() {
  168. glPushMatrix();
  169. glTranslatef(lightPos[0], lightPos[1], lightPos[2]);
  170. glLightfv(GL_LIGHT1, GL_POSITION, lightPos);
  171. glPushMatrix();
  172. glColor3f(1.000, 0.843, 0.000);
  173. glScalef(0.1, 0.1, 0.1);
  174. glutSolidOctahedron();
  175. glPopMatrix();
  176. glPushMatrix();
  177. glRotatef(45, 0, 1, 0);
  178. glScalef(0.1, 0.1, 0.1);
  179. glutSolidOctahedron();
  180. glPopMatrix();
  181.  
  182. glColor3f(1, 1, 1);
  183. GLfloat ambient0[] = { 0.2, 0.2, 0.2, 1.0 };
  184. GLfloat diffuse0[] = { 0.9, 0.9, 0.9, 1.0 };
  185. GLfloat specular0[] = { 1.0,1.0, 1.0, 1.0 };
  186. GLfloat emission[] = { 1.0,1.0, 1.0, 1.0 };
  187. glLightfv(GL_LIGHT1, GL_AMBIENT, ambient0);
  188. glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse0);
  189. glLightfv(GL_LIGHT1, GL_SPECULAR, specular0);
  190. glEnable(GL_LIGHTING);
  191. glEnable(GL_LIGHT1);
  192.  
  193. glPopMatrix();
  194. }
  195. void movelight() {
  196. lightPos[2] = (-sin(angle));
  197. lightPos[0] = (-cos(angle));
  198. }
  199. void plane() {
  200.  
  201. glPushMatrix();
  202. glEnable(GL_TEXTURE_GEN_S);
  203. glEnable(GL_TEXTURE_GEN_T);
  204. InitText("a.jpg");
  205. glColor3f(0.2, 0.8, 0.2);
  206. glBegin(GL_QUADS);
  207. glVertex3f(-10, 0, -10);
  208. glVertex3f(-10, 0, 10);
  209. glVertex3f(10, 0, 10);
  210. glVertex3f(10, 0, -10);
  211. glEnd();
  212. glDisable(GL_TEXTURE_GEN_S);
  213. glDisable(GL_TEXTURE_GEN_T);
  214. glPopMatrix();
  215. }
  216. void display()
  217. {
  218. glClearColor(0, 0, 0, 0);
  219. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  220. glMatrixMode(GL_MODELVIEW);
  221. glLoadIdentity();
  222.  
  223.  
  224.  
  225. switch (view) {
  226. case '1':
  227. glTranslatef(camPos.x, camPos.y, camPos.z);
  228. glRotatef(camLook.x, 1.0f, 0.0f, 0.0f);
  229. glRotatef(camLook.y, 0.0f, 1.0f, 0.0f);
  230. glRotatef(camLook.z, 0.0f, 0.0f, 1.0f);
  231. break;
  232. case '2': //top
  233.  
  234. glTranslatef(-1, -1, -1);
  235. glRotatef(180, 1, 0, 0);
  236. glRotatef(90, 1, 0, 0);
  237. glTranslatef(1, 5, 1);
  238. break;
  239. case '3': //left
  240.  
  241. glTranslatef(-1, -1, -1);
  242. glRotatef(180, 1, 0, 0);
  243. glRotatef(-90, 0, 1, 0);
  244. glTranslatef(4, 0, -1);
  245. glRotatef(90, 0, 1, 0);
  246. break;
  247.  
  248. case '4': //left(45)
  249.  
  250. glTranslatef(-1, -1, -1);
  251. glRotatef(180, 1, 0, 0);
  252. glRotatef(-90, 0, 1, 0);
  253. glTranslatef(4, 0, -1);
  254. glRotatef(90, 0, 1, 0);
  255. glRotatef(45, 1, 0, 0);
  256. glTranslatef(0, 0, 1);
  257. break;
  258. }
  259.  
  260. plane();
  261.  
  262. drawRails();
  263. drawCarts();
  264.  
  265.  
  266. light();
  267. movelight();
  268. angle += 0.02f;
  269. glutSwapBuffers();
  270.  
  271. }
  272.  
  273. void reshape(GLsizei width, GLsizei height) {
  274. if (height == 0) height = 1;
  275. GLfloat aspect = (GLfloat)width / (GLfloat)height;
  276. glViewport(0, 0, width, height);
  277. glMatrixMode(GL_PROJECTION);
  278. glLoadIdentity();
  279. gluPerspective(45, aspect, 0.1f, 100.0f);
  280. }
  281. static void key(unsigned char key, int x, int y)
  282. {
  283. switch (key) {
  284. case 'a': camPos.x += 0.5f; break;
  285. case 'd': camPos.x -= 0.5f; break;
  286. case 'w': camPos.z += 0.5f; break;
  287. case 's': camPos.z -= 0.5f; break;
  288. case 'j': camLook.y += 0.75f; break;
  289. case 'l': camLook.y -= 0.75f; break;
  290. case 'i': camLook.x += 0.75f; break;
  291. case 'k': camLook.x -= 0.75f; break;
  292. case 'Q':
  293. case 'q':
  294. case 27: // ESC
  295. exit(0); break;
  296. }
  297. reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  298. glutPostRedisplay();
  299. }
  300.  
  301. int main(int argc, char** argv)
  302. {
  303. glutInit(&argc, argv);
  304. //glEnable(GL_TEXTURE_GEN_S);
  305.  
  306. glutInitDisplayMode(GLUT_DOUBLE);
  307. glutInitWindowSize(800, 600);
  308. glutInitWindowPosition(50, 50);
  309.  
  310. width = glutGet(GLUT_WINDOW_WIDTH);
  311. height = glutGet(GLUT_WINDOW_HEIGHT);
  312.  
  313. cout << "select mode: " << endl << "1- free cam (mouse)" << endl << "2- top view";
  314. cout << endl << "3- from left" << endl << "from left (45deg)" << endl << "q-exit" << endl;
  315.  
  316. cin >> view;
  317. if (view == 'q' || view == 'Q') return 0;
  318.  
  319.  
  320.  
  321. glutCreateWindow("GLUT - POCIAG - FERENC BARTLOMIEJ");
  322. cout << "wsad - move (by 0.25)" << endl;
  323. cout << "ijkl - change camera angle" << endl;
  324. cout << "esc to exit" << endl;
  325. glEnable(GL_DEPTH_TEST);
  326.  
  327. glutDisplayFunc(display);
  328. glutReshapeFunc(reshape);
  329. glutKeyboardFunc(key);
  330. //mouse
  331.  
  332.  
  333. glutTimerFunc(0, Timer, 0);
  334. initGL();
  335. glutMainLoop();
  336. return EXIT_SUCCESS;
  337. }
  338.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement