44#include < glm/ext.hpp>
55#include " OBJ.hpp"
66
7- struct Game ::Private {
7+ struct Game ::Private { // P-IMPL pattern
8+ glm::mat4x4 viewMat;
9+ glm::mat4x4 projMat;
10+
811 OBJ monkey;
912};
1013
11- Game::Game (GLFWwindow *window) : m_private(new Private), m_window(window) {
12- glfwSetWindowUserPointer (window, this );
13- }
14+ Game::Game () : m_private(std::make_unique<Private>()) {}
1415
1516Game::~Game () = default ;
1617
18+ Game &Game::get () {
19+ static Game game; // singleton
20+ return game;
21+ }
22+
23+ void Game::set_window (GLFWwindow *window) {
24+ m_window = window;
25+ glfwSetWindowUserPointer (window, this );
26+ m_inputCtl.register_callbacks (window);
27+ }
28+
1729void Game::initialize () {
18- m_private->monkey .load_obj (" /home/bate/Codes/opengltutor/assets/monkey.obj" );
30+ /* m_private->monkey.load_obj("/home/bate/Codes/opengltutor/assets/monkey.obj"); */
31+ m_private->monkey .load_obj (" /home/bate/Codes/opengltutor/assets/cube.obj" );
1932 CHECK_GL (glEnable (GL_DEPTH_TEST));
2033 CHECK_GL (glEnable (GL_MULTISAMPLE));
2134 CHECK_GL (glEnable (GL_BLEND));
@@ -35,59 +48,25 @@ void Game::render() {
3548
3649 CHECK_GL (glClear (GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT));
3750
38- glm::mat4x4 projection = glm::perspective (glm::radians (40 .0f ), (float )width / height, 0 .01f , 100 .0f );
39- /* projection = glm::ortho(-2.0f, 2.0f, -2.0f, 2.0f, 0.0f, 100.0f); */
40- /* projection = glm::frustum(-0.005f, 0.005f, -0.005f, 0.005f, 0.01f, 100.0f); */
51+ auto projection = m_inputCtl.get_projection_matrix ();
52+
4153 CHECK_GL (glMatrixMode (GL_PROJECTION));
4254 CHECK_GL (glLoadMatrixf (glm::value_ptr (projection)));
43-
44- glm::vec3 eye (0 , 0 , 5 );
45- glm::vec3 center (0 , 0 , 0 );
46- glm::vec3 up (0 , 1 , 0 );
47- glm::mat4x4 view = glm::lookAt (eye, center, up);
48-
55+
56+ /* glm::vec3 eye(0, 0, 5); */
57+ /* glm::vec3 center(0, 0, 0); */
58+ /* glm::vec3 up(0, 1, 0); */
59+ /* glm::mat4x4 view = glm::lookAt(eye, center, up); */
60+ auto view = m_inputCtl.get_view_matrix ();
61+
4962 static float angle = 0 .0f ;
5063 glm::mat4x4 model (1 .0f );
51- model = glm::rotate (model, glm::radians (angle), glm::vec3 (0 .0f , 1 .0f , 0 .0f ));
52- model = glm::translate (model, glm::vec3 (0 .0f , 0 .0f , 0 .0f ));
53- angle += 0 .5f ;
54-
64+ /* model = glm::rotate(model, glm::radians(angle), glm::vec3(0.0f, 1.0f, 0.0f)); */
65+ /* model = glm::translate(model, glm::vec3(0.0f, 0.12f * glm::sin(glm::radians(angle) * 2.718f) , 0.0f)); */
66+ /* angle += 0.5f; */
67+
5568 CHECK_GL (glMatrixMode (GL_MODELVIEW));
5669 CHECK_GL (glLoadMatrixf (glm::value_ptr (view * model)));
5770
5871 m_private->monkey .draw_obj ();
5972}
60-
61- void Game::cursor_pos_callback (double xpos, double ypos) {
62- int width, height;
63- glfwGetWindowSize (m_window, &width, &height);
64-
65- float x = (float )(2 * xpos / width - 1 );
66- float y = (float )(2 * (height - ypos) / height - 1 );
67-
68- if (glfwGetMouseButton (m_window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS) {
69- // TODO: when left mouse button is dragged
70- }
71- }
72-
73- void Game::mouse_button_callback (int button, int action, int mods) {
74- double xpos, ypos;
75- glfwGetCursorPos (m_window, &xpos, &ypos);
76- int width, height;
77- glfwGetWindowSize (m_window, &width, &height);
78-
79- float x = (float )(2 * xpos / width - 1 );
80- float y = (float )(2 * (height - ypos) / height - 1 );
81-
82- if ( button == GLFW_MOUSE_BUTTON_LEFT
83- && action == GLFW_PRESS
84- ) {
85- // TODO: when left mouse button is pressed
86- }
87- }
88-
89- void Game::scroll_callback (double xoffset, double yoffset) {
90- }
91-
92- void Game::key_callback (int key, int scancode, int action, int mods) {
93- }
0 commit comments