Index: source/blender/compositor/nodes/COM_SplitViewerNode.cpp =================================================================== --- source/blender/compositor/nodes/COM_SplitViewerNode.cpp (revision 58238) +++ source/blender/compositor/nodes/COM_SplitViewerNode.cpp (working copy) @@ -24,6 +24,7 @@ #include "BKE_global.h" #include "COM_SplitViewerOperation.h" +#include "COM_ViewerOperation.h" #include "COM_ExecutionSystem.h" SplitViewerNode::SplitViewerNode(bNode *editorNode) : Node(editorNode) @@ -42,29 +43,32 @@ InputSocket *image2Socket = this->getInputSocket(1); Image *image = (Image *)this->getbNode()->id; ImageUser *imageUser = (ImageUser *) this->getbNode()->storage; - if (image1Socket->isConnected() && image2Socket->isConnected()) { - SplitViewerOperation *splitViewerOperation = new SplitViewerOperation(); - splitViewerOperation->setImage(image); - splitViewerOperation->setImageUser(imageUser); - splitViewerOperation->setActive(is_active); - splitViewerOperation->setSplitPercentage(this->getbNode()->custom1); - splitViewerOperation->setViewSettings(context->getViewSettings()); - splitViewerOperation->setDisplaySettings(context->getDisplaySettings()); + SplitViewerOperation *splitViewerOperation = new SplitViewerOperation(); + splitViewerOperation->setSplitPercentage(this->getbNode()->custom1); + splitViewerOperation->setXSplit(!this->getbNode()->custom2); - /* defaults - the viewer node has these options but not exposed for split view - * we could use the split to define an area of interest on one axis at least */ - splitViewerOperation->setChunkOrder(COM_ORDER_OF_CHUNKS_DEFAULT); - splitViewerOperation->setCenterX(0.5f); - splitViewerOperation->setCenterY(0.5f); + image1Socket->relinkConnections(splitViewerOperation->getInputSocket(0), 0, graph); + image2Socket->relinkConnections(splitViewerOperation->getInputSocket(1), 1, graph); - splitViewerOperation->setXSplit(!this->getbNode()->custom2); - image1Socket->relinkConnections(splitViewerOperation->getInputSocket(0), 0, graph); - image2Socket->relinkConnections(splitViewerOperation->getInputSocket(1), 1, graph); + ViewerOperation *viewerOperation = new ViewerOperation(); + viewerOperation->setImage(image); + viewerOperation->setImageUser(imageUser); + viewerOperation->setActive(is_active); + viewerOperation->setViewSettings(context->getViewSettings()); + viewerOperation->setDisplaySettings(context->getDisplaySettings()); - if (is_active) - addPreviewOperation(graph, context, splitViewerOperation->getInputSocket(0)); + /* defaults - the viewer node has these options but not exposed for split view + * we could use the split to define an area of interest on one axis at least */ + viewerOperation->setChunkOrder(COM_ORDER_OF_CHUNKS_DEFAULT); + viewerOperation->setCenterX(0.5f); + viewerOperation->setCenterY(0.5f); - graph->addOperation(splitViewerOperation); - } + addLink(graph, splitViewerOperation->getOutputSocket(), viewerOperation->getInputSocket(0)); + + if (is_active) + addPreviewOperation(graph, context, viewerOperation->getInputSocket(0)); + + graph->addOperation(splitViewerOperation); + graph->addOperation(viewerOperation); } Index: source/blender/compositor/operations/COM_SplitViewerOperation.cpp =================================================================== --- source/blender/compositor/operations/COM_SplitViewerOperation.cpp (revision 58238) +++ source/blender/compositor/operations/COM_SplitViewerOperation.cpp (working copy) @@ -35,10 +35,11 @@ } -SplitViewerOperation::SplitViewerOperation() : ViewerBaseOperation() +SplitViewerOperation::SplitViewerOperation() : NodeOperation() { this->addInputSocket(COM_DT_COLOR); this->addInputSocket(COM_DT_COLOR); + this->addOutputSocket(COM_DT_COLOR); this->m_image1Input = NULL; this->m_image2Input = NULL; } @@ -48,45 +49,33 @@ // When initializing the tree during initial load the width and height can be zero. this->m_image1Input = getInputSocketReader(0); this->m_image2Input = getInputSocketReader(1); - ViewerBaseOperation::initExecution(); } void SplitViewerOperation::deinitExecution() { this->m_image1Input = NULL; this->m_image2Input = NULL; - ViewerBaseOperation::deinitExecution(); } - -void SplitViewerOperation::executeRegion(rcti *rect, unsigned int tileNumber) +void SplitViewerOperation::executePixel(float output[4], float x, float y, PixelSampler sampler) { - float *buffer = this->m_outputBuffer; - - if (!buffer) return; - int x1 = rect->xmin; - int y1 = rect->ymin; - int x2 = rect->xmax; - int y2 = rect->ymax; - int offset = (y1 * this->getWidth() + x1) * 4; - int x; - int y; int perc = this->m_xSplit ? this->m_splitPercentage * this->getWidth() / 100.0f : this->m_splitPercentage * this->getHeight() / 100.0f; - for (y = y1; y < y2; y++) { - for (x = x1; x < x2; x++) { - bool image1; - image1 = this->m_xSplit ? x > perc : y > perc; - if (image1) { - this->m_image1Input->read(&(buffer[offset]), x, y, COM_PS_NEAREST); - } - else { - this->m_image2Input->read(&(buffer[offset]), x, y, COM_PS_NEAREST); - } - - offset += 4; - } - offset += (this->getWidth() - (x2 - x1)) * 4; + bool image1 = this->m_xSplit ? x > perc : y > perc; + if (image1) { + this->m_image1Input->read(output, x, y, COM_PS_NEAREST); } - updateImage(rect); + else { + this->m_image2Input->read(output, x, y, COM_PS_NEAREST); + } } +void SplitViewerOperation::determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]) +{ + unsigned int tempPreferredResolution[2] = {0, 0}; + unsigned int tempResolution[2]; + + this->getInputSocket(0)->determineResolution(tempResolution, tempPreferredResolution); + this->setResolutionInputSocketIndex((tempResolution[0] && tempResolution[1]) ? 0 : 1); + + NodeOperation::determineResolution(resolution, preferredResolution); +} Index: source/blender/compositor/operations/COM_SplitViewerOperation.h =================================================================== --- source/blender/compositor/operations/COM_SplitViewerOperation.h (revision 58238) +++ source/blender/compositor/operations/COM_SplitViewerOperation.h (working copy) @@ -26,7 +26,7 @@ #include "DNA_image_types.h" #include "BLI_rect.h" -class SplitViewerOperation : public ViewerBaseOperation { +class SplitViewerOperation : public NodeOperation { private: SocketReader *m_image1Input; SocketReader *m_image2Input; @@ -35,9 +35,10 @@ bool m_xSplit; public: SplitViewerOperation(); - void executeRegion(rcti *rect, unsigned int tileNumber); void initExecution(); void deinitExecution(); + void executePixel(float output[4], float x, float y, PixelSampler sampler); + void determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2]); void setSplitPercentage(float splitPercentage) { this->m_splitPercentage = splitPercentage; } void setXSplit(bool xsplit) { this->m_xSplit = xsplit; } };