X-Git-Url: https://git.blender.org/gitweb/gitweb.cgi/blender.git/blobdiff_plain/74a889d8b1a8e9f83214fa885f530b7b167b4a32..cf76d73b8386242d7f655974837d7843c774b36c:/source/blender/compositor/nodes/COM_ZCombineNode.cpp diff --git a/source/blender/compositor/nodes/COM_ZCombineNode.cpp b/source/blender/compositor/nodes/COM_ZCombineNode.cpp index 25d9a6e97d2..82effaf0eda 100644 --- a/source/blender/compositor/nodes/COM_ZCombineNode.cpp +++ b/source/blender/compositor/nodes/COM_ZCombineNode.cpp @@ -27,39 +27,73 @@ #include "COM_ExecutionSystem.h" #include "COM_SetValueOperation.h" #include "COM_MathBaseOperation.h" +#include "COM_AntiAliasOperation.h" +#include "COM_MixBlendOperation.h" #include "DNA_material_types.h" // the ramp types -void ZCombineNode::convertToOperations(ExecutionSystem *system, CompositorContext * context) +void ZCombineNode::convertToOperations(ExecutionSystem *system, CompositorContext *context) { - if (this->getOutputSocket(0)->isConnected()) { - ZCombineOperation * operation = NULL; - if (this->getbNode()->custom1) { - operation = new ZCombineAlphaOperation(); + if (context->getRenderData()->scemode & R_FULL_SAMPLE) { + if (this->getOutputSocket(0)->isConnected()) { + ZCombineOperation *operation = NULL; + if (this->getbNode()->custom1) { + operation = new ZCombineAlphaOperation(); + } + else { + operation = new ZCombineOperation(); + } + + this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, system); + this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, system); + this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), 2, system); + this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), 3, system); + this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); + system->addOperation(operation); + if (this->getOutputSocket(1)->isConnected()) { + MathMinimumOperation *zoperation = new MathMinimumOperation(); + addLink(system, operation->getInputSocket(1)->getConnection()->getFromSocket(), zoperation->getInputSocket(0)); + addLink(system, operation->getInputSocket(3)->getConnection()->getFromSocket(), zoperation->getInputSocket(1)); + this->getOutputSocket(1)->relinkConnections(zoperation->getOutputSocket()); + system->addOperation(zoperation); + } } else { - operation = new ZCombineOperation(); - } - - this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, system); - this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, system); - this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), true, 2, system); - this->getInputSocket(3)->relinkConnections(operation->getInputSocket(3), true, 3, system); - this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket()); - system->addOperation(operation); - if (this->getOutputSocket(1)->isConnected()) { - MathMinimumOperation * zoperation = new MathMinimumOperation(); - addLink(system, operation->getInputSocket(1)->getConnection()->getFromSocket(), zoperation->getInputSocket(0)); - addLink(system, operation->getInputSocket(3)->getConnection()->getFromSocket(), zoperation->getInputSocket(1)); - this->getOutputSocket(1)->relinkConnections(zoperation->getOutputSocket()); - system->addOperation(zoperation); + if (this->getOutputSocket(1)->isConnected()) { + MathMinimumOperation *zoperation = new MathMinimumOperation(); + this->getInputSocket(1)->relinkConnections(zoperation->getInputSocket(0), 1, system); + this->getInputSocket(3)->relinkConnections(zoperation->getInputSocket(1), 3, system); + this->getOutputSocket(1)->relinkConnections(zoperation->getOutputSocket()); + system->addOperation(zoperation); + } } } 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); + + // step 2 anti alias mask bit of an expensive operation, but does the trick + AntiAliasOperation *antialiasoperation = new AntiAliasOperation(); + addLink(system, maskoperation->getOutputSocket(), antialiasoperation->getInputSocket(0)); + + // use mask to blend between the input colors. + ZCombineMaskOperation *zcombineoperation = this->getbNode()->custom1?new ZCombineMaskAlphaOperation():new ZCombineMaskOperation(); + addLink(system, antialiasoperation->getOutputSocket(), zcombineoperation->getInputSocket(0)); + this->getInputSocket(0)->relinkConnections(zcombineoperation->getInputSocket(1), 0, system); + this->getInputSocket(2)->relinkConnections(zcombineoperation->getInputSocket(2), 2, system); + this->getOutputSocket(0)->relinkConnections(zcombineoperation->getOutputSocket()); + + system->addOperation(maskoperation); + system->addOperation(antialiasoperation); + system->addOperation(zcombineoperation); + if (this->getOutputSocket(1)->isConnected()) { - MathMinimumOperation * zoperation = new MathMinimumOperation(); - this->getInputSocket(1)->relinkConnections(zoperation->getInputSocket(0), true, 1, system); - this->getInputSocket(3)->relinkConnections(zoperation->getInputSocket(1), true, 3, system); + MathMinimumOperation *zoperation = new MathMinimumOperation(); + addLink(system, maskoperation->getInputSocket(0)->getConnection()->getFromSocket(), zoperation->getInputSocket(0)); + addLink(system, maskoperation->getInputSocket(1)->getConnection()->getFromSocket(), zoperation->getInputSocket(1)); this->getOutputSocket(1)->relinkConnections(zoperation->getOutputSocket()); system->addOperation(zoperation); }