[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35897] trunk/blender/source/blender/ collada: COLLADA lights:

Nathan Letwory nathan at letworyinteractive.com
Wed Mar 30 12:51:02 CEST 2011


Revision: 35897
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35897
Author:   jesterking
Date:     2011-03-30 10:51:01 +0000 (Wed, 30 Mar 2011)
Log Message:
-----------
COLLADA lights:

* simplify export and import, now that we have blender profiles for lights. The vanilla import is now more in line with the specs. If a blender profile is found, skip normal import, use the profile data instead.
* multiply energy into color rgb export (common profile).
* recalc distance taking metrics in account

Modified Paths:
--------------
    trunk/blender/source/blender/collada/DocumentImporter.cpp
    trunk/blender/source/blender/collada/ExtraTags.cpp
    trunk/blender/source/blender/collada/ExtraTags.h
    trunk/blender/source/blender/collada/LightExporter.cpp

Modified: trunk/blender/source/blender/collada/DocumentImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.cpp	2011-03-30 10:29:32 UTC (rev 35896)
+++ trunk/blender/source/blender/collada/DocumentImporter.cpp	2011-03-30 10:51:01 UTC (rev 35897)
@@ -863,109 +863,35 @@
 {
 	if(mImportStage!=General)
 		return true;
-		
+
 	Lamp *lamp = NULL;
 	std::string la_id, la_name;
-	
+
 	TagsMap::iterator etit;
 	ExtraTags *et = 0;
 	etit = uid_tags_map.find(light->getUniqueId().toAscii());
 	if(etit != uid_tags_map.end())
 		et = etit->second;
-	
+
 	la_id = light->getOriginalId();
 	la_name = light->getName();
 	if (la_name.size()) lamp = (Lamp*)add_lamp((char*)la_name.c_str());
 	else lamp = (Lamp*)add_lamp((char*)la_id.c_str());
-	
+
 	if (!lamp) {
 		fprintf(stderr, "Cannot create lamp. \n");
 		return true;
 	}
-	if (light->getColor().isValid()) {
-		COLLADAFW::Color col = light->getColor();
-		lamp->r = col.getRed();
-		lamp->g = col.getGreen();
-		lamp->b = col.getBlue();
-	}
-	float constatt = light->getConstantAttenuation().getValue();
-	float linatt = light->getLinearAttenuation().getValue();
-	float quadatt = light->getQuadraticAttenuation().getValue();
-	float d = 25.0f;
-	float att1 = 0.0f;
-	float att2 = 0.0f;
-	
-	float e = 1.0f/constatt;
-	
-	/* NOTE: We assume for now that inv square is used for quadratic light
-	 * and inv linear for linear light. Exported blender lin/quad weighted
-	 * most likely will result in wrong import. */
-	/* quadratic light */
-	if(IS_EQ(linatt, 0.0f) && quadatt > 0.0f) {
-		//quadatt = att2/(d*d*(e*2));
-		float invquadatt = 1.0f/quadatt;
-		float d2 = invquadatt / (2 * e);
-		d = sqrtf(d2);
-	}
-	// linear light
-	else if(IS_EQ(quadatt, 0.0f) && linatt > 0.0f) {
-		//linatt = att1/(d*e);
-		float invlinatt = 1.0f/linatt;
-		d = invlinatt / e;
-	} else {
-		printf("no linear nor quad light, using defaults for attenuation, import will be incorrect: Lamp %s\n", lamp->id.name);
-		att2 = 1.0f;
-	}
-	
-	lamp->dist = d;
-	lamp->energy = e;
-	
-	COLLADAFW::Light::LightType type = light->getLightType();
-	switch(type) {
-	case COLLADAFW::Light::AMBIENT_LIGHT:
-		{
-			lamp->type = LA_HEMI;
-		}
-		break;
-	case COLLADAFW::Light::SPOT_LIGHT:
-		{
-			lamp->type = LA_SPOT;
-			lamp->falloff_type = LA_FALLOFF_INVSQUARE;
-			lamp->att1 = att1;
-			lamp->att2 = att2;
-			lamp->spotsize = light->getFallOffAngle().getValue();
-			lamp->spotblend = light->getFallOffExponent().getValue();
-		}
-		break;
-	case COLLADAFW::Light::DIRECTIONAL_LIGHT:
-		{
-			/* our sun is very strong, so pick a smaller energy level */
-			lamp->type = LA_SUN;
-			lamp->energy = 1.0;
-			lamp->mode |= LA_NO_SPEC;
-		}
-		break;
-	case COLLADAFW::Light::POINT_LIGHT:
-		{
-			lamp->type = LA_LOCAL;
-			lamp->falloff_type = LA_FALLOFF_INVSQUARE;
-			lamp->att1 = att1;
-			lamp->att2 = att2;
-		}
-		break;
-	case COLLADAFW::Light::UNDEFINED:
-		{
-			fprintf(stderr, "Current lamp type is not supported. \n");
-			lamp->type = LA_LOCAL;
-		}
-		break;
-	}
-	
-	if(et) {
+
+	// if we find an ExtraTags for this, use that instead.
+	if(et && et->isProfile("blender")) {
 		et->setData("type", &(lamp->type));
 		et->setData("flag", &(lamp->flag));
 		et->setData("mode", &(lamp->mode));
 		et->setData("gamma", &(lamp->k));
+		et->setData("red", &(lamp->r));
+		et->setData("green", &(lamp->g));
+		et->setData("blue", &(lamp->b));
 		et->setData("shadow_r", &(lamp->shdwr));
 		et->setData("shadow_g", &(lamp->shdwg));
 		et->setData("shadow_b", &(lamp->shdwb));
@@ -1015,7 +941,83 @@
 		et->setData("sky_exposure", &(lamp->sky_exposure));
 		et->setData("sky_colorspace", &(lamp->sky_colorspace));
 	}
+	else {
+		float constatt = light->getConstantAttenuation().getValue();
+		float linatt = light->getLinearAttenuation().getValue();
+		float quadatt = light->getQuadraticAttenuation().getValue();
+		float d = 25.0f;
+		float att1 = 0.0f;
+		float att2 = 0.0f;
+		float e = 1.0f;
+
+		if (light->getColor().isValid()) {
+			COLLADAFW::Color col = light->getColor();
+			lamp->r = col.getRed();
+			lamp->g = col.getGreen();
+			lamp->b = col.getBlue();
+		}
+
+		if(IS_EQ(linatt, 0.0f) && quadatt > 0.0f) {
+			att2 = quadatt;
+			d = (1.0f/quadatt) * 2;
+		}
+		// linear light
+		else if(IS_EQ(quadatt, 0.0f) && linatt > 0.0f) {
+			att1 = linatt;
+			d = (1.0f/linatt) * 2;
+		} else if (IS_EQ(constatt, 1.0f)) {
+			att1 = 1.0f;
+		} else {
+			// assuming point light (const att = 1.0);
+			att1 = 1.0f;
+		}
 		
+		d *= ( 1.0f / unit_converter.getLinearMeter());
+
+		lamp->energy = e;
+		lamp->dist = d;
+
+		COLLADAFW::Light::LightType type = light->getLightType();
+		switch(type) {
+			case COLLADAFW::Light::AMBIENT_LIGHT:
+				{
+					lamp->type = LA_HEMI;
+				}
+				break;
+			case COLLADAFW::Light::SPOT_LIGHT:
+				{
+					lamp->type = LA_SPOT;
+					lamp->falloff_type = LA_FALLOFF_INVSQUARE;
+					lamp->att1 = att1;
+					lamp->att2 = att2;
+					lamp->spotsize = light->getFallOffAngle().getValue();
+					lamp->spotblend = light->getFallOffExponent().getValue();
+				}
+				break;
+			case COLLADAFW::Light::DIRECTIONAL_LIGHT:
+				{
+					/* our sun is very strong, so pick a smaller energy level */
+					lamp->type = LA_SUN;
+					lamp->mode |= LA_NO_SPEC;
+				}
+				break;
+			case COLLADAFW::Light::POINT_LIGHT:
+				{
+					lamp->type = LA_LOCAL;
+					lamp->falloff_type = LA_FALLOFF_INVSQUARE;
+					lamp->att1 = att1;
+					lamp->att2 = att2;
+				}
+				break;
+			case COLLADAFW::Light::UNDEFINED:
+				{
+					fprintf(stderr, "Current lamp type is not supported. \n");
+					lamp->type = LA_LOCAL;
+				}
+				break;
+		}
+	}
+
 	this->uid_lamp_map[light->getUniqueId()] = lamp;
 	return true;
 }

Modified: trunk/blender/source/blender/collada/ExtraTags.cpp
===================================================================
--- trunk/blender/source/blender/collada/ExtraTags.cpp	2011-03-30 10:29:32 UTC (rev 35896)
+++ trunk/blender/source/blender/collada/ExtraTags.cpp	2011-03-30 10:51:01 UTC (rev 35897)
@@ -44,6 +44,11 @@
 {
 }
 
+bool ExtraTags::isProfile( std::string profile)
+{
+	return this->profile == profile;
+}
+
 bool ExtraTags::addTag( std::string tag,  std::string data)
 {
 	tags[tag] = data;

Modified: trunk/blender/source/blender/collada/ExtraTags.h
===================================================================
--- trunk/blender/source/blender/collada/ExtraTags.h	2011-03-30 10:29:32 UTC (rev 35896)
+++ trunk/blender/source/blender/collada/ExtraTags.h	2011-03-30 10:51:01 UTC (rev 35897)
@@ -56,6 +56,9 @@
 	/** Set given char pointer to value of tag, if it exists. */
 	void setData(std::string tag, char *data);
 	
+	/** Return true if the extra tags is for specified profile. */
+	bool isProfile(std::string profile);
+	
 private:
 	/** Disable default copy constructor. */
 	ExtraTags( const ExtraTags& pre );

Modified: trunk/blender/source/blender/collada/LightExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/LightExporter.cpp	2011-03-30 10:29:32 UTC (rev 35896)
+++ trunk/blender/source/blender/collada/LightExporter.cpp	2011-03-30 10:51:01 UTC (rev 35897)
@@ -66,34 +66,24 @@
 	Lamp *la = (Lamp*)ob->data;
 	std::string la_id(get_light_id(ob));
 	std::string la_name(id_name(la));
-	COLLADASW::Color col(la->r, la->g, la->b);
-	float att1, att2;
+	COLLADASW::Color col(la->r * la->energy, la->g * la->energy, la->b * la->energy);
 	float e, d, constatt, linatt, quadatt;
-	att1 = att2 = 0.0f;
+	float r;
 	
+	d = la->dist;
+	r = d/2.0f;
+	
+	constatt = 1.0f;
+	
 	if(la->falloff_type==LA_FALLOFF_INVLINEAR) {
-		att1 = 1.0f;
-		att2 = 0.0f;
+		linatt = 1.0f / r;
+		quadatt = 0.0f;
 	}
-	else if(la->falloff_type==LA_FALLOFF_INVSQUARE) {
-		att1 = 0.0f;
-		att2 = 1.0f;
+	else {
+		linatt = 0.0f;
+		quadatt = 1.0f / r;
 	}
-	else if(la->falloff_type==LA_FALLOFF_SLIDERS) {
-		att1 = la->att1;
-		att2 = la->att2;
-	}
 	
-	e = la->energy;
-	d = la->dist;
-	
-	constatt = linatt = quadatt = MAXFLOAT;
-	if(e > 0.0f) {
-		constatt = 1.0f/e;
-		linatt = att1/(d*e);
-		quadatt = att2/(d*d*(e*2));
-	}
-	
 	// sun
 	if (la->type == LA_SUN) {
 		COLLADASW::DirectionalLight cla(mSW, la_id, la_name, e);
@@ -152,6 +142,9 @@
 	cla.addExtraTechniqueParameter("blender", "flag", la->flag);
 	cla.addExtraTechniqueParameter("blender", "mode", la->mode);
 	cla.addExtraTechniqueParameter("blender", "gamma", la->k);
+	cla.addExtraTechniqueParameter("blender", "red", la->r);
+	cla.addExtraTechniqueParameter("blender", "green", la->g);
+	cla.addExtraTechniqueParameter("blender", "blue", la->b);
 	cla.addExtraTechniqueParameter("blender", "shadow_r", la->shdwr);
 	cla.addExtraTechniqueParameter("blender", "shadow_g", la->shdwg);
 	cla.addExtraTechniqueParameter("blender", "shadow_b", la->shdwb);



More information about the Bf-blender-cvs mailing list