diff --git a/Engine/source/T3D/assets/ImageAsset.cpp b/Engine/source/T3D/assets/ImageAsset.cpp index b249cdb56..cec0cb496 100644 --- a/Engine/source/T3D/assets/ImageAsset.cpp +++ b/Engine/source/T3D/assets/ImageAsset.cpp @@ -860,11 +860,7 @@ void GuiInspectorTypeImageAssetPtr::updatePreviewImage() { if (AssetDatabase.isDeclaredAsset(previewImage)) { - ImageAsset* imgAsset = AssetDatabase.acquireAsset(previewImage); - if (imgAsset && imgAsset->isAssetValid()) - { - mPreviewImage->_setBitmap(imgAsset->getAssetId()); - } + mPreviewImage->_setBitmap(previewImage); } } @@ -892,11 +888,7 @@ void GuiInspectorTypeImageAssetPtr::setPreviewImage(StringTableEntry assetId) { if (AssetDatabase.isDeclaredAsset(assetId)) { - ImageAsset* imgAsset = AssetDatabase.acquireAsset(assetId); - if (imgAsset && imgAsset->isAssetValid()) - { - mPreviewImage->_setBitmap(imgAsset->getAssetId()); - } + mPreviewImage->_setBitmap(assetId); } } diff --git a/Engine/source/T3D/assets/ImageAsset.h b/Engine/source/T3D/assets/ImageAsset.h index 894edc58f..4635a3223 100644 --- a/Engine/source/T3D/assets/ImageAsset.h +++ b/Engine/source/T3D/assets/ImageAsset.h @@ -652,4 +652,39 @@ public: #define INITPERSISTFIELD_IMAGEASSET_REFACTOR(name, consoleClass, docs) \ addProtectedField(assetText(name, Asset), TypeImageAssetPtrRefactor, Offset(m##name##Asset, consoleClass), _set##name##Data, &defaultProtectedGetFn, assetDoc(name, asset docs.)); + +#define DECLARE_IMAGEASSET_ARRAY_REFACTOR(className, name, profile, max) \ +private: \ + AssetPtr m##name##Asset[max]; \ +public: \ + void _set##name(StringTableEntry _in, const U32& index){ \ + if(m##name##Asset[index].getAssetId() == _in) \ + return; \ + \ + if(!AssetDatabase.isDeclaredAsset(_in)) \ + { \ + StringTableEntry imageAssetId = ImageAsset::smNoImageAssetFallback; \ + AssetQuery query; \ + S32 foundAssetcount = AssetDatabase.findAssetLooseFile(&query, _in); \ + if (foundAssetcount != 0) \ + { \ + imageAssetId = query.mAssetList[0]; \ + } \ + m##name##Asset[index] = imageAssetId; \ + } \ + else \ + { \ + m##name##Asset[index] = _in; \ + } \ + }; \ + \ + inline StringTableEntry _get##name(const U32& index) const { return m##name##Asset[index].getAssetId(); } \ + GFXTexHandle get##name(const U32& index) { return m##name##Asset[index].notNull() ? m##name##Asset[index]->getTexture(&profile) : NULL; } \ + AssetPtr get##name##Asset(const U32& index) { return m##name##Asset[index]; } \ + static bool _set##name##Data(void* obj, const char* index, const char* data) { static_cast(obj)->_set##name(_getStringTable()->insert(data), dAtoi(index)); return false;} + +#define INITPERSISTFIELD_IMAGEASSET_ARRAY_REFACTOR(name, arraySize, consoleClass, docs) \ + addProtectedField(assetText(name, Asset), TypeImageAssetPtrRefactor, Offset(m##name##Asset, consoleClass), _set##name##Data, &defaultProtectedGetFn, arraySize, assetDoc(name, asset docs.)); + + #pragma endregion diff --git a/Engine/source/gui/buttons/guiBitmapButtonCtrl.cpp b/Engine/source/gui/buttons/guiBitmapButtonCtrl.cpp index 9738cc25c..139c8f65d 100644 --- a/Engine/source/gui/buttons/guiBitmapButtonCtrl.cpp +++ b/Engine/source/gui/buttons/guiBitmapButtonCtrl.cpp @@ -129,7 +129,9 @@ GuiBitmapButtonCtrl::GuiBitmapButtonCtrl() setExtent( 140, 30 ); mMasked = false; mColor = ColorI::WHITE; - INIT_ASSET(Bitmap); + mBitmapName = StringTable->EmptyString(); + mBitmap = NULL; + mBitmapAsset.registerRefreshNotify(this); } //----------------------------------------------------------------------------- @@ -139,14 +141,10 @@ void GuiBitmapButtonCtrl::initPersistFields() docsURL; addGroup( "Bitmap" ); - addProtectedField("Bitmap", TypeImageFilename, Offset(mBitmapName, GuiBitmapButtonCtrl), _setBitmapFieldData, &defaultProtectedGetFn, "Texture file to display on this button.\n" + INITPERSISTFIELD_IMAGEASSET_REFACTOR(Bitmap, GuiBitmapButtonCtrl,"Texture file to display on this button.\n" "If useStates is false, this will be the file that renders on the control. Otherwise, this will " "specify the default texture name to which the various state and modifier suffixes are appended " - "to find the per-state and per-modifier (if enabled) textures.", AbstractClassRep::FIELD_HideInInspectors); \ - addProtectedField("BitmapAsset", TypeImageAssetId, Offset(mBitmapAssetId, GuiBitmapButtonCtrl), _setBitmapFieldData, &defaultProtectedGetFn, "Texture file to display on this button.\n" - "If useStates is false, this will be the file that renders on the control. Otherwise, this will " - "specify the default texture name to which the various state and modifier suffixes are appended " - "to find the per-state and per-modifier (if enabled) textures."); + "to find the per-state and per-modifier (if enabled) textures.") addField("color", TypeColorI, Offset(mColor, GuiBitmapButtonCtrl), "color mul"); @@ -184,7 +182,7 @@ bool GuiBitmapButtonCtrl::onWake() return false; setActive( true ); - setBitmap( getBitmap() ); + setBitmap( mBitmapName ); return true; } @@ -242,7 +240,7 @@ void GuiBitmapButtonCtrl::inspectPostApply() { Parent::inspectPostApply(); - setBitmap(getBitmap()); + setBitmap(mBitmapName); // if the extent is set to (0,0) in the gui editor and appy hit, this control will // set it's extent to be exactly the size of the normal bitmap (if present) @@ -274,7 +272,7 @@ void GuiBitmapButtonCtrl::setBitmap( StringTableEntry name ) if( mBitmapAsset.notNull()) { - if( dStricmp( getBitmap(), "texhandle" ) != 0 ) + if( dStricmp( mBitmapName, "texhandle" ) != 0 ) { const U32 count = mUseModifiers ? NumModifiers : 1; for( U32 i = 0; i < count; ++ i ) @@ -292,7 +290,7 @@ void GuiBitmapButtonCtrl::setBitmap( StringTableEntry name ) static String s_h[2] = { "_h", "_h_image" }; static String s_i[2] = { "_i", "_i_image" }; - String baseName = mBitmapAssetId; + String baseName = mBitmapAsset.getAssetId(); //strip any pre-assigned suffix, just in case baseName = baseName.replace("_n_image", ""); @@ -301,7 +299,7 @@ void GuiBitmapButtonCtrl::setBitmap( StringTableEntry name ) if( mUseModifiers ) baseName += modifiers[ i ]; - mTextures[ i ].mTextureNormal = GFXTexHandle( mBitmapAsset->getImageFile(), &GFXDefaultGUIProfile, avar("%s() - mTextureNormal (line %d)", __FUNCTION__, __LINE__)); + mTextures[i].mTextureNormal = getBitmap(); if( mUseStates ) { @@ -323,7 +321,7 @@ void GuiBitmapButtonCtrl::setBitmap( StringTableEntry name ) mTextures[i].mTextureNormalAsset->load(); if (mTextures[i].mTextureNormalAsset->getStatus() == AssetBase::Ok) { - mTextures[i].mTextureNormal = GFXTexHandle(mTextures[i].mTextureNormalAsset->getImageFile(), &GFXDefaultGUIProfile, avar("%s() - mTextureDepressed (line %d)", __FUNCTION__, __LINE__)); + mTextures[i].mTextureNormal = mTextures[i].mTextureNormalAsset->getTexture(&GFXDefaultGUIProfile); break; } } @@ -345,7 +343,7 @@ void GuiBitmapButtonCtrl::setBitmap( StringTableEntry name ) mTextures[i].mTextureHilightAsset->load(); if (mTextures[i].mTextureHilightAsset->getStatus() == AssetBase::Ok) { - mTextures[i].mTextureHilight = GFXTexHandle(mTextures[i].mTextureHilightAsset->getImageFile(), &GFXDefaultGUIProfile, avar("%s() - mTextureDepressed (line %d)", __FUNCTION__, __LINE__)); + mTextures[i].mTextureHilight = mTextures[i].mTextureHilightAsset->getTexture(&GFXDefaultGUIProfile); break; } } @@ -369,7 +367,7 @@ void GuiBitmapButtonCtrl::setBitmap( StringTableEntry name ) mTextures[i].mTextureDepressedAsset->load(); if (mTextures[i].mTextureDepressedAsset->getStatus() == AssetBase::Ok) { - mTextures[i].mTextureDepressed = GFXTexHandle(mTextures[i].mTextureDepressedAsset->getImageFile(), &GFXDefaultGUIProfile, avar("%s() - mTextureDepressed (line %d)", __FUNCTION__, __LINE__)); + mTextures[i].mTextureDepressed = mTextures[i].mTextureDepressedAsset->getTexture(&GFXDefaultGUIProfile); break; } } @@ -393,7 +391,7 @@ void GuiBitmapButtonCtrl::setBitmap( StringTableEntry name ) mTextures[i].mTextureInactiveAsset->load(); if (mTextures[i].mTextureInactiveAsset->getStatus() == AssetBase::Ok) { - mTextures[i].mTextureInactive = GFXTexHandle(mTextures[i].mTextureInactiveAsset->getImageFile(), &GFXDefaultGUIProfile, avar("%s() - mTextureDepressed (line %d)", __FUNCTION__, __LINE__)); + mTextures[i].mTextureInactive = mTextures[i].mTextureInactiveAsset->getTexture(&GFXDefaultGUIProfile); break; } } @@ -670,4 +668,4 @@ bool GuiBitmapButtonCtrl::pointInControl(const Point2I& parentCoordPoint) return Parent::pointInControl(parentCoordPoint); } -DEF_ASSET_BINDS(GuiBitmapButtonCtrl, Bitmap); +DEF_ASSET_BINDS_REFACTOR(GuiBitmapButtonCtrl, Bitmap) diff --git a/Engine/source/gui/buttons/guiBitmapButtonCtrl.h b/Engine/source/gui/buttons/guiBitmapButtonCtrl.h index 8674432ec..1194809d7 100644 --- a/Engine/source/gui/buttons/guiBitmapButtonCtrl.h +++ b/Engine/source/gui/buttons/guiBitmapButtonCtrl.h @@ -49,7 +49,7 @@ /// To implement different handlers for the modifier states, use the "onDefaultClick", /// "onCtrlClick", "onAltClick", and "onShiftClick" methods. /// -class GuiBitmapButtonCtrl : public GuiButtonCtrl +class GuiBitmapButtonCtrl : public GuiButtonCtrl, protected AssetPtrCallback { public: @@ -118,9 +118,35 @@ class GuiBitmapButtonCtrl : public GuiButtonCtrl /// BitmapMode mBitmapMode; - DECLARE_IMAGEASSET(GuiBitmapButtonCtrl, Bitmap, onBitmapChange, GFXDefaultGUIProfile); - DECLARE_ASSET_SETGET(GuiBitmapButtonCtrl, Bitmap); - +private: AssetPtr mBitmapAsset; public: void _setBitmap(StringTableEntry _in) { + if (mBitmapAsset.getAssetId() == _in) return; if (!AssetDatabase.isDeclaredAsset(_in)) { + StringTableEntry imageAssetId = ImageAsset::smNoImageAssetFallback; AssetQuery query; S32 foundAssetcount = AssetDatabase.findAssetLooseFile(&query, _in); if (foundAssetcount != 0) { + imageAssetId = query.mAssetList[0]; + } mBitmapAsset = imageAssetId; + } + else { + mBitmapAsset = _in; + mBitmapName = _in; + mBitmap = getBitmap(); + } +}; inline StringTableEntry _getBitmap(void) const { + return mBitmapAsset.getAssetId(); +} GFXTexHandle getBitmap() { + return mBitmapAsset.notNull() ? mBitmapAsset->getTexture(&GFXDefaultGUIProfile) : 0; +} AssetPtr getBitmapAsset(void) { + return mBitmapAsset; +} static bool _setBitmapData(void* obj, const char* index, const char* data) { + static_cast(obj)->_setBitmap(_getStringTable()->insert(data)); return false; +} +protected: + + void onAssetRefreshed(AssetPtrBase* pAssetPtrBase) override + { + setBitmap(mBitmapName); + } + + GFXTexHandle mBitmap; + StringTableEntry mBitmapName; /// alpha masking bool mMasked; @@ -158,11 +184,6 @@ class GuiBitmapButtonCtrl : public GuiButtonCtrl /// @} - void onBitmapChange() - { - setBitmap(getBitmap()); - } - public: GuiBitmapButtonCtrl(); @@ -185,14 +206,6 @@ class GuiBitmapButtonCtrl : public GuiButtonCtrl DECLARE_CONOBJECT(GuiBitmapButtonCtrl); DECLARE_DESCRIPTION( "A button control rendered entirely from bitmaps.\n" "The individual button states are represented with separate bitmaps." ); - - //Basically a wrapper function to do our special state handling setup when the fields change - static bool _setBitmapFieldData(void* obj, const char* index, const char* data) - { - GuiBitmapButtonCtrl* object = static_cast(obj); - object->setBitmap(StringTable->insert(data)); - return false; - } }; typedef GuiBitmapButtonCtrl::BitmapMode GuiBitmapMode; diff --git a/Engine/source/gui/controls/guiPopUpCtrlEx.cpp b/Engine/source/gui/controls/guiPopUpCtrlEx.cpp index 45183285d..9b82c1ecc 100644 --- a/Engine/source/gui/controls/guiPopUpCtrlEx.cpp +++ b/Engine/source/gui/controls/guiPopUpCtrlEx.cpp @@ -329,9 +329,6 @@ GuiPopUpMenuCtrlEx::GuiPopUpMenuCtrlEx(void) mBackgroundCancel = false; // Added mReverseTextList = false; // Added - Don't reverse text list if displaying up - INIT_IMAGEASSET_ARRAY(Bitmap, GFXDefaultGUIProfile, Normal); - INIT_IMAGEASSET_ARRAY(Bitmap, GFXDefaultGUIProfile, Depressed); - mBitmapBounds.set(16, 16); // Added mHotTrackItems = false; mIdMax = -1; @@ -356,8 +353,7 @@ void GuiPopUpMenuCtrlEx::initPersistFields(void) addField("sbUsesNAColor", TypeBool, Offset(mRenderScrollInNA, GuiPopUpMenuCtrlEx), "Deprecated" "@internal"); addField("reverseTextList", TypeBool, Offset(mReverseTextList, GuiPopUpMenuCtrlEx), "Reverses text list if popup extends up, instead of down"); - addProtectedField("bitmap", TypeImageFilename, Offset(mBitmapName, GuiPopUpMenuCtrlEx), _setBitmaps, &defaultProtectedGetFn, "File name of bitmap to use"); - addProtectedField("bitmapAsset", TypeImageAssetId, Offset(mBitmapAssetId, GuiPopUpMenuCtrlEx), _setBitmaps, &defaultProtectedGetFn, "Name of bitmap asset to use"); + INITPERSISTFIELD_IMAGEASSET_ARRAY_REFACTOR(Bitmap, NumBitmapModes, GuiPopUpMenuCtrlEx, "Name of bitmap asset to use") addField("bitmapBounds", TypePoint2I, Offset(mBitmapBounds, GuiPopUpMenuCtrlEx), "Boundaries of bitmap displayed"); addField("hotTrackCallback", TypeBool, Offset(mHotTrackItems, GuiPopUpMenuCtrlEx), @@ -368,14 +364,6 @@ void GuiPopUpMenuCtrlEx::initPersistFields(void) Parent::initPersistFields(); } -bool GuiPopUpMenuCtrlEx::_setBitmaps(void* obj, const char* index, const char* data) -{ - GuiPopUpMenuCtrlEx* object = static_cast(obj); - - object->setBitmap(data); - return true; -} - //------------------------------------------------------------------------------ ConsoleDocFragment _GuiPopUpMenuCtrlExAdd( "@brief Adds an entry to the list\n\n" @@ -690,9 +678,6 @@ bool GuiPopUpMenuCtrlEx::onWake() if ( !Parent::onWake() ) return false; - // Set the bitmap for the popup. - setBitmap(getBitmap(Normal)); - // Now update the Form Control's bitmap array, and possibly the child's too mProfile->constructBitmapArray(); @@ -818,8 +803,8 @@ void GuiPopUpMenuCtrlEx::setBitmap(const char *name) dStrcpy(p, "_d", pLen); _setBitmap((StringTableEntry)buffer, Depressed); - if (!mBitmap[Depressed]) - mBitmap[Depressed] = mBitmap[Normal]; + if (mBitmapAsset[Depressed].isNull()) + mBitmapAsset[Depressed] = mBitmapAsset[Normal]; } else { @@ -1096,17 +1081,17 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect) } // Draw a bitmap over the background? - if ( mBitmap[Depressed] ) + if ( mBitmapAsset[Depressed].notNull() ) { RectI rect(offset, mBitmapBounds); drawUtil->clearBitmapModulation(); - drawUtil->drawBitmapStretch(mBitmap[Depressed], rect ); + drawUtil->drawBitmapStretch(getBitmap(Depressed), rect ); } - else if (mBitmap[Normal]) + else if (mBitmapAsset[Normal].notNull()) { RectI rect(offset, mBitmapBounds); drawUtil->clearBitmapModulation(); - drawUtil->drawBitmapStretch(mBitmap[Normal], rect ); + drawUtil->drawBitmapStretch(getBitmap(Normal), rect ); } // Do we render a bitmap border or lines? @@ -1140,11 +1125,11 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect) } // Draw a bitmap over the background? - if (mBitmap[Normal]) + if (mBitmapAsset[Normal].notNull()) { RectI rect( offset, mBitmapBounds ); drawUtil->clearBitmapModulation(); - drawUtil->drawBitmapStretch(mBitmap[Normal], rect ); + drawUtil->drawBitmapStretch(getBitmap(Normal), rect ); } // Do we render a bitmap border or lines? @@ -1170,11 +1155,11 @@ void GuiPopUpMenuCtrlEx::onRender(Point2I offset, const RectI &updateRect) } // Draw a bitmap over the background? - if (mBitmap[Normal]) + if (mBitmapAsset[Normal].notNull()) { RectI rect(offset, mBitmapBounds); drawUtil->clearBitmapModulation(); - drawUtil->drawBitmapStretch(mBitmap[Normal], rect ); + drawUtil->drawBitmapStretch(getBitmap(Normal), rect ); } // Do we render a bitmap border or lines? diff --git a/Engine/source/gui/controls/guiPopUpCtrlEx.h b/Engine/source/gui/controls/guiPopUpCtrlEx.h index f389de3e7..ac0306f35 100644 --- a/Engine/source/gui/controls/guiPopUpCtrlEx.h +++ b/Engine/source/gui/controls/guiPopUpCtrlEx.h @@ -131,9 +131,8 @@ class GuiPopUpMenuCtrlEx : public GuiTextCtrl NumBitmapModes = 2 }; - DECLARE_IMAGEASSET_ARRAY(GuiPopUpMenuCtrlEx, Bitmap, NumBitmapModes, onBitmapChanged); - DECLARE_IMAGEASSET_ARRAY_SETGET(GuiPopUpMenuCtrlEx, Bitmap); - void onBitmapChanged() {} + DECLARE_IMAGEASSET_ARRAY_REFACTOR(GuiPopUpMenuCtrlEx, Bitmap, GFXDefaultGUIProfile, NumBitmapModes) + Point2I mBitmapBounds; // Added S32 mIdMax; @@ -144,8 +143,6 @@ class GuiPopUpMenuCtrlEx : public GuiTextCtrl virtual void removeChildren(); virtual void repositionPopup(); - static bool _setBitmaps(void* obj, const char* index, const char* data); - public: GuiPopUpMenuCtrlEx(void); ~GuiPopUpMenuCtrlEx();