diff --git a/Hazel/src/Hazel/Scene/SceneSerializer.cpp b/Hazel/src/Hazel/Scene/SceneSerializer.cpp index 935c1e1..92d2b68 100644 --- a/Hazel/src/Hazel/Scene/SceneSerializer.cpp +++ b/Hazel/src/Hazel/Scene/SceneSerializer.cpp @@ -220,6 +220,9 @@ namespace Hazel out << YAML::BeginMap; // SpriteRendererComponent auto& spriteRendererComponent = entity.GetComponent(); out << YAML::Key << "Color" << YAML::Value << spriteRendererComponent.Color; + if (spriteRendererComponent.Texture) + out << YAML::Key << "TexturePath" << YAML::Value << spriteRendererComponent.Texture->GetPath(); + out << YAML::Key << "TilingFactor" << YAML::Value << spriteRendererComponent.TilingFactor; out << YAML::EndMap; // SpriteRendererComponent } @@ -295,20 +298,47 @@ namespace Hazel bool SceneSerializer::Deserialize(const std::string& filepath) { const std::ifstream stream(filepath); + + if (!stream.is_open()) + { + HZ_CORE_ERROR("Could not open file {0}", filepath); + return false; + } + std::stringstream strStream; strStream << stream.rdbuf(); - YAML::Node data = YAML::Load(strStream.str()); + if (strStream.str().empty()) + { + HZ_CORE_ERROR("Empty scene file: {0}", filepath); + return false; + } + + YAML::Node data; + try { + data = YAML::Load(strStream.str()); + } + catch (const YAML::Exception& e) { + HZ_CORE_ERROR("YAML parsing failed: {0}\nFile: {1}", e.what(), filepath); + return false; + } + + if (data.IsNull() || !data.IsDefined() || !data.IsMap()) + { + HZ_CORE_ERROR("YAML parsing failed: {0}", filepath); + return false; + } + if (!data["Scene"]) { - HZ_CORE_WARN("cannot find key: Scene"); + HZ_CORE_ERROR("cannot find key: Scene"); return false; } auto sceneName = data["Scene"].as(); - HZ_CORE_TRACE("Deserializing Scene {}", strStream.str()); + HZ_CORE_DEBUG("Deserializing Scene {}", strStream.str()); auto entities = data["Entities"]; if (entities) @@ -358,8 +388,11 @@ namespace Hazel auto spriteRendererComponent = entity["SpriteRendererComponent"]; if (spriteRendererComponent) { - auto& sprite = deserializedEntity.AddComponent(); - sprite.Color = spriteRendererComponent["Color"].as(); + auto& sprite = deserializedEntity.AddComponent(); + sprite.Color = spriteRendererComponent["Color"].as(); + sprite.TilingFactor = spriteRendererComponent["TilingFactor"].as(); + if (spriteRendererComponent["TexturePath"]) + sprite.Texture = Texture2D::Create(spriteRendererComponent["TexturePath"].as()); } auto circleRendererComponent = entity["CircleRendererComponent"];