[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43712] branches/tile/source/blender/ compositor: Displacement Node Simple version - Tile

Dalai Felinto dfelinto at gmail.com
Thu Jan 26 09:37:56 CET 2012


Revision: 43712
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43712
Author:   dfelinto
Date:     2012-01-26 08:37:43 +0000 (Thu, 26 Jan 2012)
Log Message:
-----------
Displacement Node Simple version - Tile

Modified Paths:
--------------
    branches/tile/source/blender/compositor/CMakeLists.txt
    branches/tile/source/blender/compositor/nodes/COM_DisplaceNode.cpp

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

Modified: branches/tile/source/blender/compositor/CMakeLists.txt
===================================================================
--- branches/tile/source/blender/compositor/CMakeLists.txt	2012-01-26 08:12:12 UTC (rev 43711)
+++ branches/tile/source/blender/compositor/CMakeLists.txt	2012-01-26 08:37:43 UTC (rev 43712)
@@ -482,6 +482,8 @@
 		operations/COM_MapUVOperation.cpp
 		operations/COM_DisplaceOperation.h
 		operations/COM_DisplaceOperation.cpp
+		operations/COM_DisplaceSimpleOperation.h
+		operations/COM_DisplaceSimpleOperation.cpp
 		operations/COM_FlipOperation.h
 		operations/COM_FlipOperation.cpp
 		operations/COM_ProjectorLensDistortionOperation.cpp

Modified: branches/tile/source/blender/compositor/nodes/COM_DisplaceNode.cpp
===================================================================
--- branches/tile/source/blender/compositor/nodes/COM_DisplaceNode.cpp	2012-01-26 08:12:12 UTC (rev 43711)
+++ branches/tile/source/blender/compositor/nodes/COM_DisplaceNode.cpp	2012-01-26 08:37:43 UTC (rev 43712)
@@ -21,13 +21,19 @@
 
 #include "COM_DisplaceNode.h"
 #include "COM_DisplaceOperation.h"
+#include "COM_DisplaceSimpleOperation.h"
 #include "COM_ExecutionSystem.h"
 
 DisplaceNode::DisplaceNode(bNode *editorNode): Node(editorNode) {
 }
 
-void DisplaceNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context) {
-	DisplaceOperation *operation = new DisplaceOperation();
+void DisplaceNode::convertToOperations(ExecutionSystem *graph, CompositorContext * context)
+{
+	NodeOperation *operation;
+	if (context->getQuality() == COM_QUALITY_HIGH)
+		operation = new DisplaceOperation();
+	else
+		operation = new DisplaceSimpleOperation();
 
 	this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), true, 0, graph);
 	this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), true, 1, graph);

