ImageAtlasResource.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Resource/ImageAtlasResource.h>
  6. #include <AnKi/Resource/ResourceManager.h>
  7. #include <AnKi/Util/Xml.h>
  8. namespace anki {
  9. Error ImageAtlasResource::load(const ResourceFilename& filename, Bool async)
  10. {
  11. ResourceXmlDocument doc;
  12. ANKI_CHECK(openFileParseXml(filename, doc));
  13. XmlElement rootel, el;
  14. //
  15. // <imageAtlas>
  16. //
  17. ANKI_CHECK(doc.getChildElement("imageAtlas", rootel));
  18. //
  19. // <image>
  20. //
  21. ANKI_CHECK(rootel.getChildElement("image", el));
  22. CString texFname;
  23. ANKI_CHECK(el.getText(texFname));
  24. ANKI_CHECK(ResourceManager::getSingleton().loadResource<ImageResource>(texFname, m_image, async));
  25. m_size[0] = m_image->getTexture().getWidth();
  26. m_size[1] = m_image->getTexture().getHeight();
  27. //
  28. // <subImageMargin>
  29. //
  30. ANKI_CHECK(rootel.getChildElement("subImageMargin", el));
  31. I64 margin = 0;
  32. ANKI_CHECK(el.getNumber(margin));
  33. if(margin >= I(m_image->getTexture().getWidth()) || margin >= I(m_image->getTexture().getHeight()) || margin < 0)
  34. {
  35. ANKI_RESOURCE_LOGE("Too big margin %d", I32(margin));
  36. return Error::kUserData;
  37. }
  38. m_margin = U32(margin);
  39. //
  40. // <subImages>
  41. //
  42. // Get counts
  43. U32 namesSize = 0;
  44. U32 subTexesCount = 0;
  45. XmlElement subTexesEl, subTexEl;
  46. ANKI_CHECK(rootel.getChildElement("subImages", subTexesEl));
  47. ANKI_CHECK(subTexesEl.getChildElement("subImage", subTexEl));
  48. do
  49. {
  50. ANKI_CHECK(subTexEl.getChildElement("name", el));
  51. CString name;
  52. ANKI_CHECK(el.getText(name));
  53. if(name.getLength() < 1)
  54. {
  55. ANKI_RESOURCE_LOGE("Something wrong with the <name> tag. Probably empty");
  56. return Error::kUserData;
  57. }
  58. namesSize += U32(name.getLength()) + 1;
  59. ++subTexesCount;
  60. ANKI_CHECK(subTexEl.getNextSiblingElement("subImage", subTexEl));
  61. } while(subTexEl);
  62. // Allocate
  63. m_subTexNames.resize(namesSize);
  64. m_subTexes.resize(subTexesCount);
  65. // Iterate again and populate
  66. subTexesCount = 0;
  67. char* names = &m_subTexNames[0];
  68. ANKI_CHECK(subTexesEl.getChildElement("subImage", subTexEl));
  69. do
  70. {
  71. ANKI_CHECK(subTexEl.getChildElement("name", el));
  72. CString name;
  73. ANKI_CHECK(el.getText(name));
  74. memcpy(names, &name[0], name.getLength() + 1);
  75. m_subTexes[subTexesCount].m_name = names;
  76. ANKI_CHECK(subTexEl.getChildElement("uv", el));
  77. Vec4 uv;
  78. ANKI_CHECK(el.getNumbers(uv));
  79. m_subTexes[subTexesCount].m_uv = {uv[0], uv[1], uv[2], uv[3]};
  80. names += name.getLength() + 1;
  81. ++subTexesCount;
  82. ANKI_CHECK(subTexEl.getNextSiblingElement("subImage", subTexEl));
  83. } while(subTexEl);
  84. return Error::kNone;
  85. }
  86. Error ImageAtlasResource::getSubImageInfo(CString name, F32 uv[4]) const
  87. {
  88. for(const SubTex& st : m_subTexes)
  89. {
  90. if(st.m_name == name)
  91. {
  92. uv[0] = st.m_uv[0];
  93. uv[1] = st.m_uv[1];
  94. uv[2] = st.m_uv[2];
  95. uv[3] = st.m_uv[3];
  96. return Error::kNone;
  97. }
  98. }
  99. ANKI_RESOURCE_LOGE("Image atlas %s doesn't have sub image named: %s", &getFilename()[0], &name[0]);
  100. return Error::kUserData;
  101. }
  102. } // end namespace anki