diff --git a/Deer/Include/DeerCore/EntityEnviroment.h b/Deer/Include/DeerCore/EntityEnviroment.h index 6267ab7..c6b2033 100755 --- a/Deer/Include/DeerCore/EntityEnviroment.h +++ b/Deer/Include/DeerCore/EntityEnviroment.h @@ -61,7 +61,7 @@ namespace Deer { private: uint16_t m_mainCamera = 0; - std::stack unused_entities_spaces; + std::stack unused_entities_spaces; std::vector entities; friend class Entity; diff --git a/Deer/src/DeerCore/Serialization/Components/TransformComponent.h b/Deer/src/DeerCore/Serialization/Components/TransformComponent.h new file mode 100644 index 0000000..f079b02 --- /dev/null +++ b/Deer/src/DeerCore/Serialization/Components/TransformComponent.h @@ -0,0 +1,23 @@ +#pragma once +#include "DeerCore/Serialization/WorldSettings.h" + +#include "DeerCore/Components.h" + +#include "DeerCore/Serialization/Core/QuatSerialization.h" +#include "DeerCore/Serialization/Core/Vec3Serialization.h" + +#include "cereal/cereal.hpp" + +namespace Deer { + struct TransformComponentSerialization { + WorldSerializationSettings& settings; + TransformComponent& component; + + template + void serialize(Archive& archive) { + archive(cereal::make_nvp("Position", component.position)); + archive(cereal::make_nvp("Scale", component.scale)); + archive(cereal::make_nvp("Rotation", component.rotation)); + } + }; +} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/Core/QuatSerialization.h b/Deer/src/DeerCore/Serialization/Core/QuatSerialization.h similarity index 100% rename from Deer/src/DeerCore/Universe/Serialization/Core/QuatSerialization.h rename to Deer/src/DeerCore/Serialization/Core/QuatSerialization.h diff --git a/Deer/src/DeerCore/Universe/Serialization/Core/Vec3Serialization.h b/Deer/src/DeerCore/Serialization/Core/Vec3Serialization.h similarity index 100% rename from Deer/src/DeerCore/Universe/Serialization/Core/Vec3Serialization.h rename to Deer/src/DeerCore/Serialization/Core/Vec3Serialization.h diff --git a/Deer/src/DeerCore/Serialization/Entity.h b/Deer/src/DeerCore/Serialization/Entity.h new file mode 100644 index 0000000..ccc897d --- /dev/null +++ b/Deer/src/DeerCore/Serialization/Entity.h @@ -0,0 +1,56 @@ +#pragma once +#include "DeerCore/Serialization/WorldSettings.h" + +#include "DeerCore/EntityEnviroment.h" +#include "DeerCore/Serialization/Entity.h" + +#include "DeerCore/Serialization/Components/TransformComponent.h" + +#include "cereal/cereal.hpp" +#include + +namespace Deer { + struct EntitySerialization { + WorldSerializationSettings& settings; + EntityEnvironment* entityEnvironment; + uint32_t entityId; + + template + void saveComponent(Archive& archive, Entity& entity) { + std::string containsComponentString = "Contains_"; + containsComponentString += typeid(T).name(); + + bool hasComponent = entity.hasComponent(); + archive(cereal::make_nvp(containsComponentString.c_str(), hasComponent)); + if (hasComponent) { + S serialization; + serialization.component = entity.getComponent(); + serialization.settings = settings; + + archive(cereal::make_nvp(typeid(T).name(), serialization)); + } + } + + template + void save(Archive& archive) const { + Entity& entity = entityEnvironment->getEntity(entityId); + + TagComponent& tag = entity.getComponent(); + RelationshipComponent& relation = entity.getComponent(); + + archive(cereal::make_nvp("Id", entityId)); + archive(cereal::make_nvp("Tag", tag.tag)); + archive(cereal::make_nvp("NetworkBehaviour", tag.networkBehaviour)); + archive(cereal::make_nvp("Parent", relation.parent_id)); + + TransformComponentSerialization serialization; + serialization.settings = settings; + serialization.component = entity.getComponent(); + archive(cereal::make_nvp(typeid(TransformComponent).name(), serialization)); + } + + template + void load(Archive& archive) { + } + }; +} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Serialization/EntityEnvironment.h b/Deer/src/DeerCore/Serialization/EntityEnvironment.h new file mode 100644 index 0000000..a926485 --- /dev/null +++ b/Deer/src/DeerCore/Serialization/EntityEnvironment.h @@ -0,0 +1,77 @@ +#pragma once +#include "DeerCore/Serialization/WorldSettings.h" + +#include "DeerCore/EntityEnviroment.h" +#include "DeerCore/Serialization/Entity.h" + +#include "cereal/cereal.hpp" +#include "cereal/types/vector.hpp" + +#include + +namespace Deer { + struct EntityEnvironmentSerialization { + WorldSerializationSettings& settings; + EntityEnvironment* entityEnvironment; + + template + void save(Archive& archive) const { + std::vector entities; + + size_t entityIndex = 0; + size_t remainingEntities = entityEnvironment->getEntityCount(); + while (remainingEntities > 0) { + if (!entityEnvironment->entityExists(entityIndex)) { + entityIndex++; + continue; + } + + Entity& entity = entityEnvironment->getEntity(entityIndex); + if (!entity.isValidNetworkBehaviour() && !(settings.includeClient && settings.includeServer)) { + remainingEntities--; + entityIndex++; + } + + EntityNetworkBehaviour networkBehaviour = entity.getForcedNetworkBehaviour(); + if (networkBehaviour == EntityNetworkBehaviour::CLIENT && !settings.includeClient) { + remainingEntities--; + entityIndex++; + } + + if (networkBehaviour == EntityNetworkBehaviour::SERVER && !settings.includeServer) { + remainingEntities--; + entityIndex++; + } + + entities.push_back({}); + + EntitySerialization& entityS = entities.push_back(); + + entityS.settings = settings; + entityS.entityId = entityEnvironment; + entityS.entityId = entityIndex; + + remainingEntities--; + entityIndex++; + } + + archive(cereal::make_size_tag(entities.size())); + for (EntitySerialization& entityS : entities) + archive(entityS); + } + + template + void load(Archive& archive) { + size_t entitySize; + archive(cereal::make_nvp("Entities", entitySize)); + + for (size_t i = 0; i < entitySize; i++) { + EntitySerialization entityS; + entityS.entityEnvironment = entityEnvironment; + entityS.settings = settings; + + archive(entityS); + } + } + }; +} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Serialization/World.h b/Deer/src/DeerCore/Serialization/World.h new file mode 100644 index 0000000..8557aed --- /dev/null +++ b/Deer/src/DeerCore/Serialization/World.h @@ -0,0 +1,26 @@ +#pragma once +#include "DeerCore/Serialization/EntityEnvironment.h" +#include "DeerCore/Serialization/WorldSettings.h" + +#include "cereal/cereal.hpp" + +namespace Deer { + class World; + + struct WorldSerialization { + WorldSerializationSettings settings; + EntityEnvironment* entityEnv; + uint32_t entityId; + World* world; + + template + void serialize(Archive& archive) { + EntityEnvironmentSerialization entityEnvironment; + entityEnvironment.settings = settings; + entityEnvironment.entityEnvironment = world->entityEnvironment.get(); + + archive(cereal::make_nvp("SerializationSettings", settings)); + archive(cereal::make_nvp("EntityEnvironment", entityEnvironment)); + } + }; +} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Serialization/WorldSettings.h b/Deer/src/DeerCore/Serialization/WorldSettings.h new file mode 100644 index 0000000..57afb0c --- /dev/null +++ b/Deer/src/DeerCore/Serialization/WorldSettings.h @@ -0,0 +1,25 @@ +#pragma once +#include "cereal/cereal.hpp" + +namespace Deer { + struct WorldSerializationSettings { + bool includeServer; + bool includeClient; + + WorldSerializationSettings() { +#ifdef DEER_RENDER + includeServer = false; + includeClient = true; +#else + includeServer = true; + includeClient = false; +#endif + }; + + template + void serialize(Archive& archive) { + archive(CEREAL_NVP(includeServer)); + archive(CEREAL_NVP(includeClient)); + } + }; +} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/Components/RelationshipComponentSerialization.h b/Deer/src/DeerCore/Universe/Serialization/Components/RelationshipComponentSerialization.h deleted file mode 100755 index 1fba667..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/Components/RelationshipComponentSerialization.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -#include "DeerCore/Components.h" - -namespace Deer { - // RELATIONSHIP COMPONENT - template - void serialize(Archive& archive, RelationshipComponent& relationship) { - archive(cereal::make_nvp("parentId", relationship.parent_id)); - - archive(cereal::make_size_tag( - static_cast(relationship.getChildCount()))); - for (int i = 0; i < relationship.getChildCount(); i++) - archive(relationship.getChildId(i)); - } -} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/Components/TransformComponentSerialization.h b/Deer/src/DeerCore/Universe/Serialization/Components/TransformComponentSerialization.h deleted file mode 100755 index 4098327..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/Components/TransformComponentSerialization.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include "DeerCore/Components.h" - -namespace Deer { - - // TRANSFORM COMPONENT - template - void serialize(Archive& archive, - TransformComponent& transform) { - - archive(cereal::make_nvp("position", transform.position)); - archive(cereal::make_nvp("scale", transform.scale)); - archive(cereal::make_nvp("rotation", transform.rotation)); - } - -} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/Entity/EntitySerialization.h b/Deer/src/DeerCore/Universe/Serialization/Entity/EntitySerialization.h deleted file mode 100755 index 47a89e0..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/Entity/EntitySerialization.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once -#include "DeerCore/Components.h" -#include "DeerCore/EntityEnviroment.h" - -#include "EntitySerializationStruct.h" - -namespace Deer { - template - void saveComponent(Archive& archive, Entity const& m_entity) { - bool hasComponent = m_entity.hasComponent(); - archive(cereal::make_nvp(("contains_" + typedef(T).get_name()).c_str(), hasComponent)); - if (hasComponent) { - const T& component = m_entity.getComponent(); - archive(cereal::make_nvp(typedef(T).get_name(), component)); - } - } - - template - void loadComponent(Archive& archive, Entity const& m_entity) { - bool hasComponent; - archive(cereal::make_nvp(("contains_" + typedef(T).get_name()).c_str(), hasComponent)); - if (hasComponent) { - T& component = m_entity.addComponent(); - archive(cereal::make_nvp(typedef(T).get_name(), component)); - } - } - - // ENTITY - template - void save(Archive& archive, EntitySerializationStruct const& m_entity) { - const Entity& entity = m_entity.env->getEntity(m_entity.entityID); - - const TagComponent& name = entity.getComponent(); - archive(cereal::make_nvp("id", m_entity.entityID)); - archive(cereal::make_nvp("name", name.tag)); - - const TransformComponent& transform = entity.getComponent(); - archive(cereal::make_nvp("transform", transform)); - - const RelationshipComponent& relation = entity.getComponent(); - archive(cereal::make_nvp("relationship", relation)); - -#ifdef DEER_RENDER - if (!is_server_serialization) { - saveComponent(archive, "meshRenderComponent", entity); - saveComponent(archive, "cameraComponent", entity); - } -#endif - } - - template - void load(Archive& archive, EntitySerializationStruct& m_entity) { - uint16_t id; - std::string name; - archive(cereal::make_nvp("id", id)); - archive(cereal::make_nvp("name", name)); - - Entity& entity = m_entity.env->createEntityWithId(id); - archive(cereal::make_nvp("transform", entity.getComponent())); - - RelationshipComponent& rc = entity.getComponent(); - archive(cereal::make_nvp("relationship", rc)); - entity.setParent(m_entity.env->getEntity(rc.parent_id)); -#ifdef DEER_RENDER - if (!is_server_serialization) { - loadComponent(archive, "meshRenderComponent", entity); - loadComponent(archive, "cameraComponent", entity); - } -#endif - } - -} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/Entity/EntitySerializationStruct.h b/Deer/src/DeerCore/Universe/Serialization/Entity/EntitySerializationStruct.h deleted file mode 100644 index 841d1d7..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/Entity/EntitySerializationStruct.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -#include - -namespace Deer { - class EntityEnvironment; - struct EntitySerializationStruct { - uint32_t entityID; - EntityEnvironment* env; - }; -} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/EnvironmentSerialization.h b/Deer/src/DeerCore/Universe/Serialization/EnvironmentSerialization.h deleted file mode 100755 index 4cac0b5..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/EnvironmentSerialization.h +++ /dev/null @@ -1,57 +0,0 @@ -#pragma once -#include -#include - -#include "DeerCore/EntityEnviroment.h" -#include "EntitySerializationStruct.h" - -namespace Deer { - struct EntityEnvironmentEntity { - EntityEnvironment& environment; - EntityEnvironmentEntity(EntityEnvironment& env) : environment(env) {} - }; - - template - void save(Archive& archive, const Deer::EntityEnvironment& environment) { - EntityEnvironmentEntity envEnt(const_cast(environment)); - archive(cereal::make_nvp("entities", envEnt)); - } - - template - void load(Archive& archive, Deer::EntityEnvironment& environment) { - EntityEnvironmentEntity envEnt(environment); - archive(cereal::make_nvp("entities", envEnt)); - } - - template - void save(Archive& archive, EntityEnvironmentEntity const& m_entities) { - archive(cereal::make_size_tag(static_cast( - m_entities.entityEnvironment->getEntityCount()))); - - for (uint16_t i = 0; i < m_entities.entityEnvironment->getEntityCount(); i++) { - while (!m_entities.entityEnvironment->entityExists(i)) { - i++; - } - - EntitySerializationStruct serializationStruct; - serializationStruct.env = - const_cast(&m_entities.environment); - serializationStruct.entityID = i; - - archive(serializationStruct); - } - } - - template - void load(Archive& archive, EntityEnvironmentEntity& m_entities) { - cereal::size_type size; - archive(cereal::make_size_tag(size)); - - for (int i = 0; i < size; i++) { - EntitySerializationStruct serializationStruct; - serializationStruct.env = &m_entities.environment; - - archive(serializationStruct); - } - } -} // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/Serialization.cpp b/Deer/src/DeerCore/Universe/Serialization/Serialization.cpp deleted file mode 100755 index ba4afed..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/Serialization.cpp +++ /dev/null @@ -1,4 +0,0 @@ - -namespace Deer { - bool is_server_serialization = false; -} \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/Serialization.h b/Deer/src/DeerCore/Universe/Serialization/Serialization.h deleted file mode 100755 index c4c1f1a..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/Serialization.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "cereal/cereal.hpp" -#include "cereal/types/string.hpp" -#include "cereal/types/vector.hpp" - -// Serialization Vars -#include "DeerCore/World/Serialization/SerializationGlobalVars.h" - -// GENERICS -#include "DeerCore/World/Serialization/QuatSerialization.h" -#include "DeerCore/World/Serialization/Vec3Serialization.h" - -// SCENE SPECIFIC -#include "DeerCore/World/Serialization/EntityEnvironmentSerialization.h" -#include "DeerCore/World/Serialization/EntitySerialization.h" - -// COMPONENTS SPECIFIC -#include "DeerCore/World/Serialization/Components/RelationshipComponentSerialization.h" -#include "DeerCore/World/Serialization/Components/TransformComponentSerialization.h" - -// RENDER SPECIFIC -#ifdef DEER_RENDER -#include "DeerRender/World/Serialization/Components/CameraSerializationComponent.h" -#include "DeerRender/World/Serialization/Components/MeshRenderComponentSerialization.h" -#include "DeerRender/World/Serialization/Components/TextureBindingSerializationComponent.h" -#endif diff --git a/Deer/src/DeerCore/Universe/Serialization/SerializationGlobalVars.cpp b/Deer/src/DeerCore/Universe/Serialization/SerializationGlobalVars.cpp deleted file mode 100755 index 8ad9346..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/SerializationGlobalVars.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "SerializationGlobalVars.h" - -namespace Deer { - - bool is_server_serialization = false; - -} \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/SerializationGlobalVars.h b/Deer/src/DeerCore/Universe/Serialization/SerializationGlobalVars.h deleted file mode 100755 index 9269e58..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/SerializationGlobalVars.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -namespace Deer { - extern bool is_server_serialization; -} diff --git a/Deer/src/DeerCore/Universe/Serialization/Settings.h b/Deer/src/DeerCore/Universe/Serialization/Settings.h deleted file mode 100644 index 0b6bbf1..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/Settings.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -namespace Deer { - namespace Serialization { - - - - } -} \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/Serialization/World.h b/Deer/src/DeerCore/Universe/Serialization/World.h deleted file mode 100644 index af55133..0000000 --- a/Deer/src/DeerCore/Universe/Serialization/World.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once -#include "DeerCore/World.h" -#include "DeerCore/EntityEnviroment.h" - -namespace Deer { - namespace Universe { - template - void save(Archive& archive, World const& world) { - World - } - } -} \ No newline at end of file diff --git a/Deer/src/DeerCore/Universe/UniverseSerialization.cpp b/Deer/src/DeerCore/Universe/UniverseSerialization.cpp index 6faa827..e8fafee 100644 --- a/Deer/src/DeerCore/Universe/UniverseSerialization.cpp +++ b/Deer/src/DeerCore/Universe/UniverseSerialization.cpp @@ -1,12 +1,6 @@ #include "DeerCore/Universe.h" -#include "DeerCore/World.h" -#include "DeerCore/Log.h" - -#include "cereal/cereal.hpp" -#include "cereal/archives/json.hpp" namespace Deer { - - - + void Universe::saveWorldInJson(World* world, const Path& path) { + } } // namespace Deer \ No newline at end of file diff --git a/Deer/src/DeerCore/World/Enviroment.cpp b/Deer/src/DeerCore/World/Enviroment.cpp index 486f4d1..5f6873f 100755 --- a/Deer/src/DeerCore/World/Enviroment.cpp +++ b/Deer/src/DeerCore/World/Enviroment.cpp @@ -81,7 +81,7 @@ namespace Deer { entities.push_back({}); } else { - static std::stack unused_entities_spaces_cache; + static std::stack unused_entities_spaces_cache; // This code its to remove a specific element from a stack // We pop the stack until we find the id or we empty it to diff --git a/Deer/src/DeerRender/Serialization/Components/TransformComponent copy.h b/Deer/src/DeerRender/Serialization/Components/TransformComponent copy.h new file mode 100644 index 0000000..677616e --- /dev/null +++ b/Deer/src/DeerRender/Serialization/Components/TransformComponent copy.h @@ -0,0 +1,20 @@ +#pragma once +#include "DeerCore/Serialization/WorldSettings.h" + +#include "DeerRender/Components.h" + +#include "cereal/cereal.hpp" + +namespace Deer { + struct MeshComponentSerialization { + WorldSerializationSettings& settings; + TransformComponent& component; + + template + void serialize(Archive& archive) { + archive(cereal::make_nvp("Position", component.position)); + archive(cereal::make_nvp("Scale", component.scale)); + archive(cereal::make_nvp("Rotation", component.rotation)); + } + }; +} // namespace Deer \ No newline at end of file