diff --git a/code/ColladaExporter.cpp b/code/ColladaExporter.cpp
index 7f9540aa1..8c5b03e77 100644
--- a/code/ColladaExporter.cpp
+++ b/code/ColladaExporter.cpp
@@ -133,6 +133,7 @@ void ColladaExporter::WriteFile()
WriteLightsLibrary();
WriteMaterials();
WriteGeometryLibrary();
+ WriteControllerLibrary();
WriteSceneLibrary();
@@ -787,6 +788,85 @@ void ColladaExporter::WriteMaterials()
}
}
+// ------------------------------------------------------------------------------------------------
+// Writes the controller library
+void ColladaExporter::WriteControllerLibrary()
+{
+ mOutput << startstr << "" << endstr;
+ PushTag();
+
+ for( size_t a = 0; a < mScene->mNumMeshes; ++a)
+ WriteController( a);
+
+ PopTag();
+ mOutput << startstr << "" << endstr;
+}
+
+// ------------------------------------------------------------------------------------------------
+// Writes a skin controller of the given mesh
+void WriteController( size_t pIndex)
+{
+ const aiMesh* mesh = mScene->mMeshes[pIndex];
+ const std::string idstr = GetMeshId( pIndex);
+ const std::string idstrEscaped = XMLEscape(idstr);
+
+ if ( mesh->mNumFaces == 0 || mesh->mNumVertices == 0 )
+ return;
+
+ if ( mesh->mNumBones == 0 )
+ return;
+
+ mOutput << startstr << ""<< endstr;
+ PushTag();
+
+ mOutput << startstr << "" << endstr;
+ PushTag();
+
+ // bind pose matrix
+ mOutput << startstr << "" << endstr;
+ PushTag();
+
+ // I think it is identity in general cases.
+ aiMatrix4x4 mat();
+ mOutput << startstr;
+ mOutput << mat.a1 << " " << mat.a2 << " " << mat.a3 << " " << mat.a4;
+ mOutput << mat.b1 << " " << mat.b2 << " " << mat.b3 << " " << mat.b4;
+ mOutput << mat.c1 << " " << mat.c2 << " " << mat.c3 << " " << mat.c4;
+ mOutput << mat.d1 << " " << mat.d2 << " " << mat.d3 << " " << mat.d4;
+ mOutput << endstr;
+
+ PopTag();
+ mOutput << startstr << "" << endstr;
+
+ mOutput << startstr << "mNumBones << "\">";
+
+ for( size_t i = 0; i < mesh->mNumBones; ++i )
+ mOutput << XMLEscape(mesh->mBones[i].mName) << " ";
+
+ mOutput << "" << endstr;
+
+ mOutput << startstr << "" << endstr;
+ PushTag();
+
+ mOutput << startstr << "mNumBones << "\" stride=\"" << 1 << "\">";
+ PushTag();
+
+ mOutput << startstr << "param name=\"JOINT\" type=\"Name\">" << endstr;
+
+ PopTag();
+ mOutput << "" << endstr;
+
+ PopTag();
+ mOutput << startstr << "" << endstr;
+
+ PopTag();
+ mOutput << startstr << "" << endstr;
+
+ PopTag();
+ mOutput << startstr << "" << endstr;
+}
+
// ------------------------------------------------------------------------------------------------
// Writes the geometry library
void ColladaExporter::WriteGeometryLibrary()
diff --git a/code/ColladaExporter.h b/code/ColladaExporter.h
index e8bd9b71f..9521e61ad 100644
--- a/code/ColladaExporter.h
+++ b/code/ColladaExporter.h
@@ -101,6 +101,12 @@ protected:
void WriteSpotLight(const aiLight *const light);
void WriteAmbienttLight(const aiLight *const light);
+ /// Writes the controller library
+ void WriteControllerLibrary();
+
+ /// Writes a skin controller of the given mesh
+ void WriteController( size_t pIndex);
+
/// Writes the geometry library
void WriteGeometryLibrary();