diff options
Diffstat (limited to 'indra/newview/llselectmgr.cpp')
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 162 |
1 files changed, 140 insertions, 22 deletions
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 1876cd3086..758e91f6c9 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -252,6 +252,7 @@ LLSelectMgr::LLSelectMgr() LLSelectMgr::~LLSelectMgr() { clearSelections(); + mSlectionLodModChangedConnection.disconnect(); } void LLSelectMgr::clearSelections() @@ -1995,9 +1996,95 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id) asset_id = BLANK_MATERIAL_ASSET_ID; } } + + // If this face already has the target material ID, do nothing. + // This prevents re-sending the same ID on OK, which can cause the server + // to drop overrides when queueApply is invoked with the OLD id. + if (objectp->getRenderMaterialID(te) == asset_id) + { + return true; + } + + // Preserve existing texture transforms when switching to PBR material + LLTextureEntry* tep = objectp->getTE(te); + bool should_preserve_transforms = false; + LLGLTFMaterial* preserved_override = nullptr; + + if (tep && asset_id.notNull()) + { + // Only preserve transforms from existing GLTF material override + // Do not fall back to texture entry transforms when switching between PBR materials + LLGLTFMaterial* existing_override = tep->getGLTFMaterialOverride(); + if (existing_override) + { + // Check if existing override has non-default transforms + const LLGLTFMaterial::TextureTransform& existing_transform = existing_override->mTextureTransform[0]; + const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + + if (existing_transform.mScale != default_transform.mScale || + existing_transform.mOffset != default_transform.mOffset || + existing_transform.mRotation != default_transform.mRotation) + { + // Preserve non-default transforms from current PBR material + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + preserved_override->mTextureTransform[i].mScale = existing_transform.mScale; + preserved_override->mTextureTransform[i].mOffset = existing_transform.mOffset; + preserved_override->mTextureTransform[i].mRotation = existing_transform.mRotation; + } + should_preserve_transforms = true; + } + // If existing override has default transforms, don't preserve anything + } + else + { + // No existing PBR material override - check texture entry transforms + // This handles the case of switching from Blinn-Phong to PBR material + F32 existing_scale_s, existing_scale_t, existing_offset_s, existing_offset_t, existing_rotation; + tep->getScale(&existing_scale_s, &existing_scale_t); + tep->getOffset(&existing_offset_s, &existing_offset_t); + existing_rotation = tep->getRotation(); + + const LLGLTFMaterial::TextureTransform& default_transform = LLGLTFMaterial::TextureTransform(); + if (existing_scale_s != default_transform.mScale.mV[0] || existing_scale_t != default_transform.mScale.mV[1] || + existing_offset_s != default_transform.mOffset.mV[0] || existing_offset_t != default_transform.mOffset.mV[1] || + existing_rotation != default_transform.mRotation) + { + // Preserve non-default transforms from texture entry + preserved_override = new LLGLTFMaterial(); + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + { + LLVector2 pbr_scale, pbr_offset; + F32 pbr_rotation; + LLGLTFMaterial::convertTextureTransformToPBR( + existing_scale_s, existing_scale_t, + existing_offset_s, existing_offset_t, + existing_rotation, + pbr_scale, pbr_offset, pbr_rotation); + preserved_override->mTextureTransform[i].mScale = pbr_scale; + preserved_override->mTextureTransform[i].mOffset = pbr_offset; + preserved_override->mTextureTransform[i].mRotation = pbr_rotation; + } + should_preserve_transforms = true; + } + } + } + objectp->clearTEWaterExclusion(te); // Blank out most override data on the object and send to server - objectp->setRenderMaterialID(te, asset_id); + if (should_preserve_transforms && preserved_override) + { + // Apply material with preserved transforms + LLGLTFMaterialList::queueApply(objectp, te, asset_id, preserved_override); + // Update local state + objectp->setRenderMaterialID(te, asset_id, false, true); + tep->setGLTFMaterialOverride(preserved_override); + } + else + { + objectp->setRenderMaterialID(te, asset_id); + } return true; } @@ -2248,6 +2335,7 @@ void LLSelectMgr::selectionRevertGLTFMaterials() { // Restore base material LLUUID asset_id = nodep->mSavedGLTFMaterialIds[te]; + LLUUID old_asset_id = objectp->getRenderMaterialID(te); // Update material locally objectp->setRenderMaterialID(te, asset_id, false /*wait for LLGLTFMaterialList update*/); @@ -2258,18 +2346,15 @@ void LLSelectMgr::selectionRevertGLTFMaterials() objectp->setTEGLTFMaterialOverride(te, material); } - // Enqueue update to server - if (asset_id.notNull() && material) + if (asset_id.isNull() || !material) { - // Restore overrides and base material - LLGLTFMaterialList::queueApply(objectp, te, asset_id, material); + //blank override out + LLGLTFMaterialList::queueApply(objectp, te, asset_id); } else { - //blank override out - LLGLTFMaterialList::queueApply(objectp, te, asset_id); + LLGLTFMaterialList::queueApply(objectp, te, asset_id, material); } - } return true; } @@ -3139,22 +3224,46 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch) F32 scale_x = 1; F32 scale_y = 1; + F32 offset_x = 0; + F32 offset_y = 0; - for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) + if (te_num < selectNode->mGLTFScaleRatios.size()) { - LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i]; - - if (planar) - { - scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis]; - scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis]; - } - else + for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { - scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis]; - scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis]; + LLVector3 scale_ratio = selectNode->mGLTFScaleRatios[te_num][i]; + + if (planar) + { + scale_x = scale_ratio.mV[s_axis] / object_scale.mV[s_axis]; + scale_y = scale_ratio.mV[t_axis] / object_scale.mV[t_axis]; + } + else + { + scale_x = scale_ratio.mV[s_axis] * object_scale.mV[s_axis]; + scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis]; + } + material->mTextureTransform[i].mScale.set(scale_x, scale_y); + + LLVector2 scales = selectNode->mGLTFScales[te_num][i]; + LLVector2 offsets = selectNode->mGLTFOffsets[te_num][i]; + F64 int_part = 0; + offset_x = (F32)modf((offsets[VX] + (scales[VX] - scale_x)) / 2, &int_part); + if (offset_x < 0) + { + offset_x++; + } + offset_y = (F32)modf((offsets[VY] + (scales[VY] - scale_y)) / 2, &int_part); + if (offset_y < 0) + { + offset_y++; + } + material->mTextureTransform[i].mOffset.set(offset_x, offset_y); } - material->mTextureTransform[i].mScale.set(scale_x, scale_y); + } + else + { + llassert(false); // make sure mGLTFScaleRatios is filled } const LLGLTFMaterial* base_material = tep->getGLTFMaterial(); @@ -6507,7 +6616,7 @@ void LLSelectMgr::renderSilhouettes(bool for_hud) gGL.popMatrix(); gGL.popMatrix(); - glLineWidth(1.f); + //glLineWidth(1.f); #if GL_VERSION_1_1 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif @@ -6909,10 +7018,11 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) { mTextureScaleRatios.clear(); mGLTFScaleRatios.clear(); + mGLTFScales.clear(); + mGLTFOffsets.clear(); if (mObject.notNull()) { - LLVector3 scale = mObject->getScale(); for (U8 i = 0; i < mObject->getNumTEs(); i++) @@ -6949,6 +7059,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) F32 scale_x = 1; F32 scale_y = 1; std::vector<LLVector3> material_v_vec; + std::vector<LLVector2> material_scales_vec; + std::vector<LLVector2> material_offset_vec; for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i) { if (material) @@ -6956,12 +7068,16 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i]; scale_x = transform.mScale[VX]; scale_y = transform.mScale[VY]; + material_scales_vec.push_back(transform.mScale); + material_offset_vec.push_back(transform.mOffset); } else { // Not having an override doesn't mean that there is no material scale_x = 1; scale_y = 1; + material_scales_vec.emplace_back(scale_x, scale_y); + material_offset_vec.emplace_back(0.f, 0.f); } if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR) @@ -6977,6 +7093,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query) material_v_vec.push_back(material_v); } mGLTFScaleRatios.push_back(material_v_vec); + mGLTFScales.push_back(material_scales_vec); + mGLTFOffsets.push_back(material_offset_vec); } } } |
