Fix #35327: compositing Z combine node was not giving the same result as previous
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 13 May 2013 10:40:42 +0000 (10:40 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 13 May 2013 10:40:42 +0000 (10:40 +0000)
versions when the Z values were the same, Also was inconsistent between full sample
on/off.

source/blender/compositor/nodes/COM_ZCombineNode.cpp
source/blender/compositor/operations/COM_ZCombineOperation.cpp

index 82effaf0eda2d7fa30cd14e787f47146233a6589..95f06e350b10b05c3e08c6b2f5a0ae9e4bd18dad 100644 (file)
@@ -71,9 +71,18 @@ void ZCombineNode::convertToOperations(ExecutionSystem *system, CompositorContex
        else {
                // not full anti alias, use masking for Z combine. be aware it uses anti aliasing.
                // step 1 create mask
-               MathGreaterThanOperation *maskoperation = new MathGreaterThanOperation();
-               this->getInputSocket(1)->relinkConnections(maskoperation->getInputSocket(0), 1, system);
-               this->getInputSocket(3)->relinkConnections(maskoperation->getInputSocket(1), 3, system);
+               NodeOperation *maskoperation;
+
+               if (this->getbNode()->custom1) {
+                       maskoperation = new MathGreaterThanOperation();
+                       this->getInputSocket(1)->relinkConnections(maskoperation->getInputSocket(0), 3, system);
+                       this->getInputSocket(3)->relinkConnections(maskoperation->getInputSocket(1), 1, system);
+               }
+               else {
+                       maskoperation = new MathLessThanOperation();
+                       this->getInputSocket(1)->relinkConnections(maskoperation->getInputSocket(0), 1, system);
+                       this->getInputSocket(3)->relinkConnections(maskoperation->getInputSocket(1), 3, system);
+               }
 
                // step 2 anti alias mask bit of an expensive operation, but does the trick
                AntiAliasOperation *antialiasoperation = new AntiAliasOperation();
index 4368ba4f9a09b6442e2ea9521af3cb44d70ebec6..10090294a54f1194ecabedcd508f6bf1d41b0163 100644 (file)
@@ -123,13 +123,7 @@ void ZCombineMaskOperation::executePixel(float output[4], float x, float y, Pixe
        this->m_image1Reader->read(color1, x, y, sampler);
        this->m_image2Reader->read(color2, x, y, sampler);
 
-       float fac = mask[0];
-       // multiply mask with alpha, if mask == 0 color1, else color2 make sure
-       float mfac = 1.0f - fac;
-       output[0] = color1[0] * mfac + color2[0] * fac;
-       output[1] = color1[1] * mfac + color2[1] * fac;
-       output[2] = color1[2] * mfac + color2[2] * fac;
-       output[3] = max(color1[3], color2[3]);
+       interp_v4_v4v4(output, color1, color2, 1.0f - mask[0]);
 }
 
 void ZCombineMaskAlphaOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
@@ -142,15 +136,12 @@ void ZCombineMaskAlphaOperation::executePixel(float output[4], float x, float y,
        this->m_image1Reader->read(color1, x, y, sampler);
        this->m_image2Reader->read(color2, x, y, sampler);
 
-       float fac = mask[0];
-       // multiply mask with alpha, if mask == 0 color1, else color2 make sure
+       float fac = (1.0f - mask[0])*(1.0f - color1[3]) + mask[0]*color2[3];
        float mfac = 1.0f - fac;
-       float alpha = color1[3] * mfac + color2[3] * fac;
-       float facalpha = fac * alpha;
-       mfac = 1.0f - facalpha;
-       output[0] = color1[0] * mfac + color2[0] * facalpha;
-       output[1] = color1[1] * mfac + color2[1] * facalpha;
-       output[2] = color1[2] * mfac + color2[2] * facalpha;
+
+       output[0] = color1[0] * mfac + color2[0] * fac;
+       output[1] = color1[1] * mfac + color2[1] * fac;
+       output[2] = color1[2] * mfac + color2[2] * fac;
        output[3] = max(color1[3], color2[3]);
 }