1
0
Fork 0
Univerxel/src/world/Universe.hpp

118 lines
4.1 KiB
C++
Raw Normal View History

2020-07-25 16:45:03 +00:00
#pragma once
2020-07-31 17:09:44 +00:00
#include <string>
2020-07-25 16:45:03 +00:00
#include <thread>
2020-07-31 17:09:44 +00:00
#include "../data/math.hpp"
2020-07-25 16:45:03 +00:00
#include "../data/safe_queue.hpp"
#include "../data/safe_priority_queue.hpp"
#include "../data/circular_buffer.hpp"
#include "../data/geometry/Ray.hpp"
2020-08-04 18:34:47 +00:00
#include "../data/geometry/Frustum.hpp"
2020-07-31 17:09:44 +00:00
#include "forward.h"
2020-08-02 20:15:53 +00:00
#include "Area.hpp"
2020-07-31 17:09:44 +00:00
#include "Voxel.hpp"
2020-07-25 16:45:03 +00:00
namespace contouring {
class Abstract;
};
2020-08-04 18:34:47 +00:00
namespace buffer {
class Abstract;
}
2020-07-25 16:45:03 +00:00
using namespace data;
/// Universe data
namespace world {
/// Whole universe container
class Universe {
public:
/// Distance management
struct options {
/// Radius in chunks to load if missing
int loadDistance = 5;
/// Radius in chunks to keep in memory
int keepDistance = 6;
2020-07-26 20:53:14 +00:00
/// Storage path
std::string folderPath = "world";
2020-07-25 16:45:03 +00:00
};
2020-07-31 17:09:44 +00:00
Universe(const options &);
2020-07-25 16:45:03 +00:00
~Universe();
/// Update physics and contouring
2020-08-07 17:08:02 +00:00
void update(const voxel_pos &pos, float deltaTime);
2020-07-25 16:45:03 +00:00
/// Apply new options
void setOptions(const options &);
2020-08-03 16:15:02 +00:00
struct ray_target {
area_<voxel_pos> pos;
Voxel value;
voxel_pos offset;
};
2020-07-25 16:45:03 +00:00
/// Get nearest voxel colliding ray
/// @note ray in world scale
2020-08-03 16:15:02 +00:00
std::optional<ray_target> raycast(const geometry::Ray &ray) const;
2020-07-25 16:45:03 +00:00
/// Set voxel at pos
2020-08-02 20:15:53 +00:00
std::optional<Item> set(const area_<voxel_pos> &pos, const Voxel &val);
2020-07-25 16:45:03 +00:00
/// Set cube of voxel with pos as center
2020-08-02 20:15:53 +00:00
/// MAYBE: allow set multi area
ItemList setCube(const area_<voxel_pos> &pos, const Voxel &val, int radius);
2020-08-08 13:03:20 +00:00
/// Check for collision on movement
bool collide(const glm::ifvec3 &pos, const glm::vec3 &vel, int density, float radius = 0) const;
/// Move with collision check
/// @note must remove velocity after colision
bool move(glm::ifvec3 &pos, const glm::vec3 &vel, int density, float radius = 0) const;
2020-07-25 16:45:03 +00:00
2020-08-04 18:34:47 +00:00
/// Entities commun properties
struct Entity {
Entity(buffer::Abstract* buffer, const glm::vec3& size = glm::vec3(1), const glm::vec3& scale = glm::vec3(1)):
buffer(buffer), size(size), scale(scale) { };
buffer::Abstract* buffer;
glm::vec3 size;
glm::vec3 scale;
struct Instance {
glm::ifvec3 pos;
glm::vec3 velocity;
};
data::generational::vector<Instance> instances;
};
/// Instante entity
entity_instance_id addEntity(entity_id type, const Entity::Instance &instance);
void getEntitiesModels(std::vector<std::pair<std::vector<glm::mat4>, buffer::Abstract *const>> &buffers, const std::optional<geometry::Frustum> &frustum, const glm::llvec3 &offset, int density);
2020-07-25 16:45:03 +00:00
/// Change contouring worker
2020-07-31 23:17:09 +00:00
void setContouring(const std::shared_ptr<contouring::Abstract>& ct);
2020-07-25 16:45:03 +00:00
/// Get current contouring worker
std::shared_ptr<contouring::Abstract> getContouring() const {
return contouring;
}
private:
chunk_pos last_pos = chunk_pos(INT_MAX);
2020-08-02 20:15:53 +00:00
/// Alive areas containing chunks
area_map areas;
using area_it_t = robin_hood::pair<area_id, std::shared_ptr<Area>>;
2020-08-03 19:42:09 +00:00
/// Dead areas
2020-08-04 15:44:53 +00:00
data::generational::vector<Area::params> far_areas;
2020-08-03 19:42:09 +00:00
void saveAreas() const;
2020-07-25 16:45:03 +00:00
2020-08-04 18:34:47 +00:00
data::generational::vector<Entity> entities;
2020-07-30 16:35:13 +00:00
bool running = true;
2020-08-05 13:14:57 +00:00
std::vector<std::thread> workers;
2020-08-03 16:15:02 +00:00
safe_priority_queue_map<area_<chunk_pos>, std::shared_ptr<Area>, int, area_hash> loadQueue; //NOTE: consider Area const (getRegion uses mutex)
2020-08-02 20:15:53 +00:00
safe_queue<robin_hood::pair<area_<chunk_pos>, std::shared_ptr<Chunk>>> loadedQueue;
2020-07-25 16:45:03 +00:00
2020-08-02 20:15:53 +00:00
using save_task_t = std::pair<area_it_t, robin_hood::pair<chunk_pos, std::shared_ptr<Chunk>>>;
2020-08-03 16:15:02 +00:00
data::safe_queue<save_task_t> saveQueue; //NOTE: consider Area and Chunk const
2020-07-25 16:45:03 +00:00
int loadDistance;
int keepDistance;
2020-07-26 20:53:14 +00:00
std::string folderPath;
2020-07-25 16:45:03 +00:00
2020-07-31 22:11:08 +00:00
dict_set dicts;
2020-07-30 16:35:13 +00:00
2020-07-25 16:45:03 +00:00
/// Contouring worker
std::shared_ptr<contouring::Abstract> contouring;
};
}