#pragma once #include #include #include #include "asset_base.hpp" struct GameObjectAsset; struct TransformAsset : public AssetBase { glm::quat Rotation; glm::vec3 Position; glm::vec3 Scale; glm::mat4 GlobalMatrix; GameObjectAsset* GameObject{ nullptr }; std::vector Children; TransformAsset* Parent{ nullptr }; }; inline glm::vec3 ParseVector3(const ryml::ConstNodeRef& node) { glm::vec3 vector; node["x"] >> vector.x; node["y"] >> vector.y; node["z"] >> vector.z; return vector; } inline glm::quat ParseQuaternion(const ryml::ConstNodeRef& node) { glm::quat quaternion; node["x"] >> quaternion.x; node["y"] >> quaternion.y; node["z"] >> quaternion.z; node["w"] >> quaternion.w; return quaternion; } inline TransformAsset ParseTransform(const ryml::ConstNodeRef& node) { TransformAsset transform; transform.Rotation = ParseQuaternion(node["m_LocalRotation"]); transform.Position = ParseVector3(node["m_LocalPosition"]); transform.Scale = ParseVector3(node["m_LocalScale"]); transform.Parent = ParseAssetRef(node["m_Father"]); transform.GameObject = ParseAssetRef(node["m_GameObject"]); auto children = node["m_Children"]; for (const auto& child : children) { transform.Children.push_back(ParseAssetRef(child)); } return transform; } inline void LinkTransform(const std::unordered_map& assetsMap, TransformAsset& transform) { LinkAssetRef(assetsMap, transform.Parent); for (int i = static_cast(transform.Children.size()) - 1; i >= 0; i--) { if (!LinkAssetRef(assetsMap, transform.Children[i])) { std::swap(transform.Children[i], transform.Children.back()); transform.Children.pop_back(); } } LinkAssetRef(assetsMap, transform.GameObject); }