[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48263] trunk/blender/source/blender: Added feather control to keying node

Sergey Sharybin sergey.vfx at gmail.com
Mon Jun 25 12:50:36 CEST 2012


Revision: 48263
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48263
Author:   nazgul
Date:     2012-06-25 10:50:24 +0000 (Mon, 25 Jun 2012)
Log Message:
-----------
Added feather control to keying node

Behaves in the same way as feather dilate/erode node, applies
after dilate/erode in node.

Also use distance dilate/erode instead of size.

Modified Paths:
--------------
    trunk/blender/source/blender/compositor/nodes/COM_KeyingNode.cpp
    trunk/blender/source/blender/compositor/nodes/COM_KeyingNode.h
    trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c

Modified: trunk/blender/source/blender/compositor/nodes/COM_KeyingNode.cpp
===================================================================
--- trunk/blender/source/blender/compositor/nodes/COM_KeyingNode.cpp	2012-06-25 10:35:24 UTC (rev 48262)
+++ trunk/blender/source/blender/compositor/nodes/COM_KeyingNode.cpp	2012-06-25 10:50:24 UTC (rev 48263)
@@ -40,6 +40,9 @@
 
 #include "COM_SetAlphaOperation.h"
 
+#include "COM_GaussianAlphaXBlurOperation.h"
+#include "COM_GaussianAlphaYBlurOperation.h"
+
 KeyingNode::KeyingNode(bNode *editorNode) : Node(editorNode)
 {
 	/* pass */
@@ -116,15 +119,15 @@
 
 OutputSocket *KeyingNode::setupDilateErode(ExecutionSystem *graph, OutputSocket *dilateErodeInput, int distance)
 {
-	DilateStepOperation *dilateErodeOperation;
+	DilateDistanceOperation *dilateErodeOperation;
 
 	if (distance > 0) {
-		dilateErodeOperation = new DilateStepOperation();
-		dilateErodeOperation->setIterations(distance);
+		dilateErodeOperation = new DilateDistanceOperation();
+		dilateErodeOperation->setDistance(distance);
 	}
 	else {
-		dilateErodeOperation = new ErodeStepOperation();
-		dilateErodeOperation->setIterations(-distance);
+		dilateErodeOperation = new ErodeDistanceOperation();
+		dilateErodeOperation->setDistance(-distance);
 	}
 
 	addLink(graph, dilateErodeInput, dilateErodeOperation->getInputSocket(0));
@@ -134,6 +137,46 @@
 	return dilateErodeOperation->getOutputSocket(0);
 }
 
+OutputSocket *KeyingNode::setupFeather(ExecutionSystem *graph, CompositorContext *context,
+                                       OutputSocket *featherInput, int falloff, int distance)
+{
+	/* this uses a modified gaussian blur function otherwise its far too slow */
+	CompositorQuality quality = context->getQuality();
+
+	/* initialize node data */
+	NodeBlurData *data = (NodeBlurData *)&this->alpha_blur;
+	memset(data, 0, sizeof(*data));
+	data->filtertype = R_FILTER_GAUSS;
+
+	if (distance > 0) {
+		data->sizex = data->sizey = distance;
+	}
+	else {
+		data->sizex = data->sizey = -distance;
+	}
+
+	GaussianAlphaXBlurOperation *operationx = new GaussianAlphaXBlurOperation();
+	operationx->setData(data);
+	operationx->setQuality(quality);
+	operationx->setSize(1.0f);
+	operationx->setSubtract(distance < 0);
+	operationx->setFalloff(falloff);
+	graph->addOperation(operationx);
+
+	GaussianAlphaYBlurOperation *operationy = new GaussianAlphaYBlurOperation();
+	operationy->setData(data);
+	operationy->setQuality(quality);
+	operationy->setSize(1.0f);
+	operationy->setSubtract(distance < 0);
+	operationy->setFalloff(falloff);
+	graph->addOperation(operationy);
+
+	addLink(graph, featherInput, operationx->getInputSocket(0));
+	addLink(graph, operationx->getOutputSocket(), operationy->getInputSocket(0));
+
+	return operationy->getOutputSocket();
+}
+
 OutputSocket *KeyingNode::setupDespill(ExecutionSystem *graph, OutputSocket *despillInput, OutputSocket *inputScreen, float factor)
 {
 	KeyingDespillOperation *despillOperation = new KeyingDespillOperation();
@@ -225,6 +268,12 @@
 		postprocessedMatte = setupDilateErode(graph, postprocessedMatte, keying_data->dilate_distance);
 	}
 
+	/* matte feather */
+	if (keying_data->feather_distance != 0) {
+		postprocessedMatte = setupFeather(graph, context, postprocessedMatte, keying_data->feather_falloff,
+		                                  keying_data->feather_distance);
+	}
+
 	/* set alpha channel to output image */
 	SetAlphaOperation *alphaOperation = new SetAlphaOperation();
 	addLink(graph, originalImage, alphaOperation->getInputSocket(0));

Modified: trunk/blender/source/blender/compositor/nodes/COM_KeyingNode.h
===================================================================
--- trunk/blender/source/blender/compositor/nodes/COM_KeyingNode.h	2012-06-25 10:35:24 UTC (rev 48262)
+++ trunk/blender/source/blender/compositor/nodes/COM_KeyingNode.h	2012-06-25 10:50:24 UTC (rev 48263)
@@ -29,9 +29,13 @@
   */
 class KeyingNode : public Node {
 protected:
+	NodeBlurData alpha_blur; /* only used for blurring alpha, since the dilate/erode node doesnt have this */
+
 	OutputSocket *setupPreBlur(ExecutionSystem *graph, InputSocket *inputImage, int size, OutputSocket **originalImage);
 	OutputSocket *setupPostBlur(ExecutionSystem *graph, OutputSocket *postBlurInput, int size);
 	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 *setupClip(ExecutionSystem *graph, OutputSocket *clipInput, int kernelRadius, float kernelTolerance,
 	                        float clipBlack, float clipWhite, bool edgeMatte);

Modified: trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp	2012-06-25 10:35:24 UTC (rev 48262)
+++ trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp	2012-06-25 10:50:24 UTC (rev 48263)
@@ -116,8 +116,7 @@
 
 	sites = (VoronoiSite *) MEM_callocN(sizeof(VoronoiSite) * sites_total, "keyingscreen voronoi sites");
 	track = (MovieTrackingTrack *) tracksbase->first;
-	i = 0;
-	while (track) {
+	for (track = (MovieTrackingTrack *) tracksbase->first, i = 0; track; track = track->next, i++) {
 		VoronoiSite *site = &sites[i];
 		MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_frame);
 		ImBuf *pattern_ibuf = BKE_tracking_get_pattern_imbuf(ibuf, track, marker, TRUE, FALSE);
@@ -142,9 +141,6 @@
 
 		site->co[0] = marker->pos[0] * width;
 		site->co[1] = marker->pos[1] * height;
-
-		track = track->next;
-		i++;
 	}
 
 	IMB_freeImBuf(ibuf);

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2012-06-25 10:35:24 UTC (rev 48262)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2012-06-25 10:50:24 UTC (rev 48263)
@@ -2482,6 +2482,8 @@
 	uiItemR(layout, ptr, "clip_black", 0, NULL, ICON_NONE);
 	uiItemR(layout, ptr, "clip_white", 0, NULL, ICON_NONE);
 	uiItemR(layout, ptr, "dilate_distance", 0, NULL, ICON_NONE);
+	uiItemR(layout, ptr, "feather_falloff", 0, NULL, ICON_NONE);
+	uiItemR(layout, ptr, "feather_distance", 0, NULL, ICON_NONE);
 	uiItemR(layout, ptr, "blur_post", 0, NULL, ICON_NONE);
 }
 

Modified: trunk/blender/source/blender/makesdna/DNA_node_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_node_types.h	2012-06-25 10:35:24 UTC (rev 48262)
+++ trunk/blender/source/blender/makesdna/DNA_node_types.h	2012-06-25 10:50:24 UTC (rev 48263)
@@ -655,6 +655,8 @@
 	float edge_kernel_tolerance;
 	float clip_black, clip_white;
 	int dilate_distance;
+	int feather_distance;
+	int feather_falloff;
 	int blur_pre, blur_post;
 } NodeKeyingData;
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2012-06-25 10:35:24 UTC (rev 48262)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2012-06-25 10:50:24 UTC (rev 48263)
@@ -3620,6 +3620,18 @@
 	RNA_def_property_range(prop, 0.0f, 1.0f);
 	RNA_def_property_ui_text(prop, "Edge Kernel Tolerance", "Tolerance to pixels inside kernel which are treating as belonging to the same plane");
 	RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
+	prop = RNA_def_property(srna, "feather_falloff", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_sdna(prop, NULL, "feather_falloff");
+	RNA_def_property_enum_items(prop, proportional_falloff_curve_only_items);
+	RNA_def_property_ui_text(prop, "Feather Falloff", "Falloff type the feather");
+	RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+
+	prop = RNA_def_property(srna, "feather_distance", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "feather_distance");
+	RNA_def_property_range(prop, -100, 100);
+	RNA_def_property_ui_text(prop, "Feather Distance", "Distance to grow/shrink the feather");
+	RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
 }
 
 /* -- Texture Nodes --------------------------------------------------------- */




More information about the Bf-blender-cvs mailing list