[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49744] branches/soc-2012-bratwurst/source /blender/collada: Morph controller geometries export.

Sukhitha Jayathilake pr.jayathilake at gmail.com
Thu Aug 9 22:36:22 CEST 2012


Revision: 49744
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49744
Author:   phabtar
Date:     2012-08-09 20:36:21 +0000 (Thu, 09 Aug 2012)
Log Message:
-----------
Morph controller geometries export. 
Export of mesh shape keys for Morph controller targets.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/collada/ArmatureExporter.cpp
    branches/soc-2012-bratwurst/source/blender/collada/GeometryExporter.cpp
    branches/soc-2012-bratwurst/source/blender/collada/GeometryExporter.h

Modified: branches/soc-2012-bratwurst/source/blender/collada/ArmatureExporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/collada/ArmatureExporter.cpp	2012-08-09 19:59:36 UTC (rev 49743)
+++ branches/soc-2012-bratwurst/source/blender/collada/ArmatureExporter.cpp	2012-08-09 20:36:21 UTC (rev 49744)
@@ -110,7 +110,7 @@
 	for (bone = (Bone *)arm->bonebase.first; bone; bone = bone->next) {
 		write_bone_URLs(ins, ob_arm, bone);
 	}
-
+    
 	InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob, this->export_settings->active_uv_only);
 		
 	ins.add();

Modified: branches/soc-2012-bratwurst/source/blender/collada/GeometryExporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/collada/GeometryExporter.cpp	2012-08-09 19:59:36 UTC (rev 49743)
+++ branches/soc-2012-bratwurst/source/blender/collada/GeometryExporter.cpp	2012-08-09 20:36:21 UTC (rev 49744)
@@ -68,9 +68,8 @@
 }
 
 void GeometryExporter::operator()(Object *ob)
-{
+{ 
 	// XXX don't use DerivedMesh, Mesh instead?
-
 #if 0		
 	DerivedMesh *dm = mesh_get_derived_final(mScene, ob, CD_MASK_BAREMESH);
 #endif
@@ -155,14 +154,88 @@
 	{
 		BKE_libblock_free_us(&(G.main->mesh), me);
 	}
-
-
+    
+    //shape keys
+	Key * key = ob_get_key(ob);
+	if(key){
+		KeyBlock * kb;
+		for (kb = (KeyBlock*)key->block.first; kb; kb = kb->next) {
+			//have to skip the basis mesh
+			key_to_mesh(kb, me);
+			export_key_mesh(ob, me, kb);
+		}
+	}
 #if 0
 	dm->release(dm);
 #endif
 }
 
+void GeometryExporter::export_key_mesh(Object *ob, Mesh *me, KeyBlock *kb){
+	std::string geom_id = get_geometry_id(ob, 0) + "_morph_" + kb->name;
+	std::vector<Normal> nor;
+	std::vector<Face> norind;
+	
+	if (exportedGeometry.find(geom_id) != exportedGeometry.end())
+	{
+		return;
+	}
 
+	std::string geom_name =  id_name(ob) + "_morph_" + kb->name;
+
+	exportedGeometry.insert(geom_id);
+
+	bool has_color = (bool)CustomData_has_layer(&me->fdata, CD_MCOL);
+
+	create_normals(nor, norind, me);
+
+	// openMesh(geoId, geoName, meshId)
+	openMesh(geom_id, geom_name);
+	
+	// writes <source> for vertex coords
+	createVertsSource(geom_id, me);
+	
+	// writes <source> for normal coords
+	createNormalsSource(geom_id, me, nor);
+
+	bool has_uvs = (bool)CustomData_has_layer(&me->fdata, CD_MTFACE);
+	
+	// writes <source> for uv coords if mesh has uv coords
+	if (has_uvs)
+		createTexcoordsSource(geom_id, me);
+
+	if (has_color)
+		createVertexColorSource(geom_id, me);
+
+	// <vertices>
+
+	COLLADASW::Vertices verts(mSW);
+	verts.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX));
+	COLLADASW::InputList &input_list = verts.getInputList();
+	COLLADASW::Input input(COLLADASW::InputSemantic::POSITION, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::POSITION));
+	input_list.push_back(input);
+	verts.add();
+
+	createLooseEdgeList(ob, me, geom_id, norind);
+
+	// XXX slow		
+	if (ob->totcol) {
+		for (int a = 0; a < ob->totcol; a++) {
+			createPolylist(a, has_uvs, has_color, ob, me, geom_id, norind);
+		}
+	}
+	else {
+		createPolylist(0, has_uvs, has_color, ob, me, geom_id, norind);
+	}
+	
+	closeMesh();
+	
+	if (me->flag & ME_TWOSIDED) {
+		mSW->appendTextBlock("<extra><technique profile=\"MAYA\"><double_sided>1</double_sided></technique></extra>");
+	}
+
+	closeGeometry();
+}
+
 void GeometryExporter::createLooseEdgeList(Object *ob,
                                            Mesh   *me,
                                            std::string& geom_id,

Modified: branches/soc-2012-bratwurst/source/blender/collada/GeometryExporter.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/collada/GeometryExporter.h	2012-08-09 19:59:36 UTC (rev 49743)
+++ branches/soc-2012-bratwurst/source/blender/collada/GeometryExporter.h	2012-08-09 20:36:21 UTC (rev 49744)
@@ -39,9 +39,12 @@
 #include "DNA_mesh_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_key_types.h"
 
 #include "ExportSettings.h"
 
+#include "BKE_key.h"
+
 extern Object *bc_get_highest_selected_ancestor_or_self(Object *ob);
 
 // TODO: optimize UV sets by making indexed list with duplicates removed
@@ -100,6 +103,8 @@
 	COLLADASW::URI getUrlBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix = "");
 
 	COLLADASW::URI makeUrl(std::string id);
+
+	void export_key_mesh(Object *ob, Mesh *me, KeyBlock *kb);
 	
 	/* int getTriCount(MFace *faces, int totface);*/
 private:




More information about the Bf-blender-cvs mailing list