Revision: 46543
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46543
Author:   jbakker
Date:     2012-05-11 09:08:58 +0000 (Fri, 11 May 2012)
Log Message:
-----------
TileBranch
 * fixed support for file output node trunk

Modified Paths:
--------------
    branches/tile/source/blender/compositor/intern/COM_Converter.cpp
    branches/tile/source/blender/compositor/nodes/COM_ImageNode.cpp
    branches/tile/source/blender/compositor/nodes/COM_ImageNode.h
    branches/tile/source/blender/compositor/nodes/COM_OutputFileNode.cpp
    branches/tile/source/blender/compositor/nodes/COM_OutputFileNode.h
    
branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
    
branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.h
    
branches/tile/source/blender/compositor/operations/COM_OutputFileOperation.cpp
    branches/tile/source/blender/compositor/operations/COM_OutputFileOperation.h

Modified: branches/tile/source/blender/compositor/intern/COM_Converter.cpp
===================================================================
--- branches/tile/source/blender/compositor/intern/COM_Converter.cpp    
2012-05-11 08:06:01 UTC (rev 46542)
+++ branches/tile/source/blender/compositor/intern/COM_Converter.cpp    
2012-05-11 09:08:58 UTC (rev 46543)
@@ -314,9 +314,11 @@
        case CMP_NODE_COLOR_SPILL:
                node = new ColorSpillNode(bNode);
                break;
+#ifdef COM_TRUNK
        case CMP_NODE_OUTPUT_FILE:
                node = new OutputFileNode(bNode);
                break;
+#endif
        case CMP_NODE_MAP_VALUE:
                node = new MapValueNode(bNode);
                break;

Modified: branches/tile/source/blender/compositor/nodes/COM_ImageNode.cpp
===================================================================
--- branches/tile/source/blender/compositor/nodes/COM_ImageNode.cpp     
2012-05-11 08:06:01 UTC (rev 46542)
+++ branches/tile/source/blender/compositor/nodes/COM_ImageNode.cpp     
2012-05-11 09:08:58 UTC (rev 46543)
@@ -18,6 +18,7 @@
  * Contributor: 
  *             Jeroen Bakker 
  *             Monique Dewanchand
+ *             Lukas Tönne
  */
 
 #include "COM_ImageNode.h"

Modified: branches/tile/source/blender/compositor/nodes/COM_ImageNode.h
===================================================================
--- branches/tile/source/blender/compositor/nodes/COM_ImageNode.h       
2012-05-11 08:06:01 UTC (rev 46542)
+++ branches/tile/source/blender/compositor/nodes/COM_ImageNode.h       
2012-05-11 09:08:58 UTC (rev 46543)
@@ -18,6 +18,7 @@
  * Contributor: 
  *             Jeroen Bakker 
  *             Monique Dewanchand
+ *             Lukas Tönne
  */
 
 #include "COM_defines.h"

Modified: branches/tile/source/blender/compositor/nodes/COM_OutputFileNode.cpp
===================================================================
--- branches/tile/source/blender/compositor/nodes/COM_OutputFileNode.cpp        
2012-05-11 08:06:01 UTC (rev 46542)
+++ branches/tile/source/blender/compositor/nodes/COM_OutputFileNode.cpp        
2012-05-11 09:08:58 UTC (rev 46543)
@@ -18,33 +18,71 @@
  * Contributor: 
  *             Jeroen Bakker 
  *             Monique Dewanchand
+ *             Lukas Tönne
  */
 
 #include "COM_OutputFileNode.h"
 #include "COM_OutputFileOperation.h"
 #include "COM_ExecutionSystem.h"
+#include "BLI_path_util.h"
+#include "BKE_utildefines.h"
 
