[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48194] trunk/blender/source/blender/ compositor: fix for [#31890] Lens Distortion inside Node group don't work

Jeroen Bakker j.bakker at atmind.nl
Fri Jun 22 16:43:34 CEST 2012


Revision: 48194
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48194
Author:   jbakker
Date:     2012-06-22 14:43:25 +0000 (Fri, 22 Jun 2012)
Log Message:
-----------
fix for [#31890] Lens Distortion inside Node group don't work

Modified Paths:
--------------
    trunk/blender/source/blender/compositor/nodes/COM_LensDistortionNode.cpp
    trunk/blender/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h
    trunk/blender/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h

Modified: trunk/blender/source/blender/compositor/nodes/COM_LensDistortionNode.cpp
===================================================================
--- trunk/blender/source/blender/compositor/nodes/COM_LensDistortionNode.cpp	2012-06-22 13:24:43 UTC (rev 48193)
+++ trunk/blender/source/blender/compositor/nodes/COM_LensDistortionNode.cpp	2012-06-22 14:43:25 UTC (rev 48194)
@@ -39,7 +39,7 @@
 		ProjectorLensDistortionOperation *operation = new ProjectorLensDistortionOperation();
 
 		this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph);
-		operation->setDispertion(this->getInputSocket(2)->getStaticValues()[0]);
+		this->getInputSocket(2)->relinkConnections(operation->getInputSocket(1), 2, graph);
 		this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0));
 
 		operation->setData(data);
@@ -50,8 +50,8 @@
 		ScreenLensDistortionOperation *operation = new ScreenLensDistortionOperation();
 
 		this->getInputSocket(0)->relinkConnections(operation->getInputSocket(0), 0, graph);
-		operation->setDistortion(this->getInputSocket(1)->getStaticValues()[0]);
-		operation->setDispertion(this->getInputSocket(2)->getStaticValues()[0]);
+		this->getInputSocket(1)->relinkConnections(operation->getInputSocket(1), 1, graph);
+		this->getInputSocket(2)->relinkConnections(operation->getInputSocket(2), 2, graph);
 		this->getOutputSocket(0)->relinkConnections(operation->getOutputSocket(0));
 
 		operation->setData(data);

Modified: trunk/blender/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp	2012-06-22 13:24:43 UTC (rev 48193)
+++ trunk/blender/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.cpp	2012-06-22 14:43:25 UTC (rev 48194)
@@ -27,19 +27,21 @@
 ProjectorLensDistortionOperation::ProjectorLensDistortionOperation() : NodeOperation()
 {
 	this->addInputSocket(COM_DT_COLOR);
+	this->addInputSocket(COM_DT_VALUE);
 	this->addOutputSocket(COM_DT_COLOR);
 	this->setComplex(true);
 	this->inputProgram = NULL;
+	this->dispersionAvailable = false;
+	this->dispersion = 0.0f;
 }
 void ProjectorLensDistortionOperation::initExecution()
 {
 	this->inputProgram = this->getInputSocketReader(0);
-	kr = 0.25f * MAX2(MIN2(this->dispersion, 1.f), 0.f);
-	kr2 = kr * 20;
 }
 
 void *ProjectorLensDistortionOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
+	updateDispersion(memoryBuffers);
 	void *buffer = inputProgram->initializeTileData(NULL, memoryBuffers);
 	return buffer;
 }
@@ -69,9 +71,28 @@
 bool ProjectorLensDistortionOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
 {
 	rcti newInput;
-	newInput.ymax = input->ymax;
-	newInput.ymin = input->ymin;
-	newInput.xmin = input->xmin - kr2 - 2;
-	newInput.xmax = input->xmax + kr2 + 2;
+	if (dispersionAvailable) {
+		newInput.ymax = input->ymax;
+		newInput.ymin = input->ymin;
+		newInput.xmin = input->xmin - kr2 - 2;
+		newInput.xmax = input->xmax + kr2 + 2;
+	} else {
+		newInput.xmin = 0;
+		newInput.ymin = input->ymin;
+		newInput.ymax = input->ymax;
+		newInput.xmax = inputProgram->getWidth();
+	}
 	return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
 }
+
+void ProjectorLensDistortionOperation::updateDispersion(MemoryBuffer **inputBuffers) 
+{
+	if (!dispersionAvailable) {
+		float result[4];
+		this->getInputSocketReader(1)->read(result, 0, 0, COM_PS_NEAREST, inputBuffers);
+		dispersion = result[0];
+		kr = 0.25f * MAX2(MIN2(this->dispersion, 1.f), 0.f);
+		kr2 = kr * 20;
+		dispersionAvailable = true;
+	}
+}

Modified: trunk/blender/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h	2012-06-22 13:24:43 UTC (rev 48193)
+++ trunk/blender/source/blender/compositor/operations/COM_ProjectorLensDistortionOperation.h	2012-06-22 14:43:25 UTC (rev 48194)
@@ -35,6 +35,8 @@
 	NodeLensDist *data;
 	
 	float dispersion;
