/** * This is a recursive function to parse the collada file and set a node * mask depending on the category of each node. */ void parse(osg::Node* curNode, std::string prefix = "", bool verbose=false) { if (verbose) { std::cout<< prefix << "(" << curNode->className() << ") \"" << curNode->getName() << "\""<< std::endl; } if ( (std::string(curNode->className()) == "MatrixTransform") && !(curNode->getName() == "")){ if (verbose){ std::cout<<"add a text Geode: "<<curNode->getName()<<std::endl; } add_text_to_node(curNode, curNode->getName()); } osg::Node::DescriptionList Des = curNode->getDescriptions(); for (int i=0; i<Des.size(); i++){ if (verbose){ std::cout<<"description: "<<Des[i]<<std::endl; } if (Des[i] == "frame") curNode->setNodeMask(0x1); else if (Des[i] == "shape") curNode->setNodeMask(0x2); else if (Des[i] == "link") curNode->setNodeMask(0x4); else if (Des[i] == "inertia") curNode->setNodeMask(0x8); } osg::Group* curGroup = curNode->asGroup(); if (curGroup) { for (unsigned int i = 0 ; i < curGroup->getNumChildren(); i ++) { parse(curGroup->getChild(i), prefix + "--->", verbose); } } }
static void add_kvp_value_node(xmlNodePtr node, const gchar *tag, KvpValue* val) { xmlNodePtr val_node; switch (val->get_type()) { case KvpValue::Type::STRING: { auto newstr = g_strdup(val->get<const char*>()); val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, checked_char_cast (newstr)); g_free (newstr); break; } case KvpValue::Type::TIMESPEC: val_node = NULL; break; case KvpValue::Type::GDATE: { auto d = val->get<GDate>(); val_node = gdate_to_dom_tree(tag, &d); xmlAddChild (node, val_node); break; } default: val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, NULL); break; } switch (val->get_type()) { case KvpValue::Type::INT64: add_text_to_node(val_node, "integer", g_strdup_printf("%" G_GINT64_FORMAT, val->get<int64_t>())); break; case KvpValue::Type::DOUBLE: add_text_to_node(val_node, "double", double_to_string(val->get<double>())); break; case KvpValue::Type::NUMERIC: add_text_to_node(val_node, "numeric", gnc_numeric_to_string(val->get<gnc_numeric>())); break; case KvpValue::Type::STRING: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "string"); break; case KvpValue::Type::GUID: { gchar guidstr[GUID_ENCODING_LENGTH+1]; guid_to_string_buff(val->get<GncGUID*>(), guidstr); add_text_to_node(val_node, "guid", guidstr); break; } case KvpValue::Type::TIMESPEC: { auto ts = val->get<Timespec>(); val_node = timespec_to_dom_tree (tag, &ts); xmlSetProp (val_node, BAD_CAST "type", BAD_CAST "timespec"); xmlAddChild (node, val_node); break; } case KvpValue::Type::GDATE: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "gdate"); break; case KvpValue::Type::GLIST: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "list"); for (auto cursor = val->get<GList*>(); cursor; cursor = cursor->next) { auto val = static_cast<KvpValue*>(cursor->data); add_kvp_value_node(val_node, "slot:value", val); } break; case KvpValue::Type::FRAME: { xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "frame"); auto frame = val->get<KvpFrame*>(); if (!frame) break; frame->for_each_slot(add_kvp_slot, static_cast<void*>(val_node)); break; } default: break; } }
static void add_kvp_value_node(xmlNodePtr node, gchar *tag, kvp_value* val) { xmlNodePtr val_node; gchar *tmp_str1; kvp_value_t kvp_type; kvp_type = kvp_value_get_type(val); if (kvp_type == KVP_TYPE_STRING) val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, BAD_CAST kvp_value_get_string(val)); else if (kvp_type == KVP_TYPE_TIMESPEC) val_node = NULL; else if (kvp_type == KVP_TYPE_GDATE) { GDate d = kvp_value_get_gdate(val); val_node = gdate_to_dom_tree(tag, &d); xmlAddChild (node, val_node); } else val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, NULL); switch (kvp_value_get_type(val)) { case KVP_TYPE_GINT64: add_text_to_node(val_node, "integer", g_strdup_printf("%" G_GINT64_FORMAT, kvp_value_get_gint64(val))); break; case KVP_TYPE_DOUBLE: add_text_to_node(val_node, "double", double_to_string(kvp_value_get_double(val))); break; case KVP_TYPE_NUMERIC: add_text_to_node(val_node, "numeric", gnc_numeric_to_string(kvp_value_get_numeric(val))); break; case KVP_TYPE_STRING: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "string"); break; case KVP_TYPE_GUID: /* THREAD-UNSAFE */ add_text_to_node(val_node, "guid", g_strdup(guid_to_string(kvp_value_get_guid(val)))); break; case KVP_TYPE_TIMESPEC: { Timespec ts = kvp_value_get_timespec (val); val_node = timespec_to_dom_tree (tag, &ts); xmlSetProp (val_node, BAD_CAST "type", BAD_CAST "timespec"); xmlAddChild (node, val_node); } break; case KVP_TYPE_GDATE: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "gdate"); break; case KVP_TYPE_BINARY: { guint64 size; void *binary_data = kvp_value_get_binary(val, &size); xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "binary"); g_return_if_fail(binary_data); tmp_str1 = binary_to_string(binary_data, size); xmlNodeSetContent(val_node, BAD_CAST tmp_str1); g_free(tmp_str1); } break; case KVP_TYPE_GLIST: { GList *cursor; xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "list"); for (cursor = kvp_value_get_glist(val); cursor; cursor = cursor->next) { kvp_value *val = (kvp_value*)cursor->data; add_kvp_value_node(val_node, "slot:value", val); } } break; case KVP_TYPE_FRAME: { kvp_frame *frame; xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "frame"); frame = kvp_value_get_frame (val); if (!frame || !kvp_frame_get_hash (frame)) break; g_hash_table_foreach_sorted(kvp_frame_get_hash(frame), add_kvp_slot, val_node, (GCompareFunc)strcmp); } break; } }
static void add_kvp_value_node(xmlNodePtr node, gchar *tag, KvpValue* val) { xmlNodePtr val_node; kvp_value_t kvp_type; kvp_type = kvp_value_get_type(val); if (kvp_type == KVP_TYPE_STRING) { gchar *newstr = g_strdup (kvp_value_get_string(val)); val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, checked_char_cast (newstr)); g_free (newstr); } else if (kvp_type == KVP_TYPE_TIMESPEC) val_node = NULL; else if (kvp_type == KVP_TYPE_GDATE) { GDate d = kvp_value_get_gdate(val); val_node = gdate_to_dom_tree(tag, &d); xmlAddChild (node, val_node); } else val_node = xmlNewTextChild(node, NULL, BAD_CAST tag, NULL); switch (kvp_value_get_type(val)) { case KVP_TYPE_GINT64: add_text_to_node(val_node, "integer", g_strdup_printf("%" G_GINT64_FORMAT, kvp_value_get_gint64(val))); break; case KVP_TYPE_DOUBLE: add_text_to_node(val_node, "double", double_to_string(kvp_value_get_double(val))); break; case KVP_TYPE_NUMERIC: add_text_to_node(val_node, "numeric", gnc_numeric_to_string(kvp_value_get_numeric(val))); break; case KVP_TYPE_STRING: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "string"); break; case KVP_TYPE_GUID: { gchar guidstr[GUID_ENCODING_LENGTH+1]; guid_to_string_buff(kvp_value_get_guid(val), guidstr); add_text_to_node(val_node, "guid", guidstr); break; } case KVP_TYPE_TIMESPEC: { Timespec ts = kvp_value_get_timespec (val); val_node = timespec_to_dom_tree (tag, &ts); xmlSetProp (val_node, BAD_CAST "type", BAD_CAST "timespec"); xmlAddChild (node, val_node); } break; case KVP_TYPE_GDATE: xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "gdate"); break; case KVP_TYPE_GLIST: { GList *cursor; xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "list"); for (cursor = kvp_value_get_glist(val); cursor; cursor = cursor->next) { KvpValue *val = (KvpValue*)cursor->data; add_kvp_value_node(val_node, "slot:value", val); } } break; case KVP_TYPE_FRAME: { KvpFrame *frame; const char ** keys; unsigned int i; xmlSetProp(val_node, BAD_CAST "type", BAD_CAST "frame"); frame = kvp_value_get_frame (val); if (!frame) break; keys = kvp_frame_get_keys(frame); for (i = 0; keys[i]; ++i) add_kvp_slot(keys[i], kvp_frame_get_value(frame, keys[i]), val_node); g_free(keys); } break; default: break; } }