From 106aac611ae8e846361294f78917da18e7bcd469 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Mon, 17 Jun 2024 00:17:14 -0500 Subject: [PATCH] VideoCommon: add graphics mod editor functionality to determine if a draw call is filtered --- .../GraphicsModEditor/EditorFilter.cpp | 85 +++++++++++++++++++ .../GraphicsModEditor/EditorFilter.h | 37 ++++++++ 2 files changed, 122 insertions(+) create mode 100644 Source/Core/VideoCommon/GraphicsModEditor/EditorFilter.cpp create mode 100644 Source/Core/VideoCommon/GraphicsModEditor/EditorFilter.h diff --git a/Source/Core/VideoCommon/GraphicsModEditor/EditorFilter.cpp b/Source/Core/VideoCommon/GraphicsModEditor/EditorFilter.cpp new file mode 100644 index 0000000000..5576b27d27 --- /dev/null +++ b/Source/Core/VideoCommon/GraphicsModEditor/EditorFilter.cpp @@ -0,0 +1,85 @@ +// Copyright 2024 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "VideoCommon/GraphicsModEditor/EditorFilter.h" + +#include + +#include "Common/EnumUtils.h" + +#include "VideoCommon/GraphicsModEditor/EditorState.h" +#include "VideoCommon/XFMemory.h" + +namespace GraphicsModEditor +{ + +bool DoesDrawCallMatchFilter(const DrawCallFilterContext& context, const EditorState& state, + GraphicsModSystem::DrawCallID draw_call_id) +{ + const auto runtime_iter = state.m_runtime_data.m_draw_call_id_to_data.find(draw_call_id); + if (runtime_iter == state.m_runtime_data.m_draw_call_id_to_data.end()) + return false; + + bool filter = true; + + if (!context.text.empty()) + { + if (const auto user_iter = state.m_user_data.m_draw_call_id_to_user_data.find(draw_call_id); + user_iter != state.m_user_data.m_draw_call_id_to_user_data.end() && + !user_iter->second.m_friendly_name.empty()) + { + filter &= user_iter->second.m_friendly_name.find(context.text) != std::string::npos; + } + else + { + const std::string id = fmt::to_string(Common::ToUnderlying(draw_call_id)); + filter &= id.find(context.text) != std::string::npos; + } + } + + u8 texture_count = 0; + u8 efb_count = 0; + for (const auto& texture : runtime_iter->second.draw_data.textures) + { + if (texture.texture_type == GraphicsModSystem::TextureType::Normal) + texture_count++; + + if (texture.texture_type == GraphicsModSystem::TextureType::EFB) + efb_count++; + } + + switch (context.texture_filter) + { + case DrawCallFilterContext::TextureFilter::Any: + // nop + break; + case DrawCallFilterContext::TextureFilter::TextureOnly: + filter &= texture_count > 0 && efb_count == 0; + break; + case DrawCallFilterContext::TextureFilter::EFBOnly: + filter &= texture_count == 0 && efb_count > 0; + break; + case DrawCallFilterContext::TextureFilter::Both: + filter &= texture_count > 0 && efb_count > 0; + break; + case DrawCallFilterContext::TextureFilter::None: + filter &= texture_count == 0 && efb_count == 0; + break; + }; + + switch (context.projection_filter) + { + case DrawCallFilterContext::ProjectionFilter::Any: + // nop + break; + case DrawCallFilterContext::ProjectionFilter::Orthographic: + filter &= runtime_iter->second.draw_data.projection_type == ProjectionType::Orthographic; + break; + case DrawCallFilterContext::ProjectionFilter::Perspective: + filter &= runtime_iter->second.draw_data.projection_type == ProjectionType::Perspective; + break; + }; + + return filter; +} +} // namespace GraphicsModEditor diff --git a/Source/Core/VideoCommon/GraphicsModEditor/EditorFilter.h b/Source/Core/VideoCommon/GraphicsModEditor/EditorFilter.h new file mode 100644 index 0000000000..f21936e732 --- /dev/null +++ b/Source/Core/VideoCommon/GraphicsModEditor/EditorFilter.h @@ -0,0 +1,37 @@ +// Copyright 2024 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "VideoCommon/GraphicsModSystem/Types.h" + +namespace GraphicsModEditor +{ +struct EditorState; + +struct DrawCallFilterContext +{ + std::string text; + + enum class TextureFilter + { + Any, + EFBOnly, + TextureOnly, + Both, + None + }; + TextureFilter texture_filter = TextureFilter::Any; + + enum class ProjectionFilter + { + Any, + Orthographic, + Perspective + }; + ProjectionFilter projection_filter = ProjectionFilter::Any; +}; + +bool DoesDrawCallMatchFilter(const DrawCallFilterContext& context, const EditorState& state, + GraphicsModSystem::DrawCallID draw_call_id); +} // namespace GraphicsModEditor