serialization.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "serialization.h"
  2. #include "entity.h"
  3. #include "world.h"
  4. #include "component.h"
  5. #include <QJsonArray>
  6. #include <QJsonObject>
  7. #include <QFile>
  8. #include <QDebug>
  9. namespace Engine::Core {
  10. QJsonObject Serialization::serializeEntity(const Entity* entity) {
  11. QJsonObject entityObj;
  12. entityObj["id"] = static_cast<qint64>(entity->getId());
  13. // Serialize components (simplified for basic components)
  14. if (auto transform = entity->getComponent<TransformComponent>()) {
  15. QJsonObject transformObj;
  16. transformObj["posX"] = transform->position.x;
  17. transformObj["posY"] = transform->position.y;
  18. transformObj["posZ"] = transform->position.z;
  19. transformObj["rotX"] = transform->rotation.x;
  20. transformObj["rotY"] = transform->rotation.y;
  21. transformObj["rotZ"] = transform->rotation.z;
  22. transformObj["scaleX"] = transform->scale.x;
  23. transformObj["scaleY"] = transform->scale.y;
  24. transformObj["scaleZ"] = transform->scale.z;
  25. entityObj["transform"] = transformObj;
  26. }
  27. if (auto unit = entity->getComponent<UnitComponent>()) {
  28. QJsonObject unitObj;
  29. unitObj["health"] = unit->health;
  30. unitObj["maxHealth"] = unit->maxHealth;
  31. unitObj["speed"] = unit->speed;
  32. unitObj["selected"] = unit->selected;
  33. unitObj["unitType"] = QString::fromStdString(unit->unitType);
  34. entityObj["unit"] = unitObj;
  35. }
  36. return entityObj;
  37. }
  38. void Serialization::deserializeEntity(Entity* entity, const QJsonObject& json) {
  39. // Deserialize components
  40. if (json.contains("transform")) {
  41. auto transformObj = json["transform"].toObject();
  42. auto transform = entity->addComponent<TransformComponent>();
  43. transform->position.x = transformObj["posX"].toDouble();
  44. transform->position.y = transformObj["posY"].toDouble();
  45. transform->position.z = transformObj["posZ"].toDouble();
  46. transform->rotation.x = transformObj["rotX"].toDouble();
  47. transform->rotation.y = transformObj["rotY"].toDouble();
  48. transform->rotation.z = transformObj["rotZ"].toDouble();
  49. transform->scale.x = transformObj["scaleX"].toDouble();
  50. transform->scale.y = transformObj["scaleY"].toDouble();
  51. transform->scale.z = transformObj["scaleZ"].toDouble();
  52. }
  53. if (json.contains("unit")) {
  54. auto unitObj = json["unit"].toObject();
  55. auto unit = entity->addComponent<UnitComponent>();
  56. unit->health = unitObj["health"].toInt();
  57. unit->maxHealth = unitObj["maxHealth"].toInt();
  58. unit->speed = unitObj["speed"].toDouble();
  59. unit->selected = unitObj["selected"].toBool();
  60. unit->unitType = unitObj["unitType"].toString().toStdString();
  61. }
  62. }
  63. QJsonDocument Serialization::serializeWorld(const World* world) {
  64. QJsonObject worldObj;
  65. QJsonArray entitiesArray;
  66. // This is a simplified implementation
  67. // In a real scenario, we'd need access to world's entities
  68. worldObj["entities"] = entitiesArray;
  69. return QJsonDocument(worldObj);
  70. }
  71. void Serialization::deserializeWorld(World* world, const QJsonDocument& doc) {
  72. auto worldObj = doc.object();
  73. auto entitiesArray = worldObj["entities"].toArray();
  74. for (const auto& value : entitiesArray) {
  75. auto entityObj = value.toObject();
  76. auto entity = world->createEntity();
  77. deserializeEntity(entity, entityObj);
  78. }
  79. }
  80. bool Serialization::saveToFile(const QString& filename, const QJsonDocument& doc) {
  81. QFile file(filename);
  82. if (!file.open(QIODevice::WriteOnly)) {
  83. qWarning() << "Could not open file for writing:" << filename;
  84. return false;
  85. }
  86. file.write(doc.toJson());
  87. return true;
  88. }
  89. QJsonDocument Serialization::loadFromFile(const QString& filename) {
  90. QFile file(filename);
  91. if (!file.open(QIODevice::ReadOnly)) {
  92. qWarning() << "Could not open file for reading:" << filename;
  93. return QJsonDocument();
  94. }
  95. QByteArray data = file.readAll();
  96. return QJsonDocument::fromJson(data);
  97. }
  98. } // namespace Engine::Core