[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21811] branches/soc-2009-chingachgook/ source/blender/collada/DocumentImporter.cpp: If <geometry> is instaciated through <controller>, it will be imported.

Chingiz Dyussenov chingiz.ds at gmail.com
Thu Jul 23 13:48:34 CEST 2009


Revision: 21811
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21811
Author:   chingachgook
Date:     2009-07-23 13:48:31 +0200 (Thu, 23 Jul 2009)

Log Message:
-----------
If <geometry> is instaciated through <controller>, it will be imported.

Modified Paths:
--------------
    branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-23 00:19:01 UTC (rev 21810)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-23 11:48:31 UTC (rev 21811)
@@ -21,6 +21,7 @@
 #include "COLLADAFWSampler.h"
 #include "COLLADAFWScale.h"
 #include "COLLADAFWSkinController.h"
+#include "COLLADAFWSkinControllerData.h"
 #include "COLLADAFWTransformation.h"
 #include "COLLADAFWTranslate.h"
 #include "COLLADAFWTypes.h"
@@ -41,7 +42,7 @@
 #include "BKE_fcurve.h"
 #include "BKE_depsgraph.h"
 }
-#include "DNA_lamp_types.h"
+#include "BKE_armature.h"
 #include "BKE_mesh.h"
 #include "BKE_global.h"
 #include "BKE_context.h"
@@ -53,6 +54,8 @@
 #include "BLI_listbase.h"
 #include "BLI_string.h"
 
+#include "DNA_lamp_types.h"
+#include "DNA_armature_types.h"
 #include "DNA_anim_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_texture_types.h"
@@ -138,6 +141,10 @@
 	std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
 	std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
 	std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
+	// maps for skinning
+	//std::map<COLLADAFW::UniqueId, bArmature*> uid_controller_map;
+	//std::map<COLLADAFW::UniqueId, Bone*> uid_joint_map;
+	std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> skinid_meshid_map;
 	// maps for assigning textures to uv layers
 	std::map<COLLADAFW::TextureMapId, char*> set_layername_map;
 	std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > index_mtex_map;
@@ -304,7 +311,7 @@
 	
 	// bind early created mesh to object, assign materials and textures
 	Object *create_mesh_object(Object *ob, Scene *sce, COLLADAFW::Node *node,
-							   COLLADAFW::InstanceGeometry *geom)
+							   COLLADAFW::InstanceGeometry *geom, bool isController)
 	{
 		ob = add_object(sce, OB_MESH);
 		
@@ -312,26 +319,37 @@
 		if (id.length())
 			rename_id(&ob->id, (char*)id.c_str());
 		
+		// replace ob->data freeing the old one
+		Mesh *old_mesh = (Mesh*)ob->data;
+
 		const COLLADAFW::UniqueId& geom_uid = geom->getInstanciatedObjectId();
-		if (uid_mesh_map.find(geom_uid) == uid_mesh_map.end()) {
-			// XXX report to user
-			// this could happen if a mesh was not created
-			// (e.g. if it contains unsupported geometry)
-			fprintf(stderr, "Couldn't find a mesh by UID.\n");
-			return NULL;
+		// checking if node instanciates controller or geometry
+		if (isController) {
+			if (skinid_meshid_map.find(geom_uid) == skinid_meshid_map.end()) {
+				fprintf(stderr, "Couldn't find a mesh UID by controller's UID.\n");
+				return NULL;
+			}
+			set_mesh(ob, uid_mesh_map[skinid_meshid_map[geom_uid]]);
 		}
-		// replace ob->data freeing the old one
-		Mesh *old_mesh = (Mesh*)ob->data;
-		set_mesh(ob, uid_mesh_map[geom_uid]);
+		else {
+			if (uid_mesh_map.find(geom_uid) == uid_mesh_map.end()) {
+				// XXX report to user
+				// this could happen if a mesh was not created
+				// (e.g. if it contains unsupported geometry)
+				fprintf(stderr, "Couldn't find a mesh by UID.\n");
+				return NULL;
+			}
+			set_mesh(ob, uid_mesh_map[geom_uid]);
+		}
+		
 		if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
 		
-		// assign materials to object
-		// assign material indices to mesh faces
 		Mesh *me = (Mesh*)ob->data;
 		MTex *mtex = NULL;
 		MTFace *tface = NULL;
 		char *layername = CustomData_get_layer_name(&me->fdata, CD_MTFACE, 0);
 		
+		// assign material indices to mesh faces
 		for (int k = 0; k < geom->getMaterialBindings().getCount(); k++) {
 			
 			const COLLADAFW::UniqueId& ma_uid = geom->getMaterialBindings()[k].getReferencedMaterial();
@@ -347,9 +365,7 @@
 			// bvi_array "bind_vertex_input array"
 			COLLADAFW::InstanceGeometry::TextureCoordinateBindingArray& bvi_array = 
 				geom->getMaterialBindings()[k].getTextureCoordinateBindingArray();
-			
 			for (l = 0; l < bvi_array.getCount(); l++) {
-				
 				COLLADAFW::TextureMapId tex_index = bvi_array[l].textureMapId;
 				size_t set_index = bvi_array[l].setIndex;
 				char *uvname = set_layername_map[set_index];
@@ -364,7 +380,6 @@
 				for (it = mtexes.begin(); it != mtexes.end(); it++) {
 					mtex = *it;
 					strcpy(mtex->uvname, uvname);
-					
 				}	
 			}
 			mtex = NULL;
@@ -427,12 +442,10 @@
 		Object *ob = NULL;
 		int k;
 		
-		// if node has <instance_geometries> - connect mesh with object
-		// XXX currently only one <instance_geometry> in a node is supported
+		// <instance_geometry>
 		if (geom.getCount() != 0) {
-			ob = create_mesh_object(ob, sce, node, geom[0]);
+			ob = create_mesh_object(ob, sce, node, geom[0], false);
 		}
-		// checking all other possible instances
 		// <instance_camera>
 		else if (camera.getCount() != 0) {
 			const COLLADAFW::UniqueId& cam_uid = camera[0]->getInstanciatedObjectId();
@@ -461,14 +474,23 @@
 			ob->data = la;
 			if (old_lamp->id.us == 0) free_libblock(&G.main->lamp, old_lamp);
 		}
+		// <instance_controller>
 		else if (controller.getCount() != 0) {
-			//ob = create_mesh_object(ob, sce, node, controller[0]);
-			return;
+			/*const COLLADAFW::UniqueId& geom_uid = controller[0]->getInstanciatedObjectId();
+			bArmature *arm = meshId_armature_map[geom_uid];
+			if (!arm) {
+				fprintf(stderr, "Cannot find armature by geometry uid. \n");
+				return;
+				}*/
+			COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[0];
+			ob = create_mesh_object(ob, sce, node, geom, true);
 		}
+		// XXX <node> - this is not supported yet
 		else if (inst_node.getCount() != 0) {
 			return;
 		}
-		// if node has no instances - create empty object
+		// if node is empty - create empty object
+		// XXX empty node may not mean it is empty object, not sure about this
 		else {
 			ob = add_object(sce, OB_EMPTY);
 		}
@@ -1068,9 +1090,11 @@
 	{
 		std::string name = camera->getOriginalId();
 		Camera *cam = (Camera*)add_camera((char*)name.c_str());
-		if (cam != NULL)
-			this->uid_camera_map[camera->getUniqueId()] = cam;
-		else fprintf(stderr, "Cannot create camera. \n");
+		if (!cam) {
+			fprintf(stderr, "Cannot create camera. \n");
+			return true;
+		}
+		this->uid_camera_map[camera->getUniqueId()] = cam;
 		// XXX import camera options
 		return true;
 	}
@@ -1081,10 +1105,11 @@
 	{
 	    const std::string& filepath = image->getImageURI().toNativePath();
 		Image *ima = BKE_add_image_file((char*)filepath.c_str(), 0);
-		if (ima == NULL)
+		if (!ima) {
 			fprintf(stderr, "Cannot create image. \n");
-		else
-			this->uid_image_map[image->getUniqueId()] = ima;
+			return true;
+		}
+		this->uid_image_map[image->getUniqueId()] = ima;
 		
 		return true;
 	}
@@ -1095,6 +1120,10 @@
 	{
 		std::string name = light->getOriginalId();
 		Lamp *lamp = (Lamp*)add_lamp((char*)name.c_str());
+		if (!lamp) {
+			fprintf(stderr, "Cannot create lamp. \n");
+			return true;
+		}
 		COLLADAFW::Light::LightType type = light->getLightType();
 		switch(type) {
 		case COLLADAFW::Light::AMBIENT_LIGHT:
@@ -1125,9 +1154,8 @@
 			break;
 		}
 			
-		if (lamp != NULL)
-			this->uid_lamp_map[light->getUniqueId()] = lamp;
-		else fprintf(stderr, "Cannot create lamp. \n");
+		this->uid_lamp_map[light->getUniqueId()] = lamp;
+		
 		// XXX import light options*/
 		return true;
 	}
@@ -1156,6 +1184,7 @@
 					  COLLADAFW::FloatOrDoubleArray outtan, size_t dim, float fps)
 	{
 		int i;
+		char *path = "location";
 		if (dim == 1) {
 			// create fcurve
 			FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
@@ -1163,7 +1192,7 @@
 				fprintf(stderr, "Cannot create fcurve. \n");
 				return;
 			}
-			char *path = "location";
+
 			fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
 			fcu->rna_path = BLI_strdupn(path, strlen(path));
 			fcu->array_index = 0;
@@ -1199,8 +1228,9 @@
 					fprintf(stderr, "Cannot create fcurve. \n");
 					continue;
 				}
+				
 				fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
-				fcu->rna_path = "location";
+				fcu->rna_path = BLI_strdupn(path, strlen(path));
 				fcu->array_index = 0;
 				fcu->totvert = curve->getKeyCount();
 				
@@ -1443,6 +1473,47 @@
 	virtual bool writeSkinControllerData( const COLLADAFW::SkinControllerData* skinControllerData ) 
 	{
 		// see COLLADAFW::validate for an example of how to use SkinControllerData
+		/* what should I do here?
+		   - create armature (should I create it here or somewhere else?)
+		   - create bones
+		   - create vertex group for each bone?
+		   - create MDeformVerts? - no, I don't know what mesh to modify
+		   is it possible to create MDeformVerts & vertex groups without assigning them to a mesh or object
+		   - set weights
+		   - map something(armature, vgoups, dverts) to skin controller uid, so I can use it in controller
+		 */
+		/*const std::string& skin_id = skinControllerData->getOriginalId();
+		size_t num_bones = skinControllerData->getJointsCount();
+		bArmature *arm = add_armature((char*)skin_id.c_str());
+		if (!arm) {
+			fprintf(stderr, "Cannot create armature. \n");
+			return true;
+		}
+		for (int i = 0; i < num_bones; i++) {
+			// create bone
+			//addEditBone(arm, "my_bone");
+			Bone *bone = (Bone*)MEM_callocN(sizeof(Bone), "Bone");
+			BLI_strncpy(bone->name, "bone", 32);
+			//unique_bone_name(arm, "my_bone");
+			BLI_addtail(&arm->bonebase, bone);
+			
+			bone->flag |= BONE_TIPSEL;
+			bone->weight= 1.0f;
+			bone->dist= 0.25f;
+			bone->xwidth= 0.1f;
+			bone->zwidth= 0.1f;
+			bone->ease1= 1.0f;
+			bone->ease2= 1.0f;
+			bone->rad_head= 0.10f;
+			bone->rad_tail= 0.05f;
+			bone->segments= 1;
+			bone->layer= arm->layer;
+			// TODO: add inverse bind matrices
+			i++;
+			}
+		
+		this->uid_controller_map[skinControllerData->getUniqueId()] = arm;
+		*/
 		return true;
 	}
 
@@ -1450,14 +1521,34 @@
 		@return The writer should return true, if writing succeeded, false otherwise.*/
 	virtual bool writeController( const COLLADAFW::Controller* controller ) 
 	{
+		const COLLADAFW::UniqueId& skin_id = controller->getUniqueId();
 		// if skin controller
 		if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_SKIN) {
-			return true;
+			
+			COLLADAFW::SkinController *skin = (COLLADAFW::SkinController*)controller;
+			const COLLADAFW::UniqueId& skin_data_id = skin->getSkinControllerData();
+			/*if (uid_controller_map.find(skin_id) == uid_controller_map.end()) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list