Rudimentary Scene loading
This commit is contained in:
		@ -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;
 | 
			
		||||
@ -16,74 +20,72 @@ void WriteFile(std::string& emitter, std::filesystem::path path)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
YAML::Emitter& operator<< (YAML::Emitter& emitter, glm::vec3& vector) {
 | 
			
		||||
	emitter << YAML::Flow <<  YAML::BeginSeq << vector.x << vector.y << vector.x << YAML::EndSeq;
 | 
			
		||||
	emitter << YAML::Flow << YAML::BeginSeq   << vector.x << vector.y << vector.x << YAML::EndSeq;
 | 
			
		||||
	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();
 | 
			
		||||
 | 
			
		||||
	 sceneFile.close();
 | 
			
		||||
	if (!sceneYAML["Scene"]) {
 | 
			
		||||
		 spdlog::error("Not a scene file!");
 | 
			
		||||
		 return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	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>());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	 
 | 
			
		||||
 | 
			
		||||
 }
 | 
			
		||||
		Reference in New Issue
	
	Block a user