code cleanup: collada

- when bubble sorting names - dont convert to str::string just to compare strings
- use BLI_linklist_index() to check if an item is in the list
- quiet some warnings
This commit is contained in:
Campbell Barton 2012-06-16 09:16:24 +00:00
parent 9f6a66d5f9
commit 664c95d1eb
9 changed files with 70 additions and 86 deletions

@ -83,7 +83,7 @@ bool ArmatureExporter::is_skinned_mesh(Object *ob)
void ArmatureExporter::write_bone_URLs(COLLADASW::InstanceController &ins, Object *ob_arm, Bone *bone) void ArmatureExporter::write_bone_URLs(COLLADASW::InstanceController &ins, Object *ob_arm, Bone *bone)
{ {
if ( bc_is_root_bone(bone, this->export_settings->deform_bones_only) ) if (bc_is_root_bone(bone, this->export_settings->deform_bones_only))
ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_joint_id(bone, ob_arm))); ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_joint_id(bone, ob_arm)));
else { else {
for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) { for (Bone *child = (Bone *)bone->childbase.first; child; child = child->next) {
@ -187,9 +187,12 @@ void ArmatureExporter::add_bone_node(Bone *bone, Object *ob_arm, Scene *sce,
node.setNodeName(node_name); node.setNodeName(node_name);
node.setNodeSid(node_sid); node.setNodeSid(node_sid);
/*if ( bone->childbase.first == NULL || BLI_countlist(&(bone->childbase))>=2) #if 0
if (bone->childbase.first == NULL || BLI_countlist(&(bone->childbase)) >= 2) {
add_blender_leaf_bone( bone, ob_arm , node ); add_blender_leaf_bone( bone, ob_arm , node );
else{*/ }
else {
#endif
node.start(); node.start();
add_bone_transform(ob_arm, bone, node); add_bone_transform(ob_arm, bone, node);

@ -53,14 +53,14 @@ class SceneExporter;
// XXX exporter writes wrong data for shared armatures. A separate // XXX exporter writes wrong data for shared armatures. A separate
// controller should be written for each armature-mesh binding how do // controller should be written for each armature-mesh binding how do
// we make controller ids then? // we make controller ids then?
class ArmatureExporter: public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter class ArmatureExporter : public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter
{ {
public: public:
ArmatureExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings); ArmatureExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings);
// write bone nodes // write bone nodes
void add_armature_bones(Object *ob_arm, Scene* sce, SceneExporter* se, void add_armature_bones(Object *ob_arm, Scene *sce, SceneExporter *se,
std::list<Object*>& child_objects); std::list<Object *>& child_objects);
bool is_skinned_mesh(Object *ob); bool is_skinned_mesh(Object *ob);
@ -76,7 +76,7 @@ private:
const ExportSettings *export_settings; const ExportSettings *export_settings;
#if 0 #if 0
std::vector<Object*> written_armatures; std::vector<Object *> written_armatures;
bool already_written(Object *ob_arm); bool already_written(Object *ob_arm);
@ -89,8 +89,8 @@ private:
// Scene, SceneExporter and the list of child_objects // Scene, SceneExporter and the list of child_objects
// are required for writing bone parented objects // are required for writing bone parented objects
void add_bone_node(Bone *bone, Object *ob_arm, Scene* sce, SceneExporter* se, void add_bone_node(Bone *bone, Object *ob_arm, Scene *sce, SceneExporter *se,
std::list<Object*>& child_objects); std::list<Object *>& child_objects);
void add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node); void add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node);
@ -100,10 +100,10 @@ private:
// ob should be of type OB_MESH // ob should be of type OB_MESH
// both args are required // both args are required
void export_controller(Object* ob, Object *ob_arm); void export_controller(Object *ob, Object *ob_arm);
void add_joints_element(ListBase *defbase, void add_joints_element(ListBase *defbase,
const std::string& joints_source_id, const std::string& inv_bind_mat_source_id); const std::string& joints_source_id, const std::string& inv_bind_mat_source_id);
void add_bind_shape_mat(Object *ob); void add_bind_shape_mat(Object *ob);
@ -111,15 +111,15 @@ private:
std::string add_inv_bind_mats_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id); std::string add_inv_bind_mats_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id);
Bone *get_bone_from_defgroup(Object *ob_arm, bDeformGroup* def); Bone *get_bone_from_defgroup(Object *ob_arm, bDeformGroup *def);
bool is_bone_defgroup(Object *ob_arm, bDeformGroup* def); bool is_bone_defgroup(Object *ob_arm, bDeformGroup *def);
std::string add_weights_source(Mesh *me, const std::string& controller_id, std::string add_weights_source(Mesh *me, const std::string& controller_id,
const std::list<float>& weights); const std::list<float>& weights);
void add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id, void add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id,
const std::list<int>& vcount, const std::list<int>& joints); const std::list<int>& vcount, const std::list<int>& joints);
void write_bone_URLs(COLLADASW::InstanceController &ins, Object *ob_arm, Bone *bone); void write_bone_URLs(COLLADASW::InstanceController &ins, Object *ob_arm, Bone *bone);
}; };