Added: branches/tile/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp	                        (rev 0)
+++ branches/tile/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp	2012-01-26 08:37:43 UTC (rev 43712)
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ *		Dalai Felinto
+ */
+
+#include "COM_DisplaceSimpleOperation.h"
+#include "BLI_math.h"
+
+DisplaceSimpleOperation::DisplaceSimpleOperation(): NodeOperation() {
+	this->addInputSocket(COM_DT_COLOR);
+	this->addInputSocket(COM_DT_VECTOR);
+	this->addInputSocket(COM_DT_VALUE);
+	this->addInputSocket(COM_DT_VALUE);
+	this->addOutputSocket(COM_DT_COLOR);
+
+	this->inputColorProgram = NULL;
+	this->inputVectorProgram = NULL;
+	this->inputScaleXProgram = NULL;
+	this->inputScaleYProgram = NULL;
+}
+
+void DisplaceSimpleOperation::initExecution() {
+	this->inputColorProgram = this->getInputSocketReader(0);
+	this->inputVectorProgram = this->getInputSocketReader(1);
+	this->inputScaleXProgram = this->getInputSocketReader(2);
+	this->inputScaleYProgram = this->getInputSocketReader(3);
+
+	width_x4 = this->width * 4;
+	height_x4 = this->height * 4;
+}
+
+
+/* minimum distance (in pixels) a pixel has to be displaced
+ * in order to take effect */
+#define DISPLACE_EPSILON	0.01f
+
+void DisplaceSimpleOperation::executePixel(float* color, float x, float y, MemoryBuffer *inputBuffers[])
+{
+	float inVector[4];
+	float inScale[4];
+
+	float p_dx, p_dy;	/* main displacement in pixel space */
+	float u, v;
+
+	this->inputScaleXProgram->read(inScale, x, y, inputBuffers);
+	float xs = inScale[0];
+	this->inputScaleYProgram->read(inScale, x, y, inputBuffers);
+	float ys = inScale[0];
+
+	/* clamp x and y displacement to triple image resolution - 
+	 * to prevent hangs from huge values mistakenly plugged in eg. z buffers */
+	xs = min(width_x4, max(-width_x4, xs));
+	ys = min(height_x4, max(-height_x4, ys));
+
+	this->inputVectorProgram->read(inVector, x, y, inputBuffers);
+	p_dx = inVector[0] * xs;
+	p_dy = inVector[1] * ys;
+
+	/* if no displacement, then just copy this pixel */
+	if (fabsf(p_dx) < DISPLACE_EPSILON && fabsf(p_dy) < DISPLACE_EPSILON) {
+		this->inputColorProgram->read(color, x, y, inputBuffers);
+		return;
+	}
+
+	/* displaced pixel in uv coords, for image sampling */
+	u = x - p_dx + 0.5f;
+	v = y - p_dy + 0.5f;
+
+	this->inputColorProgram->read(color, u, v, inputBuffers);
+}
+
+void DisplaceSimpleOperation::deinitExecution() {
+	this->inputColorProgram = NULL;
+	this->inputVectorProgram = NULL;
+	this->inputScaleXProgram = NULL;
+	this->inputScaleYProgram = NULL;
+}
+
+bool DisplaceSimpleOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) {
+	rcti colorInput;
+	NodeOperation *operation=NULL;
+
+	/* the vector buffer only needs a 2x2 buffer. The image needs whole buffer */
+	/* image */
+	operation = getInputOperation(0);
+	colorInput.xmax = operation->getWidth();
+	colorInput.xmin = 0;
+	colorInput.ymax = operation->getHeight();
+	colorInput.ymin = 0;
+	if (operation->determineDependingAreaOfInterest(&colorInput, readOperation, output)) {
+		return true;
+	}
+
+	/* vector */
+	if (operation->determineDependingAreaOfInterest(input, readOperation, output)) {
+		return true;
+	}
+
+	/* scale x */
+	operation = getInputOperation(2);
+	if (operation->determineDependingAreaOfInterest(input, readOperation, output) ) {
+		return true;
+	}
+
+	/* scale y */
+	operation = getInputOperation(3);
+	if (operation->determineDependingAreaOfInterest(input, readOperation, output) ) {
+		return true;
+	}
+
+	return false;
+}
+


Property changes on: branches/tile/source/blender/compositor/operations/COM_DisplaceSimpleOperation.cpp
___________________________________________________________________
Added: svn:eol
   + native

Added: branches/tile/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h	                        (rev 0)
+++ branches/tile/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h	2012-01-26 08:37:43 UTC (rev 43712)
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2012, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ *		Dalai Felinto
+ */
+
+#ifndef _COM_DisplaceSimpleOperation_h
+#define _COM_DisplaceSimpleOperation_h
+#include "COM_NodeOperation.h"
+
+
+class DisplaceSimpleOperation : public NodeOperation {
+private:
+	/**
+	 * Cached reference to the inputProgram
+	 */
+	SocketReader* inputColorProgram;
+	SocketReader* inputVectorProgram;
+	SocketReader* inputScaleXProgram;
+	SocketReader* inputScaleYProgram;
+
+	float width_x4;
+	float height_x4;
+
+public:
+	DisplaceSimpleOperation();
+
+	/**
+	* we need a full buffer for the image
+	*/	
+	bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
+
+	/**
+	 * the inner loop of this program
+	 */
+	void executePixel(float* color, float x, float y, MemoryBuffer *inputBuffers[]);
+	
+	/**
+	 * Initialize the execution
+	 */
+	void initExecution();
+	
+	/**
+	 * Deinitialize the execution
+	 */
+	void deinitExecution();
+};
+#endif


Property changes on: branches/tile/source/blender/compositor/operations/COM_DisplaceSimpleOperation.h
___________________________________________________________________
Added: svn:eol
   + native



More information about the Bf-blender-cvs mailing list