Răsfoiți Sursa

Merge pull request #390 from Azaezel/alpha40_assetErrorcodes

variation on #387 that also introduces errorcodes
Brian Roberts 4 ani în urmă
părinte
comite
5534384c54

+ 34 - 11
Engine/source/T3D/assets/ShapeAsset.cpp

@@ -113,12 +113,22 @@ ConsoleSetType(TypeShapeAssetId)
 
 //-----------------------------------------------------------------------------
 
+const String ShapeAsset::mErrCodeStrings[] =
+{
+   "TooManyVerts",
+   "TooManyBones",
+   "MissingAnimatons",
+   "UnKnown"
+};
+//-----------------------------------------------------------------------------
+
 ShapeAsset::ShapeAsset()
 {
    mFileName = StringTable->EmptyString();
    mConstructorFileName = StringTable->EmptyString();
    mFilePath = StringTable->EmptyString();
    mConstructorFilePath = StringTable->EmptyString();
+   mLoadedState = AssetErrCode::NotLoaded;
 }
 
 //-----------------------------------------------------------------------------
@@ -264,7 +274,8 @@ bool ShapeAsset::loadShape()
 
    if (!mShape)
    {
-      Con::errorf("StaticMesh::updateShape : failed to load shape file!");
+      Con::errorf("ShapeAsset::loadShape : failed to load shape file!");
+      mLoadedState = BadFileReference;
       return false; //if it failed to load, bail out
    }
 
@@ -280,8 +291,10 @@ bool ShapeAsset::loadShape()
 
       if (!mShape->addSequence(srcPath, srcName, srcName,
          mAnimationAssets[i]->getStartFrame(), mAnimationAssets[i]->getEndFrame(), mAnimationAssets[i]->getPadRotation(), mAnimationAssets[i]->getPadTransforms()))
+      {
+         mLoadedState = MissingAnimatons;
          return false;
-
+      }
       if (mAnimationAssets[i]->isBlend())
          hasBlends = true;
    }
@@ -300,14 +313,20 @@ bool ShapeAsset::loadShape()
             if (blendAnimAsset.isNull())
             {
                Con::errorf("ShapeAsset::initializeAsset - Unable to acquire reference animation asset %s for asset %s to blend!", mAnimationAssets[i]->getBlendAnimationName(), mAnimationAssets[i]->getAssetName());
-               return false;
+               {
+                  mLoadedState = MissingAnimatons;
+                  return false;
+               }
             }
 
             String refAnimName = blendAnimAsset->getAnimationName();
             if (!mShape->setSequenceBlend(mAnimationAssets[i]->getAnimationName(), true, blendAnimAsset->getAnimationName(), mAnimationAssets[i]->getBlendFrame()))
             {
                Con::errorf("ShapeAnimationAsset::initializeAsset - Unable to set animation clip %s for asset %s to blend!", mAnimationAssets[i]->getAnimationName(), mAnimationAssets[i]->getAssetName());
-               return false;
+               {
+                  mLoadedState = MissingAnimatons;
+                  return false;
+               }
             }
          }
       }
@@ -315,6 +334,7 @@ bool ShapeAsset::loadShape()
 
    mChangeSignal.trigger();
 
+   mLoadedState = Ok;
    return true;
 }
 
@@ -410,21 +430,21 @@ StringTableEntry ShapeAsset::getAssetIdByFilename(StringTableEntry fileName)
    return shapeAssetId;
 }
 
-bool ShapeAsset::getAssetById(StringTableEntry assetId, AssetPtr<ShapeAsset>* shapeAsset)
+U32 ShapeAsset::getAssetById(StringTableEntry assetId, AssetPtr<ShapeAsset>* shapeAsset)
 {
    (*shapeAsset) = assetId;
 
-   if (!shapeAsset->isNull())
-      return true;
+   if ((*shapeAsset))
+      return (*shapeAsset)->mLoadedState;
 
    //Didn't work, so have us fall back to a placeholder asset
    StringTableEntry noShapeId = StringTable->insert("Core_Rendering:noshape");
    shapeAsset->setAssetId(noShapeId);
+   (*shapeAsset)->mLoadedState = AssetErrCode::UsingFallback;
+   if (shapeAsset->notNull())
+      return AssetErrCode::UsingFallback;
 
-   if (!shapeAsset->isNull())
-      return true;
-
-   return false;
+   return AssetErrCode::Failed;
 }
 //------------------------------------------------------------------------------
 
