summaryrefslogtreecommitdiff
path: root/src/client/render/interlaced.cpp
diff options
context:
space:
mode:
authorVitaliy <silverunicorn2011@yandex.ru>2017-10-31 21:27:10 +0300
committerLoïc Blot <nerzhul@users.noreply.github.com>2017-10-31 19:27:10 +0100
commit28841961ba91b943b7478704181604fa3e24e81e (patch)
tree6485c0d4483c1c1e20eefd80510b7e9441f1b58a /src/client/render/interlaced.cpp
parent65c5539035139428ee8354d7c96565fc392112d2 (diff)
downloadminetest-28841961ba91b943b7478704181604fa3e24e81e.tar.gz
minetest-28841961ba91b943b7478704181604fa3e24e81e.tar.bz2
minetest-28841961ba91b943b7478704181604fa3e24e81e.zip
Rewrite rendering engine (#6253)
* Clean draw_*() arguments * Split rendering core * Add anaglyph 3D * Interlaced 3D * Drop obsolete methods
Diffstat (limited to 'src/client/render/interlaced.cpp')
-rw-r--r--src/client/render/interlaced.cpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/client/render/interlaced.cpp b/src/client/render/interlaced.cpp
new file mode 100644
index 000000000..ccd4e60cf
--- /dev/null
+++ b/src/client/render/interlaced.cpp
@@ -0,0 +1,116 @@
+/*
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2017 numzero, Lobachesky Vitaly <numzer0@yandex.ru>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "interlaced.h"
+#include "client.h"
+#include "shader.h"
+#include "client/tile.h"
+
+RenderingCoreInterlaced::RenderingCoreInterlaced(
+ IrrlichtDevice *_device, Client *_client, Hud *_hud)
+ : RenderingCoreStereo(_device, _client, _hud)
+{
+ initMaterial();
+}
+
+void RenderingCoreInterlaced::initMaterial()
+{
+ IShaderSource *s = client->getShaderSource();
+ mat.UseMipMaps = false;
+ mat.ZBuffer = false;
+ mat.ZWriteEnable = false;
+ u32 shader = s->getShader("3d_interlaced_merge", TILE_MATERIAL_BASIC, 0);
+ mat.MaterialType = s->getShaderInfo(shader).material;
+ for (int k = 0; k < 3; ++k) {
+ mat.TextureLayer[k].AnisotropicFilter = false;
+ mat.TextureLayer[k].BilinearFilter = false;
+ mat.TextureLayer[k].TrilinearFilter = false;
+ mat.TextureLayer[k].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
+ mat.TextureLayer[k].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
+ }
+}
+
+void RenderingCoreInterlaced::initTextures()
+{
+ v2u32 image_size{screensize.X, screensize.Y / 2};
+ left = driver->addRenderTargetTexture(
+ image_size, "3d_render_left", video::ECF_A8R8G8B8);
+ right = driver->addRenderTargetTexture(
+ image_size, "3d_render_right", video::ECF_A8R8G8B8);
+ mask = driver->addTexture(screensize, "3d_render_mask", video::ECF_A8R8G8B8);
+ initMask();
+ mat.TextureLayer[0].Texture = left;
+ mat.TextureLayer[1].Texture = right;
+ mat.TextureLayer[2].Texture = mask;
+}
+
+void RenderingCoreInterlaced::clearTextures()
+{
+ driver->removeTexture(left);
+ driver->removeTexture(right);
+ driver->removeTexture(mask);
+}
+
+void RenderingCoreInterlaced::initMask()
+{
+ u8 *data = reinterpret_cast<u8 *>(mask->lock());
+ for (u32 j = 0; j < screensize.Y; j++) {
+ u8 val = j % 2 ? 0xff : 0x00;
+ memset(data, val, 4 * screensize.X);
+ data += 4 * screensize.X;
+ }
+ mask->unlock();
+}
+
+void RenderingCoreInterlaced::drawAll()
+{
+ renderBothImages();
+ merge();
+ drawHUD();
+}
+
+void RenderingCoreInterlaced::merge()
+{
+ static const video::S3DVertex vertices[4] = {
+ video::S3DVertex(1.0, -1.0, 0.0, 0.0, 0.0, -1.0,
+ video::SColor(255, 0, 255, 255), 1.0, 0.0),
+ video::S3DVertex(-1.0, -1.0, 0.0, 0.0, 0.0, -1.0,
+ video::SColor(255, 255, 0, 255), 0.0, 0.0),
+ video::S3DVertex(-1.0, 1.0, 0.0, 0.0, 0.0, -1.0,
+ video::SColor(255, 255, 255, 0), 0.0, 1.0),
+ video::S3DVertex(1.0, 1.0, 0.0, 0.0, 0.0, -1.0,
+ video::SColor(255, 255, 255, 255), 1.0, 1.0),
+ };
+ static const u16 indices[6] = {0, 1, 2, 2, 3, 0};
+ driver->setMaterial(mat);
+ driver->drawVertexPrimitiveList(&vertices, 4, &indices, 2);
+}
+
+void RenderingCoreInterlaced::useEye(bool _right)
+{
+ driver->setRenderTarget(_right ? right : left, true, true, skycolor);
+ RenderingCoreStereo::useEye(_right);
+}
+
+void RenderingCoreInterlaced::resetEye()
+{
+ driver->setRenderTarget(nullptr, false, false, skycolor);
+ RenderingCoreStereo::resetEye();
+}