Fixed glares
authorJeroen Bakker <j.bakker@atmind.nl>
Thu, 14 Jun 2012 03:11:36 +0000 (03:11 +0000)
committerJeroen Bakker <j.bakker@atmind.nl>
Thu, 14 Jun 2012 03:11:36 +0000 (03:11 +0000)
source/blender/compositor/CMakeLists.txt
source/blender/compositor/intern/COM_MemoryBuffer.cpp
source/blender/compositor/intern/COM_MemoryBuffer.h
source/blender/compositor/nodes/COM_GlareNode.cpp
source/blender/compositor/operations/COM_GlareFogGlowOperation.cpp
source/blender/compositor/operations/COM_GlareGhostOperation.cpp
source/blender/compositor/operations/COM_GlareThresholdOperation.cpp
source/blender/compositor/operations/COM_GlareThresholdOperation.h
source/blender/compositor/operations/COM_MixGlareOperation.cpp [new file with mode: 0644]
source/blender/compositor/operations/COM_MixGlareOperation.h [new file with mode: 0644]

index 20d110dd2a8b60aba350a1f858ea790519069609..aa428c2b8d0863ea780446b3d198c79158d65b72 100644 (file)
@@ -461,6 +461,8 @@ set(SRC
        operations/COM_MixBaseOperation.cpp
        operations/COM_MixBlendOperation.cpp
        operations/COM_MixBlendOperation.h
+       operations/COM_MixGlareOperation.cpp
+       operations/COM_MixGlareOperation.h
        operations/COM_MixAddOperation.h
        operations/COM_MixAddOperation.cpp
        operations/COM_MixMultiplyOperation.h
index b88d42ea8d0aa600ed01d425821661bd76c41f1e..90f6d4a738dc790115d84063a9dcf30886d2d60d 100644 (file)
@@ -141,6 +141,16 @@ void MemoryBuffer::writePixel(int x, int y, const float color[4])
        }
 }
 
+void MemoryBuffer::addPixel(int x, int y, const float color[4])
+{
+       if (x >= this->rect.xmin && x < this->rect.xmax &&
+           y >= this->rect.ymin && y < this->rect.ymax)
+       {
+               const int offset = (this->chunkWidth * y + x) * COM_NUMBER_OF_CHANNELS;
+               add_v4_v4(&this->buffer[offset], color);
+       }
+}
+
 void MemoryBuffer::readCubic(float result[4], float x, float y)
 {
        int x1 = floor(x);
index dee2c9b771f2369f2f3d6f97fa12785a763ccab1..dd24a30e85edaa6a9e3991629f77dfbe811420b2 100644 (file)
@@ -126,6 +126,7 @@ public:
        
        void read(float result[4], int x, int y);
        void writePixel(int x, int y, const float color[4]);
+       void addPixel(int x, int y, const float color[4]);
        void readCubic(float result[4], float x, float y);
        void readEWA(float result[4], float fx, float fy, float dx, float dy);
        
index 6e8e66c83acdd59464a9b30b86d5bd5c45983c79..dcb8f3a3a4cf086e5e7aa13c50f520afe2ec5268 100644 (file)
@@ -26,7 +26,7 @@
 #include "COM_GlareSimpleStarOperation.h"
 #include "COM_GlareStreaksOperation.h"
 #include "COM_SetValueOperation.h"
-#include "COM_MixBlendOperation.h"
+#include "COM_MixGlareOperation.h"
 #include "COM_FastGaussianBlurOperation.h"
 #include "COM_GlareGhostOperation.h"
 #include "COM_GlareFogGlowOperation.h"
@@ -40,109 +40,44 @@ void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext *
        bNode *node = this->getbNode();
        NodeGlare *glare = (NodeGlare*)node->storage;
        
+       GlareBaseOperation * glareoperation = NULL;
+       
        switch (glare->type) {
        
        default:
        case 3:
-               {
-                       GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation();
-                       GlareGhostOperation * glareoperation = new GlareGhostOperation();
-                       SetValueOperation * mixvalueoperation = new SetValueOperation();
-                       MixBlendOperation * mixoperation = new MixBlendOperation();
-       
-                       this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system);
-                       addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0));
-                       addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0));
-                       addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2));
-                       addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1));
-                       this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket());
-       
-                       thresholdOperation->setThreshold(glare->threshold);
-                       glareoperation->setGlareSettings(glare);
-                       mixvalueoperation->setValue(0.5f+glare->mix*0.5f);
-                       mixoperation->setResolutionInputSocketIndex(1);
-       
-                       system->addOperation(glareoperation);
-                       system->addOperation(thresholdOperation);
-                       system->addOperation(mixvalueoperation);
-                       system->addOperation(mixoperation);
-               }
+               glareoperation = new GlareGhostOperation();
+               break;
        case 2: // streaks