@ -386,7 +386,7 @@ Object *DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Nod
Object *new_child = NULL; Object *new_child = NULL;
if (inodes.getCount()) { // \todo loop through instance nodes if (inodes.getCount()) { // \todo loop through instance nodes
const COLLADAFW::UniqueId& id = inodes[0]->getInstanciatedObjectId(); const COLLADAFW::UniqueId& id = inodes[0]->getInstanciatedObjectId();
fprintf(stderr, "Doing %d child nodes\n", node_map.count(id)); fprintf(stderr, "Doing %d child nodes\n", (int)node_map.count(id));
new_child = create_instance_node(object_map.find(id)->second, node_map[id], child_node, sce, is_library_node); new_child = create_instance_node(object_map.find(id)->second, node_map[id], child_node, sce, is_library_node);
} }
else { else {

@ -31,19 +31,18 @@ extern "C" {
#ifndef __EXPORTSETTINGS_H__ #ifndef __EXPORTSETTINGS_H__
#define __EXPORTSETTINGS_H__ #define __EXPORTSETTINGS_H__
struct ExportSettings struct ExportSettings {
{ public:
public: bool apply_modifiers;
bool apply_modifiers; bool selected;
bool selected; bool include_children;
bool include_children; bool include_armatures;
bool include_armatures; bool deform_bones_only;
bool deform_bones_only; bool use_object_instantiation;
bool use_object_instantiation; bool sort_by_name;
bool sort_by_name; bool second_life;
bool second_life; char *filepath;
char *filepath; LinkNode *export_set;
LinkNode *export_set;
}; };
#endif #endif

@ -49,20 +49,19 @@ int collada_import(bContext *C, const char *filepath)
return 0; return 0;
} }
int collada_export( int collada_export(Scene *sce,
Scene *sce, const char *filepath,
const char *filepath,
int apply_modifiers, int apply_modifiers,
int selected, int selected,
int include_children, int include_children,
int include_armatures, int include_armatures,
int deform_bones_only, int deform_bones_only,
int use_object_instantiation, int use_object_instantiation,
int sort_by_name, int sort_by_name,
int second_life) int second_life)
{ {
ExportSettings export_settings; ExportSettings export_settings;

@ -33,23 +33,22 @@ struct Scene;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/* /*
* both return 1 on success, 0 on error * both return 1 on success, 0 on error
*/ */
int collada_import(bContext *C, const char *filepath); int collada_import(bContext *C, const char *filepath);
int collada_export( int collada_export(Scene *sce,
Scene *sce, const char *filepath,
const char *filepath, int apply_modifiers,
int apply_modifiers,
int selected, int selected,
int include_children, int include_children,
int include_armatures, int include_armatures,
int deform_bones_only, int deform_bones_only,
int use_object_instantiation, int use_object_instantiation,
int sort_by_name, int sort_by_name,
int second_life); int second_life);

@ -193,30 +193,19 @@ bool bc_is_base_node(LinkNode *export_set, Object *ob)
bool bc_is_in_Export_set(LinkNode *export_set, Object *ob) bool bc_is_in_Export_set(LinkNode *export_set, Object *ob)
{ {
LinkNode *node = export_set; return (BLI_linklist_index(export_set, ob) != -1);
while (node) {
Object *element = (Object *)node->link;
if (element == ob)
return true;
node= node->next;
}
return false;
} }
bool bc_has_object_type(LinkNode *export_set, short obtype) bool bc_has_object_type(LinkNode *export_set, short obtype)
{ {
LinkNode *node = export_set; LinkNode *node;
while (node) { for (node = export_set; node; node = node->next) {
Object *ob = (Object *)node->link; Object *ob = (Object *)node->link;
/* XXX - why is this checking for ob->data? - we could be looking for empties */
if (ob->type == obtype && ob->data) { if (ob->type == obtype && ob->data) {
return true; return true;
} }
node= node->next;
} }
return false; return false;
} }
@ -236,19 +225,16 @@ void bc_bubble_sort_by_Object_name(LinkNode *export_set)
{ {
bool sorted = false; bool sorted = false;
LinkNode *node; LinkNode *node;
for(node=export_set; node->next && !sorted; node=node->next) { for (node = export_set; node->next && !sorted; node = node->next) {
sorted = true; sorted = true;
LinkNode *current; LinkNode *current;
for (current=export_set; current->next; current = current->next) { for (current = export_set; current->next; current = current->next) {
Object *a = (Object *)current->link; Object *a = (Object *)current->link;
Object *b = (Object *)current->next->link; Object *b = (Object *)current->next->link;
std::string str_a (a->id.name); if (strcmp(a->id.name, b->id.name) > 0) {
std::string str_b (b->id.name);
if (str_a.compare(str_b) > 0) {
current->link = b; current->link = b;
current->next->link = a; current->next->link = a;
sorted = false; sorted = false;
@ -264,7 +250,7 @@ void bc_bubble_sort_by_Object_name(LinkNode *export_set)
* are root bones. * are root bones.
*/ */
bool bc_is_root_bone(Bone *aBone, bool deform_bones_only) { bool bc_is_root_bone(Bone *aBone, bool deform_bones_only) {
if(deform_bones_only) { if (deform_bones_only) {
Bone *root = NULL; Bone *root = NULL;
Bone *bone = aBone; Bone *bone = aBone;
while (bone) { while (bone) {
@ -272,7 +258,7 @@ bool bc_is_root_bone(Bone *aBone, bool deform_bones_only) {
root = bone; root = bone;
bone = bone->parent; bone = bone->parent;
} }
return aBone==root; return (aBone == root);
} }
else else
return !(aBone->parent); return !(aBone->parent);

@ -51,11 +51,11 @@ extern "C" {
#include "ExportSettings.h" #include "ExportSettings.h"
typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > TexIndexTextureArrayMap; typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex *> > TexIndexTextureArrayMap;
extern float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigned int index); extern float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigned int index);
extern int bc_test_parent_loop(Object *par, Object *ob); extern int bc_test_parent_loop(Object *par, Object *ob);
extern int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space=true); extern int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space = true);
extern Object *bc_add_object(Scene *scene, int type, const char *name); extern Object *bc_add_object(Scene *scene, int type, const char *name);
extern Mesh *bc_to_mesh_apply_modifiers(Scene *scene, Object *ob); extern Mesh *bc_to_mesh_apply_modifiers(Scene *scene, Object *ob);

@ -2199,9 +2199,9 @@ static int wm_collada_export_exec(bContext *C, wmOperator *op)
selected, selected,
include_children, include_children,
include_armatures, include_armatures,
deform_bones_only, deform_bones_only,
use_object_instantiation, use_object_instantiation,
sort_by_name, sort_by_name,
second_life)) { second_life)) {
return OPERATOR_FINISHED; return OPERATOR_FINISHED;
} }
@ -2213,8 +2213,6 @@ static int wm_collada_export_exec(bContext *C, wmOperator *op)
void uiCollada_exportSettings(uiLayout *layout, PointerRNA *imfptr) void uiCollada_exportSettings(uiLayout *layout, PointerRNA *imfptr)
{ {
ID *id = imfptr->id.data;
uiLayout *box, *row; uiLayout *box, *row;
// Export Options: // Export Options:
@ -2253,7 +2251,7 @@ void uiCollada_exportSettings(uiLayout *layout, PointerRNA *imfptr)
} }
static void wm_collada_export_draw(bContext *C, wmOperator *op) static void wm_collada_export_draw(bContext *UNUSED(C), wmOperator *op)
{ {
PointerRNA ptr; PointerRNA ptr;