Core matte input for keying node
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 15 Jun 2012 11:53:51 +0000 (11:53 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 15 Jun 2012 11:53:51 +0000 (11:53 +0000)
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
source/blender/compositor/operations/COM_KeyingOperation.cpp
source/blender/compositor/operations/COM_KeyingOperation.h
source/blender/nodes/composite/nodes/node_composite_keying.c

index b1bde9643dfb6c4a89e17ef466b5abfb5a01c96d..75a2fe966461f2d8969032fbea67626bbf75fdd4 100644 (file)
@@ -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  */
index 599989d52dca6b0a19d9566c655bbd5b8f1d7032..e04c79f6713fd9be1a8f90d64e30a03d607c72e8 100644 (file)
@@ -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)
index 657a1ff807c1920c407071b9f8983441faf25019..8d0e7851ee50b7dc3a53cb4bc058f5b71b0d5750 100644 (file)
@@ -39,6 +39,7 @@ protected:
        SocketReader *pixelReader;
        SocketReader *screenReader;
        SocketReader *garbageReader;
+       SocketReader *coreReader;
 
        float screenBalance;
 
index 31a8a0d67a60a0cb563a7a79d3fb4e193cc6ee87..f37c3686e2b2b682bea45b36609a30f369d107b4 100644 (file)
@@ -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, ""       }
 };