text: // Bryn Mawr College, alinen, 2020
  //
  
  #include "AGL.h"
  #include "AGLM.h"
  #include <cmath>
  #include <fstream>
  #include <sstream>
  #include <vector>
  #include "renderer.h"
  
  using namespace std;
  using namespace glm;
  using namespace agl;
  
  Renderer theRenderer;
  
  static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
  {
     if (action != GLFW_PRESS) return;
  
     if (key == GLFW_KEY_ESCAPE)
     {
        glfwSetWindowShouldClose(window, GLFW_TRUE);
     }
  }
  
  static void framebuffer_size_callback(GLFWwindow* window, int width, int height)
  {
     // Prevent a divide by zero
     if (height == 0) height = 1;
  
     // Set Viewport to window dimensions
     glViewport(0, 0, width, height);
     theRenderer.perspective(radians(60.0f), 1.0f, 0.1f, 100.0f);
  }
  
  static void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
  {
  }
  
  static void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
  {
  }
  
  static void cursor_position_callback(GLFWwindow* window, double xpos, double ypos)
  {
  }
  
  int main(int argc, char** argv)
  {
     GLFWwindow* window;
  
     if (!glfwInit())
     {
        return -1;
     }
  
     // Explicitly ask for a 4.0 context 
     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  
     /* Create a windowed mode window and its OpenGL context */
     float width = 500;
     float height = 500;
     window = glfwCreateWindow(width, height, "Billboard Viewer", NULL, NULL);
     if (!window)
     {
        glfwTerminate();
        return -1;
     }
  
     glfwMakeContextCurrent(window);
     glfwSetKeyCallback(window, key_callback);
     glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
     glfwSetMouseButtonCallback(window, mouse_button_callback);
     glfwSetScrollCallback(window, scroll_callback);
     glfwSetCursorPosCallback(window, cursor_position_callback);
  
  #ifndef APPLE
     if (glewInit() != GLEW_OK)
     {
        cout << "Cannot initialize GLEW\n";
        return -1;
     }
  #endif
  
     glEnable(GL_DEPTH_TEST);
     glEnable(GL_CULL_FACE);
     glClearColor(0, 0, 0, 1);
  
     theRenderer.init("../shaders/billboard.vs", "../shaders/billboard.fs");
     GLuint imageId = theRenderer.loadTexture("../textures/particle.png");
     theRenderer.perspective(radians(30.0f), 1.0f, 0.1f, 100.0f);
  
     while (!glfwWindowShouldClose(window))
     {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the buffers
  
        float theta = glfwGetTime();
        float x = 6.0f * cos(theta);
        float z = 6.0f * sin(theta);
        theRenderer.lookAt(vec3(x, 0, z), vec3(0));
  
        theRenderer.begin(imageId, ALPHA);
        theRenderer.quad(vec3(0), vec4(1.0, 0.0, 0.5, 1.0), 2.0f);
        theRenderer.end();
  
        // Swap front and back buffers
        glfwSwapBuffers(window);
  
        // Poll for and process events
        glfwPollEvents();
     }
  
     glfwTerminate();
     return 0;
  }
  
  
  
  