marauder2k7 9 месяцев назад
Родитель
Сommit
f6dc694bd4

+ 33 - 15
Engine/source/T3D/assets/ImageAsset.cpp

@@ -111,7 +111,7 @@ ConsoleSetType(TypeImageAssetId)
 ImplementEnumType(ImageAssetType,
    "Type of mesh data available in a shape.\n"
    "@ingroup gameObjects")
-{ ImageAsset::Albedo,      "Albedo",      "" },
+{ ImageAsset::Albedo, "Albedo", "" },
 { ImageAsset::Normal,      "Normal",      "" },
 { ImageAsset::ORMConfig,   "ORMConfig",   "" },
 { ImageAsset::GUI,         "GUI",         "" },
@@ -121,8 +121,7 @@ ImplementEnumType(ImageAssetType,
 { ImageAsset::Glow,        "Glow",        "" },
 { ImageAsset::Particle,    "Particle",    "" },
 { ImageAsset::Decal,       "Decal",       "" },
-{ ImageAsset::Cubemap,     "Cubemap",     "" },
-{ ImageAsset::Target,      "Target",     "" },
+{ ImageAsset::Cubemap,     "Cubemap",       "" },
 
 EndImplementEnumType;
 
@@ -278,7 +277,7 @@ U32 ImageAsset::load()
       // this is a target.
       if (mImageFileName[0] == '$' || mImageFileName[0] == '#')
       {
-         NamedTexTarget* namedTarget = NamedTexTarget::find(mImageFileName + 1);
+         NamedTexTargetRef namedTarget = NamedTexTarget::find(mImageFileName + 1);
          if (namedTarget) {
             mLoadedState = Ok;
             mIsValidImage = true;
@@ -289,7 +288,6 @@ U32 ImageAsset::load()
             Con::errorf("ImageAsset::initializeAsset: Attempted find named target %s failed.", mImageFileName);
          }
       }
-
       if (!Torque::FS::IsFile(mImagePath))
       {
          Con::errorf("ImageAsset::initializeAsset: Attempted to load file %s but it was not valid!", mImageFileName);
@@ -364,6 +362,7 @@ void ImageAsset::setImageFileName(const char* pScriptFile)
 
 GFXTexHandle ImageAsset::getTexture(GFXTextureProfile* requestedProfile)
 {
+   load();
    if (mResourceMap.contains(requestedProfile))
    {
       mLoadedState = Ok;
@@ -371,21 +370,41 @@ GFXTexHandle ImageAsset::getTexture(GFXTextureProfile* requestedProfile)
    }
    else
    {
-      //If we don't have an existing map case to the requested format, we'll just create it and insert it in
-      GFXTexHandle newTex = TEXMGR->createTexture(mImagePath, requestedProfile);
-      if (newTex)
+      // this is a target.
+      if (mImageFileName[0] == '$' || mImageFileName[0] == '#')
       {
-         mResourceMap.insert(requestedProfile, newTex);
          mLoadedState = Ok;
-         return newTex;
+         NamedTexTargetRef namedTarget = NamedTexTarget::find(mImageFileName + 1);
+         if (namedTarget.isValid() && namedTarget->getTexture())
+         {
+            if (mNamedTarget == NULL) {
+               mNamedTarget = namedTarget;
+               mResourceMap.insert(requestedProfile, mNamedTarget->getTexture());
+               mIsValidImage = true;
+               mChangeSignal.trigger();
+            }
+         }
+         if (mNamedTarget == NULL)
+            return nullptr;
+         else
+            return mNamedTarget->getTexture();
+         
       }
       else
-         mLoadedState = BadFileReference;
+      {
+         //If we don't have an existing map case to the requested format, we'll just create it and insert it in
+         GFXTexHandle newTex = TEXMGR->createTexture(mImagePath, requestedProfile);
+         if (newTex)
+         {
+            mResourceMap.insert(requestedProfile, newTex);
+            mLoadedState = Ok;
+            return newTex;
+         }
+         else
+            mLoadedState = BadFileReference;
+      }
    }
 
-   //if (mTexture.isValid())
-   //   return mTexture;
-
    return nullptr;
 }
 
@@ -428,7 +447,6 @@ const char* ImageAsset::getImageTypeNameFromType(ImageAsset::ImageTypes type)
       "Particle",
       "Decal",
       "Cubemap"
-      "Target"
    };
 
    if (type < 0 || type >= ImageTypeCount)

+ 16 - 19
Engine/source/T3D/assets/ImageAsset.h

@@ -39,11 +39,7 @@
 #endif
 #ifndef _ASSET_PTR_H_
 #include "assets/assetPtr.h"
-#endif
-
-#ifndef _MATTEXTURETARGET_H_
-#include "materials/matTextureTarget.h"
-#endif
+#endif 
 
 #include "gfx/bitmap/gBitmap.h"
 #include "gfx/gfxTextureHandle.h"
@@ -54,6 +50,11 @@
 #include "assetMacroHelpers.h"
 
 #include "gfx/gfxDevice.h"
+
+#ifndef _MATTEXTURETARGET_H_
+#include "materials/matTextureTarget.h"
+#endif
+
 //-----------------------------------------------------------------------------
 class ImageAsset : public AssetBase
 {
@@ -75,8 +76,7 @@ public:
       Particle = 8,
       Decal = 9,
       Cubemap = 10,
-      Target = 11,
-      ImageTypeCount = 12
+      ImageTypeCount = 11
    };
 
    static StringTableEntry smNoImageAssetFallback;
@@ -100,6 +100,7 @@ public:
 protected:
    StringTableEntry mImageFileName;
    StringTableEntry mImagePath;
+   NamedTexTargetRef mNamedTarget;
 
    bool mIsValidImage;
    bool mUseMips;
@@ -256,12 +257,10 @@ public: \
          }\
          \
          if (get##name()[0] == '$' || get##name()[0] == '#') {\
-            NamedTexTarget* namedTarget = NamedTexTarget::find(get##name() + 1);\
-            if (namedTarget)\
+            NamedTexTargetRef namedTarget = NamedTexTarget::find(get##name() + 1);\
+            if (namedTarget.isValid())\
             {\
                m##name = namedTarget->getTexture(0);\
-               m##name##Name = get##name();\
-               m##name##AssetId = StringTable->EmptyString();\
             }\
          }\
          else\
@@ -306,6 +305,8 @@ public: \
    }\
    GFXTexHandle get##name##Resource() \
    {\
+      if (m##name##Asset && (m##name##Asset->getImageFileName() != StringTable->EmptyString()))\
+         return m##name##Asset->getTexture(m##name##Profile);\
       return m##name;\
    }\
    bool name##Valid() {return (get##name() != StringTable->EmptyString() && m##name##Asset->getStatus() == AssetBase::Ok); }
@@ -341,7 +342,7 @@ if (m##name##AssetId != StringTable->EmptyString())\
 #pragma region Arrayed Asset Macros
 
 //Arrayed Assets
-#define DECLARE_IMAGEASSET_ARRAY(className, name, max) public: \
+#define DECLARE_IMAGEASSET_ARRAY(className, name, max, changeFunc) public: \
    static const U32 sm##name##Count = max;\
    GFXTexHandle m##name[max];\
    StringTableEntry m##name##Name[max]; \
@@ -412,13 +413,7 @@ public: \
       if (get##name(index) != StringTable->EmptyString() && m##name##Name[index] != StringTable->insert("texhandle"))\
       {\
          if (get##name(index)[0] == '$' || get##name(index)[0] == '#') {\
-            NamedTexTarget* namedTarget = NamedTexTarget::find(get##name(index) + 1);\
-            if (namedTarget)\
-            {\
-               m##name[index] = namedTarget->getTexture(0);\
-               m##name##Name[index] = get##name(index);\
-               m##name##AssetId[index] = StringTable->EmptyString();\
-            }\
+             m##name##Asset[index]->getChangedSignal().notify(this, &className::changeFunc);\
          }\
          else\
          m##name[index].set(get##name(index), m##name##Profile[index], avar("%s() - mTextureObject (line %d)", __FUNCTION__, __LINE__));\
@@ -469,6 +464,8 @@ public: \
    {\
       if(index >= sm##name##Count || index < 0)\
          return nullptr;\
+      if (m##name##Asset[index] && (m##name##Asset[index]->getImageFileName() != StringTable->EmptyString()))\
+         return m##name##Asset[index]->getTexture(m##name##Profile[index]);\
       return m##name[index];\
    }\
    bool name##Valid(const U32& id) {return (get##name(id) != StringTable->EmptyString() && m##name##Asset[id]->getStatus() == AssetBase::Ok); }

+ 2 - 1
Engine/source/T3D/fx/splash.h

@@ -122,8 +122,9 @@ public:
    F32               times[ NUM_TIME_KEYS ];
    LinearColorF            colors[ NUM_TIME_KEYS ];
 
-   DECLARE_IMAGEASSET_ARRAY(SplashData, Texture, NUM_TEX);
+   DECLARE_IMAGEASSET_ARRAY(SplashData, Texture, NUM_TEX, onTextureChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(SplashData, Texture)
+   void onTextureChanged() {}
 
    ExplosionData*    explosion;
    S32               explosionId;

+ 2 - 2
Engine/source/environment/basicClouds.h

@@ -94,9 +94,9 @@ protected:
    static U32 smVertCount;
    static U32 smTriangleCount;
 
-   DECLARE_IMAGEASSET_ARRAY(BasicClouds, Texture, TEX_COUNT);
+   DECLARE_IMAGEASSET_ARRAY(BasicClouds, Texture, TEX_COUNT, onTextureChanged);
    DECLARE_IMAGEASSET_ARRAY_NET_SETGET(BasicClouds, Texture, -1);
-
+   void onTextureChanged() {}
    GFXStateBlockRef mStateblock;
 
    GFXShaderRef mShader;

+ 2 - 1
Engine/source/gfx/sim/cubemapData.h

@@ -76,9 +76,10 @@ protected:
    DECLARE_IMAGEASSET(CubemapData, CubeMap, onCubemapChanged, GFXStaticTextureSRGBProfile);
    DECLARE_ASSET_SETGET(CubemapData, CubeMap);
 
-   DECLARE_IMAGEASSET_ARRAY(CubemapData, CubeMapFace, 6);
+   DECLARE_IMAGEASSET_ARRAY(CubemapData, CubeMapFace, 6, onCubeMapFaceChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(CubemapData, CubeMapFace);
 
+   void onCubeMapFaceChanged() {}
    GFXTexHandle mDepthBuff;
    GFXTextureTargetRef mRenderTarget;
 

+ 2 - 2
Engine/source/gui/controls/guiPopUpCtrl.h

@@ -126,9 +126,9 @@ protected:
       NumBitmapModes = 2
    };
 
-   DECLARE_IMAGEASSET_ARRAY(GuiPopUpMenuCtrl, Bitmap, NumBitmapModes);
+   DECLARE_IMAGEASSET_ARRAY(GuiPopUpMenuCtrl, Bitmap, NumBitmapModes, onBitmapChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(GuiPopUpMenuCtrl, Bitmap);
-
+   void onBitmapChanged() {}
    Point2I mBitmapBounds; //  Added
 	S32 mIdMax;
 

+ 2 - 2
Engine/source/gui/controls/guiPopUpCtrlEx.h

@@ -131,9 +131,9 @@ class GuiPopUpMenuCtrlEx : public GuiTextCtrl
       NumBitmapModes = 2
    };
 
-   DECLARE_IMAGEASSET_ARRAY(GuiPopUpMenuCtrlEx, Bitmap, NumBitmapModes);
+   DECLARE_IMAGEASSET_ARRAY(GuiPopUpMenuCtrlEx, Bitmap, NumBitmapModes, onBitmapChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(GuiPopUpMenuCtrlEx, Bitmap);
-
+   void onBitmapChanged() {}
    Point2I mBitmapBounds; //  Added
 
 	S32 mIdMax;

+ 16 - 12
Engine/source/materials/materialDefinition.h

@@ -208,49 +208,53 @@ public:
    //-----------------------------------------------------------------------
    // Data
    //-----------------------------------------------------------------------
-   DECLARE_IMAGEASSET_ARRAY(Material, DiffuseMap, MAX_STAGES);
+   void onImageAssetChanged() {
+      reload();
+   }
+
+   DECLARE_IMAGEASSET_ARRAY(Material, DiffuseMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, DiffuseMap);
 
    bool     mDiffuseMapSRGB[MAX_STAGES];   // SRGB diffuse
-   DECLARE_IMAGEASSET_ARRAY(Material, OverlayMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, OverlayMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, OverlayMap);
 
-   DECLARE_IMAGEASSET_ARRAY(Material, LightMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, LightMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, LightMap);
 
-   DECLARE_IMAGEASSET_ARRAY(Material, ToneMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, ToneMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, ToneMap);
 
-   DECLARE_IMAGEASSET_ARRAY(Material, DetailMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, DetailMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, DetailMap);
 
-   DECLARE_IMAGEASSET_ARRAY(Material, NormalMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, NormalMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, NormalMap);
 
-   DECLARE_IMAGEASSET_ARRAY(Material, ORMConfigMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, ORMConfigMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, ORMConfigMap);
 
    bool     mIsSRGb[MAX_STAGES];
-   DECLARE_IMAGEASSET_ARRAY(Material, AOMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, AOMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, AOMap);
    F32      mAOChan[MAX_STAGES];
 
-   DECLARE_IMAGEASSET_ARRAY(Material, RoughMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, RoughMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, RoughMap);
    bool     mInvertRoughness[MAX_STAGES];
    F32      mRoughnessChan[MAX_STAGES];
 
-   DECLARE_IMAGEASSET_ARRAY(Material, MetalMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, MetalMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, MetalMap);
 
    F32      mMetalChan[MAX_STAGES];
-   DECLARE_IMAGEASSET_ARRAY(Material, GlowMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, GlowMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, GlowMap);
 
    F32      mGlowMul[MAX_STAGES];
    /// A second normal map which repeats at the detail map
    /// scale and blended with the base normal map.
-   DECLARE_IMAGEASSET_ARRAY(Material, DetailNormalMap, MAX_STAGES);
+   DECLARE_IMAGEASSET_ARRAY(Material, DetailNormalMap, MAX_STAGES, onImageAssetChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(Material, DetailNormalMap);
 
    /// The strength scalar for the detail normal map.

+ 11 - 20
Engine/source/materials/processedMaterial.cpp

@@ -398,29 +398,20 @@ void ProcessedMaterial::_setStageData()
          //mStages[i].setTex(MFT_DiffuseMap, _createTexture(mMaterial->getDiffuseMap(i), &GFXStaticTextureSRGBProfile));
          if (!mStages[i].getTex(MFT_DiffuseMap))
          {
-            // Load a debug texture to make it clear to the user 
-            // that the texture for this stage was missing.
-            mStages[i].setTex(MFT_DiffuseMap, _createTexture(GFXTextureManager::getMissingTexturePath().c_str(), &GFXStaticTextureSRGBProfile));
-         }
-      }
-      else if (mMaterial->mDiffuseMapName[i] != StringTable->EmptyString())
-      {
-         mStages[i].setTex(MFT_DiffuseMap, _createTexture(mMaterial->mDiffuseMapName[i], &GFXStaticTextureSRGBProfile));
-         if (!mStages[i].getTex(MFT_DiffuseMap))
-         {
-            //If we start with a #, we're probably actually attempting to hit a named target and it may not get a hit on the first pass. So we'll
-            //pass on the error rather than spamming the console
-            if (String(mMaterial->mDiffuseMapName[i]).startsWith("#") || String(mMaterial->mDiffuseMapName[i]).startsWith("$"))
+            if (String(mMaterial->mDiffuseMapAsset[i]->getImageFileName()).startsWith("#") || String(mMaterial->mDiffuseMapAsset[i]->getImageFileName()).startsWith("$"))
             {
-               NamedTexTarget* namedTarget = NamedTexTarget::find(mMaterial->mDiffuseMapName[i] + 1);
-               if(namedTarget)
+               NamedTexTarget* namedTarget = NamedTexTarget::find(mMaterial->mDiffuseMapAsset[i]->getImageFileName() + 1);
+               if (namedTarget)
                   mStages[i].setTex(MFT_DiffuseMap, namedTarget->getTexture(0));
-            }
-            else
-            {
-               if (!String(mMaterial->mDiffuseMapName[i]).startsWith("#"))
-                  mMaterial->logError("Failed to load diffuse map %s for stage %i", mMaterial->mDiffuseMapName[i], i);
+               if (mStages[i].getTex(MFT_DiffuseMap))
+               {
+                  mMaterial->mDiffuseMap[i] = namedTarget->getTexture(0);
+               }
 
+               if (!mStages[i].getTex(MFT_DiffuseMap))
+                  mHasSetStageData = false;
+            }
+            else {
                // Load a debug texture to make it clear to the user 
                // that the texture for this stage was missing.
                mStages[i].setTex(MFT_DiffuseMap, _createTexture(GFXTextureManager::getMissingTexturePath().c_str(), &GFXStaticTextureSRGBProfile));

+ 2 - 1
Engine/source/postFx/postEffect.h

@@ -90,8 +90,9 @@ public:
 
 protected:
 
-   DECLARE_IMAGEASSET_ARRAY(PostEffect, Texture, NumTextures);
+   DECLARE_IMAGEASSET_ARRAY(PostEffect, Texture, NumTextures, onTextureChanged);
    DECLARE_IMAGEASSET_ARRAY_SETGET(PostEffect, Texture);
+   void onTextureChanged() {}
 
    bool mTexSRGB[NumTextures];