Fixed glares
This commit is contained in:
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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());
|
||||
|
||||
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 GlareSimpleStarOperation();
|
||||
break;
|
||||
}
|
||||
GlareThresholdOperation *thresholdOperation = new GlareThresholdOperation();
|
||||
SetValueOperation * mixvalueoperation = new SetValueOperation();
|
||||
MixGlareOperation * mixoperation = new MixGlareOperation();
|
||||
mixoperation->getInputSocket(2)->setResizeMode(COM_SC_FIT);
|
||||
|
||||
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);
|
||||
|
||||
}
|
||||
|
@@ -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++) {
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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];
|
||||
}
|
45
source/blender/compositor/operations/COM_MixGlareOperation.h
Normal file
45
source/blender/compositor/operations/COM_MixGlareOperation.h
Normal 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
|
Reference in New Issue
Block a user