1
0
Fork 0
Univerxel/src/server/world/Area.hpp

41 lines
1.5 KiB
C++

#pragma once
#include "../../core/world/Area.hpp"
#include <shared_mutex_guarded.h>
using namespace libguarded;
#include "region/index.hpp"
#include "generator.hpp"
namespace world::server {
/// Area (aka big group of server::Chunk)
struct Area final: public world::Area {
public:
using regions_t = robin_hood::unordered_map<region_pos, std::shared_ptr<Region>>;
struct params {
voxel_pos center;
int radius;
generator::params properties;
};
Area(const params& p): world::Area(p.center, p.radius), generator(generator::load(p.properties)), generator_properties(p.properties) { }
std::shared_ptr<Region> getRegion(const std::string& folderPath, const area_<region_pos> &);
shared_guarded<regions_t>::handle getRegions() { return regions.lock(); }
inline const std::unique_ptr<generator::Abstract> &getGenerator() { return generator; }
inline params getParams() const { return params{getOffset().as_voxel(), getChunks().getRadius(), generator_properties}; }
std::optional<double> getCurvature() const override { return GetCurvature(generator_properties); }
static std::optional<double> GetCurvature(const generator::params &);
inline const glm::vec3 getGravity(const voxel_pos& p) const { return generator->getGravity(p); }
private:
shared_guarded<regions_t> regions;
std::unique_ptr<generator::Abstract> generator;
const generator::params generator_properties; //MAYBE: useless copy
};
}