From 82473f67b358cc76c6e60ced68d73d7dac06a7b0 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 15 Jun 2012 11:53:51 +0000 Subject: Core matte input for keying node This matte could be used to force alpha be at high values in areas where algorithm detects it as edge or background color. --- source/blender/compositor/nodes/COM_KeyingNode.cpp | 2 ++ source/blender/compositor/operations/COM_KeyingOperation.cpp | 8 ++++++++ source/blender/compositor/operations/COM_KeyingOperation.h | 1 + source/blender/nodes/composite/nodes/node_composite_keying.c | 1 + 4 files changed, 12 insertions(+) (limited to 'source/blender') diff --git a/source/blender/compositor/nodes/COM_KeyingNode.cpp b/source/blender/compositor/nodes/COM_KeyingNode.cpp index b1bde9643df..75a2fe96646 100644 --- a/source/blender/compositor/nodes/COM_KeyingNode.cpp +++ b/source/blender/compositor/nodes/COM_KeyingNode.cpp @@ -157,6 +157,7 @@ void KeyingNode::convertToOperations(ExecutionSystem *graph, CompositorContext * InputSocket *inputImage = this->getInputSocket(0); InputSocket *inputScreen = this->getInputSocket(1); InputSocket *inputGarbageMatte = this->getInputSocket(2); + InputSocket *inputCoreMatte = this->getInputSocket(3); OutputSocket *outputImage = this->getOutputSocket(0); OutputSocket *outputMatte = this->getOutputSocket(1); OutputSocket *outputEdges = this->getOutputSocket(2); @@ -172,6 +173,7 @@ void KeyingNode::convertToOperations(ExecutionSystem *graph, CompositorContext * inputScreen->relinkConnections(keyingOperation->getInputSocket(1), 1, graph); inputGarbageMatte->relinkConnections(keyingOperation->getInputSocket(2), 2, graph); + inputCoreMatte->relinkConnections(keyingOperation->getInputSocket(3), 3, graph); if (keying_data->blur_pre) { /* chroma preblur operation for input of keying operation */ diff --git a/source/blender/compositor/operations/COM_KeyingOperation.cpp b/source/blender/compositor/operations/COM_KeyingOperation.cpp index 599989d52dc..e04c79f6713 100644 --- a/source/blender/compositor/operations/COM_KeyingOperation.cpp +++ b/source/blender/compositor/operations/COM_KeyingOperation.cpp @@ -57,6 +57,7 @@ KeyingOperation::KeyingOperation(): NodeOperation() this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_VALUE); + this->addInputSocket(COM_DT_VALUE); this->addOutputSocket(COM_DT_VALUE); this->screenBalance = 0.5f; @@ -64,6 +65,7 @@ KeyingOperation::KeyingOperation(): NodeOperation() this->pixelReader = NULL; this->screenReader = NULL; this->garbageReader = NULL; + this->coreReader = NULL; } void KeyingOperation::initExecution() @@ -71,6 +73,7 @@ void KeyingOperation::initExecution() this->pixelReader = this->getInputSocketReader(0); this->screenReader = this->getInputSocketReader(1); this->garbageReader = this->getInputSocketReader(2); + this->coreReader = this->getInputSocketReader(3); } void KeyingOperation::deinitExecution() @@ -78,6 +81,7 @@ void KeyingOperation::deinitExecution() this->pixelReader = NULL; this->screenReader = NULL; this->garbageReader = NULL; + this->coreReader = NULL; } void KeyingOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) @@ -85,10 +89,12 @@ void KeyingOperation::executePixel(float *color, float x, float y, PixelSampler float pixelColor[4]; float screenColor[4]; float garbageValue[4]; + float coreValue[4]; this->pixelReader->read(pixelColor, x, y, sampler, inputBuffers); this->screenReader->read(screenColor, x, y, sampler, inputBuffers); this->garbageReader->read(garbageValue, x, y, sampler, inputBuffers); + this->coreReader->read(coreValue, x, y, sampler, inputBuffers); int primary_channel = get_pixel_primary_channel(screenColor); @@ -108,6 +114,8 @@ void KeyingOperation::executePixel(float *color, float x, float y, PixelSampler } color[0] *= (1.0f - garbageValue[0]); + + color[0] = MAX2(color[0], coreValue[0]); } bool KeyingOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) diff --git a/source/blender/compositor/operations/COM_KeyingOperation.h b/source/blender/compositor/operations/COM_KeyingOperation.h index 657a1ff807c..8d0e7851ee5 100644 --- a/source/blender/compositor/operations/COM_KeyingOperation.h +++ b/source/blender/compositor/operations/COM_KeyingOperation.h @@ -39,6 +39,7 @@ protected: SocketReader *pixelReader; SocketReader *screenReader; SocketReader *garbageReader; + SocketReader *coreReader; float screenBalance; diff --git a/source/blender/nodes/composite/nodes/node_composite_keying.c b/source/blender/nodes/composite/nodes/node_composite_keying.c index 31a8a0d67a6..f37c3686e2b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_keying.c +++ b/source/blender/nodes/composite/nodes/node_composite_keying.c @@ -49,6 +49,7 @@ static bNodeSocketTemplate cmp_node_keying_in[] = { { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, { SOCK_RGBA, 1, "Key Color", 1.0f, 1.0f, 1.0f, 1.0f}, { SOCK_FLOAT, 1, "Garbage Matte", 0.0f, 1.0f, 1.0f, 1.0f}, + { SOCK_FLOAT, 1, "Core Matte", 0.0f, 1.0f, 1.0f, 1.0f}, { -1, 0, "" } }; -- cgit v1.2.3