void CubemapGenerator::SaveCubemapXML() { SharedPtr<XMLFile> xmlFile(new XMLFile(context_)); XMLElement rootElem = xmlFile->CreateRoot("cubemap"); String prefix = resourcePath_ + namePrefix_ + "_"; String name = prefix + GetFaceName(FACE_POSITIVE_X) + ".png"; rootElem.CreateChild("face").SetAttribute("name", name); name = prefix + GetFaceName(FACE_NEGATIVE_X) + ".png"; rootElem.CreateChild("face").SetAttribute("name", name); name = prefix + GetFaceName(FACE_POSITIVE_Y) + ".png"; rootElem.CreateChild("face").SetAttribute("name", name); name = prefix + GetFaceName(FACE_NEGATIVE_Y) + ".png"; rootElem.CreateChild("face").SetAttribute("name", name); name = prefix + GetFaceName(FACE_POSITIVE_Z) + ".png"; rootElem.CreateChild("face").SetAttribute("name", name); name = prefix + GetFaceName(FACE_NEGATIVE_Z) + ".png"; rootElem.CreateChild("face").SetAttribute("name", name); String xmlPath = outputPathAbsolute_ + namePrefix_ + ".xml"; SharedPtr<File> file(new File(context_, xmlPath, FILE_WRITE)); xmlFile->Save(*file, " "); file->Close(); ResourceCache* cache = GetSubsystem<ResourceCache>(); TextureCube* texcube = cache->GetResource<TextureCube>(resourcePath_ + namePrefix_ + ".xml"); if (texcube) cache->ReloadResource(texcube); }
void TextureCube::OnDeviceReset() { if (pool_ == D3DPOOL_DEFAULT || !object_ || dataPending_) { // If has a resource file, reload through the resource cache. Otherwise just recreate. ResourceCache* cache = GetSubsystem<ResourceCache>(); if (cache->Exists(GetName())) dataLost_ = !cache->ReloadResource(this); if (!object_) { Create(); dataLost_ = true; } } dataPending_ = false; }
void Texture2DArray::OnDeviceReset() { if (usage_ > TEXTURE_STATIC || !object_.ptr_ || dataPending_) { // If has a resource file, reload through the resource cache. Otherwise just recreate. ResourceCache* cache = GetSubsystem<ResourceCache>(); if (cache->Exists(GetName())) dataLost_ = !cache->ReloadResource(this); if (!object_.ptr_) { Create(); dataLost_ = true; } } dataPending_ = false; }
void TextureCube::OnDeviceReset() { if (!object_ || dataPending_) { // If has a resource file, reload through the resource cache. Otherwise just recreate. ResourceCache* cache = context_->resourceCache(); if (cache->Exists(GetName())) dataLost_ = !cache->ReloadResource(this); if (!object_) { Create(); dataLost_ = true; } } dataPending_ = false; }
bool ModelImporter::Import() { String ext = asset_->GetExtension(); String modelAssetFilename = asset_->GetPath(); importNode_ = new Node(context_); if (ext == ".mdl") { FileSystem* fs = GetSubsystem<FileSystem>(); ResourceCache* cache = GetSubsystem<ResourceCache>(); // mdl files are native file format that doesn't need to be converted // doesn't allow scale, animations legacy primarily for ToonTown if (!fs->Copy(asset_->GetPath(), asset_->GetCachePath() + ".mdl")) { importNode_= 0; return false; } Model* mdl = cache->GetResource<Model>( asset_->GetCachePath() + ".mdl"); if (!mdl) { importNode_= 0; return false; } // Force a reload, though file watchers will catch this delayed and load again cache->ReloadResource(mdl); importNode_->CreateComponent<StaticModel>()->SetModel(mdl); } else { // skip external animations, they will be brought in when importing their // corresponding model if (!modelAssetFilename.Contains("@")) { ImportModel(); if (importAnimations_) { ImportAnimations(); } AnimatedModel* animatedModel = importNode_->GetComponent<AnimatedModel>(); if (animatedModel) { Model* model = animatedModel->GetModel(); if (model && model->GetAnimationCount()) { // resave with animation info File mdlFile(context_); if (!mdlFile.Open(asset_->GetCachePath() + ".mdl", FILE_WRITE)) { ErrorExit("Could not open output file " + asset_->GetCachePath() + ".mdl"); return false; } model->Save(mdlFile); } } } } File outFile(context_); if (!outFile.Open(asset_->GetCachePath(), FILE_WRITE)) ErrorExit("Could not open output file " + asset_->GetCachePath()); importNode_->SaveXML(outFile); importNode_ = 0; return true; }
void PrefabImporter::HandlePrefabSave(StringHash eventType, VariantMap& eventData) { using namespace PrefabSave; PrefabComponent* component = static_cast<PrefabComponent*>(eventData[P_PREFABCOMPONENT].GetPtr()); if (component->GetPrefabGUID() != asset_->GetGUID()) return; Node* node = component->GetNode(); if (!node) return; // flip temporary root children and components to not be temporary for save const Vector<SharedPtr<Component>>& rootComponents = node->GetComponents(); const Vector<SharedPtr<Node> >& children = node->GetChildren(); PODVector<Component*> tempComponents; PODVector<Node*> tempChildren; PODVector<Node*> filterNodes; for (unsigned i = 0; i < rootComponents.Size(); i++) { if (rootComponents[i]->IsTemporary()) { rootComponents[i]->SetTemporary(false); tempComponents.Push(rootComponents[i]); // Animated sprites contain a temporary node we don't want to save in the prefab // it would be nice if this was general purpose because have to test this when // breaking node as well if (rootComponents[i]->GetType() == AnimatedSprite2D::GetTypeStatic()) { AnimatedSprite2D* asprite = (AnimatedSprite2D*) rootComponents[i].Get(); if (asprite->GetRootNode()) filterNodes.Push(asprite->GetRootNode()); } } } for (unsigned i = 0; i < children.Size(); i++) { if (filterNodes.Contains(children[i].Get())) continue; if (children[i]->IsTemporary()) { children[i]->SetTemporary(false); tempChildren.Push(children[i]); } } // store original transform Vector3 pos = node->GetPosition(); Quaternion rot = node->GetRotation(); Vector3 scale = node->GetScale(); node->SetPosition(Vector3::ZERO); node->SetRotation(Quaternion::IDENTITY); node->SetScale(Vector3::ONE); component->SetTemporary(true); SharedPtr<File> file(new File(context_, asset_->GetPath(), FILE_WRITE)); node->SaveXML(*file); file->Close(); component->SetTemporary(false); // restore node->SetPosition(pos); node->SetRotation(rot); node->SetScale(scale); for (unsigned i = 0; i < tempComponents.Size(); i++) { tempComponents[i]->SetTemporary(true); } for (unsigned i = 0; i < tempChildren.Size(); i++) { tempChildren[i]->SetTemporary(true); } FileSystem* fs = GetSubsystem<FileSystem>(); fs->Copy(asset_->GetPath(), asset_->GetCachePath()); // reload it immediately so it is ready for use // TODO: The resource cache is reloading after this reload due to catching the file cache ResourceCache* cache = GetSubsystem<ResourceCache>(); XMLFile* xmlfile = cache->GetResource<XMLFile>(asset_->GetGUID()); cache->ReloadResource(xmlfile); VariantMap changedData; changedData[PrefabChanged::P_GUID] = asset_->GetGUID(); SendEvent(E_PREFABCHANGED, changedData); }