JSONSceneImporter.cpp 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. //
  2. // Copyright (c) 2014-2016 THUNDERBEAST GAMES LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to deal
  6. // in the Software without restriction, including without limitation the rights
  7. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. // copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20. // THE SOFTWARE.
  21. //
  22. #include <rapidjson/document.h>
  23. #include <rapidjson/stringbuffer.h>
  24. #include <rapidjson/prettywriter.h>
  25. #include <Atomic/IO/Log.h>
  26. #include <Atomic/IO/File.h>
  27. #include "JSONSceneImporter.h"
  28. using namespace rapidjson;
  29. namespace ToolCore
  30. {
  31. static unsigned char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  32. static int _base64Decode(const unsigned char *input, unsigned int input_len, unsigned char *output, unsigned int *output_len )
  33. {
  34. static char inalphabet[256], decoder[256];
  35. int i, bits, c = 0, char_count, errors = 0;
  36. unsigned int input_idx = 0;
  37. unsigned int output_idx = 0;
  38. for (i = (sizeof alphabet) - 1; i >= 0 ; i--) {
  39. inalphabet[alphabet[i]] = 1;
  40. decoder[alphabet[i]] = i;
  41. }
  42. char_count = 0;
  43. bits = 0;
  44. for( input_idx=0; input_idx < input_len ; input_idx++ ) {
  45. c = input[ input_idx ];
  46. if (c == '=')
  47. break;
  48. if (c > 255 || ! inalphabet[c])
  49. continue;
  50. bits += decoder[c];
  51. char_count++;
  52. if (char_count == 4) {
  53. output[ output_idx++ ] = (bits >> 16);
  54. output[ output_idx++ ] = ((bits >> 8) & 0xff);
  55. output[ output_idx++ ] = ( bits & 0xff);
  56. bits = 0;
  57. char_count = 0;
  58. } else {
  59. bits <<= 6;
  60. }
  61. }
  62. if( c == '=' ) {
  63. switch (char_count) {
  64. case 1:
  65. errors++;
  66. break;
  67. case 2:
  68. output[ output_idx++ ] = ( bits >> 10 );
  69. break;
  70. case 3:
  71. output[ output_idx++ ] = ( bits >> 16 );
  72. output[ output_idx++ ] = (( bits >> 8 ) & 0xff);
  73. break;
  74. }
  75. } else if ( input_idx < input_len ) {
  76. if (char_count) {
  77. errors++;
  78. }
  79. }
  80. *output_len = output_idx;
  81. return errors;
  82. }
  83. bool JSONComponent::Parse(const rapidjson::Value& value)
  84. {
  85. for (Value::ConstMemberIterator oitr = value.MemberBegin();
  86. oitr != value.MemberEnd(); ++oitr)
  87. {
  88. if (!strcmp(oitr->name.GetString(), "enabled"))
  89. {
  90. enabled_ = oitr->value.IsTrue();
  91. }
  92. }
  93. return true;
  94. }
  95. JSONTransform::JSONTransform(JSONSceneImporter* importer, const rapidjson::Value& value) :
  96. JSONComponent(importer, "Transform")
  97. {
  98. JSONComponent::Parse(value);
  99. for (Value::ConstMemberIterator oitr = value.MemberBegin();
  100. oitr != value.MemberEnd(); ++oitr)
  101. {
  102. if (!strcmp(oitr->name.GetString(), "localPosition"))
  103. {
  104. importer->ReadVector3FromArray(oitr->value, localPosition_);
  105. }
  106. else if (!strcmp(oitr->name.GetString(), "localScale"))
  107. {
  108. importer->ReadVector3FromArray(oitr->value, localScale_);
  109. }
  110. else if (!strcmp(oitr->name.GetString(), "localRotation"))
  111. {
  112. importer->ReadQuaternionFromArray(oitr->value, localRotation_);
  113. }
  114. }
  115. }
  116. JSONMeshRenderer::JSONMeshRenderer(JSONSceneImporter* importer, const rapidjson::Value& value, const char* type) :
  117. JSONComponent(importer, type)
  118. , mesh_(0)
  119. , castShadows_(false)
  120. , receiveShadows_(false)
  121. , lightmapIndex_(-1)
  122. {
  123. JSONComponent::Parse(value);
  124. for (Value::ConstMemberIterator oitr = value.MemberBegin();
  125. oitr != value.MemberEnd(); ++oitr)
  126. {
  127. if (!strcmp(oitr->name.GetString(), "mesh"))
  128. {
  129. mesh_ = importer->GetMesh(oitr->value.GetString());
  130. }
  131. else if (!strcmp(oitr->name.GetString(), "castShadows"))
  132. {
  133. castShadows_ = oitr->value.IsTrue();
  134. }
  135. else if (!strcmp(oitr->name.GetString(), "receiveShadows"))
  136. {
  137. receiveShadows_ = oitr->value.IsTrue();
  138. }
  139. else if (!strcmp(oitr->name.GetString(), "lightmapIndex"))
  140. {
  141. lightmapIndex_ = oitr->value.GetInt();
  142. }
  143. else if (!strcmp(oitr->name.GetString(), "lightmapTilingOffset"))
  144. {
  145. importer->ReadVector4FromArray(oitr->value, lightmapTilingOffset_);
  146. }
  147. else if (!strcmp(oitr->name.GetString(), "materials"))
  148. {
  149. for (Value::ConstValueIterator mitr = oitr->value.Begin(); mitr != oitr->value.End(); ++mitr)
  150. {
  151. JSONMaterial* material = importer->GetMaterial(mitr->GetString());
  152. assert(material);
  153. materials_.Push(material);
  154. }
  155. }
  156. }
  157. }
  158. JSONSkinnedMeshRenderer::JSONSkinnedMeshRenderer(JSONSceneImporter* importer, const rapidjson::Value& value) :
  159. JSONMeshRenderer(importer, value, "SkinnedMeshRenderer")
  160. {
  161. }
  162. JSONAnimation::JSONAnimation(JSONSceneImporter* importer, const rapidjson::Value& value) :
  163. JSONComponent(importer, "Animation")
  164. {
  165. JSONComponent::Parse(value);
  166. const Value::ConstMemberIterator jclips = value.FindMember("clips");
  167. assert(jclips != value.MemberEnd());
  168. for (Value::ConstValueIterator clipitr = jclips->value.Begin(); clipitr != jclips->value.End(); ++clipitr)
  169. {
  170. const Value::ConstMemberIterator clipname = clipitr->FindMember("name");
  171. const Value::ConstMemberIterator clipnodes = clipitr->FindMember("nodes");
  172. AnimationClip* aclip = new AnimationClip();
  173. aclip->name_ = clipname->value.GetString();
  174. for (Value::ConstValueIterator nodeitr = clipnodes->value.Begin(); nodeitr != clipnodes->value.End(); ++nodeitr)
  175. {
  176. AnimationNode* node = new AnimationNode();
  177. const Value::ConstMemberIterator nodename = nodeitr->FindMember("name");
  178. const Value::ConstMemberIterator keyframes = nodeitr->FindMember("keyframes");
  179. node->name_ = nodename->value.GetString();
  180. for (Value::ConstValueIterator keyitr = keyframes->value.Begin(); keyitr != keyframes->value.End(); ++keyitr)
  181. {
  182. Keyframe* keyframe = new Keyframe();
  183. const Value::ConstMemberIterator jpos = keyitr->FindMember("pos");
  184. const Value::ConstMemberIterator jscale = keyitr->FindMember("scale");
  185. const Value::ConstMemberIterator jrot = keyitr->FindMember("rot");
  186. const Value::ConstMemberIterator jtime = keyitr->FindMember("time");
  187. keyframe->time_ = (float) jtime->value.GetDouble();
  188. importer_->ReadVector3FromArray(jpos->value, keyframe->pos_);
  189. importer_->ReadVector3FromArray(jscale->value, keyframe->scale_);
  190. importer_->ReadQuaternionFromArray(jrot->value, keyframe->rot_);
  191. node->keyframes_.Push(keyframe);
  192. }
  193. aclip->nodes_.Push(node);
  194. }
  195. clips_.Push(aclip);
  196. }
  197. }
  198. JSONTimeOfDay::JSONTimeOfDay(JSONSceneImporter* importer, const rapidjson::Value& value) :
  199. JSONComponent(importer, "TimeOfDay"),
  200. timeOn_(0),
  201. timeOff_(0)
  202. {
  203. JSONComponent::Parse(value);
  204. const Value::ConstMemberIterator jtimeOn = value.FindMember("timeOn");
  205. if (jtimeOn != value.MemberEnd())
  206. timeOn_ = (float) jtimeOn->value.GetDouble();
  207. const Value::ConstMemberIterator jtimeOff = value.FindMember("timeOff");
  208. if (jtimeOff != value.MemberEnd())
  209. timeOff_ = (float) jtimeOff->value.GetDouble();
  210. }
  211. JSONLight::JSONLight(JSONSceneImporter* importer, const rapidjson::Value& value) :
  212. JSONComponent(importer, "Light"),
  213. lightType_("Point"),
  214. range_(10),
  215. color_(1, 1, 1, 1),
  216. castsShadows_(false),
  217. realtime_(false)
  218. {
  219. JSONComponent::Parse(value);
  220. const Value::ConstMemberIterator jlightType = value.FindMember("lightType");
  221. if (jlightType != value.MemberEnd())
  222. lightType_ = jlightType->value.GetString();
  223. const Value::ConstMemberIterator jrange = value.FindMember("range");
  224. if (jrange != value.MemberEnd())
  225. range_ = (float) jrange->value.GetDouble();
  226. const Value::ConstMemberIterator jcolor = value.FindMember("color");
  227. if (jcolor != value.MemberEnd())
  228. importer->ReadColorFromArray(jcolor->value, color_);
  229. const Value::ConstMemberIterator jcastsShadows = value.FindMember("castsShadows");
  230. if (jcastsShadows != value.MemberEnd())
  231. castsShadows_ = jcastsShadows->value.GetBool();
  232. const Value::ConstMemberIterator jrealtime = value.FindMember("realtime");
  233. if (jrealtime != value.MemberEnd())
  234. realtime_ = jrealtime->value.GetBool();
  235. }
  236. JSONRigidBody::JSONRigidBody(JSONSceneImporter* importer, const rapidjson::Value& value) :
  237. JSONComponent(importer, "RigidBody"),
  238. mass_(0)
  239. {
  240. JSONComponent::Parse(value);
  241. const Value::ConstMemberIterator jmass = value.FindMember("mass");
  242. if (jmass != value.MemberEnd())
  243. mass_ = (float) jmass->value.GetDouble();
  244. }
  245. JSONMeshCollider::JSONMeshCollider(JSONSceneImporter* importer, const rapidjson::Value& value) :
  246. JSONComponent(importer, "MeshCollider")
  247. {
  248. JSONComponent::Parse(value);
  249. }
  250. JSONBoxCollider::JSONBoxCollider(JSONSceneImporter* importer, const rapidjson::Value& value) :
  251. JSONComponent(importer, "BoxCollider")
  252. {
  253. JSONComponent::Parse(value);
  254. const Value::ConstMemberIterator jcenter= value.FindMember("center");
  255. if (jcenter != value.MemberEnd())
  256. importer->ReadVector3FromArray(jcenter->value, center_);
  257. const Value::ConstMemberIterator jsize= value.FindMember("size");
  258. if (jsize != value.MemberEnd())
  259. importer->ReadVector3FromArray(jsize->value, size_);
  260. }
  261. JSONTerrain::JSONTerrain(JSONSceneImporter* importer, const rapidjson::Value& value) :
  262. JSONComponent(importer, "Terrain")
  263. , heightmapHeight_(0)
  264. , heightmapWidth_(0)
  265. , heightmapResolution_(0)
  266. , alphamapWidth_(0)
  267. , alphamapHeight_(0)
  268. , alphamapLayers_(0)
  269. , alphaMapLength_(0)
  270. , heightMapLength_(0)
  271. {
  272. JSONComponent::Parse(value);
  273. String base64Height;
  274. String base64Alpha;
  275. for (Value::ConstMemberIterator oitr = value.MemberBegin();
  276. oitr != value.MemberEnd(); ++oitr)
  277. {
  278. if (!strcmp(oitr->name.GetString(), "heightmapHeight"))
  279. {
  280. heightmapHeight_ = oitr->value.GetInt();
  281. }
  282. else if (!strcmp(oitr->name.GetString(), "heightmapWidth"))
  283. {
  284. heightmapWidth_ = oitr->value.GetInt();
  285. }
  286. else if (!strcmp(oitr->name.GetString(), "heightmapResolution"))
  287. {
  288. heightmapResolution_ = oitr->value.GetInt();
  289. }
  290. else if (!strcmp(oitr->name.GetString(), "alphamapWidth"))
  291. {
  292. alphamapWidth_ = oitr->value.GetInt();
  293. }
  294. else if (!strcmp(oitr->name.GetString(), "alphamapHeight"))
  295. {
  296. alphamapHeight_ = oitr->value.GetInt();
  297. }
  298. else if (!strcmp(oitr->name.GetString(), "alphamapLayers"))
  299. {
  300. alphamapLayers_ = oitr->value.GetInt();
  301. }
  302. else if (!strcmp(oitr->name.GetString(), "base64HeightLength"))
  303. {
  304. heightMapLength_ = oitr->value.GetInt();
  305. }
  306. else if (!strcmp(oitr->name.GetString(), "base64AlphaLength"))
  307. {
  308. alphaMapLength_ = oitr->value.GetInt();
  309. }
  310. else if (!strcmp(oitr->name.GetString(), "base64Height"))
  311. {
  312. base64Height = oitr->value.GetString();
  313. }
  314. else if (!strcmp(oitr->name.GetString(), "base64Alpha"))
  315. {
  316. base64Alpha = oitr->value.GetString();
  317. }
  318. else if (!strcmp(oitr->name.GetString(), "heightmapScale"))
  319. {
  320. importer->ReadVector3FromArray(oitr->value, heightmapScale_);
  321. }
  322. else if (!strcmp(oitr->name.GetString(), "size"))
  323. {
  324. importer->ReadVector3FromArray(oitr->value, size_);
  325. }
  326. }
  327. heightMap_ = new float[heightMapLength_];
  328. alphaMap_ = new float[alphaMapLength_];
  329. unsigned int length = 0;
  330. int errors;
  331. errors = _base64Decode((const unsigned char*)base64Height.CString(), base64Height.Length(), (unsigned char*) heightMap_.Get(), &length);
  332. assert(!errors);
  333. assert(length == heightMapLength_);
  334. length = 0;
  335. errors = _base64Decode((const unsigned char*)base64Alpha.CString(), base64Alpha.Length(), (unsigned char*) alphaMap_.Get(), &length);
  336. assert(!errors);
  337. assert(length == alphaMapLength_);
  338. }
  339. JSONCamera::JSONCamera(JSONSceneImporter* importer, const rapidjson::Value& value) :
  340. JSONComponent(importer, "Camera")
  341. {
  342. JSONComponent::Parse(value);
  343. }
  344. JSONNode::JSONNode(JSONSceneImporter* importer, const rapidjson::Value& value) : importer_(importer)
  345. {
  346. for (Value::ConstMemberIterator oitr = value.MemberBegin();
  347. oitr != value.MemberEnd(); ++oitr)
  348. {
  349. if (!strcmp(oitr->name.GetString(), "name"))
  350. {
  351. name_ = oitr->value.GetString();
  352. }
  353. else if (!strcmp(oitr->name.GetString(), "children"))
  354. {
  355. for (Value::ConstValueIterator citr = oitr->value.Begin(); citr != oitr->value.End(); ++citr)
  356. {
  357. if (!citr->IsObject())
  358. continue;
  359. AddChild(new JSONNode(importer, *citr));
  360. }
  361. }
  362. else if (!strcmp(oitr->name.GetString(), "components"))
  363. {
  364. for (Value::ConstValueIterator citr = oitr->value.Begin(); citr != oitr->value.End(); ++citr)
  365. {
  366. if (!citr->IsObject())
  367. continue;
  368. const Value::ConstMemberIterator jtype = citr->FindMember("type");
  369. if (jtype == value.MemberEnd())
  370. continue;
  371. String type = jtype->value.GetString();
  372. if (type == "Transform")
  373. {
  374. components_.Push(new JSONTransform(importer_, *citr));
  375. }
  376. else if (type == "MeshRenderer")
  377. {
  378. components_.Push(new JSONMeshRenderer(importer_, *citr));
  379. }
  380. else if (type == "SkinnedMeshRenderer")
  381. {
  382. components_.Push(new JSONSkinnedMeshRenderer(importer_, *citr));
  383. }
  384. else if (type == "Animation")
  385. {
  386. components_.Push(new JSONAnimation(importer_, *citr));
  387. }
  388. else if (type == "Camera")
  389. {
  390. components_.Push(new JSONCamera(importer_, *citr));
  391. }
  392. else if (type == "Terrain")
  393. {
  394. components_.Push(new JSONTerrain(importer_, *citr));
  395. }
  396. else if (type == "RigidBody")
  397. {
  398. components_.Push(new JSONRigidBody(importer_, *citr));
  399. }
  400. else if (type == "MeshCollider")
  401. {
  402. components_.Push(new JSONMeshCollider(importer_, *citr));
  403. }
  404. else if (type == "BoxCollider")
  405. {
  406. components_.Push(new JSONBoxCollider(importer_, *citr));
  407. }
  408. else if (type == "Light")
  409. {
  410. components_.Push(new JSONLight(importer_, *citr));
  411. }
  412. else if (type == "TimeOfDay")
  413. {
  414. components_.Push(new JSONTimeOfDay(importer_, *citr));
  415. }
  416. }
  417. }
  418. }
  419. }
  420. JSONSceneImporter::JSONSceneImporter(Context* context) : Importer(context)
  421. , document_(new Document())
  422. {
  423. }
  424. void JSONSceneImporter::ReadColorFromArray(const rapidjson::Value& value, Color& color)
  425. {
  426. if (!value.IsArray() || (value.Size() < 3 || value.Size() > 4))
  427. return;
  428. color.r_ = color.g_ = color.b_ = color.a_ = 1.0f;
  429. color.r_ = (float) value[SizeType(0)].GetDouble();
  430. color.g_ = (float) value[SizeType(1)].GetDouble();
  431. color.b_ = (float) value[SizeType(2)].GetDouble();
  432. if (value.Size() == 4)
  433. color.a_ = (float) value[SizeType(3)].GetDouble();
  434. }
  435. void JSONSceneImporter::ReadVector2FromArray(const rapidjson::Value& value, Vector2& v)
  436. {
  437. if (!value.IsArray() || value.Size() != 2)
  438. return;
  439. v.x_ = (float) value[SizeType(0)].GetDouble();
  440. v.y_ = (float) value[SizeType(1)].GetDouble();
  441. }
  442. void JSONSceneImporter::ReadVector3FromArray(const rapidjson::Value& value, Vector3& v)
  443. {
  444. if (!value.IsArray() || value.Size() != 3)
  445. return;
  446. v.x_ = (float) value[SizeType(0)].GetDouble();
  447. v.y_ = (float) value[SizeType(1)].GetDouble();
  448. v.z_ = (float) value[SizeType(2)].GetDouble();
  449. }
  450. void JSONSceneImporter::ReadVector4FromArray(const rapidjson::Value& value, Vector4& v)
  451. {
  452. if (!value.IsArray() || value.Size() != 4)
  453. return;
  454. v.x_ = (float) value[SizeType(0)].GetDouble();
  455. v.y_ = (float) value[SizeType(1)].GetDouble();
  456. v.z_ = (float) value[SizeType(2)].GetDouble();
  457. v.w_ = (float) value[SizeType(3)].GetDouble();
  458. }
  459. void JSONSceneImporter::ReadQuaternionFromArray(const rapidjson::Value& value, Quaternion& q)
  460. {
  461. if (!value.IsArray() || value.Size() != 4)
  462. return;
  463. q.x_ = (float) value[SizeType(0)].GetDouble();
  464. q.y_ = (float) value[SizeType(1)].GetDouble();
  465. q.z_ = (float) value[SizeType(2)].GetDouble();
  466. q.w_ = (float) value[SizeType(3)].GetDouble();
  467. }
  468. void JSONSceneImporter::ReadMatrix4FromArray(const rapidjson::Value& value, Matrix4& m)
  469. {
  470. if (!value.IsArray() || value.Size() != 16)
  471. return;
  472. float mf[16];
  473. for (SizeType i = 0; i < 16; i++)
  474. mf[i] = (float) value[i].GetDouble();
  475. m = Matrix4(mf);
  476. }
  477. bool JSONSceneImporter::ParseMaterials(const rapidjson::Value& value)
  478. {
  479. const Value::ConstMemberIterator jmaterials = value.FindMember("materials");
  480. if (jmaterials != value.MemberEnd() && jmaterials->value.IsArray())
  481. {
  482. for (Value::ConstValueIterator itr = jmaterials->value.Begin(); itr != jmaterials->value.End(); ++itr)
  483. {
  484. if (itr->IsObject())
  485. {
  486. String name = "Anonymous Material";
  487. String shader;
  488. String mainTexture;
  489. Vector2 mainTextureOffset(0.0f, 0.0f);
  490. Vector2 mainTextureScale(1.0f, 1.0f);
  491. int passCount = 1;
  492. int renderQueue = 0;
  493. Color color(1, 1, 1, 1);
  494. for (Value::ConstMemberIterator oitr = itr->MemberBegin();
  495. oitr != itr->MemberEnd(); ++oitr)
  496. {
  497. if (!strcmp(oitr->name.GetString(), "name"))
  498. {
  499. name = oitr->value.GetString();
  500. }
  501. else if (!strcmp(oitr->name.GetString(), "shader"))
  502. {
  503. shader = oitr->value.GetString();
  504. shader.Replace("Legacy Shaders/", "");
  505. }
  506. else if (!strcmp(oitr->name.GetString(), "mainTexture"))
  507. {
  508. mainTexture = oitr->value.GetString();
  509. }
  510. else if (!strcmp(oitr->name.GetString(), "mainTextureOffset"))
  511. {
  512. ReadVector2FromArray(oitr->value, mainTextureOffset);
  513. }
  514. else if (!strcmp(oitr->name.GetString(), "mainTextureScale"))
  515. {
  516. ReadVector2FromArray(oitr->value, mainTextureScale);
  517. }
  518. else if (!strcmp(oitr->name.GetString(), "renderQueue"))
  519. {
  520. renderQueue = oitr->value.GetInt();
  521. }
  522. else if (!strcmp(oitr->name.GetString(), "passCount"))
  523. {
  524. passCount = oitr->value.GetInt();
  525. }
  526. else if (!strcmp(oitr->name.GetString(), "color"))
  527. {
  528. ReadColorFromArray(oitr->value, color);
  529. }
  530. }
  531. JSONMaterial* material = new JSONMaterial(name);
  532. material->SetColor(color);
  533. material->SetMainTexture(mainTexture);
  534. material->SetMainTextureOffset(mainTextureOffset);
  535. material->SetMainTextureScale(mainTextureScale);
  536. material->SetPassCount(passCount);
  537. material->SetRenderQueue(renderQueue);
  538. material->SetShader(shader);
  539. AddMaterial(material);
  540. }
  541. }
  542. }
  543. return true;
  544. }
  545. bool JSONSceneImporter::ParseMeshes(const rapidjson::Value& value)
  546. {
  547. const Value::ConstMemberIterator jmeshes = value.FindMember("meshes");
  548. if (jmeshes != value.MemberEnd() && jmeshes->value.IsArray())
  549. {
  550. for (Value::ConstValueIterator itr = jmeshes->value.Begin(); itr != jmeshes->value.End(); ++itr)
  551. {
  552. if (itr->IsObject())
  553. {
  554. JSONMesh* mesh = new JSONMesh("Anonymous Mesh");
  555. for (Value::ConstMemberIterator oitr = itr->MemberBegin();
  556. oitr != itr->MemberEnd(); ++oitr)
  557. {
  558. if (!strcmp(oitr->name.GetString(), "name"))
  559. {
  560. mesh->SetName(oitr->value.GetString());
  561. }
  562. else if (!strcmp(oitr->name.GetString(), "triangles"))
  563. {
  564. if (oitr->value.IsArray())
  565. {
  566. for (Value::ConstValueIterator triangleArrayItr = oitr->value.Begin();
  567. triangleArrayItr != oitr->value.End(); ++triangleArrayItr)
  568. {
  569. PODVector<int>& triangles = mesh->AddSubMesh();
  570. for (Value::ConstValueIterator vertexItr = triangleArrayItr->Begin();
  571. vertexItr != triangleArrayItr->End(); ++vertexItr)
  572. {
  573. triangles.Push(vertexItr->GetInt());
  574. }
  575. }
  576. }
  577. }
  578. else if (!strcmp(oitr->name.GetString(), "vertexPositions"))
  579. {
  580. Vector3 pos;
  581. PODVector<Vector3>& vpos = mesh->GetVertexPositions();
  582. for (Value::ConstValueIterator vertexItr = oitr->value.Begin();
  583. vertexItr != oitr->value.End(); ++vertexItr)
  584. {
  585. ReadVector3FromArray(*vertexItr, pos);
  586. vpos.Push(pos);
  587. }
  588. }
  589. else if (!strcmp(oitr->name.GetString(), "vertexNormals"))
  590. {
  591. Vector3 pos;
  592. PODVector<Vector3>& vnorm = mesh->GetVertexNormals();
  593. for (Value::ConstValueIterator vertexItr = oitr->value.Begin();
  594. vertexItr != oitr->value.End(); ++vertexItr)
  595. {
  596. ReadVector3FromArray(*vertexItr, pos);
  597. vnorm.Push(pos);
  598. }
  599. }
  600. else if (!strcmp(oitr->name.GetString(), "vertexTangents"))
  601. {
  602. Vector4 tangent;
  603. PODVector<Vector4>& vtangents = mesh->GetVertexTangents();
  604. for (Value::ConstValueIterator vertexItr = oitr->value.Begin();
  605. vertexItr != oitr->value.End(); ++vertexItr)
  606. {
  607. ReadVector4FromArray(*vertexItr, tangent);
  608. vtangents.Push(tangent);
  609. }
  610. }
  611. else if (!strcmp(oitr->name.GetString(), "boneWeights"))
  612. {
  613. PODVector<JSONMesh::BoneWeight>& boneWeights = mesh->GetBoneWeights();
  614. for (Value::ConstValueIterator bitr = oitr->value.Begin();
  615. bitr != oitr->value.End(); ++bitr)
  616. {
  617. JSONMesh::BoneWeight bw;
  618. const Value::ConstMemberIterator indexes = bitr->FindMember("indexes");
  619. const Value::ConstMemberIterator weights = bitr->FindMember("weights");
  620. for (int i = 0; i < 4; i++)
  621. {
  622. bw.indexes_[i] = indexes->value[SizeType(i)].GetInt();
  623. bw.weights_[i] = (float) weights->value[SizeType(i)].GetDouble();
  624. }
  625. boneWeights.Push(bw);
  626. }
  627. }
  628. else if (!strcmp(oitr->name.GetString(), "rootBone"))
  629. {
  630. mesh->SetRootBone(oitr->value.GetString());
  631. }
  632. else if (!strcmp(oitr->name.GetString(), "bindPoses"))
  633. {
  634. Vector<Matrix4>& bindPoses = mesh->GetBindPoses();
  635. for (Value::ConstValueIterator bitr = oitr->value.Begin();
  636. bitr != oitr->value.End(); ++bitr)
  637. {
  638. Matrix4 m;
  639. ReadMatrix4FromArray(*bitr, m);
  640. bindPoses.Push(m);
  641. }
  642. }
  643. else if (!strcmp(oitr->name.GetString(), "bones"))
  644. {
  645. Vector<JSONMesh::Bone>& bones = mesh->GetBones();
  646. if (!oitr->value.IsNull())
  647. {
  648. for (Value::ConstValueIterator bitr = oitr->value.Begin();
  649. bitr != oitr->value.End(); ++bitr)
  650. {
  651. const Value::ConstMemberIterator pos = bitr->FindMember("localPosition");
  652. const Value::ConstMemberIterator rot = bitr->FindMember("localRotation");
  653. const Value::ConstMemberIterator scale = bitr->FindMember("localScale");
  654. const Value::ConstMemberIterator name = bitr->FindMember("name");
  655. const Value::ConstMemberIterator parentName = bitr->FindMember("parentName");
  656. JSONMesh::Bone bone;
  657. ReadVector3FromArray(pos->value, bone.pos_);
  658. ReadVector3FromArray(scale->value, bone.scale_);
  659. ReadQuaternionFromArray(rot->value, bone.rot_);
  660. bone.name_ = name->value.GetString();
  661. bone.parentName_ = parentName->value.GetString();
  662. bones.Push(bone);
  663. }
  664. }
  665. }
  666. else if (!strcmp(oitr->name.GetString(), "vertexUV") ||
  667. !strcmp(oitr->name.GetString(), "vertexUV2"))
  668. {
  669. Vector2 uv;
  670. PODVector<Vector2>& uvs = !strcmp(oitr->name.GetString(), "vertexUV") ?
  671. mesh->GetUVSet(0) : mesh->GetUVSet(1);
  672. for (Value::ConstValueIterator uvItr = oitr->value.Begin();
  673. uvItr != oitr->value.End(); ++uvItr)
  674. {
  675. ReadVector2FromArray(*uvItr, uv);
  676. uvs.Push(uv);
  677. }
  678. }
  679. }
  680. AddMesh(mesh);
  681. }
  682. }
  683. }
  684. return true;
  685. }
  686. bool JSONSceneImporter::ParseShaders(const rapidjson::Value& value)
  687. {
  688. const Value::ConstMemberIterator jshaders = value.FindMember("shaders");
  689. if (jshaders != value.MemberEnd() && jshaders->value.IsArray())
  690. {
  691. for (Value::ConstValueIterator itr = jshaders->value.Begin(); itr != jshaders->value.End(); ++itr)
  692. {
  693. if (itr->IsObject())
  694. {
  695. String name = "Anonymous Shader";
  696. int renderQueue = 0;
  697. for (Value::ConstMemberIterator oitr = itr->MemberBegin();
  698. oitr != itr->MemberEnd(); ++oitr)
  699. {
  700. if (!strcmp(oitr->name.GetString(), "name"))
  701. {
  702. name = oitr->value.GetString();
  703. }
  704. else if (!strcmp(oitr->name.GetString(), "renderQueue"))
  705. {
  706. renderQueue = oitr->value.GetInt();
  707. }
  708. }
  709. AddShader(new JSONShader(name, renderQueue));
  710. }
  711. }
  712. }
  713. return true;
  714. }
  715. bool JSONSceneImporter::ParseTextures(const rapidjson::Value& value)
  716. {
  717. const Value::ConstMemberIterator jtextures = value.FindMember("textures");
  718. if (jtextures != value.MemberEnd() && jtextures->value.IsArray())
  719. {
  720. for (Value::ConstValueIterator itr = jtextures->value.Begin(); itr != jtextures->value.End(); ++itr)
  721. {
  722. String name;
  723. String base64PNG;
  724. int base64PNGLength = 0;
  725. if (itr->IsObject())
  726. {
  727. const Value::ConstMemberIterator jname = itr->FindMember("name");
  728. if (jname != itr->MemberEnd() && jname->value.IsString())
  729. {
  730. name = jname->value.GetString();
  731. }
  732. const Value::ConstMemberIterator jbase64PNG = itr->FindMember("base64PNG");
  733. if (jbase64PNG != itr->MemberEnd())
  734. {
  735. base64PNG = jbase64PNG->value.GetString();
  736. }
  737. const Value::ConstMemberIterator jbase64PNGLength = itr->FindMember("base64PNGLength");
  738. if (jbase64PNGLength != itr->MemberEnd())
  739. {
  740. base64PNGLength = jbase64PNGLength->value.GetInt();
  741. }
  742. }
  743. SharedArrayPtr<unsigned char> pngPixels;
  744. pngPixels = new unsigned char[base64PNGLength];
  745. unsigned int length = 0;
  746. int errors = _base64Decode((const unsigned char*)base64PNG.CString(), base64PNG.Length(), pngPixels.Get(), &length);
  747. assert(!errors);
  748. assert(length == base64PNGLength);
  749. JSONTexture* texture = new JSONTexture(name);
  750. texture->SetPNGPixels(pngPixels, base64PNGLength);
  751. AddTexture(texture);
  752. }
  753. }
  754. return true;
  755. }
  756. bool JSONSceneImporter::ParseLightmaps(const rapidjson::Value& value)
  757. {
  758. const Value::ConstMemberIterator jlightmaps = value.FindMember("lightmaps");
  759. if (jlightmaps != value.MemberEnd() && jlightmaps->value.IsArray())
  760. {
  761. for (Value::ConstValueIterator itr = jlightmaps->value.Begin(); itr != jlightmaps->value.End(); ++itr)
  762. {
  763. String name;
  764. String base64PNG;
  765. int base64PNGLength = 0;
  766. if (itr->IsObject())
  767. {
  768. const Value::ConstMemberIterator jname = itr->FindMember("filename");
  769. if (jname != itr->MemberEnd() && jname->value.IsString())
  770. {
  771. name = jname->value.GetString();
  772. }
  773. const Value::ConstMemberIterator jbase64PNG = itr->FindMember("base64PNG");
  774. if (jbase64PNG != itr->MemberEnd() )
  775. {
  776. base64PNG = jbase64PNG->value.GetString();
  777. }
  778. const Value::ConstMemberIterator jbase64PNGLength = itr->FindMember("base64PNGLength");
  779. if (jbase64PNGLength != itr->MemberEnd() )
  780. {
  781. base64PNGLength = jbase64PNGLength->value.GetInt();
  782. }
  783. }
  784. SharedArrayPtr<unsigned char> pngPixels;
  785. pngPixels = new unsigned char[base64PNGLength];
  786. unsigned int length = 0;
  787. int errors = _base64Decode((const unsigned char*)base64PNG.CString(), base64PNG.Length(), pngPixels.Get(), &length);
  788. assert(!errors);
  789. assert(length == base64PNGLength);
  790. JSONLightmap* lightmap = new JSONLightmap(name);
  791. lightmap->SetPNGPixels(pngPixels, base64PNGLength);
  792. AddLightmap(lightmap);
  793. }
  794. }
  795. return true;
  796. }
  797. bool JSONSceneImporter::ParseResources(const rapidjson::Value& value)
  798. {
  799. ParseTextures(value);
  800. ParseLightmaps(value);
  801. ParseShaders(value);
  802. ParseMaterials(value);
  803. ParseMeshes(value);
  804. return true;
  805. }
  806. bool JSONSceneImporter::ParseHierarchy(const rapidjson::Value& value)
  807. {
  808. for (Value::ConstValueIterator itr = value.Begin(); itr != value.End(); ++itr)
  809. {
  810. if (itr->IsObject())
  811. {
  812. hierarchy_.Push(new JSONNode(this, *itr));
  813. }
  814. }
  815. return true;
  816. }
  817. bool JSONSceneImporter::Import(const String& path)
  818. {
  819. File jsonFile(context_, path);
  820. String json;
  821. jsonFile.ReadText(json);
  822. if (document_->Parse<0>(json.CString()).HasParseError())
  823. {
  824. ATOMIC_LOGERRORF("Could not parse JSON data from %s", path.CString());
  825. return false;
  826. }
  827. const Value::ConstMemberIterator name = document_->FindMember("name");
  828. if (name != document_->MemberEnd())
  829. sceneName_ = name->value.GetString();
  830. const Value::ConstMemberIterator jresources = document_->FindMember("resources");
  831. if (jresources != document_->MemberEnd())
  832. ParseResources(jresources->value);
  833. const Value::ConstMemberIterator jhierarchy = document_->FindMember("hierarchy");
  834. if (jhierarchy != document_->MemberEnd())
  835. ParseHierarchy(jhierarchy->value);
  836. return true;
  837. }
  838. JSONSceneImporter::~JSONSceneImporter()
  839. {
  840. if (document_)
  841. delete document_;
  842. }
  843. }