diff --git a/src/client/renderingcore.cpp b/src/client/renderingcore.cpp index 0c6da9f7..9e7af791 100644 --- a/src/client/renderingcore.cpp +++ b/src/client/renderingcore.cpp @@ -90,6 +90,20 @@ void RenderingCorePlain::draw() RenderingCoreStereo::RenderingCoreStereo(irr::IrrlichtDevice *_device) : RenderingCore(_device) +{ + parallax_strength = g_settings->getFloat("3d_paralax_strength"); +} + +void RenderingCoreStereo::use_eye(Eye eye) +{ + irr::scene::ICameraSceneNode *cam = camera->getCameraNode(); + irr::core::matrix4 transform = cam->getRelativeTransformation(); + irr::core::matrix4 move; + move.setTranslation(irr::core::vector3df(static_cast(eye) * parallax_strength, 0.0f, 0.0f)); + cam->setPosition((transform * move).getTranslation()); +} + +void RenderingCoreStereo::use_default() { } @@ -100,6 +114,45 @@ RenderingCoreAnaglyph::RenderingCoreAnaglyph(irr::IrrlichtDevice *_device) : void RenderingCoreAnaglyph::draw() { + use_eye(Eye::Left); + draw_3d(); + use_eye(Eye::Right); + draw_3d(); + use_default(); + draw_last_fx(); + draw_hud(); +} + +void RenderingCoreAnaglyph::use_eye(Eye eye) +{ + RenderingCoreStereo::use_eye(eye); + driver->clearZBuffer(); + irr::video::SOverrideMaterial &mat = driver->getOverrideMaterial(); + switch (eye) { + case Eye::Left: + mat.Material.ColorMask = irr::video::ECP_RED; + break; + case Eye::Right: + mat.Material.ColorMask = irr::video::ECP_GREEN | irr::video::ECP_BLUE; + break; + } + mat.EnableFlags = irr::video::EMF_COLOR_MASK; + mat.EnablePasses = + irr::scene::ESNRP_SKY_BOX | irr::scene::ESNRP_SOLID | + irr::scene::ESNRP_TRANSPARENT | + irr::scene::ESNRP_TRANSPARENT_EFFECT | irr::scene::ESNRP_SHADOW; +} + +void RenderingCoreAnaglyph::use_default() +{ + RenderingCoreStereo::use_default(); + irr::video::SOverrideMaterial &mat = driver->getOverrideMaterial(); + mat.Material.ColorMask = irr::video::ECP_ALL; + mat.EnableFlags = irr::video::EMF_COLOR_MASK; + mat.EnablePasses = + irr::scene::ESNRP_SKY_BOX + irr::scene::ESNRP_SOLID + + irr::scene::ESNRP_TRANSPARENT + + irr::scene::ESNRP_TRANSPARENT_EFFECT + irr::scene::ESNRP_SHADOW; } RenderingCoreDouble::RenderingCoreDouble(irr::IrrlichtDevice *_device, RenderingCoreDouble::Mode _mode) : diff --git a/src/client/renderingcore.h b/src/client/renderingcore.h index 6d0e238c..80147100 100644 --- a/src/client/renderingcore.h +++ b/src/client/renderingcore.h @@ -77,8 +77,18 @@ public: class RenderingCoreStereo: public RenderingCore { +protected: + float parallax_strength; + public: + enum class Eye + { + Left = -1, + Right = 1, + }; RenderingCoreStereo(irr::IrrlichtDevice *_device); + virtual void use_eye(Eye eye); + virtual void use_default(); }; class RenderingCoreAnaglyph: public RenderingCoreStereo @@ -86,6 +96,8 @@ class RenderingCoreAnaglyph: public RenderingCoreStereo public: RenderingCoreAnaglyph(irr::IrrlichtDevice *_device); void draw() override; + void use_eye(Eye eye) override; + void use_default() override; }; class RenderingCoreDouble: public RenderingCoreStereo