Merge branch 'release/2025.07' into project/mac_universal
commit
dd1113ba2b
|
|
@ -42,7 +42,7 @@ jobs:
|
||||||
needs: setup
|
needs: setup
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
runner: ${{ fromJson((github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/Second_Life')) && '["windows-large","macos-15-xlarge"]' || '["windows-latest","macos-15"]') }}
|
runner: ${{ fromJson((github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/Second_Life')) && '["windows-large","macos-15-xlarge"]' || '["windows-2022","macos-15"]') }}
|
||||||
configuration: ${{ fromJson(needs.setup.outputs.configurations) }}
|
configuration: ${{ fromJson(needs.setup.outputs.configurations) }}
|
||||||
runs-on: ${{ matrix.runner }}
|
runs-on: ${{ matrix.runner }}
|
||||||
outputs:
|
outputs:
|
||||||
|
|
@ -306,7 +306,7 @@ jobs:
|
||||||
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
|
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
|
||||||
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
|
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
|
||||||
needs: build
|
needs: build
|
||||||
runs-on: windows-latest
|
runs-on: windows-2022
|
||||||
steps:
|
steps:
|
||||||
- name: Sign and package Windows viewer
|
- name: Sign and package Windows viewer
|
||||||
if: env.AZURE_KEY_VAULT_URI && env.AZURE_CERT_NAME && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET && env.AZURE_TENANT_ID
|
if: env.AZURE_KEY_VAULT_URI && env.AZURE_CERT_NAME && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET && env.AZURE_TENANT_ID
|
||||||
|
|
|
||||||
|
|
@ -3765,7 +3765,7 @@ bool LLNormalTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& w
|
||||||
{
|
{
|
||||||
height = 0;
|
height = 0;
|
||||||
width = 0;
|
width = 0;
|
||||||
if (num_chars > 0)
|
if (num_chars > 0 && (mStart + first_char >= 0))
|
||||||
{
|
{
|
||||||
height = mFontHeight;
|
height = mFontHeight;
|
||||||
const LLWString &text = getWText();
|
const LLWString &text = getWText();
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@
|
||||||
#include "lllocationhistory.h"
|
#include "lllocationhistory.h"
|
||||||
#include "llgltfmateriallist.h"
|
#include "llgltfmateriallist.h"
|
||||||
#include "llimageworker.h"
|
#include "llimageworker.h"
|
||||||
|
#include "llregex.h"
|
||||||
|
|
||||||
#include "llloginflags.h"
|
#include "llloginflags.h"
|
||||||
#include "llmd5.h"
|
#include "llmd5.h"
|
||||||
|
|
@ -2558,6 +2559,27 @@ void release_notes_coro(const std::string url)
|
||||||
LLWeb::loadURLInternal(url);
|
LLWeb::loadURLInternal(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void validate_release_notes_coro(const std::string url)
|
||||||
|
{
|
||||||
|
LLVersionInfo& versionInfo(LLVersionInfo::instance());
|
||||||
|
const boost::regex version_regex(R"(\b\d+\.\d+\.\d+\.\d+\b)");
|
||||||
|
|
||||||
|
if (url.find(versionInfo.getVersion()) == std::string::npos // has no our build version
|
||||||
|
&& ll_regex_search(url, version_regex)) // has any version
|
||||||
|
{
|
||||||
|
LL_INFOS() << "Received release notes url \"" << url << "\" wwith mismatching build, falling back to locally generated url" << LL_ENDL;
|
||||||
|
// Updater only provides notes for a most recent version, if it is not
|
||||||
|
// the current one, fall back to the hardcoded URL.
|
||||||
|
LLSD info(LLAppViewer::instance()->getViewerInfo());
|
||||||
|
std::string alt_url = info["VIEWER_RELEASE_NOTES_URL"].asString();
|
||||||
|
release_notes_coro(alt_url);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
release_notes_coro(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if user is running a new version of the viewer.
|
* Check if user is running a new version of the viewer.
|
||||||
* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting.
|
* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting.
|
||||||
|
|
@ -2591,7 +2613,7 @@ void show_release_notes_if_required()
|
||||||
"showrelnotes",
|
"showrelnotes",
|
||||||
[](const LLSD& url) {
|
[](const LLSD& url) {
|
||||||
LLCoros::instance().launch("releaseNotesCoro",
|
LLCoros::instance().launch("releaseNotesCoro",
|
||||||
boost::bind(&release_notes_coro, url.asString()));
|
boost::bind(&validate_release_notes_coro, url.asString()));
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,7 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
|
||||||
mOnUpdateImageStatsCallback(NULL),
|
mOnUpdateImageStatsCallback(NULL),
|
||||||
mBakeTextureEnabled(false),
|
mBakeTextureEnabled(false),
|
||||||
mLocalTextureEnabled(false),
|
mLocalTextureEnabled(false),
|
||||||
|
mNoCopyTextureSelected(false),
|
||||||
mInventoryPickType(pick_type)
|
mInventoryPickType(pick_type)
|
||||||
{
|
{
|
||||||
setTentative(tentative);
|
setTentative(tentative);
|
||||||
|
|
@ -263,6 +264,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
|
||||||
|
|
||||||
if (set_selection)
|
if (set_selection)
|
||||||
{
|
{
|
||||||
|
// This is going to cause a callback
|
||||||
mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
|
mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -597,7 +599,6 @@ bool LLFloaterTexturePicker::postBuild()
|
||||||
refreshInventoryFilter();
|
refreshInventoryFilter();
|
||||||
|
|
||||||
mInventoryPanel->setFilterPermMask(mImmediateFilterPermMask);
|
mInventoryPanel->setFilterPermMask(mImmediateFilterPermMask);
|
||||||
mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
|
|
||||||
mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
|
mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
|
||||||
|
|
||||||
// Disable auto selecting first filtered item because it takes away
|
// Disable auto selecting first filtered item because it takes away
|
||||||
|
|
@ -616,8 +617,25 @@ bool LLFloaterTexturePicker::postBuild()
|
||||||
|
|
||||||
if(!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL)
|
if(!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL)
|
||||||
{
|
{
|
||||||
mInventoryPanel->setSelection(findItemID(mImageAssetID, false), TAKE_FOCUS_NO);
|
LLViewerInventoryItem* itemp = findInvItem(mImageAssetID, false);
|
||||||
|
LLUUID item_id;
|
||||||
|
if (itemp)
|
||||||
|
{
|
||||||
|
item_id = itemp->getUUID();
|
||||||
|
}
|
||||||
|
|
||||||
|
mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
|
||||||
|
|
||||||
|
if (item_id.notNull() && itemp)
|
||||||
|
{
|
||||||
|
if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
|
||||||
|
{
|
||||||
|
mNoCopyTextureSelected = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// Don't call before setSelection, setSelection will mark view as dirty
|
||||||
|
mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));
|
||||||
}
|
}
|
||||||
|
|
||||||
childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this);
|
childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this);
|
||||||
|
|
@ -809,12 +827,12 @@ void LLFloaterTexturePicker::draw()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library)
|
LLViewerInventoryItem* LLFloaterTexturePicker::findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const
|
||||||
{
|
{
|
||||||
if (asset_id.isNull())
|
if (asset_id.isNull())
|
||||||
{
|
{
|
||||||
// null asset id means, no material or texture assigned
|
// null asset id means, no material or texture assigned
|
||||||
return LLUUID::null;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
LLUUID loockup_id = asset_id;
|
LLUUID loockup_id = asset_id;
|
||||||
|
|
@ -854,30 +872,41 @@ const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool co
|
||||||
// search for copyable version first
|
// search for copyable version first
|
||||||
for (S32 i = 0; i < items.size(); i++)
|
for (S32 i = 0; i < items.size(); i++)
|
||||||
{
|
{
|
||||||
LLInventoryItem* itemp = items[i];
|
LLViewerInventoryItem* itemp = items[i];
|
||||||
LLPermissions item_permissions = itemp->getPermissions();
|
LLPermissions item_permissions = itemp->getPermissions();
|
||||||
if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID()))
|
if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID()))
|
||||||
{
|
{
|
||||||
if(!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(),gInventory.getLibraryRootFolderID()))
|
if (!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(), gInventory.getLibraryRootFolderID()))
|
||||||
{
|
{
|
||||||
return itemp->getUUID();
|
return itemp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// otherwise just return first instance, unless copyable requested
|
// otherwise just return first instance, unless copyable requested
|
||||||
if (copyable_only)
|
if (copyable_only)
|
||||||
{
|
{
|
||||||
return LLUUID::null;
|
return nullptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(),gInventory.getLibraryRootFolderID()))
|
if (!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(), gInventory.getLibraryRootFolderID()))
|
||||||
{
|
{
|
||||||
return items[0]->getUUID();
|
return items[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const
|
||||||
|
{
|
||||||
|
LLViewerInventoryItem* itemp = findInvItem(asset_id, copyable_only, ignore_library);
|
||||||
|
if (itemp)
|
||||||
|
{
|
||||||
|
return itemp->getUUID();
|
||||||
|
}
|
||||||
|
|
||||||
return LLUUID::null;
|
return LLUUID::null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -340,7 +340,7 @@ public:
|
||||||
void setImageID(const LLUUID& image_asset_id, bool set_selection = true);
|
void setImageID(const LLUUID& image_asset_id, bool set_selection = true);
|
||||||
bool updateImageStats(); // true if within limits
|
bool updateImageStats(); // true if within limits
|
||||||
const LLUUID& getAssetID() { return mImageAssetID; }
|
const LLUUID& getAssetID() { return mImageAssetID; }
|
||||||
const LLUUID& findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false);
|
const LLUUID& findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const;
|
||||||
void setCanApplyImmediately(bool b);
|
void setCanApplyImmediately(bool b);
|
||||||
|
|
||||||
void setActive(bool active);
|
void setActive(bool active);
|
||||||
|
|
@ -397,6 +397,7 @@ protected:
|
||||||
void refreshLocalList();
|
void refreshLocalList();
|
||||||
void refreshInventoryFilter();
|
void refreshInventoryFilter();
|
||||||
void setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection = true);
|
void setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection = true);
|
||||||
|
LLViewerInventoryItem* findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const;
|
||||||
|
|
||||||
LLPointer<LLViewerTexture> mTexturep;
|
LLPointer<LLViewerTexture> mTexturep;
|
||||||
LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial;
|
LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial;
|
||||||
|
|
|
||||||
|
|
@ -157,9 +157,9 @@ bool LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVecto
|
||||||
// update pixel meter ratio using default fov, not modified one
|
// update pixel meter ratio using default fov, not modified one
|
||||||
mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f)));
|
mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f)));
|
||||||
// update screen pixel area
|
// update screen pixel area
|
||||||
|
mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const LLMatrix4 &LLViewerCamera::getProjection() const
|
const LLMatrix4 &LLViewerCamera::getProjection() const
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,7 @@
|
||||||
visible="false"
|
visible="false"
|
||||||
name="comment_text"
|
name="comment_text"
|
||||||
follows="left|top"
|
follows="left|top"
|
||||||
|
max_length="1024"
|
||||||
width="240"
|
width="240"
|
||||||
top_delta="20"
|
top_delta="20"
|
||||||
word_wrap="true" />
|
word_wrap="true" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue