diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-06-16 18:40:16 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-06-16 18:40:16 +0400 |
commit | 6fc277c410d5ee4d13562e4b8b260bc0929f30f5 (patch) | |
tree | 5c7af757a8ae2c4d55fed565ef058843fef05209 /source/blender/compositor/nodes/COM_DilateErodeNode.cpp | |
parent | e946fa443b5aab057bfe5f40f8bb4f346c84331e (diff) |
support for negative feather dilate/erode
Diffstat (limited to 'source/blender/compositor/nodes/COM_DilateErodeNode.cpp')
-rw-r--r-- | source/blender/compositor/nodes/COM_DilateErodeNode.cpp | 71 |
1 files changed, 35 insertions, 36 deletions
diff --git a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp index 326e0ad0c60..fbec1522e27 100644 --- a/source/blender/compositor/nodes/COM_DilateErodeNode.cpp +++ b/source/blender/compositor/nodes/COM_DilateErodeNode.cpp @@ -74,50 +74,49 @@ void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorCont } else if (editorNode->custom1 == CMP_NODE_DILATEERODE_DISTANCE_FEATHER) { /* this uses a modified gaussian blur function otherwise its far too slow */ - if (editorNode->custom2 > 0) { + CompositorQuality quality = context->getQuality(); - CompositorQuality quality = context->getQuality(); + /* initialize node data */ + NodeBlurData *data = (NodeBlurData *)&this->alpha_blur; + memset(data, 0, sizeof(*data)); + data->filtertype = R_FILTER_GAUSS; - /* initialize node data */ - NodeBlurData *data = (NodeBlurData *)&this->alpha_blur; - memset(data, 0, sizeof(*data)); + if (editorNode->custom2 > 0) { data->sizex = data->sizey = editorNode->custom2; - data->filtertype = R_FILTER_GAUSS; + } + else { + data->sizex = data->sizey = -editorNode->custom2; - GaussianAlphaXBlurOperation *operationx = new GaussianAlphaXBlurOperation(); - operationx->setData(data); - operationx->setQuality(quality); - this->getInputSocket(0)->relinkConnections(operationx->getInputSocket(0), 0, graph); - // this->getInputSocket(1)->relinkConnections(operationx->getInputSocket(1), 1, graph); // no size input yet - graph->addOperation(operationx); - GaussianAlphaYBlurOperation *operationy = new GaussianAlphaYBlurOperation(); - operationy->setData(data); - operationy->setQuality(quality); - this->getOutputSocket(0)->relinkConnections(operationy->getOutputSocket()); - graph->addOperation(operationy); - addLink(graph, operationx->getOutputSocket(), operationy->getInputSocket(0)); - // addLink(graph, operationx->getInputSocket(1)->getConnection()->getFromSocket(), operationy->getInputSocket(1)); // no size input yet - addPreviewOperation(graph, operationy->getOutputSocket()); + } + + GaussianAlphaXBlurOperation *operationx = new GaussianAlphaXBlurOperation(); + operationx->setData(data); + operationx->setQuality(quality); + this->getInputSocket(0)->relinkConnections(operationx->getInputSocket(0), 0, graph); + // this->getInputSocket(1)->relinkConnections(operationx->getInputSocket(1), 1, graph); // no size input yet + graph->addOperation(operationx); + GaussianAlphaYBlurOperation *operationy = new GaussianAlphaYBlurOperation(); + operationy->setData(data); + operationy->setQuality(quality); + this->getOutputSocket(0)->relinkConnections(operationy->getOutputSocket()); + graph->addOperation(operationy); + addLink(graph, operationx->getOutputSocket(), operationy->getInputSocket(0)); + // addLink(graph, operationx->getInputSocket(1)->getConnection()->getFromSocket(), operationy->getInputSocket(1)); // no size input yet + addPreviewOperation(graph, operationy->getOutputSocket()); - /* TODO? */ - /* see gaussian blue node for original usage */ + /* TODO? */ + /* see gaussian blue node for original usage */ #if 0 - if (!connectedSizeSocket) { - operationx->setSize(size); - operationy->setSize(size); - } + if (!connectedSizeSocket) { + operationx->setSize(size); + operationy->setSize(size); + } #else - operationx->setSize(1.0f); - operationy->setSize(1.0f); + operationx->setSize(1.0f); + operationy->setSize(1.0f); #endif - } - else { - ErodeDistanceOperation *operation = new ErodeDistanceOperation(); - operation->setDistance(-editorNode->custom2); - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph); - this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0)); - graph->addOperation(operation); - } + operationx->setSubtract(editorNode->custom2 < 0); + operationy->setSubtract(editorNode->custom2 < 0); } else { if (editorNode->custom2 > 0) { |