129 lines
3.8 KiB
C++
129 lines
3.8 KiB
C++
#include "SceneSerializer.h"
|
|
#include "../../YoggieEngine/src/YoggieEngine.h"
|
|
#include <yaml-cpp/yaml.h>
|
|
#include <yaml-cpp/node/type.h>
|
|
#include <filesystem>
|
|
|
|
void WriteFile(std::string& emitter, std::filesystem::path path)
|
|
{
|
|
spdlog::info( "Writing Scene file to: {0}" , path.u8string());
|
|
std::ofstream sceneFile;
|
|
sceneFile.open(path.u8string());
|
|
|
|
sceneFile << emitter.c_str();
|
|
|
|
sceneFile.close();
|
|
}
|
|
|
|
YAML::Emitter& operator<< (YAML::Emitter& emitter, glm::vec3& vector) {
|
|
emitter << YAML::Flow << YAML::BeginSeq << vector.x << vector.y << vector.x << YAML::EndSeq;
|
|
return emitter;
|
|
}
|
|
|
|
|
|
|
|
std::string Serialize(YoggieEngine::Scene& scene) {
|
|
YAML::Emitter emitter;
|
|
|
|
emitter << YAML::BeginMap;
|
|
emitter << YAML::Key << "Scene" << YAML::Value << "test-Scene";
|
|
emitter << YAML::Key << "Entities" << YAML::Value << YAML::BeginSeq;
|
|
|
|
scene.getReg().each([&emitter, &scene](entt::entity enttNumber) {
|
|
|
|
YoggieEngine::Entity entity = YoggieEngine::Entity(enttNumber, &scene);
|
|
|
|
emitter << YAML::BeginMap;
|
|
emitter << YAML::Key << "Entity" << YAML::Value << entity.GetComponent<YoggieEngine::IdentifierComponent>().name;
|
|
|
|
if (entity.HasComponent<YoggieEngine::IdentifierComponent>()) {
|
|
emitter << YAML::Key << "Ident";
|
|
emitter << YAML::BeginMap;
|
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::IdentifierComponent>().name;
|
|
emitter << YAML::EndMap;
|
|
}
|
|
|
|
if (entity.HasComponent<YoggieEngine::TransformComponent>()) {
|
|
emitter << YAML::Key << "Transform" << YAML::Value;
|
|
|
|
emitter << YAML::BeginMap;
|
|
|
|
emitter << YAML::Key << "Position";
|
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::TransformComponent>().Position;
|
|
|
|
emitter << YAML::Key << "Rotation";
|
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::TransformComponent>().Rotation;
|
|
|
|
emitter << YAML::Key << "Scale";
|
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::TransformComponent>().Scale;
|
|
|
|
emitter << YAML::EndMap;
|
|
}
|
|
|
|
|
|
if (entity.HasComponent<YoggieEngine::LightComponent>()) {
|
|
emitter << YAML::Key << "Light";
|
|
emitter << YAML::Value;
|
|
emitter << YAML::BeginMap;
|
|
emitter << YAML::Key << "Color";
|
|
emitter << YAML::Value << entity.GetComponent<YoggieEngine::LightComponent>().Color;
|
|
emitter << YAML::EndMap;
|
|
}
|
|
|
|
|
|
emitter << YAML::EndMap;
|
|
});
|
|
|
|
emitter << YAML::EndSeq;
|
|
emitter << YAML::EndMap;
|
|
|
|
return std::string(emitter.c_str());
|
|
}
|
|
|
|
|
|
void SaveScene(std::filesystem::path path, YoggieEngine::Scene& scene) {
|
|
std::string YAMLString = Serialize(scene);
|
|
WriteFile(YAMLString, path);
|
|
}
|
|
|
|
|
|
void LoadScene(std::filesystem::path path, YoggieEngine::Scene& scene)
|
|
{
|
|
auto sceneYAML = YAML::LoadFile(path.u8string());
|
|
|
|
if (!sceneYAML["Scene"]) {
|
|
spdlog::error("Not a scene file!");
|
|
return;
|
|
}
|
|
|
|
scene.getReg().clear();
|
|
|
|
std::string SceneName = sceneYAML["Scene"].as<std::string>();
|
|
|
|
auto entities = sceneYAML["Entities"];
|
|
|
|
for (const auto& entity : entities) {
|
|
|
|
std::string entityID = entity["Ident"].as<std::string>();
|
|
YoggieEngine::Entity SE = scene.AddEntity(entityID);
|
|
if (entity["Transform"])
|
|
{
|
|
YoggieEngine::TransformComponent tc = SE.GetComponent <YoggieEngine::TransformComponent> ();
|
|
auto positionNode = entity["Transform"]["Position"];
|
|
tc.Position = glm::vec3(positionNode[0].as<float>(), positionNode[1].as<float>(), positionNode[2].as<float>());
|
|
|
|
auto rotationNode = entity["Transform"]["Rotation"];
|
|
tc.Rotation = glm::vec3(rotationNode[0].as<float>(), rotationNode[1].as<float>(), rotationNode[2].as<float>());
|
|
|
|
auto scaleNode = entity["Transform"]["Scale"];
|
|
tc.Scale = glm::vec3(scaleNode[0].as<float>(), scaleNode[1].as<float>(), scaleNode[2].as<float>());
|
|
}
|
|
if (entity["Light"]) {
|
|
YoggieEngine::LightComponent lc = SE.AddComponent<YoggieEngine::LightComponent>();
|
|
lc.Color = glm::vec3(entity["Light"]["Color"][0].as<float>(), entity["Light"]["Color"][1].as<float>(), entity["Light"]["Color"][2].as<float>());
|
|
}
|
|
|
|
}
|
|
|
|
|
|
} |