Guest User

Untitled

a guest
Jul 23rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <OpenGL/gl.h>
  3. #include <GLUT/GLUT.h>
  4. #include <time.h>
  5. #include <stdlib.h>
  6.  
  7. #define SCREEN_WIDTH 1000
  8. #define SCREEN_HEIGHT 800
  9.  
  10. float theta = 0;
  11. float phi = 0;
  12. float height = 10.0;
  13. float width = 10.0;
  14. float red[] = { 1.0, 0, 0, 1.0 };
  15. float green[] = { 0.0, 0.9, 0, 1.0 };
  16. float blue[] = { 0, 0, 1, 1 };
  17. float terrain_map[1025][1025];
  18. float height_map[11][11] = {
  19. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  20. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  21. { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
  22. { 0, 0, 0, 1, 2, 2, 1, 1, 0, 0 },
  23. { 0, 0, 1, 2, 3, 4, 2, 1, 0, 0 },
  24. { 0, 1, 3, 4, 5, 4, 3, 1, 0, 0 },
  25. { 0, 1, 3, 4, 4, 3, 2, 1, 0, 0 },
  26. { 0, 1, 2, 3, 3, 2, 1, 1, 0, 0 },
  27. { 0, 1, 1, 2, 1, 1, 1, 0, -1, -2 },
  28. { 0, 0, 0, 1, 0, 0, -1, -2, -3, -4 },
  29. { 0, 0, 0, 0, 0, 0, -1, -3, -4, -9 }
  30. };
  31.  
  32.  
  33.  
  34. void generate_map(float map[1025][1025], size_t zmin, size_t zmax, size_t xmin, size_t xmax, float disp);
  35. int get_rand(int min, int max);
  36.  
  37. void mydisplay()
  38. {
  39. int i, j;
  40. float mat_specular[] = { 0.4f, 0.4f, 0.4f, 1.0f };
  41. float mat_diffuse[] = { 0.6f, 0.6f, 0.6f, 1.0f };
  42.  
  43. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  44. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  45. glMaterialf(GL_FRONT, GL_SHININESS, 100);
  46.  
  47. // create a light and set diffuse component of the light
  48. float lightIntensity[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  49. float lightPosition[] = { 700.0f, 700.0f, 700.0f, 1.0f };
  50. glLightfv(GL_LIGHT0, GL_DIFFUSE, lightIntensity);
  51. glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
  52.  
  53. glMatrixMode(GL_MODELVIEW);
  54. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  55. glPushMatrix();
  56. glRotatef(phi, 0.0, 1, 0.0);
  57. glRotatef(theta, 1.0, 1, 1.0);
  58. glPushMatrix();
  59. glBegin(GL_LINES);
  60. glMaterialfv(GL_FRONT, GL_AMBIENT, red);
  61. glVertex3f(0, 0, 1000);
  62. glVertex3f(0, 0, 0);
  63. glMaterialfv(GL_FRONT, GL_AMBIENT, green);
  64. glVertex3f(0, 0, 0);
  65. glVertex3f(1000, 0, 0);
  66. glMaterialfv(GL_FRONT, GL_AMBIENT, blue);
  67. glVertex3f(0, 0, 0);
  68. glVertex3f(0, 1000, 0);
  69. glEnd();
  70. glMaterialfv(GL_FRONT, GL_AMBIENT, green);
  71. for (j = 0; j < 128; j++)
  72. {
  73. glBegin(GL_TRIANGLE_STRIP);
  74. for (i = 0; i < 128; i++)
  75. {/*
  76. glVertex3f(i * width, height * height_map[j][i], j * width);
  77. glVertex3f(i * width, height * height_map[j + 1][i], (j + 1) * width);
  78. glVertex3f((i + 1) * width, height * height_map[j][i + 1], j * width);
  79. glVertex3f((i + 1) * width, height * height_map[j + 1][i + 1], (j + 1) * width);
  80. */
  81. glVertex3f(i * width, height * terrain_map[j][i], j * width);
  82. glVertex3f(i * width, height * terrain_map[j + 1][i], (j + 1) * width);
  83. glVertex3f((i + 1) * width, height * terrain_map[j][i + 1], j * width);
  84. glVertex3f((i + 1) * width, height * terrain_map[j + 1][i + 1], (j + 1) * width);
  85. }
  86. glEnd();
  87. }
  88. glPopMatrix();
  89. glPopMatrix();
  90. glFlush();
  91. }
  92.  
  93. void mykeyboard(unsigned char key, int x, int y)
  94. {
  95. if ('a' == key)
  96. theta+=5;
  97. glutPostRedisplay();
  98. }
  99.  
  100. void myidlefunc()
  101. {
  102. phi += 0.0015;
  103. theta += 0.00015;
  104. glutPostRedisplay();
  105. }
  106.  
  107. void print_map(float map[1025][1025], size_t z, size_t x)
  108. {
  109. size_t i, j;
  110. for (i = 0; i < z; i ++)
  111. {
  112. for (j = 0; j < x; j++)
  113. {
  114. printf("%f\t", map[i][j]);
  115. }
  116. printf("\n");
  117. }
  118. }
  119.  
  120. void init_map(float map[1025][1025])
  121. {
  122. size_t i, j;
  123. size_t size = 1025;
  124.  
  125. for (i = 0; i < size; i++)
  126. {
  127. for (j = 0; j < 1025; j++)
  128. {
  129. map[i][j] = 0;
  130. }
  131. }
  132.  
  133. map[0][0] = get_rand(-50, 5);
  134. map[0][size - 1] = get_rand(-50, 5);
  135. map[size - 1][0] = get_rand(-50, 5);
  136. map[size - 1][size - 1] = get_rand(-50, 5);
  137.  
  138. generate_map(map, 0, size, 0, size, 0.0);
  139. }
  140.  
  141. void generate_map(float map[1025][1025], size_t zmin, size_t zmax,
  142. size_t xmin, size_t xmax, float disp)
  143. {
  144. int mid_x;
  145. int mid_z;
  146. float A, B, C, D, E;
  147.  
  148. mid_x = (xmin + xmax) / 2;
  149. mid_z = (zmin + zmax) / 2;
  150.  
  151. A = map[zmin][xmin];
  152. B = map[zmax][xmin];
  153. C = map[zmin][xmax];
  154. D = map[zmax][xmax];
  155.  
  156. map[mid_z][mid_x] = E = ((A + B + C + D) / 4.0) + get_rand(-1, 1);
  157.  
  158. if (!map[zmin][mid_x])
  159. map[zmin][mid_x] = (A + C + E) / 3 + get_rand(-1, 1);
  160.  
  161. if (!map[mid_z][xmin])
  162. map[mid_z][xmin] = (A + B + E) / 3 + get_rand(-1, 1);
  163.  
  164. if (!map[zmax][mid_x])
  165. map[zmax][mid_x] = (B + D + E) / 3 + get_rand(-1, 1);
  166.  
  167. if (!map[mid_z][xmax])
  168. map[mid_z][xmax] = (C + D + E) / 3 + get_rand(-1, 1);
  169.  
  170. disp /= 2.0;
  171. if (mid_z - zmin > 1)
  172. {
  173. generate_map(map, zmin, mid_z, xmin, mid_x, disp); // Top Left
  174. generate_map(map, mid_z, zmax, xmin, mid_x, disp); // Bottom Left
  175. generate_map(map, zmin, mid_z, mid_x, xmax, disp); // Top Right
  176. generate_map(map, mid_z, zmax, mid_x, xmax, disp); // Bottom Right
  177. }
  178. }
  179.  
  180. int main(int argc, char** argv)
  181. {
  182. srand(time(0));
  183. glutInit(&argc, argv);
  184. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  185. glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
  186. glutInitWindowPosition(100, 100);
  187. glutCreateWindow("simple");
  188. glutDisplayFunc(mydisplay);
  189. glutKeyboardFunc(mykeyboard);
  190. glutIdleFunc(myidlefunc);
  191. glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
  192. glEnable(GL_DEPTH_TEST);
  193. glEnable(GL_NORMALIZE);
  194. glEnable(GL_LIGHTING);
  195. glEnable(GL_LIGHT0);
  196. glEnable(GL_CULL_FACE);
  197. glClearColor(0, 0, 0, 1.0f);
  198. glMatrixMode(GL_PROJECTION);
  199. glLoadIdentity();
  200. gluPerspective(80, (float)SCREEN_WIDTH/SCREEN_HEIGHT, 0.1, 10000);
  201. glMatrixMode(GL_MODELVIEW);
  202. gluLookAt(1000.0, 300.0, 1000.0,
  203. 100.0, 0.0, 100.0,
  204. 0.0, 1.0, 0.0);
  205. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  206. init_map(terrain_map);
  207. glutMainLoop();
  208. }
  209.  
  210. int get_rand(int min, int max)
  211. {
  212. int n;
  213.  
  214. if (min < 0)
  215. {
  216. n = rand() % (-min + max);
  217. if (n > max)
  218. n = (n - max) * -1;
  219. }
  220. else
  221. {
  222. n = rand() % (min + max);
  223. if (n > max)
  224. n = (n - max);
  225. }
  226.  
  227. return n;
  228. }
Add Comment
Please, Sign In to add comment