#3512 Add UX for marking water exclusion surfaces

master
Maxim Nikolenko 2025-03-03 22:29:26 +02:00 committed by GitHub
parent 4214ab8e79
commit a1ccb44c15
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 103 additions and 5 deletions

View File

@ -420,6 +420,7 @@ bool LLPanelFace::postBuild()
mCtrlColorTransp->setFollowsLeft();
getChildSetCommitCallback(mCheckFullbright, "checkbox fullbright", [&](LLUICtrl*, const LLSD&) { onCommitFullbright(); });
getChildSetCommitCallback(mCheckHideWater, "checkbox_hide_water", [&](LLUICtrl*, const LLSD&) { onCommitHideWater(); });
mLabelTexGen = getChild<LLTextBox>("tex gen");
getChildSetCommitCallback(mComboTexGen, "combobox texgen", [&](LLUICtrl*, const LLSD&) { onCommitTexGen(); });
@ -1024,6 +1025,13 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLSelectedTEMaterial::getNormalID(normmap_id, identical_norm);
LLSelectedTEMaterial::getSpecularID(specmap_id, identical_spec);
LLColor4 color = LLColor4::white;
bool identical_color = false;
LLSelectedTE::getColor(color, identical_color);
F32 transparency = (1.f - color.mV[VALPHA]) * 100.f;
mExcludeWater = (id == IMG_ALPHA_GRAD) && normmap_id.isNull() && specmap_id.isNull() && (transparency == 0);
static S32 selected_te = -1;
static LLUUID prev_obj_id;
if ((LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()) &&
@ -1098,12 +1106,26 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
updateVisibility(objectp);
// Water exclusion
{
mCheckHideWater->setEnabled(editable && !has_pbr_material && !isMediaTexSelected());
mCheckHideWater->set(mExcludeWater);
if (mExcludeWater && !has_pbr_material)
{
mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL);
}
editable &= !mExcludeWater;
// disable controls for water exclusion face after updateVisibility, so the whole panel is not hidden
mComboMatMedia->setEnabled(editable);
mRadioMaterialType->setEnabled(editable);
mRadioPbrType->setEnabled(editable);
mCheckSyncSettings->setEnabled(editable);
}
// Color swatch
mLabelColor->setEnabled(editable);
LLColor4 color = LLColor4::white;
bool identical_color = false;
LLSelectedTE::getColor(color, identical_color);
LLColor4 prev_color = mColorSwatch->get();
mColorSwatch->setOriginal(color);
mColorSwatch->set(color, force_set_values || (prev_color != color) || !editable);
@ -1114,7 +1136,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
// Color transparency
mLabelColorTransp->setEnabled(editable);
F32 transparency = (1.f - color.mV[VALPHA]) * 100.f;
mCtrlColorTransp->setValue(editable ? transparency : 0);
mCtrlColorTransp->setEnabled(editable && has_material);
@ -1986,7 +2007,8 @@ void LLPanelFace::updateCopyTexButton()
mMenuClipboardTexture->setEnabled(objectp && objectp->getPCode() == LL_PCODE_VOLUME && objectp->permModify()
&& !objectp->isPermanentEnforced() && !objectp->isInventoryPending()
&& (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)
&& LLMaterialEditor::canClipboardObjectsMaterial());
&& LLMaterialEditor::canClipboardObjectsMaterial()
&& !mExcludeWater);
std::string tooltip = (objectp && objectp->isInventoryPending()) ? LLTrans::getString("LoadingContents") : getString("paste_options");
mMenuClipboardTexture->setToolTip(tooltip);
}
@ -3027,6 +3049,37 @@ void LLPanelFace::onCommitFullbright()
sendFullbright();
}
void LLPanelFace::onCommitHideWater()
{
if (mCheckHideWater->get())
{
LLHandle<LLPanel> handle = getHandle();
LLNotificationsUtil::add("WaterExclusionSurfacesWarning", LLSD(), LLSD(),
[handle](const LLSD& notification, const LLSD& response)
{
if(LLPanelFace* panel = (LLPanelFace*)handle.get())
{
if (LLNotificationsUtil::getSelectedOption(notification, response) == 1)
{
panel->mCheckHideWater->setValue(false);
return;
}
// apply invisiprim texture and reset related params to set water exclusion surface
panel->sendBump(0);
panel->sendShiny(0);
LLSelectMgr::getInstance()->selectionSetAlphaOnly(1.f);
LLSelectMgr::getInstance()->selectionSetImage(IMG_ALPHA_GRAD);
LLSelectedTEMaterial::setDiffuseAlphaMode(panel, LLMaterial::DIFFUSE_ALPHA_MODE_BLEND);
}
});
}
else
{
// reset texture to default plywood
LLSelectMgr::getInstance()->selectionSetImage(DEFAULT_OBJECT_TEXTURE);
}
}
void LLPanelFace::onCommitGlow()
{
sendGlow();
@ -4891,6 +4944,26 @@ bool LLPanelFace::isIdenticalPlanarTexgen()
return (identical_texgen && (selected_texgen == LLTextureEntry::TEX_GEN_PLANAR));
}
bool LLPanelFace::isMediaTexSelected()
{
LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode();
if (LLViewerObject* objectp = node->getObject())
{
S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces());
for (S32 te = 0; te < num_tes; ++te)
{
if (node->isTESelected(te))
{
if (objectp->getTE(te) && objectp->getTE(te)->hasMedia())
{
return true;
}
}
}
}
return false;
}
void LLPanelFace::LLSelectedTE::getFace(LLFace*& face_to_return, bool& identical_face)
{
struct LLSelectedTEGetFace : public LLSelectedTEGetFunctor<LLFace *>

View File

@ -139,6 +139,8 @@ protected:
void updateMediaSettings();
void updateMediaTitle();
bool isMediaTexSelected();
void getState();
void sendTexture(); // applies and sends texture
@ -238,6 +240,7 @@ protected:
void onCommitShiny();
void onCommitAlphaMode();
void onCommitFullbright();
void onCommitHideWater();
void onCommitGlow();
void onCommitPlanarAlign();
void onCommitRepeatsPerMeter();
@ -308,6 +311,7 @@ private:
LLRadioGroup* mRadioPbrType { nullptr };
LLCheckBoxCtrl* mCheckFullbright { nullptr };
LLCheckBoxCtrl* mCheckHideWater{ nullptr };
LLTextBox* mLabelColorTransp { nullptr };
LLSpinCtrl* mCtrlColorTransp { nullptr }; // transparency = 1 - alpha
@ -555,6 +559,7 @@ private:
LLMenuButton* mMenuClipboardTexture;
bool mIsAlpha;
bool mExcludeWater { false };
LLSD mClipboardParams;

View File

@ -12580,4 +12580,16 @@ are wearing now.
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="WaterExclusionSurfacesWarning"
type="alertmodal">
Checking the hide water box will overwrite the texture, bumpiness, and shininess choices.
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
notext="Cancel"
yestext="Continue"/>
</notification>
</notifications>

View File

@ -123,6 +123,14 @@
name="checkbox fullbright"
top_pad="4"
width="81" />
<check_box
height="19"
label="Hide water"
layout="topleft"
left="172"
top_delta="0"
name="checkbox_hide_water"
width="81" />
<view_border
bevel_style="none"
follows="top|left"