[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47315] trunk/blender/source/blender/ compositor: Optimize Gaussian blurs

Monique Dewanchand m.dewanchand at atmind.nl
Fri Jun 1 13:50:32 CEST 2012


Revision: 47315
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47315
Author:   mdewanchand
Date:     2012-06-01 11:50:32 +0000 (Fri, 01 Jun 2012)
Log Message:
-----------
Optimize Gaussian blurs

Modified Paths:
--------------
    trunk/blender/source/blender/compositor/nodes/COM_BlurNode.cpp
    trunk/blender/source/blender/compositor/operations/COM_BlurBaseOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_BlurBaseOperation.h
    trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h
    trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.h
    trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.h

Modified: trunk/blender/source/blender/compositor/nodes/COM_BlurNode.cpp
===================================================================
--- trunk/blender/source/blender/compositor/nodes/COM_BlurNode.cpp	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/nodes/COM_BlurNode.cpp	2012-06-01 11:50:32 UTC (rev 47315)
@@ -37,10 +37,11 @@
 {
 	bNode *editorNode = this->getbNode();
 	NodeBlurData * data = (NodeBlurData*)editorNode->storage;
-#if 0
+	InputSocket * inputSizeSocket = this->getInputSocket(1);
+	bool connectedSizeSocket = inputSizeSocket->isConnected();
+
 	const bNodeSocket *sock = this->getInputSocket(1)->getbNodeSocket();
 	const float size = ((const bNodeSocketValueFloat*)sock->default_value)->value;
-#endif
 	
 	CompositorQuality quality = context->getQuality();
 	
@@ -71,6 +72,11 @@
 		addLink(graph, operationx->getOutputSocket(), operationy->getInputSocket(0));
 		addLink(graph, operationx->getInputSocket(1)->getConnection()->getFromSocket(), operationy->getInputSocket(1));
 		addPreviewOperation(graph, operationy->getOutputSocket(), 5);
+
+		if (!connectedSizeSocket) {
+			operationx->setSize(size);
+			operationy->setSize(size);
+		}
 	}
 	else {
 		GaussianBokehBlurOperation *operation = new GaussianBokehBlurOperation();
@@ -81,5 +87,9 @@
 		graph->addOperation(operation);
 		this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket());
 		addPreviewOperation(graph, operation->getOutputSocket(), 5);
+
+		if (!connectedSizeSocket) {
+			operation->setSize(size);
+		}
 	}
 }

Modified: trunk/blender/source/blender/compositor/operations/COM_BlurBaseOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_BlurBaseOperation.cpp	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/operations/COM_BlurBaseOperation.cpp	2012-06-01 11:50:32 UTC (rev 47315)
@@ -37,6 +37,7 @@
 	this->data = NULL;
 	this->size = 1.0f;
 	this->deleteData = false;
