rename remaining class members with m_ prefix.
[blender.git] / source / blender / compositor / nodes / COM_DilateErodeNode.cpp
index cc96f672ebd52231638d4e0bd239b23b8e38f6f9..6a11f086b95d27f54ac0d8ac242183edebe78598 100644 (file)
 #include "COM_ExecutionSystem.h"
 #include "COM_DilateErodeOperation.h"
 #include "COM_AntiAliasOperation.h"
+#include "COM_GaussianAlphaXBlurOperation.h"
+#include "COM_GaussianAlphaYBlurOperation.h"
 #include "BLI_math.h"
 
-DilateErodeNode::DilateErodeNode(bNode *editorNode): Node(editorNode)
+DilateErodeNode::DilateErodeNode(bNode *editorNode) : Node(editorNode)
 {
+       /* pass */
 }
 
-void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context)
+void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context)
 {
        
        bNode *editorNode = this->getbNode();
-       if (editorNode->custom1 == CMP_NODE_DILATEERODE_DISTANCE) {
-               DilateErodeDistanceOperation *operation = new DilateErodeDistanceOperation();
+       if (editorNode->custom1 == CMP_NODE_DILATEERODE_DISTANCE_THRESH) {
+               DilateErodeThresholdOperation *operation = new DilateErodeThresholdOperation();
                operation->setDistance(editorNode->custom2);
                operation->setInset(editorNode->custom3);
                
                this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph);
        
                if (editorNode->custom3 < 2.0f) {
-                       AntiAliasOperation * antiAlias = new AntiAliasOperation();
+                       AntiAliasOperation *antiAlias = new AntiAliasOperation();
                        addLink(graph, operation->getOutputSocket(), antiAlias->getInputSocket(0));
                        this->getOutputSocket(0)->relinkConnections(antiAlias->getOutputSocket(0));
                        graph->addOperation(antiAlias);
@@ -53,16 +56,84 @@ void DilateErodeNode::convertToOperations(ExecutionSystem *graph, CompositorCont
                }
                graph->addOperation(operation);
        }
+       else if (editorNode->custom1 == CMP_NODE_DILATEERODE_DISTANCE) {
+               if (editorNode->custom2 > 0) {
+                       DilateDistanceOperation *operation = new DilateDistanceOperation();
+                       operation->setDistance(editorNode->custom2);
+                       this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph);
+                       this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0));
+                       graph->addOperation(operation);
+               }
+               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);
+               }
+       }
+       else if (editorNode->custom1 == CMP_NODE_DILATEERODE_DISTANCE_FEATHER) {
+               /* this uses a modified gaussian blur function otherwise its far too slow */
+               CompositorQuality quality = context->getQuality();
+
+               /* initialize node data */
+               NodeBlurData *data = (NodeBlurData *)&this->m_alpha_blur;
+               memset(data, 0, sizeof(*data));
+               data->filtertype = R_FILTER_GAUSS;
+
+               if (editorNode->custom2 > 0) {
+                       data->sizex = data->sizey = editorNode->custom2;
+               }
+               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());
+
+               /* TODO? */
+               /* see gaussian blue node for original usage */
+#if 0
+               if (!connectedSizeSocket) {
+                       operationx->setSize(size);
+                       operationy->setSize(size);
+               }
+#else
+               operationx->setSize(1.0f);
+               operationy->setSize(1.0f);
+#endif
+               operationx->setSubtract(editorNode->custom2 < 0);
+               operationy->setSubtract(editorNode->custom2 < 0);
+
+               if (editorNode->storage) {
+                       NodeDilateErode *data = (NodeDilateErode *)editorNode->storage;
+                       operationx->setFalloff(data->falloff);
+                       operationy->setFalloff(data->falloff);
+               }
+       }
        else {
                if (editorNode->custom2 > 0) {
-                       DilateStepOperation * operation = new DilateStepOperation();
+                       DilateStepOperation *operation = new DilateStepOperation();
                        operation->setIterations(editorNode->custom2);
                        this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph);
                        this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0));
                        graph->addOperation(operation);
                }
                else {
-                       ErodeStepOperation * operation = new ErodeStepOperation();
+                       ErodeStepOperation *operation = new ErodeStepOperation();
                        operation->setIterations(-editorNode->custom2);
                        this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph);
                        this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0));