diff options
Diffstat (limited to 'source')
10 files changed, 154 insertions, 101 deletions
diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index 20d110dd2a8..aa428c2b8d0 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -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 diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.cpp b/source/blender/compositor/intern/COM_MemoryBuffer.cpp index b88d42ea8d0..90f6d4a738d 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.cpp +++ b/source/blender/compositor/intern/COM_MemoryBuffer.cpp @@ -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); diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h index dee2c9b771f..dd24a30e85e 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.h +++ b/source/blender/compositor/intern/COM_MemoryBuffer.h @@ -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); diff --git a/source/blender/compositor/nodes/COM_GlareNode.cpp b/source/blender/compositor/nodes/COM_GlareNode.cpp index 6e8e66c83ac..dcb8f3a3a4c 100644 --- a/source/blender/compositor/nodes/COM_GlareNode.cpp +++ b/source/blender/compositor/nodes/COM_GlareNode.cpp @@ -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); + } diff --git a/source/blender/compositor/operations/COM_GlareFogGlowOperation.cpp b/source/blender/compositor/operations/COM_GlareFogGlowOperation.cpp index 4acc8aa17f0..1bdbdf71bdc 100644 --- a/source/blender/compositor/operations/COM_GlareFogGlowOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareFogGlowOperation.cpp @@ -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++) { diff --git a/source/blender/compositor/operations/COM_GlareGhostOperation.cpp b/source/blender/compositor/operations/COM_GlareGhostOperation.cpp index 9bf39db2727..2d5fe57b817 100644 --- a/source/blender/compositor/operations/COM_GlareGhostOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareGhostOperation.cpp @@ -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; } diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp b/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp index ea76e7551ad..f9b2ec2b32d 100644 --- a/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp +++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.cpp @@ -25,10 +25,18 @@ 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; diff --git a/source/blender/compositor/operations/COM_GlareThresholdOperation.h b/source/blender/compositor/operations/COM_GlareThresholdOperation.h index d5ec8ba93a6..70692565e27 100644 --- a/source/blender/compositor/operations/COM_GlareThresholdOperation.h +++ b/source/blender/compositor/operations/COM_GlareThresholdOperation.h @@ -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 index 00000000000..229fc1e5313 --- /dev/null +++ b/source/blender/compositor/operations/COM_MixGlareOperation.cpp @@ -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 index 00000000000..1a025eb3edd --- /dev/null +++ b/source/blender/compositor/operations/COM_MixGlareOperation.h @@ -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 |