summaryrefslogtreecommitdiff
path: root/tools/collada/collada.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/collada/collada.cpp')
-rw-r--r--tools/collada/collada.cpp96
1 files changed, 65 insertions, 31 deletions
diff --git a/tools/collada/collada.cpp b/tools/collada/collada.cpp
index 8f40ec1469..daf30b00d7 100644
--- a/tools/collada/collada.cpp
+++ b/tools/collada/collada.cpp
@@ -5,7 +5,7 @@
/* GODOT ENGINE */
/* http://www.godotengine.org */
/*************************************************************************/
-/* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
@@ -103,7 +103,7 @@ Transform Collada::fix_transform(const Transform& p_transform) {
}
#endif
-// tr.scale(Vector3(state.unit_scale.unit_scale.unit_scale));
+ //tr.scale(Vector3(state.unit_scale.unit_scale.unit_scale));
return tr;
//return state.matrix_fix * p_transform;
}
@@ -144,7 +144,7 @@ Transform Collada::Node::compute_transform(Collada &state) const {
case XForm::OP_ROTATE: {
if (xf.data.size()>=4) {
- xform_step.rotate(Vector3(xf.data[0],xf.data[1],xf.data[2]),-Math::deg2rad(xf.data[3]));
+ xform_step.rotate(Vector3(xf.data[0],xf.data[1],xf.data[2]),Math::deg2rad(xf.data[3]));
}
} break;
case XForm::OP_SCALE: {
@@ -322,7 +322,7 @@ void Collada::_parse_image(XMLParser& parser) {
String path = parser.get_attribute_value("source").strip_edges();
if (path.find("://")==-1 && path.is_rel_path()) {
// path is relative to file being loaded, so convert to a resource path
- image.path=Globals::get_singleton()->localize_path(state.local_path.get_base_dir()+"/"+path.percent_decode());
+ image.path=GlobalConfig::get_singleton()->localize_path(state.local_path.get_base_dir()+"/"+path.percent_decode());
}
} else {
@@ -342,11 +342,11 @@ void Collada::_parse_image(XMLParser& parser) {
if (path.find("://")==-1 && path.is_rel_path()) {
// path is relative to file being loaded, so convert to a resource path
- path=Globals::get_singleton()->localize_path(state.local_path.get_base_dir()+"/"+path);
+ path=GlobalConfig::get_singleton()->localize_path(state.local_path.get_base_dir()+"/"+path);
} else if (path.find("file:///")==0) {
path=path.replace_first("file:///","");
- path=Globals::get_singleton()->localize_path(path);
+ path=GlobalConfig::get_singleton()->localize_path(path);
}
image.path=path;
@@ -444,9 +444,11 @@ Vector<String> Collada::_read_string_array(XMLParser& parser) {
// parse String data
String str = parser.get_node_data();
array=str.split_spaces();
- //for(int i=0;i<array.size();i++) {
- // print_line(itos(i)+": "+array[i]);
- //}
+ /*
+ for(int i=0;i<array.size();i++) {
+ print_line(itos(i)+": "+array[i]);
+ }
+ */
}
else
if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
@@ -463,7 +465,7 @@ Transform Collada::_read_transform(XMLParser& parser) {
if (parser.is_empty())
return Transform();
- Vector<float> array;
+ Vector<String> array;
while(parser.read()==OK) {
// TODO: check for comments inside the element
// and ignore them.
@@ -471,7 +473,7 @@ Transform Collada::_read_transform(XMLParser& parser) {
if (parser.get_node_type() == XMLParser::NODE_TEXT) {
// parse float data
String str = parser.get_node_data();
- array=str.split_floats(" ",false);
+ array=str.split_spaces();
}
else
if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
@@ -479,7 +481,31 @@ Transform Collada::_read_transform(XMLParser& parser) {
}
ERR_FAIL_COND_V(array.size()!=16,Transform());
- return _read_transform_from_array(array);
+ Vector<float> farr;
+ farr.resize(16);
+ for(int i=0;i<16;i++) {
+ farr[i]=array[i].to_double();
+ }
+
+ return _read_transform_from_array(farr);
+}
+
+String Collada::_read_empty_draw_type(XMLParser& parser) {
+
+ String empty_draw_type = "";
+
+ if (parser.is_empty())
+ return empty_draw_type;
+
+ while (parser.read()==OK) {
+ if (parser.get_node_type() == XMLParser::NODE_TEXT) {
+ empty_draw_type = parser.get_node_data();
+ }
+ else
+ if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
+ break; // end parsing text
+ }
+ return empty_draw_type;
}
Variant Collada::_parse_param(XMLParser& parser) {
@@ -663,9 +689,6 @@ void Collada::_parse_effect_material(XMLParser& parser,Effect &effect,String &id
} else {
String uri = effect.params[surface];
- int channel=0;
- //if (parser.has_attribute("texcoord"))
-
if (what=="diffuse") {
effect.diffuse.texture=uri;
@@ -718,6 +741,9 @@ void Collada::_parse_effect_material(XMLParser& parser,Effect &effect,String &id
effect.found_double_sided=true;
effect.double_sided=parser.get_node_data().to_int();
COLLADA_PRINT("double sided: "+itos(parser.get_node_data().to_int()));
+ } else if (parser.get_node_name()=="unshaded") {
+ parser.read();
+ effect.unshaded=parser.get_node_data().to_int();
} else if (parser.get_node_name()=="bump") {
// color or texture types
@@ -738,9 +764,6 @@ void Collada::_parse_effect_material(XMLParser& parser,Effect &effect,String &id
} else {
String uri = effect.params[surface];
- int channel=0;
- //if (parser.has_attribute("texcoord"))
-
if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype")!="NORMALMAP") {
WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.")
}
@@ -1346,8 +1369,11 @@ void Collada::_parse_skin_controller(XMLParser& parser,String p_id) {
skindata.weights=weights;
- }// else if (!parser.is_empty())
- // parser.skip_section();
+ }
+ /*
+ else if (!parser.is_empty())
+ parser.skip_section();
+ */
} else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="skin")
break;
@@ -1375,7 +1401,7 @@ void Collada::_parse_skin_controller(XMLParser& parser,String p_id) {
for(int i=0;i<joint_source.sarray.size();i++) {
String name = joint_source.sarray[i];
- Transform xform = _read_transform_from_array(ibm_source.array,i*16);// <- this is a mistake, it must be applied to vertices
+ Transform xform = _read_transform_from_array(ibm_source.array,i*16); //<- this is a mistake, it must be applied to vertices
xform.affine_invert(); // inverse for rest, because it's an inverse
#ifdef COLLADA_IMPORT_SCALE_SCENE
xform.origin*=state.unit_scale;
@@ -1421,8 +1447,10 @@ void Collada::_parse_morph_controller(XMLParser& parser, String p_id) {
} else if (section=="Name_array" || section=="IDREF_array") {
// create a new array and read it.
- //if (section=="IDREF_array")
- // morphdata.use_idrefs=true;
+ /*
+ if (section=="IDREF_array")
+ morphdata.use_idrefs=true;
+ */
if (morphdata.sources.has(current_source)) {
morphdata.sources[current_source].sarray = _read_string_array(parser);
@@ -1470,8 +1498,10 @@ void Collada::_parse_morph_controller(XMLParser& parser, String p_id) {
}
- // else if (!parser.is_empty())
- // parser.skip_section();
+ /*
+ else if (!parser.is_empty())
+ parser.skip_section();
+ */
} else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name()=="morph")
break;
@@ -1583,7 +1613,7 @@ Collada::Node* Collada::_parse_visual_instance_camera(XMLParser& parser) {
cam->camera= _uri_to_id(parser.get_attribute_value_safe("url"));
if (state.up_axis==Vector3::AXIS_Z) //collada weirdness
- cam->post_transform.basis.rotate(Vector3(1,0,0),Math_PI*0.5);
+ cam->post_transform.basis.rotate(Vector3(1,0,0),-Math_PI*0.5);
if (parser.is_empty()) //nothing else to parse...
return cam;
@@ -1604,7 +1634,7 @@ Collada::Node* Collada::_parse_visual_instance_light(XMLParser& parser) {
cam->light= _uri_to_id(parser.get_attribute_value_safe("url"));
if (state.up_axis==Vector3::AXIS_Z) //collada weirdness
- cam->post_transform.basis.rotate(Vector3(1,0,0),Math_PI*0.5);
+ cam->post_transform.basis.rotate(Vector3(1,0,0),-Math_PI*0.5);
if (parser.is_empty()) //nothing else to parse...
return cam;
@@ -1664,6 +1694,8 @@ Collada::Node* Collada::_parse_visual_scene_node(XMLParser& parser) {
Vector<Node::XForm> xform_list;
Vector<Node*> children;
+
+ String empty_draw_type="";
Node *node=NULL;
@@ -1682,7 +1714,7 @@ Collada::Node* Collada::_parse_visual_scene_node(XMLParser& parser) {
if ( parser.has_attribute("sid") ) { //bones may not have sid
joint->sid=parser.get_attribute_value("sid");
-// state.bone_map[joint->sid]=joint;
+ //state.bone_map[joint->sid]=joint;
} else if (state.idref_joints.has(name)) {
joint->sid=name; //kind of a cheat but..
} else if (parser.has_attribute("name")) {
@@ -1771,7 +1803,9 @@ Collada::Node* Collada::_parse_visual_scene_node(XMLParser& parser) {
xform_list.push_back(xf);
- } else if (section=="technique" || section=="extra") {
+ } else if (section=="empty_draw_type") {
+ empty_draw_type = _read_empty_draw_type(parser);
+ } else if (section == "technique" || section=="extra") {
} else if (section!="node") {
//usually what defines the type of node
@@ -1817,6 +1851,7 @@ Collada::Node* Collada::_parse_visual_scene_node(XMLParser& parser) {
node->name=name;
node->id=id;
+ node->empty_draw_type=empty_draw_type;
if (node->children.size()==1) {
if (node->children[0]->noname && !node->noname) {
@@ -2610,7 +2645,6 @@ void Collada::_find_morph_nodes(VisualScene *p_vscene,Node *p_node) {
base=sk.base;
} else if (state.morph_controller_data_map.has(base)) {
- MorphControllerData &sk = state.morph_controller_data_map[base];
state.morph_ownership_map[base]=nj->id;
break;
} else {
@@ -2695,7 +2729,7 @@ Error Collada::load(const String& p_path, int p_flags) {
Error err = parser.open(p_path);
ERR_FAIL_COND_V(err,err);
- state.local_path = Globals::get_singleton()->localize_path(p_path);
+ state.local_path = GlobalConfig::get_singleton()->localize_path(p_path);
state.import_flags=p_flags;
/* Skip headers */
err=OK;