Browse Source

Fix double load of Prefabs when saving from inspector, which caused stale node data in inspector

Josh Engebretson 9 years ago
parent
commit
d985035164
2 changed files with 15 additions and 3 deletions
  1. 11 2
      Source/ToolCore/Assets/PrefabImporter.cpp
  2. 4 1
      Source/ToolCore/Assets/PrefabImporter.h

+ 11 - 2
Source/ToolCore/Assets/PrefabImporter.cpp

@@ -34,7 +34,8 @@
 namespace ToolCore
 {
 
-PrefabImporter::PrefabImporter(Context* context, Asset* asset) : AssetImporter(context, asset)
+PrefabImporter::PrefabImporter(Context* context, Asset* asset) : AssetImporter(context, asset),
+    lastFileStamp_(0xFFFFFFFF)
 {
     SubscribeToEvent(E_PREFABSAVE, ATOMIC_HANDLER(PrefabImporter, HandlePrefabSave));
 }
@@ -140,12 +141,21 @@ void PrefabImporter::HandlePrefabSave(StringHash eventType, VariantMap& eventDat
     FileSystem* fs = GetSubsystem<FileSystem>();
     fs->Copy(asset_->GetPath(), asset_->GetCachePath());
 
+    asset_->UpdateFileTimestamp();
+    lastFileStamp_ = asset_->GetFileTimestamp();
+
     OnPrefabFileChanged();
 
 }
 
 bool PrefabImporter::Import()
 {
+
+    // The asset database will see the file changed, when the file watcher catches it
+    // though we already loaded/imported in OnPrefabFileChanged
+    if (lastFileStamp_ == asset_->GetFileTimestamp())
+        return true;
+
     FileSystem* fs = GetSubsystem<FileSystem>();
 
     fs->Copy(asset_->GetPath(), asset_->GetCachePath());
@@ -158,7 +168,6 @@ bool PrefabImporter::Import()
 void PrefabImporter::OnPrefabFileChanged()
 {
     // 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);

+ 4 - 1
Source/ToolCore/Assets/PrefabImporter.h

@@ -62,7 +62,10 @@ private:
 
     void HandlePrefabSave(StringHash eventType, VariantMap& eventData);
 
-   SharedPtr<Atomic::Scene> preloadResourceScene_;
+    SharedPtr<Atomic::Scene> preloadResourceScene_;
+
+    /// The last time the file was access, to avoid double loading based on saving prefabs
+    unsigned lastFileStamp_;
 
 };