@@ -503,6 +523,7 @@ DefineEngineMethod(ShapeAsset, getAnimation, ShapeAnimationAsset*, (S32 index),
 // GuiInspectorTypeAssetId
 //-----------------------------------------------------------------------------
 
+#ifdef TORQUE_TOOLS
 IMPLEMENT_CONOBJECT(GuiInspectorTypeShapeAssetPtr);
 
 ConsoleDocClass(GuiInspectorTypeShapeAssetPtr,
@@ -596,6 +617,8 @@ void GuiInspectorTypeShapeAssetId::consoleInit()
    ConsoleBaseType::getType(TypeShapeAssetId)->setInspectorFieldType("GuiInspectorTypeShapeAssetId");
 }
 
+#endif
+
 DefineEngineMethod(ShapeAsset, getShapeFile, const char*, (), ,
    "Creates a new script asset using the targetFilePath.\n"
    "@return The bool result of calling exec")

+ 88 - 1
Engine/source/T3D/assets/ShapeAsset.h

@@ -54,7 +54,9 @@
 #include "ShapeAnimationAsset.h"
 #endif
 
+#ifdef TORQUE_TOOLS
 #include "gui/editor/guiInspectorTypes.h"
+#endif
 
 //-----------------------------------------------------------------------------
 class ShapeAsset : public AssetBase
@@ -81,6 +83,22 @@ protected:
    ShapeAssetChanged mChangeSignal;
 
 public:
+   enum ShapeAssetErrCode
+   {
+      TooManyVerts = AssetErrCode::Extended,
+      TooManyBones,
+      MissingAnimatons,
+      Extended
+   };
+
+   static const String mErrCodeStrings[ShapeAssetErrCode::Extended - Parent::Extended + 1];
+   static String getAssetErrstrn(U32 errCode)
+   {
+      if (errCode < Parent::Extended) return Parent::getAssetErrstrn(errCode);
+      if (errCode > ShapeAssetErrCode::Extended) return "undefined error";
+      return mErrCodeStrings[errCode];
+   };
+
    ShapeAsset();
    virtual ~ShapeAsset();
 
@@ -96,6 +114,7 @@ public:
    DECLARE_CONOBJECT(ShapeAsset);
 
    bool loadShape();
+   U32 mLoadedState;
 
    TSShape* getShape() { return mShape; }
 
@@ -138,8 +157,9 @@ public:
    inline StringTableEntry getShapeConstructorFilePath(void) const { return mConstructorFilePath; };
 
    static bool getAssetByFilename(StringTableEntry fileName, AssetPtr<ShapeAsset>* shapeAsset);
+
    static StringTableEntry getAssetIdByFilename(StringTableEntry fileName);
-   static bool getAssetById(StringTableEntry assetId, AssetPtr<ShapeAsset>* shapeAsset);
+   static U32 getAssetById(StringTableEntry assetId, AssetPtr<ShapeAsset>* shapeAsset);
 
    static StringTableEntry getNoShapeAssetId() { return StringTable->insert("Core_Rendering:noshape"); }
 
@@ -154,6 +174,7 @@ protected:
 
 };
 
+#ifdef TORQUE_TOOLS
 DefineConsoleType(TypeShapeAssetPtr, S32)
 DefineConsoleType(TypeShapeAssetId, String)
 
@@ -182,6 +203,72 @@ public:
    DECLARE_CONOBJECT(GuiInspectorTypeShapeAssetId);
    static void consoleInit();
 };
