aboutsummaryrefslogtreecommitdiff
path: root/src/client/render/pipeline.cpp
diff options
context:
space:
mode:
authorx2048 <codeforsmile@gmail.com>2022-09-29 20:34:05 +0200
committerGitHub <noreply@github.com>2022-09-29 20:34:05 +0200
commit9df79a4b2d68979c3e15797d518d957787ba4e21 (patch)
tree027f372a420f1aa3aa72bf72de34c5e6062b9090 /src/client/render/pipeline.cpp
parent3978b9b8ed1c318c3f9a088beb331c26bca6de6b (diff)
downloadminetest-9df79a4b2d68979c3e15797d518d957787ba4e21.tar.xz
Bloom (#12791)
Adds configurable light exposure control and bloom effect (light bleeding) with client-side settings.
Diffstat (limited to 'src/client/render/pipeline.cpp')
-rw-r--r--src/client/render/pipeline.cpp101
1 files changed, 41 insertions, 60 deletions
diff --git a/src/client/render/pipeline.cpp b/src/client/render/pipeline.cpp
index baf215d8e..eb38adbad 100644
--- a/src/client/render/pipeline.cpp
+++ b/src/client/render/pipeline.cpp
@@ -27,9 +27,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
TextureBuffer::~TextureBuffer()
{
- if (m_render_target)
- m_driver->removeRenderTarget(m_render_target);
- m_render_target = nullptr;
for (u32 index = 0; index < m_textures.size(); index++)
m_driver->removeTexture(m_textures[index]);
m_textures.clear();
@@ -37,8 +34,6 @@ TextureBuffer::~TextureBuffer()
video::ITexture *TextureBuffer::getTexture(u8 index)
{
- if (index == m_depth_texture_index)
- return m_depth_texture;
if (index >= m_textures.size())
return nullptr;
return m_textures[index];
@@ -52,9 +47,6 @@ void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::str
if (m_definitions.size() <= index)
m_definitions.resize(index + 1);
- if (m_depth_texture_index == index)
- m_depth_texture_index = NO_DEPTH_TEXTURE;
-
auto &definition = m_definitions[index];
definition.valid = true;
definition.dirty = true;
@@ -71,9 +63,6 @@ void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &na
if (m_definitions.size() <= index)
m_definitions.resize(index + 1);
- if (m_depth_texture_index == index)
- m_depth_texture_index = NO_DEPTH_TEXTURE;
-
auto &definition = m_definitions[index];
definition.valid = true;
definition.dirty = true;
@@ -83,20 +72,6 @@ void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &na
definition.format = format;
}
-void TextureBuffer::setDepthTexture(u8 index, core::dimension2du size, const std::string &name, video::ECOLOR_FORMAT format)
-{
- assert(index != NO_DEPTH_TEXTURE);
- setTexture(index, size, name, format);
- m_depth_texture_index = index;
-}
-
-void TextureBuffer::setDepthTexture(u8 index, v2f scale_factor, const std::string &name, video::ECOLOR_FORMAT format)
-{
- assert(index != NO_DEPTH_TEXTURE);
- setTexture(index, scale_factor, name, format);
- m_depth_texture_index = index;
-}
-
void TextureBuffer::reset(PipelineContext &context)
{
if (!m_driver)
@@ -116,41 +91,14 @@ void TextureBuffer::reset(PipelineContext &context)
m_textures.push_back(nullptr);
// change textures to match definitions
- bool modified = false;
for (u32 i = 0; i < m_definitions.size(); i++) {
video::ITexture **ptr = &m_textures[i];
- if (i == m_depth_texture_index) {
- if (*ptr) {
- m_driver->removeTexture(*ptr);
- *ptr = nullptr;
- }
- ptr = &m_depth_texture;
- }
-
- if (ensureTexture(ptr, m_definitions[i], context))
- modified = true;
+
+ ensureTexture(ptr, m_definitions[i], context);
m_definitions[i].dirty = false;
}
- // make sude depth texture is removed and reset
- if (m_depth_texture_index == NO_DEPTH_TEXTURE && m_depth_texture) {
- m_driver->removeTexture(m_depth_texture);
- m_depth_texture = nullptr;
- }
-
- if (!m_render_target)
- m_render_target = m_driver->addRenderTarget();
-
- if (modified)
- m_render_target->setTexture(m_textures, m_depth_texture);
-
- RenderTarget::reset(context);
-}
-
-void TextureBuffer::activate(PipelineContext &context)
-{
- m_driver->setRenderTargetEx(m_render_target, m_clear ? video::ECBF_DEPTH | video::ECBF_COLOR : 0, context.clear_color);
- RenderTarget::activate(context);
+ RenderSource::reset(context);
}
bool TextureBuffer::ensureTexture(video::ITexture **texture, const TextureDefinition& definition, PipelineContext &context)
@@ -186,15 +134,48 @@ bool TextureBuffer::ensureTexture(video::ITexture **texture, const TextureDefini
}
TextureBufferOutput::TextureBufferOutput(TextureBuffer *_buffer, u8 _texture_index)
- : buffer(_buffer), texture_index(_texture_index)
+ : buffer(_buffer), texture_map({_texture_index})
+{}
+
+TextureBufferOutput::TextureBufferOutput(TextureBuffer *_buffer, const std::vector<u8> &_texture_map)
+ : buffer(_buffer), texture_map(_texture_map)
+{}
+
+TextureBufferOutput::TextureBufferOutput(TextureBuffer *_buffer, const std::vector<u8> &_texture_map, u8 _depth_stencil)
+ : buffer(_buffer), texture_map(_texture_map), depth_stencil(_depth_stencil)
{}
+TextureBufferOutput::~TextureBufferOutput()
+{
+ if (render_target && driver)
+ driver->removeRenderTarget(render_target);
+}
+
void TextureBufferOutput::activate(PipelineContext &context)
{
- auto texture = buffer->getTexture(texture_index);
- auto driver = context.device->getVideoDriver();
- driver->setRenderTarget(texture, m_clear, m_clear, context.clear_color);
- driver->OnResize(texture->getSize());
+ if (!driver)
+ driver = context.device->getVideoDriver();
+
+ if (!render_target)
+ render_target = driver->addRenderTarget();
+
+ core::array<video::ITexture *> textures;
+ core::dimension2du size(0, 0);
+ for (size_t i = 0; i < texture_map.size(); i++) {
+ video::ITexture *texture = buffer->getTexture(texture_map[i]);
+ textures.push_back(texture);
+ if (texture && size.Width == 0)
+ size = texture->getSize();
+ }
+
+ video::ITexture *depth_texture = nullptr;
+ if (depth_stencil != NO_DEPTH_TEXTURE)
+ depth_texture = buffer->getTexture(depth_stencil);
+
+ render_target->setTexture(textures, depth_texture);
+
+ driver->setRenderTargetEx(render_target, m_clear ? video::ECBF_ALL : video::ECBF_NONE, context.clear_color);
+ driver->OnResize(size);
RenderTarget::activate(context);
}