diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-08-31 19:45:23 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-09-01 13:26:10 +0300 | 
| commit | 20dc30450cb50d08e6c7d23613a6a59aae1a6a16 (patch) | |
| tree | 8d44ac139360ed72216442d87bd8c7c6d498ee5a | |
| parent | 8df1856f84cf2d76b207ab43b05f1f930db50c51 (diff) | |
SL-17999 PBR material in tool's texture tab
| -rw-r--r-- | indra/newview/lldrawpoolsky.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llpanelface.cpp | 467 | ||||
| -rw-r--r-- | indra/newview/llpanelface.h | 14 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 83 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.h | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_tools_texture.xml | 48 | 
6 files changed, 356 insertions, 262 deletions
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 3a1efec91b..55ebf03adc 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -51,7 +51,10 @@ LLDrawPoolSky::LLDrawPoolSky()  void LLDrawPoolSky::prerender()  {  	mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT);  -	gSky.mVOSkyp->updateGeometry(gSky.mVOSkyp->mDrawable); +    if (gSky.mVOSkyp->mDrawable) +    { +        gSky.mVOSkyp->updateGeometry(gSky.mVOSkyp->mDrawable); +    }  }  void LLDrawPoolSky::render(S32 pass) diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 865529eb8f..795a93c3fe 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -93,13 +93,15 @@  // Must match the commbobox definitions in panel_tools_texture.xml  //  const S32 MATMEDIA_MATERIAL = 0;	// Material -const S32 MATMEDIA_MEDIA = 1;		// Media +const S32 MATMEDIA_PBR = 1;			// PBR +const S32 MATMEDIA_MEDIA = 2;		// Media  const S32 MATTYPE_DIFFUSE = 0;		// Diffuse material texture  const S32 MATTYPE_NORMAL = 1;		// Normal map  const S32 MATTYPE_SPECULAR = 2;		// Specular map  const S32 ALPHAMODE_MASK = 2;		// Alpha masking mode  const S32 BUMPY_TEXTURE = 18;		// use supplied normal map  const S32 SHINY_TEXTURE = 4;		// use supplied specular map +const S32 PBRTYPE_ALBEDO = 0;		// PBR ALBEDO  BOOST_STATIC_ASSERT(MATTYPE_DIFFUSE == LLRender::DIFFUSE_MAP && MATTYPE_NORMAL == LLRender::NORMAL_MAP && MATTYPE_SPECULAR == LLRender::SPECULAR_MAP); @@ -142,7 +144,6 @@ 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 @@ -174,7 +175,6 @@ 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); @@ -197,6 +197,24 @@ BOOL	LLPanelFace::postBuild()  	setMouseOpaque(FALSE); +    LLTextureCtrl*	pbr_ctrl = getChild<LLTextureCtrl>("pbr_control"); +    if (pbr_ctrl) +    { +        pbr_ctrl->setDefaultImageAssetID(LLUUID(gSavedSettings.getString("DefaultObjectTexture"))); +        pbr_ctrl->setCommitCallback(boost::bind(&LLPanelFace::onCommitPbr, this, _2)); +        pbr_ctrl->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelPbr, this, _2)); +        pbr_ctrl->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectPbr, this, _2)); +        pbr_ctrl->setDragCallback(boost::bind(&LLPanelFace::onDragPbr, this, _2)); +        pbr_ctrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onPbrSelectionChanged, this, _1)); +        pbr_ctrl->setOnCloseCallback(boost::bind(&LLPanelFace::onCloseTexturePicker, this, _2)); + +        pbr_ctrl->setFollowsTop(); +        pbr_ctrl->setFollowsLeft(); +        pbr_ctrl->setImmediateFilterPermMask(PERM_NONE); +        pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER); +        pbr_ctrl->setBakeTextureEnabled(false); +    } +  	mTextureCtrl = getChild<LLTextureCtrl>("texture control");  	if(mTextureCtrl)  	{ @@ -314,6 +332,13 @@ BOOL	LLPanelFace::postBuild()          radio_mat_type->selectNthItem(MATTYPE_DIFFUSE);      } +    LLRadioGroup* radio_pbr_type = getChild<LLRadioGroup>("radio_pbr_type"); +    if (radio_mat_type) +    { +        radio_pbr_type->setCommitCallback(LLPanelFace::onCommitPbrType, this); +        radio_pbr_type->selectNthItem(PBRTYPE_ALBEDO); +    } +  	mCtrlGlow = getChild<LLSpinCtrl>("glow");  	if(mCtrlGlow)  	{ @@ -852,7 +877,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		{  			LL_WARNS() << "failed getChild for 'combobox matmedia'" << LL_ENDL;  		} -		getChildView("combobox matmedia")->setEnabled(editable); +        combobox_matmedia->setEnabled(editable);  		LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");  		if(radio_mat_type) @@ -869,14 +894,31 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		}  		getChildView("radio_material_type")->setEnabled(editable); +        getChildView("radio_pbr_type")->setEnabled(editable);  		getChildView("checkbox_sync_settings")->setEnabled(editable);  		childSetValue("checkbox_sync_settings", gSavedSettings.getBOOL("SyncMaterialSettings"));  		updateVisibility();  		bool identical				= true;	// true because it is anded below -      bool identical_diffuse	= false; -      bool identical_norm		= false; -      bool identical_spec		= false; +        bool identical_diffuse	= false; +        bool identical_norm		= false; +        bool identical_spec		= false; + +        // pbr material +        bool is_pbr_material = false; +        LLTextureCtrl*	pbr_ctrl = getChild<LLTextureCtrl>("pbr_control"); +        if (pbr_ctrl) +        { +            LLUUID pbr_id; +            bool identical_pbr; +            LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr); +            identical &= identical_pbr; + +            pbr_ctrl->setTentative(identical_pbr ? FALSE : TRUE); +            pbr_ctrl->setEnabled(editable); +            pbr_ctrl->setImageAssetID(pbr_id); +            is_pbr_material = pbr_id.notNull(); +        }  		LLTextureCtrl*	texture_ctrl = getChild<LLTextureCtrl>("texture control");  		LLTextureCtrl*	shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control"); @@ -888,7 +930,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		// Color swatch  		{ -			getChildView("color label")->setEnabled(editable); +			getChildView("color label")->setEnabled(editable && !is_pbr_material);  		}  		LLColorSwatchCtrl*	mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch"); @@ -903,17 +945,17 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  			mColorSwatch->setOriginal(color);  			mColorSwatch->set(color, force_set_values || (prev_color != color) || !editable); -			mColorSwatch->setValid(editable); -			mColorSwatch->setEnabled( editable ); +			mColorSwatch->setValid(editable && !is_pbr_material); +			mColorSwatch->setEnabled(editable && !is_pbr_material);  			mColorSwatch->setCanApplyImmediately( editable );  		}  		// Color transparency -		getChildView("color trans")->setEnabled(editable); +		getChildView("color trans")->setEnabled(editable && !is_pbr_material);  		F32 transparency = (1.f - color.mV[VALPHA]) * 100.f;  		getChild<LLUICtrl>("ColorTrans")->setValue(editable ? transparency : 0); -		getChildView("ColorTrans")->setEnabled(editable); +		getChildView("ColorTrans")->setEnabled(editable && !is_pbr_material);  		// Specular map  		LLSelectedTEMaterial::getSpecularID(specmap_id, identical_spec); @@ -958,7 +1000,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		U8 bumpy = 0;  		// Bumpy -						{ +		{  			bool identical_bumpy = false;  			LLSelectedTE::getBumpmap(bumpy,identical_bumpy); @@ -979,7 +1021,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  			getChildView("combobox bumpiness")->setEnabled(editable);  			getChild<LLUICtrl>("combobox bumpiness")->setTentative(!identical_bumpy);  			getChildView("label bumpiness")->setEnabled(editable); -						} +        }  		// Texture  		{ @@ -1333,8 +1375,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  			LLSelectedTE::getGlow(glow,identical_glow);  			getChild<LLUICtrl>("glow")->setValue(glow);  			getChild<LLUICtrl>("glow")->setTentative(!identical_glow); -			getChildView("glow")->setEnabled(editable); -			getChildView("glow label")->setEnabled(editable); +			getChildView("glow")->setEnabled(editable && !is_pbr_material); +			getChildView("glow label")->setEnabled(editable && !is_pbr_material);  		}  		{ @@ -1441,10 +1483,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  			LLMaterialPtr material;  			LLSelectedTEMaterial::getCurrent(material, identical); -            // enable this UI box if a single face is selected. -            BOOL is_single_face = !LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected(); -            childSetEnabled("materialID", static_cast<bool>(is_single_face));   // doesn't work - why? -              if (material && editable)  			{  				LL_DEBUGS("Materials") << material->asLLSD() << LL_ENDL; @@ -1557,8 +1595,6 @@ 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  	{ @@ -1566,6 +1602,12 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  		clearCtrls();  		// Disable non-UICtrls +        LLTextureCtrl*	pbr_ctrl = getChild<LLTextureCtrl>("pbr_control"); +        if (pbr_ctrl) +        { +            pbr_ctrl->setImageAssetID(LLUUID::null); +            pbr_ctrl->setEnabled(FALSE); +        }  		LLTextureCtrl*	texture_ctrl = getChild<LLTextureCtrl>("texture control");   		if(texture_ctrl)  		{ @@ -1701,10 +1743,12 @@ void LLPanelFace::updateVisibility()  	U32 materials_media = combo_matmedia->getCurrentIndex();  	U32 material_type = radio_mat_type->getSelectedIndex();  	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled(); -	bool show_texture = (show_media || ((material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled())); -	bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled(); -	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); -	getChildView("radio_material_type")->setVisible(!show_media); +    bool show_material = materials_media == MATMEDIA_MATERIAL; +    bool show_pbr = materials_media == MATMEDIA_PBR; +	bool show_texture = (show_media || (show_material && (material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled())); +	bool show_bumpiness = show_material && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled(); +	bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); +	getChildView("radio_material_type")->setVisible(show_texture);  	// Media controls  	getChildView("media_info")->setVisible(show_media); @@ -1713,20 +1757,20 @@ void LLPanelFace::updateVisibility()  	getChildView("button align")->setVisible(show_media);  	// Diffuse texture controls -	getChildView("texture control")->setVisible(show_texture && !show_media); -	getChildView("label alphamode")->setVisible(show_texture && !show_media); -	getChildView("combobox alphamode")->setVisible(show_texture && !show_media); +	getChildView("texture control")->setVisible(show_texture && show_material); +	getChildView("label alphamode")->setVisible(show_texture && (show_material || show_pbr)); +	getChildView("combobox alphamode")->setVisible(show_texture && (show_material || show_pbr));  	getChildView("label maskcutoff")->setVisible(false);  	getChildView("maskcutoff")->setVisible(false); -	if (show_texture && !show_media) +	if (show_texture && show_material)  	{  		updateAlphaControls();  	} -	getChildView("TexScaleU")->setVisible(show_texture); -	getChildView("TexScaleV")->setVisible(show_texture); -	getChildView("TexRot")->setVisible(show_texture); -	getChildView("TexOffsetU")->setVisible(show_texture); -	getChildView("TexOffsetV")->setVisible(show_texture); +	getChildView("TexScaleU")->setVisible(show_texture || show_pbr); +	getChildView("TexScaleV")->setVisible(show_texture || show_pbr); +	getChildView("TexRot")->setVisible(show_texture || show_pbr); +	getChildView("TexOffsetU")->setVisible(show_texture || show_pbr); +	getChildView("TexOffsetV")->setVisible(show_texture || show_pbr);  	// Specular map controls  	getChildView("shinytexture control")->setVisible(show_shininess); @@ -1762,7 +1806,9 @@ void LLPanelFace::updateVisibility()  	getChildView("bumpyOffsetU")->setVisible(show_bumpiness);  	getChildView("bumpyOffsetV")->setVisible(show_bumpiness); - +    // PBR controls +    getChildView("pbr_control")->setVisible(show_pbr); +    getChildView("radio_pbr_type")->setVisible(show_pbr);  }  // static @@ -1778,6 +1824,16 @@ void LLPanelFace::onCommitMaterialType(LLUICtrl* ctrl, void* userdata)  }  // static +void LLPanelFace::onCommitPbrType(LLUICtrl* ctrl, void* userdata) +{ +    LLPanelFace* self = (LLPanelFace*)userdata; +    // Force to default states to side-step problems with menu contents +    // and generally reflecting old state when switching tabs or objects +    // +    self->updateUI(); +} + +// static  void LLPanelFace::onCommitBump(LLUICtrl* ctrl, void* userdata)  {  	LLPanelFace* self = (LLPanelFace*) userdata; @@ -1843,8 +1899,8 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh  	LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");  	U32 materials_media = combo_matmedia->getCurrentIndex();  	U32 material_type = radio_mat_type->getSelectedIndex(); -	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled(); -	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled(); +	bool show_material = (materials_media == MATMEDIA_MATERIAL); +	bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();  	U32 shiny_value = comboShiny->getCurrentIndex();  	bool show_shinyctrls = (shiny_value == SHINY_TEXTURE) && show_shininess; // Use texture  	getChildView("label glossiness")->setVisible(show_shinyctrls); @@ -1962,21 +2018,81 @@ void LLPanelFace::onCommitGlow(LLUICtrl* ctrl, void* userdata)  }  // static +BOOL LLPanelFace::onDragPbr(LLUICtrl*, LLInventoryItem* item) +{ +    BOOL accept = TRUE; +    for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin(); +        iter != LLSelectMgr::getInstance()->getSelection()->root_end(); iter++) +    { +        LLSelectNode* node = *iter; +        LLViewerObject* obj = node->getObject(); +        if (!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item)) +        { +            accept = FALSE; +            break; +        } +    } +    return accept; +} + +void LLPanelFace::onCommitPbr(const LLSD& data) +{ +    LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control"); +    if (!pbr_ctrl) return; +    if (!pbr_ctrl->getTentative()) +    { +        // we grab the item id first, because we want to do a +        // permissions check in the selection manager. ARGH! +        LLUUID id = pbr_ctrl->getImageItemID(); +        if (id.isNull()) +        { +            id = pbr_ctrl->getImageAssetID(); +        } +        LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id); +    } +} + +void LLPanelFace::onCancelPbr(const LLSD& data) +{ +    LLSelectMgr::getInstance()->selectionRevertGLTFMaterials(); +} + +void LLPanelFace::onSelectPbr(const LLSD& data) +{ +    LLSelectMgr::getInstance()->saveSelectedObjectTextures(); + +    LLTextureCtrl* pbr_ctrl = getChild<LLTextureCtrl>("pbr_control"); +    if (!pbr_ctrl) return; +    if (!pbr_ctrl->getTentative()) +    { +        // we grab the item id first, because we want to do a +        // permissions check in the selection manager. ARGH! +        LLUUID id = pbr_ctrl->getImageItemID(); +        if (id.isNull()) +        { +            id = pbr_ctrl->getImageAssetID(); +        } +        LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id); +        LLSelectedTEMaterial::setMaterialID(this, id); +    } +} + +// static  BOOL LLPanelFace::onDragTexture(LLUICtrl*, LLInventoryItem* item)  { -	BOOL accept = TRUE; -	for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin(); -		 iter != LLSelectMgr::getInstance()->getSelection()->root_end(); iter++) -	{ -		LLSelectNode* node = *iter; -		LLViewerObject* obj = node->getObject(); -		if(!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item)) -		{ -			accept = FALSE; -			break; -		} -	} -	return accept; +    BOOL accept = TRUE; +    for (LLObjectSelection::root_iterator iter = LLSelectMgr::getInstance()->getSelection()->root_begin(); +        iter != LLSelectMgr::getInstance()->getSelection()->root_end(); iter++) +    { +        LLSelectNode* node = *iter; +        LLViewerObject* obj = node->getObject(); +        if (!LLToolDragAndDrop::isInventoryDropAcceptable(obj, item)) +        { +            accept = FALSE; +            break; +        } +    } +    return accept;  }  void LLPanelFace::onCommitTexture( const LLSD& data ) @@ -2354,17 +2470,6 @@ 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); -    LLUUID matID = self->getCurrentMaterialID(); -	LLSelectedTEMaterial::setMaterialID(self, matID); - -    // Temporary demo hack - replace the TE entries with those from the Material's LLSD -    applyMaterialUUID(matID, userdata); -} -  // static  void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata )  { @@ -3474,6 +3579,39 @@ void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp)  	}  } +void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp) +{ +    LLTextureCtrl* pbr_ctrl = getChild<LLTextureCtrl>("pbr_control"); +    if (pbr_ctrl) +    { +        LLUUID obj_owner_id; +        std::string obj_owner_name; +        LLSelectMgr::instance().selectGetOwner(obj_owner_id, obj_owner_name); + +        LLSaleInfo sale_info; +        LLSelectMgr::instance().selectGetSaleInfo(sale_info); + +        bool can_copy = itemp->getPermissions().allowCopyBy(gAgentID); // do we have perm to copy this texture? +        bool can_transfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID); // do we have perm to transfer this texture? +        bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply texture belong to the agent? +        bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply texture not for sale? + +        if (can_copy && can_transfer) +        { +            pbr_ctrl->setCanApply(true, true); +            return; +        } + +        // if texture has (no-transfer) attribute it can be applied only for object which we own and is not for sale +        pbr_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale); + +        if (gSavedSettings.getBOOL("TextureLivePreview")) +        { +            LLNotificationsUtil::add("LivePreviewUnavailable"); +        } +    } +} +  bool LLPanelFace::isIdenticalPlanarTexgen()  {  	LLTextureEntry::e_texgen selected_texgen = LLTextureEntry::TEX_GEN_DEFAULT; @@ -3553,6 +3691,18 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical)  	identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id );  } +void LLPanelFace::LLSelectedTE::getPbrMaterialId(LLUUID& id, bool& identical) +{ +    struct LLSelectedTEGetmatId : public LLSelectedTEGetFunctor<LLUUID> +    { +        LLUUID get(LLViewerObject* object, S32 te_index) +        { +            return object->getRenderMaterialID(te_index); +        } +    } func; +    identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func, id); +} +  void LLPanelFace::LLSelectedTEMaterial::getCurrent(LLMaterialPtr& material_ptr, bool& identical_material)  {  	struct MaterialFunctor : public LLSelectedTEGetFunctor<LLMaterialPtr> @@ -3692,196 +3842,3 @@ void LLPanelFace::LLSelectedTE::getMaxDiffuseRepeats(F32& repeats, bool& identic  	identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &max_diff_repeats_func, repeats );  } - -void LLPanelFace::onSaveMaterial(void* userdata) -{ -    // DRTVWR-559, Q&D material picker - save to inventory goes here -    LL_DEBUGS("Material") << "saving render material to inventory" << LL_ENDL; - -    std::string name = "New Material"; - -	LLSD material_data = llsd::map( -		"version", "1", -		"material", LLSD::emptyMap() -	); - -    // gen a new uuid for this asset -    LLTransactionID tid; -    tid.generate();     // timestamp-based randomization + uniquification -    LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - -    material_data["material"] = renderMaterialToLLSD(new_asset_id, userdata); -    std::stringstream output; -    LLSDSerialize::toNotation(material_data, output); - -    //S32 expected_upload_cost = 0;// LLAgentBenefitsMgr::current().getTextureUploadCost(); -     -    std::string res_name = name; -    std::string res_desc = "Saved Material"; -    //LLFolderType::EType folder_type = LLFolderType::FT_MATERIAL; -    //LLInventoryType::EType inv_type = LLInventoryType::IT_MATERIAL; -    U32 next_owner_perm = LLPermissions::DEFAULT.getMaskNextOwner(); - -    LLUUID parent = gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL); -    const U8 subtype = NO_INV_SUBTYPE;  // TODO maybe use AT_SETTINGS and LLSettingsType::ST_MATERIAL ? - -    create_inventory_item(gAgent.getID(), gAgent.getSessionID(), parent, tid, res_name, res_desc, -        LLAssetType::AT_MATERIAL, LLInventoryType::IT_MATERIAL, subtype, next_owner_perm, -        new LLBoostFuncInventoryCallback([output=output.str()](LLUUID const & inv_item_id){ -            // from reference in LLSettingsVOBase::createInventoryItem()/updateInventoryItem() -            LLResourceUploadInfo::ptr_t uploadInfo = -                std::make_shared<LLBufferedAssetUploadInfo>( -                    inv_item_id, -                    LLAssetType::AT_SETTINGS, // TODO switch to AT_MATERIAL -                    output, -                    [](LLUUID item_id, LLUUID new_asset_id, LLUUID new_item_id, LLSD response) { -                        LL_INFOS("Material") << "inventory item uploaded.  item: " << item_id << " asset: " << new_asset_id << " new_item_id: " << new_item_id << " response: " << response << LL_ENDL; -                        LLSD params = llsd::map("ASSET_ID", new_asset_id); -                        LLNotificationsUtil::add("MaterialCreated", params); -                    }); - -            const LLViewerRegion* region = gAgent.getRegion(); -            if (region) -            { -                 std::string agent_url(region->getCapability("UpdateSettingsAgentInventory")); -                 if (agent_url.empty()) -                 { -                     LL_ERRS() << "missing required agent inventory cap url" << LL_ENDL; -                 } -                 LLViewerAssetUpload::EnqueueInventoryUpload(agent_url, uploadInfo); -            } -        }) -    ); - -} - -// Fill an LLSD with data describing the current face's texture settings -// TODO 2022-05 FUBAR there are both colliding and different data in LLPanelFace vs the TE.  Also, neither one has the diffuse tex settings. -//               -LLSD LLPanelFace::renderMaterialToLLSD(LLUUID uuid, void* userdata) -{ -    llassert(userdata != nullptr); - -    LLSD sd; - -    sd.insert("RenderMaterialUUID",    LLSD(uuid)); - -    // now pull same data from the selected TE (same but different. W T F?)  -    LLMaterialPtr mat = nullptr; -    bool ident; // ? -    LLSelectedTEMaterial::getCurrent(mat, ident); - -    if (mat) -    { -        sd.insert("teMaterialID", LLSD(mat->getMaterialID())); - -        sd.insert("teNormalMap", LLSD(mat->getNormalID())); -        sd.insert("teNormalOffsetX", LLSD(mat->getNormalOffsetX())); -        sd.insert("teNormalOffsetY", LLSD(mat->getNormalOffsetY())); -        sd.insert("teNormalRepeatX", LLSD(mat->getNormalRepeatX())); -        sd.insert("teNormalRepeatY", LLSD(mat->getNormalRepeatY())); -        sd.insert("teNormalRotation", LLSD(mat->getNormalRotation())); - -        sd.insert("teSpecularMap", LLSD(mat->getSpecularID())); -        LLColor4U color = mat->getSpecularLightColor(); - -        sd.insert("teSpecularColorR", LLSD(static_cast<S32>(color.mV[0]))); -        sd.insert("teSpecularColorG", LLSD(static_cast<S32>(color.mV[1]))); -        sd.insert("teSpecularColorB", LLSD(static_cast<S32>(color.mV[2]))); -        sd.insert("teSpecularColorA", LLSD(static_cast<S32>(color.mV[3]))); -        sd.insert("teSpecularExponent", LLSD(static_cast<S32>(mat->getSpecularLightExponent()))); -        sd.insert("teSpecularOffsetX", LLSD(mat->getSpecularOffsetX())); -        sd.insert("teSpecularOffsetY", LLSD(mat->getSpecularOffsetY())); -        sd.insert("teSpecularRepeatX", LLSD(mat->getSpecularRepeatX())); -        sd.insert("teSpecularRepeatY", LLSD(mat->getSpecularRepeatY())); -        sd.insert("teSpecularRotation", LLSD(mat->getSpecularRotation())); - -        sd.insert("teAlphaMode", LLSD(static_cast<S32>(mat->getDiffuseAlphaMode()))); -        sd.insert("teAlphaCutoff", LLSD(static_cast<S32>(mat->getAlphaMaskCutoff()))); -        sd.insert("teEnvIntensity", LLSD(static_cast<S32>(mat->getEnvironmentIntensity()))); -        sd.insert("teShaderMask", LLSD(static_cast<S32>(mat->getShaderMask()))); -    } -    else -    { -        // pull data from the LLPanelFace -        LLPanelFace* instance = static_cast<LLPanelFace*>(userdata); -        sd.insert("pfNormalMap",         LLSD(instance->getCurrentNormalMap())); -        sd.insert("pfSpecularMap",       LLSD(instance->getCurrentSpecularMap())); -        sd.insert("pfShininess",         LLSD(static_cast<S32>(instance->getCurrentShininess()))); -        sd.insert("pfBumpiness",         LLSD(static_cast<S32>(instance->getCurrentBumpiness()))); -        sd.insert("pfAlphaMode",         LLSD(static_cast<S32>(instance->getCurrentDiffuseAlphaMode()))); -        sd.insert("pfAlphaCutoff",       LLSD(static_cast<S32>(instance->getCurrentAlphaMaskCutoff()))); -        sd.insert("pfEnvIntensity",      LLSD(static_cast<S32>(instance->getCurrentEnvIntensity()))); -        sd.insert("pfGlossiness",        LLSD(static_cast<S32>(instance->getCurrentGlossiness()))); -        sd.insert("pfNormalRotation",    LLSD(instance->getCurrentBumpyRot())); -        sd.insert("pfNormalScaleU",      LLSD(instance->getCurrentBumpyScaleU())); -        sd.insert("pfNormalScaleV",      LLSD(instance->getCurrentBumpyScaleV())); -        sd.insert("pfNormalOffsetU",     LLSD(instance->getCurrentBumpyOffsetU())); -        sd.insert("pfNormalOffsetV",     LLSD(instance->getCurrentBumpyOffsetV())); -        sd.insert("pfSpecularRotation",  LLSD(instance->getCurrentShinyRot())); -        sd.insert("pfSpecularScaleU",    LLSD(instance->getCurrentShinyScaleU())); -        sd.insert("pfSpecularScaleV",    LLSD(instance->getCurrentShinyScaleV())); -        sd.insert("pfSpecularOffsetU",   LLSD(instance->getCurrentShinyOffsetU())); -        sd.insert("pfSpecularOffsetV",   LLSD(instance->getCurrentShinyOffsetV())); -        sd.insert("pfMaterialID",        LLSD(instance->getCurrentMaterialID())); -    } - -    return sd; -} - -// Take the individual texture settings from the material and apply to current face & TE -void LLPanelFace::applyMaterialUUID(LLUUID uuid, void* userdata) -{ -    llassert(userdata != nullptr); -    //LLPanelFace* instance = static_cast<LLPanelFace*>(userdata); -     -    LLFileSystem material_file(uuid, LLAssetType::AT_MATERIAL, LLFileSystem::READ); -    S32 bufsize = material_file.getSize(); -    llassert(bufsize > 0); -    std::vector<U8> buffer(bufsize); -    material_file.read(&buffer[0], bufsize); -    std::istringstream input(std::string(buffer.begin(), buffer.end()));  // TODO - extend LLFileSystem to expose iostream interface -    LLSD matSD; - -    LLSDSerialize::fromNotation(matSD, input, bufsize); - -    LL_INFOS() << "dump matSD: " << matSD << LL_ENDL; - -    // strip off the versioning wrapper for now -    matSD = matSD["material"]; - -    // wrong, oops. llassert(uuid == matSD.get("RenderMaterialUUID").asUUID());      // if not, whoo boy - -    LLMaterialPtr mat = nullptr; -    bool ident; // ? -    LLSelectedTEMaterial::getCurrent(mat, ident); - -    mat->setMaterialID(matSD.get("teMaterialID").asUUID()); - -    mat->setNormalID(matSD.get("teNormalMap").asUUID()); -    mat->setNormalOffsetX(matSD.get("teNormalOffsetX").asReal()); -    mat->setNormalOffsetY(matSD.get("teNormalOffsetY").asReal()); -    mat->setNormalRepeatX(matSD.get("teNormalRepeatX").asReal()); -    mat->setNormalRepeatY(matSD.get("teNormalRepeatY").asReal()); -    mat->setNormalRotation(matSD.get("teNormalRotation").asReal()); - -    mat->setSpecularID(matSD.get("teSpecularMap").asUUID()); -    LLColor4U color; -    color.mV[0] = static_cast<U8>(matSD.get("teSecularColorR").asInteger()); -    color.mV[1] = static_cast<U8>(matSD.get("teSecularColorG").asInteger()); -    color.mV[2] = static_cast<U8>(matSD.get("teSecularColorB").asInteger()); -    color.mV[3] = static_cast<U8>(matSD.get("teSecularColorA").asInteger()); -    mat->setSpecularLightColor(color); -    mat->setSpecularLightExponent(static_cast<U8>(matSD.get("teSpecularExponent").asInteger())); -    mat->setSpecularOffsetX(matSD.get("teSpecularOffsetX").asReal()); -    mat->setSpecularOffsetY(matSD.get("teSpecularOffsetY").asReal()); -    mat->setSpecularRepeatX(matSD.get("teSpecularRepeatX").asReal()); -    mat->setSpecularRepeatY(matSD.get("teSpecularRepeatY").asReal()); -    mat->setSpecularRotation(matSD.get("teSpecularRotation").asReal()); - -    mat->setDiffuseAlphaMode(static_cast<U8>(matSD.get("teAlphaMode").asInteger())); -    mat->setAlphaMaskCutoff(static_cast<U8>(matSD.get("teAlphaCutoff").asInteger())); -    mat->setEnvironmentIntensity(static_cast<U8>(matSD.get("teEnvIntensity").asInteger())); -    //mat->setShaderMask(static_cast<U32>(matSD.get(teShaderMask").asInteger()); -} - diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 08dc619402..6746d67ce3 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -128,11 +128,15 @@ protected:  	void			sendShiny(U32 shininess);			// applies and sends shininess  	void			sendFullbright();		// applies and sends full bright  	void        sendGlow(); -	void			sendMedia();      void            alignTestureLayer();      void            updateCopyTexButton(); +    void 	onCommitPbr(const LLSD& data); +    void 	onCancelPbr(const LLSD& data); +    void 	onSelectPbr(const LLSD& data); +    static BOOL onDragPbr(LLUICtrl* ctrl, LLInventoryItem* item); +  	// this function is to return TRUE if the drag should succeed.  	static BOOL onDragTexture(LLUICtrl* ctrl, LLInventoryItem* item); @@ -200,6 +204,7 @@ protected:  	static void		onCommitMaterialsMedia(	LLUICtrl* ctrl, void* userdata);  	static void		onCommitMaterialType(	LLUICtrl* ctrl, void* userdata); +    static void		onCommitPbrType(LLUICtrl* ctrl, void* userdata);  	static void		onCommitBump(				LLUICtrl* ctrl, void* userdata);  	static void		onCommitTexGen(			LLUICtrl* ctrl, void* userdata);  	static void		onCommitShiny(				LLUICtrl* ctrl, void* userdata); @@ -211,10 +216,6 @@ protected:  	static void		onClickAutoFix(void*);      static void		onAlignTexture(void*); -    static void		onSaveMaterial(void*); -    static LLSD     renderMaterialToLLSD(LLUUID uuid, void* userdata); -    static void     applyMaterialUUID(LLUUID uuid, void*); -  public: // needs to be accessible to selection manager      void            onCopyColor(); // records all selected faces      void            onPasteColor(); // to specific face @@ -255,7 +256,6 @@ private:  	F32		getCurrentShinyScaleV();  	F32		getCurrentShinyOffsetU();  	F32		getCurrentShinyOffsetV(); -	LLUUID	getCurrentMaterialID();  	// Update visibility of controls to match current UI mode  	// (e.g. materials vs media editing) @@ -424,6 +424,7 @@ private:  	 * all controls of the floater texture picker which allow to apply the texture will be disabled.  	 */      void onTextureSelectionChanged(LLInventoryItem* itemp); +    void onPbrSelectionChanged(LLInventoryItem* itemp);      LLMenuButton*   mMenuClipboardColor;      LLMenuButton*   mMenuClipboardTexture; @@ -535,6 +536,7 @@ public:  		static void getFace(class LLFace*& face_to_return, bool& identical_face);  		static void getImageFormat(LLGLenum& image_format_to_return, bool& identical_face);  		static void getTexId(LLUUID& id, bool& identical); +        static void getPbrMaterialId(LLUUID& id, bool& identical);  		static void getObjectScaleS(F32& scale_s, bool& identical);  		static void getObjectScaleT(F32& scale_t, bool& identical);  		static void getMaxDiffuseRepeats(F32& repeats, bool& identical); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index fc5b1c60e2..c4ad48033e 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1760,6 +1760,89 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)  }  //----------------------------------------------------------------------------- +// selectionSetGLTFMaterial() +//----------------------------------------------------------------------------- +void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id) +{ +    // First for (no copy) textures and multiple object selection +    LLViewerInventoryItem* item = gInventory.getItem(mat_id); +    if (item +        && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) +        && (mSelectedObjects->getNumNodes() > 1)) +    { +        LL_WARNS() << "Attempted to apply no-copy material to multiple objects" +            << LL_ENDL; +        return; +    } + +    struct f : public LLSelectedTEFunctor +    { +        LLViewerInventoryItem* mItem; +        LLUUID mMatId; +        f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mMatId(id) {} +        bool apply(LLViewerObject* objectp, S32 te) +        { +            if (objectp && !objectp->permModify()) +            { +                return false; +            } +            LLUUID asset_id = mMatId; +            if (mItem) +            { +                asset_id = mItem->getAssetUUID(); +            } + +            if (te != -1) +            { +                objectp->setRenderMaterialID(te, asset_id); +            } +            else +            { +                S32 num_faces = objectp->getNumTEs(); +                for (S32 face = 0; face < num_faces; face++) +                { +                    objectp->setRenderMaterialID(face, asset_id); +                } +            } + +            return true; +        } +    }; + +    if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())) +    { +        getSelection()->applyNoCopyTextureToTEs(item); +    } +    else +    { +        f setfunc(item, mat_id); +        getSelection()->applyToTEs(&setfunc); +    } + + +    struct g : public LLSelectedObjectFunctor +    { +        LLViewerInventoryItem* mItem; +        g(LLViewerInventoryItem* item) : mItem(item) {} +        virtual bool apply(LLViewerObject* object) +        { +            if (!mItem) +            { +                object->sendTEUpdate(); +                // 1 particle effect per object				 +                LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); +                effectp->setSourceObject(gAgentAvatarp); +                effectp->setTargetObject(object); +                effectp->setDuration(LL_HUD_DUR_SHORT); +                effectp->setColor(LLColor4U(gAgent.getEffectColor())); +            } +            return true; +        } +    } sendfunc(item); +    getSelection()->applyToObjects(&sendfunc); +} + +//-----------------------------------------------------------------------------  // selectionSetColor()  //-----------------------------------------------------------------------------  void LLSelectMgr::selectionSetColor(const LLColor4 &color) diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index aec2baa6a7..3b76f87c44 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -605,6 +605,7 @@ public:  	void selectionSetRestitution(F32 restitution);  	void selectionSetMaterial(U8 material);  	void selectionSetImage(const LLUUID& imageid); // could be item or asset id +    void selectionSetGLTFMaterial(const LLUUID& mat_id); // could be item or asset id  	void selectionSetColor(const LLColor4 &color);  	void selectionSetColorOnly(const LLColor4 &color); // Set only the RGB channels  	void selectionSetAlphaOnly(const F32 alpha); // Set only the alpha channel 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 2af7ccaa7a..922c58fa94 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -144,6 +144,10 @@                   name="Materials"                   value="Materials" />                  <combo_box.item +                 label="PBR" +                 name="PBR" +                 value="PBR" /> +                <combo_box.item                   label="Media"                   name="Media"                   value="Media" /> @@ -179,6 +183,37 @@                  top_pad="1"                  value="2"/>              </radio_group> +            <radio_group +            control_name="ComboMaterialType" +            height="50" +            layout="topleft" +            left_delta="0" +            top_delta="0" +            width="150" +            visible = "false" +            name="radio_pbr_type"> +                <radio_item +                label="Albedo/emissive" +                name="Albedo/emissive" +                top="0"  +                layout="topleft" +                height="16"  +                value="0"/> +                <radio_item +                label="Normal" +                layout="topleft" +                top_pad="1"  +                height="16"  +                name="Normal" +                value="1"/> +                <radio_item +                label="Metallic/roughness" +                name="Metallic/roughness" +                height="16" +                layout="topleft" +                top_pad="1" +                value="2"/> +            </radio_group>              <menu_button                  menu_filename="menu_copy_paste_texture.xml"                  follows="top|left" @@ -217,6 +252,19 @@               tool_tip="Click to choose a picture"               top_pad="5"               width="64" /> +            <texture_picker +             can_apply_immediately="true" +             default_image_name="Default" +             fallback_image="materials_ui_x_24.png" +             follows="left|top" +             height="80" +             label="PBR       " +             layout="topleft" +             left="10" +             name="pbr_control" +             tool_tip="Click to choose a pbr material" +             top_delta="0" +             width="64" />              <text               type="string"               length="1"  | 
