From 012854ae9323aadc4b0345c9ebd3260a636dd85b Mon Sep 17 00:00:00 2001
From: Alfredo de Greef <eeshlo@yahoo.com>
Date: Wed, 11 Aug 2004 23:32:13 +0000
Subject: [PATCH] Fixed bug discovered by dotblend, parented empty's were
 mistakenly included in the duplicate objects list. Added support for
 spherelight 'dummy' mode when used with global photonmap. It now behaves the
 same as arealight when used with gpm.

---
 .../intern/convertBlenderScene.c              |  6 ++---
 source/blender/yafray/intern/export_File.cpp  | 23 +++++++++++------
 .../blender/yafray/intern/export_Plugin.cpp   | 25 ++++++++++++-------
 3 files changed, 34 insertions(+), 20 deletions(-)

diff --git a/source/blender/renderconverter/intern/convertBlenderScene.c b/source/blender/renderconverter/intern/convertBlenderScene.c
index 01a0f24dde21..ac988e850e54 100644
--- a/source/blender/renderconverter/intern/convertBlenderScene.c
+++ b/source/blender/renderconverter/intern/convertBlenderScene.c
@@ -2966,14 +2966,14 @@ void RE_rotateBlenderScene(void)
 					   yafray only needs to know about one, the rest can be instanciated.
 					   The dupliMtx list is used for this purpose */
 					if (R.r.renderer==R_YAFRAY) {
-						/* Special case, parent object dupli's: ignore lattices */
+						/* Special case, parent object dupli's: ignore lattices & empty's */
 						if (ob->parent) {
-							if ((ob->parent->type!=OB_LATTICE) && (YAF_objectKnownData(ob)))
+							if ((ob->parent->type!=OB_EMPTY) && (ob->parent->type!=OB_LATTICE) && YAF_objectKnownData(ob))
 								printf("From parent: Added dupli matrix for linked data object %s\n", ob->id.name);
 							else
 								init_render_object(ob);
 						}
-						else if ((ob->type!=OB_EMPTY) && (ob->type!=OB_LAMP) && (YAF_objectKnownData(ob)))
+						else if ((ob->type!=OB_EMPTY) && (ob->type!=OB_LAMP) && YAF_objectKnownData(ob))
 							printf("Added dupli matrix for linked data object %s\n", ob->id.name);
 						else
 							init_render_object(ob);
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp
index 61d15bff0c9a..22f8f1f042af 100755
--- a/source/blender/yafray/intern/export_File.cpp
+++ b/source/blender/yafray/intern/export_File.cpp
@@ -1052,11 +1052,10 @@ void yafrayFileRender_t::writeAreaLamp(LampRen* lamp, int num, float iview[4][4]
 	// if no GI used, the GIphotons flag can still be set, so only use when 'full' selected
 	if ((R.r.GImethod==2) && (R.r.GIphotons)) { md="on";  power*=R.r.GIpower; }
 	ostr << "<light type=\"arealight\" name=\"LAMP" << num+1 << "\" dummy=\""<< md << "\" power=\"" << power << "\" ";
-	if (!R.r.GIphotons) {
-		int psm=0, sm = lamp->ray_totsamp;
-		if (sm>=25) psm = sm/5;
-		ostr << "samples=\"" << sm << "\" psamples=\"" << psm << "\" ";
-	}
+	// samples not used for GI with photons, can still be exported, is ignored
+	int psm=0, sm = lamp->ray_totsamp;
+	if (sm>=25) psm = sm/5;
+	ostr << "samples=\"" << sm << "\" psamples=\"" << psm << "\" ";
 	ostr << ">\n";
 	
 	// transform area lamp coords back to world
@@ -1138,7 +1137,15 @@ void yafrayFileRender_t::writeLamps()
 				//decay = 1;
 			}
 		}