-               {
-                       GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation();
-                       GlareStreaksOperation * glareoperation = new GlareStreaksOperation();
-                       SetValueOperation * mixvalueoperation = new SetValueOperation();
-                       MixBlendOperation * mixoperation = new MixBlendOperation();
-       
-                       this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system);
-                       addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0));
-                       addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0));
-                       addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2));
-                       addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1));
-                       this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket());
-       
-                       thresholdOperation->setThreshold(glare->threshold);
-                       glareoperation->setGlareSettings(glare);
-                       mixvalueoperation->setValue(0.5f+glare->mix*0.5f);
-                       mixoperation->setResolutionInputSocketIndex(1);
-       
-                       system->addOperation(glareoperation);
-                       system->addOperation(thresholdOperation);
-                       system->addOperation(mixvalueoperation);
-                       system->addOperation(mixoperation);
-               }       
+               glareoperation = new GlareStreaksOperation();
                break;
        case 1: // fog glow
-               {
-                       GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation();
-                       GlareFogGlowOperation * glareoperation = new GlareFogGlowOperation();
-                       SetValueOperation * mixvalueoperation = new SetValueOperation();
-                       MixBlendOperation * mixoperation = new MixBlendOperation();
-       
-                       this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system);
-                       addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0));
-                       addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0));
-                       addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2));
-                       addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1));
-                       this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket());
-       
-                       thresholdOperation->setThreshold(glare->threshold);
-                       glareoperation->setGlareSettings(glare);
-                       mixvalueoperation->setValue(0.5f+glare->mix*0.5f);
-                       mixoperation->setResolutionInputSocketIndex(1);
-       
-                       system->addOperation(glareoperation);
-                       system->addOperation(thresholdOperation);
-                       system->addOperation(mixvalueoperation);
-                       system->addOperation(mixoperation);
-               }
+               glareoperation = new GlareFogGlowOperation();
                break;
-               
        case 0: // simple star
-               {
-                       GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation();
-                       GlareSimpleStarOperation * glareoperation = new GlareSimpleStarOperation();
-                       SetValueOperation * mixvalueoperation = new SetValueOperation();
-                       MixBlendOperation * mixoperation = new MixBlendOperation();
-
-                       this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system);
-                       addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0));
-                       addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0));
-                       addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2));
-                       addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1));
-                       this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket());
+               glareoperation = new GlareSimpleStarOperation();
+               break;
+       }
+       GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation();
+       SetValueOperation * mixvalueoperation = new SetValueOperation();
+       MixGlareOperation * mixoperation = new MixGlareOperation();
+       mixoperation->getInputSocket(2)->setResizeMode(COM_SC_FIT);
 
-                       thresholdOperation->setThreshold(glare->threshold);
-                       glareoperation->setGlareSettings(glare);
-                       mixvalueoperation->setValue(0.5f+glare->mix*0.5f);
-                       mixoperation->setResolutionInputSocketIndex(1);
+       this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system);
+       addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0));
+       addLink(system, mixvalueoperation->getOutputSocket(), mixoperation->getInputSocket(0));
+       addLink(system, glareoperation->getOutputSocket(), mixoperation->getInputSocket(2));
+       addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1));
+       this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket());
 
+       thresholdOperation->setGlareSettings(glare);
+       glareoperation->setGlareSettings(glare);
+       mixvalueoperation->setValue(0.5f+glare->mix*0.5f);
+       mixoperation->setResolutionInputSocketIndex(1);
 
-                       system->addOperation(glareoperation);
-                       system->addOperation(thresholdOperation);
-                       system->addOperation(mixvalueoperation);
-                       system->addOperation(mixoperation);
-               }
-               break;
-       }
+       system->addOperation(glareoperation);
+       system->addOperation(thresholdOperation);
+       system->addOperation(mixvalueoperation);
+       system->addOperation(mixoperation);
+       
 }
index 4acc8aa17f0a8987f5c26e68e6f510617d3063d5..1bdbdf71bdc13396aa9c4a440d87a120c9475e50 100644 (file)
@@ -322,7 +322,7 @@ void convolve(float* dst, MemoryBuffer* in1, MemoryBuffer* in2)
                                memset(data2, 0, w2*h2*sizeof(fREAL));
                                for (y=0; y<ybsz; y++) {
                                        int yy = ybl*ybsz + y;
-                                       if (yy >= kernelHeight) continue;
+                                       if (yy >= imageHeight) continue;
                                        fp = &data2[y*w2];
                                        colp = (fRGB*)&imageBuffer[yy*imageWidth*COM_NUMBER_OF_CHANNELS];
                                        for (x=0; x<xbsz; x++) {
index 9bf39db27273ec4a56d0755b614a5f2bfcdcea10..2d5fe57b817b1bfef7be5ae14b636a53f494a74f 100644 (file)
@@ -113,7 +113,7 @@ void GlareGhostOperation::generateGlare(float *data, MemoryBuffer *inputTile, No
                                        sm = smoothMask(s, t) * 0.25f;
                                        fRGB_madd(tc, c, sm);
                                }
-                               tbuf1->writePixel(x, y, tc);
+                               tbuf1->addPixel(x, y, tc);
                        }
                        if (isBreaked()) breaked = true;
                }
