[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45721] branches/tile/source/blender/ compositor: TileBranch

Jeroen Bakker j.bakker at atmind.nl
Tue Apr 17 19:48:45 CEST 2012


Revision: 45721
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45721
Author:   jbakker
Date:     2012-04-17 17:48:45 +0000 (Tue, 17 Apr 2012)
Log Message:
-----------
TileBranch
 * Cycles layers
 * OpenEXR support

Modified Paths:
--------------
    branches/tile/source/blender/compositor/CMakeLists.txt
    branches/tile/source/blender/compositor/nodes/COM_ImageNode.cpp
    branches/tile/source/blender/compositor/nodes/COM_ImageNode.h
    branches/tile/source/blender/compositor/operations/COM_ImageOperation.cpp
    branches/tile/source/blender/compositor/operations/COM_ImageOperation.h
    branches/tile/source/blender/compositor/operations/COM_RenderLayersCyclesOperation.cpp

Added Paths:
-----------
    branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.cpp
    branches/tile/source/blender/compositor/operations/COM_MultilayerImageOperation.h

Modified: branches/tile/source/blender/compositor/CMakeLists.txt
===================================================================
--- branches/tile/source/blender/compositor/CMakeLists.txt	2012-04-17 17:25:10 UTC (rev 45720)
+++ branches/tile/source/blender/compositor/CMakeLists.txt	2012-04-17 17:48:45 UTC (rev 45721)
@@ -364,6 +364,8 @@
 
 operations/COM_ImageOperation.cpp
 operations/COM_ImageOperation.h
+operations/COM_MultilayerImageOperation.cpp
+operations/COM_MultilayerImageOperation.h
 operations/COM_TextureOperation.cpp
 operations/COM_TextureOperation.h
 operations/COM_BokehImageOperation.cpp

Modified: branches/tile/source/blender/compositor/nodes/COM_ImageNode.cpp
===================================================================
--- branches/tile/source/blender/compositor/nodes/COM_ImageNode.cpp	2012-04-17 17:25:10 UTC (rev 45720)
+++ branches/tile/source/blender/compositor/nodes/COM_ImageNode.cpp	2012-04-17 17:48:45 UTC (rev 45721)
@@ -23,17 +23,51 @@
 #include "COM_ImageNode.h"
 #include "COM_ExecutionSystem.h"
 #include "COM_ImageOperation.h"
+#include "COM_MultilayerImageOperation.h"
+#include "BKE_node.h"
 
 ImageNode::ImageNode(bNode *editorNode): Node(editorNode) {
 }
 
+void ImageNode::doMultilayerCheck(ExecutionSystem *system, RenderLayer* rl, Image* image, ImageUser* user, int framenumber, int outputsocketIndex, int pass, DataType datatype) {
+	OutputSocket *outputSocket = this->getOutputSocket(outputsocketIndex);
+	if (outputSocket->isConnected()) {
+		MultilayerBaseOperation * operation = NULL;
+		switch (datatype) {
+		case COM_DT_VALUE:
+			operation = new MultilayerValueOperation(pass);
+			break;
+		case COM_DT_VECTOR:
+			operation = new MultilayerVectorOperation(pass);
+			break;
+		case COM_DT_COLOR:
+			operation = new MultilayerColorOperation(pass);
+			break;
+		}
+		operation->setImage(image);
+		operation->setRenderLayer(rl);
+		operation->setImageUser(user);
+		operation->setFramenumber(framenumber);
+		outputSocket->relinkConnections(operation->getOutputSocket());
+		system->addOperation(operation);
+	}
+}
+
 void ImageNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) {
 	/// Image output
     OutputSocket *outputImage = this->getOutputSocket(0);
     bNode *editorNode = this->getbNode();
     Image *image = (Image*)editorNode->id;
     ImageUser *imageuser = (ImageUser*)editorNode->storage;
+	int framenumber = context->getFramenumber();
 
+	/* first set the right frame number in iuser */
+	BKE_image_user_calc_frame(imageuser, framenumber, 0);
+	
+	/* force a load, we assume iuser index will be set OK anyway */
+	if(image && image->type==IMA_TYPE_MULTILAYER) {
+		BKE_image_get_ibuf(image, imageuser);
+	}
 
 	ImageOperation *operation = new ImageOperation();
 	if (outputImage->isConnected()) {
@@ -41,7 +75,7 @@
 	}
 	operation->setImage(image);
 	operation->setImageUser(imageuser);
-	operation->setFramenumber(context->getFramenumber());
+	operation->setFramenumber(framenumber);
 	graph->addOperation(operation);
 	addPreviewOperation(graph, operation->getOutputSocket(), 9);
 
@@ -50,9 +84,39 @@
 		ImageAlphaOperation *alphaOperation = new ImageAlphaOperation();
 		alphaOperation->setImage(image);
 		alphaOperation->setImageUser(imageuser);
-		alphaOperation->setFramenumber(context->getFramenumber());
+		alphaOperation->setFramenumber(framenumber);
 		alphaImage->relinkConnections(alphaOperation->getOutputSocket());
 		graph->addOperation(alphaOperation);
 	}
