]> git.lizzy.rs Git - minetest.git/blobdiff - src/client/render/pipeline.cpp
Clear exposure compensation state textures on creation (#13151)
[minetest.git] / src / client / render / pipeline.cpp
index cc275a7ef0f2c26dc3a503ac92505a40ce6724d1..c6dec2542756811b18f35d60cc5c9cf4f147112b 100644 (file)
@@ -40,7 +40,7 @@ video::ITexture *TextureBuffer::getTexture(u8 index)
 }
 
 
-void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::string &name, video::ECOLOR_FORMAT format)
+void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::string &name, video::ECOLOR_FORMAT format, bool clear)
 {
        assert(index != NO_DEPTH_TEXTURE);
 
@@ -54,9 +54,10 @@ void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::str
        definition.size = size;
        definition.name = name;
        definition.format = format;
+       definition.clear = clear;
 }
 
-void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &name, video::ECOLOR_FORMAT format)
+void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &name, video::ECOLOR_FORMAT format, bool clear)
 {
        assert(index != NO_DEPTH_TEXTURE);
 
@@ -70,6 +71,7 @@ void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &na
        definition.scale_factor = scale_factor;
        definition.name = name;
        definition.format = format;
+       definition.clear = clear;
 }
 
 void TextureBuffer::reset(PipelineContext &context)
@@ -135,10 +137,20 @@ bool TextureBuffer::ensureTexture(video::ITexture **texture, const TextureDefini
        if (*texture)
                m_driver->removeTexture(*texture);
 
-       if (definition.valid)
-               *texture = m_driver->addRenderTargetTexture(size, definition.name.c_str(), definition.format);
-       else
+       if (definition.valid) {
+               if (definition.clear) {
+                       video::IImage *image = m_driver->createImage(definition.format, size);
+                       image->fill(0u);
+                       *texture = m_driver->addTexture(definition.name.c_str(), image);
+                       image->drop();
+               }
+               else {
+                       *texture = m_driver->addRenderTargetTexture(size, definition.name.c_str(), definition.format);
+               }
+       }
+       else {
                *texture = nullptr;
+       }
 
        return true;
 }