Fixed glares
This commit is contained in:
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -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++) {
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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