diff --git a/Engine/source/T3D/assets/ImageAsset.cpp b/Engine/source/T3D/assets/ImageAsset.cpp index 771ce2ff6..8808d40e6 100644 --- a/Engine/source/T3D/assets/ImageAsset.cpp +++ b/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) diff --git a/Engine/source/T3D/assets/ImageAsset.h b/Engine/source/T3D/assets/ImageAsset.h index 5b9009e71..850032909 100644 --- a/Engine/source/T3D/assets/ImageAsset.h +++ b/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); } diff --git a/Engine/source/T3D/fx/splash.h b/Engine/source/T3D/fx/splash.h index 754103cc5..de98a5bca 100644 --- a/Engine/source/T3D/fx/splash.h +++ b/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; diff --git a/Engine/source/environment/basicClouds.h b/Engine/source/environment/basicClouds.h index 982b9cf9c..bd67d1362 100644 --- a/Engine/source/environment/basicClouds.h +++ b/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; diff --git a/Engine/source/gfx/sim/cubemapData.h b/Engine/source/gfx/sim/cubemapData.h index dd35918e2..c79dd4289 100644 --- a/Engine/source/gfx/sim/cubemapData.h +++ b/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; diff --git a/Engine/source/gui/controls/guiPopUpCtrl.h b/Engine/source/gui/controls/guiPopUpCtrl.h index 40b129274..12568d2c6 100644 --- a/Engine/source/gui/controls/guiPopUpCtrl.h +++ b/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; diff --git a/Engine/source/gui/controls/guiPopUpCtrlEx.h b/Engine/source/gui/controls/guiPopUpCtrlEx.h index 5a361565b..f389de3e7 100644 --- a/Engine/source/gui/controls/guiPopUpCtrlEx.h +++ b/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; diff --git a/Engine/source/materials/materialDefinition.h b/Engine/source/materials/materialDefinition.h index f3ef304e8..7d4b78108 100644 --- a/Engine/source/materials/materialDefinition.h +++ b/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. diff --git a/Engine/source/materials/processedMaterial.cpp b/Engine/source/materials/processedMaterial.cpp index c030441ed..f477d80d6 100644 --- a/Engine/source/materials/processedMaterial.cpp +++ b/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)); diff --git a/Engine/source/postFx/postEffect.h b/Engine/source/postFx/postEffect.h index 89c4b7427..702fed0a8 100644 --- a/Engine/source/postFx/postEffect.h +++ b/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];