rpcs3/Utilities/stereo_config.cpp
2026-04-20 21:22:58 +02:00

122 lines
5.7 KiB
C++

#include "stdafx.h"
#include "stereo_config.h"
#include "Emu/system_config.h"
stereo_config::stereo_matrices::stereo_matrices(const std::array<color3_base<f32>, 3>& l, const std::array<color3_base<f32>, 3>& r)
{
for (usz i = 0; i < 3; i++)
{
left[i] = l[i];
right[i] = r[i];
}
}
const std::unordered_map<stereo_render_mode_options, stereo_config::stereo_matrices> stereo_config::m_matrices =
{
{stereo_render_mode_options::anaglyph_red_cyan, stereo_matrices(
{ color3_base<f32>(1, 0, 0), color3_base<f32>(0, 0, 0), color3_base<f32>(0, 0, 0) },
{ color3_base<f32>(0, 0, 0), color3_base<f32>(0, 1, 0), color3_base<f32>(0, 0, 1) }
)},
{stereo_render_mode_options::anaglyph_red_green, stereo_matrices(
{ color3_base<f32>(1, 0, 0), color3_base<f32>(0, 0, 0), color3_base<f32>(0, 0, 0) },
{ color3_base<f32>(0, 0, 0), color3_base<f32>(0, 1, 0), color3_base<f32>(0, 0, 0) }
)},
{stereo_render_mode_options::anaglyph_red_blue, stereo_matrices(
{ color3_base<f32>(1, 0, 0), color3_base<f32>(0, 0, 0), color3_base<f32>(0, 0, 0) },
{ color3_base<f32>(0, 0, 0), color3_base<f32>(0, 0, 0), color3_base<f32>(0, 0, 1) }
)},
{stereo_render_mode_options::anaglyph_magenta_cyan, stereo_matrices(
{ color3_base<f32>(1, 0, 0), color3_base<f32>(0, 0, 0), color3_base<f32>(0, 0, 0.5f) },
{ color3_base<f32>(0, 0, 0), color3_base<f32>(0, 1, 0), color3_base<f32>(0, 0, 0.5f) }
)},
{stereo_render_mode_options::anaglyph_trioscopic, stereo_matrices(
{ color3_base<f32>(0, 0, 0), color3_base<f32>(0, 1, 0), color3_base<f32>(0, 0, 0) },
{ color3_base<f32>(1, 0, 0), color3_base<f32>(0, 0, 0), color3_base<f32>(0, 0, 1) }
)},
{stereo_render_mode_options::anaglyph_amber_blue, stereo_matrices(
{ color3_base<f32>(1, 0, 0), color3_base<f32>(0, 1, 0), color3_base<f32>(0, 0, 0) },
{ color3_base<f32>(0, 0, 0), color3_base<f32>(0, 0, 0), color3_base<f32>(1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f) }
)},
};
//const std::unordered_map<stereo_render_mode_options, stereo_config::stereo_matrices> stereo_config::m_improved_matrices =
//{
// {stereo_render_mode_options::anaglyph_red_cyan, stereo_matrices(
// {color3_base<f32>(0.456f, 0.500f, 0.176f), color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.0f, 0.0f, 0.0f)},
// {color3_base<f32>(-0.043f, -0.088f, -0.002f), color3_base<f32>(0.378f, 0.734f, -0.018f), color3_base<f32>(-0.072f, -0.113f, 1.226f)}
// )},
// {stereo_render_mode_options::anaglyph_red_green, stereo_matrices(
// {color3_base<f32>(0.299f, 0.587f, 0.114f), color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.0f, 0.0f, 0.0f)},
// {color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.299f, 0.587f, 0.114f), color3_base<f32>(0.0f, 0.0f, 0.0f)}
// )},
// {stereo_render_mode_options::anaglyph_red_blue, stereo_matrices(
// {color3_base<f32>(0.299f, 0.587f, 0.114f), color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.0f, 0.0f, 0.0f)},
// {color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.299f, 0.587f, 0.114f)}
// )},
// {stereo_render_mode_options::anaglyph_magenta_cyan, stereo_matrices(
// {color3_base<f32>(0.437f, 0.449f, 0.164f), color3_base<f32>(0.449f, 0.869f, 0.081f), color3_base<f32>(0.0f, 0.0f, 1.0f)},
// {color3_base<f32>(-0.062f, -0.062f, 0.0f), color3_base<f32>(-0.062f, 1.0f, 0.062f), color3_base<f32>(0.0f, 0.0f, 1.0f)}
// )},
// {stereo_render_mode_options::anaglyph_trioscopic, stereo_matrices(
// {color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.0f, 1.0f, 0.0f), color3_base<f32>(0.0f, 0.0f, 0.0f)},
// {color3_base<f32>(1.0f, 0.0f, 0.0f), color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.0f, 0.0f, 1.0f)}
// )},
// {stereo_render_mode_options::anaglyph_amber_blue, stereo_matrices(
// {color3_base<f32>(0.299f, 0.587f, 0.0f), color3_base<f32>(0.299f, 0.587f, 0.0f), color3_base<f32>(0.0f, 0.0f, 0.0f)},
// {color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.0f, 0.0f, 0.0f), color3_base<f32>(0.3333f, 0.3333f, 0.3333f)}
// )},
//};
void stereo_config::update_from_config(bool stereo_enabled)
{
m_stereo_mode = stereo_enabled ? g_cfg.video.stereo_render_mode.get() : stereo_render_mode_options::disabled;
if (m_stereo_mode == stereo_render_mode_options::anaglyph_custom)
{
stereo_config::stereo_matrices custom_matrices {};
stereo_config::convert_matrix(m_custom_matrices.left, g_cfg.video.custom_anaglyph_matrices.left.get_map());
stereo_config::convert_matrix(m_custom_matrices.right, g_cfg.video.custom_anaglyph_matrices.right.get_map());
}
}
const stereo_config::stereo_matrices& stereo_config::matrices() const
{
switch (m_stereo_mode)
{
case stereo_render_mode_options::disabled:
case stereo_render_mode_options::side_by_side:
case stereo_render_mode_options::over_under:
case stereo_render_mode_options::interlaced:
break;
case stereo_render_mode_options::anaglyph_red_green:
case stereo_render_mode_options::anaglyph_red_blue:
case stereo_render_mode_options::anaglyph_red_cyan:
case stereo_render_mode_options::anaglyph_magenta_cyan:
case stereo_render_mode_options::anaglyph_trioscopic:
case stereo_render_mode_options::anaglyph_amber_blue:
return ::at32(m_matrices, m_stereo_mode);
case stereo_render_mode_options::anaglyph_custom:
return m_custom_matrices;
}
static const stereo_matrices s_empty_matrices = {};
return s_empty_matrices;
}
std::map<std::string, std::string> stereo_config::get_custom_matrix(bool is_left) const
{
return convert_matrix(is_left ? m_custom_matrices.left : m_custom_matrices.right);
}
std::map<std::string, std::string> stereo_config::convert_matrix(const mat3f& mat)
{
std::map<std::string, std::string> values {};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
values[fmt::format("%d%d", i, j)] = fmt::format("%f", mat[i].rgb[j]);
}
}
return values;
}