index ea76e7551ad290eacbdb6b02bc3c1c4f3ff96836..f9b2ec2b32d1c93a9746b98dc89b4dbb5c61ab92 100644 (file)
 
 GlareThresholdOperation::GlareThresholdOperation() : NodeOperation()
 {
-       this->addInputSocket(COM_DT_COLOR);
+       this->addInputSocket(COM_DT_COLOR, COM_SC_FIT);
        this->addOutputSocket(COM_DT_COLOR);
        this->inputProgram = NULL;
 }
+
+void GlareThresholdOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[])
+{
+       NodeOperation::determineResolution(resolution, preferredResolution);
+       resolution[0] = resolution[0] / (1 << settings->quality);
+       resolution[1] = resolution[1] / (1 << settings->quality);
+}
+
 void GlareThresholdOperation::initExecution()
 {
        this->inputProgram = this->getInputSocketReader(0);
@@ -36,6 +44,8 @@ void GlareThresholdOperation::initExecution()
 
 void GlareThresholdOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[])
 {
+       const float threshold = settings->threshold;
+       
        this->inputProgram->read(color, x, y, sampler, inputBuffers);
        if (rgb_to_luma_y(color) >= threshold) {
                color[0] -= threshold, color[1] -= threshold, color[2] -= threshold;
index d5ec8ba93a61599bb51468a2e0823cfb23a50873..70692565e27f4a241aeb454e119907aea3991156 100644 (file)
@@ -32,8 +32,10 @@ private:
         */
        SocketReader *inputProgram;
 
-       float threshold;
-
+       /**
+        * @brief settings of the glare node.
+        */
+       NodeGlare *settings;
 public:
        GlareThresholdOperation();
 
@@ -52,8 +54,10 @@ public:
         */
        void deinitExecution();
 
-       void setThreshold(float threshold) {
-               this->threshold = threshold;
+       void setGlareSettings(NodeGlare *settings) {
+               this->settings = settings;
        }
+       
+       void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]);
 };
 #endif
diff --git a/source/blender/compositor/operations/COM_MixGlareOperation.cpp b/source/blender/compositor/operations/COM_MixGlareOperation.cpp
new file mode 100644 (file)
index 0000000..229fc1e
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2011, Glareer Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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.
+ *
+ * Contributor: 
+ *             Jeroen Bakker 
+ *             Monique Dewanchand
+ */
+
+#include "COM_MixGlareOperation.h"
+
+MixGlareOperation::MixGlareOperation(): MixBaseOperation()
+{
+}
+
+void MixGlareOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[])
+{
+       float inputColor1[4];
+       float inputColor2[4];
+       float inputValue[4];
+       float value;
+       
+       inputValueOperation->read(inputValue, x, y, sampler, inputBuffers);
+       inputColor1Operation->read(inputColor1, x, y, sampler, inputBuffers);
+       inputColor2Operation->read(inputColor2, x, y, sampler, inputBuffers);
+       value = inputValue[0];
+       float mf = 2.f - 2.f*fabsf(value - 0.5f);
+       
+       outputValue[0] = mf*((inputColor1[0])+value*(inputColor2[0]-inputColor1[0]));
+       outputValue[1] = mf*((inputColor1[1])+value*(inputColor2[1]-inputColor1[1]));
+       outputValue[2] = mf*((inputColor1[2])+value*(inputColor2[2]-inputColor1[2]));
+       outputValue[3] = inputColor1[3];
+}
diff --git a/source/blender/compositor/operations/COM_MixGlareOperation.h b/source/blender/compositor/operations/COM_MixGlareOperation.h
new file mode 100644 (file)
index 0000000..1a025eb
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2011, Glareer Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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.
+ *
+ * Contributor: 
+ *             Jeroen Bakker 
+ *             Monique Dewanchand
+ */
+
+#ifndef _COM_MixGlareOperation_h
+#define _COM_MixGlareOperation_h
+#include "COM_MixBaseOperation.h"
+
+
+/**
+ * this program converts an input colour to an output value.
+ * it assumes we are in sRGB colour space.
+ */
+class MixGlareOperation : public MixBaseOperation {
+public:
+       /**
+        * Default constructor
+        */
+       MixGlareOperation();
+       
+       /**
+        * the inner loop of this program
+        */
+       void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer * inputBuffers[]);
+
+};
+#endif