💿🐜 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.

123 lines
3.2 KiB

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