Fixed glares

This commit is contained in:
2012-06-14 03:11:36 +00:00
parent cc82653b72
commit fac417a3ba
10 changed files with 155 additions and 102 deletions

View File

@@ -461,6 +461,8 @@ set(SRC
operations/COM_MixBaseOperation.cpp operations/COM_MixBaseOperation.cpp
operations/COM_MixBlendOperation.cpp operations/COM_MixBlendOperation.cpp
operations/COM_MixBlendOperation.h operations/COM_MixBlendOperation.h
operations/COM_MixGlareOperation.cpp
operations/COM_MixGlareOperation.h
operations/COM_MixAddOperation.h operations/COM_MixAddOperation.h
operations/COM_MixAddOperation.cpp operations/COM_MixAddOperation.cpp
operations/COM_MixMultiplyOperation.h operations/COM_MixMultiplyOperation.h

View 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) void MemoryBuffer::readCubic(float result[4], float x, float y)
{ {
int x1 = floor(x); int x1 = floor(x);

View File

@@ -126,6 +126,7 @@ public:
void read(float result[4], int x, int y); void read(float result[4], int x, int y);
void writePixel(int x, int y, const float color[4]); 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 readCubic(float result[4], float x, float y);
void readEWA(float result[4], float fx, float fy, float dx, float dy); void readEWA(float result[4], float fx, float fy, float dx, float dy);

View File

@@ -26,7 +26,7 @@
#include "COM_GlareSimpleStarOperation.h" #include "COM_GlareSimpleStarOperation.h"
#include "COM_GlareStreaksOperation.h" #include "COM_GlareStreaksOperation.h"
#include "COM_SetValueOperation.h" #include "COM_SetValueOperation.h"
#include "COM_MixBlendOperation.h" #include "COM_MixGlareOperation.h"
#include "COM_FastGaussianBlurOperation.h" #include "COM_FastGaussianBlurOperation.h"
#include "COM_GlareGhostOperation.h" #include "COM_GlareGhostOperation.h"
#include "COM_GlareFogGlowOperation.h" #include "COM_GlareFogGlowOperation.h"
@@ -40,90 +40,28 @@ void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext *
bNode *node = this->getbNode(); bNode *node = this->getbNode();
NodeGlare *glare = (NodeGlare*)node->storage; NodeGlare *glare = (NodeGlare*)node->storage;
GlareBaseOperation * glareoperation = NULL;
switch (glare->type) { switch (glare->type) {
default: default:
case 3: case 3:
{ glareoperation = new GlareGhostOperation();
GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation(); break;
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);
}
case 2: // streaks case 2: // streaks
{ glareoperation = new GlareStreaksOperation();
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);
}
break; break;
case 1: // fog glow case 1: // fog glow
{ glareoperation = new GlareFogGlowOperation();
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);
}
break; break;
case 0: // simple star case 0: // simple star
{ glareoperation = new GlareSimpleStarOperation();
break;
}
GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation(); GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation();
GlareSimpleStarOperation * glareoperation = new GlareSimpleStarOperation();
SetValueOperation * mixvalueoperation = new SetValueOperation(); SetValueOperation * mixvalueoperation = new SetValueOperation();
MixBlendOperation * mixoperation = new MixBlendOperation(); MixGlareOperation * mixoperation = new MixGlareOperation();
mixoperation->getInputSocket(2)->setResizeMode(COM_SC_FIT);
this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system); this->getInputSocket(0)->relinkConnections(thresholdOperation->getInputSocket(0), 0, system);
addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0)); addLink(system, thresholdOperation->getOutputSocket(), glareoperation->getInputSocket(0));
@@ -132,17 +70,14 @@ void GlareNode::convertToOperations(ExecutionSystem *system, CompositorContext *
addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1)); addLink(system, thresholdOperation->getInputSocket(0)->getConnection()->getFromSocket(), mixoperation->getInputSocket(1));
this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket()); this->getOutputSocket()->relinkConnections(mixoperation->getOutputSocket());
thresholdOperation->setThreshold(glare->threshold); thresholdOperation->setGlareSettings(glare);
glareoperation->setGlareSettings(glare); glareoperation->setGlareSettings(glare);
mixvalueoperation->setValue(0.5f+glare->mix*0.5f); mixvalueoperation->setValue(0.5f+glare->mix*0.5f);
mixoperation->setResolutionInputSocketIndex(1); mixoperation->setResolutionInputSocketIndex(1);
system->addOperation(glareoperation); system->addOperation(glareoperation);
system->addOperation(thresholdOperation); system->addOperation(thresholdOperation);
system->addOperation(mixvalueoperation); system->addOperation(mixvalueoperation);
system->addOperation(mixoperation); system->addOperation(mixoperation);
}
break;
}
} }

View File

@@ -322,7 +322,7 @@ void convolve(float* dst, MemoryBuffer* in1, MemoryBuffer* in2)
memset(data2, 0, w2*h2*sizeof(fREAL)); memset(data2, 0, w2*h2*sizeof(fREAL));
for (y=0; y<ybsz; y++) { for (y=0; y<ybsz; y++) {
int yy = ybl*ybsz + y; int yy = ybl*ybsz + y;
if (yy >= kernelHeight) continue; if (yy >= imageHeight) continue;
fp = &data2[y*w2]; fp = &data2[y*w2];
colp = (fRGB*)&imageBuffer[yy*imageWidth*COM_NUMBER_OF_CHANNELS]; colp = (fRGB*)&imageBuffer[yy*imageWidth*COM_NUMBER_OF_CHANNELS];
for (x=0; x<xbsz; x++) { for (x=0; x<xbsz; x++) {

View File

@@ -113,7 +113,7 @@ void GlareGhostOperation::generateGlare(float *data, MemoryBuffer *inputTile, No
sm = smoothMask(s, t) * 0.25f; sm = smoothMask(s, t) * 0.25f;
fRGB_madd(tc, c, sm); fRGB_madd(tc, c, sm);
} }
tbuf1->writePixel(x, y, tc); tbuf1->addPixel(x, y, tc);
} }
if (isBreaked()) breaked = true; if (isBreaked()) breaked = true;
} }

View File

@@ -25,10 +25,18 @@
GlareThresholdOperation::GlareThresholdOperation() : NodeOperation() GlareThresholdOperation::GlareThresholdOperation() : NodeOperation()
{ {
this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR, COM_SC_FIT);
this->addOutputSocket(COM_DT_COLOR); this->addOutputSocket(COM_DT_COLOR);
this->inputProgram = NULL; 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() void GlareThresholdOperation::initExecution()
{ {
this->inputProgram = this->getInputSocketReader(0); 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[]) 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); this->inputProgram->read(color, x, y, sampler, inputBuffers);
if (rgb_to_luma_y(color) >= threshold) { if (rgb_to_luma_y(color) >= threshold) {
color[0] -= threshold, color[1] -= threshold, color[2] -= threshold; color[0] -= threshold, color[1] -= threshold, color[2] -= threshold;

View File

@@ -32,8 +32,10 @@ private:
*/ */
SocketReader *inputProgram; SocketReader *inputProgram;
float threshold; /**
* @brief settings of the glare node.
*/
NodeGlare *settings;
public: public:
GlareThresholdOperation(); GlareThresholdOperation();
@@ -52,8 +54,10 @@ public:
*/ */
void deinitExecution(); void deinitExecution();
void setThreshold(float threshold) { void setGlareSettings(NodeGlare *settings) {
this->threshold = threshold; this->settings = settings;
} }
void determineResolution(unsigned int resolution[], unsigned int preferredResolution[]);
}; };
#endif #endif

View File

@@ -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];
}

View File

@@ -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