collada.cpp 71 KB

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