diff --git a/ImageProcessingShader.cpp b/ImageProcessingShader.cpp index 11f894f..68a4728 100644 --- a/ImageProcessingShader.cpp +++ b/ImageProcessingShader.cpp @@ -15,6 +15,25 @@ ImageProcessingShader::ImageProcessingShader() reset(); } +ImageProcessingShader::ImageProcessingShader(const ImageProcessingShader &S) +{ + program_ = &imageProcessingShadingProgram; + reset(); + brightness = S.brightness; + contrast = S.contrast; + saturation = S.saturation; + hueshift = S.hueshift; + threshold = S.threshold; + lumakey = S.lumakey; + nbColors = S.nbColors; + invert = S.invert; + filterid = S.filterid; + gamma = S.gamma; + levels = S.levels; + chromakey = S.chromakey; + chromadelta = S.chromadelta; +} + void ImageProcessingShader::use() { Shader::use(); diff --git a/ImageProcessingShader.h b/ImageProcessingShader.h index c918114..23d77fc 100644 --- a/ImageProcessingShader.h +++ b/ImageProcessingShader.h @@ -11,7 +11,7 @@ class ImageProcessingShader : public Shader public: ImageProcessingShader(); -// virtual ~ImageProcessingShader() {} + ImageProcessingShader(const ImageProcessingShader &model); void use() override; void reset() override; diff --git a/SessionCreator.cpp b/SessionCreator.cpp index 302ff3c..ff0c002 100644 --- a/SessionCreator.cpp +++ b/SessionCreator.cpp @@ -261,7 +261,9 @@ void SessionCreator::visit (Source& s) s.blendingShader()->accept(*this); xmlCurrent_ = sourceNode->FirstChildElement("ImageProcessing"); + bool on = xmlCurrent_->BoolAttribute("enabled", true); s.processingShader()->accept(*this); + s.setImageProcessingEnabled(on); // restore current xmlCurrent_ = sourceNode; diff --git a/SessionVisitor.cpp b/SessionVisitor.cpp index bc14061..35e1194 100644 --- a/SessionVisitor.cpp +++ b/SessionVisitor.cpp @@ -317,6 +317,7 @@ void SessionVisitor::visit (Source& s) s.blendingShader()->accept(*this); xmlCurrent_ = xmlDoc_->NewElement( "ImageProcessing" ); + xmlCurrent_->SetAttribute("enabled", s.imageProcessingEnabled()); sourceNode->InsertEndChild(xmlCurrent_); s.processingShader()->accept(*this); diff --git a/Source.cpp b/Source.cpp index 558b3c5..9154b3d 100644 --- a/Source.cpp +++ b/Source.cpp @@ -199,20 +199,32 @@ void Source::setMode(Source::Mode m) void Source::setImageProcessingEnabled (bool on) { + // avoid repeating if ( on == imageProcessingEnabled() ) return; // set pointer if (on) { - processingshader_ = new ImageProcessingShader; + // set the current rendering shader to be the + // (previously prepared) processing shader renderingshader_ = (Shader *) processingshader_; - - } else { - processingshader_ = nullptr; + } + else { + // clone the current Image processing shader + // (because the one currently attached to the source + // will be deleted in replaceRenderngShader().) + ImageProcessingShader *tmp = new ImageProcessingShader(*processingshader_); + // loose reference to current processing shader (to delete) + // and keep reference to the newly created one + // and keep it for later + processingshader_ = tmp; + // set the current rendering shader to a simple one renderingshader_ = (Shader *) new ImageShader; } // apply to nodes in subclasses + // this calls replaceShader() on the Primitive and + // will delete the previously attached shader replaceRenderingShader(); }