From 438ce4e445b06c5037cba208c185cb81b8050edb Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Tue, 1 Apr 2025 06:55:04 +1000 Subject: [PATCH 01/11] Implemented repeats per meter for PBR --- indra/newview/fspanelface.cpp | 127 ++++++++++++++++++++++++++++++++-- indra/newview/fspanelface.h | 1 + 2 files changed, 121 insertions(+), 7 deletions(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index 5279ab85d4..bc18fa44e8 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -154,6 +154,33 @@ void readSelectedGLTFMaterial(std::function func, T& v identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&select_func, value, has_tolerance, tolerance); } +void getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo channel, F32& repeats, bool& identical) +{ + // The All channel should read base color values + if (channel == LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_COUNT) + channel = LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR; + + struct LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor : public LLSelectedTEGetFunctor + { + LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor(LLGLTFMaterial::TextureInfo channel) : mChannel(channel) {} + virtual ~LLSelectedTEGetGLTFMaterialMaxRepeatsFunctor() {}; + F32 get(LLViewerObject* object, S32 face) override + { + const LLTextureEntry* tep = object->getTE(face); + const LLGLTFMaterial* render_material = tep->getGLTFRenderMaterial(); + if (!render_material) + return 0.f; + + F32 repeats_u = render_material->mTextureTransform[mChannel].mScale[VX] / object->getScale().mV[VX]; + F32 repeats_v = render_material->mTextureTransform[mChannel].mScale[VY] / object->getScale().mV[VY]; + return llmax(repeats_u, repeats_v); + } + + LLGLTFMaterial::TextureInfo mChannel; + } max_repeats_func(channel); + identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&max_repeats_func, repeats); +} + // // keep LLRenderMaterialFunctor in sync with llmaterialeditor.cpp - Would be nice if we // had this in its own file so we could include it from both sides ... -Zi @@ -2005,13 +2032,19 @@ void FSPanelFace::updateUI(bool force_set_values /*false*/) F32 repeats_norm = 1.f; F32 repeats_spec = 1.f; + F32 repeats_pbr_basecolor = 1.f; + F32 repeats_pbr_metallic_roughness = 1.f; + F32 repeats_pbr_normal = 1.f; + F32 repeats_pbr_emissive = 1.f; + bool identical_diff_repeats = false; bool identical_norm_repeats = false; bool identical_spec_repeats = false; - LLSelectedTE::getMaxDiffuseRepeats(repeats_diff, identical_diff_repeats); - LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats); - LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats); + bool identical_pbr_basecolor_repeats = false; + bool identical_pbr_metallic_roughness_repeats = false; + bool identical_pbr_normal_repeats = false; + bool identical_pbr_emissive_repeats = false; S32 index = mComboTexGen->getCurrentIndex(); bool enabled = editable && (index != 1); @@ -2021,15 +2054,26 @@ void FSPanelFace::updateUI(bool force_set_values /*false*/) F32 repeats = 1.0f; LLRender::eTexIndex material_channel = LLRender::DIFFUSE_MAP; - if (material_selection == MATMEDIA_MATERIAL) + if (material_selection != MATMEDIA_PBR) { material_channel = getCurrentMatChannel(); + LLSelectedTE::getMaxDiffuseRepeats(repeats_diff, identical_diff_repeats); + LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats); + LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats); } - // TODO: check if repeats per meter even apply to PBR materials -Zi else if (material_selection == MATMEDIA_PBR) { enabled = editable; material_channel = getCurrentPBRChannel(); + + getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR, + repeats_pbr_basecolor, identical_pbr_basecolor_repeats); + getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS, + repeats_pbr_metallic_roughness, identical_pbr_metallic_roughness_repeats); + getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_NORMAL, + repeats_pbr_normal, identical_pbr_normal_repeats); + getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_EMISSIVE, + repeats_pbr_emissive, identical_pbr_emissive_repeats); } switch (material_channel) @@ -2069,6 +2113,35 @@ void FSPanelFace::updateUI(bool force_set_values /*false*/) repeats = repeats_norm; } break; + + case LLRender::NUM_TEXTURE_CHANNELS: + case LLRender::BASECOLOR_MAP: + { + identical_repeats = identical_pbr_basecolor_repeats; + repeats = repeats_pbr_basecolor; + } + break; + + case LLRender::METALLIC_ROUGHNESS_MAP: + { + identical_repeats = identical_pbr_metallic_roughness_repeats; + repeats = repeats_pbr_metallic_roughness; + } + break; + + case LLRender::GLTF_NORMAL_MAP: + { + identical_repeats = identical_pbr_normal_repeats; + repeats = repeats_pbr_normal; + } + break; + + case LLRender::EMISSIVE_MAP: + { + identical_repeats = identical_pbr_emissive_repeats; + repeats = repeats_pbr_emissive; + } + break; } bool repeats_tentative = !identical_repeats; @@ -3262,6 +3335,13 @@ void FSPanelFace::onSelectShinyColor() void FSPanelFace::updateVisibility(LLViewerObject* objectp /* = nullptr */) { + S32 materials_media = getCurrentMaterialType(); + bool show_media = materials_media == MATMEDIA_MEDIA; + bool show_material = materials_media == MATMEDIA_MATERIAL; + + // Shared material controls + mCheckSyncMaterials->setVisible(show_material || show_media); + updateAlphaControls(); // TODO: is this still needed? -Zi updateShinyControls(); @@ -4113,10 +4193,12 @@ void FSPanelFace::onCommitRepeatsPerMeter() { S32 materials_media = getCurrentMaterialType(); LLRender::eTexIndex material_channel = LLRender::DIFFUSE_MAP; - // TODO: check if repeats per meter is even used for PBR -Zi + LLGLTFMaterial::TextureInfo material_type = LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR; + if (materials_media == MATMEDIA_PBR) { material_channel = getCurrentPBRChannel(); + material_type = getCurrentPBRType(material_channel); } if (materials_media == MATMEDIA_MATERIAL) @@ -4135,7 +4217,7 @@ void FSPanelFace::onCommitRepeatsPerMeter() LLSelectedTE::getObjectScaleS(obj_scale_s, identical_scale_s); LLSelectedTE::getObjectScaleS(obj_scale_t, identical_scale_t); - if (gSavedSettings.getBOOL("SyncMaterialSettings")) + if (mCheckSyncMaterials->isAvailable() && gSavedSettings.getBOOL("SyncMaterialSettings")) { LLSelectMgr::getInstance()->selectionTexScaleAutofit(repeats_per_meter); @@ -4181,6 +4263,20 @@ void FSPanelFace::onCommitRepeatsPerMeter() } break; + case LLRender::BASECOLOR_MAP: + case LLRender::METALLIC_ROUGHNESS_MAP: + case LLRender::GLTF_NORMAL_MAP: + case LLRender::EMISSIVE_MAP: + case LLRender::NUM_TEXTURE_CHANNELS: + { + updateGLTFTextureTransform(material_type, [&](LLGLTFMaterial::TextureTransform* new_transform) + { + new_transform->mScale.mV[VX] = obj_scale_s * repeats_per_meter; + new_transform->mScale.mV[VY] = obj_scale_t * repeats_per_meter; + }); + } + break; + default: llassert(false); break; @@ -6002,6 +6098,23 @@ LLRender::eTexIndex FSPanelFace::getCurrentPBRChannel() const return LLRender::NUM_TEXTURE_CHANNELS; } +LLGLTFMaterial::TextureInfo FSPanelFace::getCurrentPBRType(LLRender::eTexIndex pbr_channel) const +{ + switch (pbr_channel) + { + case LLRender::GLTF_NORMAL_MAP: + return LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL; + case LLRender::BASECOLOR_MAP: + return LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR; + case LLRender::METALLIC_ROUGHNESS_MAP: + return LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS; + case LLRender::EMISSIVE_MAP: + return LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE; + default: + return LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; + } +} + void FSPanelFace::selectMaterialType(S32 material_type) { if (material_type == MATMEDIA_PBR) diff --git a/indra/newview/fspanelface.h b/indra/newview/fspanelface.h index 321db81995..0cc8f21168 100644 --- a/indra/newview/fspanelface.h +++ b/indra/newview/fspanelface.h @@ -378,6 +378,7 @@ private: S32 getCurrentMaterialType() const; LLRender::eTexIndex getCurrentMatChannel() const; LLRender::eTexIndex getCurrentPBRChannel() const; + LLGLTFMaterial::TextureInfo getCurrentPBRType(LLRender::eTexIndex pbr_channel) const; void selectMaterialType(S32 material_type); void selectMatChannel(LLRender::eTexIndex mat_channel); From adfa45f7a6cf4a3257243e90a5b86f1d85e9bf72 Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Tue, 1 Apr 2025 07:42:39 +1000 Subject: [PATCH 02/11] Force texture panel UI update when switching mat tab or channel tab to fix desync. --- indra/newview/fspanelface.cpp | 33 ++++++++++++++++++++++++++++++--- indra/newview/fspanelface.h | 2 ++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index bc18fa44e8..6fec148e99 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -626,6 +626,9 @@ void FSPanelFace::onMatTabChange() static S32 last_mat = -1; if( auto curr_mat = getCurrentMaterialType(); curr_mat != last_mat ) { + // Fixes some UI desync + updateUI(true); + LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(); LLViewerObject* objectp = node ? node->getObject() : NULL; if(objectp) @@ -654,6 +657,28 @@ void FSPanelFace::onMatTabChange() } } +void FSPanelFace::onMatChannelTabChange() +{ + // Fixes some UI desync + static S32 last_channel = -1; + if (auto curr_channel = getCurrentMatChannel(); curr_channel != last_channel) + { + last_channel = curr_channel; + updateUI(true); + } +} + +void FSPanelFace::onPBRChannelTabChange() +{ + // Fixes some UI desync + static S32 last_channel = -1; + if (auto curr_channel = getCurrentPBRChannel(); curr_channel != last_channel) + { + last_channel = curr_channel; + updateUI(true); + } +} + bool FSPanelFace::postBuild() { // @@ -752,6 +777,8 @@ bool FSPanelFace::postBuild() // hook up callbacks and do setup of all relevant UI elements here // mTabsPBRMatMedia->setCommitCallback(boost::bind(&FSPanelFace::onMatTabChange, this)); + mTabsMatChannel->setCommitCallback(boost::bind(&FSPanelFace::onMatChannelTabChange, this)); + mTabsPBRChannel->setCommitCallback(boost::bind(&FSPanelFace::onPBRChannelTabChange, this)); // common controls and parameters for Blinn-Phong and PBR mBtnCopyFaces->setCommitCallback(boost::bind(&FSPanelFace::onCopyFaces, this)); mBtnPasteFaces->setCommitCallback(boost::bind(&FSPanelFace::onPasteFaces, this)); @@ -912,9 +939,9 @@ bool FSPanelFace::postBuild() changePrecision(gSavedSettings.getS32("FSBuildToolDecimalPrecision")); - selectMaterialType(MATMEDIA_PBR); // TODO: add tab switching signal - selectMatChannel(LLRender::DIFFUSE_MAP); // TODO: add tab switching signal - selectPBRChannel(LLRender::NUM_TEXTURE_CHANNELS); // TODO: add tab switching signal + selectMaterialType(MATMEDIA_PBR); + selectMatChannel(LLRender::DIFFUSE_MAP); + selectPBRChannel(LLRender::NUM_TEXTURE_CHANNELS); return true; } diff --git a/indra/newview/fspanelface.h b/indra/newview/fspanelface.h index 0cc8f21168..a9b1667340 100644 --- a/indra/newview/fspanelface.h +++ b/indra/newview/fspanelface.h @@ -341,6 +341,8 @@ public: // public to give functors access -Zi LLTabContainer* mTabsMatChannel; void onMatTabChange(); + void onMatChannelTabChange(); + void onPBRChannelTabChange(); private: bool isAlpha() { return mIsAlpha; } From 53fa5a088163d3d32959e7029241bfc609ce6a3e Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Tue, 1 Apr 2025 07:43:23 +1000 Subject: [PATCH 03/11] Focus spinners when they are interacted with to improve UI sync. --- indra/newview/fspanelface.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index 6fec148e99..d3a2da30f6 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -3335,6 +3335,7 @@ void FSPanelFace::onCommitShinyColor() void FSPanelFace::onCommitAlpha() { + mCtrlColorTransp->setFocus(true); sendAlpha(); } @@ -3491,6 +3492,7 @@ void FSPanelFace::onCommitFullbright() void FSPanelFace::onCommitGlow() { + mCtrlGlow->setFocus(true); sendGlow(); } @@ -3602,6 +3604,7 @@ void FSPanelFace::onCommitPbr(const LLUICtrl* pbr_ctrl) } else if (pbr_ctrl == mAlphaPBR) { + mAlphaPBR->setFocus(true); mUnsavedChanges |= MATERIAL_BASE_COLOR_DIRTY; } else if (pbr_ctrl == mAlphaModePBR) @@ -3610,14 +3613,17 @@ void FSPanelFace::onCommitPbr(const LLUICtrl* pbr_ctrl) } else if (pbr_ctrl == mMaskCutoffPBR) { + mMaskCutoffPBR->setFocus(true); mUnsavedChanges |= MATERIAL_ALPHA_CUTOFF_DIRTY; } else if (pbr_ctrl == mMetallicFactorPBR) { + mMetallicFactorPBR->setFocus(true); mUnsavedChanges |= MATERIAL_METALLIC_ROUGHTNESS_METALNESS_DIRTY; } else if (pbr_ctrl == mRoughnessFactorPBR) { + mRoughnessFactorPBR->setFocus(true); mUnsavedChanges |= MATERIAL_METALLIC_ROUGHTNESS_ROUGHNESS_DIRTY; } } @@ -3930,6 +3936,7 @@ void FSPanelFace::syncOffsetY(FSPanelFace* self, F32 offsetV) void FSPanelFace::onCommitMaterialBumpyOffsetX() { + mCtrlBumpyOffsetU->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { syncOffsetX(this, getCurrentBumpyOffsetU()); @@ -3942,6 +3949,7 @@ void FSPanelFace::onCommitMaterialBumpyOffsetX() void FSPanelFace::onCommitMaterialBumpyOffsetY() { + mCtrlBumpyOffsetV->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { syncOffsetY(this, getCurrentBumpyOffsetV()); @@ -3954,6 +3962,7 @@ void FSPanelFace::onCommitMaterialBumpyOffsetY() void FSPanelFace::onCommitMaterialShinyOffsetX() { + mCtrlShinyOffsetU->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { syncOffsetX(this, getCurrentShinyOffsetU()); @@ -3966,6 +3975,7 @@ void FSPanelFace::onCommitMaterialShinyOffsetX() void FSPanelFace::onCommitMaterialShinyOffsetY() { + mCtrlShinyOffsetV->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { syncOffsetY(this, getCurrentShinyOffsetV()); @@ -3994,6 +4004,7 @@ void FSPanelFace::syncRepeatY(FSPanelFace* self, F32 scaleV) void FSPanelFace::onCommitMaterialBumpyScaleX() { + mCtrlBumpyScaleU->setFocus(true); F32 bumpy_scale_u = getCurrentBumpyScaleU(); if (isIdenticalPlanarTexgen()) { @@ -4013,6 +4024,7 @@ void FSPanelFace::onCommitMaterialBumpyScaleX() void FSPanelFace::onCommitMaterialBumpyScaleY() { + mCtrlBumpyScaleV->setFocus(true); F32 bumpy_scale_v = getCurrentBumpyScaleV(); if (isIdenticalPlanarTexgen()) { @@ -4032,6 +4044,7 @@ void FSPanelFace::onCommitMaterialBumpyScaleY() void FSPanelFace::onCommitMaterialShinyScaleX() { + mCtrlShinyScaleU->setFocus(true); F32 shiny_scale_u = getCurrentShinyScaleU(); if (isIdenticalPlanarTexgen()) { @@ -4051,6 +4064,7 @@ void FSPanelFace::onCommitMaterialShinyScaleX() void FSPanelFace::onCommitMaterialShinyScaleY() { + mCtrlShinyScaleV->setFocus(true); F32 shiny_scale_v = getCurrentShinyScaleV(); if (isIdenticalPlanarTexgen()) { @@ -4078,6 +4092,7 @@ void FSPanelFace::syncMaterialRot(FSPanelFace* self, F32 rot, int te) void FSPanelFace::onCommitMaterialBumpyRot() { + mCtrlBumpyRot->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { mCtrlTexRot->forceSetValue(LLSD(getCurrentBumpyRot())); @@ -4102,6 +4117,7 @@ void FSPanelFace::onCommitMaterialBumpyRot() void FSPanelFace::onCommitMaterialShinyRot() { + mCtrlShinyRot->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { mCtrlTexRot->forceSetValue(LLSD(getCurrentShinyRot())); @@ -4126,21 +4142,25 @@ void FSPanelFace::onCommitMaterialShinyRot() void FSPanelFace::onCommitMaterialGloss() { + mCtrlGlossiness->setFocus(true); LLSelectedTEMaterial::setSpecularLightExponent(this, getCurrentGlossiness()); } void FSPanelFace::onCommitMaterialEnv() { + mCtrlEnvironment->setFocus(true); LLSelectedTEMaterial::setEnvironmentIntensity(this, getCurrentEnvIntensity()); } void FSPanelFace::onCommitMaterialMaskCutoff() { + mCtrlMaskCutoff->setFocus(true); LLSelectedTEMaterial::setAlphaMaskCutoff(this, getCurrentAlphaMaskCutoff()); } void FSPanelFace::onCommitTextureScaleX() { + mCtrlTexScaleU->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { F32 bumpy_scale_u = (F32)mCtrlTexScaleU->getValue().asReal(); @@ -4159,6 +4179,7 @@ void FSPanelFace::onCommitTextureScaleX() void FSPanelFace::onCommitTextureScaleY() { + mCtrlTexScaleV->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { F32 bumpy_scale_v = (F32)mCtrlTexScaleV->getValue().asReal(); @@ -4177,6 +4198,7 @@ void FSPanelFace::onCommitTextureScaleY() void FSPanelFace::onCommitTextureRot() { + mCtrlTexRot->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { syncMaterialRot(this, (F32)mCtrlTexRot->getValue().asReal()); @@ -4191,6 +4213,7 @@ void FSPanelFace::onCommitTextureRot() void FSPanelFace::onCommitTextureOffsetX() { + mCtrlTexOffsetU->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { syncOffsetX(this, (F32)mCtrlTexOffsetU->getValue().asReal()); @@ -4204,6 +4227,7 @@ void FSPanelFace::onCommitTextureOffsetX() void FSPanelFace::onCommitTextureOffsetY() { + mCtrlTexOffsetV->setFocus(true); if (gSavedSettings.getBOOL("SyncMaterialSettings")) { syncOffsetY(this, (F32)mCtrlTexOffsetV->getValue().asReal()); @@ -4218,6 +4242,7 @@ void FSPanelFace::onCommitTextureOffsetY() // Commit the number of repeats per meter void FSPanelFace::onCommitRepeatsPerMeter() { + mCtrlRpt->setFocus(true); S32 materials_media = getCurrentMaterialType(); LLRender::eTexIndex material_channel = LLRender::DIFFUSE_MAP; LLGLTFMaterial::TextureInfo material_type = LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR; From 40365b72b4e57d3390f995a657505c66aa4432ec Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Tue, 1 Apr 2025 07:45:09 +1000 Subject: [PATCH 04/11] Made certain maps static so they aren't constantly recreated --- indra/newview/fspanelface.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index d3a2da30f6..5d4c130183 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -5294,7 +5294,7 @@ void FSPanelFace::updateGLTFTextureTransform(const LLGLTFMaterial::TextureInfo t void FSPanelFace::setMaterialOverridesFromSelection() { // TODO: move to .h -Zi - std::map spinner_suffixes{ + static std::map spinner_suffixes{ { LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_BASE_COLOR, "_Base" }, { LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_NORMAL, "_Normal" }, { LLGLTFMaterial::TextureInfo::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS, "_Metallic" }, @@ -5479,7 +5479,7 @@ bool FSPanelFace::Selection::compareSelection() void FSPanelFace::onCommitGLTFUVSpinner(const LLUICtrl* ctrl, const LLSD& user_data) { // TODO: put into .h -Zi - std::map types = + static std::map types = { { "all", LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT }, { "base", LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR }, From f3c1b68fe6e6cb8404c063a9bfe126c9b4af131a Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Tue, 1 Apr 2025 09:21:51 +1000 Subject: [PATCH 05/11] Fixed issue when channel tab is being selected in code --- indra/newview/fspanelface.cpp | 11 +++++++++-- indra/newview/fspanelface.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index 5d4c130183..72f082ab6b 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -664,8 +664,10 @@ void FSPanelFace::onMatChannelTabChange() if (auto curr_channel = getCurrentMatChannel(); curr_channel != last_channel) { last_channel = curr_channel; - updateUI(true); + if (!mSetChannelTab) + updateUI(true); } + mSetChannelTab = false; } void FSPanelFace::onPBRChannelTabChange() @@ -675,8 +677,10 @@ void FSPanelFace::onPBRChannelTabChange() if (auto curr_channel = getCurrentPBRChannel(); curr_channel != last_channel) { last_channel = curr_channel; - updateUI(true); + if (!mSetChannelTab) + updateUI(true); } + mSetChannelTab = false; } bool FSPanelFace::postBuild() @@ -779,6 +783,7 @@ bool FSPanelFace::postBuild() mTabsPBRMatMedia->setCommitCallback(boost::bind(&FSPanelFace::onMatTabChange, this)); mTabsMatChannel->setCommitCallback(boost::bind(&FSPanelFace::onMatChannelTabChange, this)); mTabsPBRChannel->setCommitCallback(boost::bind(&FSPanelFace::onPBRChannelTabChange, this)); + // common controls and parameters for Blinn-Phong and PBR mBtnCopyFaces->setCommitCallback(boost::bind(&FSPanelFace::onCopyFaces, this)); mBtnPasteFaces->setCommitCallback(boost::bind(&FSPanelFace::onPasteFaces, this)); @@ -6186,6 +6191,7 @@ void FSPanelFace::selectMaterialType(S32 material_type) void FSPanelFace::selectMatChannel(LLRender::eTexIndex mat_channel) { + mSetChannelTab = true; if (mat_channel == LLRender::NORMAL_MAP) { mTabsMatChannel->selectTabByName("panel_blinn_phong_normal"); @@ -6202,6 +6208,7 @@ void FSPanelFace::selectMatChannel(LLRender::eTexIndex mat_channel) void FSPanelFace::selectPBRChannel(LLRender::eTexIndex pbr_channel) { + mSetChannelTab = true; if (pbr_channel == LLRender::GLTF_NORMAL_MAP) { mTabsPBRChannel->selectTabByName("panel_pbr_transforms_normal"); diff --git a/indra/newview/fspanelface.h b/indra/newview/fspanelface.h index a9b1667340..53604fa23d 100644 --- a/indra/newview/fspanelface.h +++ b/indra/newview/fspanelface.h @@ -399,6 +399,7 @@ private: // private Tab controls LLTabContainer* mTabsPBRMatMedia; LLTabContainer* mTabsPBRChannel; + bool mSetChannelTab = false; // common controls and parameters for Blinn-Phong and PBR LLButton* mBtnCopyFaces; From a14d0048a5c419db950bd4385d2e081a3d11e747 Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Tue, 1 Apr 2025 09:37:57 +1000 Subject: [PATCH 06/11] Added missing spinner focuses for PBR to improve sync. --- indra/newview/fspanelface.cpp | 3 ++- indra/newview/fspanelface.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index 72f082ab6b..d5f67221db 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -5481,7 +5481,7 @@ bool FSPanelFace::Selection::compareSelection() return selection_changed; } -void FSPanelFace::onCommitGLTFUVSpinner(const LLUICtrl* ctrl, const LLSD& user_data) +void FSPanelFace::onCommitGLTFUVSpinner(LLUICtrl* ctrl, const LLSD& user_data) { // TODO: put into .h -Zi static std::map types = @@ -5505,6 +5505,7 @@ void FSPanelFace::onCommitGLTFUVSpinner(const LLUICtrl* ctrl, const LLSD& user_d const std::string& spinner_name = ctrl->getName(); const float value = (F32)ctrl->getValue().asReal(); + ctrl->setFocus(true); if (LLStringUtil::startsWith(spinner_name, "gltfTextureScaleU")) { diff --git a/indra/newview/fspanelface.h b/indra/newview/fspanelface.h index 53604fa23d..0321f0b6ea 100644 --- a/indra/newview/fspanelface.h +++ b/indra/newview/fspanelface.h @@ -284,7 +284,7 @@ protected: static void syncMaterialRot(FSPanelFace* self, F32 rot, int te = -1); // unify all GLTF spinners with no switching around required -Zi - void onCommitGLTFUVSpinner(const LLUICtrl* ctrl, const LLSD& user_data); + void onCommitGLTFUVSpinner(LLUICtrl* ctrl, const LLSD& user_data); void onClickBtnSelectSameTexture(const LLUICtrl* ctrl, const LLSD& user_data); // Find all faces with same texture void onShowFindAllButton(LLUICtrl* ctrl, const LLSD& user_data); // Find all faces with same texture From 5b42942062d89a14aa7ffab2c4ea817161d92175 Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Wed, 2 Apr 2025 00:08:04 +1000 Subject: [PATCH 07/11] Fixed rpm on PBR not working on non 1:1 scaled objects. --- indra/newview/fspanelface.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index d5f67221db..c22302c586 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -171,8 +171,11 @@ void getSelectedGLTFMaterialMaxRepeats(LLGLTFMaterial::TextureInfo channel, F32& if (!render_material) return 0.f; - F32 repeats_u = render_material->mTextureTransform[mChannel].mScale[VX] / object->getScale().mV[VX]; - F32 repeats_v = render_material->mTextureTransform[mChannel].mScale[VY] / object->getScale().mV[VY]; + U32 s_axis = VX; + U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); + F32 repeats_u = render_material->mTextureTransform[mChannel].mScale[VX] / object->getScale().mV[s_axis]; + F32 repeats_v = render_material->mTextureTransform[mChannel].mScale[VY] / object->getScale().mV[t_axis]; return llmax(repeats_u, repeats_v); } From 0f2cdbd84942abc52d563f593964dd735f12d6e9 Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Wed, 2 Apr 2025 07:04:39 +1000 Subject: [PATCH 08/11] Fixed PBR rpm slider not updating properly when focused --- indra/newview/fspanelface.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index c22302c586..62ac34081e 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -2181,7 +2181,7 @@ void FSPanelFace::updateUI(bool force_set_values /*false*/) bool repeats_tentative = !identical_repeats; - if (force_set_values) + if (force_set_values || material_selection == MATMEDIA_PBR) { //onCommit, previosly edited element updates related ones mCtrlRpt->forceSetValue(editable ? repeats : 1.0f); @@ -5405,6 +5405,16 @@ void FSPanelFace::setMaterialOverridesFromSelection() gltfCtrlTextureRotation->setTentative(!rotation_same); gltfCtrlTextureOffsetU->setTentative(!offset_u_same); gltfCtrlTextureOffsetV->setTentative(!offset_v_same); + + // Fixes some UI desync + if (getCurrentMaterialType() == MATMEDIA_PBR) + { + F32 repeats = 1.f; + bool identical = false; + getSelectedGLTFMaterialMaxRepeats(getPBRDropChannel(), repeats, identical); + mCtrlRpt->forceSetValue(repeats); + mCtrlRpt->setTentative(!identical); + } } void FSPanelFace::Selection::connect() From 1ec05da4aa480fb25d7f531354aabde78b6ab36e Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Wed, 2 Apr 2025 18:13:28 +1000 Subject: [PATCH 09/11] Fixed incorrect rpm scaling due to getting the wrong scale t value. --- indra/newview/fspanelface.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index 62ac34081e..e160aeb8dd 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -4275,7 +4275,7 @@ void FSPanelFace::onCommitRepeatsPerMeter() bool identical_scale_t = false; LLSelectedTE::getObjectScaleS(obj_scale_s, identical_scale_s); - LLSelectedTE::getObjectScaleS(obj_scale_t, identical_scale_t); + LLSelectedTE::getObjectScaleT(obj_scale_t, identical_scale_t); if (mCheckSyncMaterials->isAvailable() && gSavedSettings.getBOOL("SyncMaterialSettings")) { @@ -5764,6 +5764,7 @@ void FSPanelFace::LLSelectedTEMaterial::getMaxSpecularRepeats(F32& repeats, bool LLMaterial* mat = object->getTEref(face).getMaterialParams().get(); U32 s_axis = VX; U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); F32 repeats_s = 1.0f; F32 repeats_t = 1.0f; if (mat) @@ -5789,6 +5790,7 @@ void FSPanelFace::LLSelectedTEMaterial::getMaxNormalRepeats(F32& repeats, bool& LLMaterial* mat = object->getTEref(face).getMaterialParams().get(); U32 s_axis = VX; U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); F32 repeats_s = 1.0f; F32 repeats_t = 1.0f; if (mat) From 70680d944232a3774ae9d547deaa70bb18f17e0a Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Thu, 3 Apr 2025 02:32:31 +1000 Subject: [PATCH 10/11] All PBR and Blinn-Phong's normal and specular now scale correctly when using RPM on more than 1 face, such as the whole object. --- indra/newview/fspanelface.cpp | 127 +++++++++++++++++++++++++++++++--- indra/newview/fspanelface.h | 4 ++ 2 files changed, 120 insertions(+), 11 deletions(-) diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index e160aeb8dd..3022c83ead 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -134,6 +134,36 @@ void FSPanelFace::updateSelectedGLTFMaterials(std::functiongetSelection()->applyToTEs(&select_func); } +void FSPanelFace::updateSelectedGLTFMaterialsWithScale(std::function func) +{ + struct LLSelectedTEGLTFMaterialFunctor : public LLSelectedTEFunctor + { + LLSelectedTEGLTFMaterialFunctor(std::function func) : mFunc(func) {} + virtual ~LLSelectedTEGLTFMaterialFunctor() {}; + bool apply(LLViewerObject* object, S32 face) override + { + LLGLTFMaterial new_override; + const LLTextureEntry* tep = object->getTE(face); + if (tep->getGLTFMaterialOverride()) + { + new_override = *tep->getGLTFMaterialOverride(); + } + + U32 s_axis = VX; + U32 t_axis = VY; + LLPrimitive::getTESTAxes(face, &s_axis, &t_axis); + mFunc(&new_override, object->getScale().mV[s_axis], object->getScale().mV[t_axis]); + LLGLTFMaterialList::queueModify(object, face, &new_override); + + return true; + } + + std::function mFunc; + } select_func(func); + + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&select_func); +} + template void readSelectedGLTFMaterial(std::function func, T& value, bool& identical, bool has_tolerance, T tolerance) { @@ -4284,14 +4314,12 @@ void FSPanelFace::onCommitRepeatsPerMeter() mCtrlBumpyScaleU->setValue(obj_scale_s * repeats_per_meter); mCtrlBumpyScaleV->setValue(obj_scale_t * repeats_per_meter); - LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter); - LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter); + LLSelectedTEMaterial::selectionNormalScaleAutofit(this, repeats_per_meter); mCtrlShinyScaleU->setValue(obj_scale_s * repeats_per_meter); mCtrlShinyScaleV->setValue(obj_scale_t * repeats_per_meter); - LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter); - LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter); + LLSelectedTEMaterial::selectionSpecularScaleAutofit(this, repeats_per_meter); } else { @@ -4308,8 +4336,7 @@ void FSPanelFace::onCommitRepeatsPerMeter() mCtrlBumpyScaleU->setValue(obj_scale_s * repeats_per_meter); mCtrlBumpyScaleV->setValue(obj_scale_t * repeats_per_meter); - LLSelectedTEMaterial::setNormalRepeatX(this, obj_scale_s * repeats_per_meter); - LLSelectedTEMaterial::setNormalRepeatY(this, obj_scale_t * repeats_per_meter); + LLSelectedTEMaterial::selectionNormalScaleAutofit(this, repeats_per_meter); } break; @@ -4318,8 +4345,7 @@ void FSPanelFace::onCommitRepeatsPerMeter() mCtrlShinyScaleU->setValue(obj_scale_s * repeats_per_meter); mCtrlShinyScaleV->setValue(obj_scale_t * repeats_per_meter); - LLSelectedTEMaterial::setSpecularRepeatX(this, obj_scale_s * repeats_per_meter); - LLSelectedTEMaterial::setSpecularRepeatY(this, obj_scale_t * repeats_per_meter); + LLSelectedTEMaterial::selectionSpecularScaleAutofit(this, repeats_per_meter); } break; @@ -4329,10 +4355,10 @@ void FSPanelFace::onCommitRepeatsPerMeter() case LLRender::EMISSIVE_MAP: case LLRender::NUM_TEXTURE_CHANNELS: { - updateGLTFTextureTransform(material_type, [&](LLGLTFMaterial::TextureTransform* new_transform) + updateGLTFTextureTransformWithScale(material_type, [&](LLGLTFMaterial::TextureTransform* new_transform, F32 scale_s, F32 scale_t) { - new_transform->mScale.mV[VX] = obj_scale_s * repeats_per_meter; - new_transform->mScale.mV[VY] = obj_scale_t * repeats_per_meter; + new_transform->mScale.mV[VX] = scale_s * repeats_per_meter; + new_transform->mScale.mV[VY] = scale_t * repeats_per_meter; }); } break; @@ -5299,6 +5325,29 @@ void FSPanelFace::updateGLTFTextureTransform(const LLGLTFMaterial::TextureInfo t } } +void FSPanelFace::updateGLTFTextureTransformWithScale(const LLGLTFMaterial::TextureInfo texture_info, std::function edit) +{ + if (texture_info == LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT) + { + updateSelectedGLTFMaterialsWithScale([&](LLGLTFMaterial* new_override, const F32 scale_s, const F32 scale_t) + { + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[(LLGLTFMaterial::TextureInfo)i]; + edit(&new_transform, scale_s, scale_t); + } + }); + } + else + { + updateSelectedGLTFMaterialsWithScale([&](LLGLTFMaterial* new_override, const F32 scale_s, const F32 scale_t) + { + LLGLTFMaterial::TextureTransform& new_transform = new_override->mTextureTransform[texture_info]; + edit(&new_transform, scale_s, scale_t); + }); + } +} + void FSPanelFace::setMaterialOverridesFromSelection() { // TODO: move to .h -Zi @@ -5838,6 +5887,62 @@ void FSPanelFace::LLSelectedTEMaterial::getCurrentDiffuseAlphaMode(U8& diffuse_a identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &get_diff_mode, diffuse_alpha_mode); } +void FSPanelFace::LLSelectedTEMaterial::selectionNormalScaleAutofit(FSPanelFace* panel_face, F32 repeats_per_meter) +{ + struct f : public LLSelectedTEFunctor + { + FSPanelFace* mFacePanel; + F32 mRepeatsPerMeter; + f(FSPanelFace* face_panel, const F32& repeats_per_meter) : mFacePanel(face_panel), mRepeatsPerMeter(repeats_per_meter) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // Compute S,T to axis mapping + U32 s_axis, t_axis; + if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis)) + return true; + + F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter; + F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter; + + setNormalRepeatX(mFacePanel, new_s, te); + setNormalRepeatY(mFacePanel, new_t, te); + } + return true; + } + } setfunc(panel_face, repeats_per_meter); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); +} + +void FSPanelFace::LLSelectedTEMaterial::selectionSpecularScaleAutofit(FSPanelFace* panel_face, F32 repeats_per_meter) +{ + struct f : public LLSelectedTEFunctor + { + FSPanelFace* mFacePanel; + F32 mRepeatsPerMeter; + f(FSPanelFace* face_panel, const F32& repeats_per_meter) : mFacePanel(face_panel), mRepeatsPerMeter(repeats_per_meter) {} + bool apply(LLViewerObject* object, S32 te) + { + if (object->permModify()) + { + // Compute S,T to axis mapping + U32 s_axis, t_axis; + if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis)) + return true; + + F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter; + F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter; + + setSpecularRepeatX(mFacePanel, new_s, te); + setSpecularRepeatY(mFacePanel, new_t, te); + } + return true; + } + } setfunc(panel_face, repeats_per_meter); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); +} + void FSPanelFace::LLSelectedTE::getObjectScaleS(F32& scale_s, bool& identical) { struct LLSelectedTEGetObjectScaleS : public LLSelectedTEGetFunctor diff --git a/indra/newview/fspanelface.h b/indra/newview/fspanelface.h index 0321f0b6ea..5dc8b72865 100644 --- a/indra/newview/fspanelface.h +++ b/indra/newview/fspanelface.h @@ -635,7 +635,9 @@ private: void updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool& has_faces_without_pbr, bool force_set_values); void updateSelectedGLTFMaterials(std::function func); + void updateSelectedGLTFMaterialsWithScale(std::function func); void updateGLTFTextureTransform(const LLGLTFMaterial::TextureInfo texture_info, std::function edit); + void updateGLTFTextureTransformWithScale(const LLGLTFMaterial::TextureInfo texture_info, std::function edit); void setMaterialOverridesFromSelection(); @@ -726,6 +728,8 @@ public: static void getMaxSpecularRepeats(F32& repeats, bool& identical); static void getMaxNormalRepeats(F32& repeats, bool& identical); static void getCurrentDiffuseAlphaMode(U8& diffuse_alpha_mode, bool& identical, bool diffuse_texture_has_alpha); + static void selectionNormalScaleAutofit(FSPanelFace* panel_face, F32 repeats_per_meter); + static void selectionSpecularScaleAutofit(FSPanelFace* panel_face, F32 repeats_per_meter); FS_DEF_GET_MAT_STATE(LLUUID,const LLUUID&,getNormalID,LLUUID::null, false, LLUUID::null); FS_DEF_GET_MAT_STATE(LLUUID,const LLUUID&,getSpecularID,LLUUID::null, false, LLUUID::null); From b67139d3017167fe9f5f9809f2007e3a1bdb65d1 Mon Sep 17 00:00:00 2001 From: Hecklezz Date: Thu, 3 Apr 2025 05:48:53 +1000 Subject: [PATCH 11/11] Fixed texture pannel flip button hitbox --- .../default/xui/en/panel_fs_tools_texture.xml | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/indra/newview/skins/default/xui/en/panel_fs_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_fs_tools_texture.xml index 4b0d52139c..faa99fc981 100644 --- a/indra/newview/skins/default/xui/en/panel_fs_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_fs_tools_texture.xml @@ -329,7 +329,7 @@ top_pad="8" name="tabs_pbr_transforms" label_pad_left="0" - tab_max_width="100" + tab_max_width="110" tab_min_width="30" tab_position="top" tab_height="20" @@ -353,7 +353,7 @@ top="0" mouse_opaque="false" name="pbr_transforms_all_scale" - width="90" + width="110" height="70" > @@ -386,7 +386,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleU_All" initial_value="0" min_val="-10000" @@ -435,7 +435,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" initial_value="0" min_val="-10000" max_val="10000" @@ -613,7 +613,7 @@ top="0" mouse_opaque="false" name="pbr_transforms_base_color_scale" - width="90" + width="110" height="70" > @@ -646,7 +646,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleU_Base" initial_value="0" min_val="-10000" @@ -695,7 +695,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleV_Base" initial_value="0" min_val="-10000" @@ -872,7 +872,7 @@ top="0" mouse_opaque="false" name="pbr_transforms_normal_scale" - width="90" + width="110" height="70" > @@ -905,7 +905,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleU_Normal" initial_value="0" min_val="-10000" @@ -954,7 +954,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleV_Normal" initial_value="0" min_val="-10000" @@ -1131,7 +1131,7 @@ top="0" mouse_opaque="false" name="pbr_transforms_orm_scale" - width="90" + width="110" height="70" > @@ -1164,7 +1164,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleU_Metallic" initial_value="0" min_val="-10000" @@ -1213,7 +1213,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleV_Metallic" initial_value="0" min_val="-10000" @@ -1390,7 +1390,7 @@ top="0" mouse_opaque="false" name="pbr_transforms_emissive_scale" - width="90" + width="110" height="70" > @@ -1423,7 +1423,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleU_Emissive" initial_value="0" min_val="-10000" @@ -1472,7 +1472,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="gltfTextureScaleV_Emissive" initial_value="0" min_val="-10000" @@ -2142,7 +2142,7 @@ top_pad="4" right="-2" name="tabs_blinn_phong_uvs" - tab_max_width="100" + tab_max_width="110" tab_min_width="40" tab_position="top" tab_height="20" @@ -2162,7 +2162,7 @@ layout="topleft" left="4" top="0" - width="90" + width="110" height="70" mouse_opaque="false" name="transforms_diffuse_scale" @@ -2197,7 +2197,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="TexScaleU" initial_value="0" min_val="-10000" @@ -2242,7 +2242,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="TexScaleV" initial_value="0" min_val="-10000" @@ -2402,7 +2402,7 @@ layout="topleft" left="4" top="0" - width="90" + width="110" height="70" mouse_opaque="false" name="transforms_normal_scale" @@ -2437,7 +2437,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="bumpyScaleU" initial_value="0" min_val="-10000" @@ -2482,7 +2482,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="bumpyScaleV" initial_value="0" min_val="-10000" @@ -2642,7 +2642,7 @@ layout="topleft" left="4" top="0" - width="90" + width="110" height="70" mouse_opaque="false" name="transforms_specular_scale" @@ -2677,7 +2677,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="shinyScaleU" initial_value="0" min_val="-10000" @@ -2722,7 +2722,7 @@ layout="topleft" left_pad="0" height="19" - right="-12" + right="-32" name="shinyScaleV" initial_value="0" min_val="-10000"