structure.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #pragma once
  2. #include <blocks.h>
  3. #include <vector>
  4. #include <glm/vec2.hpp>
  5. struct StructureData
  6. {
  7. glm::ivec3 sizeNotRotated = {};
  8. int unused = 0;
  9. //data is held outside
  10. Block &unsafeGet(int x, int y, int z)
  11. {
  12. assert(x >= 0 && y >= 0 && z >= 0 && x < sizeNotRotated.x && y < sizeNotRotated.y && z < sizeNotRotated.z);
  13. return ((Block *)(this + 1))[y + z * sizeNotRotated.y + x * sizeNotRotated.y* sizeNotRotated.z];
  14. }
  15. glm::ivec3 getSizeRotated(int rotation)
  16. {
  17. if (rotation == 1 || rotation == 3)
  18. {
  19. return glm::ivec3(sizeNotRotated.z, sizeNotRotated.y, sizeNotRotated.x);
  20. }
  21. return sizeNotRotated;
  22. }
  23. Block &unsafeGetRotated(int x, int y, int z, int r)
  24. {
  25. auto size = getSizeRotated(r);
  26. if (r == 0)
  27. {
  28. return unsafeGet(x, y, z);
  29. }
  30. else if (r == 1)
  31. {
  32. return unsafeGet(size.z - 1 - z, y, x);
  33. }
  34. else if (r == 2)
  35. {
  36. return unsafeGet(size.x - x - 1, y, size.z - z - 1);
  37. }
  38. else if (r == 3)
  39. {
  40. return unsafeGet(z, y, size.x - x - 1);
  41. }
  42. else
  43. {
  44. assert(0);
  45. }
  46. }
  47. Block *safeGet(int x, int y, int z)
  48. {
  49. if (x < 0 || y < 0 || z < 0 || x >= sizeNotRotated.x || y >= sizeNotRotated.y || z >= sizeNotRotated.z)
  50. {
  51. return nullptr;
  52. }
  53. return &unsafeGet(x, y, z);
  54. }
  55. };
  56. struct StructureDataAndFlags
  57. {
  58. //todo other flags
  59. struct PerCollomFlags
  60. {
  61. glm::ivec2 minMax = {9999, -9999};
  62. bool hasBlocks = 0;
  63. };
  64. std::vector<PerCollomFlags> perCollomFlags;
  65. PerCollomFlags &getPerCollomFlagsUnsafeRotated(int x, int z, int r, glm::ivec3 size)
  66. {
  67. if (r == 0)
  68. {
  69. return getPerCollomFlagsUnsafe(x, z);
  70. }
  71. else if (r == 1)
  72. {
  73. return getPerCollomFlagsUnsafe(size.z - 1 - z, x);
  74. }
  75. else if (r == 2)
  76. {
  77. return getPerCollomFlagsUnsafe(size.x - x - 1, size.z - z - 1);
  78. }
  79. else if (r == 3)
  80. {
  81. return getPerCollomFlagsUnsafe(z, size.x - x - 1);
  82. }
  83. else
  84. {
  85. assert(0);
  86. }
  87. }
  88. PerCollomFlags &getPerCollomFlagsUnsafe(int x, int z)
  89. {
  90. return perCollomFlags[x + z * data->sizeNotRotated.x];
  91. }
  92. StructureData *data;
  93. };
  94. struct StructuresManager
  95. {
  96. bool loadAllStructures();
  97. std::vector<StructureDataAndFlags> trees;
  98. std::vector<StructureDataAndFlags> jungleTrees;
  99. std::vector<StructureDataAndFlags> palmTrees;
  100. std::vector<StructureDataAndFlags> treeHouses;
  101. std::vector<StructureDataAndFlags> smallPyramids;
  102. std::vector<StructureDataAndFlags> birchTrees;
  103. std::vector<StructureDataAndFlags> igloos;
  104. std::vector<StructureDataAndFlags> spruceTrees;
  105. std::vector<StructureDataAndFlags> spruceTreesSlim;
  106. std::vector<StructureDataAndFlags> tallTreesSlim;
  107. std::vector<StructureDataAndFlags> smallStones;
  108. std::vector<StructureDataAndFlags> abandonedHouse;
  109. std::vector<StructureDataAndFlags> goblinTower;
  110. std::vector<StructureDataAndFlags> trainingCamp;
  111. std::vector<StructureDataAndFlags> smallStoneRuins;
  112. std::vector<StructureDataAndFlags> tavern;
  113. std::vector<StructureDataAndFlags> hay;
  114. std::vector<StructureDataAndFlags> barn;
  115. std::vector<StructureDataAndFlags> minesDungeonEntrance;
  116. std::vector<StructureDataAndFlags> minesDungeonHall;
  117. std::vector<StructureDataAndFlags> minesDungeonRoom;
  118. std::vector<StructureDataAndFlags> minesDungeonEnd;
  119. void clear();
  120. };