ImageAtlasResource.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // Copyright (C) 2009-2021, 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. ImageAtlasResource::ImageAtlasResource(ResourceManager* manager)
  10. : ResourceObject(manager)
  11. {
  12. }
  13. ImageAtlasResource::~ImageAtlasResource()
  14. {
  15. m_subTexes.destroy(getAllocator());
  16. m_subTexNames.destroy(getAllocator());
  17. }
  18. Error ImageAtlasResource::load(const ResourceFilename& filename, Bool async)
  19. {
  20. XmlDocument doc;
  21. ANKI_CHECK(openFileParseXml(filename, doc));
  22. XmlElement rootel, el;
  23. //
  24. // <imageAtlas>
  25. //
  26. ANKI_CHECK(doc.getChildElement("imageAtlas", rootel));
  27. //
  28. // <image>
  29. //
  30. ANKI_CHECK(rootel.getChildElement("image", el));
  31. CString texFname;
  32. ANKI_CHECK(el.getText(texFname));
  33. ANKI_CHECK(getManager().loadResource<ImageResource>(texFname, m_image, async));
  34. m_size[0] = m_image->getWidth();
  35. m_size[1] = m_image->getHeight();
  36. //
  37. // <subImageMargin>
  38. //
  39. ANKI_CHECK(rootel.getChildElement("subImageMargin", el));
  40. I64 margin = 0;
  41. ANKI_CHECK(el.getNumber(margin));
  42. if(margin >= I(m_image->getWidth()) || margin >= I(m_image->getHeight()) || margin < 0)
  43. {
  44. ANKI_RESOURCE_LOGE("Too big margin %d", I32(margin));
  45. return Error::USER_DATA;
  46. }
  47. m_margin = U32(margin);
  48. //
  49. // <subImages>
  50. //
  51. // Get counts
  52. U32 namesSize = 0;
  53. U32 subTexesCount = 0;
  54. XmlElement subTexesEl, subTexEl;
  55. ANKI_CHECK(rootel.getChildElement("subImages", subTexesEl));
  56. ANKI_CHECK(subTexesEl.getChildElement("subImage", subTexEl));
  57. do
  58. {
  59. ANKI_CHECK(subTexEl.getChildElement("name", el));
  60. CString name;
  61. ANKI_CHECK(el.getText(name));
  62. if(name.getLength() < 1)
  63. {
  64. ANKI_RESOURCE_LOGE("Something wrong with the <name> tag. Probably empty");
  65. return Error::USER_DATA;
  66. }
  67. namesSize += U32(name.getLength()) + 1;
  68. ++subTexesCount;
  69. ANKI_CHECK(subTexEl.getNextSiblingElement("subImage", subTexEl));
  70. } while(subTexEl);
  71. // Allocate
  72. m_subTexNames.create(getAllocator(), namesSize);
  73. m_subTexes.create(getAllocator(), subTexesCount);
  74. // Iterate again and populate
  75. subTexesCount = 0;
  76. char* names = &m_subTexNames[0];
  77. ANKI_CHECK(subTexesEl.getChildElement("subImage", subTexEl));
  78. do
  79. {
  80. ANKI_CHECK(subTexEl.getChildElement("name", el));
  81. CString name;
  82. ANKI_CHECK(el.getText(name));
  83. memcpy(names, &name[0], name.getLength() + 1);
  84. m_subTexes[subTexesCount].m_name = names;
  85. ANKI_CHECK(subTexEl.getChildElement("uv", el));
  86. Vec4 uv;
  87. ANKI_CHECK(el.getNumbers(uv));
  88. m_subTexes[subTexesCount].m_uv = {uv[0], uv[1], uv[2], uv[3]};
  89. names += name.getLength() + 1;
  90. ++subTexesCount;
  91. ANKI_CHECK(subTexEl.getNextSiblingElement("subImage", subTexEl));
  92. } while(subTexEl);
  93. return Error::NONE;
  94. }
  95. Error ImageAtlasResource::getSubImageInfo(CString name, F32 uv[4]) const
  96. {
  97. for(const SubTex& st : m_subTexes)
  98. {
  99. if(st.m_name == name)
  100. {
  101. uv[0] = st.m_uv[0];
  102. uv[1] = st.m_uv[1];
  103. uv[2] = st.m_uv[2];
  104. uv[3] = st.m_uv[3];
  105. return Error::NONE;
  106. }
  107. }
  108. ANKI_RESOURCE_LOGE("Image atlas %s doesn't have sub image named: %s", &getFilename()[0], &name[0]);
  109. return Error::USER_DATA;
  110. }
  111. } // end namespace anki