JSONSceneImporter.cpp 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  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. lightmap_(false),
  122. lightmapIndex_(-1)
  123. {
  124. JSONComponent::Parse(value);
  125. for (Value::ConstMemberIterator oitr = value.MemberBegin();
  126. oitr != value.MemberEnd(); ++oitr)
  127. {
  128. if (!strcmp(oitr->name.GetString(), "mesh"))
  129. {
  130. mesh_ = importer->GetMesh(oitr->value.GetString());
  131. }
  132. else if (!strcmp(oitr->name.GetString(), "castShadows"))
  133. {
  134. castShadows_ = oitr->value.IsTrue();
  135. }
  136. else if (!strcmp(oitr->name.GetString(), "receiveShadows"))
  137. {
  138. receiveShadows_ = oitr->value.IsTrue();
  139. }
  140. else if (!strcmp(oitr->name.GetString(), "lightmap"))
  141. {
  142. lightmap_ = oitr->value.GetBool();
  143. }
  144. else if (!strcmp(oitr->name.GetString(), "lightmapIndex"))
  145. {
  146. lightmapIndex_ = oitr->value.GetInt();
  147. }
  148. else if (!strcmp(oitr->name.GetString(), "lightmapTilingOffset"))
  149. {
  150. importer->ReadVector4FromArray(oitr->value, lightmapTilingOffset_);
  151. }
  152. else if (!strcmp(oitr->name.GetString(), "materials"))
  153. {
  154. for (Value::ConstValueIterator mitr = oitr->value.Begin(); mitr != oitr->value.End(); ++mitr)
  155. {
  156. JSONMaterial* material = importer->GetMaterial(mitr->GetString());
  157. assert(material);
  158. materials_.Push(material);
  159. }
  160. }
  161. }
  162. }
  163. JSONSkinnedMeshRenderer::JSONSkinnedMeshRenderer(JSONSceneImporter* importer, const rapidjson::Value& value) :
  164. JSONMeshRenderer(importer, value, "SkinnedMeshRenderer")
  165. {
  166. }
  167. JSONAnimation::JSONAnimation(JSONSceneImporter* importer, const rapidjson::Value& value) :
  168. JSONComponent(importer, "Animation")
  169. {
  170. JSONComponent::Parse(value);
  171. const Value::ConstMemberIterator jclips = value.FindMember("clips");
  172. assert(jclips != value.MemberEnd());
  173. for (Value::ConstValueIterator clipitr = jclips->value.Begin(); clipitr != jclips->value.End(); ++clipitr)
  174. {
  175. const Value::ConstMemberIterator clipname = clipitr->FindMember("name");
  176. const Value::ConstMemberIterator clipnodes = clipitr->FindMember("nodes");
  177. AnimationClip* aclip = new AnimationClip();
  178. aclip->name_ = clipname->value.GetString();
  179. for (Value::ConstValueIterator nodeitr = clipnodes->value.Begin(); nodeitr != clipnodes->value.End(); ++nodeitr)
  180. {
  181. AnimationNode* node = new AnimationNode();
  182. const Value::ConstMemberIterator nodename = nodeitr->FindMember("name");
  183. const Value::ConstMemberIterator keyframes = nodeitr->FindMember("keyframes");
  184. node->name_ = nodename->value.GetString();
  185. for (Value::ConstValueIterator keyitr = keyframes->value.Begin(); keyitr != keyframes->value.End(); ++keyitr)
  186. {
  187. Keyframe* keyframe = new Keyframe();
  188. const Value::ConstMemberIterator jpos = keyitr->FindMember("pos");
  189. const Value::ConstMemberIterator jscale = keyitr->FindMember("scale");
  190. const Value::ConstMemberIterator jrot = keyitr->FindMember("rot");
  191. const Value::ConstMemberIterator jtime = keyitr->FindMember("time");
  192. keyframe->time_ = (float) jtime->value.GetDouble();
  193. importer_->ReadVector3FromArray(jpos->value, keyframe->pos_);
  194. importer_->ReadVector3FromArray(jscale->value, keyframe->scale_);
  195. importer_->ReadQuaternionFromArray(jrot->value, keyframe->rot_);
  196. node->keyframes_.Push(keyframe);
  197. }
  198. aclip->nodes_.Push(node);
  199. }
  200. clips_.Push(aclip);
  201. }
  202. }
  203. JSONTimeOfDay::JSONTimeOfDay(JSONSceneImporter* importer, const rapidjson::Value& value) :
  204. JSONComponent(importer, "TimeOfDay"),
  205. timeOn_(0),
  206. timeOff_(0)
  207. {
  208. JSONComponent::Parse(value);
  209. const Value::ConstMemberIterator jtimeOn = value.FindMember("timeOn");
  210. if (jtimeOn != value.MemberEnd())
  211. timeOn_ = (float) jtimeOn->value.GetDouble();
  212. const Value::ConstMemberIterator jtimeOff = value.FindMember("timeOff");
  213. if (jtimeOff != value.MemberEnd())
  214. timeOff_ = (float) jtimeOff->value.GetDouble();
  215. }
  216. JSONLight::JSONLight(JSONSceneImporter* importer, const rapidjson::Value& value) :
  217. JSONComponent(importer, "Light"),
  218. lightType_("Point"),
  219. range_(10),
  220. color_(1, 1, 1, 1),
  221. castsShadows_(false),
  222. realtime_(false)
  223. {
  224. JSONComponent::Parse(value);
  225. const Value::ConstMemberIterator jlightType = value.FindMember("lightType");
  226. if (jlightType != value.MemberEnd())
  227. lightType_ = jlightType->value.GetString();
  228. const Value::ConstMemberIterator jrange = value.FindMember("range");
  229. if (jrange != value.MemberEnd())
  230. range_ = (float) jrange->value.GetDouble();
  231. const Value::ConstMemberIterator jcolor = value.FindMember("color");
  232. if (jcolor != value.MemberEnd())
  233. importer->ReadColorFromArray(jcolor->value, color_);
  234. const Value::ConstMemberIterator jcastsShadows = value.FindMember("castsShadows");
  235. if (jcastsShadows != value.MemberEnd())
  236. castsShadows_ = jcastsShadows->value.GetBool();
  237. const Value::ConstMemberIterator jrealtime = value.FindMember("realtime");
  238. if (jrealtime != value.MemberEnd())
  239. realtime_ = jrealtime->value.GetBool();
  240. }
  241. JSONRigidBody::JSONRigidBody(JSONSceneImporter* importer, const rapidjson::Value& value) :
  242. JSONComponent(importer, "RigidBody"),
  243. mass_(0)
  244. {
  245. JSONComponent::Parse(value);
  246. const Value::ConstMemberIterator jmass = value.FindMember("mass");
  247. if (jmass != value.MemberEnd())
  248. mass_ = (float) jmass->value.GetDouble();
  249. }
  250. JSONMeshCollider::JSONMeshCollider(JSONSceneImporter* importer, const rapidjson::Value& value) :
  251. JSONComponent(importer, "MeshCollider")
  252. {
  253. JSONComponent::Parse(value);
  254. }
  255. JSONBoxCollider::JSONBoxCollider(JSONSceneImporter* importer, const rapidjson::Value& value) :
  256. JSONComponent(importer, "BoxCollider")
  257. {
  258. JSONComponent::Parse(value);
  259. const Value::ConstMemberIterator jcenter= value.FindMember("center");
  260. if (jcenter != value.MemberEnd())
  261. importer->ReadVector3FromArray(jcenter->value, center_);
  262. const Value::ConstMemberIterator jsize= value.FindMember("size");
  263. if (jsize != value.MemberEnd())
  264. importer->ReadVector3FromArray(jsize->value, size_);
  265. }
  266. JSONTerrain::JSONTerrain(JSONSceneImporter* importer, const rapidjson::Value& value) :
  267. JSONComponent(importer, "Terrain")
  268. , heightmapHeight_(0)
  269. , heightmapWidth_(0)
  270. , heightmapResolution_(0)
  271. , alphamapWidth_(0)
  272. , alphamapHeight_(0)
  273. , alphamapLayers_(0)
  274. , alphaMapLength_(0)
  275. , heightMapLength_(0)
  276. {
  277. JSONComponent::Parse(value);
  278. String base64Height;
  279. String base64Alpha;
  280. for (Value::ConstMemberIterator oitr = value.MemberBegin();
  281. oitr != value.MemberEnd(); ++oitr)
  282. {
  283. if (!strcmp(oitr->name.GetString(), "heightmapHeight"))
  284. {
  285. heightmapHeight_ = oitr->value.GetInt();
  286. }
  287. else if (!strcmp(oitr->name.GetString(), "heightmapWidth"))
  288. {
  289. heightmapWidth_ = oitr->value.GetInt();
  290. }
  291. else if (!strcmp(oitr->name.GetString(), "heightmapResolution"))
  292. {
  293. heightmapResolution_ = oitr->value.GetInt();
  294. }
  295. else if (!strcmp(oitr->name.GetString(), "alphamapWidth"))
  296. {
  297. alphamapWidth_ = oitr->value.GetInt();
  298. }
  299. else if (!strcmp(oitr->name.GetString(), "alphamapHeight"))
  300. {
  301. alphamapHeight_ = oitr->value.GetInt();
  302. }
  303. else if (!strcmp(oitr->name.GetString(), "alphamapLayers"))
  304. {
  305. alphamapLayers_ = oitr->value.GetInt();
  306. }
  307. else if (!strcmp(oitr->name.GetString(), "base64HeightLength"))
  308. {
  309. heightMapLength_ = oitr->value.GetInt();
  310. }
  311. else if (!strcmp(oitr->name.GetString(), "base64AlphaLength"))
  312. {
  313. alphaMapLength_ = oitr->value.GetInt();
  314. }
  315. else if (!strcmp(oitr->name.GetString(), "base64Height"))
  316. {
  317. base64Height = oitr->value.GetString();
  318. }
  319. else if (!strcmp(oitr->name.GetString(), "base64Alpha"))
  320. {
  321. base64Alpha = oitr->value.GetString();
  322. }
  323. else if (!strcmp(oitr->name.GetString(), "heightmapScale"))
  324. {
  325. importer->ReadVector3FromArray(oitr->value, heightmapScale_);
  326. }
  327. else if (!strcmp(oitr->name.GetString(), "size"))
  328. {
  329. importer->ReadVector3FromArray(oitr->value, size_);
  330. }
  331. }
  332. heightMap_ = new float[heightMapLength_];
  333. alphaMap_ = new float[alphaMapLength_];
  334. unsigned int length = 0;
  335. int errors;
  336. errors = _base64Decode((const unsigned char*)base64Height.CString(), base64Height.Length(), (unsigned char*) heightMap_.Get(), &length);
  337. assert(!errors);
  338. assert(length == heightMapLength_);
  339. length = 0;
  340. errors = _base64Decode((const unsigned char*)base64Alpha.CString(), base64Alpha.Length(), (unsigned char*) alphaMap_.Get(), &length);
  341. assert(!errors);
  342. assert(length == alphaMapLength_);
  343. }
  344. JSONCamera::JSONCamera(JSONSceneImporter* importer, const rapidjson::Value& value) :
  345. JSONComponent(importer, "Camera")
  346. {
  347. JSONComponent::Parse(value);
  348. }
  349. JSONNode::JSONNode(JSONSceneImporter* importer, const rapidjson::Value& value) : importer_(importer)
  350. {
  351. for (Value::ConstMemberIterator oitr = value.MemberBegin();
  352. oitr != value.MemberEnd(); ++oitr)
  353. {
  354. if (!strcmp(oitr->name.GetString(), "name"))
  355. {
  356. name_ = oitr->value.GetString();
  357. }
  358. else if (!strcmp(oitr->name.GetString(), "children"))
  359. {
  360. for (Value::ConstValueIterator citr = oitr->value.Begin(); citr != oitr->value.End(); ++citr)
  361. {
  362. if (!citr->IsObject())
  363. continue;
  364. AddChild(new JSONNode(importer, *citr));
  365. }
  366. }
  367. else if (!strcmp(oitr->name.GetString(), "components"))
  368. {
  369. for (Value::ConstValueIterator citr = oitr->value.Begin(); citr != oitr->value.End(); ++citr)
  370. {
  371. if (!citr->IsObject())
  372. continue;
  373. const Value::ConstMemberIterator jtype = citr->FindMember("type");
  374. if (jtype == value.MemberEnd())
  375. continue;
  376. String type = jtype->value.GetString();
  377. if (type == "Transform")
  378. {
  379. components_.Push(new JSONTransform(importer_, *citr));
  380. }
  381. else if (type == "MeshRenderer")
  382. {
  383. components_.Push(new JSONMeshRenderer(importer_, *citr));
  384. }
  385. else if (type == "SkinnedMeshRenderer")
  386. {
  387. components_.Push(new JSONSkinnedMeshRenderer(importer_, *citr));
  388. }
  389. else if (type == "Animation")
  390. {
  391. components_.Push(new JSONAnimation(importer_, *citr));
  392. }
  393. else if (type == "Camera")
  394. {
  395. components_.Push(new JSONCamera(importer_, *citr));
  396. }
  397. else if (type == "Terrain")
  398. {
  399. components_.Push(new JSONTerrain(importer_, *citr));
  400. }
  401. else if (type == "RigidBody")
  402. {
  403. components_.Push(new JSONRigidBody(importer_, *citr));
  404. }
  405. else if (type == "MeshCollider")
  406. {
  407. components_.Push(new JSONMeshCollider(importer_, *citr));
  408. }
  409. else if (type == "BoxCollider")
  410. {
  411. components_.Push(new JSONBoxCollider(importer_, *citr));
  412. }
  413. else if (type == "Light")
  414. {
  415. components_.Push(new JSONLight(importer_, *citr));
  416. }
  417. else if (type == "TimeOfDay")
  418. {
  419. components_.Push(new JSONTimeOfDay(importer_, *citr));
  420. }
  421. }
  422. }
  423. }
  424. }
  425. JSONSceneImporter::JSONSceneImporter(Context* context) : Importer(context)
  426. , document_(new Document())
  427. {
  428. }
  429. void JSONSceneImporter::ReadColorFromArray(const rapidjson::Value& value, Color& color)
  430. {
  431. if (!value.IsArray() || (value.Size() < 3 || value.Size() > 4))
  432. return;
  433. color.r_ = color.g_ = color.b_ = color.a_ = 1.0f;
  434. color.r_ = (float) value[SizeType(0)].GetDouble();
  435. color.g_ = (float) value[SizeType(1)].GetDouble();
  436. color.b_ = (float) value[SizeType(2)].GetDouble();
  437. if (value.Size() == 4)
  438. color.a_ = (float) value[SizeType(3)].GetDouble();
  439. }
  440. void JSONSceneImporter::ReadVector2FromArray(const rapidjson::Value& value, Vector2& v)
  441. {
  442. if (!value.IsArray() || value.Size() != 2)
  443. return;
  444. v.x_ = (float) value[SizeType(0)].GetDouble();
  445. v.y_ = (float) value[SizeType(1)].GetDouble();
  446. }
  447. void JSONSceneImporter::ReadVector3FromArray(const rapidjson::Value& value, Vector3& v)
  448. {
  449. if (!value.IsArray() || value.Size() != 3)
  450. return;
  451. v.x_ = (float) value[SizeType(0)].GetDouble();
  452. v.y_ = (float) value[SizeType(1)].GetDouble();
  453. v.z_ = (float) value[SizeType(2)].GetDouble();
  454. }
  455. void JSONSceneImporter::ReadVector4FromArray(const rapidjson::Value& value, Vector4& v)
  456. {
  457. if (!value.IsArray() || value.Size() != 4)
  458. return;
  459. v.x_ = (float) value[SizeType(0)].GetDouble();
  460. v.y_ = (float) value[SizeType(1)].GetDouble();
  461. v.z_ = (float) value[SizeType(2)].GetDouble();
  462. v.w_ = (float) value[SizeType(3)].GetDouble();
  463. }
  464. void JSONSceneImporter::ReadQuaternionFromArray(const rapidjson::Value& value, Quaternion& q)
  465. {
  466. if (!value.IsArray() || value.Size() != 4)
  467. return;
  468. q.x_ = (float) value[SizeType(0)].GetDouble();
  469. q.y_ = (float) value[SizeType(1)].GetDouble();
  470. q.z_ = (float) value[SizeType(2)].GetDouble();
  471. q.w_ = (float) value[SizeType(3)].GetDouble();
  472. }
  473. void JSONSceneImporter::ReadMatrix4FromArray(const rapidjson::Value& value, Matrix4& m)
  474. {
  475. if (!value.IsArray() || value.Size() != 16)
  476. return;
  477. float mf[16];
  478. for (SizeType i = 0; i < 16; i++)
  479. mf[i] = (float) value[i].GetDouble();
  480. m = Matrix4(mf);
  481. }
  482. bool JSONSceneImporter::ParseMaterials(const rapidjson::Value& value)
  483. {
  484. const Value::ConstMemberIterator jmaterials = value.FindMember("materials");
  485. if (jmaterials != value.MemberEnd() && jmaterials->value.IsArray())
  486. {
  487. for (Value::ConstValueIterator itr = jmaterials->value.Begin(); itr != jmaterials->value.End(); ++itr)
  488. {
  489. if (itr->IsObject())
  490. {
  491. String name = "Anonymous Material";
  492. String shader;
  493. String mainTexture;
  494. Vector2 mainTextureOffset(0.0f, 0.0f);
  495. Vector2 mainTextureScale(1.0f, 1.0f);
  496. int passCount = 1;
  497. int renderQueue = 0;
  498. Color color(1, 1, 1, 1);
  499. for (Value::ConstMemberIterator oitr = itr->MemberBegin();
  500. oitr != itr->MemberEnd(); ++oitr)
  501. {
  502. if (!strcmp(oitr->name.GetString(), "name"))
  503. {
  504. name = oitr->value.GetString();
  505. }
  506. else if (!strcmp(oitr->name.GetString(), "shader"))
  507. {
  508. shader = oitr->value.GetString();
  509. shader.Replace("Legacy Shaders/", "");
  510. }
  511. else if (!strcmp(oitr->name.GetString(), "mainTexture"))
  512. {
  513. mainTexture = oitr->value.GetString();
  514. }
  515. else if (!strcmp(oitr->name.GetString(), "mainTextureOffset"))
  516. {
  517. ReadVector2FromArray(oitr->value, mainTextureOffset);
  518. }
  519. else if (!strcmp(oitr->name.GetString(), "mainTextureScale"))
  520. {
  521. ReadVector2FromArray(oitr->value, mainTextureScale);
  522. }
  523. else if (!strcmp(oitr->name.GetString(), "renderQueue"))
  524. {
  525. renderQueue = oitr->value.GetInt();
  526. }
  527. else if (!strcmp(oitr->name.GetString(), "passCount"))
  528. {
  529. passCount = oitr->value.GetInt();
  530. }
  531. else if (!strcmp(oitr->name.GetString(), "color"))
  532. {
  533. ReadColorFromArray(oitr->value, color);
  534. }
  535. }
  536. JSONMaterial* material = new JSONMaterial(name);
  537. material->SetColor(color);
  538. material->SetMainTexture(mainTexture);
  539. material->SetMainTextureOffset(mainTextureOffset);
  540. material->SetMainTextureScale(mainTextureScale);
  541. material->SetPassCount(passCount);
  542. material->SetRenderQueue(renderQueue);
  543. material->SetShader(shader);
  544. AddMaterial(material);
  545. }
  546. }
  547. }
  548. return true;
  549. }
  550. bool JSONSceneImporter::ParseMeshes(const rapidjson::Value& value)
  551. {
  552. const Value::ConstMemberIterator jmeshes = value.FindMember("meshes");
  553. if (jmeshes != value.MemberEnd() && jmeshes->value.IsArray())
  554. {
  555. for (Value::ConstValueIterator itr = jmeshes->value.Begin(); itr != jmeshes->value.End(); ++itr)
  556. {
  557. if (itr->IsObject())
  558. {
  559. JSONMesh* mesh = new JSONMesh("Anonymous Mesh");
  560. for (Value::ConstMemberIterator oitr = itr->MemberBegin();
  561. oitr != itr->MemberEnd(); ++oitr)
  562. {
  563. if (!strcmp(oitr->name.GetString(), "name"))
  564. {
  565. mesh->SetName(oitr->value.GetString());
  566. }
  567. else if (!strcmp(oitr->name.GetString(), "triangles"))
  568. {
  569. if (oitr->value.IsArray())
  570. {
  571. for (Value::ConstValueIterator triangleArrayItr = oitr->value.Begin();
  572. triangleArrayItr != oitr->value.End(); ++triangleArrayItr)
  573. {
  574. PODVector<int>& triangles = mesh->AddSubMesh();
  575. for (Value::ConstValueIterator vertexItr = triangleArrayItr->Begin();
  576. vertexItr != triangleArrayItr->End(); ++vertexItr)
  577. {
  578. triangles.Push(vertexItr->GetInt());
  579. }
  580. }
  581. }
  582. }
  583. else if (!strcmp(oitr->name.GetString(), "vertexPositions"))
  584. {
  585. Vector3 pos;
  586. PODVector<Vector3>& vpos = mesh->GetVertexPositions();
  587. for (Value::ConstValueIterator vertexItr = oitr->value.Begin();
  588. vertexItr != oitr->value.End(); ++vertexItr)
  589. {
  590. ReadVector3FromArray(*vertexItr, pos);
  591. vpos.Push(pos);
  592. }
  593. }
  594. else if (!strcmp(oitr->name.GetString(), "vertexNormals"))
  595. {
  596. Vector3 pos;
  597. PODVector<Vector3>& vnorm = mesh->GetVertexNormals();
  598. for (Value::ConstValueIterator vertexItr = oitr->value.Begin();
  599. vertexItr != oitr->value.End(); ++vertexItr)
  600. {
  601. ReadVector3FromArray(*vertexItr, pos);
  602. vnorm.Push(pos);
  603. }
  604. }
  605. else if (!strcmp(oitr->name.GetString(), "vertexTangents"))
  606. {
  607. Vector4 tangent;
  608. PODVector<Vector4>& vtangents = mesh->GetVertexTangents();
  609. for (Value::ConstValueIterator vertexItr = oitr->value.Begin();
  610. vertexItr != oitr->value.End(); ++vertexItr)
  611. {
  612. ReadVector4FromArray(*vertexItr, tangent);
  613. vtangents.Push(tangent);
  614. }
  615. }
  616. else if (!strcmp(oitr->name.GetString(), "boneWeights"))
  617. {
  618. PODVector<JSONMesh::BoneWeight>& boneWeights = mesh->GetBoneWeights();
  619. for (Value::ConstValueIterator bitr = oitr->value.Begin();
  620. bitr != oitr->value.End(); ++bitr)
  621. {
  622. JSONMesh::BoneWeight bw;
  623. const Value::ConstMemberIterator indexes = bitr->FindMember("indexes");
  624. const Value::ConstMemberIterator weights = bitr->FindMember("weights");
  625. for (int i = 0; i < 4; i++)
  626. {
  627. bw.indexes_[i] = indexes->value[SizeType(i)].GetInt();
  628. bw.weights_[i] = (float) weights->value[SizeType(i)].GetDouble();
  629. }
  630. boneWeights.Push(bw);
  631. }
  632. }
  633. else if (!strcmp(oitr->name.GetString(), "rootBone"))
  634. {
  635. mesh->SetRootBone(oitr->value.GetString());
  636. }
  637. else if (!strcmp(oitr->name.GetString(), "bindPoses"))
  638. {
  639. Vector<Matrix4>& bindPoses = mesh->GetBindPoses();
  640. for (Value::ConstValueIterator bitr = oitr->value.Begin();
  641. bitr != oitr->value.End(); ++bitr)
  642. {
  643. Matrix4 m;
  644. ReadMatrix4FromArray(*bitr, m);
  645. bindPoses.Push(m);
  646. }
  647. }
  648. else if (!strcmp(oitr->name.GetString(), "bones"))
  649. {
  650. Vector<JSONMesh::Bone>& bones = mesh->GetBones();
  651. if (!oitr->value.IsNull())
  652. {
  653. for (Value::ConstValueIterator bitr = oitr->value.Begin();
  654. bitr != oitr->value.End(); ++bitr)
  655. {
  656. const Value::ConstMemberIterator pos = bitr->FindMember("localPosition");
  657. const Value::ConstMemberIterator rot = bitr->FindMember("localRotation");
  658. const Value::ConstMemberIterator scale = bitr->FindMember("localScale");
  659. const Value::ConstMemberIterator name = bitr->FindMember("name");
  660. const Value::ConstMemberIterator parentName = bitr->FindMember("parentName");
  661. JSONMesh::Bone bone;
  662. ReadVector3FromArray(pos->value, bone.pos_);
  663. ReadVector3FromArray(scale->value, bone.scale_);
  664. ReadQuaternionFromArray(rot->value, bone.rot_);
  665. bone.name_ = name->value.GetString();
  666. bone.parentName_ = parentName->value.GetString();
  667. bones.Push(bone);
  668. }
  669. }
  670. }
  671. else if (!strcmp(oitr->name.GetString(), "vertexUV") ||
  672. !strcmp(oitr->name.GetString(), "vertexUV2"))
  673. {
  674. Vector2 uv;
  675. PODVector<Vector2>& uvs = !strcmp(oitr->name.GetString(), "vertexUV") ?
  676. mesh->GetUVSet(0) : mesh->GetUVSet(1);
  677. for (Value::ConstValueIterator uvItr = oitr->value.Begin();
  678. uvItr != oitr->value.End(); ++uvItr)
  679. {
  680. ReadVector2FromArray(*uvItr, uv);
  681. uvs.Push(uv);
  682. }
  683. }
  684. }
  685. AddMesh(mesh);
  686. }
  687. }
  688. }
  689. return true;
  690. }
  691. bool JSONSceneImporter::ParseShaders(const rapidjson::Value& value)
  692. {
  693. const Value::ConstMemberIterator jshaders = value.FindMember("shaders");
  694. if (jshaders != value.MemberEnd() && jshaders->value.IsArray())
  695. {
  696. for (Value::ConstValueIterator itr = jshaders->value.Begin(); itr != jshaders->value.End(); ++itr)
  697. {
  698. if (itr->IsObject())
  699. {
  700. String name = "Anonymous Shader";
  701. int renderQueue = 0;
  702. for (Value::ConstMemberIterator oitr = itr->MemberBegin();
  703. oitr != itr->MemberEnd(); ++oitr)
  704. {
  705. if (!strcmp(oitr->name.GetString(), "name"))
  706. {
  707. name = oitr->value.GetString();
  708. }
  709. else if (!strcmp(oitr->name.GetString(), "renderQueue"))
  710. {
  711. renderQueue = oitr->value.GetInt();
  712. }
  713. }
  714. AddShader(new JSONShader(name, renderQueue));
  715. }
  716. }
  717. }
  718. return true;
  719. }
  720. bool JSONSceneImporter::ParseTextures(const rapidjson::Value& value)
  721. {
  722. const Value::ConstMemberIterator jtextures = value.FindMember("textures");
  723. if (jtextures != value.MemberEnd() && jtextures->value.IsArray())
  724. {
  725. for (Value::ConstValueIterator itr = jtextures->value.Begin(); itr != jtextures->value.End(); ++itr)
  726. {
  727. String name;
  728. String base64PNG;
  729. int base64PNGLength = 0;
  730. if (itr->IsObject())
  731. {
  732. const Value::ConstMemberIterator jname = itr->FindMember("name");
  733. if (jname != itr->MemberEnd() && jname->value.IsString())
  734. {
  735. name = jname->value.GetString();
  736. }
  737. const Value::ConstMemberIterator jbase64PNG = itr->FindMember("base64PNG");
  738. if (jbase64PNG != itr->MemberEnd())
  739. {
  740. base64PNG = jbase64PNG->value.GetString();
  741. }
  742. const Value::ConstMemberIterator jbase64PNGLength = itr->FindMember("base64PNGLength");
  743. if (jbase64PNGLength != itr->MemberEnd())
  744. {
  745. base64PNGLength = jbase64PNGLength->value.GetInt();
  746. }
  747. }
  748. SharedArrayPtr<unsigned char> pngPixels;
  749. pngPixels = new unsigned char[base64PNGLength];
  750. unsigned int length = 0;
  751. int errors = _base64Decode((const unsigned char*)base64PNG.CString(), base64PNG.Length(), pngPixels.Get(), &length);
  752. assert(!errors);
  753. assert(length == base64PNGLength);
  754. JSONTexture* texture = new JSONTexture(name);
  755. texture->SetPNGPixels(pngPixels, base64PNGLength);
  756. AddTexture(texture);
  757. }
  758. }
  759. return true;
  760. }
  761. bool JSONSceneImporter::ParseLightmaps(const rapidjson::Value& value)
  762. {
  763. const Value::ConstMemberIterator jlightmaps = value.FindMember("lightmaps");
  764. if (jlightmaps != value.MemberEnd() && jlightmaps->value.IsArray())
  765. {
  766. for (Value::ConstValueIterator itr = jlightmaps->value.Begin(); itr != jlightmaps->value.End(); ++itr)
  767. {
  768. String name;
  769. String base64PNG;
  770. int base64PNGLength = 0;
  771. if (itr->IsObject())
  772. {
  773. const Value::ConstMemberIterator jname = itr->FindMember("filename");
  774. if (jname != itr->MemberEnd() && jname->value.IsString())
  775. {
  776. name = jname->value.GetString();
  777. }
  778. const Value::ConstMemberIterator jbase64PNG = itr->FindMember("base64PNG");
  779. if (jbase64PNG != itr->MemberEnd() )
  780. {
  781. base64PNG = jbase64PNG->value.GetString();
  782. }
  783. const Value::ConstMemberIterator jbase64PNGLength = itr->FindMember("base64PNGLength");
  784. if (jbase64PNGLength != itr->MemberEnd() )
  785. {
  786. base64PNGLength = jbase64PNGLength->value.GetInt();
  787. }
  788. }
  789. SharedArrayPtr<unsigned char> pngPixels;
  790. pngPixels = new unsigned char[base64PNGLength];
  791. unsigned int length = 0;
  792. int errors = _base64Decode((const unsigned char*)base64PNG.CString(), base64PNG.Length(), pngPixels.Get(), &length);
  793. assert(!errors);
  794. assert(length == base64PNGLength);
  795. JSONLightmap* lightmap = new JSONLightmap(name);
  796. lightmap->SetPNGPixels(pngPixels, base64PNGLength);
  797. AddLightmap(lightmap);
  798. }
  799. }
  800. return true;
  801. }
  802. bool JSONSceneImporter::ParseResources(const rapidjson::Value& value)
  803. {
  804. ParseTextures(value);
  805. ParseLightmaps(value);
  806. ParseShaders(value);
  807. ParseMaterials(value);
  808. ParseMeshes(value);
  809. return true;
  810. }
  811. bool JSONSceneImporter::ParseHierarchy(const rapidjson::Value& value)
  812. {
  813. for (Value::ConstValueIterator itr = value.Begin(); itr != value.End(); ++itr)
  814. {
  815. if (itr->IsObject())
  816. {
  817. hierarchy_.Push(new JSONNode(this, *itr));
  818. }
  819. }
  820. return true;
  821. }
  822. bool JSONSceneImporter::Import(const String& path)
  823. {
  824. File jsonFile(context_, path);
  825. String json;
  826. jsonFile.ReadText(json);
  827. if (document_->Parse<0>(json.CString()).HasParseError())
  828. {
  829. ATOMIC_LOGERRORF("Could not parse JSON data from %s", path.CString());
  830. return false;
  831. }
  832. const Value::ConstMemberIterator name = document_->FindMember("name");
  833. if (name != document_->MemberEnd())
  834. sceneName_ = name->value.GetString();
  835. const Value::ConstMemberIterator jresources = document_->FindMember("resources");
  836. if (jresources != document_->MemberEnd())
  837. ParseResources(jresources->value);
  838. const Value::ConstMemberIterator jhierarchy = document_->FindMember("hierarchy");
  839. if (jhierarchy != document_->MemberEnd())
  840. ParseHierarchy(jhierarchy->value);
  841. return true;
  842. }
  843. JSONSceneImporter::~JSONSceneImporter()
  844. {
  845. if (document_)
  846. delete document_;
  847. }
  848. }