aboutsummaryrefslogtreecommitdiff
path: root/src/client/render/interlaced.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/render/interlaced.cpp')
-rw-r--r--src/client/render/interlaced.cpp126
1 files changed, 45 insertions, 81 deletions
diff --git a/src/client/render/interlaced.cpp b/src/client/render/interlaced.cpp
index 3f79a8eb5..f4accd39b 100644
--- a/src/client/render/interlaced.cpp
+++ b/src/client/render/interlaced.cpp
@@ -19,102 +19,66 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include "interlaced.h"
+#include "secondstage.h"
#include "client/client.h"
#include "client/shader.h"
-#include "client/tile.h"
+#include "client/camera.h"
-RenderingCoreInterlaced::RenderingCoreInterlaced(
- IrrlichtDevice *_device, Client *_client, Hud *_hud)
- : RenderingCoreStereo(_device, _client, _hud)
+InitInterlacedMaskStep::InitInterlacedMaskStep(TextureBuffer *_buffer, u8 _index) :
+ buffer(_buffer), index(_index)
{
- initMaterial();
}
-void RenderingCoreInterlaced::initMaterial()
+void InitInterlacedMaskStep::run(PipelineContext &context)
{
- IShaderSource *s = client->getShaderSource();
- mat.UseMipMaps = false;
- mat.ZBuffer = false;
-#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR > 8
- mat.ZWriteEnable = video::EZW_OFF;
-#else
- mat.ZWriteEnable = false;
-#endif
- u32 shader = s->getShader("3d_interlaced_merge", TILE_MATERIAL_BASIC);
- 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);
-}
+ video::ITexture *mask = buffer->getTexture(index);
+ if (!mask)
+ return;
+ if (mask == last_mask)
+ return;
+ last_mask = mask;
-void RenderingCoreInterlaced::initMask()
-{
+ auto size = mask->getSize();
u8 *data = reinterpret_cast<u8 *>(mask->lock());
- for (u32 j = 0; j < screensize.Y; j++) {
+ for (u32 j = 0; j < size.Height; j++) {
u8 val = j % 2 ? 0xff : 0x00;
- memset(data, val, 4 * screensize.X);
- data += 4 * screensize.X;
+ memset(data, val, 4 * size.Width);
+ data += 4 * size.Width;
}
mask->unlock();
}
-void RenderingCoreInterlaced::drawAll()
+void populateInterlacedPipeline(RenderPipeline *pipeline, Client *client)
{
- renderBothImages();
- merge();
- drawHUD();
-}
+ static const u8 TEXTURE_LEFT = 0;
+ static const u8 TEXTURE_RIGHT = 1;
+ static const u8 TEXTURE_MASK = 2;
-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);
-}
+ TextureBuffer *buffer = pipeline->createOwned<TextureBuffer>();
+ buffer->setTexture(TEXTURE_LEFT, v2f(1.0f, 0.5f), "3d_render_left", video::ECF_A8R8G8B8);
+ buffer->setTexture(TEXTURE_RIGHT, v2f(1.0f, 0.5f), "3d_render_right", video::ECF_A8R8G8B8);
+ buffer->setTexture(TEXTURE_MASK, v2f(1.0f, 1.0f), "3d_render_mask", video::ECF_A8R8G8B8);
-void RenderingCoreInterlaced::useEye(bool _right)
-{
- driver->setRenderTarget(_right ? right : left, true, true, skycolor);
- RenderingCoreStereo::useEye(_right);
-}
+ pipeline->addStep<InitInterlacedMaskStep>(buffer, TEXTURE_MASK);
-void RenderingCoreInterlaced::resetEye()
-{
- driver->setRenderTarget(nullptr, false, false, skycolor);
- RenderingCoreStereo::resetEye();
-}
+ auto step3D = pipeline->own(create3DStage(client, v2f(1.0f, 0.5f)));
+
+ // eyes
+ for (bool right : { false, true }) {
+ pipeline->addStep<OffsetCameraStep>(right);
+ auto output = pipeline->createOwned<TextureBufferOutput>(buffer, right ? TEXTURE_RIGHT : TEXTURE_LEFT);
+ pipeline->addStep<SetRenderTargetStep>(step3D, output);
+ pipeline->addStep(step3D);
+ pipeline->addStep<MapPostFxStep>();
+ }
+
+ pipeline->addStep<OffsetCameraStep>(0.0f);
+ IShaderSource *s = client->getShaderSource();
+ u32 shader = s->getShader("3d_interlaced_merge", TILE_MATERIAL_BASIC);
+ video::E_MATERIAL_TYPE material = s->getShaderInfo(shader).material;
+ auto texture_map = { TEXTURE_LEFT, TEXTURE_RIGHT, TEXTURE_MASK };
+ auto merge = pipeline->addStep<PostProcessingStep>(material, texture_map);
+ merge->setRenderSource(buffer);
+ merge->setRenderTarget(pipeline->createOwned<ScreenTarget>());
+ pipeline->addStep<DrawHUD>();
+} \ No newline at end of file