@@ -9,43 +9,81 @@ using namespace hitagi::math;
99using namespace hitagi ::asset;
1010
1111void SceneViewPort::Tick () {
12- m_GuiManager .DrawGui ([&]() {
12+ m_Engine. GuiManager () .DrawGui ([&]() {
1313 if (ImGui::Begin (" Scene Viewer" , &m_Open)) {
14- if (m_CurrentScene) {
15- const auto v_min = ImGui::GetWindowContentRegionMin ();
16- const auto v_max = ImGui::GetWindowContentRegionMax ();
17- const auto window_size = math::vec2u{
18- static_cast <std::uint32_t >(v_max.x - v_min.x ),
19- static_cast <std::uint32_t >(v_max.y - v_min.y )};
20-
21- auto & render_graph = m_Render.GetRenderGraph ();
22-
23- auto scene_render_texture = render_graph.Create (gfx::TextureDesc{
24- .name = " Scene Render Texture" ,
25- .width = window_size.x ,
26- .height = window_size.y ,
27- .format = gfx::Format::R8G8B8A8_UNORM,
28- .clear_value = math::Color{0 .0f , 0 .0f , 0 .0f , 1 .0f },
29- .usages = gfx::TextureUsageFlags::RenderTarget | gfx::TextureUsageFlags::SRV,
30- });
31-
32- auto camera = m_Camera.GetComponent <asset::CameraComponent>().camera ;
33- auto camera_transform = m_Camera.GetComponent <asset::Transform>().world_matrix ;
34-
35- camera->parameters .aspect = static_cast <float >(window_size.x ) / static_cast <float >(window_size.y );
36-
37- if (window_size.x != 0 && window_size.y != 0 ) {
38- m_Render.RenderScene (m_CurrentScene, *camera, camera_transform, scene_render_texture);
39- ImGui::Image (m_GuiManager.ReadTexture (scene_render_texture), ImVec2 (window_size.x , window_size.y ));
40- }
41- }
14+ MoveCamera ();
15+ RenderScene ();
4216 }
4317 ImGui::End ();
4418 });
4519
4620 RuntimeModule::Tick ();
4721}
4822
23+ void SceneViewPort::MoveCamera () const {
24+ if (m_CurrentScene) {
25+ auto & input_manager = m_Engine.App ().GetInputManager ();
26+
27+ auto camera = m_Camera;
28+
29+ const auto & camera_param = camera.Get <asset::CameraComponent>().camera ->parameters ;
30+ auto & camera_transform = camera.Get <asset::Transform>();
31+
32+ auto delta_time = m_Engine.GetDeltaTime ().count ();
33+ auto speed = 10 .0f * delta_time;
34+
35+ if (input_manager.GetBool (hid::VirtualKeyCode::KEY_W)) {
36+ camera_transform.Translate (camera_param.look_dir * speed);
37+ }
38+ if (input_manager.GetBool (hid::VirtualKeyCode::KEY_S)) {
39+ camera_transform.Translate (-camera_param.look_dir * speed);
40+ }
41+ if (input_manager.GetBool (hid::VirtualKeyCode::KEY_A)) {
42+ camera_transform.Translate (-math::normalize (math::cross (camera_param.look_dir , camera_param.up )) * speed);
43+ }
44+ if (input_manager.GetBool (hid::VirtualKeyCode::KEY_D)) {
45+ camera_transform.Translate (math::normalize (math::cross (camera_param.look_dir , camera_param.up )) * speed);
46+ }
47+
48+ if (input_manager.GetBool (hid::VirtualKeyCode::MOUSE_R_BUTTON)) {
49+ const auto mouse_delta = math::vec2f{input_manager.GetFloatDelta (hid::MouseEvent::MOVE_X), input_manager.GetFloatDelta (hid::MouseEvent::MOVE_Y)};
50+ camera_transform.Rotate (get_rotation (math::rotate_z (-mouse_delta.x * 0 .01f ) * math::rotate_x (-mouse_delta.y * 0 .01f )));
51+ }
52+ }
53+ }
54+
55+ void SceneViewPort::RenderScene () const {
56+ if (m_CurrentScene) {
57+ const auto v_min = ImGui::GetWindowContentRegionMin ();
58+ const auto v_max = ImGui::GetWindowContentRegionMax ();
59+ const auto window_size = math::vec2u{
60+ static_cast <std::uint32_t >(v_max.x - v_min.x ),
61+ static_cast <std::uint32_t >(v_max.y - v_min.y )};
62+
63+ auto & render = m_Engine.Renderer ();
64+ auto & render_graph = render.GetRenderGraph ();
65+
66+ auto scene_render_texture = render_graph.Create (gfx::TextureDesc{
67+ .name = " Scene Render Texture" ,
68+ .width = window_size.x ,
69+ .height = window_size.y ,
70+ .format = gfx::Format::R8G8B8A8_UNORM,
71+ .clear_value = math::Color{0 .0f , 0 .0f , 0 .0f , 1 .0f },
72+ .usages = gfx::TextureUsageFlags::RenderTarget | gfx::TextureUsageFlags::SRV,
73+ });
74+
75+ auto camera = m_Camera.Get <asset::CameraComponent>().camera ;
76+ auto camera_transform = m_Camera.Get <asset::Transform>().world_matrix ;
77+
78+ camera->parameters .aspect = static_cast <float >(window_size.x ) / static_cast <float >(window_size.y );
79+
80+ if (window_size.x != 0 && window_size.y != 0 ) {
81+ render.RenderScene (m_CurrentScene, *camera, camera_transform, scene_render_texture);
82+ ImGui::Image (m_Engine.GuiManager ().ReadTexture (scene_render_texture), ImVec2 (window_size.x , window_size.y ));
83+ }
84+ }
85+ }
86+
4987void SceneViewPort::SetScene (std::shared_ptr<asset::Scene> scene) noexcept {
5088 m_CurrentScene = std::move (scene);
5189 if (m_CurrentScene != nullptr ) {
0 commit comments