diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 84ca7c47e..6c394b415 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -1459,7 +1459,7 @@ void EditorComponent::Update(float dt) clipboard << prevSel.size(); for (auto& x : prevSel) { - scene.Entity_Serialize(clipboard, x.entity, 0); + scene.Entity_Serialize(clipboard, x.entity); } } // Paste @@ -1474,7 +1474,7 @@ void EditorComponent::Update(float dt) for (size_t i = 0; i < count; ++i) { wiScene::PickResult picked; - picked.entity = scene.Entity_Serialize(clipboard, INVALID_ENTITY, CreateEntity(), false); + picked.entity = scene.Entity_Serialize(clipboard); AddSelected(picked); } } @@ -1504,7 +1504,7 @@ void EditorComponent::Update(float dt) clipboard >> count; for (size_t i = 0; i < count; ++i) { - Entity entity = scene.Entity_Serialize(clipboard, INVALID_ENTITY, CreateEntity(), false); + Entity entity = scene.Entity_Serialize(clipboard); TransformComponent* transform = scene.transforms.GetComponent(entity); if (transform != nullptr) { diff --git a/WickedEngine/wiArchive.cpp b/WickedEngine/wiArchive.cpp index dd8a65879..3c2d51dc9 100644 --- a/WickedEngine/wiArchive.cpp +++ b/WickedEngine/wiArchive.cpp @@ -21,6 +21,7 @@ wiArchive::wiArchive(const std::string& fileName, bool readMode) : fileName(file { if (!fileName.empty()) { + directory = wiHelper::GetDirectoryFromPath(fileName); if (readMode) { if (wiHelper::FileRead(fileName, DATA)) @@ -95,12 +96,12 @@ bool wiArchive::SaveFile(const std::string& fileName) return wiHelper::FileWrite(fileName, DATA.data(), pos); } -string wiArchive::GetSourceDirectory() const +const string& wiArchive::GetSourceDirectory() const { - return wiHelper::GetDirectoryFromPath(fileName); + return directory; } -string wiArchive::GetSourceFileName() const +const string& wiArchive::GetSourceFileName() const { return fileName; } diff --git a/WickedEngine/wiArchive.h b/WickedEngine/wiArchive.h index 8dd3e1303..2cca2bd72 100644 --- a/WickedEngine/wiArchive.h +++ b/WickedEngine/wiArchive.h @@ -14,6 +14,7 @@ private: std::vector DATA; std::string fileName; // save to this file on closing if not empty + std::string directory; void CreateEmpty(); @@ -37,8 +38,8 @@ public: bool IsOpen(); void Close(); bool SaveFile(const std::string& fileName); - std::string GetSourceDirectory() const; - std::string GetSourceFileName() const; + const std::string& GetSourceDirectory() const; + const std::string& GetSourceFileName() const; // It could be templated but we have to be extremely careful of different datasizes on different platforms // because serialized data should be interchangeable! diff --git a/WickedEngine/wiECS.h b/WickedEngine/wiECS.h index 185331f88..7dd6cdc82 100644 --- a/WickedEngine/wiECS.h +++ b/WickedEngine/wiECS.h @@ -2,32 +2,57 @@ #define WI_ENTITY_COMPONENT_SYSTEM_H #include "wiArchive.h" -#include "wiRandom.h" #include #include #include #include +#include namespace wiECS { - using Entity = uint64_t; + using Entity = uint32_t; static const Entity INVALID_ENTITY = 0; // Runtime can create a new entity with this inline Entity CreateEntity() { - return wiRandom::getRandom(INVALID_ENTITY + 1, ~0ull); + static std::atomic next{ INVALID_ENTITY + 1 }; + return next.fetch_add(1); } + + struct EntitySerializer + { + std::mutex locker; + std::unordered_map remap; + bool allow_remap = true; + }; // This is the safe way to serialize an entity - // seed : ensures that entity will be unique after loading (specify seed = INVALID_ENTITY to leave entity as-is) - inline void SerializeEntity(wiArchive& archive, Entity& entity, Entity seed) + inline void SerializeEntity(wiArchive& archive, Entity& entity, EntitySerializer& seri) { if (archive.IsReadMode()) { - archive >> entity; - if (entity != INVALID_ENTITY && seed > 0) + // Entities are always serialized as uint64_t for back-compat + uint64_t mem; + archive >> mem; + + if (seri.allow_remap) { - entity = ((entity << 1) ^ seed) >> 1; + seri.locker.lock(); + auto it = seri.remap.find(mem); + if (it == seri.remap.end()) + { + entity = CreateEntity(); + seri.remap[mem] = entity; + } + else + { + entity = it->second; + } + seri.locker.unlock(); + } + else + { + entity = (Entity)mem; } } else @@ -88,9 +113,7 @@ namespace wiECS } // Read/Write everything to an archive depending on the archive state - // seed: needed when serializing from disk which might cause discrepancy in entity uniqueness - // propagateSeedDeep: Components can have Entity references inside them, should the seed be propageted to those too? - inline void Serialize(wiArchive& archive, Entity seed = INVALID_ENTITY, bool propagateSeedDeep = true) + inline void Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -102,14 +125,14 @@ namespace wiECS components.resize(count); for (size_t i = 0; i < count; ++i) { - components[i].Serialize(archive, propagateSeedDeep ? seed : 0); + components[i].Serialize(archive, seri); } entities.resize(count); for (size_t i = 0; i < count; ++i) { Entity entity; - SerializeEntity(archive, entity, seed); + SerializeEntity(archive, entity, seri); entities[i] = entity; lookup[entity] = i; } @@ -119,11 +142,11 @@ namespace wiECS archive << components.size(); for (Component& component : components) { - component.Serialize(archive); + component.Serialize(archive, seri); } for (Entity entity : entities) { - SerializeEntity(archive, entity, seed); + SerializeEntity(archive, entity, seri); } } } diff --git a/WickedEngine/wiEmittedParticle.cpp b/WickedEngine/wiEmittedParticle.cpp index 22f41d5ba..c8c42a633 100644 --- a/WickedEngine/wiEmittedParticle.cpp +++ b/WickedEngine/wiEmittedParticle.cpp @@ -730,13 +730,13 @@ void wiEmittedParticle::Initialize() } -void wiEmittedParticle::Serialize(wiArchive& archive, wiECS::Entity seed) +void wiEmittedParticle::Serialize(wiArchive& archive, wiECS::EntitySerializer& seri) { if (archive.IsReadMode()) { archive >> _flags; archive >> (uint32_t&)shaderType; - wiECS::SerializeEntity(archive, meshID, seed); + wiECS::SerializeEntity(archive, meshID, seri); archive >> MAX_PARTICLES; archive >> FIXED_TIMESTEP; archive >> size; @@ -774,7 +774,7 @@ void wiEmittedParticle::Serialize(wiArchive& archive, wiECS::Entity seed) { archive << _flags; archive << (uint32_t)shaderType; - wiECS::SerializeEntity(archive, meshID, seed); + wiECS::SerializeEntity(archive, meshID, seri); archive << MAX_PARTICLES; archive << FIXED_TIMESTEP; archive << size; diff --git a/WickedEngine/wiEmittedParticle.h b/WickedEngine/wiEmittedParticle.h index 084e70591..281f281bb 100644 --- a/WickedEngine/wiEmittedParticle.h +++ b/WickedEngine/wiEmittedParticle.h @@ -129,7 +129,7 @@ public: inline void SetVolumeEnabled(bool value) { if (value) { _flags |= HAS_VOLUME; } else { _flags &= ~HAS_VOLUME; } } inline void SetFrameBlendingEnabled(bool value) { if (value) { _flags |= FRAME_BLENDING; } else { _flags &= ~FRAME_BLENDING; } } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); static void Initialize(); }; diff --git a/WickedEngine/wiHairParticle.cpp b/WickedEngine/wiHairParticle.cpp index 27865b69c..16506f6e3 100644 --- a/WickedEngine/wiHairParticle.cpp +++ b/WickedEngine/wiHairParticle.cpp @@ -288,12 +288,12 @@ void wiHairParticle::Draw(const CameraComponent& camera, const MaterialComponent } -void wiHairParticle::Serialize(wiArchive& archive, wiECS::Entity seed) +void wiHairParticle::Serialize(wiArchive& archive, wiECS::EntitySerializer& seri) { if (archive.IsReadMode()) { archive >> _flags; - wiECS::SerializeEntity(archive, meshID, seed); + wiECS::SerializeEntity(archive, meshID, seri); archive >> strandCount; archive >> segmentCount; archive >> randomSeed; @@ -322,7 +322,7 @@ void wiHairParticle::Serialize(wiArchive& archive, wiECS::Entity seed) else { archive << _flags; - wiECS::SerializeEntity(archive, meshID, seed); + wiECS::SerializeEntity(archive, meshID, seri); archive << strandCount; archive << segmentCount; archive << randomSeed; diff --git a/WickedEngine/wiHairParticle.h b/WickedEngine/wiHairParticle.h index 54fce6e61..c764362e8 100644 --- a/WickedEngine/wiHairParticle.h +++ b/WickedEngine/wiHairParticle.h @@ -61,7 +61,7 @@ public: AABB aabb; std::vector indices; // it is dependent on vertex_lengths and contains triangles with non-zero lengths - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); static void Initialize(); }; diff --git a/WickedEngine/wiIntersect.cpp b/WickedEngine/wiIntersect.cpp index a0ca228b1..fe4a11c6c 100644 --- a/WickedEngine/wiIntersect.cpp +++ b/WickedEngine/wiIntersect.cpp @@ -168,7 +168,7 @@ AABB AABB::Merge(const AABB& a, const AABB& b) { return AABB(wiMath::Min(a.getMin(), b.getMin()), wiMath::Max(a.getMax(), b.getMax())); } -void AABB::Serialize(wiArchive& archive, wiECS::Entity seed) +void AABB::Serialize(wiArchive& archive, wiECS::EntitySerializer& seri) { if (archive.IsReadMode()) { diff --git a/WickedEngine/wiIntersect.h b/WickedEngine/wiIntersect.h index 5e4fec832..753bd4b64 100644 --- a/WickedEngine/wiIntersect.h +++ b/WickedEngine/wiIntersect.h @@ -57,7 +57,7 @@ struct AABB return XMFLOAT3(0, 0, 0); } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct SPHERE { diff --git a/WickedEngine/wiScene.cpp b/WickedEngine/wiScene.cpp index d754dd531..2254e8a57 100644 --- a/WickedEngine/wiScene.cpp +++ b/WickedEngine/wiScene.cpp @@ -333,6 +333,33 @@ namespace wiScene } return RENDERTYPE_TRANSPARENT; } + void MaterialComponent::CreateRenderData(const std::string& content_dir) + { + if (!baseColorMapName.empty()) + { + baseColorMap = wiResourceManager::Load(content_dir + baseColorMapName); + } + if (!surfaceMapName.empty()) + { + surfaceMap = wiResourceManager::Load(content_dir + surfaceMapName); + } + if (!normalMapName.empty()) + { + normalMap = wiResourceManager::Load(content_dir + normalMapName); + } + if (!displacementMapName.empty()) + { + displacementMap = wiResourceManager::Load(content_dir + displacementMapName); + } + if (!emissiveMapName.empty()) + { + emissiveMap = wiResourceManager::Load(content_dir + emissiveMapName); + } + if (!occlusionMapName.empty()) + { + occlusionMap = wiResourceManager::Load(content_dir + occlusionMapName); + } + } void MeshComponent::CreateRenderData() { @@ -1480,11 +1507,11 @@ namespace wiScene // First write the entity to staging area: archive.SetReadModeAndResetPos(false); - Entity_Serialize(archive, entity, 0); + Entity_Serialize(archive, entity); - // Then deserialize with a unique seed: + // Then deserialize: archive.SetReadModeAndResetPos(true); - return Entity_Serialize(archive, entity, CreateEntity(), false); + return Entity_Serialize(archive, entity); } Entity Scene::Entity_CreateMaterial( const std::string& name diff --git a/WickedEngine/wiScene.h b/WickedEngine/wiScene.h index 77e65571f..40440f64d 100644 --- a/WickedEngine/wiScene.h +++ b/WickedEngine/wiScene.h @@ -30,7 +30,7 @@ namespace wiScene inline void operator=(std::string&& str) { name = std::move(str); } inline bool operator==(const std::string& str) const { return name.compare(str) == 0; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct LayerComponent @@ -39,7 +39,7 @@ namespace wiScene inline uint32_t GetLayerMask() const { return layerMask; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct TransformComponent @@ -84,7 +84,7 @@ namespace wiScene void Lerp(const TransformComponent& a, const TransformComponent& b, float t); void CatmullRom(const TransformComponent& a, const TransformComponent& b, const TransformComponent& c, const TransformComponent& d, float t); - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct PreviousFrameTransformComponent @@ -92,7 +92,7 @@ namespace wiScene // Non-serialized attributes: XMFLOAT4X4 world_prev; - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct HierarchyComponent @@ -100,7 +100,7 @@ namespace wiScene wiECS::Entity parentID = wiECS::INVALID_ENTITY; uint32_t layerMask_bind; // saved child layermask at the time of binding - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct MaterialComponent @@ -255,7 +255,9 @@ namespace wiScene void WriteShaderMaterial(ShaderMaterial* dest) const; uint32_t GetRenderTypes() const; - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void CreateRenderData(const std::string& content_dir); + + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct MeshComponent @@ -352,7 +354,7 @@ namespace wiScene void RecenterToBottom(); SPHERE GetBoundingSphere() const; - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); struct Vertex_POS @@ -512,7 +514,7 @@ namespace wiScene inline void SetDirty(bool value = true) { if (value) { _flags |= DIRTY; } else { _flags &= ~DIRTY; } } inline bool IsDirty() const { return _flags & DIRTY; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct ObjectComponent @@ -599,7 +601,7 @@ namespace wiScene void SaveLightmap(); wiGraphics::FORMAT GetLightmapFormat(); - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct RigidBodyPhysicsComponent @@ -636,7 +638,7 @@ namespace wiScene inline bool IsDisableDeactivation() const { return _flags & DISABLE_DEACTIVATION; } inline bool IsKinematic() const { return _flags & KINEMATIC; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct SoftBodyPhysicsComponent @@ -671,7 +673,7 @@ namespace wiScene // Create physics represenation of graphics mesh void CreateFromMesh(const MeshComponent& mesh); - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct ArmatureComponent @@ -715,7 +717,7 @@ namespace wiScene std::vector boneData; wiGraphics::GPUBuffer boneBuffer; - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct LightComponent @@ -783,7 +785,7 @@ namespace wiScene } inline LightType GetType() const { return type; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct CameraComponent @@ -833,7 +835,7 @@ namespace wiScene inline bool IsDirty() const { return _flags & DIRTY; } inline bool IsCustomProjectionEnabled() const { return _flags & CUSTOM_PROJECTION; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct EnvironmentProbeComponent @@ -858,7 +860,7 @@ namespace wiScene inline bool IsDirty() const { return _flags & DIRTY; } inline bool IsRealTime() const { return _flags & REALTIME; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct ForceFieldComponent @@ -880,7 +882,7 @@ namespace wiScene inline float GetRange() const { return range_global; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct DecalComponent @@ -905,7 +907,7 @@ namespace wiScene inline float GetOpacity() const { return color.w; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct AnimationDataComponent @@ -919,7 +921,7 @@ namespace wiScene std::vector keyframe_times; std::vector keyframe_data; - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct AnimationComponent @@ -990,7 +992,7 @@ namespace wiScene inline void Stop() { Pause(); timer = 0.0f; } inline void SetLooped(bool value = true) { if (value) { _flags |= LOOPED; } else { _flags &= ~LOOPED; } } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct WeatherComponent @@ -1061,7 +1063,7 @@ namespace wiScene // Non-serialized attributes: uint32_t most_important_light_index = ~0; - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct SoundComponent @@ -1089,7 +1091,7 @@ namespace wiScene inline void SetLooped(bool value = true) { if (value) { _flags |= LOOPED; } else { _flags &= ~LOOPED; } } inline void SetDisable3D(bool value = true) { if (value) { _flags |= DISABLE_3D; } else { _flags &= ~DISABLE_3D; } } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct InverseKinematicsComponent @@ -1108,7 +1110,7 @@ namespace wiScene inline void SetDisabled(bool value = true) { if (value) { _flags |= DISABLED; } else { _flags &= ~DISABLED; } } inline bool IsDisabled() const { return _flags & DISABLED; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct SpringComponent @@ -1141,7 +1143,7 @@ namespace wiScene inline bool IsStretchEnabled() const { return _flags & STRETCH_ENABLED; } inline bool IsGravityEnabled() const { return _flags & GRAVITY_ENABLED; } - void Serialize(wiArchive& archive, wiECS::Entity seed = wiECS::INVALID_ENTITY); + void Serialize(wiArchive& archive, wiECS::EntitySerializer& seri); }; struct Scene @@ -1210,11 +1212,8 @@ namespace wiScene // Duplicates all of an entity's components and creates a new entity with them: wiECS::Entity Entity_Duplicate(wiECS::Entity entity); // Serializes entity and all of its components to archive: - // You can specify entity = INVALID_ENTITY when the entity needs to be created from archive - // You can specify seed = INVALID_ENTITY when the archive is guaranteed to be storing persistent and unique entities - // propagateDeepSeed : request that entity references inside components should be seeded as well // Returns either the new entity that was read, or the original entity that was written - wiECS::Entity Entity_Serialize(wiArchive& archive, wiECS::Entity entity = wiECS::INVALID_ENTITY, wiECS::Entity seed = wiECS::INVALID_ENTITY, bool propagateSeedDeep = true); + wiECS::Entity Entity_Serialize(wiArchive& archive, wiECS::Entity entity = wiECS::INVALID_ENTITY); wiECS::Entity Entity_CreateMaterial( const std::string& name diff --git a/WickedEngine/wiScene_Serializers.cpp b/WickedEngine/wiScene_Serializers.cpp index e53d77911..31ad67d4e 100644 --- a/WickedEngine/wiScene_Serializers.cpp +++ b/WickedEngine/wiScene_Serializers.cpp @@ -9,7 +9,7 @@ using namespace wiECS; namespace wiScene { - void NameComponent::Serialize(wiArchive& archive, Entity seed) + void NameComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -20,7 +20,7 @@ namespace wiScene archive << name; } } - void LayerComponent::Serialize(wiArchive& archive, Entity seed) + void LayerComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -31,7 +31,7 @@ namespace wiScene archive << layerMask; } } - void TransformComponent::Serialize(wiArchive& archive, Entity seed) + void TransformComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -51,14 +51,14 @@ namespace wiScene archive << translation_local; } } - void PreviousFrameTransformComponent::Serialize(wiArchive& archive, Entity seed) + void PreviousFrameTransformComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { // NOTHING! We just need a serialize function for this to be able serialize with ComponentManager! // This structure has no persistent state! } - void HierarchyComponent::Serialize(wiArchive& archive, Entity seed) + void HierarchyComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { - SerializeEntity(archive, parentID, seed); + SerializeEntity(archive, parentID, seri); if (archive.IsReadMode()) { @@ -74,7 +74,7 @@ namespace wiScene archive << layerMask_bind; } } - void MaterialComponent::Serialize(wiArchive& archive, Entity seed) + void MaterialComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { std::string dir = archive.GetSourceDirectory(); @@ -175,31 +175,6 @@ namespace wiScene SetDirty(); - if (!baseColorMapName.empty()) - { - baseColorMap = wiResourceManager::Load(dir + baseColorMapName); - } - if (!surfaceMapName.empty()) - { - surfaceMap = wiResourceManager::Load(dir + surfaceMapName); - } - if (!normalMapName.empty()) - { - normalMap = wiResourceManager::Load(dir + normalMapName); - } - if (!displacementMapName.empty()) - { - displacementMap = wiResourceManager::Load(dir + displacementMapName); - } - if (!emissiveMapName.empty()) - { - emissiveMap = wiResourceManager::Load(dir + emissiveMapName); - } - if (!occlusionMapName.empty()) - { - occlusionMap = wiResourceManager::Load(dir + occlusionMapName); - } - } else { @@ -308,7 +283,7 @@ namespace wiScene } } } - void MeshComponent::Serialize(wiArchive& archive, Entity seed) + void MeshComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) @@ -328,13 +303,13 @@ namespace wiScene subsets.resize(subsetCount); for (size_t i = 0; i < subsetCount; ++i) { - SerializeEntity(archive, subsets[i].materialID, seed); + SerializeEntity(archive, subsets[i].materialID, seri); archive >> subsets[i].indexOffset; archive >> subsets[i].indexCount; } archive >> tessellationFactor; - SerializeEntity(archive, armatureID, seed); + SerializeEntity(archive, armatureID, seri); if (archive.GetVersion() >= 28) { @@ -343,9 +318,9 @@ namespace wiScene if (archive.GetVersion() >= 41) { - SerializeEntity(archive, terrain_material1, seed); - SerializeEntity(archive, terrain_material2, seed); - SerializeEntity(archive, terrain_material3, seed); + SerializeEntity(archive, terrain_material1, seri); + SerializeEntity(archive, terrain_material2, seri); + SerializeEntity(archive, terrain_material3, seri); } if (archive.GetVersion() >= 43) @@ -357,8 +332,6 @@ namespace wiScene { archive >> vertex_tangents; } - - CreateRenderData(); } else { @@ -375,13 +348,13 @@ namespace wiScene archive << subsets.size(); for (size_t i = 0; i < subsets.size(); ++i) { - SerializeEntity(archive, subsets[i].materialID, seed); + SerializeEntity(archive, subsets[i].materialID, seri); archive << subsets[i].indexOffset; archive << subsets[i].indexCount; } archive << tessellationFactor; - SerializeEntity(archive, armatureID, seed); + SerializeEntity(archive, armatureID, seri); if (archive.GetVersion() >= 28) { @@ -390,9 +363,9 @@ namespace wiScene if (archive.GetVersion() >= 41) { - SerializeEntity(archive, terrain_material1, seed); - SerializeEntity(archive, terrain_material2, seed); - SerializeEntity(archive, terrain_material3, seed); + SerializeEntity(archive, terrain_material1, seri); + SerializeEntity(archive, terrain_material2, seri); + SerializeEntity(archive, terrain_material3, seri); } if (archive.GetVersion() >= 43) @@ -407,7 +380,7 @@ namespace wiScene } } - void ImpostorComponent::Serialize(wiArchive& archive, Entity seed) + void ImpostorComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -422,12 +395,12 @@ namespace wiScene archive << swapInDistance; } } - void ObjectComponent::Serialize(wiArchive& archive, Entity seed) + void ObjectComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { archive >> _flags; - SerializeEntity(archive, meshID, seed); + SerializeEntity(archive, meshID, seri); archive >> cascadeMask; archive >> rendertypeMask; archive >> color; @@ -446,7 +419,7 @@ namespace wiScene else { archive << _flags; - SerializeEntity(archive, meshID, seed); + SerializeEntity(archive, meshID, seri); archive << cascadeMask; archive << rendertypeMask; archive << color; @@ -463,7 +436,7 @@ namespace wiScene } } } - void RigidBodyPhysicsComponent::Serialize(wiArchive& archive, Entity seed) + void RigidBodyPhysicsComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -484,7 +457,7 @@ namespace wiScene archive << damping; } } - void SoftBodyPhysicsComponent::Serialize(wiArchive& archive, Entity seed) + void SoftBodyPhysicsComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -513,7 +486,7 @@ namespace wiScene archive << weights; } } - void ArmatureComponent::Serialize(wiArchive& archive, Entity seed) + void ArmatureComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -525,7 +498,7 @@ namespace wiScene for (size_t i = 0; i < boneCount; ++i) { Entity boneID; - SerializeEntity(archive, boneID, seed); + SerializeEntity(archive, boneID, seri); boneCollection[i] = boneID; } @@ -539,7 +512,7 @@ namespace wiScene if (archive.GetVersion() == 26) { Entity rootBoneID; - SerializeEntity(archive, rootBoneID, seed); + SerializeEntity(archive, rootBoneID, seri); } } else @@ -550,18 +523,18 @@ namespace wiScene for (size_t i = 0; i < boneCollection.size(); ++i) { Entity boneID = boneCollection[i]; - SerializeEntity(archive, boneID, seed); + SerializeEntity(archive, boneID, seri); } archive << inverseBindMatrices; if (archive.GetVersion() == 26) { Entity rootBoneID; - SerializeEntity(archive, rootBoneID, seed); + SerializeEntity(archive, rootBoneID, seri); } } } - void LightComponent::Serialize(wiArchive& archive, Entity seed) + void LightComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { std::string dir = archive.GetSourceDirectory(); @@ -632,7 +605,7 @@ namespace wiScene archive << lensFlareNames; } } - void CameraComponent::Serialize(wiArchive& archive, Entity seed) + void CameraComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -655,7 +628,7 @@ namespace wiScene archive << fov; } } - void EnvironmentProbeComponent::Serialize(wiArchive& archive, Entity seed) + void EnvironmentProbeComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -668,7 +641,7 @@ namespace wiScene archive << _flags; } } - void ForceFieldComponent::Serialize(wiArchive& archive, Entity seed) + void ForceFieldComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -685,7 +658,7 @@ namespace wiScene archive << range_local; } } - void DecalComponent::Serialize(wiArchive& archive, Entity seed) + void DecalComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -696,7 +669,7 @@ namespace wiScene archive << _flags; } } - void AnimationComponent::Serialize(wiArchive& archive, Entity seed) + void AnimationComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -721,7 +694,7 @@ namespace wiScene { archive >> channels[i]._flags; archive >> (uint32_t&)channels[i].path; - SerializeEntity(archive, channels[i].target, seed); + SerializeEntity(archive, channels[i].target, seri); archive >> channels[i].samplerIndex; } @@ -739,7 +712,7 @@ namespace wiScene } if (archive.GetVersion() >= 46) { - SerializeEntity(archive, samplers[i].data, seed); + SerializeEntity(archive, samplers[i].data, seri); } } @@ -765,7 +738,7 @@ namespace wiScene { archive << channels[i]._flags; archive << (uint32_t&)channels[i].path; - SerializeEntity(archive, channels[i].target, seed); + SerializeEntity(archive, channels[i].target, seri); archive << channels[i].samplerIndex; } @@ -774,11 +747,11 @@ namespace wiScene { archive << samplers[i]._flags; archive << samplers[i].mode; - SerializeEntity(archive, samplers[i].data, seed); + SerializeEntity(archive, samplers[i].data, seri); } } } - void AnimationDataComponent::Serialize(wiArchive& archive, Entity seed) + void AnimationDataComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -793,7 +766,7 @@ namespace wiScene archive << keyframe_data; } } - void WeatherComponent::Serialize(wiArchive& archive, Entity seed) + void WeatherComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { std::string dir = archive.GetSourceDirectory(); @@ -893,7 +866,7 @@ namespace wiScene } } - void SoundComponent::Serialize(wiArchive& archive, Entity seed) + void SoundComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { std::string dir = archive.GetSourceDirectory(); @@ -929,9 +902,9 @@ namespace wiScene archive << soundinstance.type; } } - void InverseKinematicsComponent::Serialize(wiArchive& archive, Entity seed) + void InverseKinematicsComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { - SerializeEntity(archive, target, seed); + SerializeEntity(archive, target, seri); if (archive.IsReadMode()) { @@ -946,7 +919,7 @@ namespace wiScene archive << iteration_count; } } - void SpringComponent::Serialize(wiArchive& archive, Entity seed) + void SpringComponent::Serialize(wiArchive& archive, EntitySerializer& seri) { if (archive.IsReadMode()) { @@ -980,55 +953,75 @@ namespace wiScene } // With this we will ensure that serialized entities are unique and persistent across the scene: - Entity seed = CreateEntity(); + EntitySerializer seri; - names.Serialize(archive, seed); - layers.Serialize(archive, seed); - transforms.Serialize(archive, seed); - prev_transforms.Serialize(archive, seed); - hierarchy.Serialize(archive, seed); - materials.Serialize(archive, seed); - meshes.Serialize(archive, seed); - impostors.Serialize(archive, seed); - objects.Serialize(archive, seed); - aabb_objects.Serialize(archive, seed); - rigidbodies.Serialize(archive, seed); - softbodies.Serialize(archive, seed); - armatures.Serialize(archive, seed); - lights.Serialize(archive, seed); - aabb_lights.Serialize(archive, seed); - cameras.Serialize(archive, seed); - probes.Serialize(archive, seed); - aabb_probes.Serialize(archive, seed); - forces.Serialize(archive, seed); - decals.Serialize(archive, seed); - aabb_decals.Serialize(archive, seed); - animations.Serialize(archive, seed); - emitters.Serialize(archive, seed); - hairs.Serialize(archive, seed); - weathers.Serialize(archive, seed); + names.Serialize(archive, seri); + layers.Serialize(archive, seri); + transforms.Serialize(archive, seri); + prev_transforms.Serialize(archive, seri); + hierarchy.Serialize(archive, seri); + materials.Serialize(archive, seri); + meshes.Serialize(archive, seri); + impostors.Serialize(archive, seri); + objects.Serialize(archive, seri); + aabb_objects.Serialize(archive, seri); + rigidbodies.Serialize(archive, seri); + softbodies.Serialize(archive, seri); + armatures.Serialize(archive, seri); + lights.Serialize(archive, seri); + aabb_lights.Serialize(archive, seri); + cameras.Serialize(archive, seri); + probes.Serialize(archive, seri); + aabb_probes.Serialize(archive, seri); + forces.Serialize(archive, seri); + decals.Serialize(archive, seri); + aabb_decals.Serialize(archive, seri); + animations.Serialize(archive, seri); + emitters.Serialize(archive, seri); + hairs.Serialize(archive, seri); + weathers.Serialize(archive, seri); if (archive.GetVersion() >= 30) { - sounds.Serialize(archive, seed); + sounds.Serialize(archive, seri); } if (archive.GetVersion() >= 37) { - inverse_kinematics.Serialize(archive, seed); + inverse_kinematics.Serialize(archive, seri); } if (archive.GetVersion() >= 38) { - springs.Serialize(archive, seed); + springs.Serialize(archive, seri); } if (archive.GetVersion() >= 46) { - animation_datas.Serialize(archive, seed); + animation_datas.Serialize(archive, seri); + } + + + if (archive.IsReadMode()) + { + wiJobSystem::context ctx; + + wiJobSystem::Dispatch(ctx, (uint32_t)meshes.GetCount(), 1, [&](wiJobArgs args) { + meshes[args.jobIndex].CreateRenderData(); + }); + wiJobSystem::Dispatch(ctx, (uint32_t)materials.GetCount(), 1, [&](wiJobArgs args) { + materials[args.jobIndex].CreateRenderData(archive.GetSourceDirectory()); + }); + wiJobSystem::Wait(ctx); } } - Entity Scene::Entity_Serialize(wiArchive& archive, Entity entity, Entity seed, bool propagateSeedDeep) + Entity Scene::Entity_Serialize(wiArchive& archive, Entity entity) { - SerializeEntity(archive, entity, seed); + EntitySerializer seri; + + SerializeEntity(archive, entity, seri); + + // From this point, we will not remap the entities, + // to retain internal entity references inside components: + seri.allow_remap = false; if (archive.IsReadMode()) { @@ -1039,7 +1032,7 @@ namespace wiScene if (component_exists) { auto& component = names.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1048,7 +1041,7 @@ namespace wiScene if (component_exists) { auto& component = layers.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1057,7 +1050,7 @@ namespace wiScene if (component_exists) { auto& component = transforms.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1066,7 +1059,7 @@ namespace wiScene if (component_exists) { auto& component = prev_transforms.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1075,7 +1068,7 @@ namespace wiScene if (component_exists) { auto& component = hierarchy.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1084,7 +1077,7 @@ namespace wiScene if (component_exists) { auto& component = materials.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1093,7 +1086,7 @@ namespace wiScene if (component_exists) { auto& component = meshes.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1102,7 +1095,7 @@ namespace wiScene if (component_exists) { auto& component = impostors.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1111,7 +1104,7 @@ namespace wiScene if (component_exists) { auto& component = objects.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1120,7 +1113,7 @@ namespace wiScene if (component_exists) { auto& component = aabb_objects.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1129,7 +1122,7 @@ namespace wiScene if (component_exists) { auto& component = rigidbodies.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1138,7 +1131,7 @@ namespace wiScene if (component_exists) { auto& component = softbodies.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1147,7 +1140,7 @@ namespace wiScene if (component_exists) { auto& component = armatures.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1156,7 +1149,7 @@ namespace wiScene if (component_exists) { auto& component = lights.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1165,7 +1158,7 @@ namespace wiScene if (component_exists) { auto& component = aabb_lights.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1174,7 +1167,7 @@ namespace wiScene if (component_exists) { auto& component = cameras.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1183,7 +1176,7 @@ namespace wiScene if (component_exists) { auto& component = probes.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1192,7 +1185,7 @@ namespace wiScene if (component_exists) { auto& component = aabb_probes.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1201,7 +1194,7 @@ namespace wiScene if (component_exists) { auto& component = forces.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1210,7 +1203,7 @@ namespace wiScene if (component_exists) { auto& component = decals.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1219,7 +1212,7 @@ namespace wiScene if (component_exists) { auto& component = aabb_decals.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1228,7 +1221,7 @@ namespace wiScene if (component_exists) { auto& component = animations.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1237,7 +1230,7 @@ namespace wiScene if (component_exists) { auto& component = emitters.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1246,7 +1239,7 @@ namespace wiScene if (component_exists) { auto& component = hairs.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } { @@ -1255,7 +1248,7 @@ namespace wiScene if (component_exists) { auto& component = weathers.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } if (archive.GetVersion() >= 30) @@ -1265,7 +1258,7 @@ namespace wiScene if (component_exists) { auto& component = sounds.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } if (archive.GetVersion() >= 37) @@ -1275,7 +1268,7 @@ namespace wiScene if (component_exists) { auto& component = inverse_kinematics.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } if (archive.GetVersion() >= 38) @@ -1285,7 +1278,7 @@ namespace wiScene if (component_exists) { auto& component = springs.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } if (archive.GetVersion() >= 46) @@ -1295,7 +1288,7 @@ namespace wiScene if (component_exists) { auto& component = animation_datas.Create(entity); - component.Serialize(archive, propagateSeedDeep ? seed : 0); + component.Serialize(archive, seri); } } } @@ -1307,7 +1300,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1319,7 +1312,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1331,7 +1324,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1343,7 +1336,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1355,7 +1348,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1367,7 +1360,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1379,7 +1372,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1391,7 +1384,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1403,7 +1396,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1415,7 +1408,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1427,7 +1420,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1439,7 +1432,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1451,7 +1444,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1463,7 +1456,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1475,7 +1468,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1487,7 +1480,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1499,7 +1492,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1511,7 +1504,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1523,7 +1516,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1535,7 +1528,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1547,7 +1540,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1559,7 +1552,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1571,7 +1564,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1583,7 +1576,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1595,7 +1588,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1608,7 +1601,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1621,7 +1614,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1634,7 +1627,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { @@ -1647,7 +1640,7 @@ namespace wiScene if (component != nullptr) { archive << true; - component->Serialize(archive, seed); + component->Serialize(archive, seri); } else { diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 3d69d3841..505873106 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates, breaking API changes const int minor = 49; // minor bug fixes, alterations, refactors, updates - const int revision = 2; + const int revision = 3; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);