[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48679] branches/soc-2011-tomato/source/ blender: Tomato keying screen: small fixes and improvements

Sergey Sharybin sergey.vfx at gmail.com
Fri Jul 6 14:59:00 CEST 2012


Revision: 48679
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48679
Author:   nazgul
Date:     2012-07-06 12:59:00 +0000 (Fri, 06 Jul 2012)
Log Message:
-----------
Tomato keying screen: small fixes and improvements

- Fixed issues with calculating matte with balance != 0.5
  It used to be used concave combination of minimal and maximal
  channel values which could be inpredictable.
  Use concave combination of two non-major channels sorted
  by their index, so such combination would always use the same
  coefficients for particular non-major channels.

- Added despill balance slider which defines balance between
  non-major channels used for calculating average of two
  colors. Difference between average value and pixel value of
  major screen channel defines amount of despill. Balance of
  0.5 gives the same behavior as it was before this slider
  was added.

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
    branches/soc-2011-tomato/source/blender/compositor/nodes/COM_KeyingNode.cpp
    branches/soc-2011-tomato/source/blender/compositor/nodes/COM_KeyingNode.h
    branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp
    branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingDespillOperation.h
    branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingOperation.cpp
    branches/soc-2011-tomato/source/blender/editors/space_node/drawnode.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_node_types.h
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_nodetree.c

Modified: branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c	2012-07-06 12:59:00 UTC (rev 48679)
@@ -7061,6 +7061,21 @@
 	}
 }
 
+static void do_version_ntree_keying_despill_balance(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+{
+	bNode *node;
+
+	for (node = ntree->nodes.first; node; node = node->next) {
+		if (node->type == CMP_NODE_KEYING) {
+			NodeKeyingData *data = node->storage;
+
+			if (data->despill_balance == 0.0f) {
+				data->despill_balance = 0.5f;
+			}
+		}
+	}
+}
+
 static void do_versions(FileData *fd, Library *lib, Main *main)
 {
 	/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -7875,6 +7890,13 @@
 			ntreetype->foreach_nodetree(main, NULL, do_version_ntree_dilateerode_264);
 	}
 
+	{
+		bNodeTreeType *ntreetype = ntreeGetType(NTREE_COMPOSIT);
+
+		if (ntreetype && ntreetype->foreach_nodetree)
+			ntreetype->foreach_nodetree(main, NULL, do_version_ntree_keying_despill_balance);
+	}
+
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
 	/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
 

Modified: branches/soc-2011-tomato/source/blender/compositor/nodes/COM_KeyingNode.cpp
===================================================================
--- branches/soc-2011-tomato/source/blender/compositor/nodes/COM_KeyingNode.cpp	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/compositor/nodes/COM_KeyingNode.cpp	2012-07-06 12:59:00 UTC (rev 48679)
@@ -184,11 +184,13 @@
 	return operationy->getOutputSocket();
 }
 
-OutputSocket *KeyingNode::setupDespill(ExecutionSystem *graph, OutputSocket *despillInput, OutputSocket *inputScreen, float factor)
+OutputSocket *KeyingNode::setupDespill(ExecutionSystem *graph, OutputSocket *despillInput, OutputSocket *inputScreen,
+                                       float factor, float colorBalance)
 {
 	KeyingDespillOperation *despillOperation = new KeyingDespillOperation();
 
 	despillOperation->setDespillFactor(factor);
+	despillOperation->setColorBalance(colorBalance);
 
 	addLink(graph, despillInput, despillOperation->getInputSocket(0));
 	addLink(graph, inputScreen, despillOperation->getInputSocket(1));
@@ -292,7 +294,8 @@
 	if (keying_data->despill_factor > 0.0f) {
 		postprocessedImage = setupDespill(graph, postprocessedImage,
 		                                  keyingOperation->getInputSocket(1)->getConnection()->getFromSocket(),
-		                                  keying_data->despill_factor);
+		                                  keying_data->despill_factor,
+		                                  keying_data->despill_balance);
 	}
 
 	/* connect result to output sockets */

Modified: branches/soc-2011-tomato/source/blender/compositor/nodes/COM_KeyingNode.h
===================================================================
--- branches/soc-2011-tomato/source/blender/compositor/nodes/COM_KeyingNode.h	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/compositor/nodes/COM_KeyingNode.h	2012-07-06 12:59:00 UTC (rev 48679)
@@ -36,7 +36,8 @@
 	OutputSocket *setupDilateErode(ExecutionSystem *graph, OutputSocket *dilateErodeInput, int distance);
 	OutputSocket *setupFeather(ExecutionSystem *graph, CompositorContext *context, OutputSocket *featherInput,
 	                           int falloff, int distance);
-	OutputSocket *setupDespill(ExecutionSystem *graph, OutputSocket *despillInput, OutputSocket *inputSrceen, float factor);
+	OutputSocket *setupDespill(ExecutionSystem *graph, OutputSocket *despillInput, OutputSocket *inputSrceen,
+	                           float factor, float colorBalance);
 	OutputSocket *setupClip(ExecutionSystem *graph, OutputSocket *clipInput, int kernelRadius, float kernelTolerance,
 	                        float clipBlack, float clipWhite, bool edgeMatte);
 public:

Modified: branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp
===================================================================
--- branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp	2012-07-06 12:59:00 UTC (rev 48679)
@@ -47,6 +47,7 @@
 	this->addOutputSocket(COM_DT_COLOR);
 
 	this->m_despillFactor = 0.5f;
+	this->m_colorBalance = 0.5f;
 
 	this->m_pixelReader = NULL;
 	this->m_screenReader = NULL;
