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