Browse Source

Further cleanup of exceptions.

Lasse Öörni 15 years ago
parent
commit
ffce296795

+ 1 - 2
Engine/Engine/Client.cpp

@@ -59,8 +59,7 @@ Client::Client(Network* network, ResourceCache* cache, const std::string& downlo
 {
     if (!mNetwork)
         EXCEPTION("Null network for Client");
-    
-   if (!mCache)
+    if (!mCache)
         EXCEPTION("Null resource cache for Client");
     
     LOGINFO("Client created");

+ 46 - 38
Engine/Engine/Console.cpp

@@ -35,49 +35,55 @@
 #include "UI.h"
 #include "UIEvents.h"
 
+#include "DebugNew.h"
+
 Console::Console(Engine* engine) :
     mEngine(engine),
     mFontSize(1)
 {
     LOGINFO("Console created");
     
-    if (!mEngine)
-        return;
-    
-    Log* log = getLog();
-    if (log)
-        log->addListener(this);
-    
-    UIElement* uiRoot = mEngine->getUIRoot();
-    if (!uiRoot)
-        return;
-    
-    mBackground = new BorderImage();
-    mBackground->setWidth(uiRoot->getWidth());
-    mBackground->setColor(C_TOPLEFT, Color(0.0f, 0.25f, 0.0f, 0.75f));
-    mBackground->setColor(C_TOPRIGHT, Color(0.0f, 0.25f, 0.0f, 0.75f));
-    mBackground->setColor(C_BOTTOMLEFT, Color(0.25f, 0.75f, 0.25f, 0.75f));
-    mBackground->setColor(C_BOTTOMRIGHT, Color(0.25f, 0.75f, 0.25f, 0.75f));
-    mBackground->setBringToBack(false);
-    mBackground->setEnabled(true);
-    mBackground->setVisible(false);
-    mBackground->setPriority(200); // Show on top of the debug HUD
-    
-    mLineEdit = new LineEdit();
-    mLineEdit->setColor(Color(0.0f, 0.0f, 0.0f, 0.5f));
-    mLineEdit->setDefocusable(false);
-    mBackground->addChild(mLineEdit);
-    
-    uiRoot->addChild(mBackground);
-    
-    updateElements();
-    
-    subscribeToEvent(EVENT_TEXTFINISHED, EVENT_HANDLER(Console, handleTextFinished));
-    subscribeToEvent(EVENT_WINDOWRESIZED, EVENT_HANDLER(Console, handleWindowResized));
+    if (mEngine)
+    {
+        UIElement* uiRoot = mEngine->getUIRoot();
+        if (uiRoot)
+        {
+            Log* log = getLog();
+            if (log)
+                log->addListener(this);
+            
+            mBackground = new BorderImage();
+            mBackground->setWidth(uiRoot->getWidth());
+            mBackground->setColor(C_TOPLEFT, Color(0.0f, 0.25f, 0.0f, 0.75f));
+            mBackground->setColor(C_TOPRIGHT, Color(0.0f, 0.25f, 0.0f, 0.75f));
+            mBackground->setColor(C_BOTTOMLEFT, Color(0.25f, 0.75f, 0.25f, 0.75f));
+            mBackground->setColor(C_BOTTOMRIGHT, Color(0.25f, 0.75f, 0.25f, 0.75f));
+            mBackground->setBringToBack(false);
+            mBackground->setEnabled(true);
+            mBackground->setVisible(false);
+            mBackground->setPriority(200); // Show on top of the debug HUD
+            
+            mLineEdit = new LineEdit();
+            mLineEdit->setColor(Color(0.0f, 0.0f, 0.0f, 0.5f));
+            mLineEdit->setDefocusable(false);
+            mBackground->addChild(mLineEdit);
+            
+            uiRoot->addChild(mBackground);
+            
+            updateElements();
+            
+            subscribeToEvent(EVENT_TEXTFINISHED, EVENT_HANDLER(Console, handleTextFinished));
+            subscribeToEvent(EVENT_WINDOWRESIZED, EVENT_HANDLER(Console, handleWindowResized));
+        }
+    }
 }
 
 Console::~Console()
 {
+    Log* log = getLog();
+    if (log)
+        log->removeListener(this);
+    
     if (mEngine)
     {
         UIElement* uiRoot = mEngine->getUIRoot();
@@ -85,10 +91,6 @@ Console::~Console()
             uiRoot->removeChild(mBackground);
     }
     
-    Log* log = getLog();
-    if (log)
-        log->removeListener(this);
-    
     LOGINFO("Console shut down");
 }
 
@@ -111,7 +113,7 @@ void Console::write(const std::string& message)
 
 void Console::setVisible(bool enable)
 {
-    if (!mBackground)
+    if ((!mEngine) || (!mBackground))
         return;
     
     mBackground->setVisible(enable);
@@ -167,6 +169,9 @@ bool Console::isVisible() const
 
 void Console::updateElements()
 {
+    if (!mEngine)
+        return;
+    
     int width = mEngine->getRenderer()->getWidth();
     
     if (mFont)
@@ -186,6 +191,9 @@ void Console::updateElements()
 
 void Console::handleTextFinished(StringHash eventType, VariantMap& eventData)
 {
+    if (!mEngine)
+        return;
+    
     using namespace TextFinished;
     
     if (eventData[P_ELEMENT].getPtr() == (void*)mLineEdit)

+ 37 - 26
Engine/Engine/DebugHud.cpp

@@ -32,6 +32,8 @@
 #include "StringUtils.h"
 #include "Text.h"
 
+#include "DebugNew.h"
+
 DebugHud::DebugHud(Engine* engine) :
     mEngine(engine),
     mProfilerInterval(1.0f),
@@ -39,41 +41,50 @@ DebugHud::DebugHud(Engine* engine) :
 {
     LOGINFO("Debug HUD created");
     
-    if (!mEngine)
-        return;
-    
-    UIElement* uiRoot = mEngine->getUIRoot();
-    if (!uiRoot)
-        return;
-    
-    mStatsText = new Text();
-    mStatsText->setAlignment(HA_LEFT, VA_TOP);
-    mStatsText->setPriority(100);
-    mStatsText->setVisible(false);
-    uiRoot->addChild(mStatsText);
-    
-    mModeText = new Text();
-    mModeText->setAlignment(HA_LEFT, VA_BOTTOM);
-    mModeText->setPriority(100);
-    mModeText->setVisible(false);
-    uiRoot->addChild(mModeText);
-    
-    mProfilerText = new Text();
-    mProfilerText->setAlignment(HA_RIGHT, VA_TOP);
-    mProfilerText->setPriority(100);
-    mProfilerText->setVisible(false);
-    uiRoot->addChild(mProfilerText);
+    if (mEngine)
+    {
+        UIElement* uiRoot = mEngine->getUIRoot();
+        if (uiRoot)
+        {
+            mStatsText = new Text();
+            mStatsText->setAlignment(HA_LEFT, VA_TOP);
+            mStatsText->setPriority(100);
+            mStatsText->setVisible(false);
+            uiRoot->addChild(mStatsText);
+            
+            mModeText = new Text();
+            mModeText->setAlignment(HA_LEFT, VA_BOTTOM);
+            mModeText->setPriority(100);
+            mModeText->setVisible(false);
+            uiRoot->addChild(mModeText);
+            
+            mProfilerText = new Text();
+            mProfilerText->setAlignment(HA_RIGHT, VA_TOP);
+            mProfilerText->setPriority(100);
+            mProfilerText->setVisible(false);
+            uiRoot->addChild(mProfilerText);
+        }
+    }
 }
 
 DebugHud::~DebugHud()
 {
+    if (mEngine)
+    {
+        UIElement* uiRoot = mEngine->getUIRoot();
+        if (uiRoot)
+        {
+            uiRoot->removeChild(mStatsText);
+            uiRoot->removeChild(mModeText);
+            uiRoot->removeChild(mProfilerText);
+        }
+    }
+    
     LOGINFO("Debug HUD shut down");
 }
 
 void DebugHud::update(float timeStep)
 {
-    PROFILE(DebugHud_Update);
-    
     if (!mEngine)
         return;
     

+ 1 - 3
Engine/Engine/ParticleEmitter.cpp

@@ -353,10 +353,8 @@ void ParticleEmitter::update(float timeStep)
 
 void ParticleEmitter::loadParameters(XMLFile* file, ResourceCache* cache)
 {
-    if (!file)
+    if ((!file) || (!cache))
         return;
-    if (!cache)
-        EXCEPTION("Null resource cache for ParticleEmitter");
     
     mParameterSource = file;
     XMLElement rootElem = mParameterSource->getRootElement();

+ 20 - 14
Engine/Renderer/AnimatedModel.cpp

@@ -1160,28 +1160,34 @@ void AnimatedModel::updateMorphs()
     
     if (mMorphs.size())
     {
-        // Reset the morph data range from all morphable vertex buffers, then apply morphs
-        for (unsigned i = 0; i < mMorphVertexBuffers.size(); ++i)
+        try
         {
-            VertexBuffer* buffer = mMorphVertexBuffers[i];
-            if (buffer)
+            // Reset the morph data range from all morphable vertex buffers, then apply morphs
+            for (unsigned i = 0; i < mMorphVertexBuffers.size(); ++i)
             {
-                void* lockedMorphRange = buffer->lockMorphRange();
-                buffer->resetMorphRange(lockedMorphRange);
-                
-                for (unsigned j = 0; j < mMorphs.size(); ++j)
+                VertexBuffer* buffer = mMorphVertexBuffers[i];
+                if (buffer)
                 {
-                    if (mMorphs[j].mWeight > 0.0f)
+                    void* lockedMorphRange = buffer->lockMorphRange();
+                    buffer->resetMorphRange(lockedMorphRange);
+                    
+                    for (unsigned j = 0; j < mMorphs.size(); ++j)
                     {
-                        std::map<unsigned, VertexBufferMorph>::iterator k = mMorphs[j].mBuffers.find(i);
-                        if (k != mMorphs[j].mBuffers.end())
-                            applyMorph(buffer, lockedMorphRange, k->second, mMorphs[j].mWeight);
+                        if (mMorphs[j].mWeight > 0.0f)
+                        {
+                            std::map<unsigned, VertexBufferMorph>::iterator k = mMorphs[j].mBuffers.find(i);
+                            if (k != mMorphs[j].mBuffers.end())
+                                applyMorph(buffer, lockedMorphRange, k->second, mMorphs[j].mWeight);
+                        }
                     }
+                    
+                    buffer->unlock();
                 }
-                
-                buffer->unlock();
             }
         }
+        catch (...)
+        {
+        }
     }
     
     mMorphsDirty = false;

+ 8 - 8
Engine/Renderer/PixelShader.cpp

@@ -135,7 +135,7 @@ void PixelShader::clearLastParameterSources()
 void PixelShader::loadParameters(ResourceCache* cache)
 {
     if (!cache)
-        EXCEPTION("Null resource cache for PixelShader");
+        return;
     
     initializeParameters();
     
@@ -165,9 +165,9 @@ void PixelShader::loadParameters(ResourceCache* cache)
     {
         std::string name = paramElem.getString("name");
         if (sParameters.find(name) == sParameters.end())
-            EXCEPTION("Unknown pixel shader parameter " + name + " in " + getName());
-        
-        sRegisters[sParameters[name]] = paramElem.getInt("index");
+            LOGERROR("Unknown pixel shader parameter " + name + " in " + getName());
+        else
+            sRegisters[sParameters[name]] = paramElem.getInt("index");
         
         paramElem = paramElem.getNextElement("parameter");
     }
@@ -199,9 +199,9 @@ void PixelShader::loadParameters(ResourceCache* cache)
             {
                 std::string name = textureElem.getString("name");
                 if (sTextureUnits.find(name) == sTextureUnits.end())
-                    EXCEPTION("Unknown texture unit " + name + " in " + getName());
-                
-                mUseTextureUnit[sTextureUnits[name]] = true;
+                    LOGERROR("Unknown texture unit " + name + " in " + getName());
+                else
+                    mUseTextureUnit[sTextureUnits[name]] = true;
                 textureElem = textureElem.getNextElement("textureunit");
             }
             
@@ -211,7 +211,7 @@ void PixelShader::loadParameters(ResourceCache* cache)
         shaderElem = shaderElem.getNextElement("shader");
     }
     
-    EXCEPTION("Shader " + shaderName + " not found in shader description XML file");
+    LOGERROR("Shader " + shaderName + " not found in shader description XML file");
 }
 
 void PixelShader::initializeParameters()

+ 1 - 4
Engine/Renderer/TextureCube.cpp

@@ -107,14 +107,11 @@ void TextureCube::setSize(int size, unsigned format)
 
 void TextureCube::load(Deserializer& source, ResourceCache* cache)
 {
-    if (!mRenderer)
+    if ((!mRenderer) || (!cache))
         return;
     
     PROFILE(TextureCube_Load);
     
-    if (!cache)
-        EXCEPTION("Null resource cache for TextureCube");
-    
     // If over the texture budget, see if materials can be freed to allow textures to be freed
     checkTextureBudget(getTypeStatic(), cache);
     

+ 5 - 5
Engine/Renderer/VertexShader.cpp

@@ -134,7 +134,7 @@ void VertexShader::release()
 void VertexShader::loadParameters(ResourceCache* cache)
 {
     if (!cache)
-        EXCEPTION("Null resource cache for VertexShader");
+        return;
     
     initializeParameters();
     
@@ -164,9 +164,9 @@ void VertexShader::loadParameters(ResourceCache* cache)
     {
         std::string name = paramElem.getString("name");
         if (sParameters.find(name) == sParameters.end())
-            EXCEPTION("Unknown vertex shader parameter " + name + " in " + getName());
-        
-        sRegisters[sParameters[name]] = paramElem.getInt("index");
+            LOGERROR("Unknown vertex shader parameter " + name + " in " + getName());
+        else
+            sRegisters[sParameters[name]] = paramElem.getInt("index");
         
         paramElem = paramElem.getNextElement("parameter");
     }
@@ -197,7 +197,7 @@ void VertexShader::loadParameters(ResourceCache* cache)
         shaderElem = shaderElem.getNextElement("shader");
     }
     
-    EXCEPTION("Shader " + shaderName + " not found in shader description XML file");
+    LOGERROR("Shader " + shaderName + " not found in shader description XML file");
 }
 
 void VertexShader::initializeParameters()

+ 20 - 14
Engine/Scene/Scene.cpp

@@ -148,10 +148,10 @@ void Scene::save(Serializer& dest)
 
 void Scene::load(Deserializer& source)
 {
-    LOGINFO("Loading scene from " + source.getName());
-    
     if (!mCache)
-        EXCEPTION("Null resource cache");
+        return;
+    
+    LOGINFO("Loading scene from " + source.getName());
     
     stopAsyncLoading();
     removeAllEntities();
@@ -205,10 +205,10 @@ void Scene::saveXML(Serializer& dest)
 
 void Scene::loadXML(Deserializer& source)
 {
-    LOGINFO("Loading XML scene from " + source.getName());
-    
     if (!mCache)
-        EXCEPTION("Null resource cache");
+        return;
+    
+    LOGINFO("Loading XML scene from " + source.getName());
     
     XMLFile xml;
     xml.load(source, mCache);
@@ -404,11 +404,14 @@ void Scene::restorePredictedEntities()
 
 void Scene::loadAsync(File* file)
 {
-    if (!file)
-        EXCEPTION("Null file for async scene loading");
-    
     if (!mCache)
-        EXCEPTION("Null resource cache");
+        return;
+    
+    if (!file)
+    {
+        LOGERROR("Null file for async scene loading");
+        return;
+    }
     
     stopAsyncLoading();
     removeAllEntities();
@@ -429,11 +432,14 @@ void Scene::loadAsync(File* file)
 
 void Scene::loadAsyncXML(File* file)
 {
-    if (!file)
-        EXCEPTION("Null file for async XML scene loading");
-    
     if (!mCache)
-        EXCEPTION("Null resource cache");
+        return;
+    
+    if (!file)
+    {
+        LOGERROR("Null file for async XML scene loading");
+        return;
+    }
     
     file->seek(0);
     SharedPtr<XMLFile> xml(new XMLFile());

+ 9 - 0
Engine/Script/ScriptFile.cpp

@@ -54,9 +54,18 @@ ScriptFile::~ScriptFile()
 {
     if (mScriptModule)
     {
+        // Release script instances if any exist
+        std::vector<ScriptInstance*> instances = mScriptInstances;
+        for (std::vector<ScriptInstance*>::iterator i = instances.begin(); i != instances.end(); ++i)
+            (*i)->releaseObject();
+        
+        // Remove the module
         asIScriptEngine* engine = mScriptEngine->getAngelScriptEngine();
         engine->DiscardModule(getName().c_str());
         mScriptModule = 0;
+        
+        // Perform a full garbage collection cycle
+        mScriptEngine->garbageCollect(true);
     }
     if (lastScriptFile == this)
         lastScriptFile = 0;

+ 0 - 3
Engine/UI/CheckBox.cpp

@@ -43,9 +43,6 @@ CheckBox::~CheckBox()
 
 void CheckBox::setStyle(const XMLElement& element, ResourceCache* cache)
 {
-    if (!cache)
-        EXCEPTION("Null resource cache for UI element");
-    
     BorderImage::setStyle(element, cache);
     
     if (element.hasChildElement("uncheckedrect"))

+ 0 - 1
Engine/UI/UI.cpp

@@ -58,7 +58,6 @@ UI::UI(Renderer* renderer, ResourceCache* cache) :
 {
     if (!mRenderer)
         EXCEPTION("Null renderer for UI");
-    
     if (!mCache)
         EXCEPTION("Null resource cache for UI");
     

+ 1 - 1
Engine/UI/UIElement.cpp

@@ -74,7 +74,7 @@ UIElement::~UIElement()
 void UIElement::setStyle(const XMLElement& element, ResourceCache* cache)
 {
     if (!cache)
-        EXCEPTION("Null resource cache for UI element");
+        return;
     
     if (element.hasAttribute("name"))
         mName = element.getString("name");

+ 0 - 2
Examples/Urho3D/Application.cpp

@@ -51,8 +51,6 @@ Application::~Application()
     {
         mScriptFile.reset();
         mCache->releaseResources(ShortStringHash("ScriptFile"), true);
-        // Perform a full garbage collection before shutdown
-        mEngine->getScriptEngine()->garbageCollect(true);
     }
 }