diff options
author | rtk0c <[email protected]> | 2022-06-03 22:58:28 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2022-06-03 22:58:28 -0700 |
commit | 8510a85f79f706b93982b4e398b187b5f77081dd (patch) | |
tree | 996c27f54f748d940f58454f7ef1e1570d1a31d5 /source/30-game/GameObject.cpp | |
parent | bd07ae3f4e1bcdedc3e373460671ca9713a03de5 (diff) |
Changeset: 61 [BUGGED] Move object kind enums to use generated ToString and FromStrong
The old mechanism rely on a specific prefix to Ires and GameObject string representations, but the generator currently leaves the enum value. Therefore all editor (e.g. drag & drop) and IO (e.g. ires loading) mechanisms are broken.
Diffstat (limited to 'source/30-game/GameObject.cpp')
-rw-r--r-- | source/30-game/GameObject.cpp | 44 |
1 files changed, 15 insertions, 29 deletions
diff --git a/source/30-game/GameObject.cpp b/source/30-game/GameObject.cpp index 8bb3ec7..3b15111 100644 --- a/source/30-game/GameObject.cpp +++ b/source/30-game/GameObject.cpp @@ -2,11 +2,14 @@ #include "Level.hpp" #include "Player.hpp" -#include "RapidJsonHelper.hpp" #include "SceneThings.hpp" #include "World.hpp" +#include <Metadata.hpp> +#include <RapidJsonHelper.hpp> + #include <rapidjson/document.h> +#include <cassert> #include <string_view> #include <utility> @@ -14,11 +17,12 @@ using namespace std::literals; namespace ProjectBrussel_UNITY_ID { GameObject* CreateGameObject(GameObject::Kind kind, GameWorld* world) { + using enum Tags::GameObjectKind; switch (kind) { - case GameObject::KD_Generic: return new GameObject(world); - case GameObject::KD_SimpleGeometry: return new SimpleGeometryObject(world); - case GameObject::KD_Building: return new BuildingObject(world); - case GameObject::KD_LevelWrapper: return new LevelWrapperObject(world); + case KD_Generic: return new GameObject(world); + case KD_SimpleGeometry: return new SimpleGeometryObject(world); + case KD_Building: return new BuildingObject(world); + case KD_LevelWrapper: return new LevelWrapperObject(world); default: break; } return nullptr; @@ -60,27 +64,6 @@ GameObject::~GameObject() { } } -std::string_view GameObject::ToString(Kind kind) { - switch (kind) { - case KD_Generic: return "GameObject"sv; - case KD_Player: return "Player"sv; - case KD_SimpleGeometry: return "SimpleGeometry"sv; - case KD_Building: return "Building"sv; - case KD_LevelWrapper: return "LevelWrapper"sv; - case KD_COUNT: break; - } - return std::string_view(); -} - -GameObject::Kind GameObject::FromString(std::string_view name) { - if (name == "GameObject"sv) return KD_Generic; - if (name == "Player"sv) return KD_Player; - if (name == "SimpleGeometry"sv) return KD_SimpleGeometry; - if (name == "Building"sv) return KD_Building; - if (name == "LevelWrapper"sv) return KD_LevelWrapper; - return KD_COUNT; -} - GameObject::Kind GameObject::GetKind() const { return mKind; } @@ -204,7 +187,7 @@ void GameObject::Update() { rapidjson::Value GameObject::Serialize(GameObject* obj, rapidjson::Document& root) { rapidjson::Value result(rapidjson::kObjectType); - result.AddMember("Type", rapidjson::StringRef(ToString(obj->GetKind())), root.GetAllocator()); + result.AddMember("Type", rapidjson::StringRef(Metadata::EnumToString(obj->GetKind())), root.GetAllocator()); rapidjson::Value rvValue(rapidjson::kObjectType); obj->WriteSaveFormat(rvValue, root); @@ -222,8 +205,9 @@ std::unique_ptr<GameObject> GameObject::Deserialize(const rapidjson::Value& valu auto rvValue = rapidjson::GetProperty(value, rapidjson::kObjectType, "Value"sv); if (!rvValue) return nullptr; - auto kind = FromString(rapidjson::AsStringView(*rvType)); - auto obj = std::unique_ptr<GameObject>(CreateGameObject(kind, world)); + auto kind = Metadata::EnumFromString<Kind>(rapidjson::AsStringView(*rvType)); + assert(kind.has_value()); + auto obj = std::unique_ptr<GameObject>(CreateGameObject(kind.value(), world)); if (!obj) return nullptr; obj->ReadSaveFormat(*rvValue); @@ -242,3 +226,5 @@ void GameObject::SetParent(GameObject* parent) { // needUpdate(); } } + +#include <generated/GameObject.gs.inl> |