-		ostr << "\" power=\"" << pwr << "\"";
+
+		if (is_sphereL) {
+			// 'dummy' mode for spherelight when used with gpm
+			string md = "off";
+			// if no GI used, the GIphotons flag can still be set, so only use when 'full' selected
+			if ((R.r.GImethod==2) && (R.r.GIphotons)) { md="on";  pwr*=R.r.GIpower; }
+			ostr << "\" power=\"" <<  pwr << "\" dummy=\"" << md << "\"";
+		}
+		else ostr << "\" power=\"" << pwr << "\"";
 		
 		// cast_shadows flag not used with softlight, spherelight or photonlight
 		if ((!is_softL) && (!is_sphereL) && (lamp->type!=LA_YF_PHOTON)) {
@@ -1297,7 +1304,7 @@ void yafrayFileRender_t::writeHemilight()
 void yafrayFileRender_t::writePathlight()
 {
 	ostr.str("");
-	if(R.r.GIphotons)
+	if (R.r.GIphotons)
 	{
 		ostr << "<light type=\"globalphotonlight\" name=\"gpm\" photons=\""<<R.r.GIphotoncount<<"\""<<endl;
 		ostr << "\tradius=\"" <<R.r.GIphotonradius << "\" depth=\""<< ((R.r.GIdepth>2) ? (R.r.GIdepth-1) : 1)
@@ -1305,7 +1312,7 @@ void yafrayFileRender_t::writePathlight()
 		ostr << "</light>"<<endl;
 	}
 	ostr << "<light type=\"pathlight\" name=\"path_LT\" power=\"1.0\" ";
-	ostr << " depth=\"" <<((R.r.GIphotons) ? 1 : R.r.GIdepth)<< "\" caus_depth=\"" << R.r.GIcausdepth <<"\"\n";
+	ostr << " depth=\"" << ((R.r.GIphotons) ? 1 : R.r.GIdepth) << "\" caus_depth=\"" << R.r.GIcausdepth <<"\"\n";
 	if(R.r.GIdirect && R.r.GIphotons) ostr << "direct=\"on\"" << endl;
 	if (R.r.GIcache && ! (R.r.GIdirect && R.r.GIphotons))
 	{
diff --git a/source/blender/yafray/intern/export_Plugin.cpp b/source/blender/yafray/intern/export_Plugin.cpp
index 63f447c3768a..a3d1624820b4 100644
--- a/source/blender/yafray/intern/export_Plugin.cpp
+++ b/source/blender/yafray/intern/export_Plugin.cpp
@@ -1058,13 +1058,11 @@ void yafrayPluginRender_t::writeAreaLamp(LampRen* lamp, int num, float iview[4][
 	params["name"]=yafray::parameter_t(temp);
 	params["dummy"]=yafray::parameter_t(md);
 	params["power"]=yafray::parameter_t(power);
-	if (!R.r.GIphotons) 
-	{
-		int psm=0, sm = lamp->ray_totsamp;
-		if (sm>=25) psm = sm/5;
-		params["samples"]=yafray::parameter_t(sm);
-		params["psamples"]=yafray::parameter_t(psm);
-	}
+	// samples not used for GI with photons, can still be exported, is ignored
+	int psm=0, sm = lamp->ray_totsamp;
+	if (sm>=25) psm = sm/5;
+	params["samples"]=yafray::parameter_t(sm);
+	params["psamples"]=yafray::parameter_t(psm);
 	
 	// transform area lamp coords back to world
 	float lpco[4][3];
@@ -1147,7 +1145,16 @@ void yafrayPluginRender_t::writeLamps()
 				//decay = 1;
 			}
 		}
-		params["power"] = yafray::parameter_t(pwr);
+
+		if (is_sphereL) {
+			// 'dummy' mode for spherelight when used with gpm
+			string md = "off";
+			// if no GI used, the GIphotons flag can still be set, so only use when 'full' selected
+			if ((R.r.GImethod==2) && (R.r.GIphotons)) { md="on";  pwr*=R.r.GIpower; }
+			params["power"] = yafray::parameter_t(pwr);
+			params["dummy"] = yafray::parameter_t(md);
+		}
+		else params["power"] = yafray::parameter_t(pwr);
 		
 		// cast_shadows flag not used with softlight, spherelight or photonlight
 		if ((!is_softL) && (!is_sphereL) && (lamp->type!=LA_YF_PHOTON)) {
@@ -1299,7 +1306,7 @@ void yafrayPluginRender_t::writeHemilight()
 
 void yafrayPluginRender_t::writePathlight()
 {
-	if(R.r.GIphotons)
+	if (R.r.GIphotons)
 	{
 		yafray::paramMap_t params;
 		params["type"]=yafray::parameter_t("globalphotonlight");
-- 
GitLab