diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-02-06 02:13:10 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-02-06 02:13:10 +0400 |
commit | 3937ec7d11996438c2c6bd65d1d88f72431b1d52 (patch) | |
tree | e0a2104d51f1a44de88047a0e9d17d8492b343b1 /source/blender/collada | |
parent | 11d5a2d2eba127e2f8502e570addb08c22cbb9c1 (diff) | |
parent | 8f3170a17c270dd8a02f9b3bf2a971a65cab67ae (diff) |
svn merge ^/trunk/blender -r43887:43918
Diffstat (limited to 'source/blender/collada')
-rw-r--r-- | source/blender/collada/AnimationExporter.cpp | 21 | ||||
-rw-r--r-- | source/blender/collada/AnimationExporter.h | 5 | ||||
-rw-r--r-- | source/blender/collada/ArmatureExporter.cpp | 54 | ||||
-rw-r--r-- | source/blender/collada/DocumentExporter.cpp | 2 | ||||
-rw-r--r-- | source/blender/collada/ExportSettings.h | 1 | ||||
-rw-r--r-- | source/blender/collada/TransformWriter.cpp | 22 | ||||
-rw-r--r-- | source/blender/collada/collada.cpp | 3 | ||||
-rw-r--r-- | source/blender/collada/collada.h | 2 |
8 files changed, 99 insertions, 11 deletions
diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index 7b57ed243a1..c2d8c356aae 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -773,6 +773,27 @@ std::string AnimationExporter::create_4x4_source(std::vector<float> &frames , Ob copy_m4_m4(mat, pchan->pose_mat); UnitConverter converter; + // SECOND_LIFE_COMPATIBILITY + // AFAIK animation to second life is via BVH, but no + // reason to not have the collada-animation be correct + if(export_settings->second_life) + { + float temp[4][4]; + copy_m4_m4(temp, bone->arm_mat); + temp[3][0] = temp[3][1] = temp[3][2] = 0.0f; + invert_m4(temp); + + mult_m4_m4m4(mat, mat, temp); + + if(bone->parent) + { + copy_m4_m4(temp, bone->parent->arm_mat); + temp[3][0] = temp[3][1] = temp[3][2] = 0.0f; + + mult_m4_m4m4(mat, temp, mat); + } + } + float outmat[4][4]; converter.mat4_to_dae(outmat,mat); diff --git a/source/blender/collada/AnimationExporter.h b/source/blender/collada/AnimationExporter.h index c3a5c7a5383..ba7ec6859cc 100644 --- a/source/blender/collada/AnimationExporter.h +++ b/source/blender/collada/AnimationExporter.h @@ -83,7 +83,9 @@ private: public: - AnimationExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryAnimations(sw) { this->sw = sw; } + AnimationExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): + COLLADASW::LibraryAnimations(sw), export_settings(export_settings) + { this->sw = sw; } void exportAnimations(Scene *sce); @@ -92,6 +94,7 @@ public: void operator() (Object *ob); protected: + const ExportSettings *export_settings; void dae_animation(Object* ob, FCurve *fcu, char* transformName , bool is_param, Material *ma = NULL); diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index fcfc197ce80..0e89f2db74b 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -221,8 +221,31 @@ void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW: mult_m4_m4m4(mat, invpar, pchan->pose_mat); } else { - // get world-space from armature-space - mult_m4_m4m4(mat, ob_arm->obmat, pchan->pose_mat); + copy_m4_m4(mat, pchan->pose_mat); + // Why? Joint's localspace is still it's parent node + //get world-space from armature-space + //mult_m4_m4m4(mat, ob_arm->obmat, pchan->pose_mat); + } + + // SECOND_LIFE_COMPATIBILITY + if(export_settings->second_life) + { + // Remove rotations vs armature from transform + // parent_rest_rot * mat * irest_rot + float temp[4][4]; + copy_m4_m4(temp, bone->arm_mat); + temp[3][0] = temp[3][1] = temp[3][2] = 0.0f; + invert_m4(temp); + + mult_m4_m4m4(mat, mat, temp); + + if(bone->parent) + { + copy_m4_m4(temp, bone->parent->arm_mat); + temp[3][0] = temp[3][1] = temp[3][2] = 0.0f; + + mult_m4_m4m4(mat, temp, mat); + } } TransformWriter::add_node_transform(node, mat,NULL ); @@ -341,10 +364,16 @@ std::string ArmatureExporter::add_inv_bind_mats_source(Object *ob_arm, ListBase { std::string source_id = controller_id + BIND_POSES_SOURCE_ID_SUFFIX; + int totjoint = 0; + for (bDeformGroup *def = (bDeformGroup*)defbase->first; def; def = def->next) { + if (is_bone_defgroup(ob_arm, def)) + totjoint++; + } + COLLADASW::FloatSourceF source(mSW); source.setId(source_id); source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(BLI_countlist(defbase)); + source.setAccessorCount(totjoint); //BLI_countlist(defbase)); source.setAccessorStride(16); source.setParameterTypeName(&COLLADASW::CSWC::CSW_VALUE_TYPE_FLOAT4x4); @@ -366,16 +395,27 @@ std::string ArmatureExporter::add_inv_bind_mats_source(Object *ob_arm, ListBase for (bDeformGroup *def = (bDeformGroup*)defbase->first; def; def = def->next) { if (is_bone_defgroup(ob_arm, def)) { - bPoseChannel *pchan = get_pose_channel(pose, def->name); float mat[4][4]; float world[4][4]; float inv_bind_mat[4][4]; - // make world-space matrix, arm_mat is armature-space - mult_m4_m4m4(world, ob_arm->obmat, pchan->bone->arm_mat); - + // SECOND_LIFE_COMPATIBILITY + if(export_settings->second_life) + { + // Only translations, no rotation vs armature + float temp[4][4]; + unit_m4(temp); + copy_v3_v3(temp[3], pchan->bone->arm_mat[3]); + mult_m4_m4m4(world, ob_arm->obmat, temp); + } + else + { + // make world-space matrix, arm_mat is armature-space + mult_m4_m4m4(world, ob_arm->obmat, pchan->bone->arm_mat); + } + invert_m4_m4(mat, world); converter.mat4_to_dae(inv_bind_mat, mat); diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp index 6e8abc08358..6e04a1773bb 100644 --- a/source/blender/collada/DocumentExporter.cpp +++ b/source/blender/collada/DocumentExporter.cpp @@ -257,7 +257,7 @@ void DocumentExporter::exportCurrentScene(Scene *sce) } // <library_animations> - AnimationExporter ae(&sw); + AnimationExporter ae(&sw, this->export_settings); ae.exportAnimations(sce); // <library_controllers> diff --git a/source/blender/collada/ExportSettings.h b/source/blender/collada/ExportSettings.h index 1ad7c8c370e..80e20acbe48 100644 --- a/source/blender/collada/ExportSettings.h +++ b/source/blender/collada/ExportSettings.h @@ -31,6 +31,7 @@ struct ExportSettings { public: bool selected; + bool second_life; char *filepath; }; diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp index 379a0619040..a2bca6733e1 100644 --- a/source/blender/collada/TransformWriter.cpp +++ b/source/blender/collada/TransformWriter.cpp @@ -59,6 +59,7 @@ void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[][4], void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob) { + /* float rot[3], loc[3], scale[3]; if (ob->parent) { @@ -91,6 +92,27 @@ void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob) } add_transform(node, loc, rot, scale); + */ + + /* Using parentinv should allow use of existing curves */ + // If parentinv is identity don't add it. + bool add_parinv = false; + for(int i = 0; i < 16; ++i) + { + float f = (i%4 == i/4) ? 1.0f : 0.0f ; + if(ob->parentinv[i%4][i/4] != f) add_parinv = true; + } + + // Eat this 3ds Max et friends + if(add_parinv) + { + double dmat[4][4]; + UnitConverter converter; + converter.mat4_to_dae_double(dmat, ob->parentinv); + node.addMatrix("parentinverse", dmat); + } + + add_transform(node, ob->loc, ob->rot, ob->size); } void TransformWriter::add_node_transform_identity(COLLADASW::Node& node) diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp index 0731faceeed..39114f6543b 100644 --- a/source/blender/collada/collada.cpp +++ b/source/blender/collada/collada.cpp @@ -49,11 +49,12 @@ extern "C" return 0; } - int collada_export(Scene *sce, const char *filepath, int selected) + int collada_export(Scene *sce, const char *filepath, int selected, int second_life) { ExportSettings export_settings; export_settings.selected = selected != 0; + export_settings.second_life = second_life != 0; export_settings.filepath = (char *)filepath; /* annoying, collada crashes if file cant be created! [#27162] */ diff --git a/source/blender/collada/collada.h b/source/blender/collada/collada.h index b86f37b7af6..161977368db 100644 --- a/source/blender/collada/collada.h +++ b/source/blender/collada/collada.h @@ -37,7 +37,7 @@ extern "C" { * both return 1 on success, 0 on error */ int collada_import(bContext *C, const char *filepath); - int collada_export(Scene *sce, const char *filepath, int selected); + int collada_export(Scene *sce, const char *filepath, int selected, int second_life); #ifdef __cplusplus } #endif |