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);