biome.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. #include "biome.h"
  2. bool BiomesManager::loadAllBiomes()
  3. {
  4. *this = {};
  5. //forest 0
  6. {
  7. Biome plains;
  8. plains.name = "forest";
  9. plains.color = {0.2,0.7,0.3};
  10. plains.surfaceBlock = BlockTypes::grassBlock;
  11. plains.secondaryBlock = BlockTypes::dirt;
  12. plains.treeType = Biome::treeNormal;
  13. plains.forestTresshold = 0.55;
  14. plains.jusGrassTresshold = 0.3;
  15. plains.treeChanceRemap = {0.01, 0.1};
  16. plains.grassChanceForestRemap = {0.2, 0.22};
  17. plains.justGrassChanceRemap = {0.12, 0.2};
  18. plains.growTreesOn = BlockTypes::grassBlock;
  19. plains.growGrassOn = BlockTypes::grassBlock;
  20. plains.grassType = BlockTypes::grass;
  21. plains.waterType = BlockTypes::water;
  22. biomes.push_back(plains);
  23. }
  24. //dry desert 1
  25. {
  26. Biome b;
  27. b.name = "dryDesert";
  28. b.color = glm::vec3{202, 169, 90}/255.f;
  29. b.surfaceBlock = BlockTypes::sand;
  30. b.secondaryBlock = BlockTypes::sand_stone;
  31. b.forestTresshold = 0.55;
  32. b.jusGrassTresshold = 0.1;
  33. b.treeChanceRemap = {0.01, 0.1};
  34. b.grassChanceForestRemap = {0.01, 0.02};
  35. b.justGrassChanceRemap = {0.001, 0.01};
  36. b.growTreesOn = 0;
  37. b.growGrassOn = 0;
  38. b.grassType = BlockTypes::dead_bush;
  39. b.waterType = BlockTypes::sand;
  40. biomes.push_back(b);
  41. }
  42. //desert 2
  43. {
  44. Biome b;
  45. b.name = "desert";
  46. b.color = glm::vec3{212, 189, 99} / 255.f;
  47. b.surfaceBlock = BlockTypes::sand;
  48. b.secondaryBlock = BlockTypes::sand_stone;
  49. b.forestTresshold = 0.55;
  50. b.jusGrassTresshold = 0.3;
  51. b.treeChanceRemap = {0.01, 0.1};
  52. b.grassChanceForestRemap = {0.01, 0.02};
  53. b.justGrassChanceRemap = {0.001, 0.01};
  54. b.growTreesOn = 0;
  55. b.growGrassOn = BlockTypes::sand;
  56. b.grassType = BlockTypes::dead_bush;
  57. b.waterType = BlockTypes::water;
  58. biomes.push_back(b);
  59. }
  60. //plains 3
  61. {
  62. Biome plains;
  63. plains.name = "plains";
  64. plains.color = {0.3,0.9,0.35};
  65. plains.surfaceBlock = BlockTypes::grassBlock;
  66. plains.secondaryBlock = BlockTypes::dirt;
  67. plains.treeType = Biome::treeBirch;
  68. plains.forestTresshold = 0.75;
  69. plains.jusGrassTresshold = 0.2;
  70. plains.treeChanceRemap = {0.01, 0.05};
  71. plains.grassChanceForestRemap = {0.2, 0.22};
  72. plains.justGrassChanceRemap = {0.12, 0.2};
  73. plains.growTreesOn = BlockTypes::grassBlock;
  74. plains.growGrassOn = BlockTypes::grassBlock;
  75. plains.grassType = BlockTypes::rose;
  76. plains.waterType = BlockTypes::water;
  77. biomes.push_back(plains);
  78. }
  79. //oasis 4
  80. {
  81. Biome b;
  82. b.name = "oasis";
  83. b.color = glm::vec3{222, 102, 192} / 255.f;
  84. b.surfaceBlock = BlockTypes::grassBlock;
  85. b.secondaryBlock = BlockTypes::dirt;
  86. b.treeType = Biome::treePalm;
  87. b.forestTresshold = 0.3;
  88. b.jusGrassTresshold = 0.1;
  89. b.treeChanceRemap = {0.001, 0.01};
  90. b.grassChanceForestRemap = {0.01, 0.03};
  91. b.justGrassChanceRemap = {0.01, 0.02};
  92. b.growTreesOn = BlockTypes::grassBlock;
  93. b.growGrassOn = BlockTypes::grassBlock;
  94. b.grassType = BlockTypes::cactus_bud;
  95. b.waterType = BlockTypes::water;
  96. biomes.push_back(b);
  97. }
  98. //jungle 5
  99. {
  100. Biome b;
  101. b.name = "jungle";
  102. b.color = {0.2,0.7,0.3};
  103. b.surfaceBlock = BlockTypes::grassBlock;
  104. b.secondaryBlock = BlockTypes::dirt;
  105. b.treeType = Biome::treeJungle;
  106. b.forestTresshold = 0.3;
  107. b.jusGrassTresshold = 0.1;
  108. b.treeChanceRemap = {0.006, 0.07};
  109. b.grassChanceForestRemap = {0.2, 0.22};
  110. b.justGrassChanceRemap = {0.12, 0.2};
  111. b.growTreesOn = BlockTypes::grassBlock;
  112. b.growGrassOn = BlockTypes::grassBlock;
  113. b.grassType = BlockTypes::grass;
  114. b.waterType = BlockTypes::water;
  115. biomes.push_back(b);
  116. }
  117. //dryLand 6
  118. {
  119. Biome b;
  120. b.name = "dryLand";
  121. b.color = glm::vec3{84, 51, 23} / 255.f;
  122. b.surfaceBlock = BlockTypes::dirt;
  123. b.secondaryBlock = BlockTypes::dirt;
  124. b.forestTresshold = 0.3;
  125. b.jusGrassTresshold = 0.1;
  126. b.treeChanceRemap = {0.01, 0.1};
  127. b.grassChanceForestRemap = {0.2, 0.22};
  128. b.justGrassChanceRemap = {0.12, 0.2};
  129. b.growTreesOn = 0;
  130. b.growGrassOn = 0;
  131. b.grassType = 0;
  132. b.waterType = BlockTypes::water;
  133. biomes.push_back(b);
  134. }
  135. //rocks 7
  136. {
  137. Biome b;
  138. b.name = "rocks";
  139. b.color = glm::vec3{89, 89, 89} / 255.f;
  140. b.surfaceBlock = BlockTypes::stone;
  141. b.secondaryBlock = BlockTypes::stone;
  142. b.forestTresshold = 0.3;
  143. b.jusGrassTresshold = 0.1;
  144. b.treeChanceRemap = {0.01, 0.1};
  145. b.grassChanceForestRemap = {0.2, 0.22};
  146. b.justGrassChanceRemap = {0.12, 0.2};
  147. b.growTreesOn = 0;
  148. b.growGrassOn = 0;
  149. b.grassType = 0;
  150. b.waterType = BlockTypes::ice;
  151. biomes.push_back(b);
  152. }
  153. //snow 8
  154. {
  155. Biome b;
  156. b.name = "snow";
  157. b.color = glm::vec3{199, 199, 199} / 255.f;
  158. b.surfaceBlock = BlockTypes::snow_dirt;
  159. b.secondaryBlock = BlockTypes::dirt;
  160. b.treeType = Biome::treeSpruce;
  161. b.forestTresshold = 0.9;
  162. b.jusGrassTresshold = 0.3;
  163. b.treeChanceRemap = {0.01, 0.06};
  164. b.grassChanceForestRemap = {0.4, 0.6};
  165. b.justGrassChanceRemap = {0.12, 0.4};
  166. b.growTreesOn = BlockTypes::snow_dirt;
  167. b.growGrassOn = BlockTypes::snow_dirt;
  168. b.grassType = 0;
  169. b.waterType = BlockTypes::ice;
  170. biomes.push_back(b);
  171. }
  172. //taiga 9
  173. {
  174. Biome b;
  175. b.name = "taiga";
  176. b.color = glm::vec3{184, 201, 159} / 255.f;
  177. b.surfaceBlock = BlockTypes::snow_dirt;
  178. b.secondaryBlock = BlockTypes::dirt;
  179. b.treeType = Biome::treeSpruce;
  180. b.forestTresshold = 0.7;
  181. b.jusGrassTresshold = 0.3;
  182. b.treeChanceRemap = {0.02, 0.12};
  183. b.grassChanceForestRemap = {0.4, 0.6};
  184. b.justGrassChanceRemap = {0.12, 0.4};
  185. b.growTreesOn = BlockTypes::snow_dirt;
  186. b.growGrassOn = BlockTypes::snow_dirt;
  187. b.grassType = 0;
  188. b.waterType = BlockTypes::ice;
  189. biomes.push_back(b);
  190. }
  191. {
  192. BiomeRange cold;
  193. cold.tresshold = 0;
  194. cold.ids.push_back(7);
  195. cold.ids.push_back(8);
  196. cold.ids.push_back(9);
  197. picker.temperature.push_back(cold);
  198. BiomeRange medium;
  199. medium.tresshold = 0.29;
  200. medium.ids.push_back(6);
  201. medium.ids.push_back(3);
  202. medium.ids.push_back(0);
  203. picker.temperature.push_back(medium);
  204. BiomeRange warm;
  205. warm.tresshold = 0.59;
  206. warm.ids.push_back(1);
  207. warm.ids.push_back(2);
  208. warm.ids.push_back(5);
  209. picker.temperature.push_back(warm);
  210. BiomeRange veryWarm;
  211. warm.tresshold = 0.9;
  212. warm.ids.push_back(4);
  213. warm.ids.push_back(1);
  214. warm.ids.push_back(2);
  215. warm.ids.push_back(5);
  216. picker.temperature.push_back(warm);
  217. }
  218. {
  219. BiomeRange dry;
  220. dry.tresshold = 0;
  221. dry.ids.push_back(7);
  222. dry.ids.push_back(6);
  223. dry.ids.push_back(1);
  224. picker.humidity.push_back(dry);
  225. BiomeRange medium;
  226. medium.tresshold = 0.29;
  227. medium.ids.push_back(8);
  228. medium.ids.push_back(3);
  229. medium.ids.push_back(2);
  230. picker.humidity.push_back(medium);
  231. BiomeRange mediumOasis;
  232. mediumOasis.tresshold = 0.51;
  233. mediumOasis.ids.push_back(4);
  234. mediumOasis.ids.push_back(8);
  235. mediumOasis.ids.push_back(3);
  236. mediumOasis.ids.push_back(2);
  237. picker.humidity.push_back(mediumOasis);
  238. BiomeRange high;
  239. high.tresshold = 0.61;
  240. high.ids.push_back(5);
  241. high.ids.push_back(0);
  242. high.ids.push_back(9);
  243. picker.humidity.push_back(high);
  244. }
  245. return true;
  246. }
  247. Biome *BiomesManager::determineBiome(float t, float h)
  248. {
  249. return &this->biomes[determineBiomeIndex(t, h)];
  250. }
  251. int BiomesManager::determineBiomeIndex(float t, float h)
  252. {
  253. //return &biomes[2];
  254. std::vector<int> biomes;
  255. biomes.reserve(5);
  256. size_t size = picker.temperature.size();
  257. for (int i = size - 1; i >= 0; i--)
  258. {
  259. if (t >= picker.temperature[i].tresshold)
  260. {
  261. for (auto b : picker.temperature[i].ids)
  262. {
  263. biomes.push_back(b);
  264. }
  265. break;
  266. }
  267. }
  268. size = picker.humidity.size();
  269. for (int i = size - 1; i >= 0; i--)
  270. {
  271. if (h >= picker.humidity[i].tresshold)
  272. {
  273. for (auto b : picker.humidity[i].ids)
  274. {
  275. for (auto id : biomes)
  276. {
  277. if (id == b)
  278. {
  279. return id;
  280. }
  281. }
  282. }
  283. }
  284. }
  285. assert(0);
  286. return -1;
  287. }