+#ifdef COM_TRUNK
 OutputFileNode::OutputFileNode(bNode *editorNode): Node(editorNode) {
 }
 
 void OutputFileNode::convertToOperations(ExecutionSystem *graph, 
CompositorContext * context) {
-       InputSocket *imageSocket = this->getInputSocket(0);
-       InputSocket *zSocket = this->getInputSocket(1);
-       NodeImageFile* storage = (NodeImageFile*)this->getbNode()->storage;
-       if (imageSocket->isConnected()) {
-//             if (context->isRendering()) {
-                       if (storage->sfra == storage->efra || 
(context->getFramenumber()<=storage->efra && 
context->getFramenumber()>=storage->sfra)) {
-                               OutputFileOperation *outputFileOperation = new 
OutputFileOperation();
-                               
outputFileOperation->setScene(context->getScene());
-                               outputFileOperation->setNodeImageFile(storage);
-                               
outputFileOperation->setbNodeTree(context->getbNodeTree());
-                               
imageSocket->relinkConnections(outputFileOperation->getInputSocket(0));
-                               
zSocket->relinkConnections(outputFileOperation->getInputSocket(1));
-                               graph->addOperation(outputFileOperation);
-                               addPreviewOperation(graph, 
outputFileOperation->getInputSocket(0), 5);
-//                     }
-               } else {
-                       addPreviewOperation(graph, 
imageSocket->getOperation()->getOutputSocket(), 5);
+       NodeImageMultiFile* storage = 
(NodeImageMultiFile*)this->getbNode()->storage;
+       
+       if (!context->isRendering()) {
+               /* XXX TODO as in previous implementation?
+                * add dummy operations and exit, to prevent file writing on 
each compo update.
+                */
+       }
+       
+       if (storage->format.imtype==R_IMF_IMTYPE_MULTILAYER) {
+               /* single output operation for the multilayer file */
+               OutputOpenExrMultiLayerOperation *outputOperation = new 
OutputOpenExrMultiLayerOperation(
+                               context->getScene(), context->getbNodeTree(), 
storage->base_path, storage->format.exr_codec);
+               
+               int num_inputs = getNumberOfInputSockets();
+               for (int i=0; i < num_inputs; ++i) {
+                       InputSocket *input = getInputSocket(i);
+                       if (input->isConnected()) {
+                               NodeImageMultiFileSocket *sockdata = 
(NodeImageMultiFileSocket *)input->getbNodeSocket()->storage;
+                               
+                               outputOperation->add_layer(sockdata->path, 
input->getDataType());
+                               
+                               
input->relinkConnections(outputOperation->getInputSocket(i));
+                       }
                }
+               if (num_inputs>0) addPreviewOperation(graph, 
outputOperation->getInputSocket(0), 5);
+               
+               graph->addOperation(outputOperation);
        }
+       else {  /* single layer format */
+               int num_inputs = getNumberOfInputSockets();
+               bool previewAdded = false;
+               for (int i=0; i < num_inputs; ++i) {
+                       InputSocket *input = getInputSocket(i);
+                       if (input->isConnected()) {
+                               NodeImageMultiFileSocket *sockdata = 
(NodeImageMultiFileSocket *)input->getbNodeSocket()->storage;
+                               ImageFormatData *format = 
(sockdata->use_node_format ? &storage->format : &sockdata->format);
+                               char path[FILE_MAX];
+                               
+                               /* combine file path for the input */
+                               BLI_join_dirfile(path, FILE_MAX, 
storage->base_path, sockdata->path);
+                               
+                               OutputSingleLayerOperation *outputOperation = 
new OutputSingleLayerOperation(
+                                               context->getScene(), 
context->getbNodeTree(), input->getActualDataType(), format, path);
+                               
input->relinkConnections(outputOperation->getInputSocket(0));
+                               graph->addOperation(outputOperation);
+                               if (!previewAdded) {
+                                       addPreviewOperation(graph, 
outputOperation->getInputSocket(0), 5);
+                                       previewAdded = true;
+                               }
+                       }
+               }
+       }
 }
+#endif

Modified: branches/tile/source/blender/compositor/nodes/COM_OutputFileNode.h
===================================================================
--- branches/tile/source/blender/compositor/nodes/COM_OutputFileNode.h  
2012-05-11 08:06:01 UTC (rev 46542)
+++ branches/tile/source/blender/compositor/nodes/COM_OutputFileNode.h  
2012-05-11 09:08:58 UTC (rev 46543)
@@ -18,6 +18,7 @@
  * Contributor: 
  *             Jeroen Bakker 
  *             Monique Dewanchand
+ *             Lukas Tönne
  */
 
 #ifndef _COM_OutputFileNode_h
@@ -25,6 +26,7 @@
 
 #include "COM_Node.h"
 #include "DNA_node_types.h"
+#ifdef COM_TRUNK
 /**
   * @brief OutputFileNode
   * @ingroup Node
@@ -35,3 +37,4 @@
        void convertToOperations(ExecutionSystem *graph, CompositorContext * 
context);
 };
 #endif
+#endif

Modified: 
branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
===================================================================
--- 
branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
 2012-05-11 08:06:01 UTC (rev 46542)
+++ 
branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
 2012-05-11 09:08:58 UTC (rev 46543)
@@ -18,6 +18,7 @@
  * Contributor: 
  *             Jeroen Bakker 
  *             Monique Dewanchand
+ *             Lukas Tönne
  */
 
 #include "COM_MultilayerImageOperation.h"

Modified: 
branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.h
===================================================================
--- 
branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.h
   2012-05-11 08:06:01 UTC (rev 46542)
+++ 
branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.h
   2012-05-11 09:08:58 UTC (rev 46543)
@@ -18,6 +18,7 @@
  * Contributor: 
  *             Jeroen Bakker 
  *             Monique Dewanchand
+ *             Lukas Tönne
  */
 
 

Modified: 
branches/tile/source/blender/compositor/operations/COM_OutputFileOperation.cpp
===================================================================
--- 
branches/tile/source/blender/compositor/operations/COM_OutputFileOperation.cpp  
    2012-05-11 08:06:01 UTC (rev 46542)
+++ 
branches/tile/source/blender/compositor/operations/COM_OutputFileOperation.cpp  
    2012-05-11 09:08:58 UTC (rev 46543)
@@ -18,11 +18,15 @@
  * Contributor: 
  *             Jeroen Bakker 
  *             Monique Dewanchand
+ *             Lukas Tönne
  */
 
 #include "COM_OutputFileOperation.h"
 #include "COM_SocketConnection.h"
+#include <string.h>
 #include "BLI_listbase.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
 #include "DNA_scene_types.h"
 #include "BKE_image.h"
 #include "BKE_global.h"
@@ -34,100 +38,218 @@
        #include "IMB_imbuf_types.h"
 }
 
+#ifdef COM_TRUNK
+static int get_datatype_size(DataType datatype)
+{
+       switch (datatype) {
+       case COM_DT_VALUE:      return 1;
+       case COM_DT_VECTOR:     return 3;
+       case COM_DT_COLOR:      return 4;
+       default:                        return 0;
+       }
+}
 
-OutputFileOperation::OutputFileOperation() : NodeOperation() {
-       this->addInputSocket(COM_DT_COLOR);
-       this->addInputSocket(COM_DT_VALUE);
+static float *init_buffer(unsigned int width, unsigned int height, DataType 
datatype) {
+       // When initializing the tree during initial load the width and height 
can be zero.
+       if (width != 0 && height != 0) {
+               int size = get_datatype_size(datatype);
+               return (float *)MEM_callocN(width*height*size*sizeof(float), 
"OutputFile buffer");
+       }
+       else
+               return NULL;
+}
 
-       this->setScene(NULL);
+static void write_buffer_rect(rcti *rect, MemoryBuffer** memoryBuffers, const 
bNodeTree *tree, 
+                              SocketReader *reader, float* buffer, unsigned 
int width, DataType datatype)
+{
+       float color[4];
+       int i, size = get_datatype_size(datatype);
+
+       if (!buffer) return;
+       int x1 = rect->xmin;
+       int y1 = rect->ymin;
+       int x2 = rect->xmax;
+       int y2 = rect->ymax;
+       int offset = (y1*width + x1 ) * size;
+       int x;
+       int y;
+       bool breaked = false;
+
+       for (y = y1 ; y < y2 && (!breaked); y++) {
+               for (x = x1 ; x < x2 && (!breaked) ; x++) {
+                       reader->read(color, x, y, COM_PS_NEAREST, 
memoryBuffers);
+                       
+                       for (i=0; i < size; ++i)
+                               buffer[offset+i] = color[i];
+                       offset += size;
+                       
+                       if (tree->test_break && tree->test_break(tree->tbh))
+                               breaked = true;
+               }
+               offset += (width-(x2-x1)) * size;
+       }
+}
+
+
+OutputSingleLayerOperation::OutputSingleLayerOperation(
+               const Scene *scene, const bNodeTree *tree, DataType datatype, 
ImageFormatData *format, const char *path)
+{
+       this->scene = scene;
+       this->tree = tree;
+       
+       this->addInputSocket(datatype);
+       
        this->outputBuffer = NULL;
-       this->zBuffer = NULL;
+       this->datatype = datatype;
        this->imageInput = NULL;
-       this->zInput = NULL;
+       
+       this->format = format;
+       BLI_strncpy(this->path, path, sizeof(this->path));
 }
 
-void OutputFileOperation::initExecution() {
-       // When initializing the tree during initial load the width and height 
can be zero.
+void OutputSingleLayerOperation::initExecution() {
        this->imageInput = getInputSocketReader(0);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to