collada.cpp 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575
  1. /*************************************************************************/
  2. /* collada.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "collada.h"
  31. #include <stdio.h>
  32. //#define DEBUG_DEFAULT_ANIMATION
  33. //#define DEBUG_COLLADA
  34. #ifdef DEBUG_COLLADA
  35. #define COLLADA_PRINT(m_what) print_line(m_what)
  36. #else
  37. #define COLLADA_PRINT(m_what)
  38. #endif
  39. #define COLLADA_IMPORT_SCALE_SCENE
  40. /* HELPERS */
  41. String Collada::Effect::get_texture_path(const String &p_source, Collada &state) const {
  42. const String &image = p_source;
  43. ERR_FAIL_COND_V(!state.state.image_map.has(image), "");
  44. return state.state.image_map[image].path;
  45. }
  46. Transform Collada::get_root_transform() const {
  47. Transform unit_scale_transform;
  48. #ifndef COLLADA_IMPORT_SCALE_SCENE
  49. unit_scale_transform.scale(Vector3(state.unit_scale, state.unit_scale, state.unit_scale));
  50. #endif
  51. return unit_scale_transform;
  52. }
  53. void Collada::Vertex::fix_unit_scale(Collada &state) {
  54. #ifdef COLLADA_IMPORT_SCALE_SCENE
  55. vertex *= state.state.unit_scale;
  56. #endif
  57. }
  58. static String _uri_to_id(const String &p_uri) {
  59. if (p_uri.begins_with("#"))
  60. return p_uri.substr(1, p_uri.size() - 1);
  61. else
  62. return p_uri;
  63. }
  64. /** HELPER FUNCTIONS **/
  65. Transform Collada::fix_transform(const Transform &p_transform) {
  66. Transform tr = p_transform;
  67. #ifndef NO_UP_AXIS_SWAP
  68. if (state.up_axis != Vector3::AXIS_Y) {
  69. for (int i = 0; i < 3; i++)
  70. SWAP(tr.basis[1][i], tr.basis[state.up_axis][i]);
  71. for (int i = 0; i < 3; i++)
  72. SWAP(tr.basis[i][1], tr.basis[i][state.up_axis]);
  73. SWAP(tr.origin[1], tr.origin[state.up_axis]);
  74. tr.basis[state.up_axis][0] = -tr.basis[state.up_axis][0];
  75. tr.basis[state.up_axis][1] = -tr.basis[state.up_axis][1];
  76. tr.basis[0][state.up_axis] = -tr.basis[0][state.up_axis];
  77. tr.basis[1][state.up_axis] = -tr.basis[1][state.up_axis];
  78. tr.origin[state.up_axis] = -tr.origin[state.up_axis];
  79. }
  80. #endif
  81. //tr.scale(Vector3(state.unit_scale.unit_scale.unit_scale));
  82. return tr;
  83. //return state.matrix_fix * p_transform;
  84. }
  85. static Transform _read_transform_from_array(const Vector<float> &array, int ofs = 0) {
  86. Transform tr;
  87. // i wonder why collada matrices are transposed, given that's opposed to opengl..
  88. tr.basis.elements[0][0] = array[0 + ofs];
  89. tr.basis.elements[0][1] = array[1 + ofs];
  90. tr.basis.elements[0][2] = array[2 + ofs];
  91. tr.basis.elements[1][0] = array[4 + ofs];
  92. tr.basis.elements[1][1] = array[5 + ofs];
  93. tr.basis.elements[1][2] = array[6 + ofs];
  94. tr.basis.elements[2][0] = array[8 + ofs];
  95. tr.basis.elements[2][1] = array[9 + ofs];
  96. tr.basis.elements[2][2] = array[10 + ofs];
  97. tr.origin.x = array[3 + ofs];
  98. tr.origin.y = array[7 + ofs];
  99. tr.origin.z = array[11 + ofs];
  100. return tr;
  101. }
  102. /* STRUCTURES */
  103. Transform Collada::Node::compute_transform(Collada &state) const {
  104. Transform xform;
  105. for (int i = 0; i < xform_list.size(); i++) {
  106. Transform xform_step;
  107. const XForm &xf = xform_list[i];
  108. switch (xf.op) {
  109. case XForm::OP_ROTATE: {
  110. if (xf.data.size() >= 4) {
  111. xform_step.rotate(Vector3(xf.data[0], xf.data[1], xf.data[2]), Math::deg2rad(xf.data[3]));
  112. }
  113. } break;
  114. case XForm::OP_SCALE: {
  115. if (xf.data.size() >= 3) {
  116. xform_step.scale(Vector3(xf.data[0], xf.data[1], xf.data[2]));
  117. }
  118. } break;
  119. case XForm::OP_TRANSLATE: {
  120. if (xf.data.size() >= 3) {
  121. xform_step.origin = Vector3(xf.data[0], xf.data[1], xf.data[2]);
  122. }
  123. } break;
  124. case XForm::OP_MATRIX: {
  125. if (xf.data.size() >= 16) {
  126. xform_step = _read_transform_from_array(xf.data, 0);
  127. }
  128. } break;
  129. default: {
  130. }
  131. }
  132. xform = xform * xform_step;
  133. }
  134. #ifdef COLLADA_IMPORT_SCALE_SCENE
  135. xform.origin *= state.state.unit_scale;
  136. #endif
  137. return xform;
  138. }
  139. Transform Collada::Node::get_transform() const {
  140. return default_transform;
  141. }
  142. Transform Collada::Node::get_global_transform() const {
  143. if (parent)
  144. return parent->get_global_transform() * default_transform;
  145. else
  146. return default_transform;
  147. }
  148. Vector<float> Collada::AnimationTrack::get_value_at_time(float p_time) const {
  149. ERR_FAIL_COND_V(keys.size() == 0, Vector<float>());
  150. int i = 0;
  151. for (i = 0; i < keys.size(); i++) {
  152. if (keys[i].time > p_time)
  153. break;
  154. }
  155. if (i == 0)
  156. return keys[0].data;
  157. if (i == keys.size())
  158. return keys[keys.size() - 1].data;
  159. switch (keys[i].interp_type) {
  160. case INTERP_BEZIER: //wait for bezier
  161. case INTERP_LINEAR: {
  162. float c = (p_time - keys[i - 1].time) / (keys[i].time - keys[i - 1].time);
  163. if (keys[i].data.size() == 16) {
  164. //interpolate a matrix
  165. Transform src = _read_transform_from_array(keys[i - 1].data);
  166. Transform dst = _read_transform_from_array(keys[i].data);
  167. Transform interp = c < 0.001 ? src : src.interpolate_with(dst, c);
  168. Vector<float> ret;
  169. ret.resize(16);
  170. Transform tr;
  171. // i wonder why collada matrices are transposed, given that's opposed to opengl..
  172. ret.write[0] = interp.basis.elements[0][0];
  173. ret.write[1] = interp.basis.elements[0][1];
  174. ret.write[2] = interp.basis.elements[0][2];
  175. ret.write[4] = interp.basis.elements[1][0];
  176. ret.write[5] = interp.basis.elements[1][1];
  177. ret.write[6] = interp.basis.elements[1][2];
  178. ret.write[8] = interp.basis.elements[2][0];
  179. ret.write[9] = interp.basis.elements[2][1];
  180. ret.write[10] = interp.basis.elements[2][2];
  181. ret.write[3] = interp.origin.x;
  182. ret.write[7] = interp.origin.y;
  183. ret.write[11] = interp.origin.z;
  184. ret.write[12] = 0;
  185. ret.write[13] = 0;
  186. ret.write[14] = 0;
  187. ret.write[15] = 1;
  188. return ret;
  189. } else {
  190. Vector<float> dest;
  191. dest.resize(keys[i].data.size());
  192. for (int j = 0; j < dest.size(); j++) {
  193. dest.write[j] = keys[i].data[j] * c + keys[i - 1].data[j] * (1.0 - c);
  194. }
  195. return dest;
  196. //interpolate one by one
  197. }
  198. } break;
  199. }
  200. ERR_FAIL_V(Vector<float>());
  201. }
  202. void Collada::_parse_asset(XMLParser &parser) {
  203. while (parser.read() == OK) {
  204. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  205. String name = parser.get_node_name();
  206. if (name == "up_axis") {
  207. parser.read();
  208. if (parser.get_node_data() == "X_UP")
  209. state.up_axis = Vector3::AXIS_X;
  210. if (parser.get_node_data() == "Y_UP")
  211. state.up_axis = Vector3::AXIS_Y;
  212. if (parser.get_node_data() == "Z_UP")
  213. state.up_axis = Vector3::AXIS_Z;
  214. COLLADA_PRINT("up axis: " + parser.get_node_data());
  215. } else if (name == "unit") {
  216. state.unit_scale = parser.get_attribute_value("meter").to_double();
  217. COLLADA_PRINT("unit scale: " + rtos(state.unit_scale));
  218. }
  219. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "asset")
  220. break; //end of <asset>
  221. }
  222. }
  223. void Collada::_parse_image(XMLParser &parser) {
  224. String id = parser.get_attribute_value("id");
  225. if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
  226. if (!parser.is_empty())
  227. parser.skip_section();
  228. return;
  229. }
  230. Image image;
  231. if (state.version < State::Version(1, 4, 0)) {
  232. /* <1.4 */
  233. String path = parser.get_attribute_value("source").strip_edges();
  234. if (path.find("://") == -1 && path.is_rel_path()) {
  235. // path is relative to file being loaded, so convert to a resource path
  236. image.path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().plus_file(path.percent_decode()));
  237. }
  238. } else {
  239. while (parser.read() == OK) {
  240. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  241. String name = parser.get_node_name();
  242. if (name == "init_from") {
  243. parser.read();
  244. String path = parser.get_node_data().strip_edges().percent_decode();
  245. if (path.find("://") == -1 && path.is_rel_path()) {
  246. // path is relative to file being loaded, so convert to a resource path
  247. path = ProjectSettings::get_singleton()->localize_path(state.local_path.get_base_dir().plus_file(path));
  248. } else if (path.find("file:///") == 0) {
  249. path = path.replace_first("file:///", "");
  250. path = ProjectSettings::get_singleton()->localize_path(path);
  251. }
  252. image.path = path;
  253. } else if (name == "data") {
  254. ERR_PRINT("COLLADA Embedded image data not supported!");
  255. } else if (name == "extra" && !parser.is_empty())
  256. parser.skip_section();
  257. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "image")
  258. break; //end of <asset>
  259. }
  260. }
  261. state.image_map[id] = image;
  262. }
  263. void Collada::_parse_material(XMLParser &parser) {
  264. if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
  265. if (!parser.is_empty())
  266. parser.skip_section();
  267. return;
  268. }
  269. Material material;
  270. String id = parser.get_attribute_value("id");
  271. if (parser.has_attribute("name"))
  272. material.name = parser.get_attribute_value("name");
  273. if (state.version < State::Version(1, 4, 0)) {
  274. /* <1.4 */
  275. ERR_PRINT("Collada Materials < 1.4 are not supported (yet)");
  276. } else {
  277. while (parser.read() == OK) {
  278. if (parser.get_node_type() == XMLParser::NODE_ELEMENT && parser.get_node_name() == "instance_effect") {
  279. material.instance_effect = _uri_to_id(parser.get_attribute_value("url"));
  280. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "material")
  281. break; //end of <asset>
  282. }
  283. }
  284. state.material_map[id] = material;
  285. }
  286. //! reads floats from inside of xml element until end of xml element
  287. Vector<float> Collada::_read_float_array(XMLParser &parser) {
  288. if (parser.is_empty())
  289. return Vector<float>();
  290. Vector<String> splitters;
  291. splitters.push_back(" ");
  292. splitters.push_back("\n");
  293. splitters.push_back("\r");
  294. splitters.push_back("\t");
  295. Vector<float> array;
  296. while (parser.read() == OK) {
  297. // TODO: check for comments inside the element
  298. // and ignore them.
  299. if (parser.get_node_type() == XMLParser::NODE_TEXT) {
  300. // parse float data
  301. String str = parser.get_node_data();
  302. array = str.split_floats_mk(splitters, false);
  303. //array=str.split_floats(" ",false);
  304. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
  305. break; // end parsing text
  306. }
  307. return array;
  308. }
  309. Vector<String> Collada::_read_string_array(XMLParser &parser) {
  310. if (parser.is_empty())
  311. return Vector<String>();
  312. Vector<String> array;
  313. while (parser.read() == OK) {
  314. // TODO: check for comments inside the element
  315. // and ignore them.
  316. if (parser.get_node_type() == XMLParser::NODE_TEXT) {
  317. // parse String data
  318. String str = parser.get_node_data();
  319. array = str.split_spaces();
  320. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
  321. break; // end parsing text
  322. }
  323. return array;
  324. }
  325. Transform Collada::_read_transform(XMLParser &parser) {
  326. if (parser.is_empty())
  327. return Transform();
  328. Vector<String> array;
  329. while (parser.read() == OK) {
  330. // TODO: check for comments inside the element
  331. // and ignore them.
  332. if (parser.get_node_type() == XMLParser::NODE_TEXT) {
  333. // parse float data
  334. String str = parser.get_node_data();
  335. array = str.split_spaces();
  336. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
  337. break; // end parsing text
  338. }
  339. ERR_FAIL_COND_V(array.size() != 16, Transform());
  340. Vector<float> farr;
  341. farr.resize(16);
  342. for (int i = 0; i < 16; i++) {
  343. farr.write[i] = array[i].to_double();
  344. }
  345. return _read_transform_from_array(farr);
  346. }
  347. String Collada::_read_empty_draw_type(XMLParser &parser) {
  348. String empty_draw_type = "";
  349. if (parser.is_empty())
  350. return empty_draw_type;
  351. while (parser.read() == OK) {
  352. if (parser.get_node_type() == XMLParser::NODE_TEXT) {
  353. empty_draw_type = parser.get_node_data();
  354. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END)
  355. break; // end parsing text
  356. }
  357. return empty_draw_type;
  358. }
  359. Variant Collada::_parse_param(XMLParser &parser) {
  360. if (parser.is_empty())
  361. return Variant();
  362. String from = parser.get_node_name();
  363. Variant data;
  364. while (parser.read() == OK) {
  365. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  366. if (parser.get_node_name() == "float") {
  367. parser.read();
  368. if (parser.get_node_type() == XMLParser::NODE_TEXT) {
  369. data = parser.get_node_data().to_double();
  370. }
  371. } else if (parser.get_node_name() == "float2") {
  372. Vector<float> v2 = _read_float_array(parser);
  373. if (v2.size() >= 2) {
  374. data = Vector2(v2[0], v2[1]);
  375. }
  376. } else if (parser.get_node_name() == "float3") {
  377. Vector<float> v3 = _read_float_array(parser);
  378. if (v3.size() >= 3) {
  379. data = Vector3(v3[0], v3[1], v3[2]);
  380. }
  381. } else if (parser.get_node_name() == "float4") {
  382. Vector<float> v4 = _read_float_array(parser);
  383. if (v4.size() >= 4) {
  384. data = Color(v4[0], v4[1], v4[2], v4[3]);
  385. }
  386. } else if (parser.get_node_name() == "sampler2D") {
  387. while (parser.read() == OK) {
  388. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  389. if (parser.get_node_name() == "source") {
  390. parser.read();
  391. if (parser.get_node_type() == XMLParser::NODE_TEXT) {
  392. data = parser.get_node_data();
  393. }
  394. }
  395. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "sampler2D")
  396. break;
  397. }
  398. } else if (parser.get_node_name() == "surface") {
  399. while (parser.read() == OK) {
  400. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  401. if (parser.get_node_name() == "init_from") {
  402. parser.read();
  403. if (parser.get_node_type() == XMLParser::NODE_TEXT) {
  404. data = parser.get_node_data();
  405. }
  406. }
  407. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "surface")
  408. break;
  409. }
  410. }
  411. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == from)
  412. break;
  413. }
  414. COLLADA_PRINT("newparam ending " + parser.get_node_name());
  415. return data;
  416. }
  417. void Collada::_parse_effect_material(XMLParser &parser, Effect &effect, String &id) {
  418. if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
  419. if (!parser.is_empty())
  420. parser.skip_section();
  421. return;
  422. }
  423. while (parser.read() == OK) {
  424. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  425. // first come the tags we descend, but ignore the top-levels
  426. COLLADA_PRINT("node name: " + parser.get_node_name());
  427. if (!parser.is_empty() && (parser.get_node_name() == "profile_COMMON" || parser.get_node_name() == "technique" || parser.get_node_name() == "extra")) {
  428. _parse_effect_material(parser, effect, id); // try again
  429. } else if (parser.get_node_name() == "newparam") {
  430. String name = parser.get_attribute_value("sid");
  431. Variant value = _parse_param(parser);
  432. effect.params[name] = value;
  433. COLLADA_PRINT("param: " + name + " value:" + String(value));
  434. } else if (parser.get_node_name() == "constant" ||
  435. parser.get_node_name() == "lambert" ||
  436. parser.get_node_name() == "phong" ||
  437. parser.get_node_name() == "blinn") {
  438. COLLADA_PRINT("shade model: " + parser.get_node_name());
  439. while (parser.read() == OK) {
  440. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  441. String what = parser.get_node_name();
  442. if (what == "emission" ||
  443. what == "diffuse" ||
  444. what == "specular" ||
  445. what == "reflective") {
  446. // color or texture types
  447. while (parser.read() == OK) {
  448. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  449. if (parser.get_node_name() == "color") {
  450. Vector<float> colorarr = _read_float_array(parser);
  451. COLLADA_PRINT("colorarr size: " + rtos(colorarr.size()));
  452. if (colorarr.size() >= 3) {
  453. // alpha strangely not alright? maybe it needs to be multiplied by value as a channel intensity
  454. Color color(colorarr[0], colorarr[1], colorarr[2], 1.0);
  455. if (what == "diffuse")
  456. effect.diffuse.color = color;
  457. if (what == "specular")
  458. effect.specular.color = color;
  459. if (what == "emission")
  460. effect.emission.color = color;
  461. COLLADA_PRINT(what + " color: " + color);
  462. }
  463. } else if (parser.get_node_name() == "texture") {
  464. String sampler = parser.get_attribute_value("texture");
  465. if (!effect.params.has(sampler)) {
  466. ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
  467. } else {
  468. String surface = effect.params[sampler];
  469. if (!effect.params.has(surface)) {
  470. ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + id).utf8().get_data());
  471. } else {
  472. String uri = effect.params[surface];
  473. if (what == "diffuse") {
  474. effect.diffuse.texture = uri;
  475. } else if (what == "specular") {
  476. effect.specular.texture = uri;
  477. } else if (what == "emission") {
  478. effect.emission.texture = uri;
  479. } else if (what == "bump") {
  480. if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype") != "NORMALMAP") {
  481. WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
  482. }
  483. effect.bump.texture = uri;
  484. }
  485. COLLADA_PRINT(what + " texture: " + uri);
  486. }
  487. }
  488. } else if (!parser.is_empty())
  489. parser.skip_section();
  490. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == what)
  491. break;
  492. }
  493. } else if (what == "shininess") {
  494. effect.shininess = _parse_param(parser);
  495. }
  496. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && (parser.get_node_name() == "constant" ||
  497. parser.get_node_name() == "lambert" ||
  498. parser.get_node_name() == "phong" ||
  499. parser.get_node_name() == "blinn"))
  500. break;
  501. }
  502. } else if (parser.get_node_name() == "double_sided" || parser.get_node_name() == "show_double_sided") { // colladamax / google earth
  503. // 3DS Max / Google Earth double sided extension
  504. parser.read();
  505. effect.found_double_sided = true;
  506. effect.double_sided = parser.get_node_data().to_int();
  507. COLLADA_PRINT("double sided: " + itos(parser.get_node_data().to_int()));
  508. } else if (parser.get_node_name() == "unshaded") {
  509. parser.read();
  510. effect.unshaded = parser.get_node_data().to_int();
  511. } else if (parser.get_node_name() == "bump") {
  512. // color or texture types
  513. while (parser.read() == OK) {
  514. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  515. if (parser.get_node_name() == "texture") {
  516. String sampler = parser.get_attribute_value("texture");
  517. if (!effect.params.has(sampler)) {
  518. ERR_PRINT(String("Couldn't find sampler: " + sampler + " in material:" + id).utf8().get_data());
  519. } else {
  520. String surface = effect.params[sampler];
  521. if (!effect.params.has(surface)) {
  522. ERR_PRINT(String("Couldn't find surface: " + surface + " in material:" + id).utf8().get_data());
  523. } else {
  524. String uri = effect.params[surface];
  525. if (parser.has_attribute("bumptype") && parser.get_attribute_value("bumptype") != "NORMALMAP") {
  526. WARN_PRINT("'bump' texture type is not NORMALMAP, only NORMALMAP is supported.");
  527. }
  528. effect.bump.texture = uri;
  529. COLLADA_PRINT(" bump: " + uri);
  530. }
  531. }
  532. } else if (!parser.is_empty())
  533. parser.skip_section();
  534. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "bump")
  535. break;
  536. }
  537. } else if (!parser.is_empty())
  538. parser.skip_section();
  539. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END &&
  540. (parser.get_node_name() == "effect" ||
  541. parser.get_node_name() == "profile_COMMON" ||
  542. parser.get_node_name() == "technique" ||
  543. parser.get_node_name() == "extra"))
  544. break;
  545. }
  546. }
  547. void Collada::_parse_effect(XMLParser &parser) {
  548. if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
  549. if (!parser.is_empty())
  550. parser.skip_section();
  551. return;
  552. }
  553. String id = parser.get_attribute_value("id");
  554. Effect effect;
  555. if (parser.has_attribute("name"))
  556. effect.name = parser.get_attribute_value("name");
  557. _parse_effect_material(parser, effect, id);
  558. state.effect_map[id] = effect;
  559. COLLADA_PRINT("Effect ID:" + id);
  560. }
  561. void Collada::_parse_camera(XMLParser &parser) {
  562. if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
  563. if (!parser.is_empty())
  564. parser.skip_section();
  565. return;
  566. }
  567. String id = parser.get_attribute_value("id");
  568. state.camera_data_map[id] = CameraData();
  569. CameraData &camera = state.camera_data_map[id];
  570. while (parser.read() == OK) {
  571. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  572. String name = parser.get_node_name();
  573. if (name == "perspective") {
  574. camera.mode = CameraData::MODE_PERSPECTIVE;
  575. } else if (name == "orthographic") {
  576. camera.mode = CameraData::MODE_ORTHOGONAL;
  577. } else if (name == "xfov") {
  578. parser.read();
  579. camera.perspective.x_fov = parser.get_node_data().to_double();
  580. } else if (name == "yfov") {
  581. parser.read();
  582. camera.perspective.y_fov = parser.get_node_data().to_double();
  583. } else if (name == "xmag") {
  584. parser.read();
  585. camera.orthogonal.x_mag = parser.get_node_data().to_double();
  586. } else if (name == "ymag") {
  587. parser.read();
  588. camera.orthogonal.y_mag = parser.get_node_data().to_double();
  589. } else if (name == "aspect_ratio") {
  590. parser.read();
  591. camera.aspect = parser.get_node_data().to_double();
  592. } else if (name == "znear") {
  593. parser.read();
  594. camera.z_near = parser.get_node_data().to_double();
  595. } else if (name == "zfar") {
  596. parser.read();
  597. camera.z_far = parser.get_node_data().to_double();
  598. }
  599. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "camera")
  600. break; //end of <asset>
  601. }
  602. COLLADA_PRINT("Camera ID:" + id);
  603. }
  604. void Collada::_parse_light(XMLParser &parser) {
  605. if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
  606. if (!parser.is_empty())
  607. parser.skip_section();
  608. return;
  609. }
  610. String id = parser.get_attribute_value("id");
  611. state.light_data_map[id] = LightData();
  612. LightData &light = state.light_data_map[id];
  613. while (parser.read() == OK) {
  614. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  615. String name = parser.get_node_name();
  616. if (name == "ambient") {
  617. light.mode = LightData::MODE_AMBIENT;
  618. } else if (name == "directional") {
  619. light.mode = LightData::MODE_DIRECTIONAL;
  620. } else if (name == "point") {
  621. light.mode = LightData::MODE_OMNI;
  622. } else if (name == "spot") {
  623. light.mode = LightData::MODE_SPOT;
  624. } else if (name == "color") {
  625. parser.read();
  626. Vector<float> colorarr = _read_float_array(parser);
  627. COLLADA_PRINT("colorarr size: " + rtos(colorarr.size()));
  628. if (colorarr.size() >= 4) {
  629. // alpha strangely not alright? maybe it needs to be multiplied by value as a channel intensity
  630. Color color(colorarr[0], colorarr[1], colorarr[2], 1.0);
  631. light.color = color;
  632. }
  633. } else if (name == "constant_attenuation") {
  634. parser.read();
  635. light.constant_att = parser.get_node_data().to_double();
  636. } else if (name == "linear_attenuation") {
  637. parser.read();
  638. light.linear_att = parser.get_node_data().to_double();
  639. } else if (name == "quadratic_attenuation") {
  640. parser.read();
  641. light.quad_att = parser.get_node_data().to_double();
  642. } else if (name == "falloff_angle") {
  643. parser.read();
  644. light.spot_angle = parser.get_node_data().to_double();
  645. } else if (name == "falloff_exponent") {
  646. parser.read();
  647. light.spot_exp = parser.get_node_data().to_double();
  648. }
  649. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "light")
  650. break; //end of <asset>
  651. }
  652. COLLADA_PRINT("Light ID:" + id);
  653. }
  654. void Collada::_parse_curve_geometry(XMLParser &parser, String p_id, String p_name) {
  655. if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
  656. if (!parser.is_empty())
  657. parser.skip_section();
  658. return;
  659. }
  660. //load everything into a pre dictionary
  661. state.curve_data_map[p_id] = CurveData();
  662. CurveData &curvedata = state.curve_data_map[p_id];
  663. curvedata.name = p_name;
  664. COLLADA_PRINT("curve name: " + p_name);
  665. String current_source;
  666. // handles geometry node and the curve children in this loop
  667. // read sources with arrays and accessor for each curve
  668. if (parser.is_empty()) {
  669. return;
  670. }
  671. while (parser.read() == OK) {
  672. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  673. String section = parser.get_node_name();
  674. if (section == "source") {
  675. String id = parser.get_attribute_value("id");
  676. curvedata.sources[id] = CurveData::Source();
  677. current_source = id;
  678. COLLADA_PRINT("source data: " + id);
  679. } else if (section == "float_array" || section == "array") {
  680. // create a new array and read it.
  681. if (curvedata.sources.has(current_source)) {
  682. curvedata.sources[current_source].array = _read_float_array(parser);
  683. COLLADA_PRINT("section: " + current_source + " read " + itos(curvedata.sources[current_source].array.size()) + " values.");
  684. }
  685. } else if (section == "Name_array") {
  686. // create a new array and read it.
  687. if (curvedata.sources.has(current_source)) {
  688. curvedata.sources[current_source].sarray = _read_string_array(parser);
  689. COLLADA_PRINT("section: " + current_source + " read " + itos(curvedata.sources[current_source].array.size()) + " values.");
  690. }
  691. } else if (section == "technique_common") {
  692. //skip it
  693. } else if (section == "accessor") { // child of source (below a technique tag)
  694. if (curvedata.sources.has(current_source)) {
  695. curvedata.sources[current_source].stride = parser.get_attribute_value("stride").to_int();
  696. COLLADA_PRINT("section: " + current_source + " stride " + itos(curvedata.sources[current_source].stride));
  697. }
  698. } else if (section == "control_vertices") {
  699. while (parser.read() == OK) {
  700. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  701. if (parser.get_node_name() == "input") {
  702. String semantic = parser.get_attribute_value("semantic");
  703. String source = _uri_to_id(parser.get_attribute_value("source"));
  704. curvedata.control_vertices[semantic] = source;
  705. COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
  706. }
  707. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
  708. break;
  709. }
  710. } else if (!parser.is_empty()) {
  711. parser.skip_section();
  712. }
  713. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "spline")
  714. break;
  715. }
  716. }
  717. void Collada::_parse_mesh_geometry(XMLParser &parser, String p_id, String p_name) {
  718. if (!(state.import_flags & IMPORT_FLAG_SCENE)) {
  719. if (!parser.is_empty())
  720. parser.skip_section();
  721. return;
  722. }
  723. //load everything into a pre dictionary
  724. state.mesh_data_map[p_id] = MeshData();
  725. MeshData &meshdata = state.mesh_data_map[p_id];
  726. meshdata.name = p_name;
  727. COLLADA_PRINT("mesh name: " + p_name);
  728. String current_source;
  729. // handles geometry node and the mesh children in this loop
  730. // read sources with arrays and accessor for each mesh
  731. if (parser.is_empty()) {
  732. return;
  733. }
  734. while (parser.read() == OK) {
  735. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  736. String section = parser.get_node_name();
  737. if (section == "source") {
  738. String id = parser.get_attribute_value("id");
  739. meshdata.sources[id] = MeshData::Source();
  740. current_source = id;
  741. COLLADA_PRINT("source data: " + id);
  742. } else if (section == "float_array" || section == "array") {
  743. // create a new array and read it.
  744. if (meshdata.sources.has(current_source)) {
  745. meshdata.sources[current_source].array = _read_float_array(parser);
  746. COLLADA_PRINT("section: " + current_source + " read " + itos(meshdata.sources[current_source].array.size()) + " values.");
  747. }
  748. } else if (section == "technique_common") {
  749. //skip it
  750. } else if (section == "accessor") { // child of source (below a technique tag)
  751. if (meshdata.sources.has(current_source)) {
  752. meshdata.sources[current_source].stride = parser.get_attribute_value("stride").to_int();
  753. COLLADA_PRINT("section: " + current_source + " stride " + itos(meshdata.sources[current_source].stride));
  754. }
  755. } else if (section == "vertices") {
  756. MeshData::Vertices vert;
  757. String id = parser.get_attribute_value("id");
  758. while (parser.read() == OK) {
  759. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  760. if (parser.get_node_name() == "input") {
  761. String semantic = parser.get_attribute_value("semantic");
  762. String source = _uri_to_id(parser.get_attribute_value("source"));
  763. vert.sources[semantic] = source;
  764. COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
  765. }
  766. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
  767. break;
  768. }
  769. meshdata.vertices[id] = vert;
  770. } else if (section == "triangles" || section == "polylist" || section == "polygons") {
  771. bool polygons = (section == "polygons");
  772. if (polygons) {
  773. WARN_PRINT("Primitive type \"polygons\" is not well supported (concave shapes may fail). To ensure that the geometry is properly imported, please re-export using \"triangles\" or \"polylist\".");
  774. }
  775. MeshData::Primitives prim;
  776. if (parser.has_attribute("material"))
  777. prim.material = parser.get_attribute_value("material");
  778. prim.count = parser.get_attribute_value("count").to_int();
  779. prim.vertex_size = 0;
  780. int last_ref = 0;
  781. while (parser.read() == OK) {
  782. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  783. if (parser.get_node_name() == "input") {
  784. String semantic = parser.get_attribute_value("semantic");
  785. String source = _uri_to_id(parser.get_attribute_value("source"));
  786. if (semantic == "TEXCOORD") {
  787. /*
  788. if (parser.has_attribute("set"))// a texcoord
  789. semantic+=parser.get_attribute_value("set");
  790. else
  791. semantic="TEXCOORD0";*/
  792. semantic = "TEXCOORD" + itos(last_ref++);
  793. }
  794. int offset = parser.get_attribute_value("offset").to_int();
  795. MeshData::Primitives::SourceRef sref;
  796. sref.source = source;
  797. sref.offset = offset;
  798. prim.sources[semantic] = sref;
  799. prim.vertex_size = MAX(prim.vertex_size, offset + 1);
  800. COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source + " offset: " + itos(offset));
  801. } else if (parser.get_node_name() == "p") { //indices
  802. Vector<float> values = _read_float_array(parser);
  803. if (polygons) {
  804. ERR_CONTINUE(prim.vertex_size == 0);
  805. prim.polygons.push_back(values.size() / prim.vertex_size);
  806. int from = prim.indices.size();
  807. prim.indices.resize(from + values.size());
  808. for (int i = 0; i < values.size(); i++)
  809. prim.indices.write[from + i] = values[i];
  810. } else if (prim.vertex_size > 0) {
  811. prim.indices = values;
  812. }
  813. COLLADA_PRINT("read " + itos(values.size()) + " index values");
  814. } else if (parser.get_node_name() == "vcount") { // primitive
  815. Vector<float> values = _read_float_array(parser);
  816. prim.polygons = values;
  817. COLLADA_PRINT("read " + itos(values.size()) + " polygon values");
  818. }
  819. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
  820. break;
  821. }
  822. meshdata.primitives.push_back(prim);
  823. } else if (parser.get_node_name() == "double_sided") {
  824. parser.read();
  825. meshdata.found_double_sided = true;
  826. meshdata.double_sided = parser.get_node_data().to_int();
  827. } else if (parser.get_node_name() == "polygons") {
  828. ERR_PRINT("Primitive type \"polygons\" not supported, re-export using \"polylist\" or \"triangles\".");
  829. } else if (!parser.is_empty()) {
  830. parser.skip_section();
  831. }
  832. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "mesh")
  833. break;
  834. }
  835. }
  836. void Collada::_parse_skin_controller(XMLParser &parser, String p_id) {
  837. state.skin_controller_data_map[p_id] = SkinControllerData();
  838. SkinControllerData &skindata = state.skin_controller_data_map[p_id];
  839. skindata.base = _uri_to_id(parser.get_attribute_value("source"));
  840. String current_source;
  841. while (parser.read() == OK) {
  842. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  843. String section = parser.get_node_name();
  844. if (section == "bind_shape_matrix") {
  845. skindata.bind_shape = _read_transform(parser);
  846. #ifdef COLLADA_IMPORT_SCALE_SCENE
  847. skindata.bind_shape.origin *= state.unit_scale;
  848. #endif
  849. COLLADA_PRINT("skeleton bind shape transform: " + skindata.bind_shape);
  850. } else if (section == "source") {
  851. String id = parser.get_attribute_value("id");
  852. skindata.sources[id] = SkinControllerData::Source();
  853. current_source = id;
  854. COLLADA_PRINT("source data: " + id);
  855. } else if (section == "float_array" || section == "array") {
  856. // create a new array and read it.
  857. if (skindata.sources.has(current_source)) {
  858. skindata.sources[current_source].array = _read_float_array(parser);
  859. COLLADA_PRINT("section: " + current_source + " read " + itos(skindata.sources[current_source].array.size()) + " values.");
  860. }
  861. } else if (section == "Name_array" || section == "IDREF_array") {
  862. // create a new array and read it.
  863. if (section == "IDREF_array")
  864. skindata.use_idrefs = true;
  865. if (skindata.sources.has(current_source)) {
  866. skindata.sources[current_source].sarray = _read_string_array(parser);
  867. if (section == "IDREF_array") {
  868. Vector<String> sa = skindata.sources[current_source].sarray;
  869. for (int i = 0; i < sa.size(); i++)
  870. state.idref_joints.insert(sa[i]);
  871. }
  872. COLLADA_PRINT("section: " + current_source + " read " + itos(skindata.sources[current_source].array.size()) + " values.");
  873. }
  874. } else if (section == "technique_common") {
  875. //skip it
  876. } else if (section == "accessor") { // child of source (below a technique tag)
  877. if (skindata.sources.has(current_source)) {
  878. int stride = 1;
  879. if (parser.has_attribute("stride"))
  880. stride = parser.get_attribute_value("stride").to_int();
  881. skindata.sources[current_source].stride = stride;
  882. COLLADA_PRINT("section: " + current_source + " stride " + itos(skindata.sources[current_source].stride));
  883. }
  884. } else if (section == "joints") {
  885. SkinControllerData::Joints joint;
  886. while (parser.read() == OK) {
  887. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  888. if (parser.get_node_name() == "input") {
  889. String semantic = parser.get_attribute_value("semantic");
  890. String source = _uri_to_id(parser.get_attribute_value("source"));
  891. joint.sources[semantic] = source;
  892. COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
  893. }
  894. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
  895. break;
  896. }
  897. skindata.joints = joint;
  898. } else if (section == "vertex_weights") {
  899. SkinControllerData::Weights weights;
  900. weights.count = parser.get_attribute_value("count").to_int();
  901. while (parser.read() == OK) {
  902. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  903. if (parser.get_node_name() == "input") {
  904. String semantic = parser.get_attribute_value("semantic");
  905. String source = _uri_to_id(parser.get_attribute_value("source"));
  906. int offset = parser.get_attribute_value("offset").to_int();
  907. SkinControllerData::Weights::SourceRef sref;
  908. sref.source = source;
  909. sref.offset = offset;
  910. weights.sources[semantic] = sref;
  911. COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source + " offset: " + itos(offset));
  912. } else if (parser.get_node_name() == "v") { //indices
  913. Vector<float> values = _read_float_array(parser);
  914. weights.indices = values;
  915. COLLADA_PRINT("read " + itos(values.size()) + " index values");
  916. } else if (parser.get_node_name() == "vcount") { // weightsitive
  917. Vector<float> values = _read_float_array(parser);
  918. weights.sets = values;
  919. COLLADA_PRINT("read " + itos(values.size()) + " polygon values");
  920. }
  921. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
  922. break;
  923. }
  924. skindata.weights = weights;
  925. }
  926. /*
  927. else if (!parser.is_empty())
  928. parser.skip_section();
  929. */
  930. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "skin")
  931. break;
  932. }
  933. /* STORE REST MATRICES */
  934. Vector<Transform> rests;
  935. ERR_FAIL_COND(!skindata.joints.sources.has("JOINT"));
  936. ERR_FAIL_COND(!skindata.joints.sources.has("INV_BIND_MATRIX"));
  937. String joint_arr = skindata.joints.sources["JOINT"];
  938. String ibm = skindata.joints.sources["INV_BIND_MATRIX"];
  939. ERR_FAIL_COND(!skindata.sources.has(joint_arr));
  940. ERR_FAIL_COND(!skindata.sources.has(ibm));
  941. SkinControllerData::Source &joint_source = skindata.sources[joint_arr];
  942. SkinControllerData::Source &ibm_source = skindata.sources[ibm];
  943. ERR_FAIL_COND(joint_source.sarray.size() != ibm_source.array.size() / 16);
  944. for (int i = 0; i < joint_source.sarray.size(); i++) {
  945. String name = joint_source.sarray[i];
  946. Transform xform = _read_transform_from_array(ibm_source.array, i * 16); //<- this is a mistake, it must be applied to vertices
  947. xform.affine_invert(); // inverse for rest, because it's an inverse
  948. #ifdef COLLADA_IMPORT_SCALE_SCENE
  949. xform.origin *= state.unit_scale;
  950. #endif
  951. skindata.bone_rest_map[name] = xform;
  952. }
  953. }
  954. void Collada::_parse_morph_controller(XMLParser &parser, String p_id) {
  955. state.morph_controller_data_map[p_id] = MorphControllerData();
  956. MorphControllerData &morphdata = state.morph_controller_data_map[p_id];
  957. morphdata.mesh = _uri_to_id(parser.get_attribute_value("source"));
  958. morphdata.mode = parser.get_attribute_value("method");
  959. String current_source;
  960. while (parser.read() == OK) {
  961. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  962. String section = parser.get_node_name();
  963. if (section == "source") {
  964. String id = parser.get_attribute_value("id");
  965. morphdata.sources[id] = MorphControllerData::Source();
  966. current_source = id;
  967. COLLADA_PRINT("source data: " + id);
  968. } else if (section == "float_array" || section == "array") {
  969. // create a new array and read it.
  970. if (morphdata.sources.has(current_source)) {
  971. morphdata.sources[current_source].array = _read_float_array(parser);
  972. COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values.");
  973. }
  974. } else if (section == "Name_array" || section == "IDREF_array") {
  975. // create a new array and read it.
  976. /*
  977. if (section=="IDREF_array")
  978. morphdata.use_idrefs=true;
  979. */
  980. if (morphdata.sources.has(current_source)) {
  981. morphdata.sources[current_source].sarray = _read_string_array(parser);
  982. /*
  983. if (section=="IDREF_array") {
  984. Vector<String> sa = morphdata.sources[current_source].sarray;
  985. for(int i=0;i<sa.size();i++)
  986. state.idref_joints.insert(sa[i]);
  987. }*/
  988. COLLADA_PRINT("section: " + current_source + " read " + itos(morphdata.sources[current_source].array.size()) + " values.");
  989. }
  990. } else if (section == "technique_common") {
  991. //skip it
  992. } else if (section == "accessor") { // child of source (below a technique tag)
  993. if (morphdata.sources.has(current_source)) {
  994. int stride = 1;
  995. if (parser.has_attribute("stride"))
  996. stride = parser.get_attribute_value("stride").to_int();
  997. morphdata.sources[current_source].stride = stride;
  998. COLLADA_PRINT("section: " + current_source + " stride " + itos(morphdata.sources[current_source].stride));
  999. }
  1000. } else if (section == "targets") {
  1001. while (parser.read() == OK) {
  1002. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1003. if (parser.get_node_name() == "input") {
  1004. String semantic = parser.get_attribute_value("semantic");
  1005. String source = _uri_to_id(parser.get_attribute_value("source"));
  1006. morphdata.targets[semantic] = source;
  1007. COLLADA_PRINT(section + " input semantic: " + semantic + " source: " + source);
  1008. }
  1009. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == section)
  1010. break;
  1011. }
  1012. }
  1013. /*
  1014. else if (!parser.is_empty())
  1015. parser.skip_section();
  1016. */
  1017. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "morph")
  1018. break;
  1019. }
  1020. if (morphdata.targets.has("MORPH_WEIGHT")) {
  1021. state.morph_name_map[morphdata.targets["MORPH_WEIGHT"]] = p_id;
  1022. }
  1023. }
  1024. void Collada::_parse_controller(XMLParser &parser) {
  1025. String id = parser.get_attribute_value("id");
  1026. if (parser.is_empty()) {
  1027. return;
  1028. }
  1029. while (parser.read() == OK) {
  1030. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1031. String section = parser.get_node_name();
  1032. if (section == "skin") {
  1033. _parse_skin_controller(parser, id);
  1034. } else if (section == "morph") {
  1035. _parse_morph_controller(parser, id);
  1036. }
  1037. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "controller")
  1038. break;
  1039. }
  1040. }
  1041. Collada::Node *Collada::_parse_visual_instance_geometry(XMLParser &parser) {
  1042. String type = parser.get_node_name();
  1043. NodeGeometry *geom = memnew(NodeGeometry);
  1044. geom->controller = type == "instance_controller";
  1045. geom->source = _uri_to_id(parser.get_attribute_value_safe("url"));
  1046. if (parser.is_empty()) //nothing else to parse...
  1047. return geom;
  1048. // try to find also many materials and skeletons!
  1049. while (parser.read() == OK) {
  1050. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1051. if (parser.get_node_name() == "instance_material") {
  1052. String symbol = parser.get_attribute_value("symbol");
  1053. String target = _uri_to_id(parser.get_attribute_value("target"));
  1054. NodeGeometry::Material mat;
  1055. mat.target = target;
  1056. geom->material_map[symbol] = mat;
  1057. COLLADA_PRINT("uses material: '" + target + "' on primitive'" + symbol + "'");
  1058. } else if (parser.get_node_name() == "skeleton") {
  1059. parser.read();
  1060. String uri = _uri_to_id(parser.get_node_data());
  1061. if (uri != "") {
  1062. geom->skeletons.push_back(uri);
  1063. }
  1064. }
  1065. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == type)
  1066. break;
  1067. }
  1068. if (geom->controller) {
  1069. if (geom->skeletons.empty()) {
  1070. //XSI style
  1071. if (state.skin_controller_data_map.has(geom->source)) {
  1072. SkinControllerData *skin = &state.skin_controller_data_map[geom->source];
  1073. //case where skeletons reference bones with IDREF (XSI)
  1074. ERR_FAIL_COND_V(!skin->joints.sources.has("JOINT"), geom);
  1075. String joint_arr = skin->joints.sources["JOINT"];
  1076. ERR_FAIL_COND_V(!skin->sources.has(joint_arr), geom);
  1077. Collada::SkinControllerData::Source &joint_source = skin->sources[joint_arr];
  1078. geom->skeletons = joint_source.sarray; //quite crazy, but should work.
  1079. }
  1080. }
  1081. }
  1082. return geom;
  1083. }
  1084. Collada::Node *Collada::_parse_visual_instance_camera(XMLParser &parser) {
  1085. NodeCamera *cam = memnew(NodeCamera);
  1086. cam->camera = _uri_to_id(parser.get_attribute_value_safe("url"));
  1087. if (state.up_axis == Vector3::AXIS_Z) //collada weirdness
  1088. cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
  1089. if (parser.is_empty()) //nothing else to parse...
  1090. return cam;
  1091. while (parser.read() == OK) {
  1092. if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "instance_camera")
  1093. break;
  1094. }
  1095. return cam;
  1096. }
  1097. Collada::Node *Collada::_parse_visual_instance_light(XMLParser &parser) {
  1098. NodeLight *cam = memnew(NodeLight);
  1099. cam->light = _uri_to_id(parser.get_attribute_value_safe("url"));
  1100. if (state.up_axis == Vector3::AXIS_Z) //collada weirdness
  1101. cam->post_transform.basis.rotate(Vector3(1, 0, 0), -Math_PI * 0.5);
  1102. if (parser.is_empty()) //nothing else to parse...
  1103. return cam;
  1104. while (parser.read() == OK) {
  1105. if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "instance_light")
  1106. break;
  1107. }
  1108. return cam;
  1109. }
  1110. Collada::Node *Collada::_parse_visual_node_instance_data(XMLParser &parser) {
  1111. String instance_type = parser.get_node_name();
  1112. if (instance_type == "instance_geometry" || instance_type == "instance_controller") {
  1113. return _parse_visual_instance_geometry(parser);
  1114. } else if (instance_type == "instance_camera") {
  1115. return _parse_visual_instance_camera(parser);
  1116. } else if (instance_type == "instance_light") {
  1117. return _parse_visual_instance_light(parser);
  1118. }
  1119. if (parser.is_empty()) //nothing else to parse...
  1120. return NULL;
  1121. while (parser.read() == OK) {
  1122. if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == instance_type)
  1123. break;
  1124. }
  1125. return NULL;
  1126. }
  1127. Collada::Node *Collada::_parse_visual_scene_node(XMLParser &parser) {
  1128. String name;
  1129. String id = parser.get_attribute_value_safe("id");
  1130. bool found_name = false;
  1131. if (id == "") {
  1132. id = "%NODEID%" + itos(Math::rand());
  1133. } else {
  1134. found_name = true;
  1135. }
  1136. Vector<Node::XForm> xform_list;
  1137. Vector<Node *> children;
  1138. String empty_draw_type = "";
  1139. Node *node = NULL;
  1140. name = parser.has_attribute("name") ? parser.get_attribute_value_safe("name") : parser.get_attribute_value_safe("id");
  1141. if (name == "") {
  1142. name = id;
  1143. } else {
  1144. found_name = true;
  1145. }
  1146. if ((parser.has_attribute("type") && parser.get_attribute_value("type") == "JOINT") || state.idref_joints.has(name)) {
  1147. // handle a bone
  1148. NodeJoint *joint = memnew(NodeJoint);
  1149. if (parser.has_attribute("sid")) { //bones may not have sid
  1150. joint->sid = parser.get_attribute_value("sid");
  1151. //state.bone_map[joint->sid]=joint;
  1152. } else if (state.idref_joints.has(name)) {
  1153. joint->sid = name; //kind of a cheat but..
  1154. } else if (parser.has_attribute("name")) {
  1155. joint->sid = parser.get_attribute_value_safe("name");
  1156. }
  1157. if (joint->sid != "") {
  1158. state.sid_to_node_map[joint->sid] = id;
  1159. }
  1160. node = joint;
  1161. }
  1162. while (parser.read() == OK) {
  1163. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1164. String section = parser.get_node_name();
  1165. if (section == "translate") {
  1166. Node::XForm xf;
  1167. if (parser.has_attribute("sid")) {
  1168. xf.id = parser.get_attribute_value("sid");
  1169. }
  1170. xf.op = Node::XForm::OP_TRANSLATE;
  1171. Vector<float> xlt = _read_float_array(parser);
  1172. xf.data = xlt;
  1173. xform_list.push_back(xf);
  1174. } else if (section == "rotate") {
  1175. Node::XForm xf;
  1176. if (parser.has_attribute("sid")) {
  1177. xf.id = parser.get_attribute_value("sid");
  1178. }
  1179. xf.op = Node::XForm::OP_ROTATE;
  1180. Vector<float> rot = _read_float_array(parser);
  1181. xf.data = rot;
  1182. xform_list.push_back(xf);
  1183. } else if (section == "scale") {
  1184. Node::XForm xf;
  1185. if (parser.has_attribute("sid")) {
  1186. xf.id = parser.get_attribute_value("sid");
  1187. }
  1188. xf.op = Node::XForm::OP_SCALE;
  1189. Vector<float> scale = _read_float_array(parser);
  1190. xf.data = scale;
  1191. xform_list.push_back(xf);
  1192. } else if (section == "matrix") {
  1193. Node::XForm xf;
  1194. if (parser.has_attribute("sid")) {
  1195. xf.id = parser.get_attribute_value("sid");
  1196. }
  1197. xf.op = Node::XForm::OP_MATRIX;
  1198. Vector<float> matrix = _read_float_array(parser);
  1199. xf.data = matrix;
  1200. String mtx;
  1201. for (int i = 0; i < matrix.size(); i++)
  1202. mtx += " " + rtos(matrix[i]);
  1203. xform_list.push_back(xf);
  1204. } else if (section == "visibility") {
  1205. Node::XForm xf;
  1206. if (parser.has_attribute("sid")) {
  1207. xf.id = parser.get_attribute_value("sid");
  1208. }
  1209. xf.op = Node::XForm::OP_VISIBILITY;
  1210. Vector<float> visible = _read_float_array(parser);
  1211. xf.data = visible;
  1212. xform_list.push_back(xf);
  1213. } else if (section == "empty_draw_type") {
  1214. empty_draw_type = _read_empty_draw_type(parser);
  1215. } else if (section == "technique" || section == "extra") {
  1216. } else if (section != "node") {
  1217. //usually what defines the type of node
  1218. if (section.begins_with("instance_")) {
  1219. if (!node) {
  1220. node = _parse_visual_node_instance_data(parser);
  1221. } else {
  1222. ERR_PRINT("Multiple instance_* not supported.");
  1223. }
  1224. }
  1225. } else {
  1226. /* Found a child node!! what to do..*/
  1227. Node *child = _parse_visual_scene_node(parser);
  1228. children.push_back(child);
  1229. }
  1230. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "node")
  1231. break;
  1232. }
  1233. if (!node) {
  1234. node = memnew(Node); //generic node, nothing of relevance found
  1235. }
  1236. node->noname = !found_name;
  1237. node->xform_list = xform_list;
  1238. node->children = children;
  1239. for (int i = 0; i < children.size(); i++) {
  1240. node->children[i]->parent = node;
  1241. }
  1242. node->name = name;
  1243. node->id = id;
  1244. node->empty_draw_type = empty_draw_type;
  1245. if (node->children.size() == 1) {
  1246. if (node->children[0]->noname && !node->noname) {
  1247. node->children[0]->name = node->name;
  1248. node->name = node->name + "-base";
  1249. }
  1250. }
  1251. node->default_transform = node->compute_transform(*this);
  1252. state.scene_map[id] = node;
  1253. return node;
  1254. }
  1255. void Collada::_parse_visual_scene(XMLParser &parser) {
  1256. String id = parser.get_attribute_value("id");
  1257. if (parser.is_empty()) {
  1258. return;
  1259. }
  1260. state.visual_scene_map[id] = VisualScene();
  1261. VisualScene &vscene = state.visual_scene_map[id];
  1262. if (parser.has_attribute("name"))
  1263. vscene.name = parser.get_attribute_value("name");
  1264. while (parser.read() == OK) {
  1265. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1266. String section = parser.get_node_name();
  1267. if (section == "node") {
  1268. vscene.root_nodes.push_back(_parse_visual_scene_node(parser));
  1269. }
  1270. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "visual_scene")
  1271. break;
  1272. }
  1273. COLLADA_PRINT("Scene ID:" + id);
  1274. }
  1275. void Collada::_parse_animation(XMLParser &parser) {
  1276. if (!(state.import_flags & IMPORT_FLAG_ANIMATION)) {
  1277. if (!parser.is_empty())
  1278. parser.skip_section();
  1279. return;
  1280. }
  1281. Map<String, Vector<float> > float_sources;
  1282. Map<String, Vector<String> > string_sources;
  1283. Map<String, int> source_strides;
  1284. Map<String, Map<String, String> > samplers;
  1285. Map<String, Vector<String> > source_param_names;
  1286. Map<String, Vector<String> > source_param_types;
  1287. String id = "";
  1288. if (parser.has_attribute("id"))
  1289. id = parser.get_attribute_value("id");
  1290. String current_source;
  1291. String current_sampler;
  1292. Vector<String> channel_sources;
  1293. Vector<String> channel_targets;
  1294. while (parser.read() == OK) {
  1295. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1296. String name = parser.get_node_name();
  1297. if (name == "source") {
  1298. current_source = parser.get_attribute_value("id");
  1299. source_param_names[current_source] = Vector<String>();
  1300. source_param_types[current_source] = Vector<String>();
  1301. } else if (name == "float_array") {
  1302. if (current_source != "") {
  1303. float_sources[current_source] = _read_float_array(parser);
  1304. }
  1305. } else if (name == "Name_array") {
  1306. if (current_source != "") {
  1307. string_sources[current_source] = _read_string_array(parser);
  1308. }
  1309. } else if (name == "accessor") {
  1310. if (current_source != "" && parser.has_attribute("stride")) {
  1311. source_strides[current_source] = parser.get_attribute_value("stride").to_int();
  1312. }
  1313. } else if (name == "sampler") {
  1314. current_sampler = parser.get_attribute_value("id");
  1315. samplers[current_sampler] = Map<String, String>();
  1316. } else if (name == "param") {
  1317. if (parser.has_attribute("name"))
  1318. source_param_names[current_source].push_back(parser.get_attribute_value("name"));
  1319. else
  1320. source_param_names[current_source].push_back("");
  1321. if (parser.has_attribute("type"))
  1322. source_param_types[current_source].push_back(parser.get_attribute_value("type"));
  1323. else
  1324. source_param_types[current_source].push_back("");
  1325. } else if (name == "input") {
  1326. if (current_sampler != "") {
  1327. samplers[current_sampler][parser.get_attribute_value("semantic")] = parser.get_attribute_value("source");
  1328. }
  1329. } else if (name == "channel") {
  1330. channel_sources.push_back(parser.get_attribute_value("source"));
  1331. channel_targets.push_back(parser.get_attribute_value("target"));
  1332. }
  1333. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation")
  1334. break; //end of <asset>
  1335. }
  1336. for (int i = 0; i < channel_sources.size(); i++) {
  1337. String source = _uri_to_id(channel_sources[i]);
  1338. String target = channel_targets[i];
  1339. ERR_CONTINUE(!samplers.has(source));
  1340. Map<String, String> &sampler = samplers[source];
  1341. ERR_CONTINUE(!sampler.has("INPUT")); //no input semantic? wtf?
  1342. String input_id = _uri_to_id(sampler["INPUT"]);
  1343. COLLADA_PRINT("input id is " + input_id);
  1344. ERR_CONTINUE(!float_sources.has(input_id));
  1345. ERR_CONTINUE(!sampler.has("OUTPUT"));
  1346. String output_id = _uri_to_id(sampler["OUTPUT"]);
  1347. ERR_CONTINUE(!float_sources.has(output_id));
  1348. ERR_CONTINUE(!source_param_names.has(output_id));
  1349. Vector<String> &names = source_param_names[output_id];
  1350. for (int l = 0; l < names.size(); l++) {
  1351. String name = names[l];
  1352. Vector<float> &time_keys = float_sources[input_id];
  1353. int key_count = time_keys.size();
  1354. AnimationTrack track; //begin crating track
  1355. track.id = id;
  1356. track.keys.resize(key_count);
  1357. for (int j = 0; j < key_count; j++) {
  1358. track.keys.write[j].time = time_keys[j];
  1359. state.animation_length = MAX(state.animation_length, time_keys[j]);
  1360. }
  1361. //now read actual values
  1362. int stride = 1;
  1363. if (source_strides.has(output_id))
  1364. stride = source_strides[output_id];
  1365. int output_len = stride / names.size();
  1366. ERR_CONTINUE(output_len == 0);
  1367. ERR_CONTINUE(!float_sources.has(output_id));
  1368. Vector<float> &output = float_sources[output_id];
  1369. ERR_CONTINUE_MSG((output.size() / stride) != key_count, "Wrong number of keys in output.");
  1370. for (int j = 0; j < key_count; j++) {
  1371. track.keys.write[j].data.resize(output_len);
  1372. for (int k = 0; k < output_len; k++)
  1373. track.keys.write[j].data.write[k] = output[l + j * stride + k]; //super weird but should work:
  1374. }
  1375. if (sampler.has("INTERPOLATION")) {
  1376. String interp_id = _uri_to_id(sampler["INTERPOLATION"]);
  1377. ERR_CONTINUE(!string_sources.has(interp_id));
  1378. Vector<String> &interps = string_sources[interp_id];
  1379. ERR_CONTINUE(interps.size() != key_count);
  1380. for (int j = 0; j < key_count; j++) {
  1381. if (interps[j] == "BEZIER")
  1382. track.keys.write[j].interp_type = AnimationTrack::INTERP_BEZIER;
  1383. else
  1384. track.keys.write[j].interp_type = AnimationTrack::INTERP_LINEAR;
  1385. }
  1386. }
  1387. if (sampler.has("IN_TANGENT") && sampler.has("OUT_TANGENT")) {
  1388. //bezier control points..
  1389. String intangent_id = _uri_to_id(sampler["IN_TANGENT"]);
  1390. ERR_CONTINUE(!float_sources.has(intangent_id));
  1391. Vector<float> &intangents = float_sources[intangent_id];
  1392. ERR_CONTINUE(intangents.size() != key_count * 2 * names.size());
  1393. String outangent_id = _uri_to_id(sampler["OUT_TANGENT"]);
  1394. ERR_CONTINUE(!float_sources.has(outangent_id));
  1395. Vector<float> &outangents = float_sources[outangent_id];
  1396. ERR_CONTINUE(outangents.size() != key_count * 2 * names.size());
  1397. for (int j = 0; j < key_count; j++) {
  1398. track.keys.write[j].in_tangent = Vector2(intangents[j * 2 * names.size() + 0 + l * 2], intangents[j * 2 * names.size() + 1 + l * 2]);
  1399. track.keys.write[j].out_tangent = Vector2(outangents[j * 2 * names.size() + 0 + l * 2], outangents[j * 2 * names.size() + 1 + l * 2]);
  1400. }
  1401. }
  1402. if (target.find("/") != -1) { //transform component
  1403. track.target = target.get_slicec('/', 0);
  1404. track.param = target.get_slicec('/', 1);
  1405. if (track.param.find(".") != -1)
  1406. track.component = track.param.get_slice(".", 1).to_upper();
  1407. track.param = track.param.get_slice(".", 0);
  1408. if (names.size() > 1 && track.component == "") {
  1409. //this is a guess because the collada spec is ambiguous here...
  1410. //i suppose if you have many names (outputs) you can't use a component and i should abide to that.
  1411. track.component = name;
  1412. }
  1413. } else {
  1414. track.target = target;
  1415. }
  1416. state.animation_tracks.push_back(track);
  1417. if (!state.referenced_tracks.has(target))
  1418. state.referenced_tracks[target] = Vector<int>();
  1419. state.referenced_tracks[target].push_back(state.animation_tracks.size() - 1);
  1420. if (id != "") {
  1421. if (!state.by_id_tracks.has(id))
  1422. state.by_id_tracks[id] = Vector<int>();
  1423. state.by_id_tracks[id].push_back(state.animation_tracks.size() - 1);
  1424. }
  1425. COLLADA_PRINT("loaded animation with " + itos(key_count) + " keys");
  1426. }
  1427. }
  1428. }
  1429. void Collada::_parse_animation_clip(XMLParser &parser) {
  1430. if (!(state.import_flags & IMPORT_FLAG_ANIMATION)) {
  1431. if (!parser.is_empty())
  1432. parser.skip_section();
  1433. return;
  1434. }
  1435. AnimationClip clip;
  1436. if (parser.has_attribute("name"))
  1437. clip.name = parser.get_attribute_value("name");
  1438. else if (parser.has_attribute("id"))
  1439. clip.name = parser.get_attribute_value("id");
  1440. if (parser.has_attribute("start"))
  1441. clip.begin = parser.get_attribute_value("start").to_double();
  1442. if (parser.has_attribute("end"))
  1443. clip.end = parser.get_attribute_value("end").to_double();
  1444. while (parser.read() == OK) {
  1445. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1446. String name = parser.get_node_name();
  1447. if (name == "instance_animation") {
  1448. String url = _uri_to_id(parser.get_attribute_value("url"));
  1449. clip.tracks.push_back(url);
  1450. }
  1451. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "animation_clip")
  1452. break; //end of <asset>
  1453. }
  1454. state.animation_clips.push_back(clip);
  1455. }
  1456. void Collada::_parse_scene(XMLParser &parser) {
  1457. if (parser.is_empty()) {
  1458. return;
  1459. }
  1460. while (parser.read() == OK) {
  1461. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1462. String name = parser.get_node_name();
  1463. if (name == "instance_visual_scene") {
  1464. state.root_visual_scene = _uri_to_id(parser.get_attribute_value("url"));
  1465. } else if (name == "instance_physics_scene") {
  1466. state.root_physics_scene = _uri_to_id(parser.get_attribute_value("url"));
  1467. }
  1468. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "scene")
  1469. break; //end of <asset>
  1470. }
  1471. }
  1472. void Collada::_parse_library(XMLParser &parser) {
  1473. if (parser.is_empty()) {
  1474. return;
  1475. }
  1476. while (parser.read() == OK) {
  1477. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1478. String name = parser.get_node_name();
  1479. COLLADA_PRINT("library name is: " + name);
  1480. if (name == "image") {
  1481. _parse_image(parser);
  1482. } else if (name == "material") {
  1483. _parse_material(parser);
  1484. } else if (name == "effect") {
  1485. _parse_effect(parser);
  1486. } else if (name == "camera") {
  1487. _parse_camera(parser);
  1488. } else if (name == "light") {
  1489. _parse_light(parser);
  1490. } else if (name == "geometry") {
  1491. String id = parser.get_attribute_value("id");
  1492. String name2 = parser.get_attribute_value_safe("name");
  1493. while (parser.read() == OK) {
  1494. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1495. if (parser.get_node_name() == "mesh") {
  1496. state.mesh_name_map[id] = (name2 != "") ? name2 : id;
  1497. _parse_mesh_geometry(parser, id, name2);
  1498. } else if (parser.get_node_name() == "spline") {
  1499. state.mesh_name_map[id] = (name2 != "") ? name2 : id;
  1500. _parse_curve_geometry(parser, id, name2);
  1501. } else if (!parser.is_empty())
  1502. parser.skip_section();
  1503. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name() == "geometry")
  1504. break;
  1505. }
  1506. } else if (name == "controller") {
  1507. _parse_controller(parser);
  1508. } else if (name == "animation") {
  1509. _parse_animation(parser);
  1510. } else if (name == "animation_clip") {
  1511. _parse_animation_clip(parser);
  1512. } else if (name == "visual_scene") {
  1513. COLLADA_PRINT("visual scene");
  1514. _parse_visual_scene(parser);
  1515. } else if (!parser.is_empty())
  1516. parser.skip_section();
  1517. } else if (parser.get_node_type() == XMLParser::NODE_ELEMENT_END && parser.get_node_name().begins_with("library_"))
  1518. break; //end of <asset>
  1519. }
  1520. }
  1521. void Collada::_joint_set_owner(Collada::Node *p_node, NodeSkeleton *p_owner) {
  1522. if (p_node->type == Node::TYPE_JOINT) {
  1523. NodeJoint *nj = static_cast<NodeJoint *>(p_node);
  1524. nj->owner = p_owner;
  1525. for (int i = 0; i < nj->children.size(); i++) {
  1526. _joint_set_owner(nj->children.write[i], p_owner);
  1527. }
  1528. }
  1529. }
  1530. void Collada::_create_skeletons(Collada::Node **p_node, NodeSkeleton *p_skeleton) {
  1531. Node *node = *p_node;
  1532. if (node->type == Node::TYPE_JOINT) {
  1533. if (!p_skeleton) {
  1534. // ohohohoohoo it's a joint node, time to work!
  1535. NodeSkeleton *sk = memnew(NodeSkeleton);
  1536. *p_node = sk;
  1537. sk->children.push_back(node);
  1538. sk->parent = node->parent;
  1539. node->parent = sk;
  1540. p_skeleton = sk;
  1541. }
  1542. NodeJoint *nj = static_cast<NodeJoint *>(node);
  1543. nj->owner = p_skeleton;
  1544. } else {
  1545. p_skeleton = NULL;
  1546. }
  1547. for (int i = 0; i < node->children.size(); i++) {
  1548. _create_skeletons(&node->children.write[i], p_skeleton);
  1549. }
  1550. }
  1551. bool Collada::_remove_node(Node *p_parent, Node *p_node) {
  1552. for (int i = 0; i < p_parent->children.size(); i++) {
  1553. if (p_parent->children[i] == p_node) {
  1554. p_parent->children.remove(i);
  1555. return true;
  1556. }
  1557. if (_remove_node(p_parent->children[i], p_node))
  1558. return true;
  1559. }
  1560. return false;
  1561. }
  1562. void Collada::_remove_node(VisualScene *p_vscene, Node *p_node) {
  1563. for (int i = 0; i < p_vscene->root_nodes.size(); i++) {
  1564. if (p_vscene->root_nodes[i] == p_node) {
  1565. p_vscene->root_nodes.remove(i);
  1566. return;
  1567. }
  1568. if (_remove_node(p_vscene->root_nodes[i], p_node))
  1569. return;
  1570. }
  1571. ERR_PRINT("ERROR: Not found node to remove?");
  1572. }
  1573. void Collada::_merge_skeletons(VisualScene *p_vscene, Node *p_node) {
  1574. if (p_node->type == Node::TYPE_GEOMETRY) {
  1575. NodeGeometry *gnode = static_cast<NodeGeometry *>(p_node);
  1576. if (gnode->controller) {
  1577. // recount skeletons used
  1578. Set<NodeSkeleton *> skeletons;
  1579. for (int i = 0; i < gnode->skeletons.size(); i++) {
  1580. String nodeid = gnode->skeletons[i];
  1581. ERR_CONTINUE(!state.scene_map.has(nodeid)); //weird, it should have it...
  1582. NodeJoint *nj = SAFE_CAST<NodeJoint *>(state.scene_map[nodeid]);
  1583. ERR_CONTINUE(!nj); //broken collada
  1584. ERR_CONTINUE(!nj->owner); //weird, node should have a skeleton owner
  1585. skeletons.insert(nj->owner);
  1586. }
  1587. if (skeletons.size() > 1) {
  1588. //do the merger!!
  1589. Set<NodeSkeleton *>::Element *E = skeletons.front();
  1590. NodeSkeleton *base = E->get();
  1591. for (E = E->next(); E; E = E->next()) {
  1592. NodeSkeleton *merged = E->get();
  1593. _remove_node(p_vscene, merged);
  1594. for (int i = 0; i < merged->children.size(); i++) {
  1595. _joint_set_owner(merged->children[i], base);
  1596. base->children.push_back(merged->children[i]);
  1597. merged->children[i]->parent = base;
  1598. }
  1599. merged->children.clear(); //take children from it
  1600. memdelete(merged);
  1601. }
  1602. }
  1603. }
  1604. }
  1605. for (int i = 0; i < p_node->children.size(); i++) {
  1606. _merge_skeletons(p_vscene, p_node->children[i]);
  1607. }
  1608. }
  1609. void Collada::_merge_skeletons2(VisualScene *p_vscene) {
  1610. for (Map<String, SkinControllerData>::Element *E = state.skin_controller_data_map.front(); E; E = E->next()) {
  1611. SkinControllerData &cd = E->get();
  1612. NodeSkeleton *skeleton = NULL;
  1613. for (Map<String, Transform>::Element *F = cd.bone_rest_map.front(); F; F = F->next()) {
  1614. String name;
  1615. if (!state.sid_to_node_map.has(F->key())) {
  1616. continue;
  1617. }
  1618. name = state.sid_to_node_map[F->key()];
  1619. ERR_CONTINUE(!state.scene_map.has(name));
  1620. Node *node = state.scene_map[name];
  1621. ERR_CONTINUE(node->type != Node::TYPE_JOINT);
  1622. NodeSkeleton *sk = NULL;
  1623. while (node && !sk) {
  1624. if (node->type == Node::TYPE_SKELETON) {
  1625. sk = static_cast<NodeSkeleton *>(node);
  1626. }
  1627. node = node->parent;
  1628. }
  1629. ERR_CONTINUE(!sk);
  1630. if (!skeleton) {
  1631. skeleton = sk;
  1632. continue;
  1633. }
  1634. if (skeleton != sk) {
  1635. //whoa.. wtf, merge.
  1636. _remove_node(p_vscene, sk);
  1637. for (int i = 0; i < sk->children.size(); i++) {
  1638. _joint_set_owner(sk->children[i], skeleton);
  1639. skeleton->children.push_back(sk->children[i]);
  1640. sk->children[i]->parent = skeleton;
  1641. }
  1642. sk->children.clear(); //take children from it
  1643. memdelete(sk);
  1644. }
  1645. }
  1646. }
  1647. }
  1648. bool Collada::_optimize_skeletons(VisualScene *p_vscene, Node *p_node) {
  1649. Node *node = p_node;
  1650. if (node->type == Node::TYPE_SKELETON && node->parent && node->parent->type == Node::TYPE_NODE && node->parent->children.size() == 1) {
  1651. //replace parent by this...
  1652. Node *parent = node->parent;
  1653. //i wonder if this is alright.. i think it is since created skeleton (first joint) is already animated by bone..
  1654. node->id = parent->id;
  1655. node->name = parent->name;
  1656. node->xform_list = parent->xform_list;
  1657. node->default_transform = parent->default_transform;
  1658. state.scene_map[node->id] = node;
  1659. node->parent = parent->parent;
  1660. if (parent->parent) {
  1661. Node *gp = parent->parent;
  1662. bool found = false;
  1663. for (int i = 0; i < gp->children.size(); i++) {
  1664. if (gp->children[i] == parent) {
  1665. gp->children.write[i] = node;
  1666. found = true;
  1667. break;
  1668. }
  1669. }
  1670. if (!found) {
  1671. ERR_PRINT("BUG");
  1672. }
  1673. } else {
  1674. bool found = false;
  1675. for (int i = 0; i < p_vscene->root_nodes.size(); i++) {
  1676. if (p_vscene->root_nodes[i] == parent) {
  1677. p_vscene->root_nodes.write[i] = node;
  1678. found = true;
  1679. break;
  1680. }
  1681. }
  1682. if (!found) {
  1683. ERR_PRINT("BUG");
  1684. }
  1685. }
  1686. parent->children.clear();
  1687. memdelete(parent);
  1688. return true;
  1689. }
  1690. for (int i = 0; i < node->children.size(); i++) {
  1691. if (_optimize_skeletons(p_vscene, node->children[i]))
  1692. return false; //stop processing, go up
  1693. }
  1694. return false;
  1695. }
  1696. bool Collada::_move_geometry_to_skeletons(VisualScene *p_vscene, Node *p_node, List<Node *> *p_mgeom) {
  1697. // Bind Shape Matrix scales the bones and makes them gigantic, so the matrix then shrinks the model?
  1698. // Solution: apply the Bind Shape Matrix to the VERTICES, and if the object comes scaled, it seems to be left alone!
  1699. if (p_node->type == Node::TYPE_GEOMETRY) {
  1700. NodeGeometry *ng = static_cast<NodeGeometry *>(p_node);
  1701. if (ng->ignore_anim)
  1702. return false; //already made child of skeleton and processeg
  1703. if (ng->controller && ng->skeletons.size()) {
  1704. String nodeid = ng->skeletons[0];
  1705. ERR_FAIL_COND_V(!state.scene_map.has(nodeid), false); //weird, it should have it...
  1706. NodeJoint *nj = SAFE_CAST<NodeJoint *>(state.scene_map[nodeid]);
  1707. ERR_FAIL_COND_V(!nj, false);
  1708. ERR_FAIL_COND_V(!nj->owner, false); //weird, node should have a skeleton owner
  1709. NodeSkeleton *sk = nj->owner;
  1710. Node *p = sk->parent;
  1711. bool node_is_parent_of_skeleton = false;
  1712. while (p) {
  1713. if (p == p_node) {
  1714. node_is_parent_of_skeleton = true;
  1715. break;
  1716. }
  1717. p = p->parent; // try again
  1718. }
  1719. ERR_FAIL_COND_V(node_is_parent_of_skeleton, false);
  1720. //this should be correct
  1721. ERR_FAIL_COND_V(!state.skin_controller_data_map.has(ng->source), false);
  1722. SkinControllerData &skin = state.skin_controller_data_map[ng->source];
  1723. Transform skel_inv = sk->get_global_transform().affine_inverse();
  1724. p_node->default_transform = skel_inv * (skin.bind_shape /* p_node->get_global_transform()*/); // i honestly have no idea what to do with a previous model xform.. most exporters ignore it
  1725. //make rests relative to the skeleton (they seem to be always relative to world)
  1726. for (Map<String, Transform>::Element *E = skin.bone_rest_map.front(); E; E = E->next()) {
  1727. E->get() = skel_inv * E->get(); //make the bone rest local to the skeleton
  1728. state.bone_rest_map[E->key()] = E->get(); // make it remember where the bone is globally, now that it's relative
  1729. }
  1730. //but most exporters seem to work only if i do this..
  1731. //p_node->default_transform = p_node->get_global_transform();
  1732. //p_node->default_transform=Transform(); //this seems to be correct, because bind shape makes the object local to the skeleton
  1733. p_node->ignore_anim = true; // collada may animate this later, if it does, then this is not supported (redo your original asset and don't animate the base mesh)
  1734. p_node->parent = sk;
  1735. //sk->children.push_back(0,p_node); //avoid INFINITE loop
  1736. p_mgeom->push_back(p_node);
  1737. return true;
  1738. }
  1739. }
  1740. for (int i = 0; i < p_node->children.size(); i++) {
  1741. if (_move_geometry_to_skeletons(p_vscene, p_node->children[i], p_mgeom)) {
  1742. p_node->children.remove(i);
  1743. i--;
  1744. }
  1745. }
  1746. return false;
  1747. }
  1748. void Collada::_find_morph_nodes(VisualScene *p_vscene, Node *p_node) {
  1749. if (p_node->type == Node::TYPE_GEOMETRY) {
  1750. NodeGeometry *nj = static_cast<NodeGeometry *>(p_node);
  1751. if (nj->controller) {
  1752. String base = nj->source;
  1753. while (base != "" && !state.mesh_data_map.has(base)) {
  1754. if (state.skin_controller_data_map.has(base)) {
  1755. SkinControllerData &sk = state.skin_controller_data_map[base];
  1756. base = sk.base;
  1757. } else if (state.morph_controller_data_map.has(base)) {
  1758. state.morph_ownership_map[base] = nj->id;
  1759. break;
  1760. } else {
  1761. ERR_FAIL_MSG("Invalid scene.");
  1762. }
  1763. }
  1764. }
  1765. }
  1766. for (int i = 0; i < p_node->children.size(); i++) {
  1767. _find_morph_nodes(p_vscene, p_node->children[i]);
  1768. }
  1769. }
  1770. void Collada::_optimize() {
  1771. for (Map<String, VisualScene>::Element *E = state.visual_scene_map.front(); E; E = E->next()) {
  1772. VisualScene &vs = E->get();
  1773. for (int i = 0; i < vs.root_nodes.size(); i++) {
  1774. _create_skeletons(&vs.root_nodes.write[i]);
  1775. }
  1776. for (int i = 0; i < vs.root_nodes.size(); i++) {
  1777. _merge_skeletons(&vs, vs.root_nodes[i]);
  1778. }
  1779. _merge_skeletons2(&vs);
  1780. for (int i = 0; i < vs.root_nodes.size(); i++) {
  1781. _optimize_skeletons(&vs, vs.root_nodes[i]);
  1782. }
  1783. for (int i = 0; i < vs.root_nodes.size(); i++) {
  1784. List<Node *> mgeom;
  1785. if (_move_geometry_to_skeletons(&vs, vs.root_nodes[i], &mgeom)) {
  1786. vs.root_nodes.remove(i);
  1787. i--;
  1788. }
  1789. while (!mgeom.empty()) {
  1790. Node *n = mgeom.front()->get();
  1791. n->parent->children.push_back(n);
  1792. mgeom.pop_front();
  1793. }
  1794. }
  1795. for (int i = 0; i < vs.root_nodes.size(); i++) {
  1796. _find_morph_nodes(&vs, vs.root_nodes[i]);
  1797. }
  1798. }
  1799. }
  1800. int Collada::get_uv_channel(String p_name) {
  1801. if (!channel_map.has(p_name)) {
  1802. ERR_FAIL_COND_V(channel_map.size() == 2, 0);
  1803. channel_map[p_name] = channel_map.size();
  1804. }
  1805. return channel_map[p_name];
  1806. }
  1807. Error Collada::load(const String &p_path, int p_flags) {
  1808. Ref<XMLParser> parserr = memnew(XMLParser);
  1809. XMLParser &parser = *parserr.ptr();
  1810. Error err = parser.open(p_path);
  1811. ERR_FAIL_COND_V_MSG(err, err, "Cannot open Collada file '" + p_path + "'.");
  1812. state.local_path = ProjectSettings::get_singleton()->localize_path(p_path);
  1813. state.import_flags = p_flags;
  1814. /* Skip headers */
  1815. while ((err = parser.read()) == OK) {
  1816. if (parser.get_node_type() == XMLParser::NODE_ELEMENT) {
  1817. if (parser.get_node_name() == "COLLADA") {
  1818. break;
  1819. } else if (!parser.is_empty())
  1820. parser.skip_section(); // unknown section, likely headers
  1821. }
  1822. }
  1823. ERR_FAIL_COND_V_MSG(err != OK, ERR_FILE_CORRUPT, "Corrupted Collada file '" + p_path + "'.");
  1824. /* Start loading Collada */
  1825. {
  1826. //version
  1827. String version = parser.get_attribute_value("version");
  1828. state.version.major = version.get_slice(".", 0).to_int();
  1829. state.version.minor = version.get_slice(".", 1).to_int();
  1830. state.version.rev = version.get_slice(".", 2).to_int();
  1831. COLLADA_PRINT("Collada VERSION: " + version);
  1832. }
  1833. while ((err = parser.read()) == OK) {
  1834. /* Read all the main sections.. */
  1835. if (parser.get_node_type() != XMLParser::NODE_ELEMENT)
  1836. continue; //no idea what this may be, but skipping anyway
  1837. String section = parser.get_node_name();
  1838. COLLADA_PRINT("section: " + section);
  1839. if (section == "asset") {
  1840. _parse_asset(parser);
  1841. } else if (section.begins_with("library_")) {
  1842. _parse_library(parser);
  1843. } else if (section == "scene") {
  1844. _parse_scene(parser);
  1845. } else if (!parser.is_empty()) {
  1846. parser.skip_section(); // unknown section, likely headers
  1847. }
  1848. }
  1849. _optimize();
  1850. return OK;
  1851. }
  1852. Collada::Collada() {
  1853. }