44#include < glm/ext.hpp>
55#include " OBJ.hpp"
66
7+ #include < vector>
8+
79struct Game ::Private { // P-IMPL pattern
810 glm::mat4x4 viewMat;
911 glm::mat4x4 projMat;
1012
11- OBJ monkey ;
13+ std::vector< OBJ> ocvLogo ;
1214};
1315
14- Game::Game () : m_private(std::make_unique<Private>()) {}
16+ Game::Game () : m_private(std::make_unique<Private>()), m_window( nullptr ) {}
1517
1618Game::~Game () = default ;
1719
@@ -31,11 +33,52 @@ void Game::set_window(GLFWwindow *window) {
3133#endif
3234
3335void Game::initialize () {
34- /* m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/opencvpart.obj"); */
35- m_private->monkey .load_obj (OPENGLTUTOR_HOME " assets/monkey.obj" );
36- /* m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/cube.obj"); */
36+ OBJ ocvpart;
37+ ocvpart.load_obj (OPENGLTUTOR_HOME " assets/opencvpart.obj" );
38+
39+ for (size_t i = 0 ; i < 3 ; ++i) {
40+ m_private->ocvLogo .push_back (ocvpart);
41+ }
42+ constexpr float short_side = 0 .65f ;
43+ glm::vec3 tri_sides = {short_side, 2 * short_side, short_side * sqrtf (3 )};
44+
45+ auto C0 = glm::vec3 (0 .0f , tri_sides.y , 0 .0f );
46+ auto C1 = glm::vec3 (-tri_sides.z , -tri_sides.x , 0 .0f );
47+ auto C2 = glm::vec3 (tri_sides.z , -tri_sides.x , 0 .0f );
48+
49+ std::vector<glm::mat4x4> cvLogoModel;
50+
51+ auto model = glm::mat4x4 (1 .0f );
52+ model = glm::translate (model, C0);
53+ model = glm::rotate (model, glm::radians (90 .0f ), glm::vec3 (1 .0f , 0 .0f , 0 .0f ));
54+ model = glm::rotate (model, glm::radians (150 .0f ), glm::vec3 (0 .0f , 1 .0f , 0 .0f ));
55+ cvLogoModel.push_back (model);
56+
57+ model = glm::mat4x4 (1 .0f );
58+ model = glm::translate (model, C1);
59+ model = glm::rotate (model, glm::radians (90 .0f ), glm::vec3 (1 .0f , 0 .0f , 0 .0f ));
60+ model = glm::rotate (model, glm::radians (-90 .0f ), glm::vec3 (0 .0f , 1 .0f , 0 .0f ));
61+ cvLogoModel.push_back (model);
62+
63+ model = glm::mat4x4 (1 .0f );
64+ model = glm::translate (model, C2);
65+ model = glm::rotate (model, glm::radians (90 .0f ), glm::vec3 (1 .0f , 0 .0f , 0 .0f ));
66+ model = glm::rotate (model, glm::radians (-30 .0f ), glm::vec3 (0 .0f , 1 .0f , 0 .0f ));
67+ cvLogoModel.push_back (model);
68+
69+ for (size_t i = 0 ; i < m_private->ocvLogo .size (); ++i) {
70+ auto & ocvPart = m_private->ocvLogo .at (i);
71+ auto & ocvPartModel = cvLogoModel.at (i);
72+ for (auto & vert : ocvPart.vertices ) {
73+ vert = ocvPartModel * glm::vec4 (vert, 1 .0f );
74+ }
75+ }
76+
77+ // m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/monkey.obj");
78+ // m_private->monkey.load_obj(OPENGLTUTOR_HOME "assets/cube.obj");
79+
3780 CHECK_GL (glEnable (GL_DEPTH_TEST));
38- CHECK_GL (glDisable (GL_MULTISAMPLE));
81+ CHECK_GL (glEnable (GL_MULTISAMPLE));
3982 CHECK_GL (glEnable (GL_BLEND));
4083 CHECK_GL (glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
4184 CHECK_GL (glEnable (GL_LIGHTING));
@@ -44,6 +87,7 @@ void Game::initialize() {
4487 CHECK_GL (glEnable (GL_CULL_FACE));
4588 CHECK_GL (glCullFace (GL_BACK));
4689 CHECK_GL (glFrontFace (GL_CCW));
90+ CHECK_GL (glShadeModel (GL_SMOOTH));
4791}
4892
4993void Game::render () {
@@ -57,19 +101,31 @@ void Game::render() {
57101
58102 CHECK_GL (glMatrixMode (GL_PROJECTION));
59103 CHECK_GL (glLoadMatrixf (glm::value_ptr (projection)));
60-
104+
61105 auto view = m_inputCtl.get_view_matrix ();
62-
106+
63107 glm::mat4x4 model (1 .0f );
108+
109+ static float motionAngle = 0 .0f ;
110+ static constexpr glm::vec3 motionAxis = { 0 .0f , 1 .0f , 0 .0f };
111+ static constexpr float motionDelta = 1 .2f ;
64112
65- static float angle = 0 .0f ;
66- model = glm::rotate (model, glm::radians (angle), glm::vec3 (0 .0f , 1 .0f , 0 .0f ));
67- model = glm::translate (model, glm::vec3 (0 .0f , 0 .12f * glm::sin (glm::radians (angle) * 2 .718f ), 0 .0f ));
68- angle += 0 .5f ;
69-
70113 CHECK_GL (glMatrixMode (GL_MODELVIEW));
114+
115+ model = glm::rotate (glm::mat4 (1 .0f ), glm::radians (motionAngle), motionAxis);
116+ CHECK_GL (glLoadMatrixf (glm::value_ptr (view * model)));
117+ glColor3f (1 .0f , 0 .0f , 0 .0f );
118+ m_private->ocvLogo .at (0 ).draw_obj ();
119+
120+ model = glm::rotate (glm::mat4 (1 .0f ), glm::radians (motionAngle), motionAxis);
121+ CHECK_GL (glLoadMatrixf (glm::value_ptr (view * model)));
122+ glColor3f (0 .0f , 1 .0f , 0 .0f );
123+ m_private->ocvLogo .at (1 ).draw_obj ();
124+
125+ model = glm::rotate (glm::mat4 (1 .0f ), glm::radians (motionAngle), motionAxis);
71126 CHECK_GL (glLoadMatrixf (glm::value_ptr (view * model)));
127+ glColor3f (0 .0f , 0 .0f , 1 .0f );
128+ m_private->ocvLogo .at (2 ).draw_obj ();
72129
73- glColor3f (0 .9f , 0 .6f , 0 .1f );
74- m_private->monkey .draw_obj ();
130+ motionAngle += motionDelta;
75131}
0 commit comments