Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-07-06 16:59:00 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-07-06 16:59:00 +0400
commitd1c335ad790c885ccff97c69eeb023eef8fc8e59 (patch)
tree99ef8fd29864e5a55cf80233a6b88d0d82b50371 /source
parentcf369c5e1345fce3d810363fc16235edd7f315a8 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenloader/intern/readfile.c22
-rw-r--r--source/blender/compositor/nodes/COM_KeyingNode.cpp7
-rw-r--r--source/blender/compositor/nodes/COM_KeyingNode.h3
-rw-r--r--source/blender/compositor/operations/COM_KeyingDespillOperation.cpp13
-rw-r--r--source/blender/compositor/operations/COM_KeyingDespillOperation.h2
-rw-r--r--source/blender/compositor/operations/COM_KeyingOperation.cpp7
-rw-r--r--source/blender/editors/space_node/drawnode.c1
-rw-r--r--source/blender/makesdna/DNA_node_types.h1
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c8
9 files changed, 54 insertions, 10 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 21714540def..6baf4cc435f 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -7061,6 +7061,21 @@ static void do_version_ntree_dilateerode_264(void *UNUSED(data), ID *UNUSED(id),
}
}
+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 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
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! */
diff --git a/source/blender/compositor/nodes/COM_KeyingNode.cpp b/source/blender/compositor/nodes/COM_KeyingNode.cpp
index 7c39765fbf1..efd50a44a51 100644
--- a/source/blender/compositor/nodes/COM_KeyingNode.cpp
+++ b/source/blender/compositor/nodes/COM_KeyingNode.cpp
@@ -184,11 +184,13 @@ OutputSocket *KeyingNode::setupFeather(ExecutionSystem *graph, CompositorContext
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 @@ void KeyingNode::convertToOperations(ExecutionSystem *graph, CompositorContext *
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 */
diff --git a/source/blender/compositor/nodes/COM_KeyingNode.h b/source/blender/compositor/nodes/COM_KeyingNode.h
index 294a27bb52c..6ab6a60a44d 100644
--- a/source/blender/compositor/nodes/COM_KeyingNode.h
+++ b/source/blender/compositor/nodes/COM_KeyingNode.h
@@ -36,7 +36,8 @@ protected:
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:
diff --git a/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp b/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp
index 081d9f723e8..9798ddcee94 100644
--- a/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp
+++ b/source/blender/compositor/operations/COM_KeyingDespillOperation.cpp
@@ -47,6 +47,7 @@ KeyingDespillOperation::KeyingDespillOperation() : NodeOperation()
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 @@ void KeyingDespillOperation::executePixel(float *color, float x, float y, PixelS
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;
}
diff --git a/source/blender/compositor/operations/COM_KeyingDespillOperation.h b/source/blender/compositor/operations/COM_KeyingDespillOperation.h
index 4fea9b578a1..3485bf1952f 100644
--- a/source/blender/compositor/operations/COM_KeyingDespillOperation.h
+++ b/source/blender/compositor/operations/COM_KeyingDespillOperation.h
@@ -34,6 +34,7 @@ protected:
SocketReader *m_pixelReader;
SocketReader *m_screenReader;
float m_despillFactor;
+ float m_colorBalance;
public:
KeyingDespillOperation();
@@ -42,6 +43,7 @@ public:
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[]);
};
diff --git a/source/blender/compositor/operations/COM_KeyingOperation.cpp b/source/blender/compositor/operations/COM_KeyingOperation.cpp
index e92e5c84c2d..48d1967b5b3 100644
--- a/source/blender/compositor/operations/COM_KeyingOperation.cpp
+++ b/source/blender/compositor/operations/COM_KeyingOperation.cpp
@@ -45,9 +45,10 @@ static float get_pixel_saturation(float pixelColor[4], float screen_balance, int
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);
}
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 31485463f4f..8b0264da4fa 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -2481,6 +2481,7 @@ static void node_composit_buts_keying(uiLayout *layout, bContext *UNUSED(C), Poi
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);
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index ea894ff7a0d..add0c2fe899 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -654,6 +654,7 @@ typedef struct NodeKeyingScreenData {
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;
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 20310f06466..3646e4d2a13 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -3580,7 +3580,13 @@ static void def_cmp_keying(StructRNA *srna)
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);