VideoCommon: add logic to handle a GraphicsMod while Dolphin is running

This commit is contained in:
iwubcode
2022-03-05 00:41:14 -06:00
parent 254246b814
commit f416b71925
17 changed files with 729 additions and 0 deletions

View File

@ -0,0 +1,47 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "VideoCommon/GraphicsModSystem/Runtime/Actions/MoveAction.h"
std::unique_ptr<MoveAction> MoveAction::Create(const picojson::value& json_data)
{
Common::Vec3 position_offset;
const auto& x = json_data.get("X");
if (x.is<double>())
{
position_offset.x = static_cast<float>(x.get<double>());
}
const auto& y = json_data.get("Y");
if (y.is<double>())
{
position_offset.y = static_cast<float>(y.get<double>());
}
const auto& z = json_data.get("Z");
if (z.is<double>())
{
position_offset.z = static_cast<float>(z.get<double>());
}
return std::make_unique<MoveAction>(position_offset);
}
MoveAction::MoveAction(Common::Vec3 position_offset) : m_position_offset(position_offset)
{
}
void MoveAction::OnProjection(Common::Matrix44* matrix)
{
if (!matrix)
return;
*matrix *= Common::Matrix44::Translate(m_position_offset);
}
void MoveAction::OnProjectionAndTexture(Common::Matrix44* matrix)
{
if (!matrix)
return;
*matrix *= Common::Matrix44::Translate(m_position_offset);
}

View File

@ -0,0 +1,22 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <memory>
#include <picojson.h>
#include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h"
class MoveAction final : public GraphicsModAction
{
public:
static std::unique_ptr<MoveAction> Create(const picojson::value& json_data);
explicit MoveAction(Common::Vec3 position_offset);
void OnProjection(Common::Matrix44* matrix) override;
void OnProjectionAndTexture(Common::Matrix44* matrix) override;
private:
Common::Vec3 m_position_offset;
};

View File

@ -0,0 +1,36 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "VideoCommon/GraphicsModSystem/Runtime/Actions/PrintAction.h"
#include "Common/Logging/Log.h"
void PrintAction::OnDrawStarted(bool*)
{
INFO_LOG_FMT(VIDEO, "OnDrawStarted Called");
}
void PrintAction::OnEFB(bool*, u32 texture_width, u32 texture_height, u32* scaled_width,
u32* scaled_height)
{
if (!scaled_width || !scaled_height)
return;
INFO_LOG_FMT(VIDEO, "OnEFB Called. Original [{}, {}], Scaled [{}, {}]", texture_width,
texture_height, *scaled_width, *scaled_height);
}
void PrintAction::OnProjection(Common::Matrix44*)
{
INFO_LOG_FMT(VIDEO, "OnProjection Called");
}
void PrintAction::OnProjectionAndTexture(Common::Matrix44*)
{
INFO_LOG_FMT(VIDEO, "OnProjectionAndTexture Called");
}
void PrintAction::OnTextureLoad()
{
INFO_LOG_FMT(VIDEO, "OnTextureLoad Called");
}

View File

@ -0,0 +1,17 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h"
class PrintAction final : public GraphicsModAction
{
public:
void OnDrawStarted(bool* skip) override;
void OnEFB(bool* skip, u32 texture_width, u32 texture_height, u32* scaled_width,
u32* scaled_height) override;
void OnProjection(Common::Matrix44* matrix) override;
void OnProjectionAndTexture(Common::Matrix44* matrix) override;
void OnTextureLoad() override;
};

View File

@ -0,0 +1,59 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "VideoCommon/GraphicsModSystem/Runtime/Actions/ScaleAction.h"
std::unique_ptr<ScaleAction> ScaleAction::Create(const picojson::value& json_data)
{
Common::Vec3 scale;
const auto& x = json_data.get("X");
if (x.is<double>())
{
scale.x = static_cast<float>(x.get<double>());
}
const auto& y = json_data.get("Y");
if (y.is<double>())
{
scale.y = static_cast<float>(y.get<double>());
}
const auto& z = json_data.get("Z");
if (z.is<double>())
{
scale.z = static_cast<float>(z.get<double>());
}
return std::make_unique<ScaleAction>(scale);
}
ScaleAction::ScaleAction(Common::Vec3 scale) : m_scale(scale)
{
}
void ScaleAction::OnEFB(bool*, u32 texture_width, u32 texture_height, u32* scaled_width,
u32* scaled_height)
{
if (scaled_width && m_scale.x > 0)
*scaled_width = texture_width * m_scale.x;
if (scaled_height && m_scale.y > 0)
*scaled_height = texture_height * m_scale.y;
}
void ScaleAction::OnProjection(Common::Matrix44* matrix)
{
if (!matrix)
return;
auto& the_matrix = *matrix;
the_matrix.data[0] = the_matrix.data[0] * m_scale.x;
the_matrix.data[5] = the_matrix.data[5] * m_scale.y;
}
void ScaleAction::OnProjectionAndTexture(Common::Matrix44* matrix)
{
if (!matrix)
return;
auto& the_matrix = *matrix;
the_matrix.data[0] = the_matrix.data[0] * m_scale.x;
the_matrix.data[5] = the_matrix.data[5] * m_scale.y;
}

View File

@ -0,0 +1,24 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <memory>
#include <picojson.h>
#include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h"
class ScaleAction final : public GraphicsModAction
{
public:
static std::unique_ptr<ScaleAction> Create(const picojson::value& json_data);
explicit ScaleAction(Common::Vec3 scale);
void OnEFB(bool* skip, u32 texture_width, u32 texture_height, u32* scaled_width,
u32* scaled_height) override;
void OnProjection(Common::Matrix44* matrix) override;
void OnProjectionAndTexture(Common::Matrix44* matrix) override;
private:
Common::Vec3 m_scale;
};

View File

@ -0,0 +1,20 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "VideoCommon/GraphicsModSystem/Runtime/Actions/SkipAction.h"
void SkipAction::OnDrawStarted(bool* skip)
{
if (!skip)
return;
*skip = true;
}
void SkipAction::OnEFB(bool* skip, u32, u32, u32*, u32*)
{
if (!skip)
return;
*skip = true;
}

View File

@ -0,0 +1,14 @@
// Copyright 2022 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModAction.h"
class SkipAction final : public GraphicsModAction
{
public:
void OnDrawStarted(bool* skip) override;
void OnEFB(bool* skip, u32 texture_width, u32 texture_height, u32* scaled_width,
u32* scaled_height) override;
};