Sfoglia il codice sorgente

Tweaks the MaterialAsset loading logic to continue to see if the matDefinition already points to an existing object(to avoid needlessly re-executing files over and over), but also validate other cases, and ensures that if we DO have an existing definition, we still process and load it in the asset itself properly.

Areloch 3 anni fa
parent
commit
506621352c

+ 17 - 2
Engine/source/T3D/assets/MaterialAsset.cpp

@@ -167,6 +167,12 @@ void MaterialAsset::initializeAsset()
 
 
    mScriptPath = getOwned() ? expandAssetFilePath(mScriptFile) : mScriptPath;
    mScriptPath = getOwned() ? expandAssetFilePath(mScriptFile) : mScriptPath;
 
 
+   if (mMatDefinitionName == StringTable->EmptyString())
+   {
+      mLoadedState = Failed;
+      return;
+   }
+
    if (Torque::FS::IsScriptFile(mScriptPath))
    if (Torque::FS::IsScriptFile(mScriptPath))
    {
    {
       if (!Sim::findObject(mMatDefinitionName))
       if (!Sim::findObject(mMatDefinitionName))
@@ -180,6 +186,10 @@ void MaterialAsset::initializeAsset()
               mLoadedState = Failed;
               mLoadedState = Failed;
           }
           }
       }
       }
+      else
+      {
+         mLoadedState = DefinitionAlreadyExists;
+      }
    }
    }
 
 
    loadMaterial();
    loadMaterial();
@@ -189,6 +199,12 @@ void MaterialAsset::onAssetRefresh()
 {
 {
    mScriptPath = getOwned() ? expandAssetFilePath(mScriptFile) : mScriptPath;
    mScriptPath = getOwned() ? expandAssetFilePath(mScriptFile) : mScriptPath;
 
 
+   if (mMatDefinitionName == StringTable->EmptyString())
+   {
+      mLoadedState = Failed;
+      return;
+   }
+
    if (Torque::FS::IsScriptFile(mScriptPath))
    if (Torque::FS::IsScriptFile(mScriptPath))
    {
    {
       //Since we're refreshing, we can assume that the file we're executing WILL have an existing definition.
       //Since we're refreshing, we can assume that the file we're executing WILL have an existing definition.
@@ -204,7 +220,6 @@ void MaterialAsset::onAssetRefresh()
 
 
       //And now that we've executed, switch back to the prior behavior
       //And now that we've executed, switch back to the prior behavior
       Con::setVariable("$Con::redefineBehavior", redefineBehaviorPrev.c_str());
       Con::setVariable("$Con::redefineBehavior", redefineBehaviorPrev.c_str());
-      
    }
    }
 
 
    loadMaterial();
    loadMaterial();
@@ -232,7 +247,7 @@ void MaterialAsset::loadMaterial()
    if (mMaterialDefinition)
    if (mMaterialDefinition)
       SAFE_DELETE(mMaterialDefinition);
       SAFE_DELETE(mMaterialDefinition);
 
 
-   if (mLoadedState == ScriptLoaded && mMatDefinitionName != StringTable->EmptyString())
+   if ((mLoadedState == ScriptLoaded || mLoadedState == DefinitionAlreadyExists) && mMatDefinitionName != StringTable->EmptyString())
    {
    {
       Material* matDef;
       Material* matDef;
       if (!Sim::findObject(mMatDefinitionName, matDef))
       if (!Sim::findObject(mMatDefinitionName, matDef))

+ 1 - 0
Engine/source/T3D/assets/MaterialAsset.h

@@ -73,6 +73,7 @@ public:
    enum MaterialAssetErrCode
    enum MaterialAssetErrCode
    {
    {
       ScriptLoaded = AssetErrCode::Extended,
       ScriptLoaded = AssetErrCode::Extended,
+      DefinitionAlreadyExists,
       Extended
       Extended
    };
    };