@@ -30,6 +30,18 @@ namespace OpenGL
3030 return mb.get_mesh ();
3131 }
3232
33+ Data::Mesh make_axis_mesh ()
34+ {
35+ auto mb = Utility::MeshBuilder<Data::ColourVertex, OpenGL::PrimitiveMode::Triangles>{};
36+ mb.set_colour (glm::vec3 (1 .f , 0 .f , 0 .f ));
37+ mb.add_cylinder (glm::vec3 (0 .f ), glm::vec3 (1 .f , 0 .f , 0 .f ), 0 .02f , 12 ); // X
38+ mb.set_colour (glm::vec3 (0 .f , 1 .f , 0 .f ));
39+ mb.add_cylinder (glm::vec3 (0 .f ), glm::vec3 (0 .f , 1 .f , 0 .f ), 0 .02f , 12 ); // Y
40+ mb.set_colour (glm::vec3 (0 .f , 0 .f , 1 .f ));
41+ mb.add_cylinder (glm::vec3 (0 .f ), glm::vec3 (0 .f , 0 .f , 1 .f ), 0 .02f , 12 ); // Z
42+ return mb.get_mesh ();
43+ }
44+
3345 OpenGLRenderer::OpenGLRenderer (Platform::Window& p_window, System::AssetManager& p_asset_manager, System::SceneSystem& p_scene_system) noexcept
3446 : m_window{p_window}
3547 , m_screen_framebuffer{m_window.size ()}
@@ -49,9 +61,11 @@ namespace OpenGL
4961 , m_missing_texture{m_asset_manager.get_texture (" missing.png" )}
5062 , m_blank_texture{m_asset_manager.get_texture (" black.jpg" )}
5163 , m_screen_quad{make_screen_quad_mesh ()}
64+ , m_axis_mesh{make_axis_mesh ()}
5265 , m_post_processing_options{}
5366 , m_draw_shadows{false }
5467 , m_draw_grid{false }
68+ , m_draw_axes{true }
5569 , m_draw_terrain_nodes{false }
5670 , m_draw_terrain_wireframe{false }
5771 , m_visualise_terrain_normals{false }
@@ -249,6 +263,7 @@ namespace OpenGL
249263 {
250264 ImGui::Checkbox (" Draw shadows" , &m_draw_shadows);
251265 ImGui::Checkbox (" Draw grid" , &m_draw_grid);
266+ ImGui::Checkbox (" Draw axes" , &m_draw_axes);
252267 ImGui::Checkbox (" Draw terrain nodes" , &m_draw_terrain_nodes);
253268 ImGui::Checkbox (" Draw terrain wireframe" , &m_draw_terrain_wireframe);
254269 ImGui::Checkbox (" Debug terrain Normals" , &m_visualise_terrain_normals);
@@ -321,5 +336,24 @@ namespace OpenGL
321336 dc.set_texture (" screen_texture" , m_screen_framebuffer.color_attachment ());
322337
323338 dc.submit_default (m_screen_texture_shader, m_screen_quad.get_VAO (), m_window.size ());
339+
340+ if (m_draw_axes)
341+ {
342+ DrawCall axes_dc;
343+ float axis_size = 20 .f ;
344+ axes_dc.set_uniform (" model" , glm::scale (glm::identity<glm::mat4>(), glm::vec3 (axis_size)));
345+
346+ // Copy and modify the view information to create an orthographic projection with no translation
347+ auto view_prop = m_scene_system.get_current_scene_view_info ();
348+ auto view_no_translation = glm::mat4 (glm::mat3 (view_prop.m_view )); // Remove translation from view matrix.
349+ view_prop.m_view = view_no_translation;
350+ view_prop.m_projection = glm::ortho (-axis_size, axis_size, -axis_size, axis_size, -axis_size, axis_size);
351+
352+ m_view_properties_buffer.set_data (view_prop, 0 );
353+ axes_dc.set_UBO (" ViewProperties" , m_view_properties_buffer);
354+ axes_dc.m_depth_test_enabled = false ;
355+ axes_dc.m_cull_face_enabled = false ;
356+ axes_dc.submit_default (m_colour_shader, m_axis_mesh.get_VAO (), {128 , 128 });
357+ }
324358 }
325359} // namespace OpenGL
0 commit comments