[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