Merge branch 'release/2026.02' of https://github.com/secondlife/viewer

# Conflicts:
#	indra/newview/llviewerparceloverlay.cpp
#	indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
#	indra/newview/skins/default/xui/da/panel_preferences_sound.xml
#	indra/newview/skins/default/xui/en/floater_adjust_environment.xml
#	indra/newview/skins/default/xui/en/floater_inventory_settings.xml
#	indra/newview/skins/default/xui/en/floater_model_preview.xml
#	indra/newview/skins/default/xui/en/floater_test_textbox.xml
#	indra/newview/skins/default/xui/en/panel_group_general.xml
#	indra/newview/skins/default/xui/en/panel_main_inventory.xml
#	indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
#	indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
#	indra/newview/skins/default/xui/en/panel_preferences_sound.xml
#	indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
#	indra/newview/skins/default/xui/en/widgets/wearable_outfit_list_item.xml
This commit is contained in:
Ansariel
2026-04-23 11:44:26 +02:00
43 changed files with 596 additions and 666 deletions
-9
View File
@@ -155,7 +155,6 @@ class LLVector3
friend const LLVector3& operator*=(LLVector3 &a, const LLVector3 &b); // Returns a * b;
friend const LLVector3& operator*=(LLVector3 &a, F32 k); // Return a times scaler k
friend const LLVector3& operator/=(LLVector3 &a, F32 k); // Return a divided by scaler k
friend const LLVector3& operator/=(LLVector3& a, const LLVector3& b);
friend const LLVector3& operator*=(LLVector3 &a, const LLQuaternion &b); // Returns a * b;
friend LLVector3 operator-(const LLVector3 &a); // Return vector -a
@@ -461,14 +460,6 @@ inline const LLVector3& operator/=(LLVector3& a, F32 k)
return a;
}
inline const LLVector3& operator/=(LLVector3& a, const LLVector3& b)
{
a.mV[VX] /= b.mV[VX];
a.mV[VY] /= b.mV[VY];
a.mV[VZ] /= b.mV[VZ];
return a;
}
inline LLVector3 operator-(const LLVector3& a)
{
return LLVector3(-a.mV[VX], -a.mV[VY], -a.mV[VZ]);
+8 -1
View File
@@ -1178,7 +1178,14 @@ LLFontGL* LLFontGL::getFontSansSerifSmallItalic()
//static
LLFontGL* LLFontGL::getFontSansSerif()
{
static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Medium",0));
static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Small",0));
return fontp;
}
// static
LLFontGL* LLFontGL::getFontSansSerifMedium()
{
static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif", "Medium", 0));
return fontp;
}
+1
View File
@@ -210,6 +210,7 @@ public:
static LLFontGL* getFontSansSerifSmallBold();
static LLFontGL* getFontSansSerifSmallItalic();
static LLFontGL* getFontSansSerif();
static LLFontGL* getFontSansSerifMedium();
static LLFontGL* getFontSansSerifBig();
static LLFontGL* getFontSansSerifHuge();
static LLFontGL* getFontSansSerifBold();
+1 -1
View File
@@ -203,7 +203,7 @@ LLFontDescriptor LLFontDescriptor::normalize() const
new_size = "Cascadia";
// </FS:Ansariel>
if (new_size.empty())
new_size = "Medium";
new_size = "Small";
if (removeSubString(new_name,"Bold"))
new_style |= LLFontGL::BOLD;
+14 -53
View File
@@ -1815,9 +1815,17 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
return;
}
LLVector4a vert(x, y, z);
transform(vert);
mVerticesp[mCount] = vert;
if (mUIOffset.empty())
{
mVerticesp[mCount].set(x,y,z);
}
else
{
LLVector4a vert(x, y, z);
vert.add(mUIOffset.back());
vert.mul(mUIScale.back());
mVerticesp[mCount] = vert;
}
mCount++;
mVerticesp[mCount] = mVerticesp[mCount-1];
@@ -1825,54 +1833,7 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
mTexcoordsp[mCount] = mTexcoordsp[mCount-1];
}
void LLRender::transform(LLVector3& vert)
{
if (!mUIOffset.empty())
{
vert += LLVector3(mUIOffset.back().getF32ptr());
vert *= LLVector3(mUIScale.back().getF32ptr());
}
}
void LLRender::transform(LLVector4a& vert)
{
if (!mUIOffset.empty())
{
vert.add(mUIOffset.back());
vert.mul(mUIScale.back());
}
}
void LLRender::untransform(LLVector3& vert)
{
if (!mUIOffset.empty())
{
vert /= LLVector3(mUIScale.back().getF32ptr());
vert -= LLVector3(mUIOffset.back().getF32ptr());
}
}
void LLRender::batchTransform(LLVector4a* verts, U32 vert_count)
{
if (!mUIOffset.empty())
{
const LLVector4a& offset = mUIOffset.back();
const LLVector4a& scale = mUIScale.back();
for (U32 i = 0; i < vert_count; ++i)
{
verts[i].add(offset);
verts[i].mul(scale);
}
}
}
void LLRender::vertexBatchPreTransformed(const std::vector<LLVector4a>& verts)
{
vertexBatchPreTransformed(verts.data(), narrow(verts.size()));
}
void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count)
void LLRender::vertexBatchPreTransformed(LLVector4a* verts, S32 vert_count)
{
if (mCount + vert_count > 4094)
{
@@ -1893,7 +1854,7 @@ void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count
mVerticesp[mCount] = mVerticesp[mCount-1];
}
void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, S32 vert_count)
void LLRender::vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, S32 vert_count)
{
if (mCount + vert_count > 4094)
{
@@ -1917,7 +1878,7 @@ void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector
}
}
void LLRender::vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, const LLColor4U* colors, S32 vert_count)
void LLRender::vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, LLColor4U* colors, S32 vert_count)
{
if (mCount + vert_count > 4094)
{
+3 -10
View File
@@ -450,16 +450,9 @@ public:
void diffuseColor4ubv(const U8* c);
void diffuseColor4ub(U8 r, U8 g, U8 b, U8 a);
void transform(LLVector3& vert);
void transform(LLVector4a& vert);
void untransform(LLVector3& vert);
void batchTransform(LLVector4a* verts, U32 vert_count);
void vertexBatchPreTransformed(const std::vector<LLVector4a>& verts);
void vertexBatchPreTransformed(const LLVector4a* verts, S32 vert_count);
void vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, S32 vert_count);
void vertexBatchPreTransformed(const LLVector4a* verts, const LLVector2* uvs, const LLColor4U*, S32 vert_count);
void vertexBatchPreTransformed(LLVector4a* verts, S32 vert_count);
void vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, S32 vert_count);
void vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, LLColor4U*, S32 vert_count);
void setColorMask(bool writeColor, bool writeAlpha);
void setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha);
+1 -1
View File
@@ -80,7 +80,7 @@ LLUICtrl::Params::Params()
mouseenter_callback("mouseenter_callback"),
mouseleave_callback("mouseleave_callback"),
control_name("control_name"),
font("font", LLFontGL::getFontEmojiMedium()),
font("font", LLFontGL::getFontEmojiSmall()),
font_halign("halign"),
font_valign("valign"),
length("length"), // ignore LLXMLNode cruft
+1 -1
View File
@@ -9264,7 +9264,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>90</integer>
<integer>110</integer>
</map>
<key>ChannelBottomPanelMargin</key>
<map>
+59 -6
View File
@@ -5470,13 +5470,66 @@ void LLAppViewer::purgeCefStaleCaches()
LL_PROFILE_ZONE_SCOPED;
// TODO: we really shouldn't use a hard coded name for the cache folder here...
const std::string browser_parent_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "cef_cache");
if (LLFile::isdir(browser_parent_cache))
if (!LLFile::isdir(browser_parent_cache))
{
// This is a sledgehammer approach - nukes the cef_cache dir entirely
// which is then recreated the first time a CEF instance creates an
// individual cache folder. If we ever decide to retain some folders
// e.g. Search UI cache - then we will need a more granular approach.
gDirUtilp->deleteDirAndContents(browser_parent_cache);
return;
}
// We are using a fixed name to not leave stale folders
// around in case something goes wrong on startup.
const std::string holder_cache_name = browser_parent_cache + "_rename";
// Try to rename the entire directory first
if (LLFile::rename(browser_parent_cache, holder_cache_name) == 0)
{
LL_DEBUGS("AppInit") << "Successfully renamed CEF cache folder for deletion" << LL_ENDL;
}
else
{
// Rename failed (likely another instance has files open in the cache)
// Create holder folder and move individual subfolders instead
LL_DEBUGS("AppInit") << "Could not rename CEF cache folder (may be in use), moving individual folders" << LL_ENDL;
if (!LLFile::isdir(holder_cache_name) && LLFile::mkdir(holder_cache_name) != 0)
{
LL_WARNS() << "Failed to create holder folder: " << holder_cache_name << LL_ENDL;
// Attept normal cleanup
gDirUtilp->deleteDirAndContents(browser_parent_cache);
return;
}
// Iterate through subdirectories in the cache folder
LLDirIterator dir_iter(browser_parent_cache, "*");
std::string subfolder_name;
while (dir_iter.next(subfolder_name))
{
if (subfolder_name == "." || subfolder_name == "..")
{
continue;
}
std::string source_path = browser_parent_cache + gDirUtilp->getDirDelimiter() + subfolder_name;
std::string dest_path = holder_cache_name + gDirUtilp->getDirDelimiter() + subfolder_name;
// If folder is in use, move will fail, don't delete it.
LLFile::rename(source_path, dest_path);
}
}
// Post deletion task to the General work queue to avoid blocking the main thread
if (auto queue = LL::WorkQueue::getInstance("General"))
{
// Alternatively throw it at LLPurgeDiskCacheThread to clean
// it during periodic purges.
queue->post([holder_cache_name]()
{
LL_PROFILE_ZONE_NAMED("cef_cache_cleanup");
gDirUtilp->deleteDirAndContents(holder_cache_name);
});
}
else
{
LL_WARNS() << "Failed to get General work queue, deleting CEF cache synchronously" << LL_ENDL;
gDirUtilp->deleteDirAndContents(holder_cache_name);
}
}
+1 -15
View File
@@ -514,22 +514,8 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
// commands and exit the process before we do anything else.
if (!velopack_initialize())
{
// Obsolete? Always return true
// Velopack handled the invocation (install/uninstall hook)
// Drop install related settings
gDirUtilp->initAppDirs("SecondLife");
std::string user_settings_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "settings.xml");
LLControlGroup settings("global");
if (settings.loadFromFile(user_settings_path))
{
// If user reinstalls or updates, we want to recheck for nsis leftovers.
if (settings.controlExists("PreviousInstallChecked"))
{
settings.setBOOL("PreviousInstallChecked", false);
}
settings.saveToFile(user_settings_path, true);
}
return 0;
}
#endif
+1 -1
View File
@@ -1114,7 +1114,7 @@ void LLFloaterIMSession::processAgentListUpdates(const LLSD& body)
if (moderator_muted_text)
label = LLTrans::getString("IM_muted_text_label");
else
label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);
label = LLIMModel::instance().getName(mSessionID);
mInputEditor->setLabel(label);
if (moderator_muted_text)
+1 -1
View File
@@ -937,7 +937,7 @@ void LLFloaterIMSessionTab::hideOrShowTitle()
void LLFloaterIMSessionTab::updateSessionName(const std::string& name)
{
mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + name);
mInputEditor->setLabel(name);
}
void LLFloaterIMSessionTab::updateChatIcon(const LLUUID& id)
+14 -2
View File
@@ -50,7 +50,7 @@
const S32 BOTTOM_PAD = VPAD * 3;
const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
S32 BUTTON_WIDTH = 90;
S32 BUTTON_WIDTH = 110;
//static
@@ -387,8 +387,20 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
}
else
{
const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel
S32 button_panel_width = mControlPanel->getRect().getWidth();// get initial width from XML
S32 button_panel_height = mControlPanel->getRect().getHeight();
// width for 3 columns: 3 buttons + 2 gaps
S32 min_width_required = 3 * BUTTON_WIDTH + 2 * (2 * HPAD);
if (min_width_required > button_panel_width)
{
button_panel_width = min_width_required;
S32 width_increase = button_panel_width - mControlPanel->getRect().getWidth();
reshape(getRect().getWidth() + width_increase, getRect().getHeight());
mInfoPanel->reshape(mInfoPanel->getRect().getWidth() + width_increase, mInfoPanel->getRect().getHeight());
mTextBox->reshape(mTextBox->getRect().getWidth() + width_increase, mTextBox->getRect().getHeight());
}
//try get an average h_pad to spread out buttons
S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size()));
if(h_pad < 2*HPAD)
+103 -60
View File
@@ -529,6 +529,73 @@ static bool paths_are_equal(const std::wstring& path1, const std::wstring& path2
}
}
static void update_taskbar_shortcut(const std::string& nsis_folder_path, const std::wstring& appdata_path, const std::wstring& app_name, const std::wstring& link_name)
{
std::wstring taskbar_path = appdata_path;
taskbar_path += L"\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\";
taskbar_path += link_name;
if (!PathFileExistsW(taskbar_path.c_str()))
{
// User didn't create one
return;
}
// Verify we are removing or updating the right thing.
// It is not warranteed that the shortcut points to NSIS.
std::wstring target_path;
if (get_shortcut_target(taskbar_path, target_path))
{
// Strip the filename part to get just the folder path
std::filesystem::path trim_path(target_path);
if (trim_path.has_filename())
{
target_path = trim_path.parent_path().wstring();
}
std::wstring nsis_path_w = ll_convert<std::wstring>(nsis_folder_path);
if (!paths_are_equal(nsis_path_w, target_path))
{
// Shortcut points to something else, don't mess with it
LL_INFOS("Velopack") << "Found a matching shortcut, but it points to a different channel. Expected: "
<< ll_convert_wide_to_string(nsis_path_w)
<< ", actual: " << ll_convert_wide_to_string(target_path)
<< LL_ENDL;
return;
}
}
// First try to overwrite shortcut
std::wstring current_exe = ll_convert<std::wstring>(gDirUtilp->getExecutablePathAndName());
HRESULT hr = create_shortcut(taskbar_path, current_exe, L"", app_name, current_exe);
if (SUCCEEDED(hr))
{
LL_INFOS("Velopack") << "Successfully updated taskbar shortcut to point to current exe" << LL_ENDL;
return;
}
// Try deleting and if possible, recreating separately. We should not leave hanging shortcuts behind.
if (!DeleteFileW(taskbar_path.c_str()))
{
DWORD error = GetLastError();
if (error != ERROR_FILE_NOT_FOUND)
{
LL_WARNS("Velopack") << "Failed to delete NSIS taskbar shortcut: "
<< ll_convert_wide_to_string(taskbar_path)
<< " (error: " << error << ")" << LL_ENDL;
}
}
else
{
// Deleted user created link, recreate it with new target if possible.
LL_INFOS("Velopack") << "Updating taskbar shortcut to point to current exe" << LL_ENDL;
HRESULT hr = create_shortcut(taskbar_path, current_exe, L"", app_name, current_exe);
if (FAILED(hr))
{
LL_WARNS("Velopack") << "Failed to re-create taskbar shortcut, error: " << std::hex << hr << ", NSIS shortcut was removed" << LL_ENDL;
}
}
}
void clear_nsis_links(const std::string& nsis_folder_path)
{
wchar_t path[MAX_PATH];
@@ -573,68 +640,17 @@ void clear_nsis_links(const std::string& nsis_folder_path)
}
}
// 3. Taskbar link, which is user-specific and located at:
// %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Second Life.lnk
// Note that it can be a link to velopack already, but since
// we aren't removing, but recreating, it shouldn't be an issue.
// 3. Taskbar links, which are user-specific and located at:
// %AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\
// Note that it can be a link to velopack already or to a different NSIS viewer.
// Name might also be different based on method of creation.
if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, path)))
{
std::wstring taskbar_path = path;
// Hardcoded, because this name is the default window name and isn't going to change in NSIS
taskbar_path += L"\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\Second Life.lnk";
if (PathFileExistsW(taskbar_path.c_str()))
{
// First try to overwrite shortcut
std::wstring current_exe = ll_convert<std::wstring>(gDirUtilp->getExecutablePathAndName());
HRESULT hr = create_shortcut(taskbar_path, current_exe, L"", app_name, current_exe);
if (FAILED(hr))
{
LL_WARNS("Velopack") << "Failed to update taskbar shortcut, error " << std::hex << hr << LL_ENDL;
// Try deleting and if possible recreating separately. We should not leave hanging shortcuts behind.
// It is not warranted that the shortcut points to NSIS, so check the destination first.
std::wstring target_path;
if (get_shortcut_target(taskbar_path, target_path))
{
// Strip the filename part to get just the folder path
std::filesystem::path trim_path(target_path);
if (trim_path.has_filename())
{
target_path = trim_path.parent_path().wstring();
}
std::wstring nsis_path_w = ll_convert<std::wstring>(nsis_folder_path);
if (paths_are_equal(nsis_path_w, target_path))
{
if (!DeleteFileW(taskbar_path.c_str()))
{
DWORD error = GetLastError();
if (error != ERROR_FILE_NOT_FOUND)
{
LL_WARNS("Velopack") << "Failed to delete NSIS taskbar shortcut: "
<< ll_convert_wide_to_string(taskbar_path)
<< " (error: " << error << ")" << LL_ENDL;
}
}
else
{
// Deleted user created link, recreate it with new target if possible.
LL_INFOS("Velopack") << "Updating taskbar shortcut to point to current exe" << LL_ENDL;
HRESULT hr = create_shortcut(taskbar_path, current_exe, L"", app_name, current_exe);
if (FAILED(hr))
{
LL_WARNS("Velopack") << "Failed to re-create taskbar shortcut, error: " << std::hex << hr << ", NSIS shortcut was removed" << LL_ENDL;
}
}
}
}
}
else
{
LL_INFOS("Velopack") << "Successfully updated taskbar shortcut to point to current exe" << LL_ENDL;
}
}
// else user didn't create a taskbar shortcut.
update_taskbar_shortcut(nsis_folder_path, path, app_name, L"Second Life.lnk"); // Window class name
update_taskbar_shortcut(nsis_folder_path, path, app_name, L"Second Life(1).lnk"); // Just in case user somehow did it twice and removed first
update_taskbar_shortcut(nsis_folder_path, path, app_name, L"SecondLifeViewer.lnk"); // Executable name
update_taskbar_shortcut(nsis_folder_path, path, app_name, L"secondlife-bin.lnk"); // Debug builds
update_taskbar_shortcut(nsis_folder_path, path, app_name, app_name + L".lnk"); // Default name
}
}
@@ -858,6 +874,33 @@ static void on_first_run(void* p_user_data, const char* app_version)
MultiByteToWideChar(CP_UTF8, 0, app_version, -1, &version[0], len);
register_uninstall_info(install_dir, app_name, version);
// Drop install related settings
// Unfortunately gDirUtilp is not initialized yet and it's shouldn't
// be possible to change location of the settings. For now it's simpler
// to hardcode the location.
std::optional<std::string> app_data = LLStringUtil::getoptenv("APPDATA");
if (app_data)
{
// Strip trailing delimiter if present
std::string app_data_path = *app_data;
if (!app_data_path.empty() && (app_data_path.back() == '\\' || app_data_path.back() == '/'))
{
app_data_path.pop_back();
}
std::string user_settings_path = app_data_path + "\\SecondLife\\user_settings\\settings.xml";
LLControlGroup settings("global");
if (settings.loadFromFile(user_settings_path))
{
// If user reinstalls or updates, we want to recheck for nsis leftovers.
if (settings.controlExists("PreviousInstallChecked"))
{
settings.setBOOL("PreviousInstallChecked", false);
}
settings.saveToFile(user_settings_path, true);
}
}
}
static void on_after_install(void* user_data, const char* app_version)
+1 -1
View File
@@ -275,7 +275,7 @@ LLFontGL* LLViewerChat::getChatFont()
break;
default:
case 1:
fontp = LLFontGL::getFontSansSerif();
fontp = LLFontGL::getFontSansSerifMedium();
break;
case 2:
fontp = LLFontGL::getFontSansSerifBig();
+107 -132
View File
@@ -67,12 +67,12 @@ LLViewerParcelOverlay::update_signal_t* LLViewerParcelOverlay::mUpdateSignal = N
// [/SL:KB]
LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_width_meters)
: mRegion(region),
mParcelGridsPerEdge(S32(region_width_meters / PARCEL_GRID_STEP_METERS)),
: mRegion( region ),
mParcelGridsPerEdge( S32( region_width_meters / PARCEL_GRID_STEP_METERS ) ),
// <FS:CR> Aurora Sim
mRegionSize(S32(region_width_meters)),
// </FS:CR> Aurora Sim
mDirty(false),
mDirty( false ),
mTimeSinceLastUpdate(),
mOverlayTextureIdx(-1)
{
@@ -479,9 +479,9 @@ void LLViewerParcelOverlay::updatePropertyLines()
{
for (S32 col = 0; col < GRIDS_PER_EDGE; col++)
{
U8 overlay = mOwnership[row * GRIDS_PER_EDGE + col];
U8 overlay = mOwnership[row*GRIDS_PER_EDGE+col];
S32 colorIndex = overlay & PARCEL_COLOR_MASK;
switch (colorIndex)
switch(colorIndex)
{
case PARCEL_SELF:
case PARCEL_GROUP:
@@ -495,11 +495,11 @@ void LLViewerParcelOverlay::updatePropertyLines()
const LLColor4U& color = colors[colorIndex];
F32 left = col * GRID_STEP;
F32 right = left + GRID_STEP;
F32 left = col*GRID_STEP;
F32 right = left+GRID_STEP;
F32 bottom = row * GRID_STEP;
F32 top = bottom + GRID_STEP;
F32 bottom = row*GRID_STEP;
F32 top = bottom+GRID_STEP;
// West edge
if (overlay & PARCEL_WEST_LINE)
@@ -540,121 +540,99 @@ void LLViewerParcelOverlay::addPropertyLine(F32 start_x, F32 start_y, F32 dx, F3
Edge& edge = mEdges.back();
edge.color = color;
// Detailized rendering vertices:
// A B C D E F G
// *-*------*--------*--------*------*-* : 'outside' vertices are placed right on the border
// *------*--------*--------*------* : 'inside' vertices are shifted on LINE_WIDTH inside
// Simplified rendering vertices:
// A G
// *-----------------------------------*
// *-----------------------------------*
F32 outside_x = start_x;
F32 outside_y = start_y;
F32 outside_z = land.resolveHeightRegion(outside_x, outside_y);
F32 inside_x = start_x + tick_dx;
F32 inside_y = start_y + tick_dy;
F32 inside_z = land.resolveHeightRegion(inside_x, inside_y);
F32 outside_z = 0.f;
F32 inside_x = start_x + tick_dx;
F32 inside_y = start_y + tick_dy;
F32 inside_z = 0.f;
auto move = [&](F32 distance)
auto split = [&](const LLVector3& start, F32 x, F32 y, F32 z, F32 part)
{
outside_x += dx * distance;
outside_y += dy * distance;
outside_z = land.resolveHeightRegion(outside_x, outside_y);
inside_x += dx * distance;
inside_y += dy * distance;
inside_z = land.resolveHeightRegion(inside_x, inside_y);
F32 new_x = start.mV[VX] + (x - start.mV[VX]) * part;
F32 new_y = start.mV[VY] + (y - start.mV[VY]) * part;
F32 new_z = start.mV[VZ] + (z - start.mV[VZ]) * part;
edge.vertices.emplace_back(new_x, new_y, new_z);
};
auto split = [&](U32 lod, const LLVector4a& start, F32 x, F32 y, F32 z, F32 part)
auto checkForSplit = [&]()
{
F32 new_x = start[VX] + (x - start[VX]) * part;
F32 new_y = start[VY] + (y - start[VY]) * part;
edge.pushVertex(lod, new_x, new_y, water_z, 0);
};
auto checkForSplit = [&](U32 lod)
{
const std::vector<LLVector4a>& vertices = edge.verticesUnderWater[lod];
const LLVector4a& last_outside = vertices.back();
F32 z0 = last_outside[VZ];
const LLVector3& last_outside = edge.vertices.back();
F32 z0 = last_outside.mV[VZ];
F32 z1 = outside_z;
if ((z0 >= water_z && z1 >= water_z) || (z0 < water_z && z1 < water_z))
return;
F32 part = (water_z - z0) / (z1 - z0);
const LLVector4a& last_inside = vertices[vertices.size() - 2];
split(lod, last_inside, inside_x, inside_y, inside_z, part);
split(lod, last_outside, outside_x, outside_y, outside_z, part);
const LLVector3& last_inside = edge.vertices[edge.vertices.size() - 2];
split(last_inside, inside_x, inside_y, inside_z, part);
split(last_outside, outside_x, outside_y, outside_z, part);
};
auto pushTwoVertices = [&](U32 lod)
{
LLVector3 out(outside_x, outside_y, outside_z);
LLVector3 in(inside_x, inside_y, inside_z);
if (fabs(inside_z - outside_z) < LINE_WIDTH / 5)
{
edge.pushVertex(lod, inside_x, inside_y, inside_z, water_z);
}
else
{
// Make the line thinner if heights differ too much
LLVector3 dist(in - out);
F32 coef = dist.length() / LINE_WIDTH;
LLVector3 new_in(out + dist / coef);
edge.pushVertex(lod, new_in[VX], new_in[VY], new_in[VZ], water_z);
}
edge.pushVertex(lod, outside_x, outside_y, outside_z, water_z);
};
// First part, only one vertex
outside_z = land.resolveHeightRegion( outside_x, outside_y );
// Point A simplified (first two vertices)
pushTwoVertices(1);
edge.vertices.emplace_back(outside_x, outside_y, outside_z);
// Point A detailized (only one vertex)
edge.pushVertex(0, outside_x, outside_y, outside_z, water_z);
inside_x += dx * LINE_WIDTH;
inside_y += dy * LINE_WIDTH;
// Point B (two vertices)
move(LINE_WIDTH);
pushTwoVertices(0);
outside_x += dx * LINE_WIDTH;
outside_y += dy * LINE_WIDTH;
// Points C, D, E
F32 distance = 1.f - LINE_WIDTH;
// Then the "actual edge"
inside_z = land.resolveHeightRegion( inside_x, inside_y );
outside_z = land.resolveHeightRegion( outside_x, outside_y );
edge.vertices.emplace_back(inside_x, inside_y, inside_z);
edge.vertices.emplace_back(outside_x, outside_y, outside_z);
inside_x += dx * (dx - LINE_WIDTH);
inside_y += dy * (dy - LINE_WIDTH);
outside_x += dx * (dx - LINE_WIDTH);
outside_y += dy * (dy - LINE_WIDTH);
// Middle part, full width
constexpr S32 GRID_STEP = (S32)PARCEL_GRID_STEP_METERS;
for (U32 i = 1; i < GRID_STEP; ++i)
for (S32 i = 1; i < GRID_STEP; i++)
{
move(distance);
checkForSplit(0);
pushTwoVertices(0);
distance = 1.f;
inside_z = land.resolveHeightRegion( inside_x, inside_y );
outside_z = land.resolveHeightRegion( outside_x, outside_y );
checkForSplit();
edge.vertices.emplace_back(inside_x, inside_y, inside_z);
edge.vertices.emplace_back(outside_x, outside_y, outside_z);
inside_x += dx;
inside_y += dy;
outside_x += dx;
outside_y += dy;
}
// Point F (two vertices)
move(1.f - LINE_WIDTH);
checkForSplit(0);
pushTwoVertices(0);
// Extra buffer for edge
inside_x -= dx * LINE_WIDTH;
inside_y -= dy * LINE_WIDTH;
// Point G simplified (last two vertices)
move(LINE_WIDTH);
pushTwoVertices(1);
outside_x -= dx * LINE_WIDTH;
outside_y -= dy * LINE_WIDTH;
// Point G detailized (only one vertex)
edge.pushVertex(0, outside_x, outside_y, outside_z, water_z);
}
inside_z = land.resolveHeightRegion( inside_x, inside_y );
outside_z = land.resolveHeightRegion( outside_x, outside_y );
void LLViewerParcelOverlay::Edge::pushVertex(U32 lod, F32 x, F32 y, F32 z, F32 water_z)
{
verticesUnderWater[lod].emplace_back(x, y, z);
gGL.transform(verticesUnderWater[lod].back());
checkForSplit();
if (z >= water_z)
{
verticesAboveWater[lod].push_back(verticesUnderWater[lod].back());
}
else
{
verticesAboveWater[lod].emplace_back(x, y, water_z);
gGL.transform(verticesAboveWater[lod].back());
}
edge.vertices.emplace_back(inside_x, inside_y, inside_z);
edge.vertices.emplace_back(outside_x, outside_y, outside_z);
outside_x += dx * LINE_WIDTH;
outside_y += dy * LINE_WIDTH;
// Last edge is not drawn to the edge
outside_z = land.resolveHeightRegion( outside_x, outside_y );
edge.vertices.emplace_back(outside_x, outside_y, outside_z);
}
void LLViewerParcelOverlay::setDirty()
@@ -703,9 +681,6 @@ void LLViewerParcelOverlay::renderPropertyLines()
if (!show)
return;
LL_PROFILE_ZONE_SCOPED;
LL_PROFILE_GPU_ZONE("Property Lines");
LLSurface& land = mRegion->getLand();
bool render_water = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER);
@@ -743,8 +718,6 @@ void LLViewerParcelOverlay::renderPropertyLines()
// Stomp the camera into two dimensions
LLVector3 camera_region = mRegion->getPosRegionFromGlobal( gAgentCamera.getCameraPositionGlobal() );
bool draw_underwater = camera_region.mV[VZ] < water_z ||
!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER);
// Set up a cull plane 2 * PARCEL_GRID_STEP_METERS behind
// the camera. The cull plane normal is the camera's at axis.
@@ -752,23 +725,15 @@ void LLViewerParcelOverlay::renderPropertyLines()
cull_plane_point *= -2.f * PARCEL_GRID_STEP_METERS;
cull_plane_point += camera_region;
bool render_hidden = !draw_underwater &&
LLSelectMgr::sRenderHiddenSelections &&
LLFloaterReg::instanceVisible("build");
bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build");
constexpr F32 PROPERTY_LINE_CLIP_DIST_SQUARED = 256.f * 256.f;
const F32 PROPERTY_LINE_LOD0_DIST_SQUARED = PROPERTY_LINE_CLIP_DIST_SQUARED / 25;
for (const Edge& edge : mEdges)
{
const std::vector<LLVector4a>& vertices0 = edge.verticesAboveWater[0];
const F32* first = vertices0.front().getF32ptr();
const F32* last = vertices0.back().getF32ptr();
LLVector3 center((first[VX] + last[VX]) / 2, (first[VY] + last[VY]) / 2, (first[VZ] + last[VZ]) / 2);
gGL.untransform(center);
LLVector3 center = edge.vertices[edge.vertices.size() >> 1];
F32 dist_squared = dist_vec_squared(center, camera_region);
if (dist_squared > PROPERTY_LINE_CLIP_DIST_SQUARED)
if (dist_vec_squared2D(center, camera_region) > PROPERTY_LINE_CLIP_DIST_SQUARED)
{
continue;
}
@@ -782,33 +747,43 @@ void LLViewerParcelOverlay::renderPropertyLines()
continue;
}
U32 lod = dist_squared < PROPERTY_LINE_LOD0_DIST_SQUARED ? 0 : 1;
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.color4ubv(edge.color.mV);
if (draw_underwater)
for (const LLVector3& vertex : edge.vertices)
{
gGL.vertexBatchPreTransformed(edge.verticesUnderWater[lod]);
}
else
{
gGL.vertexBatchPreTransformed(edge.verticesAboveWater[lod]);
if (render_hidden)
if (render_hidden || camera_z < water_z || vertex.mV[2] >= water_z)
{
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
LLColor4U color = edge.color;
color.mV[VALPHA] /= 4;
gGL.color4ubv(color.mV);
gGL.vertexBatchPreTransformed(edge.verticesUnderWater[lod]);
gGL.vertex3fv(vertex.mV);
}
else
{
LLVector3 visible = vertex;
visible.mV[VZ] = water_z;
gGL.vertex3fv(visible.mV);
}
}
gGL.end();
if (render_hidden)
{
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
gGL.begin(LLRender::TRIANGLE_STRIP);
LLColor4U color = edge.color;
color.mV[VALPHA] /= 4;
gGL.color4ubv(color.mV);
for (const LLVector3& vertex : edge.vertices)
{
gGL.vertex3fv(vertex.mV);
}
gGL.end();
}
}
gGL.popMatrix();
+1 -4
View File
@@ -127,10 +127,7 @@ private:
struct Edge
{
void pushVertex(U32 lod, F32 x, F32 y, F32 z, F32 water_z);
// LOD: 0 - detailized, 1 - simplified
std::vector<LLVector4a> verticesAboveWater[2];
std::vector<LLVector4a> verticesUnderWater[2];
std::vector<LLVector3> vertices;
LLColor4U color;
};
+18 -2
View File
@@ -3194,6 +3194,13 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
LL_WARNS("Voice") << "Expected object from data channel:" << data << LL_ENDL;
return;
}
bool is_primary_region = mPrimary;
if (!mPrimary && isSpatial() && gAgent.getRegion())
{
is_primary_region = (mRegionID == gAgent.getRegion()->getRegionID());
LL_WARNS() << "mPrimary is false, expected: " << is_primary_region << " connection state: " << getVoiceConnectionState() << LL_ENDL;
}
boost::json::object voice_data = voice_data_parsed.as_object();
boost::json::object mute;
boost::json::object user_gain;
@@ -3283,7 +3290,7 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
if (isSpatial())
{
// ignore muted flags from non-primary server
if (mPrimary || primary)
if (is_primary_region || primary)
{
participant->mIsModeratorMuted = is_moderator_muted;
if (gAgentID == agent_id)
@@ -3301,11 +3308,15 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
}
else
{
if (isSpatial() && (mPrimary || primary))
if (isSpatial() && (is_primary_region || primary))
{
// mute info message can be received before join message, so try to mute again later
if (participant_obj.contains("m") && participant_obj["m"].is_bool())
{
LL_WARNS() << "Mute info msg received: " << participant_obj["m"].as_bool()
<< " but participant " << agent_id
<< " was not found in channel " << mChannelID << LL_ENDL;
bool is_moderator_muted = participant_obj["m"].as_bool();
std::string channel_id = mChannelID;
F32 delay { 1.5f };
@@ -3317,11 +3328,16 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
if (participant)
{
participant->mIsModeratorMuted = is_moderator_muted;
LL_WARNS() << "Participant " << agent_id << " is found after delay, is_muted: " << is_moderator_muted << LL_ENDL;
if (gAgentID == agent_id)
{
LLNearbyVoiceModeration::getInstance()->setMutedInfo(channel_id, is_moderator_muted);
}
}
else
{
LL_WARNS() << "Participant " << agent_id << " is still not found in channel " << channel_id << LL_ENDL;
}
}, delay);
}
}
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="JOYSTICK OPSÆTNING">
<check_box label="Aktiver Joystick:" name="enable_joystick"/>
<spinner label="X akse mapping" name="JoystickAxis1"/>
<spinner label="Y akse mapping" name="JoystickAxis2"/>
<spinner label="Z akse mapping" name="JoystickAxis0"/>
<spinner label="Hældning mapping" name="JoystickAxis4"/>
<spinner label="Drejning mapping" name="JoystickAxis5"/>
<spinner label="Rulning mapping" name="JoystickAxis3"/>
<spinner label="Zoom mapping" name="JoystickAxis6"/>
<spinner label="X akse mapping" name="JoystickAxis1" label_width="115" width="155"/>
<spinner label="Y akse mapping" name="JoystickAxis2" label_width="115" width="155"/>
<spinner label="Z akse mapping" name="JoystickAxis0" label_width="115" width="155"/>
<spinner label="Hældning mapping" name="JoystickAxis4" label_width="115" width="155"/>
<spinner label="Drejning mapping" name="JoystickAxis5" label_width="115" width="155"/>
<spinner label="Rulning mapping" name="JoystickAxis3" label_width="115" width="155"/>
<spinner label="Zoom mapping" name="JoystickAxis6" label_width="115" width="155"/>
<check_box label="Direkte zoom" name="ZoomDirect"/>
<check_box label="3D Cursor" name="Cursor3D"/>
<check_box label="Auto opret" name="AutoLeveling"/>
@@ -3,7 +3,7 @@
<text name="media_label">
Indtast en URL eller et URL mønster for at tilføje til listen med godkendte domæner
</text>
<line_editor name="whitelist_entry" tool_tip="Indtast en URL eller et URL mønster for at godkende side(r)"/>
<line_editor name="whitelist_entry" tool_tip="Indtast en URL eller et URL mønster for at godkende side(r)" bottom_delta="25"/>
<button label="OK" name="ok_btn"/>
<button label="Annullér" name="cancel_btn"/>
</floater>
@@ -1663,7 +1663,7 @@ Only large parcels can be listed in search.
left="10"
name="with media:"
top="10"
width="100">
width="110">
Type:
</text>
<combo_box
@@ -1689,7 +1689,7 @@ Only large parcels can be listed in search.
layout="topleft"
left="10"
name="at URL:"
width="100"
width="110"
top_pad="10">
Home Page:
</text>
@@ -1701,7 +1701,7 @@ Only large parcels can be listed in search.
max_length_bytes="255"
name="media_url"
select_on_focus="true"
width="300"
width="290"
top_delta="0"/>
<button
follows="right|top"
@@ -1728,13 +1728,13 @@ Only large parcels can be listed in search.
follows="left|top"
height="20"
layout="topleft"
left="110"
left="120"
max_length_bytes="255"
name="url_description"
select_on_focus="true"
tool_tip="Text displayed next to play/load button"
top_delta="0"
width="300" />
width="290" />
<text
type="string"
length="1"
@@ -1754,7 +1754,7 @@ Only large parcels can be listed in search.
follows="left|top"
height="80"
layout="topleft"
left="110"
left="120"
name="media texture"
tool_tip="Click to choose a picture"
top_delta="0"
@@ -1767,7 +1767,7 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="8"
name="replace_texture_help"
width="300"
width="290"
word_wrap="true"
top_delta="0">
Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture.
@@ -1776,7 +1776,7 @@ Only large parcels can be listed in search.
height="16"
label="Auto scale"
layout="topleft"
left="107"
left="117"
name="media_auto_scale"
top_pad="-10"
tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required."
@@ -1790,7 +1790,7 @@ Only large parcels can be listed in search.
left="10"
name="media_size"
tool_tip="Size to render Web media, leave 0 for default."
width="100"
width="110"
top_pad="10">
Size:
</text>
@@ -1845,7 +1845,7 @@ Only large parcels can be listed in search.
left="10"
name="Options:"
top_pad="10"
width="100">
width="110">
Options:
</text>
<check_box
@@ -1855,7 +1855,7 @@ Only large parcels can be listed in search.
left_pad="-3"
name="media_loop"
tool_tip="Play media in a loop. When the media has finished playing, it will restart from the beginning."
top_delta="-1"
top_delta="1"
width="200" />
</panel>
<panel
@@ -50,7 +50,6 @@
follows="top|left|right"
height="24"
label="Get started"
font="SansSerifMedium"
layout="topleft"
left="320"
name="continue_btn"
@@ -59,6 +58,7 @@
image_hover_unselected="PushButton_Login_Over"
label_color="White"
top_pad ="15"
pad_bottom="1"
width="140"/>
<button
follows="top|left|right"
@@ -66,6 +66,7 @@
label="Later"
layout="topleft"
left_pad="9"
pad_bottom="1"
name="close_btn"
width="90"/>
<icon
@@ -97,7 +98,6 @@
type="string"
length="1"
follows="top|left"
font="SansSerifMedium"
text_color="White"
height="75"
width="260"
@@ -112,7 +112,6 @@
type="string"
length="1"
follows="top|left"
font="SansSerifMedium"
text_color="White"
height="75"
width="260"
@@ -126,7 +125,6 @@
type="string"
length="1"
follows="top|left"
font="SansSerifMedium"
text_color="White"
height="75"
width="260"
@@ -47,15 +47,15 @@
name="ambient_lbl"
height="10"
layout="topleft"
left="10"
left="7"
top="5"
width="80">Ambient:</text>
width="80">Ambient</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="40"
label_height="0"
layout="topleft"
left_delta="0"
left_delta="3"
name="ambient_light"
top_pad="5"
width="60"/>
@@ -63,15 +63,15 @@
name="blue_horizon_lbl"
height="10"
layout="topleft"
left_delta="0"
left="7"
top_pad="10"
width="80">Blue Horizon:</text>
width="80">Blue Horizon</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="40"
label_height="0"
layout="topleft"
left_delta="0"
left_delta="3"
name="blue_horizon"
top_pad="5"
width="60"/>
@@ -79,15 +79,15 @@
name="blue_density_lbl"
height="10"
layout="topleft"
left_delta="0"
left="7"
top_pad="10"
width="80">Blue Density:</text>
width="80">Blue Density</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="40"
label_height="0"
layout="topleft"
left_delta="0"
left_delta="3"
name="blue_density"
top_pad="5"
width="60"/>
@@ -123,7 +123,7 @@
layout="topleft"
left_delta="0"
top_pad="5"
width="80">Cloud Color:</text>
width="80">Cloud Color</text>
<color_swatch can_apply_immediately="true"
follows="left|top"
height="10"
@@ -139,7 +139,7 @@
left_delta="0"
top_pad="10"
name="cloud_map_label"
width="80">Cloud Image:</text>
width="80">Cloud Image</text>
<texture_picker height="63"
layout="topleft"
left_delta="0"
@@ -152,7 +152,7 @@
left_delta="0"
top_pad="-13"
name="water_map_label"
width="80">Water Image:</text>
width="80">Water Image</text>
<texture_picker height="63"
layout="topleft"
left_delta="0"
@@ -93,7 +93,6 @@
type="string"
length="1"
follows="top|left"
font="SansSerifMedium"
height="16"
layout="topleft"
left="20"
@@ -105,7 +104,6 @@
<text
type="string"
length="1"
font="SansSerifMedium"
follows="top|left"
halign="right"
height="16"
@@ -128,7 +126,6 @@
type="string"
length="1"
follows="top|left"
font="SansSerifMedium"
height="16"
layout="topleft"
left="20"
@@ -140,7 +137,6 @@
<text
type="string"
length="1"
font="SansSerifMedium"
follows="top|left"
halign="right"
height="16"
@@ -163,7 +159,6 @@
type="string"
length="1"
follows="top|left"
font="SansSerifMedium"
font.style="BOLD"
height="16"
layout="topleft"
@@ -176,7 +171,6 @@
<text
type="string"
length="1"
font="SansSerifMedium"
follows="top|left"
halign="right"
height="16"
@@ -207,7 +201,6 @@
type="string"
length="1"
follows="top|left"
font="SansSerifMedium"
height="16"
top_pad="15"
layout="topleft"
@@ -217,7 +210,6 @@
Choose amount to buy
</text>
<text
font="SansSerifMedium"
type="string"
length="1"
follows="left|top"
@@ -233,7 +225,6 @@
type="string"
max_length_bytes="10"
halign="right"
font="SansSerifMedium"
select_on_focus="true"
follows="top|left"
top_delta="-4"
@@ -247,7 +238,6 @@
<text
type="string"
length="1"
font="SansSerifMedium"
text_color="EmphasisColor"
follows="top|left"
halign="right"
@@ -276,7 +266,6 @@
</text>
<text
type="string"
font="SansSerifMedium"
length="1"
follows="top|left"
height="16"
@@ -290,7 +279,6 @@
<text
type="string"
length="1"
font="SansSerifMedium"
follows="top|left"
top_delta="0"
height="16"
@@ -350,7 +338,6 @@ Re-enter amount to see the latest exchange rate.
length="1"
follows="top|left"
layout="topleft"
font="SansSerifMedium"
top="10"
left="20"
width="310"
@@ -290,7 +290,7 @@
<button
follows="top|left"
height="23"
width="110"
width="113"
label="Clone Track From"
left="10"
top_pad="10"
@@ -298,7 +298,7 @@
<button
follows="top|left"
height="23"
width="110"
width="113"
label="Load Track From"
top_pad="0"
left_delta="0"
@@ -306,7 +306,7 @@
<button
follows="top|left"
height="23"
width="110"
width="113"
label="Clear Track"
top_pad="0"
left_delta="0"
@@ -526,7 +526,7 @@
height="16"
label="Disable Physics"
layout="topleft"
left_delta="120"
left_delta="136"
name="disable physics"
tool_tip="Set this to disable all physics in this region"
top_delta="0"
@@ -27,7 +27,6 @@
left_pad="12"
top_delta="2"
name="multi_folder_txt"
font="SansSerifMedium"
text_color="White"
width="300">
Double-click on folder in multi-folder view:
@@ -37,7 +36,6 @@
follows="left|top"
top_pad="8"
layout="topleft"
font="SansSerifMedium"
left="60"
width="300"
height="66"
@@ -90,7 +88,6 @@
left_pad="12"
top_delta="2"
name="single_folder_txt"
font="SansSerifMedium"
text_color="White"
width="300">
Double-click on folder in single-folder view:
@@ -100,7 +97,6 @@
follows="left|top"
top_pad="8"
layout="topleft"
font="SansSerifMedium"
left="60"
width="300"
height="44"
@@ -142,7 +138,6 @@
layout="topleft"
left_pad="13"
name="find_original_txt"
font="SansSerifMedium"
text_color="White"
top_delta="1"
width="310">
@@ -153,7 +148,6 @@
follows="left|top"
top_pad="8"
layout="topleft"
font="SansSerifMedium"
left="60"
width="300"
height="44"
@@ -196,7 +190,6 @@
left_pad="12"
top_delta="2"
name="favorites_txt"
font="SansSerifMedium"
text_color="White"
width="300">
Favorites
@@ -206,7 +199,6 @@
layout="topleft"
follows="left|top"
top_pad="8"
font="SansSerifMedium"
left="60"
width="300"
height="18"
@@ -219,7 +211,6 @@
follows="left|top"
top_pad="5"
layout="topleft"
font="SansSerifMedium"
left="60"
width="150"
height="18"
@@ -232,7 +223,6 @@
follows="left|top"
top_pad="5"
layout="topleft"
font="SansSerifMedium"
left="60"
width="150"
height="18"
@@ -276,7 +266,6 @@
left_pad="12"
top_delta="2"
name="attachment_return_txt"
font="SansSerifMedium"
text_color="White"
width="420">
Pressing enter or double clicking on an avatar attachment
@@ -65,10 +65,10 @@
text_color="White"
height="20"
layout="topleft"
left="395"
left="392"
top="7"
name="fps_desc1_lbl"
width="150">
width="153">
Allow 5-10 seconds for
</text>
<text
@@ -78,7 +78,7 @@
layout="topleft"
top_pad="-3"
name="fps_desc2_lbl"
width="150">
width="153">
changes to take full effect.
</text>
</panel>
@@ -265,7 +265,7 @@
left="10"
name="complexity_info"
top_pad="0"
width="455">
width="490">
Reduce the complexity of your avatar if you aren't satisfied with current FPS.
</text>
<icon
@@ -664,7 +664,7 @@
increment="8"
initial_value="160"
label="Sky:"
label_width="145"
label_width="164"
layout="topleft"
left="420"
min_val="16"
@@ -750,7 +750,7 @@
control_name="RenderShadowDetail"
height="18"
layout="topleft"
left_delta="130"
left_delta="175"
top_delta="0"
name="ShadowDetail"
width="150">
@@ -800,7 +800,7 @@
control_name="RenderReflectionProbeDetail"
height="18"
layout="topleft"
left_delta="130"
left_delta="175"
top_delta="0"
name="ReflectionDetail"
width="150">
@@ -836,7 +836,7 @@
control_name="RenderReflectionProbeLevel"
height="18"
layout="topleft"
left_delta="130"
left_delta="175"
top_delta="0"
name="ReflectionLevel"
width="150">
@@ -868,7 +868,7 @@
name="ReflectionProbeCount"
text_readonly_color="LabelDisabledColor"
top_delta="22"
width="128">
width="130">
Max Reflection Probes:
</text>
@@ -877,7 +877,7 @@
height="18"
layout="topleft"
label="Max. Reflection Probes:"
left_delta="130"
left_delta="175"
top_delta="0"
name="ProbeCount"
width="150">
@@ -911,7 +911,7 @@
increment="0.1"
initial_value="160"
label="Exposure:"
label_width="145"
label_width="164"
layout="topleft"
left="420"
min_val="0.5"
@@ -955,7 +955,7 @@
control_name="RenderHeroProbeResolution"
height="18"
layout="topleft"
left_delta="130"
left_delta="175"
top_delta="0"
name="MirrorResolution"
width="150">
@@ -995,7 +995,7 @@
control_name="RenderHeroProbeUpdateRate"
height="18"
layout="topleft"
left_delta="130"
left_delta="175"
top_delta="0"
name="HeroProbeUpdateRate"
width="150">
@@ -1026,7 +1026,7 @@
increment="0.1"
initial_value="160"
label="Sharpening:"
label_width="145"
label_width="164"
layout="topleft"
left="420"
min_val="0.0"
@@ -1055,7 +1055,7 @@
control_name="RenderTonemapType"
height="18"
layout="topleft"
left_delta="130"
left_delta="175"
top_delta="0"
name="TonemapType"
width="150">
@@ -1077,7 +1077,7 @@
initial_value="1"
label="Tone Mapping Mix:"
tool_tip="Mix between linear and tone mapped colors"
label_width="145"
label_width="164"
layout="topleft"
left="420"
min_val="0.0"
@@ -17,7 +17,6 @@
follows="left|top|right"
height="16"
name="trusted_txt"
font="SansSerifMedium"
text_color="white"
layout="topleft"
left="16">
@@ -7,303 +7,234 @@
name="floater_test_textbox"
help_topic="floater_test_textbox"
translate="false"
width="875"
title="Textbox Tests">
width="800">
<text
clip_partial="true"
top_pad="10"
left="10"
width="267"
height="28"
layout="topleft"
follows="right|left"
text_color="white"
use_ellipses="true"
word_wrap="true"
mouse_opaque="false"
name="title" >
This text has word_wrap set true, use_ellipses set true, and clip_partial set true, so it should wrap around, spilling over to the last line, then clip the last partial line and show ellipses to indicate there is more text
</text>
<text
clip_partial="true"
top="25"
left="10"
width="267"
height="28"
layout="topleft"
follows="top|left"
text_color="white"
use_ellipses="true"
word_wrap="true"
mouse_opaque="false"
name="title" >
This text has word_wrap set true, use_ellipses set true, and clip_partial set true, so it should wrap around, spilling over to the last line, then clip the last partial line and show ellipses to indicate there is more text
</text>
<text
font="SansSerif"
height="30"
layout="topleft"
left_delta="0"
top_pad="10"
width="650">
SansSerif
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</text>
<text
font="SansSerif"
font.style="ITALIC"
height="30"
layout="topleft"
left_delta="0"
top_pad="10"
width="650">
SansSerif ITALIC
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</text>
<text
font="SansSerif"
font.style="UNDERLINE"
height="30"
layout="topleft"
left_delta="0"
top_pad="10"
width="650">
SansSerif UNDERLINE
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</text>
<text
font="SansSerif"
font.style="BOLD"
height="30"
layout="topleft"
left_delta="0"
top_pad="10"
width="650">
SansSerif BOLD
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</text>
<text
font="SansSerif"
font.style="BOLD|ITALIC"
height="30"
layout="topleft"
left_delta="0"
top_pad="10"
width="650">
SansSerif BOLD ITALIC
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</text>
<text
font="SansSerif"
font.style="BOLD|UNDERLINE"
height="30"
layout="topleft"
left_delta="0"
top_pad="10"
width="650">
SansSerif BOLD UNDERLINE
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</text>
<text
top_pad="20"
left="10"
right="-10"
height="30"
follows="top|left"
font.name="SansSerifSmall"
name="test_text10"
tool_tip="text">
SansSerifSmall
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<text
top_pad="10"
left="10"
right="-10"
height="30"
follows="top|left"
font.name="SansSerifMedium"
name="test_text11"
tool_tip="text">
SansSerif
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<text
top_pad="10"
left="10"
right="-10"
follows="top|left"
height="40"
font.name="SansSerifLarge"
name="test_text12"
tool_tip="text">
SansSerifLarge
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<text
top_pad="10"
left="10"
height="50"
right="-10"
follows="top|left"
font.name="SansSerifHuge"
name="test_text13"
tool_tip="text">
SansSerifHuge
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<!-- next column -->
<text
top="25"
left="400"
name="right_aligned_text"
width="250"
height="20"
halign="right"
top_pad="10">
Right aligned text
</text>
<text
top_pad="10"
name="centered_text"
width="250"
height="20"
halign="center">
Centered text
</text>
<text
top_pad="10"
name="left_aligned_text"
width="250"
height="20"
halign="left">
Left aligned text
</text>
<text
top_pad="10"
name="v_pad_text"
width="250"
height="40"
halign="left"
v_pad="10">
v_pad = 10, height = 40
</text>
<text
top_pad="10"
name="v_pad_text"
width="250"
height="40"
halign="left"
h_pad="30">
h_pad = 30, height = 40
</text>
<!-- next column -->
<text_editor
height="50"
follows="top|right"
right="-10"
name="test_text_editor"
tool_tip="text editor"
top="25"
width="200">
Text Editor
</text_editor>
<text_editor
height="50"
follows="top|left|bottom"
left_delta="0"
name="long_text_editor"
tool_tip="text editor"
top_pad="10"
width="200">
<text
font="SansSerif"
font.style="BOLD"
height="10"
layout="topleft"
left_delta="0"
top_pad="10"
width="300">
SansSerif BOLD
</text>
<text
font="SansSerif"
font.style="BOLD|UNDERLINE"
height="10"
layout="topleft"
left_delta="0"
top_pad="10"
width="300">
SansSerif BOLD UNDERLINE
</text>
<text
bottom="390"
left="10"
name="right_aligned_text"
width="300"
halign="right"
top_pad="10">
Right aligned text
</text>
<text
bottom="390"
left="10"
name="centered_text"
width="300"
halign="center"
top_pad="10">
Centered text
</text>
<text
left="10"
name="left_aligned_text"
width="300"
halign="left"
top_pad="10">
Left aligned text
</text>
<text
left="10"
name="v_pad_text"
height="40"
width="300"
halign="left"
top_pad="10"
v_pad="10">
v_pad = 10, height = 40
</text>
<text
left="10"
name="v_pad_text1"
height="40"
width="300"
halign="left"
top_pad="10"
h_pad="30">
h_pad = 30, height = 40
</text>
<text
top_pad="10"
left="10"
right="-10"
height="20"
follows="top|left"
font.name="SansSerifSmall"
name="test_text10"
tool_tip="text">
SansSerif
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<text
top_pad="10"
left="10"
right="-10"
height="25"
follows="top|left"
font.name="SansSerifMedium"
name="test_text11"
tool_tip="text">
SansSerifMedium
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<text
top_pad="10"
left="10"
right="-10"
follows="top|left"
height="26"
font.name="SansSerifLarge"
name="test_text12"
tool_tip="text">
SansSerifLarge
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<text
top_pad="10"
left="10"
height="35"
right="-10"
follows="top|left"
font.name="SansSerifHuge"
name="test_text13"
tool_tip="text">
SansSerifHuge
The 华文细黑 brown fox ヒラキjumped over the lazy dog.
</text>
<!-- next column -->
<text_editor
height="50"
follows="top|left|bottom"
left="400"
name="test_text_editor"
tool_tip="text editor"
top="25"
width="200">
Text Editor
</text_editor>
<text_editor
height="50"
follows="top|left|bottom"
left_delta="0"
name="long_text_editor"
tool_tip="text editor"
top_pad="10"
width="200">
Text Editor
with multiple
lines of text
and hence a
scroll bar
</text_editor>
<text_editor
height="50"
follows="top|left|bottom"
left_delta="0"
max_length="65536"
name="blob_text_editor"
tool_tip="text editor"
top_pad="10"
width="200"
word_wrap="true">
</text_editor>
<text_editor
height="50"
follows="top|left|bottom"
left_delta="0"
max_length="65536"
name="blob_text_editor"
tool_tip="text editor"
top_pad="10"
width="200"
word_wrap="true">
Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others.
</text_editor>
</text_editor>
<text_editor
height="50"
follows="top|left|bottom"
font="Monospace"
left_delta="0"
name="monospace_text_editor"
tool_tip="text editor"
top_pad="10"
width="200">
height="50"
follows="top|left|bottom"
font="Monospace"
left_delta="0"
name="monospace_text_editor"
tool_tip="text editor"
top_pad="10"
width="200">
Text Editor
with multiple
lines of text
and hence a
scroll bar gjyrrr
</text_editor>
</text_editor>
<text_editor
border_visible="true"
height="50"
follows="top|left|bottom"
font="Monospace"
left_delta="0"
name="monospace_text_editor"
tool_tip="text editor"
top_pad="10"
width="200">
border_visible="true"
height="50"
follows="top|left|bottom"
font="Monospace"
left_delta="0"
name="monospace_text_editor1"
tool_tip="text editor"
top_pad="10"
width="200">
Text Editor
with multiple
lines of text
and hence a
scroll bar gjyrrr
</text_editor>
</text_editor>
<text_editor
height="50"
follows="top|left|bottom"
font="SansSerif"
left_delta="0"
name="sansserif_text_editor"
tool_tip="text editor"
top_pad="10"
width="200">
height="50"
follows="top|left|bottom"
font="SansSerif"
left_delta="0"
name="sansserif_text_editor"
tool_tip="text editor"
top_pad="10"
width="200">
Text Editor
with multiple
lines of text
and hence a
scroll bar gjyrrr
</text_editor>
</text_editor>
<text
height="40"
follows="top|left|bottom"
layout="topleft"
name="test_text_box"
tool_tip="text box"
top_pad="5"
width="200">
<text
height="40"
follows="top|left|bottom"
layout="topleft"
name="test_text_box"
tool_tip="text box"
top_pad="5"
width="200">
Text box
with
multiple lines
and too many lines
to actually fit
</text>
</text>
</floater>
@@ -16,7 +16,6 @@
width="975">
<text
follows="left|top"
font="SansSerifMedium"
valign="top"
halign="left"
height="20"
@@ -31,7 +30,6 @@
</text>
<text
follows="left|top"
font="SansSerifMedium"
valign="top"
halign="left"
height="20"
@@ -49,7 +47,7 @@
button_display_mode="icons_with_text"
follows="all"
left="20"
button_icon_and_text.button_width.max="140"
button_icon_and_text.button_width.max="172"
button_icon_and_text.button_width.min="70"
name="toybox_toolbar"
pad_left="5"
@@ -10,12 +10,12 @@
title="Whitelist Entry"
width="390">
<text type="string" length="1" bottom="20" follows="top|left" height="15" layout="topleft"
left="10" name="media_label" top="20">
<text type="string" length="1" follows="top|left|right" height="30" layout="topleft"
left="10" name="media_label" top="20" right="-10" word_wrap="true">
Enter a URL or URL pattern to add to the list of allowed domains
</text>
<line_editor bottom_delta="40" enabled="true" follows="left|top" font="SansSerif"
<line_editor bottom_delta="15" enabled="true" follows="left|top" font="SansSerif"
height="20" left="10" name="whitelist_entry"
tool_tip="Enter a URL or URL pattern to White List"
width="350" />
@@ -252,7 +252,7 @@
layout="topleft"
left_delta="0"
top_pad="5"
width="102"
width="105"
name="roughness_factor_lbl">
Roughness Factor
</text>
@@ -301,7 +301,6 @@ Maximum 200 per group daily
width="400">
<text
type="string"
font="SansSerifMedium"
height="16"
layout="topleft"
left="10"
@@ -6,7 +6,6 @@
bg_alpha_color="HintBg"
height="34">
<text name="hint_title"
font="SansSerifMedium"
left="8"
right="180"
top="8"
@@ -4,7 +4,6 @@
height="40"
layout="topleft">
<text name="hint_title"
font="SansSerifMedium"
left="8"
right="290"
top="8"
@@ -271,7 +271,7 @@
<combo_box.drop_down_button
pad_bottom="1"
pad_left="10"
font="SansSerif"
font="SansSerifLarge"
label_color="Black"
label_color_selected="Black"
draw_focus_border="false"
@@ -109,7 +109,6 @@
left="2"
width="306"
halign="center"
font="SansSerifMedium"
font_shadow="hard"
valign="top">
Drop folders here to create new listings
@@ -69,7 +69,6 @@
<button
control_name="InventoryInboxToggleState"
label="Received items"
font="SansSerifMedium"
name="inbox_btn"
height="35"
image_unselected="MarketplaceBtn_Off"
@@ -100,7 +99,6 @@
top="10"
right="-58"
name="inbox_fresh_new_count"
font="SansSerifMedium"
halign="right"
top_pad="0">
[NUM] new
@@ -55,7 +55,6 @@
width="18" />
<panel_camera_item.text
follows="top|left|right"
font="SansSerifMedium"
height="15"
layout="topleft"
left ="38"
@@ -21,7 +21,7 @@
image_disabled_selected="PushButton_Selected_Disabled"
image_disabled="PushButton_Disabled"
button_width.min="70"
button_width.max="140"
button_width.max="172"
desired_height="24"
pad_left="10"
pad_right="10"
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<inventory_list_item
follows="top|right|left"
height="20"
height="21"
name="inventory_item"
tab_stop="false"
hover_image="ListItem_Over"
@@ -31,7 +31,7 @@
layout="topleft"
left="0"
name="item_icon"
top="0"
top="1"
width="16" />
<item_name
follows="left|right"