feat: cameras saving/loading
This commit is contained in:
parent
45c4da048c
commit
a013e7eefd
@ -31,7 +31,7 @@ Content::Content(
|
||||
UptrsMap<std::string, ContentPackRuntime> packs,
|
||||
UptrsMap<std::string, BlockMaterial> blockMaterials,
|
||||
UptrsMap<std::string, rigging::SkeletonConfig> skeletons,
|
||||
const ResourceIndicesSet& resourceIndices
|
||||
ResourceIndicesSet resourceIndices
|
||||
) : indices(std::move(indices)),
|
||||
packs(std::move(packs)),
|
||||
blockMaterials(std::move(blockMaterials)),
|
||||
@ -42,7 +42,7 @@ Content::Content(
|
||||
drawGroups(std::move(drawGroups))
|
||||
{
|
||||
for (size_t i = 0; i < RESOURCE_TYPES_COUNT; i++) {
|
||||
this->resourceIndices[i] = resourceIndices[i];
|
||||
this->resourceIndices[i] = std::move(resourceIndices[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -111,16 +111,18 @@ public:
|
||||
class ResourceIndices {
|
||||
std::vector<std::string> names;
|
||||
std::unordered_map<std::string, size_t> indices;
|
||||
std::vector<dynamic::Map_sptr> savedData;
|
||||
std::unique_ptr<std::vector<dynamic::Map_sptr>> savedData;
|
||||
public:
|
||||
ResourceIndices() {}
|
||||
ResourceIndices()
|
||||
: savedData(std::make_unique<std::vector<dynamic::Map_sptr>>()){
|
||||
}
|
||||
|
||||
static constexpr size_t MISSING = -1;
|
||||
|
||||
void add(std::string name, dynamic::Map_sptr map) {
|
||||
indices[name] = names.size();
|
||||
names.push_back(name);
|
||||
savedData.push_back(map);
|
||||
savedData->push_back(map);
|
||||
}
|
||||
|
||||
const std::string& getName(size_t index) const {
|
||||
@ -136,11 +138,11 @@ public:
|
||||
}
|
||||
|
||||
dynamic::Map_sptr getSavedData(size_t index) const {
|
||||
return savedData.at(index);
|
||||
return savedData->at(index);
|
||||
}
|
||||
|
||||
void saveData(size_t index, dynamic::Map_sptr map) {
|
||||
savedData.at(index) = map;
|
||||
void saveData(size_t index, dynamic::Map_sptr map) const {
|
||||
savedData->at(index) = map;
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
@ -186,7 +188,7 @@ public:
|
||||
UptrsMap<std::string, ContentPackRuntime> packs,
|
||||
UptrsMap<std::string, BlockMaterial> blockMaterials,
|
||||
UptrsMap<std::string, rigging::SkeletonConfig> skeletons,
|
||||
const ResourceIndicesSet& resourceIndices
|
||||
ResourceIndicesSet resourceIndices
|
||||
);
|
||||
~Content();
|
||||
|
||||
@ -194,6 +196,10 @@ public:
|
||||
return indices.get();
|
||||
}
|
||||
|
||||
inline const ResourceIndices& getIndices(ResourceType type) const {
|
||||
return resourceIndices[static_cast<size_t>(type)];
|
||||
}
|
||||
|
||||
const rigging::SkeletonConfig* getRig(const std::string& id) const;
|
||||
const BlockMaterial* findBlockMaterial(const std::string& id) const;
|
||||
const ContentPackRuntime* getPackRuntime(const std::string& id) const;
|
||||
|
||||
@ -76,7 +76,7 @@ std::unique_ptr<Content> ContentBuilder::build() {
|
||||
std::move(packs),
|
||||
std::move(blockMaterials),
|
||||
std::move(skeletons),
|
||||
resourceIndices
|
||||
std::move(resourceIndices)
|
||||
);
|
||||
|
||||
// Now, it's time to resolve foreign keys
|
||||
|
||||
@ -500,6 +500,7 @@ void ContentLoader::load() {
|
||||
|
||||
void ContentLoader::loadResources(ResourceType type, dynamic::List* list) {
|
||||
for (size_t i = 0; i < list->size(); i++) {
|
||||
builder.resourceIndices[static_cast<size_t>(type)].add(list->str(i), nullptr);
|
||||
builder.resourceIndices[static_cast<size_t>(type)].add(
|
||||
pack->id+":"+list->str(i), nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -59,6 +59,7 @@ void LevelController::saveWorld() {
|
||||
level->getWorld()->wfile->createDirectories();
|
||||
logger.info() << "writing world";
|
||||
scripting::on_world_save();
|
||||
level->onSave();
|
||||
level->getWorld()->write(level.get());
|
||||
}
|
||||
|
||||
|
||||
@ -5,20 +5,22 @@
|
||||
|
||||
class Camera {
|
||||
void updateVectors();
|
||||
float fov;
|
||||
float fov = 1.0f;
|
||||
public:
|
||||
glm::vec3 front;
|
||||
glm::vec3 up;
|
||||
glm::vec3 right;
|
||||
glm::vec3 dir;
|
||||
glm::vec3 front {};
|
||||
glm::vec3 up {};
|
||||
glm::vec3 right {};
|
||||
glm::vec3 dir {};
|
||||
|
||||
glm::vec3 position;
|
||||
glm::vec3 position {};
|
||||
|
||||
float zoom = 1.0f;
|
||||
glm::mat4 rotation {1.0f};
|
||||
bool perspective = true;
|
||||
bool flipped = false;
|
||||
float aspect = 0.0f;
|
||||
|
||||
Camera() {}
|
||||
Camera(glm::vec3 position, float fov);
|
||||
|
||||
void rotate(float x, float y, float z);
|
||||
|
||||
@ -13,6 +13,8 @@
|
||||
#include "../objects/Entities.hpp"
|
||||
#include "../items/Inventory.hpp"
|
||||
#include "../items/Inventories.hpp"
|
||||
#include "../window/Camera.hpp"
|
||||
#include "../data/dynamic_util.hpp"
|
||||
|
||||
Level::Level(
|
||||
std::unique_ptr<World> worldPtr,
|
||||
@ -51,6 +53,23 @@ Level::Level(
|
||||
|
||||
inventories = std::make_unique<Inventories>(*this);
|
||||
inventories->store(player->getInventory());
|
||||
|
||||
auto& cameraIndices = content->getIndices(ResourceType::CAMERA);
|
||||
for (size_t i = 0; i < cameraIndices.size(); i++) {
|
||||
auto camera = std::make_shared<Camera>();
|
||||
if (auto map = cameraIndices.getSavedData(i)) {
|
||||
dynamic::get_vec(map, "pos", camera->position);
|
||||
dynamic::get_vec(map, "front", camera->front);
|
||||
dynamic::get_vec(map, "up", camera->up);
|
||||
map->flag("perspective", camera->perspective);
|
||||
map->flag("flipped", camera->flipped);
|
||||
map->num("zoom", camera->zoom);
|
||||
float fov = camera->getFov();
|
||||
map->num("fov", fov);
|
||||
camera->setFov(fov);
|
||||
}
|
||||
cameras.push_back(std::move(camera));
|
||||
}
|
||||
}
|
||||
|
||||
Level::~Level(){
|
||||
@ -73,3 +92,19 @@ void Level::loadMatrix(int32_t x, int32_t z, uint32_t radius) {
|
||||
World* Level::getWorld() {
|
||||
return world.get();
|
||||
}
|
||||
|
||||
void Level::onSave() {
|
||||
auto& cameraIndices = content->getIndices(ResourceType::CAMERA);
|
||||
for (size_t i = 0; i < cameraIndices.size(); i++) {
|
||||
auto& camera = *cameras.at(i);
|
||||
auto map = dynamic::create_map();
|
||||
map->put("pos", dynamic::to_value(camera.position));
|
||||
map->put("front", dynamic::to_value(camera.front));
|
||||
map->put("up", dynamic::to_value(camera.up));
|
||||
map->put("perspective", camera.perspective);
|
||||
map->put("flipped", camera.flipped);
|
||||
map->put("zoom", camera.zoom);
|
||||
map->put("fov", camera.getFov());
|
||||
cameraIndices.saveData(i, std::move(map));
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,6 +19,7 @@ class LevelEvents;
|
||||
class Lighting;
|
||||
class PhysicsSolver;
|
||||
class ChunksStorage;
|
||||
class Camera;
|
||||
struct EngineSettings;
|
||||
|
||||
/// @brief A level, contains chunks and objects
|
||||
@ -35,6 +36,7 @@ public:
|
||||
std::unique_ptr<Lighting> lighting;
|
||||
std::unique_ptr<LevelEvents> events;
|
||||
std::unique_ptr<Entities> entities;
|
||||
std::vector<std::shared_ptr<Camera>> cameras; // move somewhere?
|
||||
|
||||
const EngineSettings& settings;
|
||||
|
||||
@ -71,6 +73,8 @@ public:
|
||||
std::shared_ptr<T> object = std::dynamic_pointer_cast<T>(objects[id]);
|
||||
return object;
|
||||
}
|
||||
|
||||
void onSave();
|
||||
};
|
||||
|
||||
#endif /* WORLD_LEVEL_HPP_ */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user