Add anaglyph 3D

This commit is contained in:
number Zero 2017-08-16 01:31:24 +03:00
parent 5c181026bb
commit de7ff3f9db
2 changed files with 65 additions and 0 deletions

View File

@ -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<int>(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) :

View File

@ -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