Browse Source

Do not release resource if it has weak refs.
Exposed function to explicitly reload shaders.
Set a default resource path in the editor (Bin/Data/) so that scene/model import works even without setting a resource path.

Lasse Öörni 13 years ago
parent
commit
8fe755e7e6

+ 2 - 0
Bin/Data/Scripts/Editor.as

@@ -24,6 +24,8 @@ void Start()
     script.defaultScriptFile = scriptFile;
     // Enable automatic resource reloading
     cache.autoReloadResources = true;
+    // Set default resource path
+    SetResourcePath(fileSystem.programDir + "Data");
 
     CreateScene();
     CreateUI();

+ 2 - 0
Bin/Data/Scripts/Editor/EditorScene.as

@@ -82,6 +82,8 @@ void SetResourcePath(String newPath, bool usePreferredDir = true)
         return;
 
     cache.ReleaseAllResources(false);
+    renderer.ReloadShaders();
+
     // Remove the old scene resource path if any. However make sure that the default data paths do not get removed
     if (!sceneResourcePath.empty && sceneResourcePath.Find(fileSystem.programDir) < 0)
         cache.RemoveResourceDir(sceneResourcePath);

+ 1 - 1
Bin/Data/Scripts/Terrain.as

@@ -130,7 +130,7 @@ void InitScene()
 
     Node@ zoneNode = testScene.CreateChild("Zone");
     Zone@ zone = zoneNode.CreateComponent("Zone");
-    zone.ambientColor = Color(0.2, 0.2, 0.2);
+    zone.ambientColor = Color(0.15, 0.15, 0.15);
     zone.fogColor = Color(0.5, 0.5, 0.7);
     zone.fogStart = 500.0;
     zone.fogEnd = 1000.0;

+ 1 - 1
Bin/Data/Scripts/TestScene.as

@@ -129,7 +129,7 @@ void InitScene()
 
     Node@ zoneNode = testScene.CreateChild("Zone");
     Zone@ zone = zoneNode.CreateComponent("Zone");
-    zone.ambientColor = Color(0.15, 0.15, 0.15);
+    zone.ambientColor = Color(0.1, 0.1, 0.1);
     zone.fogColor = Color(0.5, 0.5, 0.7);
     zone.fogStart = 100.0;
     zone.fogEnd = 300.0;

+ 1 - 0
Docs/ScriptAPI.dox

@@ -2493,6 +2493,7 @@ Renderer
 
 Methods:<br>
 - void DrawDebugGeometry(bool) const
+- void ReloadShaders() const
 
 Properties:<br>
 - ShortStringHash type (readonly)

+ 1 - 0
Engine/Engine/GraphicsAPI.cpp

@@ -888,6 +888,7 @@ static void RegisterRenderer(asIScriptEngine* engine)
     
     RegisterObject<Renderer>(engine, "Renderer");
     engine->RegisterObjectMethod("Renderer", "void DrawDebugGeometry(bool) const", asMETHOD(Renderer, DrawDebugGeometry), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Renderer", "void ReloadShaders() const", asMETHOD(Renderer, ReloadShaders), asCALL_THISCALL);
     engine->RegisterObjectMethod("Renderer", "void set_numViewports(uint)", asMETHOD(Renderer, SetNumViewports), asCALL_THISCALL);
     engine->RegisterObjectMethod("Renderer", "uint get_numViewports() const", asMETHOD(Renderer, GetNumViewports), asCALL_THISCALL);
     engine->RegisterObjectMethod("Renderer", "bool set_viewports(uint, Viewport@+)", asMETHOD(Renderer, SetViewport), asCALL_THISCALL);

+ 5 - 0
Engine/Graphics/Renderer.cpp

@@ -503,6 +503,11 @@ void Renderer::SetOccluderSizeThreshold(float screenSize)
     occluderSizeThreshold_ = Max(screenSize, 0.0f);
 }
 
+void Renderer::ReloadShaders()
+{
+    shadersDirty_ = true;
+}
+
 Viewport* Renderer::GetViewport(unsigned index) const
 {
     return index < viewports_.Size() ? viewports_[index] : (Viewport*)0;

+ 3 - 0
Engine/Graphics/Renderer.h

@@ -202,6 +202,9 @@ public:
     void SetOcclusionBufferSize(int size);
     /// %Set required screen size (1.0 = full screen) for occluders.
     void SetOccluderSizeThreshold(float screenSize);
+    /// Force reload of shaders.
+    void ReloadShaders();
+    
     /// Return number of viewports.
     unsigned GetNumViewports() const { return viewports_.Size(); }
     /// Return viewport.

+ 1 - 1
Engine/Resource/ResourceCache.cpp

@@ -284,7 +284,7 @@ void ResourceCache::ReleaseAllResources(bool force)
         {
             HashMap<StringHash, SharedPtr<Resource> >::Iterator current = j++;
             // If other references exist, do not release, unless forced
-            if (current->second_.Refs() == 1 || force)
+            if ((current->second_.Refs() == 1 && current->second_.WeakRefs() == 0) || force)
             {
                 i->second_.resources_.Erase(current);
                 released = true;