diff options
| author | Brad Kittenbrink <brad@lindenlab.com> | 2022-04-29 18:02:45 +0000 | 
|---|---|---|
| committer | Euclid Linden <euclid@lindenlab.com> | 2022-04-29 18:02:45 +0000 | 
| commit | 0e0c156bd00a01b38edee803e38b956d4f786701 (patch) | |
| tree | 41dabc7b9c53a17591c8c4d6da93207a52a1b793 | |
| parent | b08742d0b3e0000430b8ae772c7c4d25cfe084fa (diff) | |
| parent | cc04903379c3a5dc094e0c9582cf41f022406ef5 (diff) | |
Merged in brad/SL-17116-material-messaging (pull request #958)
brad/SL-17116 material messaging
Approved-by: Euclid Linden
| -rw-r--r-- | indra/llcommon/llassettype.cpp | 4 | ||||
| -rw-r--r-- | indra/llcommon/llassettype.h | 3 | ||||
| -rw-r--r-- | indra/llinventory/llinventorytype.cpp | 4 | ||||
| -rw-r--r-- | indra/llinventory/llinventorytype.h | 2 | ||||
| -rw-r--r-- | indra/llprimitive/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | indra/llprimitive/llmaterial.cpp | 11 | ||||
| -rw-r--r-- | indra/llprimitive/llmaterial.h | 6 | ||||
| -rw-r--r-- | indra/llprimitive/llprimitive.cpp | 69 | ||||
| -rw-r--r-- | indra/llprimitive/llprimitive.h | 20 | ||||
| -rw-r--r-- | indra/llprimitive/tests/llmessagesystem_stub.cpp | 2 | ||||
| -rw-r--r-- | indra/llprimitive/tests/llprimitive_test.cpp | 40 | ||||
| -rw-r--r-- | indra/llui/llui.h | 2 | ||||
| -rw-r--r-- | indra/newview/llpanelface.cpp | 13 | ||||
| -rw-r--r-- | indra/newview/llpanelface.h | 3 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_tools.xml | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_tools_texture.xml | 17 | 
17 files changed, 189 insertions, 17 deletions
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp index 7bf3c6553e..0bb1f1a0fd 100644 --- a/indra/llcommon/llassettype.cpp +++ b/indra/llcommon/llassettype.cpp @@ -96,8 +96,8 @@ LLAssetDictionary::LLAssetDictionary()  	addEntry(LLAssetType::AT_WIDGET,            new AssetEntry("WIDGET",            "widget",   "widget",           false,      false,      false));  	addEntry(LLAssetType::AT_PERSON,            new AssetEntry("PERSON",            "person",   "person",           false,      false,      false));  	addEntry(LLAssetType::AT_SETTINGS,          new AssetEntry("SETTINGS",          "settings", "settings blob",    true,       true,       true)); -    addEntry(LLAssetType::AT_MATERIAL,          new AssetEntry("MATERIAL",          "material", "material",         true,       false,      true)); -    addEntry(LLAssetType::AT_UNKNOWN,           new AssetEntry("UNKNOWN",           "invalid",  NULL,               false,      false,      false)); +	addEntry(LLAssetType::AT_MATERIAL,     new AssetEntry("MATERIAL",          "material", "render material",  true,       true,       true)); +	addEntry(LLAssetType::AT_UNKNOWN,           new AssetEntry("UNKNOWN",           "invalid",  NULL,               false,      false,      false));      addEntry(LLAssetType::AT_NONE,              new AssetEntry("NONE",              "-1",		NULL,		  		FALSE,		FALSE,		FALSE));  }; diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h index 1027957863..e8df8574f7 100644 --- a/indra/llcommon/llassettype.h +++ b/indra/llcommon/llassettype.h @@ -127,9 +127,8 @@ public:          AT_RESERVED_6 = 55,          AT_SETTINGS = 56,   // Collection of settings +        AT_MATERIAL = 57,   // Render Material -        AT_MATERIAL = 57, -              		AT_COUNT = 58,  			// +*********************************************************+ diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp index 71223d65b9..57d521429c 100644 --- a/indra/llinventory/llinventorytype.cpp +++ b/indra/llinventory/llinventorytype.cpp @@ -153,8 +153,8 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =      LLInventoryType::IT_NONE,			// 53   AT_RESERVED_4      LLInventoryType::IT_NONE,			// 54   AT_RESERVED_5 -    LLInventoryType::IT_SETTINGS,       // 55   AT_SETTINGS -    LLInventoryType::IT_MATERIAL,       // 56   AT_MATERIAL +    LLInventoryType::IT_SETTINGS,       // 55   AT_SETTINGS <- why doesnt this match the value in llassettype.h? -brad +    LLInventoryType::IT_MATERIAL,       // 57   AT_MATERIAL  };  // static diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h index e1aac054f6..a5543814d8 100644 --- a/indra/llinventory/llinventorytype.h +++ b/indra/llinventory/llinventorytype.h @@ -119,6 +119,8 @@ public:          ICONNAME_SETTINGS_WATER,          ICONNAME_SETTINGS_DAY, +        ICONNAME_MATERIAL, +  		ICONNAME_INVALID,  		ICONNAME_UNKNOWN,  		ICONNAME_COUNT, diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt index 7b6d04b096..fff4d8ef0a 100644 --- a/indra/llprimitive/CMakeLists.txt +++ b/indra/llprimitive/CMakeLists.txt @@ -90,6 +90,7 @@ if (LL_TESTS)      INCLUDE(LLAddBuildTest)      SET(llprimitive_TEST_SOURCE_FILES        llmediaentry.cpp +      llprimitive.cpp        )      LL_ADD_PROJECT_UNIT_TESTS(llprimitive "${llprimitive_TEST_SOURCE_FILES}")  endif (LL_TESTS) diff --git a/indra/llprimitive/llmaterial.cpp b/indra/llprimitive/llmaterial.cpp index a219ac1450..f546ac1645 100644 --- a/indra/llprimitive/llmaterial.cpp +++ b/indra/llprimitive/llmaterial.cpp @@ -331,6 +331,17 @@ void LLMaterial::setAlphaMaskCutoff(U8 cutoff)      mAlphaMaskCutoff = cutoff;  } +LLUUID LLMaterial::getMaterialID() const +{ +    // TODO - not null +    return LLUUID::null; +} + +void LLMaterial::setMaterialID(const LLUUID &material_id) +{ +    // TODO - set +} +  LLSD LLMaterial::asLLSD() const  {      LLSD material_data; diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h index d58b7ee812..2f8aafc2cf 100644 --- a/indra/llprimitive/llmaterial.h +++ b/indra/llprimitive/llmaterial.h @@ -27,8 +27,6 @@  #ifndef LL_LLMATERIAL_H  #define LL_LLMATERIAL_H -#include <boost/shared_ptr.hpp> -  #include "llmaterialid.h"  #include "llsd.h"  #include "v4coloru.h" @@ -54,8 +52,6 @@ public:          ALPHA_SHADER_COUNT = 4      } eShaderCount; -     -          static const U8         DEFAULT_SPECULAR_LIGHT_EXPONENT = ((U8)(0.2f * 255));      static const LLColor4U  DEFAULT_SPECULAR_LIGHT_COLOR;      static const U8         DEFAULT_ENV_INTENSITY = 0; @@ -119,6 +115,8 @@ public:      void        setDiffuseAlphaMode(U8 alpha_mode);      U8          getAlphaMaskCutoff() const;      void        setAlphaMaskCutoff(U8 cutoff); +    LLUUID      getMaterialID() const; +    void        setMaterialID(LLUUID const & material_id);      bool        isNull() const;      static const LLMaterial null; diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp index 67c225d25d..c46e5fb3c5 100644 --- a/indra/llprimitive/llprimitive.cpp +++ b/indra/llprimitive/llprimitive.cpp @@ -39,6 +39,7 @@  #include "llsdutil_math.h"  #include "llprimtexturelist.h"  #include "llmaterialid.h" +#include "llsdutil.h"  /**   * exported constants @@ -1690,6 +1691,8 @@ BOOL LLNetworkData::isValid(U16 param_type, U32 size)  		return (size == 28);      case PARAMS_EXTENDED_MESH:          return (size == 4); +    case PARAMS_RENDER_MATERIAL: +        return (size == 16);  	}  	return FALSE; @@ -2181,3 +2184,69 @@ bool LLExtendedMeshParams::fromLLSD(LLSD& sd)  	return false;  } + +//============================================================================ + +LLRenderMaterialParams::LLRenderMaterialParams() +{ +    mType = PARAMS_RENDER_MATERIAL; +} + +BOOL LLRenderMaterialParams::pack(LLDataPacker &dp) const +{ +    return dp.packUUID(mMaterial, "material"); + +//    return TRUE; +} + +BOOL LLRenderMaterialParams::unpack(LLDataPacker &dp) +{ +    return dp.unpackUUID(mMaterial, "material"); + +//    return TRUE; +} + +bool LLRenderMaterialParams::operator==(const LLNetworkData& data) const +{ +    if (data.mType != PARAMS_RENDER_MATERIAL) +    { +        return false; +    } + +    const LLRenderMaterialParams ¶m = static_cast<const LLRenderMaterialParams&>(data); + +    return param.mMaterial == mMaterial; +} + +void LLRenderMaterialParams::copy(const LLNetworkData& data) +{ +    llassert_always(data.mType == PARAMS_RENDER_MATERIAL); +    const LLRenderMaterialParams ¶m = static_cast<const LLRenderMaterialParams&>(data); +    mMaterial = param.mMaterial; +} + +LLSD LLRenderMaterialParams::asLLSD() const +{ +    return llsd::map("material", mMaterial); +} + +bool LLRenderMaterialParams::fromLLSD(LLSD& sd) +{ +    if (sd.has("material")) +    { +        setMaterial(sd["material"]); +        return true; +    } + +    return false; +} + +void LLRenderMaterialParams::setMaterial(const LLUUID & id) +{ +    mMaterial = id; +} + +LLUUID LLRenderMaterialParams::getMaterial() const +{ +    return mMaterial; +} diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h index 309b18faa9..e23ddd2916 100644 --- a/indra/llprimitive/llprimitive.h +++ b/indra/llprimitive/llprimitive.h @@ -107,6 +107,7 @@ public:  		PARAMS_RESERVED = 0x50, // Used on server-side  		PARAMS_MESH     = 0x60,          PARAMS_EXTENDED_MESH = 0x70, +        PARAMS_RENDER_MATERIAL = 0x80,  	};  public: @@ -320,6 +321,25 @@ public:  }; +class LLRenderMaterialParams : public LLNetworkData +{ +private: +    LLUUID mMaterial; + +public: +    LLRenderMaterialParams(); +    BOOL pack(LLDataPacker &dp) const override; +    BOOL unpack(LLDataPacker &dp) override; +    bool operator==(const LLNetworkData& data) const override; +    void copy(const LLNetworkData& data) override; +    LLSD asLLSD() const; +    operator LLSD() const { return asLLSD(); } +    bool fromLLSD(LLSD& sd); + +    void setMaterial(const LLUUID & id); +    LLUUID getMaterial() const; +}; +  // This code is not naming-standards compliant. Leaving it like this for  // now to make the connection to code in  // 	BOOL packTEMessage(LLDataPacker &dp) const; diff --git a/indra/llprimitive/tests/llmessagesystem_stub.cpp b/indra/llprimitive/tests/llmessagesystem_stub.cpp index 04e70945c4..9006833054 100644 --- a/indra/llprimitive/tests/llmessagesystem_stub.cpp +++ b/indra/llprimitive/tests/llmessagesystem_stub.cpp @@ -25,7 +25,7 @@  #include "linden_common.h" -char * _PREHASH_TextureEntry; +const char * const _PREHASH_TextureEntry = "TextureEntry";  S32 LLMessageSystem::getSizeFast(char const*, char const*) const  { diff --git a/indra/llprimitive/tests/llprimitive_test.cpp b/indra/llprimitive/tests/llprimitive_test.cpp index 0d60c7cd15..0ff0795fdc 100644 --- a/indra/llprimitive/tests/llprimitive_test.cpp +++ b/indra/llprimitive/tests/llprimitive_test.cpp @@ -71,6 +71,46 @@ private:  	S32 mCurrDetailTest;  }; +LLMaterialID::LLMaterialID() {} +LLMaterialID::LLMaterialID(LLMaterialID const &m) = default; +LLMaterialID::~LLMaterialID() {} +void LLMaterialID::set(void const*) { } +U8 const * LLMaterialID::get() const { return mID; } + +LLPrimTextureList::LLPrimTextureList() { } +LLPrimTextureList::~LLPrimTextureList() { } +S32 LLPrimTextureList::setBumpMap(const U8 index, const U8 bump) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setOffsetS(const U8 index, const F32 s) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setOffsetT(const U8 index, const F32 t) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::copyTexture(const U8 index, const LLTextureEntry &te) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setRotation(const U8 index, const F32 r) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setBumpShiny(const U8 index, const U8 bump_shiny) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setFullbright(const U8 index, const U8 t) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setMaterialID(const U8 index, const LLMaterialID& pMaterialID) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setMediaFlags(const U8 index, const U8 media_flags) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setMediaTexGen(const U8 index, const U8 media) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setBumpShinyFullbright(const U8 index, const U8 bump) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setID(const U8 index, const LLUUID& id) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setGlow(const U8 index, const F32 glow) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setAlpha(const U8 index, const F32 alpha) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setColor(const U8 index, const LLColor3& color) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setColor(const U8 index, const LLColor4& color) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setScale(const U8 index, const F32 s, const F32 t) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setScaleS(const U8 index, const F32 s) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setScaleT(const U8 index, const F32 t) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setShiny(const U8 index, const U8 shiny) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setOffset(const U8 index, const F32 s, const F32 t) { return TEM_CHANGE_NONE; } +S32 LLPrimTextureList::setTexGen(const U8 index, const U8 texgen) { return TEM_CHANGE_NONE; } + +LLMaterialPtr LLPrimTextureList::getMaterialParams(const U8 index) { return LLMaterialPtr(); } +void LLPrimTextureList::copy(LLPrimTextureList const & ptl) { mEntryList = ptl.mEntryList; } // do we need to call getTexture()->newCopy()? +void LLPrimTextureList::take(LLPrimTextureList &other_list) { } +void LLPrimTextureList::setSize(S32 new_size) { mEntryList.resize(new_size); } +void LLPrimTextureList::setAllIDs(const LLUUID &id) { } +LLTextureEntry * LLPrimTextureList::getTexture(const U8 index) const { return nullptr; } +S32 LLPrimTextureList::size() const { return mEntryList.size(); } +  class PRIMITIVE_TEST_SETUP  {  public: diff --git a/indra/llui/llui.h b/indra/llui/llui.h index f46e993f8e..86b23c8c93 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -77,7 +77,7 @@ enum EDragAndDropType  	DAD_PERSON          = 17,      DAD_SETTINGS        = 18,      DAD_MATERIAL        = 19, -	DAD_COUNT           = 20,   // number of types in this enum +    DAD_COUNT           = 20,   // number of types in this enum  };  // Reasons for drags to be denied. diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 34a546f458..6f4d57f30e 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -123,6 +123,7 @@ F32		LLPanelFace::getCurrentShinyScaleU()		{ return getChild<LLUICtrl>("shinySca  F32		LLPanelFace::getCurrentShinyScaleV()		{ return getChild<LLUICtrl>("shinyScaleV")->getValue().asReal();					}  F32		LLPanelFace::getCurrentShinyOffsetU()		{ return getChild<LLUICtrl>("shinyOffsetU")->getValue().asReal();					}  F32		LLPanelFace::getCurrentShinyOffsetV()		{ return getChild<LLUICtrl>("shinyOffsetV")->getValue().asReal();					} +LLUUID	LLPanelFace::getCurrentMaterialID()			{ return getChild<LLUICtrl>("materialID")->getValue().asUUID(); 					}  //  // Methods @@ -154,6 +155,7 @@ BOOL	LLPanelFace::postBuild()  	childSetCommitCallback("glossiness",&LLPanelFace::onCommitMaterialGloss, this);  	childSetCommitCallback("environment",&LLPanelFace::onCommitMaterialEnv, this);  	childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterialMaskCutoff, this); +	childSetCommitCallback("materialID", &LLPanelFace::onCommitMaterialID, this);  	childSetAction("button align",&LLPanelFace::onClickAutoFix,this);  	childSetAction("button align textures", &LLPanelFace::onAlignTexture, this); @@ -299,7 +301,7 @@ BOOL	LLPanelFace::postBuild()  	{  		mCtrlGlow->setCommitCallback(LLPanelFace::onCommitGlow, this);  	} -	 +  	clearCtrls(); @@ -1522,6 +1524,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		calcp->setVar(LLCalc::TEX_ROTATION, childGetValue("TexRot").asReal());  		calcp->setVar(LLCalc::TEX_TRANSPARENCY, childGetValue("ColorTrans").asReal());  		calcp->setVar(LLCalc::TEX_GLOW, childGetValue("glow").asReal()); + +		getChildView("materialID")->setEnabled(editable);  	}  	else  	{ @@ -2306,6 +2310,13 @@ void LLPanelFace::onCommitMaterialMaskCutoff(LLUICtrl* ctrl, void* userdata)  	LLSelectedTEMaterial::setAlphaMaskCutoff(self,self->getCurrentAlphaMaskCutoff());  } +//static +void LLPanelFace::onCommitMaterialID(LLUICtrl* ctrl, void* userdata) +{ +	LLPanelFace* self = static_cast<LLPanelFace*>(userdata); +	LLSelectedTEMaterial::setMaterialID(self, self->getCurrentMaterialID()); +} +  // static  void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata )  { diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 183e5736ca..9282b70b3c 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -191,6 +191,7 @@ protected:  	static void		onCommitMaterialGloss(			LLUICtrl* ctrl, void* userdata);  	static void		onCommitMaterialEnv(				LLUICtrl* ctrl, void* userdata);  	static void		onCommitMaterialMaskCutoff(	LLUICtrl* ctrl, void* userdata); +	static void		onCommitMaterialID( LLUICtrl* ctrl, void* userdata);  	static void		onCommitMaterialsMedia(	LLUICtrl* ctrl, void* userdata);  	static void		onCommitMaterialType(	LLUICtrl* ctrl, void* userdata); @@ -234,6 +235,7 @@ private:  	F32		getCurrentShinyScaleV();  	F32		getCurrentShinyOffsetU();  	F32		getCurrentShinyOffsetV(); +	LLUUID	getCurrentMaterialID();  	// Update visibility of controls to match current UI mode  	// (e.g. materials vs media editing) @@ -498,6 +500,7 @@ public:  		DEF_EDIT_MAT_STATE(LLUUID,const LLUUID&,setNormalID);  		DEF_EDIT_MAT_STATE(LLUUID,const LLUUID&,setSpecularID);  		DEF_EDIT_MAT_STATE(LLColor4U,	const LLColor4U&,setSpecularLightColor); +		DEF_EDIT_MAT_STATE(LLUUID, const LLUUID&, setMaterialID);  	};  	class LLSelectedTE diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index a95636ff23..16b294b8e9 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -6017,6 +6017,11 @@ LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 para  		  new_block = new LLExtendedMeshParams();  		  break;        } +      case LLNetworkData::PARAMS_RENDER_MATERIAL: +      { +          new_block = new LLRenderMaterialParams(); +          break; +      }  	  default:  	  {  		  LL_INFOS() << "Unknown param type." << LL_ENDL; diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 0abee2ff80..44bdcd86f9 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -2,7 +2,7 @@  <floater   positioning="cascading"   legacy_header_height="18" - height="600" + height="640"   layout="topleft"   bg_opaque_image="Window_NoTitle_Foreground"   bg_alpha_image="Window_NoTitle_Background" @@ -820,7 +820,7 @@      width="282"/>      <tab_container       follows="left|top" -     height="410" +     height="460"       halign="center"       left="0"       name="Object Info Tabs" diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index 9aaac7ac85..85ee736176 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -2,7 +2,7 @@  <panel           border="false"           follows="all" -         height="420" +         height="500"           label="Texture"           layout="topleft"           left="0" @@ -772,7 +772,7 @@               width="260" />  			<button  			 left="10" -			 top="222" +			 top="257"  			 height="20"  			 label="Align"  			 label_selected="Align current texture layers" @@ -805,4 +805,17 @@         tool_tip="Save material to inventory"         width="110" /> +            <line_editor +             enabled="true" +             follows="top|left" +             height="16" +             layout="topleft" +             left="7" +             label="Material UUID" +             name="materialID" +             select_on_focus="true" +             top="380" +             width="200" +             tool_tip="UUID for a material asset" +             />  </panel>  | 
