void deserialize(InputBlob& serializer) override { int count; serializer.read(count); m_prefabs.resize(count); if (count > 0) serializer.read(&m_prefabs[0], m_prefabs.size() * sizeof(m_prefabs[0])); serializer.read(count); for (int i = 0; i < count; ++i) { u64 key; Entity value; serializer.read(key); serializer.read(value); m_instances.insert(key, value); } serializer.read(count); auto* resource_manager = m_editor.getEngine().getResourceManager().get(PrefabResource::TYPE); for (int i = 0; i < count; ++i) { char tmp[MAX_PATH_LENGTH]; serializer.readString(tmp, lengthOf(tmp)); auto* res = (PrefabResource*)resource_manager->load(Path(tmp)); m_resources.insert(res->getPath().getHash(), res); } }
void Universe::deserialize(InputBlob& serializer) { int32 count; serializer.read(count); m_transformations.resize(count); serializer.read(&m_transformations[0], sizeof(m_transformations[0]) * m_transformations.size()); serializer.read(count); m_id_to_name_map.clear(); m_name_to_id_map.clear(); for (int i = 0; i < count; ++i) { uint32 key; char name[50]; serializer.read(key); serializer.readString(name, sizeof(name)); m_id_to_name_map.insert(key, string(name, m_allocator)); m_name_to_id_map.insert(crc32(name), key); } serializer.read(m_first_free_slot); serializer.read(count); m_id_map.resize(count); if (!m_id_map.empty()) { serializer.read(&m_id_map[0], sizeof(m_id_map[0]) * count); } }
void deserialize(InputBlob& serializer) override { m_template_names.clear(); m_instances.clear(); int32 count; serializer.read(count); for (int i = 0; i < count; ++i) { const int MAX_NAME_LENGTH = 50; char name[MAX_NAME_LENGTH]; serializer.readString(name, MAX_NAME_LENGTH); m_template_names.push(string(name, m_editor.getAllocator())); } serializer.read(count); for (int i = 0; i < count; ++i) { uint32 hash; serializer.read(hash); int32 instances_per_template; serializer.read(instances_per_template); m_instances.insert(hash, Array<Entity>(m_editor.getAllocator())); Array<Entity>& entities = m_instances.get(hash); for (int j = 0; j < instances_per_template; ++j) { int32 entity_index; serializer.read(entity_index); entities.push(Entity(entity_index)); } } m_updated.invoke(); }
void ParticleEmitter::deserialize(InputBlob& blob, ResourceManager& manager, bool has_version) { int version = (int)ParticleEmitterVersion::INVALID; if (has_version) { blob.read(version); if (version > (int)ParticleEmitterVersion::SPAWN_COUNT) blob.read(m_spawn_count); } blob.read(m_spawn_period); blob.read(m_initial_life); blob.read(m_initial_size); blob.read(m_entity); char path[MAX_PATH_LENGTH]; blob.readString(path, lengthOf(path)); auto material_manager = manager.get(ResourceManager::MATERIAL); auto material = static_cast<Material*>(material_manager->load(Lumix::Path(path))); setMaterial(material); int size; blob.read(size); for (auto* module : m_modules) { LUMIX_DELETE(m_allocator, module); } m_modules.clear(); for (int i = 0; i < size; ++i) { uint32 type; blob.read(type); auto* module = createModule(type, *this); m_modules.push(module); module->deserialize(blob, version); } }
void ParticleEmitter::deserialize(InputBlob& blob, ResourceManager& manager) { blob.read(m_spawn_count); blob.read(m_spawn_period); blob.read(m_initial_life); blob.read(m_initial_size); blob.read(m_entity); blob.read(m_autoemit); blob.read(m_local_space); char path[MAX_PATH_LENGTH]; blob.readString(path, lengthOf(path)); auto material_manager = manager.get(MATERIAL_TYPE); auto material = static_cast<Material*>(material_manager->load(Path(path))); setMaterial(material); int size; blob.read(size); for (auto* module : m_modules) { LUMIX_DELETE(m_allocator, module); } m_modules.clear(); for (int i = 0; i < size; ++i) { ParticleEmitter::ModuleBase* module = nullptr; u32 hash; blob.read(hash); ComponentType type = PropertyRegister::getComponentTypeFromHash(hash); module = createModule(type, *this); if (module) { m_modules.push(module); } } }
virtual bool deserialize(UniverseContext& ctx, InputBlob& serializer) override { SerializedEngineHeader header; serializer.read(header); if (header.m_magic != SERIALIZED_ENGINE_MAGIC) { g_log_error.log("engine") << "Wrong or corrupted file"; return false; } if (header.m_version > SerializedEngineVersion::LATEST) { g_log_error.log("engine") << "Unsupported version"; return false; } if (!hasSerializedPlugins(serializer)) { return false; } g_path_manager.deserialize(serializer); ctx.m_universe->deserialize(serializer); ctx.m_hierarchy->deserialize(serializer); m_plugin_manager->deserialize(serializer); int32_t scene_count; serializer.read(scene_count); for (int i = 0; i < scene_count; ++i) { char tmp[32]; serializer.readString(tmp, sizeof(tmp)); IScene* scene = ctx.getScene(crc32(tmp)); scene->deserialize(serializer); } g_path_manager.clear(); return true; }
void PathManager::deserialize(InputBlob& serializer) { MT::SpinLock lock(m_mutex); int32 size; serializer.read(size); for (int i = 0; i < size; ++i) { char path[MAX_PATH_LENGTH]; serializer.readString(path, sizeof(path)); uint32 hash = crc32(path); PathInternal* internal = getPathMultithreadUnsafe(hash, path); --internal->m_ref_count; } }
bool deserialize(UniverseContext& ctx, InputBlob& serializer) override { SerializedEngineHeader header; serializer.read(header); if (header.m_magic != SERIALIZED_ENGINE_MAGIC) { g_log_error.log("engine") << "Wrong or corrupted file"; return false; } if (header.m_version > SerializedEngineVersion::LATEST) { g_log_error.log("engine") << "Unsupported version"; return false; } if (!hasSerializedPlugins(serializer)) { return false; } if (header.m_version > SerializedEngineVersion::SCENE_VERSION_CHECK && !hasSupportedSceneVersions(serializer, ctx)) { return false; } m_path_manager.deserialize(serializer); ctx.m_universe->deserialize(serializer); if (header.m_version <= SerializedEngineVersion::HIERARCHY_COMPONENT) { ctx.getScene(HIERARCHY_HASH)->deserialize(serializer, 0); } m_plugin_manager->deserialize(serializer); int32 scene_count; serializer.read(scene_count); for (int i = 0; i < scene_count; ++i) { char tmp[32]; serializer.readString(tmp, sizeof(tmp)); IScene* scene = ctx.getScene(crc32(tmp)); int scene_version = -1; if (header.m_version > SerializedEngineVersion::SCENE_VERSION) { serializer.read(scene_version); } scene->deserialize(serializer, scene_version); } m_path_manager.clear(); return true; }
bool hasSerializedPlugins(InputBlob& serializer) { int32 count; serializer.read(count); for (int i = 0; i < count; ++i) { char tmp[32]; serializer.readString(tmp, sizeof(tmp)); if (!m_plugin_manager->getPlugin(tmp)) { g_log_error.log("engine") << "Missing plugin " << tmp; return false; } } return true; }
void deserialize(InputBlob& serializer) override { int32_t count; serializer.read(count); m_script_entities.resize(count); m_paths.clear(); m_paths.reserve(count); for (int i = 0; i < m_script_entities.size(); ++i) { serializer.read(m_script_entities[i]); char path[LUMIX_MAX_PATH]; serializer.readString(path, sizeof(path)); m_paths.push(Path(path)); Entity entity(&m_universe, m_script_entities[i]); if(m_script_entities[i] != -1) { m_universe.addComponent(entity, SCRIPT_HASH, this, i); } } }
void deserialize(InputBlob& serializer, int) override { int32 count; serializer.read(count); m_animables.resize(count); for (int i = 0; i < count; ++i) { serializer.read(m_animables[i].m_entity); ComponentIndex renderable = m_render_scene->getRenderableComponent(m_animables[i].m_entity); if (renderable >= 0) { m_animables[i].m_renderable = renderable; } serializer.read(m_animables[i].m_time); serializer.read(m_animables[i].m_is_free); char path[MAX_PATH_LENGTH]; serializer.readString(path, sizeof(path)); m_animables[i].m_animation = path[0] == '\0' ? nullptr : loadAnimation(path); m_universe.addComponent(m_animables[i].m_entity, ANIMABLE_HASH, this, i); } }
void deserialize(InputBlob& serializer, int version) override { int32 count; serializer.read(count); m_animables.reserve(count); for (int i = 0; i < count; ++i) { Animable animable; serializer.read(animable.entity); bool free = false; if (version <= (int)AnimationSceneVersion::FIRST) { serializer.read(animable.time); serializer.read(free); animable.time_scale = 1; animable.start_time = 0; } else { uint32 flags = 0; if(version <= (int)AnimationSceneVersion::REFACTOR) serializer.read(flags); free = flags != 0; serializer.read(animable.time_scale); serializer.read(animable.start_time); animable.time = animable.start_time; } char path[MAX_PATH_LENGTH]; serializer.readString(path, sizeof(path)); animable.animation = path[0] == '\0' ? nullptr : loadAnimation(Path(path)); if (!free) { m_animables.insert(animable.entity, animable); ComponentHandle cmp = {animable.entity.index}; m_universe.addComponent(animable.entity, ANIMABLE_TYPE, this, cmp); } } }