#include "stdafx.h" #include "stereo_config.h" #include "Emu/system_config.h" stereo_config::stereo_matrices::stereo_matrices(const std::array, 3>& l, const std::array, 3>& r) { for (usz i = 0; i < 3; i++) { left[i] = l[i]; right[i] = r[i]; } } const std::unordered_map stereo_config::m_matrices = { {stereo_render_mode_options::anaglyph_red_cyan, stereo_matrices( { color3_base(1, 0, 0), color3_base(0, 0, 0), color3_base(0, 0, 0) }, { color3_base(0, 0, 0), color3_base(0, 1, 0), color3_base(0, 0, 1) } )}, {stereo_render_mode_options::anaglyph_red_green, stereo_matrices( { color3_base(1, 0, 0), color3_base(0, 0, 0), color3_base(0, 0, 0) }, { color3_base(0, 0, 0), color3_base(0, 1, 0), color3_base(0, 0, 0) } )}, {stereo_render_mode_options::anaglyph_red_blue, stereo_matrices( { color3_base(1, 0, 0), color3_base(0, 0, 0), color3_base(0, 0, 0) }, { color3_base(0, 0, 0), color3_base(0, 0, 0), color3_base(0, 0, 1) } )}, {stereo_render_mode_options::anaglyph_magenta_cyan, stereo_matrices( { color3_base(1, 0, 0), color3_base(0, 0, 0), color3_base(0, 0, 0.5f) }, { color3_base(0, 0, 0), color3_base(0, 1, 0), color3_base(0, 0, 0.5f) } )}, {stereo_render_mode_options::anaglyph_trioscopic, stereo_matrices( { color3_base(0, 0, 0), color3_base(0, 1, 0), color3_base(0, 0, 0) }, { color3_base(1, 0, 0), color3_base(0, 0, 0), color3_base(0, 0, 1) } )}, {stereo_render_mode_options::anaglyph_amber_blue, stereo_matrices( { color3_base(1, 0, 0), color3_base(0, 1, 0), color3_base(0, 0, 0) }, { color3_base(0, 0, 0), color3_base(0, 0, 0), color3_base(1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f) } )}, }; //const std::unordered_map stereo_config::m_improved_matrices = //{ // {stereo_render_mode_options::anaglyph_red_cyan, stereo_matrices( // {color3_base(0.456f, 0.500f, 0.176f), color3_base(0.0f, 0.0f, 0.0f), color3_base(0.0f, 0.0f, 0.0f)}, // {color3_base(-0.043f, -0.088f, -0.002f), color3_base(0.378f, 0.734f, -0.018f), color3_base(-0.072f, -0.113f, 1.226f)} // )}, // {stereo_render_mode_options::anaglyph_red_green, stereo_matrices( // {color3_base(0.299f, 0.587f, 0.114f), color3_base(0.0f, 0.0f, 0.0f), color3_base(0.0f, 0.0f, 0.0f)}, // {color3_base(0.0f, 0.0f, 0.0f), color3_base(0.299f, 0.587f, 0.114f), color3_base(0.0f, 0.0f, 0.0f)} // )}, // {stereo_render_mode_options::anaglyph_red_blue, stereo_matrices( // {color3_base(0.299f, 0.587f, 0.114f), color3_base(0.0f, 0.0f, 0.0f), color3_base(0.0f, 0.0f, 0.0f)}, // {color3_base(0.0f, 0.0f, 0.0f), color3_base(0.0f, 0.0f, 0.0f), color3_base(0.299f, 0.587f, 0.114f)} // )}, // {stereo_render_mode_options::anaglyph_magenta_cyan, stereo_matrices( // {color3_base(0.437f, 0.449f, 0.164f), color3_base(0.449f, 0.869f, 0.081f), color3_base(0.0f, 0.0f, 1.0f)}, // {color3_base(-0.062f, -0.062f, 0.0f), color3_base(-0.062f, 1.0f, 0.062f), color3_base(0.0f, 0.0f, 1.0f)} // )}, // {stereo_render_mode_options::anaglyph_trioscopic, stereo_matrices( // {color3_base(0.0f, 0.0f, 0.0f), color3_base(0.0f, 1.0f, 0.0f), color3_base(0.0f, 0.0f, 0.0f)}, // {color3_base(1.0f, 0.0f, 0.0f), color3_base(0.0f, 0.0f, 0.0f), color3_base(0.0f, 0.0f, 1.0f)} // )}, // {stereo_render_mode_options::anaglyph_amber_blue, stereo_matrices( // {color3_base(0.299f, 0.587f, 0.0f), color3_base(0.299f, 0.587f, 0.0f), color3_base(0.0f, 0.0f, 0.0f)}, // {color3_base(0.0f, 0.0f, 0.0f), color3_base(0.0f, 0.0f, 0.0f), color3_base(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 stereo_config::get_custom_matrix(bool is_left) const { return convert_matrix(is_left ? m_custom_matrices.left : m_custom_matrices.right); } std::map stereo_config::convert_matrix(const mat3f& mat) { std::map 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; }