[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52292] trunk/blender/source/blender/ compositor: Fix #33204: Blur node ignores Gamma setting
Sergey Sharybin
sergey.vfx at gmail.com
Sat Nov 17 07:14:32 CET 2012
Revision: 52292
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52292
Author: nazgul
Date: 2012-11-17 06:14:25 +0000 (Sat, 17 Nov 2012)
Log Message:
-----------
Fix #33204: Blur node ignores Gamma setting
Gamma correction option was ignored by new compositor system.
Also new compositor was doing alpha premul in a wrong way. In fact,
not sure if it should do premul -- old compositor didn't do that..
Modified Paths:
--------------
trunk/blender/source/blender/compositor/nodes/COM_BlurNode.cpp
trunk/blender/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp
Modified: trunk/blender/source/blender/compositor/nodes/COM_BlurNode.cpp
===================================================================
--- trunk/blender/source/blender/compositor/nodes/COM_BlurNode.cpp 2012-11-17 06:05:37 UTC (rev 52291)
+++ trunk/blender/source/blender/compositor/nodes/COM_BlurNode.cpp 2012-11-17 06:14:25 UTC (rev 52292)
@@ -31,6 +31,7 @@
#include "COM_FastGaussianBlurOperation.h"
#include "COM_MathBaseOperation.h"
#include "COM_SetValueOperation.h"
+#include "COM_GammaCorrectOperation.h"
BlurNode::BlurNode(bNode *editorNode) : Node(editorNode)
{
@@ -48,16 +49,17 @@
const float size = ((const bNodeSocketValueFloat *)sock->default_value)->value;
CompositorQuality quality = context->getQuality();
-
+ NodeOperation *input_operation = NULL, *output_operation = NULL;
+
if (data->filtertype == R_FILTER_FAST_GAUSS) {
FastGaussianBlurOperation *operationfgb = new FastGaussianBlurOperation();
operationfgb->setData(data);
operationfgb->setbNode(editorNode);
- this->getInputSocket(0)->relinkConnections(operationfgb->getInputSocket(0), 0, graph);
this->getInputSocket(1)->relinkConnections(operationfgb->getInputSocket(1), 1, graph);
- this->getOutputSocket(0)->relinkConnections(operationfgb->getOutputSocket(0));
graph->addOperation(operationfgb);
- addPreviewOperation(graph, context, operationfgb->getOutputSocket());
+
+ input_operation = operationfgb;
+ output_operation = operationfgb;
}
else if (editorNode->custom1 & CMP_NODEFLAG_BLUR_VARIABLE_SIZE) {
MathAddOperation *clamp = new MathAddOperation();
@@ -93,48 +95,68 @@
operation->setData(data);
operation->setbNode(editorNode);
operation->setQuality(quality);
- this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph);
addLink(graph, operationy->getOutputSocket(), operation->getInputSocket(1));
graph->addOperation(operation);
- this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket());
- addPreviewOperation(graph, context, operation->getOutputSocket());
+
+ output_operation = operation;
+ input_operation = operation;
}
else if (!data->bokeh) {
GaussianXBlurOperation *operationx = new GaussianXBlurOperation();
operationx->setData(data);
operationx->setbNode(editorNode);
operationx->setQuality(quality);
- this->getInputSocket(0)->relinkConnections(operationx->getInputSocket(0), 0, graph);
this->getInputSocket(1)->relinkConnections(operationx->getInputSocket(1), 1, graph);
graph->addOperation(operationx);
GaussianYBlurOperation *operationy = new GaussianYBlurOperation();
operationy->setData(data);
operationy->setbNode(editorNode);
operationy->setQuality(quality);
- this->getOutputSocket(0)->relinkConnections(operationy->getOutputSocket());
+
graph->addOperation(operationy);
addLink(graph, operationx->getOutputSocket(), operationy->getInputSocket(0));
addLink(graph, operationx->getInputSocket(1)->getConnection()->getFromSocket(), operationy->getInputSocket(1));
- addPreviewOperation(graph, context, operationy->getOutputSocket());
if (!connectedSizeSocket) {
operationx->setSize(size);
operationy->setSize(size);
}
+
+ input_operation = operationx;
+ output_operation = operationy;
}
else {
GaussianBokehBlurOperation *operation = new GaussianBokehBlurOperation();
operation->setData(data);
operation->setbNode(editorNode);
- this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph);
this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph);
operation->setQuality(quality);
graph->addOperation(operation);
- this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket());
- addPreviewOperation(graph, context, operation->getOutputSocket());
if (!connectedSizeSocket) {
operation->setSize(size);
}
+
+ input_operation = operation;
+ output_operation = operation;
}
+
+ if (data->gamma) {
+ GammaCorrectOperation *correct = new GammaCorrectOperation();
+ GammaUncorrectOperation *inverse = new GammaUncorrectOperation();
+
+ this->getInputSocket(0)->relinkConnections(correct->getInputSocket(0), 0, graph);
+ addLink(graph, correct->getOutputSocket(), input_operation->getInputSocket(0));
+ addLink(graph, output_operation->getOutputSocket(), inverse->getInputSocket(0));
+ this->getOutputSocket()->relinkConnections(inverse->getOutputSocket());
+ graph->addOperation(correct);
+ graph->addOperation(inverse);
+
+ addPreviewOperation(graph, context, inverse->getOutputSocket());
+ }
+ else {
+ this->getInputSocket(0)->relinkConnections(input_operation->getInputSocket(0), 0, graph);
+ this->getOutputSocket()->relinkConnections(output_operation->getOutputSocket());
+ addPreviewOperation(graph, context, output_operation->getOutputSocket());
+ }
}
Modified: trunk/blender/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp 2012-11-17 06:05:37 UTC (rev 52291)
+++ trunk/blender/source/blender/compositor/operations/COM_GammaCorrectOperation.cpp 2012-11-17 06:14:25 UTC (rev 52292)
@@ -49,14 +49,11 @@
output[1] = inputColor[1] > 0.0f ? inputColor[1] * inputColor[1] : 0.0f;
output[2] = inputColor[2] > 0.0f ? inputColor[2] * inputColor[2] : 0.0f;
- inputColor[0] *= inputColor[3];
- inputColor[1] *= inputColor[3];
- inputColor[2] *= inputColor[3];
-
- output[0] = inputColor[0];
- output[1] = inputColor[1];
- output[2] = inputColor[2];
- output[3] = inputColor[3];
+ if (inputColor[3] > 0.0f) {
+ output[0] *= inputColor[3];
+ output[1] *= inputColor[3];
+ output[2] *= inputColor[3];
+ }
}
void GammaCorrectOperation::deinitExecution()
@@ -90,14 +87,11 @@
output[1] = inputColor[1] > 0.0f ? sqrtf(inputColor[1]) : 0.0f;
output[2] = inputColor[2] > 0.0f ? sqrtf(inputColor[2]) : 0.0f;
- inputColor[0] *= inputColor[3];
- inputColor[1] *= inputColor[3];
- inputColor[2] *= inputColor[3];
-
- output[0] = inputColor[0];
- output[1] = inputColor[1];
- output[2] = inputColor[2];
- output[3] = inputColor[3];
+ if (inputColor[3] > 0.0f) {
+ output[0] *= inputColor[3];
+ output[1] *= inputColor[3];
+ output[2] *= inputColor[3];
+ }
}
void GammaUncorrectOperation::deinitExecution()
More information about the Bf-blender-cvs
mailing list