Browse Source

Do not store Image resources used during cube/3D texture loading permanently to cache.

Lasse Öörni 11 years ago
parent
commit
1f521713e7

+ 1 - 1
Source/Engine/Graphics/Direct3D9/D3D9Texture3D.cpp

@@ -96,7 +96,7 @@ bool Texture3D::Load(Deserializer& source)
         if (volumeTexPath.Empty())
         if (volumeTexPath.Empty())
             name = texPath + name;
             name = texPath + name;
 
 
-        SharedPtr<Image> image(GetSubsystem<ResourceCache>()->GetResource<Image>(name));
+        SharedPtr<Image> image(GetSubsystem<ResourceCache>()->GetTempResource<Image>(name));
         return Load(image);
         return Load(image);
     }
     }
     else if (colorlutElem)
     else if (colorlutElem)

+ 1 - 1
Source/Engine/Graphics/Direct3D9/D3D9TextureCube.cpp

@@ -323,7 +323,7 @@ bool TextureCube::Load(Deserializer& source)
         if (faceTexPath.Empty())
         if (faceTexPath.Empty())
             name = texPath + name;
             name = texPath + name;
         
         
-        SharedPtr<Image> image(cache->GetResource<Image>(name));
+        SharedPtr<Image> image(cache->GetTempResource<Image>(name));
         Load((CubeMapFace)faces, image);
         Load((CubeMapFace)faces, image);
         faces++;
         faces++;
         
         

+ 1 - 1
Source/Engine/Graphics/OpenGL/OGLTexture3D.cpp

@@ -101,7 +101,7 @@ bool Texture3D::Load(Deserializer& source)
         if (volumeTexPath.Empty())
         if (volumeTexPath.Empty())
             name = texPath + name;
             name = texPath + name;
 
 
-        SharedPtr<Image> image(GetSubsystem<ResourceCache>()->GetResource<Image>(name));
+        SharedPtr<Image> image(GetSubsystem<ResourceCache>()->GetTempResource<Image>(name));
         return Load(image);
         return Load(image);
     }
     }
     else if (colorlutElem)
     else if (colorlutElem)

+ 1 - 1
Source/Engine/Graphics/OpenGL/OGLTextureCube.cpp

@@ -283,7 +283,7 @@ bool TextureCube::Load(Deserializer& source)
         if (faceTexPath.Empty())
         if (faceTexPath.Empty())
             name = texPath + name;
             name = texPath + name;
         
         
-        SharedPtr<Image> image(cache->GetResource<Image>(name));
+        SharedPtr<Image> image(cache->GetTempResource<Image>(name));
         Load((CubeMapFace)faces, image);
         Load((CubeMapFace)faces, image);
         ++faces;
         ++faces;
         
         

+ 75 - 11
Source/Engine/Resource/ResourceCache.cpp

