[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21602] branches/soc-2009-chingachgook/ source/blender/collada: COLLADA importer: base for object transform animation.
Arystanbek Dyussenov
arystan.d at gmail.com
Wed Jul 15 20:59:49 CEST 2009
Revision: 21602
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21602
Author: kazanbas
Date: 2009-07-15 20:59:49 +0200 (Wed, 15 Jul 2009)
Log Message:
-----------
COLLADA importer: base for object transform animation.
Fix a crash reported by Gary Richie: check NULL materials.
Modified Paths:
--------------
branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-07-15 17:44:25 UTC (rev 21601)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-07-15 18:59:49 UTC (rev 21602)
@@ -186,6 +186,8 @@
Material *ma = give_current_material(ob, a+1);
+ if (!ma) continue;
+
if (find(mMat.begin(), mMat.end(), id_name(ma)) == mMat.end()) {
(*this->f)(ma, ob);
Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp 2009-07-15 17:44:25 UTC (rev 21601)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp 2009-07-15 18:59:49 UTC (rev 21602)
@@ -9,19 +9,21 @@
#include "COLLADAFWLight.h"
#include "COLLADAFWImage.h"
#include "COLLADAFWMaterial.h"
+#include "COLLADAFWEffect.h"
#include "COLLADAFWGeometry.h"
#include "COLLADAFWMesh.h"
#include "COLLADAFWMeshVertexData.h"
#include "COLLADAFWFloatOrDoubleArray.h"
#include "COLLADAFWArrayPrimitiveType.h"
+#include "COLLADAFWIndexList.h"
#include "COLLADAFWMeshPrimitiveWithFaceVertexCount.h"
#include "COLLADAFWPolygons.h"
#include "COLLADAFWTransformation.h"
#include "COLLADAFWTranslate.h"
#include "COLLADAFWScale.h"
#include "COLLADAFWRotate.h"
-#include "COLLADAFWEffect.h"
-#include "COLLADAFWIndexList.h"
+#include "COLLADAFWAnimationCurve.h"
+#include "COLLADAFWAnimationList.h"
#include "COLLADASaxFWLLoader.h"
@@ -119,6 +121,14 @@
// amazing name!
std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map;
+ struct AnimatedTransform {
+ Object *ob;
+ // COLLADAFW::Node *node;
+ COLLADAFW::Transformation *tm; // which transform is animated by an AnimationList->id
+ };
+ // Nodes don't share AnimationLists (Arystan)
+ std::map<COLLADAFW::UniqueId, AnimatedTransform> uid_animated_map; // AnimationList->uniqueId to AnimatedObject map
+
class UnitConverter
{
private:
@@ -364,26 +374,25 @@
float rot[3][3];
Mat3One(rot);
- // transform Object
+ // transform Object and store animation linking info
for (k = 0; k < node->getTransformations().getCount(); k ++) {
- COLLADAFW::Transformation *transform = node->getTransformations()[k];
- COLLADAFW::Transformation::TransformationType type = transform->getTransformationType();
+
+ COLLADAFW::Transformation *tm = node->getTransformations()[k];
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+
switch(type) {
case COLLADAFW::Transformation::TRANSLATE:
{
- COLLADAFW::Translate *tra = (COLLADAFW::Translate*)transform;
+ COLLADAFW::Translate *tra = (COLLADAFW::Translate*)tm;
COLLADABU::Math::Vector3& t = tra->getTranslation();
- // X
ob->loc[0] = (float)t[0];
- // Y
ob->loc[1] = (float)t[1];
- // Z
ob->loc[2] = (float)t[2];
}
break;
case COLLADAFW::Transformation::ROTATE:
{
- COLLADAFW::Rotate *ro = (COLLADAFW::Rotate*)transform;
+ COLLADAFW::Rotate *ro = (COLLADAFW::Rotate*)tm;
COLLADABU::Math::Vector3& raxis = ro->getRotationAxis();
float angle = (float)(ro->getRotationAngle() * M_PI / 180.0f);
float axis[] = {raxis[0], raxis[1], raxis[2]};
@@ -399,22 +408,25 @@
break;
case COLLADAFW::Transformation::SCALE:
{
- COLLADABU::Math::Vector3& s = ((COLLADAFW::Scale*)transform)->getScale();
- // X
+ COLLADABU::Math::Vector3& s = ((COLLADAFW::Scale*)tm)->getScale();
ob->size[0] = (float)s[0];
- // Y
ob->size[1] = (float)s[1];
- // Z
ob->size[2] = (float)s[2];
}
break;
case COLLADAFW::Transformation::MATRIX:
- break;
case COLLADAFW::Transformation::LOOKAT:
- break;
case COLLADAFW::Transformation::SKEW:
+ fprintf(stderr, "MATRIX, LOOKAT and SKEW transformations are not supported yet.\n");
break;
}
+
+ // AnimationList that drives this Transformation
+ const COLLADAFW::UniqueId& anim_list_id = tm->getAnimationList();
+
+ // store this so later we can link animation data with ob
+ AnimatedTransform anim = {ob, tm};
+ this->uid_animated_map[anim_list_id] = anim;
}
Mat3ToEul(rot, ob->rot);
// if parent_ob != NULL set parent
@@ -889,17 +901,124 @@
return true;
}
- /** When this method is called, the writer must write the Animation.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeAnimation( const COLLADAFW::Animation* animation )
+ // this function is called only for animations that pass COLLADAFW::validate
+ virtual bool writeAnimation( const COLLADAFW::Animation* anim )
{
+ if (anim->getAnimationType() == COLLADAFW::Animation::ANIMATION_CURVE) {
+ COLLADAFW::AnimationCurve *curve = (COLLADAFW::AnimationCurve*)anim;
+
+ // I wonder how do we use this (Arystan)
+ size_t dim = curve->getOutDimension();
+
+ // a curve can have mixed interpolation type,
+ // in this case curve->getInterpolationTypes returns a list of interpolation types per key
+ COLLADAFW::AnimationCurve::InterpolationType interp = curve->getInterpolationType();
+
+ if (interp != COLLADAFW::AnimationCurve::INTERPOLATION_MIXED) {
+ switch (interp) {
+ case COLLADAFW::AnimationCurve::INTERPOLATION_LINEAR:
+ // support this
+ break;
+ case COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER:
+ // and this
+ break;
+ case COLLADAFW::AnimationCurve::INTERPOLATION_CARDINAL:
+ case COLLADAFW::AnimationCurve::INTERPOLATION_HERMITE:
+ case COLLADAFW::AnimationCurve::INTERPOLATION_BSPLINE:
+ case COLLADAFW::AnimationCurve::INTERPOLATION_STEP:
+ fprintf(stderr, "CARDINAL, HERMITE, BSPLINE and STEP anim interpolation types not supported yet.\n");
+ break;
+ }
+ }
+ else {
+ // not supported yet
+ fprintf(stderr, "MIXED anim interpolation type is not supported yet.\n");
+ }
+ }
+ else {
+ fprintf(stderr, "FORMULA animation type is not supported yet.\n");
+ }
+
return true;
}
- /** When this method is called, the writer must write the AnimationList.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeAnimationList( const COLLADAFW::AnimationList* animationList )
+ // called on post-process stage after writeVisualScenes
+ virtual bool writeAnimationList( const COLLADAFW::AnimationList* anim )
{
+ const COLLADAFW::UniqueId& anim_id = anim->getUniqueId();
+
+ // possible in case we cannot interpret some transform
+ if (uid_animated_map.find(anim_id) == uid_animated_map.end()) {
+ return true;
+ }
+
+ // what does this AnimationList animate?
+ AnimatedTransform& animated = uid_animated_map[anim_id];
+
+ const COLLADAFW::AnimationList::AnimationBindings& bindings = anim->getAnimationBindings();
+
+ switch (animated.tm->getTransformationType()) {
+ case COLLADAFW::Transformation::TRANSLATE:
+ {
+ for (int i = 0; i < bindings.getCount(); i++) {
+ const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
+
+ switch (binding.animationClass) {
+ case COLLADAFW::AnimationList::POSITION_X:
+ break;
+ case COLLADAFW::AnimationList::POSITION_Y:
+ break;
+ case COLLADAFW::AnimationList::POSITION_Z:
+ break;
+ case COLLADAFW::AnimationList::POSITION_XYZ:
+ break;
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for TRANSLATE transformation.\n",
+ binding.animationClass);
+ }
+ }
+ }
+ break;
+ case COLLADAFW::Transformation::ROTATE:
+ {
+ COLLADAFW::Rotate* rot = (COLLADAFW::Rotate*)animated.tm;
+ COLLADABU::Math::Vector3& axis = rot->getRotationAxis();
+
+ for (int i = 0; i < bindings.getCount(); i++) {
+ const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
+
+ switch (binding.animationClass) {
+ case COLLADAFW::AnimationList::ANGLE:
+ if (COLLADABU::Math::Vector3::UNIT_X == axis) {
+
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
+
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
+
+ }
+ break;
+ case COLLADAFW::AnimationList::AXISANGLE:
+ // convert axis-angle to quat? or XYZ?
+ break;
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
+ binding.animationClass);
+ }
+ }
+ }
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ // same as for TRANSLATE
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ case COLLADAFW::Transformation::SKEW:
+ case COLLADAFW::Transformation::LOOKAT:
+ fprintf(stderr, "Animation of MATRIX, SKEW and LOOKAT transformations is not supported yet.\n");
+ break;
+ }
+
return true;
}
@@ -907,6 +1026,7 @@
@return The writer should return true, if writing succeeded, false otherwise.*/
virtual bool writeSkinControllerData( const COLLADAFW::SkinControllerData* skinControllerData )
{
+ // see COLLADAFW::validate for an example of how to use SkinControllerData
return true;
}
More information about the Bf-blender-cvs
mailing list