[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43225] branches/tile/source/blender/ compositor: Refactor of Distance Matte Node/Operation
Dalai Felinto
dfelinto at gmail.com
Sun Jan 8 21:30:24 CET 2012
Revision: 43225
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43225
Author: dfelinto
Date: 2012-01-08 20:30:12 +0000 (Sun, 08 Jan 2012)
Log Message:
-----------
Refactor of Distance Matte Node/Operation
reinforcing that all Matte operations should output the alpha channel (VALUE).
thus it needs the SetAlpha operation (instead of the split Alpha)
Modified Paths:
--------------
branches/tile/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp
branches/tile/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp
Modified: branches/tile/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp
===================================================================
--- branches/tile/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp 2012-01-08 19:51:14 UTC (rev 43224)
+++ branches/tile/source/blender/compositor/nodes/COM_DistanceMatteNode.cpp 2012-01-08 20:30:12 UTC (rev 43225)
@@ -22,7 +22,7 @@
#include "COM_DistanceMatteNode.h"
#include "BKE_node.h"
#include "COM_DistanceMatteOperation.h"
-#include "COM_SeparateChannelOperation.h"
+#include "COM_SetAlphaOperation.h"
DistanceMatteNode::DistanceMatteNode(bNode *editorNode): Node(editorNode)
{}
@@ -40,18 +40,20 @@
inputSocketImage->relinkConnections(operation->getInputSocket(0), true, 0, graph);
inputSocketKey->relinkConnections(operation->getInputSocket(1), true, 1, graph);
+ if (outputSocketMatte->isConnected()) {
+ outputSocketMatte->relinkConnections(operation->getOutputSocket());
+ }
+
graph->addOperation(operation);
- addPreviewOperation(graph, operation->getOutputSocket(), 9);
+ SetAlphaOperation *operationAlpha = new SetAlphaOperation();
+ addLink(graph, operation->getInputSocket(0)->getConnection()->getFromSocket(), operationAlpha->getInputSocket(0));
+ addLink(graph, operation->getOutputSocket(), operationAlpha->getInputSocket(1));
+
+ graph->addOperation(operationAlpha);
+ addPreviewOperation(graph, operationAlpha->getOutputSocket(), 9);
+
if (outputSocketImage->isConnected()) {
- outputSocketImage->relinkConnections(operation->getOutputSocket());
+ outputSocketImage->relinkConnections(operationAlpha->getOutputSocket());
}
-
- if (outputSocketMatte->isConnected()) {
- SeparateChannelOperation *operationAlpha = new SeparateChannelOperation();
- operationAlpha->setChannel(3);
- addLink(graph, operation->getOutputSocket(), operationAlpha->getInputSocket(0));
- outputSocketMatte->relinkConnections(operationAlpha->getOutputSocket());
- graph->addOperation(operationAlpha);
- }
}
Modified: branches/tile/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp 2012-01-08 19:51:14 UTC (rev 43224)
+++ branches/tile/source/blender/compositor/operations/COM_DistanceMatteOperation.cpp 2012-01-08 20:30:12 UTC (rev 43225)
@@ -27,7 +27,7 @@
DistanceMatteOperation::DistanceMatteOperation(): NodeOperation() {
addInputSocket(COM_DT_COLOR);
addInputSocket(COM_DT_COLOR);
- addOutputSocket(COM_DT_COLOR);
+ addOutputSocket(COM_DT_VALUE);
inputImageProgram = NULL;
inputKeyProgram = NULL;
@@ -45,6 +45,7 @@
void DistanceMatteOperation::executePixel(float* outputValue, float x, float y, MemoryBuffer *inputBuffers[]) {
float inKey[4];
+ float inImage[4];
const float tolerence=this->settings->t1;
const float falloff=this->settings->t2;
@@ -53,29 +54,35 @@
float alpha;
this->inputKeyProgram->read(inKey, x, y, inputBuffers);
- this->inputImageProgram->read(outputValue, x, y, inputBuffers);
+ this->inputImageProgram->read(inImage, x, y, inputBuffers);
- distance = sqrt(pow((inKey[0]-outputValue[0]),2)+
- pow((inKey[1]-outputValue[1]),2)+
- pow((inKey[2]-outputValue[2]),2));
+ distance = sqrt(pow((inKey[0]-inImage[0]),2)+
+ pow((inKey[1]-inImage[1]),2)+
+ pow((inKey[2]-inImage[2]),2));
+
+ /* store matte(alpha) value in [0] to go with
+ * COM_SetAlphaOperation and the Value output
+ */
/*make 100% transparent */
if(distance < tolerence) {
- outputValue[3]=0.f;
+ outputValue[0]=0.f;
}
/*in the falloff region, make partially transparent */
else if(distance < falloff+tolerence){
distance=distance-tolerence;
alpha=distance/falloff;
/*only change if more transparent than before */
- if(alpha < outputValue[3]) {
- outputValue[3]=alpha;
+ if(alpha < inImage[3]) {
+ outputValue[0]=alpha;
}
else { /* leave as before */
+ outputValue[0]=inImage[3];
}
}
else {
/* leave as before */
+ outputValue[0]=inImage[3];
}
}
More information about the Bf-blender-cvs
mailing list