@@ -450,12 +450,15 @@ Resource* ResourceCache::GetResource(StringHash type, const char* nameIn, bool s
     {
     {
         LOGERROR("Could not load unknown resource type " + String(type));
         LOGERROR("Could not load unknown resource type " + String(type));
 
 
-        using namespace UnknownResourceType;
-
-        VariantMap& eventData = GetEventDataMap();
-        eventData[P_RESOURCETYPE] = type;
-        SendEvent(E_UNKNOWNRESOURCETYPE, eventData);
-
+        if (sendEventOnFailure)
+        {
+            using namespace UnknownResourceType;
+            
+            VariantMap& eventData = GetEventDataMap();
+            eventData[P_RESOURCETYPE] = type;
+            SendEvent(E_UNKNOWNRESOURCETYPE, eventData);
+        }
+        
         return 0;
         return 0;
     }
     }
     
     
@@ -470,12 +473,15 @@ Resource* ResourceCache::GetResource(StringHash type, const char* nameIn, bool s
     if (!resource->Load(*(file.Get())))
     if (!resource->Load(*(file.Get())))
     {
     {
         // Error should already been logged by corresponding resource descendant class
         // Error should already been logged by corresponding resource descendant class
-        using namespace LoadFailed;
-
-        VariantMap& eventData = GetEventDataMap();
-        eventData[P_RESOURCENAME] = name;
-        SendEvent(E_LOADFAILED, eventData);
+        if (sendEventOnFailure)
+        {
+            using namespace LoadFailed;
 
 
+            VariantMap& eventData = GetEventDataMap();
+            eventData[P_RESOURCENAME] = name;
+            SendEvent(E_LOADFAILED, eventData);
+        }
+        
         if (!returnFailedResources_)
         if (!returnFailedResources_)
             return 0;
             return 0;
     }
     }
@@ -488,6 +494,64 @@ Resource* ResourceCache::GetResource(StringHash type, const char* nameIn, bool s
     return resource;
     return resource;
 }
 }
 
 
+SharedPtr<Resource> ResourceCache::GetTempResource(StringHash type, const String& nameIn, bool sendEventOnFailure)
+{
+    String name = SanitateResourceName(nameIn);
+    
+    // If empty name, return null pointer immediately
+    if (name.Empty())
+        return SharedPtr<Resource>();
+    
+    StringHash nameHash(name);
+    const SharedPtr<Resource>& existing = FindResource(type, nameHash);
+    if (existing)
+        return existing;
+    
+    SharedPtr<Resource> resource;
+    // Make sure the pointer is non-null and is a Resource subclass
+    resource = DynamicCast<Resource>(context_->CreateObject(type));
+    if (!resource)
+    {
+        LOGERROR("Could not load unknown resource type " + String(type));
+
+        if (sendEventOnFailure)
+        {
+            using namespace UnknownResourceType;
+            
+            VariantMap& eventData = GetEventDataMap();
+            eventData[P_RESOURCETYPE] = type;
+            SendEvent(E_UNKNOWNRESOURCETYPE, eventData);
+        }
+        
+        return SharedPtr<Resource>();
+    }
+    
+    // Attempt to load the resource
+    SharedPtr<File> file = GetFile(name, sendEventOnFailure);
+    if (!file)
+        return SharedPtr<Resource>();  // Error is already logged
+
+    LOGDEBUG("Loading temporary resource " + name);
+    resource->SetName(file->GetName());
+
+    if (!resource->Load(*(file.Get())))
+    {
+        // Error should already been logged by corresponding resource descendant class
+        if (sendEventOnFailure)
+        {
+            using namespace LoadFailed;
+
+            VariantMap& eventData = GetEventDataMap();
+            eventData[P_RESOURCENAME] = name;
+            SendEvent(E_LOADFAILED, eventData);
+        }
+        
+        return SharedPtr<Resource>();
+    }
+    
+    return resource;
+}
+
 void ResourceCache::GetResources(PODVector<Resource*>& result, StringHash type) const
 void ResourceCache::GetResources(PODVector<Resource*>& result, StringHash type) const
 {
 {
     result.Clear();
     result.Clear();

+ 10 - 0
Source/Engine/Resource/ResourceCache.h

@@ -103,6 +103,8 @@ public:
     Resource* GetResource(StringHash type, const String& name, bool sendEventOnFailure = true);
     Resource* GetResource(StringHash type, const String& name, bool sendEventOnFailure = true);
     /// Return a resource by type and name. Load if not loaded yet. Return null if not found or if fails, unless SetReturnFailedResources(true) has been called.
     /// Return a resource by type and name. Load if not loaded yet. Return null if not found or if fails, unless SetReturnFailedResources(true) has been called.
     Resource* GetResource(StringHash type, const char* name, bool sendEventOnFailure = true);
     Resource* GetResource(StringHash type, const char* name, bool sendEventOnFailure = true);
+    /// Load a resource without storing it in the resource cache. Return null if not found or if fails.
+    SharedPtr<Resource> GetTempResource(StringHash type, const String& name, bool sendEventOnFailure = true);
     /// Return all loaded resources of a specific type.
     /// Return all loaded resources of a specific type.
     void GetResources(PODVector<Resource*>& result, StringHash type) const;
     void GetResources(PODVector<Resource*>& result, StringHash type) const;
     /// Return all loaded resources.
     /// Return all loaded resources.
@@ -115,6 +117,8 @@ public:
     template <class T> T* GetResource(const String& name, bool sendEventOnFailure = true);
     template <class T> T* GetResource(const String& name, bool sendEventOnFailure = true);
     /// Template version of returning a resource by name.
     /// Template version of returning a resource by name.
     template <class T> T* GetResource(const char* name, bool sendEventOnFailure = true);
     template <class T> T* GetResource(const char* name, bool sendEventOnFailure = true);
+    /// Template version of loading a resource without storing it to the cache.
+    template <class T> SharedPtr<T> GetTempResource(const String& name, bool sendEventOnFailure = true);
     /// Template version of returning loaded resources of a specific type.
     /// Template version of returning loaded resources of a specific type.
     template <class T> void GetResources(PODVector<T*>& result) const;
     template <class T> void GetResources(PODVector<T*>& result) const;
     /// Return whether a file exists by name.
     /// Return whether a file exists by name.
@@ -191,6 +195,12 @@ template <class T> T* ResourceCache::GetResource(const char* name, bool sendEven
     return static_cast<T*>(GetResource(type, name, sendEventOnFailure));
     return static_cast<T*>(GetResource(type, name, sendEventOnFailure));
 }
 }
 
 
+template <class T> SharedPtr<T> ResourceCache::GetTempResource(const String& name, bool sendEventOnFailure)
+{
+    StringHash type = T::GetTypeStatic();
+    return StaticCast<T>(GetTempResource(type, name, sendEventOnFailure));
+}
+
 template <class T> void ResourceCache::GetResources(PODVector<T*>& result) const
 template <class T> void ResourceCache::GetResources(PODVector<T*>& result) const
 {
 {
     PODVector<Resource*>& resources = reinterpret_cast<PODVector<Resource*>&>(result);
     PODVector<Resource*>& resources = reinterpret_cast<PODVector<Resource*>&>(result);