diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 84059c25f..51797f7de 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -621,9 +621,10 @@ fall_bobbing_amount (Fall bobbing factor) float 0.0 # - interlaced: odd/even line based polarisation screen support. # - topbottom: split screen top/bottom. # - sidebyside: split screen side by side. +# - crossview: Cross-eyed 3d # - pageflip: quadbuffer based 3d. # Note that the interlaced mode requires shaders to be enabled. -3d_mode (3D mode) enum none none,anaglyph,interlaced,topbottom,sidebyside,pageflip +3d_mode (3D mode) enum none none,anaglyph,interlaced,topbottom,sidebyside,crossview,pageflip # In-game chat console height, between 0.1 (10%) and 1.0 (100%). console_height (Console height) float 0.6 0.1 1.0 diff --git a/src/client/render/factory.cpp b/src/client/render/factory.cpp index 410ceaad7..3aabc5db9 100644 --- a/src/client/render/factory.cpp +++ b/src/client/render/factory.cpp @@ -41,5 +41,7 @@ RenderingCore *createRenderingCore(const std::string &stereo_mode, IrrlichtDevic return new RenderingCoreSideBySide(device, client, hud); if (stereo_mode == "topbottom") return new RenderingCoreSideBySide(device, client, hud, true); + if (stereo_mode == "crossview") + return new RenderingCoreSideBySide(device, client, hud, false, true); throw std::invalid_argument("Invalid rendering mode: " + stereo_mode); } diff --git a/src/client/render/sidebyside.cpp b/src/client/render/sidebyside.cpp index 9b1e06d4a..ed08810db 100644 --- a/src/client/render/sidebyside.cpp +++ b/src/client/render/sidebyside.cpp @@ -23,8 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/hud.h" RenderingCoreSideBySide::RenderingCoreSideBySide( - IrrlichtDevice *_device, Client *_client, Hud *_hud, bool _horizontal) - : RenderingCoreStereo(_device, _client, _hud), horizontal(_horizontal) + IrrlichtDevice *_device, Client *_client, Hud *_hud, bool _horizontal, bool _flipped) + : RenderingCoreStereo(_device, _client, _hud), horizontal(_horizontal), flipped(_flipped) { } @@ -62,7 +62,7 @@ void RenderingCoreSideBySide::drawAll() void RenderingCoreSideBySide::useEye(bool _right) { driver->setRenderTarget(_right ? right : left, true, true, skycolor); - RenderingCoreStereo::useEye(_right); + RenderingCoreStereo::useEye(_right ^ flipped); } void RenderingCoreSideBySide::resetEye() diff --git a/src/client/render/sidebyside.h b/src/client/render/sidebyside.h index b5cf9d5db..f8ed256b3 100644 --- a/src/client/render/sidebyside.h +++ b/src/client/render/sidebyside.h @@ -27,6 +27,7 @@ protected: video::ITexture *left = nullptr; video::ITexture *right = nullptr; bool horizontal = false; + bool flipped = false; core::dimension2du image_size; v2s32 rpos; @@ -37,6 +38,6 @@ protected: public: RenderingCoreSideBySide(IrrlichtDevice *_device, Client *_client, Hud *_hud, - bool _horizontal = false); + bool _horizontal = false, bool _flipped = false); void drawAll() override; }; diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp index ec0c0db6b..f94bfb3f2 100644 --- a/src/settings_translation_file.cpp +++ b/src/settings_translation_file.cpp @@ -286,7 +286,7 @@ fake_function() { gettext("Fall bobbing factor"); gettext("Multiplier for fall bobbing.\nFor example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."); gettext("3D mode"); - gettext("3D support.\nCurrently supported:\n- none: no 3d output.\n- anaglyph: cyan/magenta color 3d.\n- interlaced: odd/even line based polarisation screen support.\n- topbottom: split screen top/bottom.\n- sidebyside: split screen side by side.\n- pageflip: quadbuffer based 3d.\nNote that the interlaced mode requires shaders to be enabled."); + gettext("3D support.\nCurrently supported:\n- none: no 3d output.\n- anaglyph: cyan/magenta color 3d.\n- interlaced: odd/even line based polarisation screen support.\n- topbottom: split screen top/bottom.\n- sidebyside: split screen side by side.\n- crossview: cross-eyed 3d viewing.\n- pageflip: quadbuffer based 3d.\nNote that the interlaced mode requires shaders to be enabled."); gettext("Console height"); gettext("In-game chat console height, between 0.1 (10%) and 1.0 (100%)."); gettext("Console color");