[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44935] trunk/blender/source/blender/ collada: #collada instance_node import, partially fixes #27629
Arystanbek Dyussenov
arystan.d at gmail.com
Sat Mar 17 07:37:43 CET 2012
Revision: 44935
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44935
Author: kazanbas
Date: 2012-03-17 06:37:26 +0000 (Sat, 17 Mar 2012)
Log Message:
-----------
#collada instance_node import, partially fixes #27629
Patch applied in r37663 caused loss of <instance_node>s.
All parts of the smaller test file attached in the report now import.
Revision Links:
--------------
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37663
Modified Paths:
--------------
trunk/blender/source/blender/collada/DocumentImporter.cpp
trunk/blender/source/blender/collada/DocumentImporter.h
trunk/blender/source/blender/collada/ErrorHandler.cpp
Modified: trunk/blender/source/blender/collada/DocumentImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.cpp 2012-03-17 04:43:32 UTC (rev 44934)
+++ trunk/blender/source/blender/collada/DocumentImporter.cpp 2012-03-17 06:37:26 UTC (rev 44935)
@@ -121,8 +121,10 @@
loader.registerExtraDataCallbackHandler(ehandler);
- if (!root.loadDocument(mFilename))
+ if (!root.loadDocument(mFilename)) {
+ fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 1st pass\n");
return false;
+ }
if(errorHandler.hasError())
return false;
@@ -134,8 +136,10 @@
COLLADASaxFWL::Loader loader2;
COLLADAFW::Root root2(&loader2, this);
- if (!root2.loadDocument(mFilename))
+ if (!root2.loadDocument(mFilename)) {
+ fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 2nd pass\n");
return false;
+ }
delete ehandler;
@@ -313,7 +317,7 @@
return ob;
}
-Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, Object *par_ob, bool is_library_node)
+Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, bool is_library_node)
{
Object *obn = copy_object(source_ob);
obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
@@ -357,10 +361,10 @@
Object *new_child = NULL;
if (inodes.getCount()) { // \todo loop through instance nodes
const COLLADAFW::UniqueId& id = inodes[0]->getInstanciatedObjectId();
- new_child = create_instance_node(object_map[id], node_map[id], child_node, sce, NULL, is_library_node);
+ new_child = create_instance_node(object_map[id], node_map[id], child_node, sce, is_library_node);
}
else {
- new_child = create_instance_node(object_map[child_id], child_node, NULL, sce, NULL, is_library_node);
+ new_child = create_instance_node(object_map[child_id], child_node, NULL, sce, is_library_node);
}
bc_set_parent(new_child, obn, mContext, true);
@@ -369,21 +373,14 @@
}
}
- // when we have an instance_node, don't return the object, because otherwise
- // its correct location gets overwritten in write_node(). Fixes bug #26012.
- if(instance_node) {
- if (par_ob && obn)
- bc_set_parent(obn, par_ob, mContext);
- return NULL;
- }
-
- else return obn;
+ return obn;
}
void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par, bool is_library_node)
{
Object *ob = NULL;
bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
+ bool read_transform = true;
if (is_joint) {
if ( par ) {
@@ -439,9 +436,11 @@
Object *source_ob = object_map[node_id];
COLLADAFW::Node *source_node = node_map[node_id];
- ob = create_instance_node(source_ob, source_node, node, sce, par, is_library_node);
+ ob = create_instance_node(source_ob, source_node, node, sce, is_library_node);
}
++inst_done;
+
+ read_transform = false;
}
// if node is empty - create empty object
// XXX empty node may not mean it is empty object, not sure about this
@@ -449,7 +448,8 @@
ob = add_object(sce, OB_EMPTY);
}
- // check if object is not NULL
+ // XXX: if there're multiple instances, only one is stored
+
if (!ob) return;
std::string nodename = node->getName().size() ? node->getName() : node->getOriginalId();
@@ -462,7 +462,8 @@
libnode_ob.push_back(ob);
}
- anim_importer.read_node_transform(node, ob); // overwrites location set earlier
+ if (read_transform)
+ anim_importer.read_node_transform(node, ob); // overwrites location set earlier
if (!is_joint) {
// if par was given make this object child of the previous
Modified: trunk/blender/source/blender/collada/DocumentImporter.h
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.h 2012-03-17 04:43:32 UTC (rev 44934)
+++ trunk/blender/source/blender/collada/DocumentImporter.h 2012-03-17 06:37:26 UTC (rev 44935)
@@ -72,7 +72,7 @@
/** these should not be here */
Object* create_camera_object(COLLADAFW::InstanceCamera*, Scene*);
Object* create_lamp_object(COLLADAFW::InstanceLight*, Scene*);
- Object* create_instance_node(Object*, COLLADAFW::Node*, COLLADAFW::Node*, Scene*, Object*, bool);
+ Object* create_instance_node(Object*, COLLADAFW::Node*, COLLADAFW::Node*, Scene*, bool);
void write_node(COLLADAFW::Node*, COLLADAFW::Node*, Scene*, Object*, bool);
MTex* create_texture(COLLADAFW::EffectCommon*, COLLADAFW::Texture&, Material*, int, TexIndexTextureArrayMap&);
void write_profile_COMMON(COLLADAFW::EffectCommon*, Material*);
Modified: trunk/blender/source/blender/collada/ErrorHandler.cpp
===================================================================
--- trunk/blender/source/blender/collada/ErrorHandler.cpp 2012-03-17 04:43:32 UTC (rev 44934)
+++ trunk/blender/source/blender/collada/ErrorHandler.cpp 2012-03-17 06:37:26 UTC (rev 44935)
@@ -83,5 +83,9 @@
COLLADASaxFWL::SaxFWLError* saxFWLError = (COLLADASaxFWL::SaxFWLError*) error;
std::cout << "Sax FWL Error: " << saxFWLError->getErrorMessage() << std::endl;
}
+ else {
+ std::cout << "opencollada error: " << error->getFullErrorMessage() << std::endl;
+ }
+
return false;
}
More information about the Bf-blender-cvs
mailing list