[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21475] branches/soc-2009-chingachgook/ source/blender/collada: Added export objects hierarchy.
Chingiz Dyussenov
chingiz.ds at gmail.com
Fri Jul 10 08:55:05 CEST 2009
Revision: 21475
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21475
Author: chingachgook
Date: 2009-07-10 08:55:05 +0200 (Fri, 10 Jul 2009)
Log Message:
-----------
Added export objects hierarchy.
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-10 04:25:49 UTC (rev 21474)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp 2009-07-10 06:55:05 UTC (rev 21475)
@@ -7,6 +7,9 @@
#include "DNA_texture_types.h"
#include "DNA_camera_types.h"
#include "DNA_lamp_types.h"
+#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
extern "C"
{
@@ -30,6 +33,7 @@
#include <COLLADASWInputList.h>
#include <COLLADASWPrimitves.h>
#include <COLLADASWVertices.h>
+#include <COLLADASWLibraryAnimations.h>
#include <COLLADASWLibraryImages.h>
#include <COLLADASWLibraryEffects.h>
#include <COLLADASWImage.h>
@@ -59,6 +63,8 @@
// This function assumes that quat is normalized.
// The following document was used as reference:
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
+
+
void QuatToAxisAngle(float *q, float *axis, float *angle)
{
// quat to axis angle
@@ -110,18 +116,34 @@
template<class Functor>
void forEachMeshObjectInScene(Scene *sce, Functor &f)
{
+
Base *base= (Base*) sce->base.first;
while(base) {
Object *ob = base->object;
-
+
if (ob->type == OB_MESH && ob->data) {
f(ob);
}
base= base->next;
+
}
}
template<class Functor>
+void forEachObjectWithAnimationInScene(Scene *sce, Functor &f)
+{
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->adt && ob->data) {
+ f(ob);
+ }
+ base= base->next;
+ }
+}
+
+template<class Functor>
void forEachCameraObjectInScene(Scene *sce, Functor &f)
{
Base *base= (Base*) sce->base.first;
@@ -531,10 +553,11 @@
openVisualScene(id_name(sce), "");
// write <node>s
- forEachMeshObjectInScene(sce, *this);
- forEachCameraObjectInScene(sce, *this);
- forEachLampObjectInScene(sce, *this);
-
+ //forEachMeshObjectInScene(sce, *this);
+ //forEachCameraObjectInScene(sce, *this);
+ //forEachLampObjectInScene(sce, *this);
+ exportHierarchy(sce);
+
// </visual_scene> </library_visual_scenes>
closeVisualScene();
@@ -542,7 +565,9 @@
}
// called for each object
- void operator()(Object *ob) {
+ //void operator()(Object *ob) {
+ void writeNodes(Object *ob, Scene *sce) {
+
COLLADASW::Node node(mSW);
std::string ob_name(id_name(ob));
node.start();
@@ -603,9 +628,37 @@
instLa.add();
}
+ // write node for child object
+ Base *b = (Base*) sce->base.first;
+ while(b) {
+
+ Object *cob = b->object;
+
+ if ((cob->type == OB_MESH || cob->type == OB_CAMERA || cob->type == OB_LAMP) && cob->parent == ob) {
+ // write node...
+ writeNodes(cob, sce);
+ }
+ b = b->next;
+ }
+
node.end();
}
+ void exportHierarchy(Scene *sce)
+ {
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if ((ob->type == OB_MESH || ob->type == OB_CAMERA || ob->type == OB_LAMP) && !ob->parent) {
+ // write nodes....
+ writeNodes(ob, sce);
+
+ }
+ base= base->next;
+ }
+ }
+
};
class ImagesExporter: COLLADASW::LibraryImages
@@ -959,6 +1012,46 @@
}
};
+class AnimationsExporter: COLLADASW::LibraryAnimations
+{
+public:
+ AnimationsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryAnimations(sw) {}
+ void exportAnimation(Scene *sce)
+ {
+ openLibrary();
+
+ forEachObjectWithAnimationInScene(sce, *this);
+
+ closeLibrary();
+ }
+ void operator() (Object *ob)
+ {
+
+ AnimData *adt = ob->adt;
+ NlaTrack *nlt;
+ NlaStrip *strip;
+ FCurve *fcu;
+
+ // iterate over all nla tracks
+ for (nlt = (NlaTrack*)adt->nla_tracks.first; nlt; nlt = nlt->next) {
+
+ // iterate over all nla strips of current nla track
+ for (strip = (NlaStrip*)nlt->strips.first; strip; strip = strip->next) {
+ bAction *act = strip->act;
+ // iterate over all fcurves of current nla strip's action
+ for (fcu = (FCurve*)act->curves.first; fcu; fcu = fcu->next) {
+ // write <animation> for each fcurve
+ // each fcurve represents one axis of loc/rot/scale
+ // through fcurve I can take intangents and outtangents
+ // but how do I get objects loc/rot/scale data at specific time
+
+ }
+ }
+ }
+
+ }
+};
+
void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
{
COLLADABU::NativeString native_filename =
Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp 2009-07-10 04:25:49 UTC (rev 21474)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp 2009-07-10 06:55:05 UTC (rev 21475)
@@ -144,7 +144,8 @@
{
//int uv_coords_index = mVData->getInputInfosArray()[uv_set_index]->getCount() * uv_set_index + uv_index * 2;
int uv_coords_index = uv_index * 2;
-// int uv_coords_index = mVData->getLength(uv_set_index) * uv_set_index + uv_index * 2;
+ //int uv_coords_index = mVData->getLength(uv_set_index) * uv_set_index + uv_index * 2;
+
switch(mVData->getType()) {
case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
{
@@ -164,8 +165,6 @@
break;
}
}
- //uv[0] = mVData;
- //uv[1] = ...;
}
};
@@ -429,13 +428,16 @@
0
};
- if (quad) uv_indices[3] = index_list.getIndex(index + 3);
+ //if (quad) uv_indices[3] = index_list.getIndex(index + 3);
uvs.getUV(uv_set_index, uv_indices[0], mtface->uv[0]);
uvs.getUV(uv_set_index, uv_indices[1], mtface->uv[1]);
uvs.getUV(uv_set_index, uv_indices[2], mtface->uv[2]);
- if (quad) uvs.getUV(uv_set_index, uv_indices[3], mtface->uv[3]);
+ if (quad) {
+ uv_indices[3] = index_list.getIndex(index + 3);
+ uvs.getUV(uv_set_index, uv_indices[3], mtface->uv[3]);
+ }
}
/** When this method is called, the writer must write the geometry.
More information about the Bf-blender-cvs
mailing list