Rudimentary Scene loading
This commit is contained in:
parent
9a9db279a5
commit
c57177a1a9
@ -1,9 +1,13 @@
|
||||
#pragma once
|
||||
#include <yaml-cpp/yaml.h>
|
||||
#include <yaml-cpp/node/type.h>
|
||||
|
||||
#include <string>
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
|
||||
#include "../../YoggieEngine/src/Scene/Entity.h"
|
||||
|
||||
void WriteFile(std::string& emitter, std::filesystem::path path)
|
||||
{
|
||||
std::cout << "Writing Scene file to: " << path.u8string() << std::endl;
|
||||
@ -20,70 +24,68 @@ YAML::Emitter& operator<< (YAML::Emitter& emitter, glm::vec3& vector) {
|
||||
return emitter;
|
||||
}
|
||||
|
||||
void Serialize(YAML::Emitter& emitter, TransformComponent& transform)
|
||||
{
|
||||
emitter << YAML::BeginMap;
|
||||
emitter << YAML::Key << "Transform" << YAML::Value << YAML::Flow << YAML::BeginSeq;
|
||||
|
||||
emitter << YAML::Key << "Position";
|
||||
emitter << YAML::Value << transform.Position;
|
||||
|
||||
emitter << YAML::Key << "Rotation";
|
||||
emitter << YAML::Value << transform.Rotation;
|
||||
|
||||
emitter << YAML::Key << "Scale";
|
||||
emitter << YAML::Value << transform.Scale;
|
||||
|
||||
emitter << YAML::EndSeq << YAML::EndMap;
|
||||
}
|
||||
|
||||
void Serialize(YAML::Emitter& emitter, IdentifierComponent& identifier)
|
||||
{
|
||||
emitter << YAML::BeginMap;
|
||||
emitter << YAML::Key << "Ident";
|
||||
emitter << YAML::Value << identifier.name;
|
||||
emitter << YAML::EndMap;
|
||||
}
|
||||
|
||||
void Serialize(YAML::Emitter& emitter, LightComponent& light)
|
||||
{
|
||||
emitter << YAML::BeginMap << "Light";
|
||||
emitter << YAML::Key << "strength";
|
||||
emitter << YAML::Value << light.Strength;
|
||||
|
||||
emitter << YAML::Key << "Color";
|
||||
emitter << YAML::Value << light.Color;
|
||||
emitter << YAML::EndMap;
|
||||
}
|
||||
|
||||
std::string Serialize( Scene& scene) {
|
||||
YAML::Emitter sceneYAML;
|
||||
YAML::Emitter emitter;
|
||||
|
||||
sceneYAML << "YOGGIE_SCENE_FILE" ;
|
||||
emitter << YAML::BeginMap;
|
||||
emitter << YAML::Key << "Scene" << YAML::Value << "test-Scene";
|
||||
emitter << YAML::Key << "Entities" << YAML::Value << YAML::BeginSeq;
|
||||
|
||||
|
||||
scene.getReg().each([&scene, &sceneYAML](auto enttNumber) {
|
||||
scene.getReg().each([&scene, &emitter](auto enttNumber) {
|
||||
Entity entity = Entity(enttNumber, &scene);
|
||||
|
||||
Serialize(sceneYAML, entity.GetComponent<IdentifierComponent>());
|
||||
Serialize(sceneYAML, entity.GetComponent<TransformComponent>());
|
||||
if (entity.HasComponent<LightComponent>()) {
|
||||
Serialize(sceneYAML, entity.GetComponent<LightComponent>());
|
||||
emitter << YAML::BeginMap;
|
||||
emitter << YAML::Key << "Entity" << YAML::Value << entity.GetComponent<IdentifierComponent>().name;
|
||||
|
||||
if (entity.HasComponent<IdentifierComponent>()) {
|
||||
emitter << YAML::Key << "Ident";
|
||||
emitter << YAML::BeginMap;
|
||||
emitter << YAML::Value << entity.GetComponent<IdentifierComponent>().name;
|
||||
emitter << YAML::EndMap;
|
||||
}
|
||||
|
||||
if (entity.HasComponent<TransformComponent>()) {
|
||||
emitter << YAML::Key << "Transform" << YAML::Value ;
|
||||
|
||||
emitter << YAML::BeginMap;
|
||||
|
||||
emitter << YAML::Key << "Position";
|
||||
emitter << YAML::Value << entity.GetComponent<TransformComponent>().Position;
|
||||
|
||||
emitter << YAML::Key << "Rotation";
|
||||
emitter << YAML::Value << entity.GetComponent<TransformComponent>().Rotation;
|
||||
|
||||
emitter << YAML::Key << "Scale";
|
||||
emitter << YAML::Value << entity.GetComponent<TransformComponent>().Scale;
|
||||
|
||||
emitter << YAML::EndMap;
|
||||
}
|
||||
|
||||
|
||||
if (entity.HasComponent<LightComponent>()) {
|
||||
emitter << YAML::Key << "Light";
|
||||
emitter << YAML::Value;
|
||||
emitter << YAML::BeginMap;
|
||||
emitter << YAML::Key << "strength";
|
||||
emitter << YAML::Value << entity.GetComponent<LightComponent>().Strength;
|
||||
|
||||
emitter << YAML::Key << "Color";
|
||||
emitter << YAML::Value << entity.GetComponent<LightComponent>().Color;
|
||||
emitter << YAML::EndMap;
|
||||
|
||||
}
|
||||
|
||||
|
||||
emitter << YAML::EndMap;
|
||||
|
||||
});
|
||||
return std::string(sceneYAML.c_str());
|
||||
|
||||
emitter << YAML::EndSeq;
|
||||
emitter << YAML::EndMap;
|
||||
|
||||
return std::string(emitter.c_str());
|
||||
}
|
||||
|
||||
void Parse(std::string& YAML) {
|
||||
std::vector<YAML::Node> nodes = YAML::LoadAll(YAML);
|
||||
|
||||
for(YAML::Node node : nodes)
|
||||
{
|
||||
std::cout << node.Type() << std::endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SaveScene(std::filesystem::path path, Scene& scene) {
|
||||
std::string YAMLString = Serialize(scene);
|
||||
@ -93,17 +95,45 @@ void Serialize(YAML::Emitter& emitter, LightComponent& light)
|
||||
|
||||
void LoadScene(std::filesystem::path path, Scene& scene)
|
||||
{
|
||||
std::ifstream sceneFile;
|
||||
std::string YAMLScene;
|
||||
sceneFile.open(path.u8string());
|
||||
auto sceneYAML = YAML::LoadFile(path.u8string());
|
||||
|
||||
std::stringstream sstream;
|
||||
sstream << sceneFile.rdbuf();
|
||||
YAMLScene = sstream.str();
|
||||
if (!sceneYAML["Scene"]) {
|
||||
spdlog::error("Not a scene file!");
|
||||
return;
|
||||
}
|
||||
|
||||
sceneFile.close();
|
||||
scene.getReg().clear();
|
||||
|
||||
|
||||
Parse(YAMLScene);
|
||||
|
||||
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"])
|
||||
{
|
||||
TransformComponent tc = SE.GetComponent<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"]) {
|
||||
LightComponent lc = SE.AddComponent<LightComponent>();
|
||||
lc.Strength = entity["Light"]["strength"].as<float>();
|
||||
lc.Color = glm::vec3(entity["Light"]["Color"][0].as<float>(), entity["Light"]["Color"][1].as<float>(), entity["Light"]["Color"][2].as<float>());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user