aboutsummaryrefslogtreecommitdiff
path: root/source/30-game/GameObject.cpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2022-06-03 22:58:28 -0700
committerrtk0c <[email protected]>2022-06-03 22:58:28 -0700
commit8510a85f79f706b93982b4e398b187b5f77081dd (patch)
tree996c27f54f748d940f58454f7ef1e1570d1a31d5 /source/30-game/GameObject.cpp
parentbd07ae3f4e1bcdedc3e373460671ca9713a03de5 (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.cpp44
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>