+	bool dispersionAvailable;
+	
 	float kr, kr2;
 public:
 	ProjectorLensDistortionOperation();
@@ -56,9 +58,10 @@
 	void deinitExecution();
 	
 	void setData(NodeLensDist *data) { this->data = data; }
-	void setDispertion(float dispersion) { this->dispersion = dispersion; }
 	
 	bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
 
+	void updateDispersion(MemoryBuffer** inputBuffers);
+
 };
 #endif

Modified: trunk/blender/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp	2012-06-22 13:24:43 UTC (rev 48193)
+++ trunk/blender/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.cpp	2012-06-22 14:43:25 UTC (rev 48194)
@@ -30,34 +30,24 @@
 ScreenLensDistortionOperation::ScreenLensDistortionOperation() : NodeOperation()
 {
 	this->addInputSocket(COM_DT_COLOR);
+	this->addInputSocket(COM_DT_VALUE);
+	this->addInputSocket(COM_DT_VALUE);
 	this->addOutputSocket(COM_DT_COLOR);
 	this->setComplex(true);
 	this->inputProgram = NULL;
+	this->valuesAvailable = false;
+	this->dispersion = 0.0f;
+	this->distortion = 0.0f;
 }
 void ScreenLensDistortionOperation::initExecution()
 {
 	this->inputProgram = this->getInputSocketReader(0);
-	kg = MAX2(MIN2(this->distortion, 1.f), -0.999f);
-	// smaller dispersion range for somewhat more control
-	const float d = 0.25f * MAX2(MIN2(this->dispersion, 1.f), 0.f);
-	kr = MAX2(MIN2((kg + d), 1.f), -0.999f);
-	kb = MAX2(MIN2((kg - d), 1.f), -0.999f);
-	maxk = MAX3(kr, kg, kb);
-	sc = (this->data->fit && (maxk > 0.f)) ? (1.f / (1.f + 2.f * maxk)) : (1.f / (1.f + maxk));
-	drg = 4.f * (kg - kr);
-	dgb = 4.f * (kb - kg);
-
-	kr4 = kr * 4.f;
-	kg4 = kg * 4.f;
-	kb4 = kb * 4.f;
-	cx = 0.5f * (float)getWidth();
-	cy = 0.5f * (float)getHeight();
-
 }
 
 void *ScreenLensDistortionOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
 {
 	void *buffer = inputProgram->initializeTileData(NULL, memoryBuffers);
+	updateDispersionAndDistortion(memoryBuffers);
 	return buffer;
 }
 
@@ -171,3 +161,30 @@
 	newInput.xmax = inputProgram->getWidth();
 	return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
 }
+
+void ScreenLensDistortionOperation::updateDispersionAndDistortion(MemoryBuffer **inputBuffers)
+{
+	if (!valuesAvailable) {
+		float result[4];
+		this->getInputSocketReader(1)->read(result, 0, 0, COM_PS_NEAREST, inputBuffers);
+		this->distortion = result[0];
+		this->getInputSocketReader(2)->read(result, 0, 0, COM_PS_NEAREST, inputBuffers);
+		this->dispersion = result[0];
+		kg = MAX2(MIN2(this->distortion, 1.f), -0.999f);
+		// smaller dispersion range for somewhat more control
+		const float d = 0.25f * MAX2(MIN2(this->dispersion, 1.f), 0.f);
+		kr = MAX2(MIN2((kg + d), 1.f), -0.999f);
+		kb = MAX2(MIN2((kg - d), 1.f), -0.999f);
+		maxk = MAX3(kr, kg, kb);
+		sc = (this->data->fit && (maxk > 0.f)) ? (1.f / (1.f + 2.f * maxk)) : (1.f / (1.f + maxk));
+		drg = 4.f * (kg - kr);
+		dgb = 4.f * (kb - kg);
+	
+		kr4 = kr * 4.f;
+		kg4 = kg * 4.f;
+		kb4 = kb * 4.f;
+		cx = 0.5f * (float)getWidth();
+		cy = 0.5f * (float)getHeight();
+		valuesAvailable = true;
+	}
+}

Modified: trunk/blender/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h	2012-06-22 13:24:43 UTC (rev 48193)
+++ trunk/blender/source/blender/compositor/operations/COM_ScreenLensDistortionOperation.h	2012-06-22 14:43:25 UTC (rev 48194)
@@ -36,6 +36,7 @@
 	
 	float dispersion;
 	float distortion;
+	bool valuesAvailable;
 	float kr, kg, kb;
 	float kr4, kg4, kb4;
 	float maxk;
@@ -62,13 +63,12 @@
 	void deinitExecution();
 	
 	void setData(NodeLensDist *data) { this->data = data; }
-	void setDispertion(float dispersion) { this->dispersion = dispersion; }
-	void setDistortion(float distortion) { this->distortion = distortion; }
 	
 	bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
 
 private:
 	void determineUV(float *result, float x, float y) const;
+	void updateDispersionAndDistortion(MemoryBuffer** inputBuffers);
 
 };
 #endif




More information about the Bf-blender-cvs mailing list