+	this->sizeavailable=false;
 }
 void BlurBaseOperation::initExecution()
 {

Modified: trunk/blender/source/blender/compositor/operations/COM_BlurBaseOperation.h
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_BlurBaseOperation.h	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/operations/COM_BlurBaseOperation.h	2012-06-01 11:50:32 UTC (rev 47315)
@@ -39,6 +39,7 @@
 	float *make_gausstab(int rad);
 	float size;
 	bool deleteData;
+	bool sizeavailable;
 	void updateSize(MemoryBuffer **memoryBuffers);
 public:
 	/**
@@ -54,5 +55,7 @@
 	void setData(NodeBlurData *data) {this->data = data;}
 	
 	void deleteDataWhenFinished() {this->deleteData = true;}
+
+	void setSize(float size) {this->size = size; sizeavailable = true;}
 };
 #endif

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.cpp	2012-06-01 11:50:32 UTC (rev 47315)
@@ -34,11 +34,20 @@
 
 void *GaussianBokehBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
-	updateGauss(memoryBuffers);
+	if (!sizeavailable) {
+		updateGauss(memoryBuffers);
+	}
 	void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers);
 	return buffer;
 }
 
+void GaussianBokehBlurOperation::initExecution()
+{
+	if (this->sizeavailable) {
+		updateGauss(NULL);
+	}
+}
+
 void GaussianBokehBlurOperation::updateGauss(MemoryBuffer **memoryBuffers)
 {
 	if (this->gausstab == NULL) {
@@ -51,8 +60,9 @@
 		int j, i;
 		const float width = this->getWidth();
 		const float height = this->getHeight();
-		updateSize(memoryBuffers);
-		
+		if (!sizeavailable) {
+			updateSize(memoryBuffers);
+		}
 		radxf = size*(float)this->data->sizex;
 		if (radxf>width/2.0f)
 			radxf = width/2.0f;
@@ -163,20 +173,21 @@
 		return true;
 	}
 	else {
-		if (this->gausstab) {
+		if (this->sizeavailable && this->gausstab != NULL) {
+			newInput.xmin = 0;
+			newInput.ymin = 0;
+			newInput.xmax = this->getWidth();
+			newInput.ymax = this->getHeight();
+		}
+		else {
 			int addx = radx;
 			int addy = rady;
 			newInput.xmax = input->xmax + addx;
 			newInput.xmin = input->xmin - addx;
 			newInput.ymax = input->ymax + addy;
 			newInput.ymin = input->ymin - addy;
+
 		}
-		else {
-			newInput.xmin = 0;
-			newInput.ymin = 0;
-			newInput.xmax = this->getWidth();
-			newInput.ymax = this->getHeight();
-		}
 		return BlurBaseOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
 	}
 }

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianBokehBlurOperation.h	2012-06-01 11:50:32 UTC (rev 47315)
@@ -34,7 +34,7 @@
 
 public:
 	GaussianBokehBlurOperation();
-
+	void initExecution();
 	void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
 	/**
 	  * the inner loop of this program

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.cpp	2012-06-01 11:50:32 UTC (rev 47315)
@@ -36,11 +36,25 @@
 
 void *GaussianXBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
-	updateGauss(memoryBuffers);
+	if (!this->sizeavailable) {
+		updateGauss(memoryBuffers);
+	}
 	void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers);
 	return buffer;
 }
 
+void GaussianXBlurOperation::initExecution()
+{
+	if (this->sizeavailable) {
+		float rad = size*this->data->sizex;
+		if (rad<1)
+			rad = 1;
+
+		this->rad = rad;
+		this->gausstab = BlurBaseOperation::make_gausstab(rad);
+	}
+}
+
 void GaussianXBlurOperation::updateGauss(MemoryBuffer **memoryBuffers)
 {
 	if (this->gausstab == NULL) {
@@ -118,18 +132,18 @@
 		return true;
 	}
 	else {
-		if (this->gausstab == NULL) {
+		if (this->sizeavailable && this->gausstab != NULL) {
+			newInput.xmax = input->xmax + rad;
+			newInput.xmin = input->xmin - rad;
+			newInput.ymax = input->ymax;
+			newInput.ymin = input->ymin;
+		}
+		else {
 			newInput.xmax = this->getWidth();
 			newInput.xmin = 0;
 			newInput.ymax = this->getHeight();
 			newInput.ymin = 0;
 		}
-		else {
-			newInput.xmax = input->xmax + rad;
-			newInput.xmin = input->xmin - rad;
-			newInput.ymax = input->ymax;
-			newInput.ymin = input->ymin;
-		}
 		return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
 	}
 }

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.h
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.h	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianXBlurOperation.h	2012-06-01 11:50:32 UTC (rev 47315)
@@ -34,13 +34,18 @@
 	GaussianXBlurOperation();
 
 	/**
-	  * the inner loop of this program
+	  *@brief the inner loop of this program
 	  */
 	void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data);
 	
 	/**
-	  * Deinitialize the execution
+	  *@brief initialize the execution
 	  */
+	void initExecution();
+
+	/**
+	  *@brief Deinitialize the execution
+	  */
 	void deinitExecution();
 	
 	void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.cpp	2012-06-01 11:50:32 UTC (rev 47315)
@@ -35,11 +35,25 @@
 
 void *GaussianYBlurOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
-	updateGauss(memoryBuffers);
+	if (!this->sizeavailable) {
+		updateGauss(memoryBuffers);
+	}
 	void *buffer = getInputOperation(0)->initializeTileData(NULL, memoryBuffers);
 	return buffer;
 }
 
+void GaussianYBlurOperation::initExecution()
+{
+	if (this->sizeavailable) {
+		float rad = size*this->data->sizex;
+		if (rad<1)
+			rad = 1;
+
+		this->rad = rad;
+		this->gausstab = BlurBaseOperation::make_gausstab(rad);
+	}
+}
+
 void GaussianYBlurOperation::updateGauss(MemoryBuffer **memoryBuffers)
 {
 	if (this->gausstab == NULL) {
@@ -115,18 +129,18 @@
 		return true;
 	}
 	else {
-		if (this->gausstab == NULL) {
+		if (this->sizeavailable && this->gausstab != NULL) {
+			newInput.xmax = input->xmax;
+			newInput.xmin = input->xmin;
+			newInput.ymax = input->ymax + rad;
+			newInput.ymin = input->ymin - rad;
+		}
+		else {
 			newInput.xmax = this->getWidth();
 			newInput.xmin = 0;
 			newInput.ymax = this->getHeight();
 			newInput.ymin = 0;
 		}
-		else {
-			newInput.xmax = input->xmax;
-			newInput.xmin = input->xmin;
-			newInput.ymax = input->ymax + rad;
-			newInput.ymin = input->ymin - rad;
-		}
 		return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
 	}
 }

Modified: trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.h
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.h	2012-06-01 11:46:25 UTC (rev 47314)
+++ trunk/blender/source/blender/compositor/operations/COM_GaussianYBlurOperation.h	2012-06-01 11:50:32 UTC (rev 47315)
@@ -39,6 +39,11 @@
 	void executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data);
 	
 	/**
+	  *@brief initialize the execution
+	  */
+	void initExecution();
+
+	/**
 	  * Deinitialize the execution
 	  */
 	void deinitExecution();




More information about the Bf-blender-cvs mailing list