-	/// @todo: ImageZOperation
+	
+	if(image && image->type==IMA_TYPE_MULTILAYER && image->rr) {
+		RenderLayer *rl= (RenderLayer*)BLI_findlink(&image->rr->layers, imageuser->layer);
+		
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_Z, SCE_PASS_Z, COM_DT_VALUE);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_VEC, SCE_PASS_VECTOR, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_NORMAL, SCE_PASS_NORMAL, COM_DT_VECTOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_UV, SCE_PASS_UV, COM_DT_VECTOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_RGBA, SCE_PASS_RGBA, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_DIFF, SCE_PASS_DIFFUSE, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_SPEC, SCE_PASS_SPEC, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_SHADOW, SCE_PASS_SHADOW, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_AO, SCE_PASS_AO, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_REFLECT, SCE_PASS_REFLECT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_REFRACT, SCE_PASS_REFRACT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_INDIRECT, SCE_PASS_INDIRECT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_INDEXOB, SCE_PASS_INDEXOB, COM_DT_VALUE);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_INDEXMA, SCE_PASS_INDEXMA, COM_DT_VALUE);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_MIST, SCE_PASS_MIST, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_EMIT, SCE_PASS_EMIT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_ENV, SCE_PASS_ENVIRONMENT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_DIFF_DIRECT, SCE_PASS_DIFFUSE_DIRECT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_DIFF_INDIRECT, SCE_PASS_DIFFUSE_INDIRECT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_DIFF_COLOR, SCE_PASS_DIFFUSE_COLOR, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_GLOSSY_DIRECT, SCE_PASS_GLOSSY_DIRECT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_GLOSSY_INDIRECT, SCE_PASS_GLOSSY_INDIRECT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_GLOSSY_COLOR, SCE_PASS_GLOSSY_COLOR, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_TRANSM_DIRECT, SCE_PASS_TRANSM_DIRECT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_TRANSM_INDIRECT, SCE_PASS_TRANSM_INDIRECT, COM_DT_COLOR);
+		doMultilayerCheck(graph, rl, image, imageuser, framenumber, RRES_OUT_TRANSM_COLOR, SCE_PASS_TRANSM_COLOR, COM_DT_COLOR);
+	}
 }

Modified: branches/tile/source/blender/compositor/nodes/COM_ImageNode.h
===================================================================
--- branches/tile/source/blender/compositor/nodes/COM_ImageNode.h	2012-04-17 17:25:10 UTC (rev 45720)
+++ branches/tile/source/blender/compositor/nodes/COM_ImageNode.h	2012-04-17 17:48:45 UTC (rev 45721)
@@ -23,6 +23,9 @@
 #include "COM_Node.h"
 #include "DNA_node_types.h"
 #include "DNA_image_types.h"
+extern "C" {
+#include "RE_engine.h"
+}
 
 /**
   * @brief ImageNode
@@ -30,7 +33,8 @@
   */
 class ImageNode : public Node {
 
-
+private:
+	void doMultilayerCheck(ExecutionSystem *system, RenderLayer* rl, Image* image, ImageUser* user, int framenumber, int outputsocketIndex, int pass, DataType datatype);
 public:
     ImageNode(bNode* editorNode);
 	void convertToOperations(ExecutionSystem *graph, CompositorContext * context);

Modified: branches/tile/source/blender/compositor/operations/COM_ImageOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_ImageOperation.cpp	2012-04-17 17:25:10 UTC (rev 45720)
+++ branches/tile/source/blender/compositor/operations/COM_ImageOperation.cpp	2012-04-17 17:48:45 UTC (rev 45721)
@@ -44,6 +44,7 @@
     this->imagewidth = 0;
     this->imageheight = 0;
 	this->framenumber = 0;
+	this->numberOfChannels = 0;
 }
 ImageOperation::ImageOperation(): BaseImageOperation() {
     this->addOutputSocket(COM_DT_COLOR);
@@ -52,30 +53,30 @@
     this->addOutputSocket(COM_DT_VALUE);
 }
 
-static ImBuf *node_composit_get_image(Image *ima, ImageUser *iuser)
-{
-        ImBuf *ibuf;
+ImBuf* BaseImageOperation::getImBuf() {
+	ImBuf *ibuf;
+	
+	ibuf= BKE_image_get_ibuf(this->image, this->imageUser);
+	if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) {
+			return NULL;
+	}
+	
+	if (ibuf->rect_float == NULL) {
+			IMB_float_from_rect(ibuf);
+	}
+	return ibuf;
+}
 
-        ibuf= BKE_image_get_ibuf(ima, iuser);
-        if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) {
-                return NULL;
-        }
 
-        if (ibuf->rect_float == NULL) {
-                IMB_float_from_rect(ibuf);
-        }
-
-        return ibuf;
-}
-
 void BaseImageOperation::initExecution() {
 	BKE_image_user_calc_frame(this->imageUser, this->framenumber, 0);
-	ImBuf *stackbuf= node_composit_get_image(this->image, this->imageUser);
+	ImBuf *stackbuf= getImBuf();
 	this->buffer = stackbuf;
     if (stackbuf) {
         this->imageBuffer = stackbuf->rect_float;
         this->imagewidth = stackbuf->x;
         this->imageheight = stackbuf->y;
+		this->numberOfChannels = stackbuf->channels;
     }
 }
 
@@ -84,12 +85,12 @@
 }
 
 void BaseImageOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[]) {
-    BKE_image_user_calc_frame(this->imageUser, 0, 0);
-	ImBuf *stackbuf= node_composit_get_image(this->image, this->imageUser);
-    if (stackbuf) {
-        resolution[0] = stackbuf->x;
-        resolution[1] = stackbuf->y;
-    }
+	BKE_image_user_calc_frame(this->imageUser, 0, 0);
+	ImBuf *stackbuf= getImBuf();
+	if (stackbuf) {
+		resolution[0] = stackbuf->x;
+		resolution[1] = stackbuf->y;
+	}
 }
 
 void ImageOperation::executePixel(float *color, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[]) {

Modified: branches/tile/source/blender/compositor/operations/COM_ImageOperation.h
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_ImageOperation.h	2012-04-17 17:25:10 UTC (rev 45720)
+++ branches/tile/source/blender/compositor/operations/COM_ImageOperation.h	2012-04-17 17:48:45 UTC (rev 45721)
@@ -49,12 +49,15 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list