daily pastebin goal
39%
SHARE
TWEET

Untitled

a guest May 3rd, 2017 74 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
Top