@@ -73,16 +74,22 @@
 	this->m_screenReader->read(screenColor, x, y, sampler, inputBuffers);
 
 	int screen_primary_channel = get_pixel_primary_channel(screenColor);
+	int other_1 = (screen_primary_channel + 1) % 3;
+	int other_2 = (screen_primary_channel + 2) % 3;
+
+	int min_channel = MIN2(other_1, other_2);
+	int max_channel = MAX2(other_1, other_2);
+
 	float average_value, amount;
 
-	average_value = (pixelColor[0] + pixelColor[1] + pixelColor[2] - pixelColor[screen_primary_channel]) / 2.0f;
-	amount = pixelColor[screen_primary_channel] - average_value;
+	average_value = this->m_colorBalance * pixelColor[min_channel] + (1.0f - this->m_colorBalance) * pixelColor[max_channel];
+	amount = (pixelColor[screen_primary_channel] - average_value);
 
 	color[0] = pixelColor[0];
 	color[1] = pixelColor[1];
 	color[2] = pixelColor[2];
 	color[3] = pixelColor[3];
-	
+
 	if (this->m_despillFactor * amount > 0) {
 		color[screen_primary_channel] = pixelColor[screen_primary_channel] - this->m_despillFactor * amount;
 	}

Modified: branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingDespillOperation.h
===================================================================
--- branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingDespillOperation.h	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingDespillOperation.h	2012-07-06 12:59:00 UTC (rev 48679)
@@ -34,6 +34,7 @@
 	SocketReader *m_pixelReader;
 	SocketReader *m_screenReader;
 	float m_despillFactor;
+	float m_colorBalance;
 
 public:
 	KeyingDespillOperation();
@@ -42,6 +43,7 @@
 	void deinitExecution();
 
 	void setDespillFactor(float value) {this->m_despillFactor = value;}
+	void setColorBalance(float value) {this->m_colorBalance = value;}
 
 	void executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]);
 };

Modified: branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingOperation.cpp
===================================================================
--- branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingOperation.cpp	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/compositor/operations/COM_KeyingOperation.cpp	2012-07-06 12:59:00 UTC (rev 48679)
@@ -45,10 +45,11 @@
 	int other_1 = (primary_channel + 1) % 3;
 	int other_2 = (primary_channel + 2) % 3;
 
-	float min = MIN2(pixelColor[other_1], pixelColor[other_2]);
-	float max = MAX2(pixelColor[other_1], pixelColor[other_2]);
-	float val = screen_balance * min + (1.0f - screen_balance) * max;
+	int min_channel = MIN2(other_1, other_2);
+	int max_channel = MAX2(other_1, other_2);
 
+	float val = screen_balance * pixelColor[min_channel] + (1.0f - screen_balance) * pixelColor[max_channel];
+
 	return (pixelColor[primary_channel] - val) * fabsf(1.0f - val);
 }
 

Modified: branches/soc-2011-tomato/source/blender/editors/space_node/drawnode.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_node/drawnode.c	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/editors/space_node/drawnode.c	2012-07-06 12:59:00 UTC (rev 48679)
@@ -2481,6 +2481,7 @@
 	uiItemR(layout, ptr, "blur_pre", 0, NULL, ICON_NONE);
 	uiItemR(layout, ptr, "screen_balance", 0, NULL, ICON_NONE);
 	uiItemR(layout, ptr, "despill_factor", 0, NULL, ICON_NONE);
+	uiItemR(layout, ptr, "despill_balance", 0, NULL, ICON_NONE);
 	uiItemR(layout, ptr, "edge_kernel_radius", 0, NULL, ICON_NONE);
 	uiItemR(layout, ptr, "edge_kernel_tolerance", 0, NULL, ICON_NONE);
 	uiItemR(layout, ptr, "clip_black", 0, NULL, ICON_NONE);

Modified: branches/soc-2011-tomato/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/soc-2011-tomato/source/blender/makesdna/DNA_node_types.h	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/makesdna/DNA_node_types.h	2012-07-06 12:59:00 UTC (rev 48679)
@@ -654,6 +654,7 @@
 typedef struct NodeKeyingData {
 	float screen_balance;
 	float despill_factor;
+	float despill_balance;
 	int edge_kernel_radius;
 	float edge_kernel_tolerance;
 	float clip_black, clip_white;

Modified: branches/soc-2011-tomato/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- branches/soc-2011-tomato/source/blender/makesrna/intern/rna_nodetree.c	2012-07-06 11:31:40 UTC (rev 48678)
+++ branches/soc-2011-tomato/source/blender/makesrna/intern/rna_nodetree.c	2012-07-06 12:59:00 UTC (rev 48679)
@@ -3580,9 +3580,15 @@
 	prop = RNA_def_property(srna, "despill_factor", PROP_FLOAT, PROP_FACTOR);
 	RNA_def_property_float_sdna(prop, NULL, "despill_factor");
 	RNA_def_property_range(prop, 0.0f, 1.0f);
-	RNA_def_property_ui_text(prop, "Despill", "Factor of despilling screen color from image");
+	RNA_def_property_ui_text(prop, "Despill Factor", "Factor of despilling screen color from image");
 	RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 
+	prop = RNA_def_property(srna, "despill_balance", PROP_FLOAT, PROP_FACTOR);
+	RNA_def_property_float_sdna(prop, NULL, "despill_balance");
+	RNA_def_property_range(prop, 0.0f, 1.0f);
+	RNA_def_property_ui_text(prop, "Despill Balance", "Balance between non-key colors used to detect amount of key color to be removed");
+	RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+
 	prop = RNA_def_property(srna, "clip_black", PROP_FLOAT, PROP_FACTOR);
 	RNA_def_property_float_sdna(prop, NULL, "clip_black");

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list