From 46ca51efc114032dfd171cba55807e86796ad151 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Fri, 28 Feb 2025 00:32:33 -0600 Subject: [PATCH] VideoCommon: add action to create a camera that is relative to the game view --- .../Runtime/Actions/RelativeCameraAction.cpp | 111 ++++++++++++++++++ .../Runtime/Actions/RelativeCameraAction.h | 30 +++++ 2 files changed, 141 insertions(+) create mode 100644 Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.cpp create mode 100644 Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.h diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.cpp new file mode 100644 index 0000000000..31a4849da4 --- /dev/null +++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.cpp @@ -0,0 +1,111 @@ +// Copyright 2025 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.h" + +#include +#include +#include +#include + +#include +#include + +#include "Core/System.h" + +#include "VideoCommon/AbstractTexture.h" +#include "VideoCommon/FreeLookCamera.h" +#include "VideoCommon/GraphicsModEditor/Controls/AssetDisplay.h" +#include "VideoCommon/GraphicsModEditor/EditorEvents.h" +#include "VideoCommon/GraphicsModEditor/EditorMain.h" +#include "VideoCommon/GraphicsModEditor/EditorState.h" +#include "VideoCommon/Resources/CustomResourceManager.h" + +std::unique_ptr +RelativeCameraAction::Create(const picojson::value& json_data, + std::shared_ptr library) +{ + if (!json_data.is()) + return nullptr; + + // const auto& obj = json_data.get(); + + return std::make_unique(std::move(library)); +} + +RelativeCameraAction::RelativeCameraAction(std::shared_ptr library) + : m_library(std::move(library)) +{ +} + +RelativeCameraAction::RelativeCameraAction(std::shared_ptr library, + GraphicsModSystem::Camera camera) + : m_library(std::move(library)), m_camera(std::move(camera)) +{ +} + +void RelativeCameraAction::OnDrawStarted(GraphicsModActionData::DrawStarted* draw_started) +{ + if (!draw_started) [[unlikely]] + return; + + if (!draw_started->camera) [[unlikely]] + return; + + auto& resource_manager = Core::System::GetInstance().GetCustomResourceManager(); + const auto resource = resource_manager.GetRenderTargetFromAsset(m_color_rt_asset_id, m_library); + if (resource) + { + // resource->GetData(); + *draw_started->camera = m_camera; + } +} + +void RelativeCameraAction::DrawImGui() +{ + auto& editor = Core::System::GetInstance().GetGraphicsModEditor(); + if (ImGui::CollapsingHeader("Camera Data", ImGuiTreeNodeFlags_DefaultOpen)) + { + if (ImGui::BeginTable("Camera Form", 2)) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Transform"); + ImGui::TableNextColumn(); + for (std::size_t i = 0; i < 4; i++) + { + const std::span vec4 = m_camera.transform.data | std::views::take(4); + ImGui::InputFloat4(fmt::format("##CameraTransform{}", i).c_str(), vec4.data()); + } + if (ImGui::Button("Set to current Freelook view")) + { + m_camera.transform = g_freelook_camera.GetView(); + } + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Custom render taget"); + ImGui::TableNextColumn(); + if (GraphicsModEditor::Controls::AssetDisplay("Render target", editor.GetEditorState(), + &m_color_rt_asset_id, + GraphicsModEditor::RenderTarget)) + { + GraphicsModEditor::EditorEvents::AssetReloadEvent::Trigger(m_camera.asset_id); + } + ImGui::EndTable(); + } + } +} + +void RelativeCameraAction::SerializeToConfig(picojson::object* obj) +{ + if (!obj) [[unlikely]] + return; + + auto& json_obj = *obj; + json_obj["color_rt_asset"] = picojson::value{m_color_rt_asset_id}; +} + +std::string RelativeCameraAction::GetFactoryName() const +{ + return std::string{factory_name}; +} diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.h new file mode 100644 index 0000000000..cfbf874be0 --- /dev/null +++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/Actions/RelativeCameraAction.h @@ -0,0 +1,30 @@ +// Copyright 2025 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include + +#include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h" + +class RelativeCameraAction final : public GraphicsModAction +{ +public: + static constexpr std::string_view factory_name = "relative_camera"; + static std::unique_ptr + Create(const picojson::value& json_data, + std::shared_ptr library); + explicit RelativeCameraAction(std::shared_ptr library); + RelativeCameraAction(std::shared_ptr library, + GraphicsModSystem::Camera camera); + void OnDrawStarted(GraphicsModActionData::DrawStarted*) override; + + void DrawImGui() override; + void SerializeToConfig(picojson::object* obj) override; + std::string GetFactoryName() const override; + +private: + std::shared_ptr m_library; + VideoCommon::CustomAssetLibrary::AssetID m_color_rt_asset_id; + GraphicsModSystem::Camera m_camera; +};