improvement to the DOF node, after blurring the radius buffer (derived from the depth...
authorCampbell Barton <ideasman42@gmail.com>
Wed, 8 Aug 2012 16:46:12 +0000 (16:46 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 8 Aug 2012 16:46:12 +0000 (16:46 +0000)
source/blender/compositor/nodes/COM_DefocusNode.cpp
source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
source/blender/compositor/operations/COM_FastGaussianBlurOperation.h

index 7354c4fcd65689e872b0e2f19f8960f4311ebc56..c2bd899752548603e3ce90d7d58367fd9e76bf2a 100644 (file)
@@ -73,11 +73,14 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext
                this->getInputSocket(1)->relinkConnections(converter->getInputSocket(0), 1, graph);
                graph->addOperation(converter);
                
-               FastGaussianBlurValueOperation * blur = new FastGaussianBlurValueOperation();
+               FastGaussianBlurValueOperation *blur = new FastGaussianBlurValueOperation();
                addLink(graph, converter->getOutputSocket(0), blur->getInputSocket(0));
                graph->addOperation(blur);
                radiusOperation = blur;
                converter->setPostBlur(blur);
+
+               /* maintain close pixels so far Z values don't bleed into the foreground */
+               blur->setOverlay(FAST_GAUSS_OVERLAY_MIN);
        }
        
        BokehImageOperation *bokeh = new BokehImageOperation();
index 7ef363f5c4a6b7142c68ea59176f44f1a08ea24b..a7b5b5de6b5a614baa86b93d9fb2c54a0aaebf0f 100644 (file)
@@ -277,6 +277,28 @@ void *FastGaussianBlurValueOperation::initializeTileData(rcti *rect)
                MemoryBuffer *newBuf = (MemoryBuffer *)this->m_inputprogram->initializeTileData(rect);
                MemoryBuffer *copy = newBuf->duplicate();
                FastGaussianBlurOperation::IIR_gauss(copy, this->m_sigma, 0, 3);
+
+               if (this->m_overlay == FAST_GAUSS_OVERLAY_MIN) {
+                       float *src = newBuf->getBuffer();
+                       float *dst = copy->getBuffer();
+                       for (int i = copy->getWidth() * copy->getHeight() * COM_NUMBER_OF_CHANNELS; i != 0; i--, src++, dst++) {
+                               if (*src < *dst) {
+                                       *dst = *src;
+                               }
+                       }
+               }
+               else if (this->m_overlay == FAST_GAUSS_OVERLAY_MAX) {
+                       float *src = newBuf->getBuffer();
+                       float *dst = copy->getBuffer();
+                       for (int i = copy->getWidth() * copy->getHeight() * COM_NUMBER_OF_CHANNELS; i != 0; i--, src++, dst++) {
+                               if (*src > *dst) {
+                                       *dst = *src;
+                               }
+                       }
+               }
+
+//             newBuf->
+
                this->m_iirgaus = copy;
        }
        unlockMutex();
index 4560e1b25e38eb019b1d1e6ca3a3c66349ee3bf2..32dc428c21c3df76fa2dd948ffcaf5b7020190fd 100644 (file)
@@ -42,11 +42,23 @@ public:
        void initExecution();
 };
 
+enum {
+       FAST_GAUSS_OVERLAY_MIN  = -1,
+       FAST_GAUSS_OVERLAY_NONE =  0,
+       FAST_GAUSS_OVERLAY_MAX  =  1
+};
+
 class FastGaussianBlurValueOperation : public NodeOperation {
 private:
        float m_sigma;
        MemoryBuffer *m_iirgaus;
        SocketReader *m_inputprogram;
+
+       /**
+        * -1: re-mix with darker
+        *  0: do nothing
+        *  1 re-mix with lighter */
+       int m_overlay;
 public:
        FastGaussianBlurValueOperation();
        bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
@@ -56,6 +68,9 @@ public:
        void deinitExecution();
        void initExecution();
        void setSigma(float sigma) { this->m_sigma = sigma; }
+
+       /* used for DOF blurring ZBuffer */
+       void setOverlay(int overlay) { this->m_overlay = overlay; }
 };
 
 #endif