+#endif
+
+#define assetText(x,suff) std::string(std::string(#x) + std::string(#suff)).c_str()
+
+#define initShapeAsset(name) m##name##Filename = StringTable->EmptyString(); m##name##AssetId = StringTable->EmptyString(); m##name##Asset = NULL;
+#define bindShapeAsset(name) if (m##name##AssetId != StringTable->EmptyString()) m##name##Asset = m##name##AssetId;
+
+#define scriptBindShapeAsset(name, consoleClass, docs) addProtectedField(assetText(name, File), TypeShapeFilename, Offset(m##name##Filename, consoleClass), consoleClass::_set##name##Filename,  & defaultProtectedGetFn, assetText(name, docs)); \
+                                      addProtectedField(assetText(name, Asset), TypeShapeAssetId, Offset(m##name##AssetId, consoleClass), consoleClass::_set##name##Asset, & defaultProtectedGetFn, assetText(name, asset reference.));
+
+#define DECLARE_SHAPEASSET(className,name)      protected: \
+                                      StringTableEntry m##name##Filename;\
+                                      StringTableEntry m##name##AssetId;\
+                                      AssetPtr<ShapeAsset>  m##name##Asset;\
+                                      public: \
+                                      const StringTableEntry& get##name() const { return m##name##Filename; }\
+                                      void set##name(FileName _in) { m##name##Filename = _in; }\
+                                      const AssetPtr<ShapeAsset> & get##name##Asset() const { return m##name##Asset; }\
+                                      void set##name##Asset(AssetPtr<ShapeAsset>_in) { m##name##Asset = _in; }\
+static bool _set##name##Filename(void* obj, const char* index, const char* data)\
+{\
+   className* shape = static_cast<className*>(obj);\
+   \
+   StringTableEntry assetId = ShapeAsset::getAssetIdByFilename(StringTable->insert(data));\
+   if (assetId != StringTable->EmptyString())\
+   {\
+      if (shape->_set##name##Asset(obj, index, assetId))\
+      {\
+         if (assetId == StringTable->insert("Core_Rendering:noShape"))\
+         {\
+            shape->m##name##Filename = data;\
+            shape->m##name##AssetId = StringTable->EmptyString();\
+            \
+            return true;\
+         }\
+         else\
+         {\
+            shape->m##name##AssetId = assetId;\
+            shape->m##name##Filename = StringTable->EmptyString();\
+            \
+            return false;\
+         }\
+      }\
+   }\
+   else\
+   {\
+      shape->m##name##Asset = StringTable->EmptyString();\
+   }\
+   \
+   return true;\
+}\
+\
+static bool _set##name##Asset(void* obj, const char* index, const char* data)\
+{\
+   className* shape = static_cast<className*>(obj);\
+   shape->m##name##AssetId = StringTable->insert(data);\
+   if (ShapeAsset::getAssetById(shape->m##name##AssetId, &shape->m##name##Asset))\
+   {\
+      if (shape->m##name##Asset.getAssetId() != StringTable->insert("Core_Rendering:noShape"))\
+         shape->m##name##Filename = StringTable->EmptyString();\
+      \
+      shape->setMaskBits(-1);\
+      return true;\
+   }\
+   return false;\
+}
 
 #endif
 

+ 21 - 16
Engine/source/T3D/shapeBase.cpp

@@ -361,24 +361,19 @@ bool ShapeBaseData::preload(bool server, String &errorStr)
    }
 
    //Legacy catch
-   if (shapeAssetId == StringTable->EmptyString() && shapeName != StringTable->EmptyString())
+   if (shapeName != StringTable->EmptyString())
    {
-      StringTableEntry assetId = ShapeAsset::getAssetIdByFilename(shapeName);
-      if (assetId != StringTable->EmptyString())
-      {
-         shapeAssetId = assetId;
-      }
+      shapeAssetId = ShapeAsset::getAssetIdByFilename(shapeName);
    }
-
-   if (ShapeAsset::getAssetById(shapeAssetId, &shapeAsset))
+   U32 assetState = ShapeAsset::getAssetById(shapeAssetId, &shapeAsset);
+   if (ShapeAsset::Failed != assetState)
    {
-      //Special exception case. If we've defaulted to the 'no shape' mesh, don't save it out, we'll retain the original ids/paths so it doesn't break
-      //the TSStatic
-      if (shapeAsset.getAssetId() != StringTable->insert("Core_Rendering:noshape"))
+      //only clear the legacy direct file reference if everything checks out fully
+      if (assetState == ShapeAsset::Ok)
       {
          shapeName = StringTable->EmptyString();
       }
-   
+      else Con::warnf("Warning: ShapeBaseData::preload-%s", ShapeAsset::getAssetErrstrn(assetState).c_str());
       S32 i;
 
       // Resolve shapename
@@ -803,10 +798,14 @@ void ShapeBaseData::packData(BitStream* stream)
    stream->write(shadowSphereAdjust);
 
 
-   //if (stream->writeFlag(shapeAsset.notNull()))
+   if (stream->writeFlag(shapeAsset.notNull()))
+   {
       stream->writeString(shapeAsset.getAssetId());
-   //else
+   }
+   else
+   {
       stream->writeString(shapeName);
+   }
 
    stream->writeString(cloakTexName);
    if(stream->writeFlag(mass != gShapeBaseDataProto.mass))
@@ -885,10 +884,16 @@ void ShapeBaseData::unpackData(BitStream* stream)
    stream->read(&shadowSphereAdjust);
 
 
-   //if (stream->readFlag())
+   if (stream->readFlag())
+   {
       shapeAssetId = stream->readSTString();
-   //else
+      ShapeAsset::getAssetById(shapeAssetId, &shapeAsset);
+      shapeName = shapeAsset->getShapeFilename();
+   }
+   else
+   {
       shapeName = stream->readSTString();
+   }
 
    cloakTexName = stream->readSTString();
    if(stream->readFlag())

+ 12 - 0
Engine/source/assets/assetBase.cpp

@@ -52,6 +52,18 @@ StringTableEntry assetInternalField = StringTable->insert("AssetInternal");
 StringTableEntry assetPrivateField = StringTable->insert("AssetPrivate");
 
 //-----------------------------------------------------------------------------
+const String AssetBase::mErrCodeStrings[] =
+{
+   "Failed",
+   "Ok",
+   "NotLoaded",
+   "BadFileReference",
+   "InvalidFormat",
+   "DependencyNotFound",
+   "FileTooLarge",
+   "UsingFallback",
+   "UnKnown"
+};
 
 AssetBase::AssetBase() :
 mpOwningAssetManager(NULL),

+ 20 - 1
Engine/source/assets/assetBase.h

@@ -55,7 +55,6 @@ extern StringTableEntry assetAutoUnloadField;
 //#define ASSET_BASE_AUTOUNLOAD_FIELD        "AssetAutoUnload"
 
 //-----------------------------------------------------------------------------
-
 class AssetBase : public SimObject
 {
    friend class AssetManager;
@@ -69,6 +68,26 @@ protected:
    U32                     mAcquireReferenceCount;
 
 public:
+   enum AssetErrCode
+   {
+      Failed,
+      Ok,
+      NotLoaded,
+      BadFileReference,
+      InvalidFormat,
+      DependencyNotFound,
+      FileTooLarge,
+      UsingFallback,
+      Extended
+   };
+
+   static const String mErrCodeStrings[AssetErrCode::Extended + 1];
+   static String getAssetErrstrn(U32 errCode)
+   {
+      if (errCode > AssetErrCode::Extended) return "undefined error";
+      return mErrCodeStrings[errCode];
+   };
+
    AssetBase();
    virtual ~AssetBase();
 

+ 4 - 1
Engine/source/assets/tamlAssetDeclaredUpdateVisitor.h

@@ -49,7 +49,10 @@ private:
     StringTableEntry mAssetNameTo;
 
 public:
-    TamlAssetDeclaredUpdateVisitor() {}
+    TamlAssetDeclaredUpdateVisitor():
+       mAssetIdFrom(StringTable->EmptyString()), mAssetIdTo(StringTable->EmptyString()),
+       mAssetNameFrom(StringTable->EmptyString()), mAssetNameTo(StringTable->EmptyString()) {}
+
     virtual ~TamlAssetDeclaredUpdateVisitor() {}
 
     void setAssetIdFrom( const char* pAssetIdFrom )

+ 1 - 1
Engine/source/assets/tamlAssetReferencedUpdateVisitor.h

@@ -55,7 +55,7 @@ private:
     StringTableEntry mAssetIdTo;
 
 public:
-    TamlAssetReferencedUpdateVisitor() {}
+    TamlAssetReferencedUpdateVisitor() : mAssetIdFrom(StringTable->EmptyString()), mAssetIdTo(StringTable->EmptyString()) {}
     virtual ~TamlAssetReferencedUpdateVisitor() {}
 
     void setAssetIdFrom( const char* pAssetIdFrom )