Add concrete component script field support
This commit is contained in:
@@ -75,6 +75,7 @@ std::string ScriptFieldTypeToString(ScriptFieldType type) {
|
||||
case ScriptFieldType::Vector3: return "Vector3";
|
||||
case ScriptFieldType::Vector4: return "Vector4";
|
||||
case ScriptFieldType::GameObject: return "GameObject";
|
||||
case ScriptFieldType::Component: return "Component";
|
||||
}
|
||||
|
||||
return "None";
|
||||
@@ -103,6 +104,8 @@ bool TryParseScriptFieldType(const std::string& value, ScriptFieldType& outType)
|
||||
outType = ScriptFieldType::Vector4;
|
||||
} else if (value == "GameObject") {
|
||||
outType = ScriptFieldType::GameObject;
|
||||
} else if (value == "Component") {
|
||||
outType = ScriptFieldType::Component;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@@ -123,6 +126,7 @@ bool IsScriptFieldValueCompatible(ScriptFieldType type, const ScriptFieldValue&
|
||||
case ScriptFieldType::Vector3: return std::holds_alternative<Math::Vector3>(value);
|
||||
case ScriptFieldType::Vector4: return std::holds_alternative<Math::Vector4>(value);
|
||||
case ScriptFieldType::GameObject: return std::holds_alternative<GameObjectReference>(value);
|
||||
case ScriptFieldType::Component: return std::holds_alternative<ComponentReference>(value);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -141,6 +145,7 @@ ScriptFieldValue CreateDefaultScriptFieldValue(ScriptFieldType type) {
|
||||
case ScriptFieldType::Vector3: return Math::Vector3::Zero();
|
||||
case ScriptFieldType::Vector4: return Math::Vector4::Zero();
|
||||
case ScriptFieldType::GameObject: return GameObjectReference{};
|
||||
case ScriptFieldType::Component: return ComponentReference{};
|
||||
}
|
||||
|
||||
return std::monostate{};
|
||||
@@ -180,6 +185,10 @@ std::string SerializeScriptFieldValue(ScriptFieldType type, const ScriptFieldVal
|
||||
}
|
||||
case ScriptFieldType::GameObject:
|
||||
return std::to_string(std::get<GameObjectReference>(value).gameObjectUUID);
|
||||
case ScriptFieldType::Component: {
|
||||
const ComponentReference reference = std::get<ComponentReference>(value);
|
||||
return std::to_string(reference.gameObjectUUID) + "," + std::to_string(reference.scriptComponentUUID);
|
||||
}
|
||||
}
|
||||
|
||||
return std::string();
|
||||
@@ -236,6 +245,18 @@ bool TryDeserializeScriptFieldValue(ScriptFieldType type, const std::string& val
|
||||
case ScriptFieldType::GameObject:
|
||||
outValue = GameObjectReference{static_cast<uint64_t>(std::stoull(value))};
|
||||
return true;
|
||||
case ScriptFieldType::Component: {
|
||||
const size_t separator = value.find(',');
|
||||
if (separator == std::string::npos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
outValue = ComponentReference{
|
||||
static_cast<uint64_t>(std::stoull(value.substr(0, separator))),
|
||||
static_cast<uint64_t>(std::stoull(value.substr(separator + 1)))
|
||||
};
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} catch (...) {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user