Advertisement
Guest User

Untitled

a guest
May 3rd, 2017
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. // gcc -o test.exe -mwindows -mconsole test.c glad.c -lopengl32 -lglfw3
  2.  
  3. #include <stdio.h>
  4. #include <glad\glad.h>
  5. #include <GLFW\glfw3.h>
  6.  
  7. float step = 0.1f;
  8. float scale = 1.04f;
  9.  
  10. #define PAN_X_DEFAULT -0.1f
  11. #define PAN_Y_DEFAULT -0.35f
  12. #define ZOOM_K_DEFAULT 180.0f
  13.  
  14. GLFWmonitor* test_monitor = NULL;
  15. GLFWwindow* test_window = NULL;
  16.  
  17. int test_width = 1024;
  18. int test_height = 780;
  19.  
  20. BOOL test_fullscreen = FALSE;
  21.  
  22. GLfloat pan_x = PAN_X_DEFAULT;
  23. GLfloat pan_y = PAN_Y_DEFAULT;
  24. GLfloat zoom_k = ZOOM_K_DEFAULT;
  25.  
  26. int test_verbose = 2;
  27.  
  28. GLvoid reset(GLvoid)
  29. {
  30. pan_x = PAN_X_DEFAULT;
  31. pan_y = PAN_Y_DEFAULT;
  32. zoom_k = ZOOM_K_DEFAULT;
  33. }
  34.  
  35. GLvoid zoom(double factor)
  36. {
  37. zoom_k *= factor;
  38.  
  39. if (zoom_k < 0.01f) zoom_k = 0.01f;
  40. if (zoom_k > 1000000.0f) zoom_k = 1000000.0f;
  41. }
  42.  
  43. GLvoid pan(double dx, double dy)
  44. {
  45. pan_x += dx / zoom_k;
  46. pan_y += dy / zoom_k;
  47. }
  48.  
  49. GLvoid zoom_at(double x, double y, double factor)
  50. {
  51. pan(-x, -y);
  52. zoom(factor);
  53. pan(x, y);
  54. }
  55.  
  56. void error_callback(int error, const char* description)
  57. {
  58. fprintf(stderr, "Error: %s\n", description);
  59. }
  60.  
  61. void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
  62. {
  63. if (action != GLFW_PRESS)
  64. return;
  65.  
  66. switch (key)
  67. {
  68. case GLFW_KEY_ESCAPE:
  69. glfwSetWindowShouldClose(window, GLFW_TRUE);
  70. break;
  71.  
  72. case GLFW_KEY_HOME:
  73. if (test_verbose >= 2) printf("reset to original view\n");
  74. reset();
  75. break;
  76.  
  77. case GLFW_KEY_UP:
  78. if (test_verbose >= 2) printf("move up\n");
  79. pan(0, -step);
  80. break;
  81.  
  82. case GLFW_KEY_DOWN:
  83. if (test_verbose >= 2) printf("move down\n");
  84. pan(0, step);
  85. break;
  86.  
  87. case GLFW_KEY_RIGHT:
  88. if (test_verbose >= 2) printf("move right\n");
  89. pan(-step, 0);
  90. break;
  91.  
  92. case GLFW_KEY_LEFT:
  93. if (test_verbose >= 2) printf("move left\n");
  94. pan( step, 0);
  95. break;
  96.  
  97. case GLFW_KEY_PAGE_UP:
  98. if (test_verbose >= 2) printf("zoom in\n");
  99. zoom_at(test_width/2, test_height/2, scale);
  100. break;
  101.  
  102. case GLFW_KEY_PAGE_DOWN:
  103. if (test_verbose >= 2) printf("zoom out\n");
  104. zoom_at(test_width/2, test_height/2, 1.0/scale);
  105. break;
  106. }
  107. }
  108.  
  109. GLvoid draw_map(GLvoid)
  110. {
  111. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  112.  
  113. glMatrixMode(GL_MODELVIEW);
  114. glLoadIdentity();
  115. glScalef(zoom_k, zoom_k, 1);
  116. glTranslatef(pan_x, pan_y, 0);
  117.  
  118. glLineWidth(2.0f);
  119. glColor3f(1.0, 1.0, 1.0); // white
  120. glBegin(GL_LINE_STRIP);
  121. glVertex2f(0.1, 0.1);
  122. glVertex2f(0.2, 0.1);
  123. glVertex2f(0.1, 0.2);
  124. glVertex2f(0.2, 0.2);
  125. glVertex2f(100.3, 10.1);
  126. glVertex2f(100.4, 10.1);
  127. glVertex2f(100.3, 10.2);
  128. glVertex2f(100.4, 10.2);
  129. glVertex2f(1100.3, 110.1);
  130. glVertex2f(1100.4, 110.1);
  131. glVertex2f(1100.3, 110.2);
  132. glVertex2f(1100.4, 110.2);
  133. glEnd();
  134. }
  135.  
  136. GLvoid DrawGLScene(GLvoid)
  137. {
  138. glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  139. glClear(GL_COLOR_BUFFER_BIT);
  140.  
  141. draw_map();
  142. }
  143.  
  144. int main ( int argc, char* argv[])
  145. {
  146.  
  147. glfwSetErrorCallback(error_callback);
  148.  
  149. if (!glfwInit())
  150. exit(EXIT_FAILURE);
  151.  
  152. glfwWindowHint(GLFW_DECORATED, GLFW_TRUE);
  153.  
  154. test_monitor = glfwGetPrimaryMonitor();
  155.  
  156. test_window = glfwCreateWindow(test_width, test_height, "Test Program", NULL, NULL);
  157. if (!test_window)
  158. {
  159. fprintf( stderr, "Failed to create GLFW window\n" );
  160. glfwTerminate();
  161. exit( EXIT_FAILURE );
  162. }
  163.  
  164. glfwSetWindowSizeLimits(test_window, 640, 480, GLFW_DONT_CARE, GLFW_DONT_CARE);
  165.  
  166. glfwSetKeyCallback(test_window, key_callback);
  167. glfwMakeContextCurrent(test_window);
  168. gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
  169. glfwSwapInterval(1);
  170.  
  171. glfwGetFramebufferSize(test_window, &test_width, &test_height);
  172. glViewport(0, 0, test_width, test_height);
  173.  
  174. while ( !glfwWindowShouldClose(test_window))
  175. {
  176.  
  177. DrawGLScene();
  178.  
  179. glfwSwapBuffers(test_window);
  180. glfwPollEvents();
  181. }
  182.  
  183. glfwTerminate();
  184. exit(EXIT_SUCCESS);
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement