[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48456] branches/soc-2012-bratwurst/source /blender/collada: Armature Import Fix.
Sukhitha Jayathilake
pr.jayathilake at gmail.com
Sat Jun 30 21:15:23 CEST 2012
Revision: 48456
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48456
Author: phabtar
Date: 2012-06-30 19:15:18 +0000 (Sat, 30 Jun 2012)
Log Message:
-----------
Armature Import Fix.
Modified Paths:
--------------
branches/soc-2012-bratwurst/source/blender/collada/ArmatureExporter.cpp
branches/soc-2012-bratwurst/source/blender/collada/ArmatureImporter.cpp
branches/soc-2012-bratwurst/source/blender/collada/DocumentImporter.cpp
branches/soc-2012-bratwurst/source/blender/collada/DocumentImporter.h
branches/soc-2012-bratwurst/source/blender/collada/TransformWriter.cpp
Modified: branches/soc-2012-bratwurst/source/blender/collada/ArmatureExporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/collada/ArmatureExporter.cpp 2012-06-30 18:24:28 UTC (rev 48455)
+++ branches/soc-2012-bratwurst/source/blender/collada/ArmatureExporter.cpp 2012-06-30 19:15:18 UTC (rev 48456)
@@ -187,58 +187,59 @@
node.setNodeName(node_name);
node.setNodeSid(node_sid);
-#if 0
+//#if 1
if (bone->childbase.first == NULL || BLI_countlist(&(bone->childbase)) >= 2) {
add_blender_leaf_bone( bone, ob_arm , node );
}
- else {
-#endif
- node.start();
+ else{
+//#endif
+ node.start();
- add_bone_transform(ob_arm, bone, node);
+ add_bone_transform(ob_arm, bone, node);
- // Write nodes of childobjects, remove written objects from list
- std::list<Object *>::iterator i = child_objects.begin();
+ // Write nodes of childobjects, remove written objects from list
+ std::list<Object *>::iterator i = child_objects.begin();
- while (i != child_objects.end()) {
- if ((*i)->partype == PARBONE && (0 == strcmp((*i)->parsubstr, bone->name))) {
- float backup_parinv[4][4];
- copy_m4_m4(backup_parinv, (*i)->parentinv);
+ while (i != child_objects.end()) {
+ if ((*i)->partype == PARBONE && (0 == strcmp((*i)->parsubstr, bone->name))) {
+ float backup_parinv[4][4];
+ copy_m4_m4(backup_parinv, (*i)->parentinv);
- // crude, temporary change to parentinv
- // so transform gets exported correctly.
+ // crude, temporary change to parentinv
+ // so transform gets exported correctly.
- // Add bone tail- translation... don't know why
- // bone parenting is against the tail of a bone
- // and not it's head, seems arbitrary.
- (*i)->parentinv[3][1] += bone->length;
+ // Add bone tail- translation... don't know why
+ // bone parenting is against the tail of a bone
+ // and not it's head, seems arbitrary.
+ (*i)->parentinv[3][1] += bone->length;
- // SECOND_LIFE_COMPATIBILITY
- // TODO: when such objects are animated as
- // single matrix the tweak must be applied
- // to the result.
- if (export_settings->second_life) {
- // tweak objects parentinverse to match compatibility
- float temp[4][4];
+ // SECOND_LIFE_COMPATIBILITY
+ // TODO: when such objects are animated as
+ // single matrix the tweak must be applied
+ // to the result.
+ if (export_settings->second_life) {
+ // tweak objects parentinverse to match compatibility
+ float temp[4][4];
- copy_m4_m4(temp, bone->arm_mat);
- temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
+ copy_m4_m4(temp, bone->arm_mat);
+ temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
- mult_m4_m4m4((*i)->parentinv, temp, (*i)->parentinv);
- }
+ mult_m4_m4m4((*i)->parentinv, temp, (*i)->parentinv);
+ }
- se->writeNodes(*i, sce);
+ se->writeNodes(*i, sce);
- copy_m4_m4((*i)->parentinv, backup_parinv);
- child_objects.erase(i++);
+ copy_m4_m4((*i)->parentinv, backup_parinv);
+ child_objects.erase(i++);
+ }
+ else i++;
}
- else i++;
- }
- for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
- add_bone_node(child, ob_arm, sce, se, child_objects);
+ for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
+ add_bone_node(child, ob_arm, sce, se, child_objects);
+ }
+ node.end();
}
- node.end();
}
else {
for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
@@ -247,7 +248,7 @@
}
}
-#if 0
+//#if 1
void ArmatureExporter::add_blender_leaf_bone(Bone *bone, Object *ob_arm, COLLADASW::Node& node)
{
node.start();
@@ -258,13 +259,13 @@
node.addExtraTechniqueParameter("blender", "tip_y", bone->tail[1]);
node.addExtraTechniqueParameter("blender", "tip_z", bone->tail[2]);
- for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
+ /*for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
add_bone_node(child, ob_arm, sce, se, child_objects);
- }
+ }*/
node.end();
}
-#endif
+//#endif
void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node)
{
@@ -273,7 +274,7 @@
float mat[4][4];
if (bone->parent) {
- // get bone-space matrix from armature-space
+ // get bone-space matrix from parent pose
bPoseChannel *parchan = BKE_pose_channel_find_name(ob_arm->pose, bone->parent->name);
float invpar[4][4];
@@ -281,6 +282,7 @@
mult_m4_m4m4(mat, invpar, pchan->pose_mat);
}
else {
+ //pose mat is object space
copy_m4_m4(mat, pchan->pose_mat);
// Why? Joint's localspace is still it's parent node
//get world-space from armature-space
@@ -288,7 +290,7 @@
}
// SECOND_LIFE_COMPATIBILITY
- if (export_settings->second_life) {
+// if (export_settings->second_life) {
// Remove rotations vs armature from transform
// parent_rest_rot * mat * irest_rot
float temp[4][4];
@@ -304,7 +306,7 @@
mult_m4_m4m4(mat, temp, mat);
}
- }
+// }
TransformWriter::add_node_transform(node, mat, NULL);
}
Modified: branches/soc-2012-bratwurst/source/blender/collada/ArmatureImporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/collada/ArmatureImporter.cpp 2012-06-30 18:24:28 UTC (rev 48455)
+++ branches/soc-2012-bratwurst/source/blender/collada/ArmatureImporter.cpp 2012-06-30 19:15:18 UTC (rev 48456)
@@ -101,12 +101,12 @@
// get world-space
if (parent) {
mult_m4_m4m4(mat, parent_mat, obmat);
-
}
else {
copy_m4_m4(mat, obmat);
+ }
- }
+ mult_m4_m4m4(mat, ob_arm->obmat , mat);
float loc[3], size[3], rot[3][3];
mat4_to_loc_rot_size(loc, rot, size, obmat);
mat3_to_vec_roll(rot, NULL, &angle);
Modified: branches/soc-2012-bratwurst/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/collada/DocumentImporter.cpp 2012-06-30 18:24:28 UTC (rev 48455)
+++ branches/soc-2012-bratwurst/source/blender/collada/DocumentImporter.cpp 2012-06-30 19:15:18 UTC (rev 48456)
@@ -421,19 +421,10 @@
bool read_transform = true;
ExtraTags *et = getExtraTags(node->getUniqueId());
-
-
std::vector<Object *> *objects_done = new std::vector<Object *>();
if (is_joint) {
- if (par) {
- Object *empty = par;
- par = bc_add_object(sce, OB_ARMATURE, NULL);
- bc_set_parent(par, empty->parent, mContext);
- //remove empty : todo
- object_map.insert(std::make_pair<COLLADAFW::UniqueId, Object *>(parent_node->getUniqueId(), par));
- }
armature_importer.add_joint(node, parent_node == NULL || parent_node->getType() != COLLADAFW::Node::JOINT, par, sce);
}
else {
@@ -496,7 +487,11 @@
// if node is empty - create empty object
// XXX empty node may not mean it is empty object, not sure about this
if ( (geom_done + camera_done + lamp_done + controller_done + inst_done) < 1) {
- ob = bc_add_object(sce, OB_EMPTY, NULL);
+ //Check if Object is armature, by checking if immediate child is a JOINT node.
+ if(is_armature(node))
+ ob = bc_add_object(sce, OB_ARMATURE, NULL);
+ else ob = bc_add_object(sce, OB_EMPTY, NULL);
+
objects_done->push_back(ob);
}
@@ -1192,3 +1187,14 @@
return true;
}
+bool DocumentImporter::is_armature(COLLADAFW::Node *node){
+ COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes();
+ for (unsigned int i = 0; i < child_nodes.getCount(); i++) {
+ if(child_nodes[i]->getType() == COLLADAFW::Node::JOINT) return true;
+ else continue;
+ }
+
+ //no child is JOINT
+ return false;
+
+}
Modified: branches/soc-2012-bratwurst/source/blender/collada/DocumentImporter.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/collada/DocumentImporter.h 2012-06-30 18:24:28 UTC (rev 48455)
+++ branches/soc-2012-bratwurst/source/blender/collada/DocumentImporter.h 2012-06-30 19:15:18 UTC (rev 48456)
@@ -130,8 +130,10 @@
/** Get an extisting ExtraTags for uid */
ExtraTags* getExtraTags(const COLLADAFW::UniqueId &uid);
+ bool is_armature(COLLADAFW::Node * node);
+
private:
/** Current import stage we're in. */
Modified: branches/soc-2012-bratwurst/source/blender/collada/TransformWriter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/collada/TransformWriter.cpp 2012-06-30 18:24:28 UTC (rev 48455)
+++ branches/soc-2012-bratwurst/source/blender/collada/TransformWriter.cpp 2012-06-30 19:15:18 UTC (rev 48456)
@@ -126,7 +126,6 @@
void TransformWriter::add_transform(COLLADASW::Node& node, float loc[3], float rot[3], float scale[3])
{
- node.addTranslate("location", loc[0], loc[1], loc[2]);
#if 0
node.addRotateZ("rotationZ", COLLADABU::Math::Utils::radToDegF(rot[2]));
node.addRotateY("rotationY", COLLADABU::Math::Utils::radToDegF(rot[1]));
@@ -135,6 +134,7 @@
node.addRotateZ("rotationZ", RAD2DEGF(rot[2]));
node.addRotateY("rotationY", RAD2DEGF(rot[1]));
node.addRotateX("rotationX", RAD2DEGF(rot[0]));
+ node.addScale("scale", scale[0], scale[1], scale[2]);
+ node.addTranslate("location", loc[0], loc[1], loc[2]);
- node.addScale("scale", scale[0], scale[1], scale[2]);
}
More information about the Bf-blender-cvs
mailing list