💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
3.3 KiB

  1. #include "biome.hpp"
  2. #include "../settings.hpp"
  3. #if defined(_WIN32) || defined(__CYGWIN__)
  4. #include "../windows-dirent.h"
  5. #else
  6. #include <dirent.h>
  7. #endif
  8. #include <iostream>
  9. Biome::Biome()
  10. {}
  11. Biome::~Biome()
  12. {}
  13. bool Biome::load()
  14. {
  15. ParameterDict parameters;
  16. if (!parameters.load(filename))
  17. {
  18. return false;
  19. }
  20. parameters.get("name", &name);
  21. parameters.get("soil-horizon-o", &soilHorizonOFilename);
  22. parameters.get("soil-horizon-a", &soilHorizonAFilename);
  23. parameters.get("soil-horizon-b", &soilHorizonBFilename);
  24. parameters.get("soil-horizon-c", &soilHorizonCFilename);
  25. parameters.get("cubemap", &cubemapName);
  26. TextureLoader textureLoader;
  27. textureLoader.setCubemap(false);
  28. textureLoader.setMipmapChain(false);
  29. textureLoader.setWrapS(true);
  30. textureLoader.setWrapT(true);
  31. // Load soil horizon textures
  32. soilHorizonO = textureLoader.load(std::string("data/textures/") + soilHorizonOFilename);
  33. soilHorizonA = textureLoader.load(std::string("data/textures/") + soilHorizonAFilename);
  34. soilHorizonB = textureLoader.load(std::string("data/textures/") + soilHorizonBFilename);
  35. soilHorizonC = textureLoader.load(std::string("data/textures/") + soilHorizonCFilename);
  36. // Load diffuse cubemap
  37. textureLoader.setCubemap(true);
  38. textureLoader.setMipmapChain(false);
  39. textureLoader.setWrapS(false);
  40. textureLoader.setWrapT(false);
  41. textureLoader.setWrapR(false);
  42. std::string diffuseCubemapFilename = std::string("data/textures/") + cubemapName + std::string("-diffuse.png");
  43. diffuseCubemap = textureLoader.load(diffuseCubemapFilename);
  44. if (!diffuseCubemap)
  45. {
  46. std::cerr << "Failed to load diffuse cubemap \"" << diffuseCubemapFilename << "\"" << std::endl;
  47. }
  48. // Load specular cubemap
  49. textureLoader.setCubemap(true);
  50. textureLoader.setMipmapChain(true);
  51. std::string specularCubemapFilename = std::string("data/textures/") + cubemapName + std::string("-specular_m%02d.png");
  52. specularCubemap = textureLoader.load(specularCubemapFilename);
  53. if (!specularCubemap)
  54. {
  55. std::cerr << "Failed to load specular cubemap \"" << specularCubemapFilename << "\"" << std::endl;
  56. }
  57. return true;
  58. }
  59. bool Biosphere::load(const std::string& directory)
  60. {
  61. // Open biomes directory
  62. DIR* dir = opendir(directory.c_str());
  63. if (dir == nullptr)
  64. {
  65. std::cout << "Failed to open biome directory \"" << directory << "\"" << std::endl;
  66. return false;
  67. }
  68. // Scan directory for .bio files
  69. for (struct dirent* entry = readdir(dir); entry != nullptr; entry = readdir(dir))
  70. {
  71. if (entry->d_type == DT_DIR || *entry->d_name == '.')
  72. {
  73. continue;
  74. }
  75. std::string filename = entry->d_name;
  76. std::string::size_type delimeter = filename.find_last_of('.');
  77. if (delimeter == std::string::npos)
  78. {
  79. continue;
  80. }
  81. std::string extension = filename.substr(delimeter + 1);
  82. if (extension != "bio")
  83. {
  84. continue;
  85. }
  86. // Add biome
  87. std::string name = filename.substr(0, delimeter);
  88. Biome* biome = &biomes[name];
  89. biome->filename = directory + filename;
  90. }
  91. // Close biomes directory
  92. closedir(dir);
  93. // Load biomes
  94. for (std::map<std::string, Biome>::iterator it = biomes.begin(); it != biomes.end(); ++it)
  95. {
  96. Biome* biome = &it->second;
  97. if (!biome->load())
  98. {
  99. std::cout << "Failed to load biome \"" << biome->filename << "\"" << std::endl;
  100. }
  101. else
  102. {
  103. std::cout << "Loaded biome \"" << biome->filename << "\"" << std::endl;
  104. }
  105. }
  106. return true;
  107. }