DimensionGenerator.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #pragma once
  2. #include <Array.h>
  3. #include <Either.h>
  4. #include <ReferenceCounter.h>
  5. #include "BiomGenerator.h"
  6. #include "CaveGenerator.h"
  7. #include "Chunk.h"
  8. #include "JNoise.h"
  9. #include "JsonExpression.h"
  10. // #define CHUNK_GENERATION_DEBUG_LOG to log generation times of chunks
  11. class DimensionGenerator;
  12. class WorldHeightLayer : public virtual Framework::ReferenceCounter
  13. {
  14. private:
  15. Framework::JSON::JSONObject* noiseConfig;
  16. Noise* noise;
  17. Framework::Text name;
  18. JFloatExpression* value;
  19. float* valueP;
  20. public:
  21. WorldHeightLayer();
  22. ~WorldHeightLayer();
  23. void initialize(JExpressionMemory* zMemory);
  24. void calculateValue();
  25. void setNoiseConfig(Framework::JSON::JSONObject* noiseConfig);
  26. Framework::JSON::JSONObject* zNoiseConfig() const;
  27. void setName(Framework::Text name);
  28. Framework::Text getName() const;
  29. void setValue(JFloatExpression* value);
  30. JFloatExpression* zValue() const;
  31. };
  32. class WorldHeightLayerFactory : public ObjectTypeFactory<WorldHeightLayer>
  33. {
  34. public:
  35. WorldHeightLayerFactory();
  36. WorldHeightLayer* fromJson(
  37. Framework::JSON::JSONObject* zJson) const override;
  38. Framework::JSON::JSONObject* toJsonObject(
  39. WorldHeightLayer* zObject) const override;
  40. JSONObjectValidationBuilder* addToValidator(
  41. JSONObjectValidationBuilder* builder) const override;
  42. };
  43. class DimensionGenerator : public virtual Framework::ReferenceCounter
  44. {
  45. private:
  46. JExpressionMemory* jExpressionMemory;
  47. JFloatExpression* seedExpression;
  48. Framework::RCArray<WorldHeightLayer> heightLayers;
  49. Framework::Text name;
  50. int dimensionId;
  51. float* worldSeed;
  52. float* dimensionSeed;
  53. protected:
  54. float *xPos, *yPos, *zPos;
  55. DimensionGenerator();
  56. ~DimensionGenerator();
  57. JExpressionMemory* zMemory() const;
  58. void calculateHeightLayers();
  59. public:
  60. Dimension* createDimension();
  61. virtual void initialize(int worldSeed);
  62. virtual Chunk* generateChunk(int centerX, int centerY) = 0;
  63. virtual void postprocessChunk(Chunk* zChunk) = 0;
  64. virtual Framework::Either<Block*, int> generateBlock(
  65. Framework::Vec3<int> location)
  66. = 0;
  67. virtual bool spawnStructure(Framework::Vec3<int> location,
  68. std::function<bool(GeneratorTemplate* tmpl)> filter)
  69. = 0;
  70. virtual void generateEntities(Chunk* zChunk) = 0;
  71. int getDimensionId() const;
  72. void addHeightLayer(WorldHeightLayer* layer);
  73. const Framework::RCArray<WorldHeightLayer>& getHeightLayers() const;
  74. void setName(Framework::Text name);
  75. Framework::Text getName() const;
  76. void setId(int id);
  77. int getId() const;
  78. void setSeed(JFloatExpression* seed);
  79. JFloatExpression* zSeed() const;
  80. };
  81. template<typename S> class DimensionGeneratorFactory
  82. : public SubTypeFactory<DimensionGenerator, S>
  83. {
  84. public:
  85. DimensionGeneratorFactory()
  86. : SubTypeFactory<DimensionGenerator, S>()
  87. {}
  88. S* fromJson(Framework::JSON::JSONObject* zJson) const override
  89. {
  90. S* result = createValue(zJson);
  91. DimensionGenerator* zGenerator
  92. = dynamic_cast<DimensionGenerator*>(result);
  93. zGenerator->setName(zJson->zValue("name")->asString()->getString());
  94. zGenerator->setId((int)zJson->zValue("id")->asNumber()->getNumber());
  95. zGenerator->setSeed(
  96. Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  97. zJson->zValue("dimensionSeed")));
  98. for (Framework::JSON::JSONValue* layer :
  99. *zJson->zValue("heightLayers")->asArray())
  100. {
  101. zGenerator->addHeightLayer(
  102. Game::INSTANCE->zTypeRegistry()->fromJson<WorldHeightLayer>(
  103. layer));
  104. }
  105. return result;
  106. }
  107. Framework::JSON::JSONObject* toJsonObject(S* zObject) const override
  108. {
  109. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  110. DimensionGenerator* zGenerator
  111. = dynamic_cast<DimensionGenerator*>(zObject);
  112. result->addValue(
  113. "name", new Framework::JSON::JSONString(zGenerator->getName()));
  114. result->addValue(
  115. "id", new Framework::JSON::JSONNumber(zGenerator->getId()));
  116. result->addValue("dimensionSeed",
  117. Game::INSTANCE->zTypeRegistry()->toJson<JFloatExpression>(
  118. zGenerator->zSeed()));
  119. Framework::JSON::JSONArray* hightLayers
  120. = new Framework::JSON::JSONArray();
  121. for (WorldHeightLayer* layer : zGenerator->getHeightLayers())
  122. {
  123. hightLayers->addValue(
  124. Game::INSTANCE->zTypeRegistry()->toJson(layer));
  125. }
  126. result->addValue("heightLayers", hightLayers);
  127. return result;
  128. }
  129. JSONObjectValidationBuilder* addToValidator(
  130. JSONObjectValidationBuilder* builder) const override
  131. {
  132. return builder
  133. ->withRequiredAttribute("dimensionSeed",
  134. Game::INSTANCE->zTypeRegistry()
  135. ->getValidator<JFloatExpression>())
  136. ->withRequiredArray("heightLayers")
  137. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  138. ->getValidator<WorldHeightLayer>())
  139. ->finishArray()
  140. ->withRequiredString("name")
  141. ->finishString()
  142. ->withRequiredNumber("id")
  143. ->finishNumber();
  144. }
  145. protected:
  146. virtual S* createValue(Framework::JSON::JSONObject* zJson) const = 0;
  147. };
  148. class BiomGenerator;
  149. class BiomedCavedDimensionGenerator : public DimensionGenerator
  150. {
  151. private:
  152. Framework::RCArray<BiomGenerator> biomGenerators;
  153. CaveGenerator* caveGenerator;
  154. Framework::JSON::JSONObject* noiseConfig;
  155. Noise* biomNoise;
  156. Framework::Vec3<int> minStructureOffset;
  157. Framework::Vec3<int> maxStructureOffset;
  158. Framework::Text terrainHeightLayerName;
  159. int globalSeaLevel;
  160. float* terrainHeightP;
  161. Framework::Text seaFluidBlockType;
  162. int seaFluidBlockTypeId;
  163. BiomGenerator* zBiomGenerator();
  164. protected:
  165. Framework::RCArray<GeneratedStructure>* getGeneratedStructoresForArea(
  166. Framework::Vec3<int> minPos, Framework::Vec3<int> maxPos);
  167. public:
  168. BiomedCavedDimensionGenerator();
  169. ~BiomedCavedDimensionGenerator();
  170. virtual void initialize(int worldSeed) override;
  171. Chunk* generateChunk(int centerX, int centerY) override;
  172. void postprocessChunk(Chunk* zChunk) override;
  173. void generateEntities(Chunk* zChunk) override;
  174. Framework::Either<Block*, int> generateBlock(
  175. Framework::Vec3<int> location) override;
  176. bool spawnStructure(Framework::Vec3<int> location,
  177. std::function<bool(GeneratorTemplate* tmpl)> filter) override;
  178. void addBiomGenerator(BiomGenerator* biomGenerator);
  179. const Framework::RCArray<BiomGenerator>& getBiomGenerators() const;
  180. void setBiomNoiseConfig(Framework::JSON::JSONObject* biomNoiseConfig);
  181. Framework::JSON::JSONObject* zBiomNoiseConfig() const;
  182. void setGlobalSeaLevel(int seaLevel);
  183. int getGlobalSeaLevel() const;
  184. void setTerrainHeightLayerName(Framework::Text name);
  185. Framework::Text getTerrainHeightLayerName() const;
  186. void setSeaFluidBlockType(Framework::Text type);
  187. Framework::Text getSeaFluidBlockType() const;
  188. };
  189. class BiomedCavedDimensionGeneratorFactory
  190. : public DimensionGeneratorFactory<BiomedCavedDimensionGenerator>
  191. {
  192. public:
  193. BiomedCavedDimensionGeneratorFactory();
  194. BiomedCavedDimensionGenerator* createValue(
  195. Framework::JSON::JSONObject* zJson) const override;
  196. BiomedCavedDimensionGenerator* fromJson(
  197. Framework::JSON::JSONObject* zJson) const override;
  198. Framework::JSON::JSONObject* toJsonObject(
  199. BiomedCavedDimensionGenerator* zObject) const override;
  200. JSONObjectValidationBuilder* addToValidator(
  201. JSONObjectValidationBuilder* builder) const override;
  202. const char* getTypeToken() const override;
  203. };