Merge branch 'develop' of https://github.com/secondlife/viewer
# Conflicts: # autobuild.xml # indra/cmake/00-Common.cmake # indra/llcommon/llsys.cpp # indra/llwindow/llwindow.cpp # indra/llwindow/llwindow.h # indra/llwindow/llwindowmacosx.cpp # indra/llwindow/llwindowmacosx.h # indra/llwindow/llwindowwin32.cpp # indra/llwindow/llwindowwin32.h # indra/newview/app_settings/logcontrol.xml # indra/newview/llappviewerwin32.cpp # indra/newview/llpanelpeople.h # indra/newview/llspeakers.cpp # indra/newview/llviewerregion.cpp # indra/newview/llviewerwindow.cpp # indra/newview/llvoavatar.cpp # indra/newview/llvoavatar.h # indra/newview/llvocache.cpp # indra/newview/llvoicechannel.cpp # indra/newview/llvoicechannel.h # indra/newview/llvoiceclient.h # indra/newview/llvoicevivox.cpp # indra/newview/skins/default/xui/en/panel_preferences_sound.xml # indra/newview/viewer_manifest.py # scripts/messages/message_template.msg.sha1master
commit
684bc1d1ea
|
|
@ -3,6 +3,7 @@
|
|||
# Trim trailing whitespace
|
||||
a0b3021bdcf76859054fda8e30abb3ed47749e83
|
||||
8444cd9562a6a7b755fcb075864e205122354192
|
||||
863c541ce0b2e3e1e566cc88423d3e87aaedb6ca
|
||||
# Wrong line endings
|
||||
1b67dd855c41f5a0cda7ec2a68d98071986ca703
|
||||
6cc7dd09d5e69cf57e6de7fb568a0ad2693f9c9a
|
||||
|
|
|
|||
|
|
@ -1,12 +1,6 @@
|
|||
name: Build
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
release_run:
|
||||
type: boolean
|
||||
description: Do a release of this build
|
||||
default: false
|
||||
pull_request:
|
||||
push:
|
||||
branches: ["main", "release/*", "project/*"]
|
||||
|
|
@ -231,6 +225,9 @@ jobs:
|
|||
elif [[ "$prefix" == "release" || "$prefix" == "main" ]];
|
||||
then
|
||||
export viewer_channel="Second Life Release"
|
||||
elif [[ "$branch" == "develop" ]];
|
||||
then
|
||||
export viewer_channel="Second Life Develop"
|
||||
else
|
||||
export viewer_channel="Second Life Test"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -0,0 +1,48 @@
|
|||
name: Tag a Build
|
||||
|
||||
on:
|
||||
# schedule event triggers always run on the default branch
|
||||
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
|
||||
schedule:
|
||||
# run "nightly" builds on default branch every mon/wed/fri
|
||||
- cron: "21 2 * * 2,4,6" # 2:21am UTC tues/thurs/sat == 7:21pm PDT mon/wed/fri -- see https://crontab.guru/#21_01_*_*_2,4,6
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
channel:
|
||||
description: "Channel to configure the build"
|
||||
required: true
|
||||
type: choice
|
||||
default: "Test"
|
||||
options:
|
||||
- "Test"
|
||||
- "Develop"
|
||||
- "Project"
|
||||
- "Release"
|
||||
project:
|
||||
description: "Project Name (used for channel name in project builds, and tag name for all builds)"
|
||||
default: "hippo"
|
||||
# TODO - add an input for selecting another sha to build other than head of branch
|
||||
|
||||
jobs:
|
||||
tag-release:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GITHUB_TAG_TOKEN: ${{ secrets.GITHUB_TAG_TOKEN }}
|
||||
steps:
|
||||
- name: Setup Env Vars
|
||||
run: |
|
||||
CHANNEL="${{ inputs.channel }}"
|
||||
echo VIEWER_CHANNEL="Second_Life_${CHANNEL:-Develop}" >> ${GITHUB_ENV}
|
||||
echo NIGHTLY_DATE=$(date --rfc-3339=date) >> ${GITHUB_ENV}
|
||||
- name: Update Tag
|
||||
uses: actions/github-script@v7.0.1
|
||||
if: env.GITHUB_TAG_TOKEN
|
||||
with:
|
||||
github-token: ${{ env.GITHUB_TAG_TOKEN }}
|
||||
script: |
|
||||
github.rest.git.createRef(
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
ref: "refs/tags/${{ env.VIEWER_CHANNEL }}#${{ env.NIGHTLY_DATE }}",
|
||||
sha: context.sha
|
||||
)
|
||||
|
|
@ -516,11 +516,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d152f19f4a5a9c8013f006e19b1fcd88692bccf1</string>
|
||||
<string>cd1f1d55a2488657ec2253774b3a414621f81b24</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>sha1</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-bugsplat/releases/download/v1.0.7-527603a/bugsplat-1.0.7-527603a-darwin64-527603a.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-bugsplat/releases/download/v1.1.5-71fc41e/bugsplat-1.1.1-9599607655-darwin64-9599607655.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -530,11 +530,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>1364da04333570b73c771e4f4acd1bacc7fc3f02</string>
|
||||
<string>9fb0615d17988bd89a2e5ae6d4d19e150afb54a9</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>sha1</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-bugsplat/releases/download/v1.0.7-527603a/bugsplat-4.0.3.0-527603a-windows64-527603a.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-bugsplat/releases/download/v1.1.5-71fc41e/bugsplat-5.0.1.0-9599607655-windows64-9599607655.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
|
|
@ -547,7 +547,7 @@
|
|||
<key>copyright</key>
|
||||
<string>Copyright 2003-2017, BugSplat</string>
|
||||
<key>version</key>
|
||||
<string>4.0.3.0-527603a</string>
|
||||
<string>5.0.1.0-71fc41e</string>
|
||||
<key>name</key>
|
||||
<string>bugsplat</string>
|
||||
<key>description</key>
|
||||
|
|
@ -1982,18 +1982,6 @@
|
|||
</map>
|
||||
<key>mikktspace</key>
|
||||
<map>
|
||||
<key>canonical_repo</key>
|
||||
<string>https://bitbucket.org/lindenlab/3p-mikktspace</string>
|
||||
<key>copyright</key>
|
||||
<string>Copyright (C) 2011 by Morten S. Mikkelsen, Copyright (C) 2022 Blender Authors</string>
|
||||
<key>description</key>
|
||||
<string>Mikktspace Tangent Generator</string>
|
||||
<key>license</key>
|
||||
<string>Apache 2.0</string>
|
||||
<key>license_file</key>
|
||||
<string>mikktspace.txt</string>
|
||||
<key>name</key>
|
||||
<string>mikktspace</string>
|
||||
<key>platforms</key>
|
||||
<map>
|
||||
<key>darwin64</key>
|
||||
|
|
@ -2039,8 +2027,20 @@
|
|||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>license</key>
|
||||
<string>Apache 2.0</string>
|
||||
<key>license_file</key>
|
||||
<string>mikktspace.txt</string>
|
||||
<key>copyright</key>
|
||||
<string>Copyright (C) 2011 by Morten S. Mikkelsen, Copyright (C) 2022 Blender Authors</string>
|
||||
<key>version</key>
|
||||
<string>1</string>
|
||||
<key>name</key>
|
||||
<string>mikktspace</string>
|
||||
<key>canonical_repo</key>
|
||||
<string>https://bitbucket.org/lindenlab/3p-mikktspace</string>
|
||||
<key>description</key>
|
||||
<string>Mikktspace Tangent Generator</string>
|
||||
</map>
|
||||
<key>minizip-ng</key>
|
||||
<map>
|
||||
|
|
@ -2980,6 +2980,8 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<string>LICENSE</string>
|
||||
<key>copyright</key>
|
||||
<string>Copyright (c) 2000-2012, Linden Research, Inc.</string>
|
||||
<key>version</key>
|
||||
<string>3.0-f14b5ec</string>
|
||||
<key>name</key>
|
||||
<string>viewer-manager</string>
|
||||
<key>description</key>
|
||||
|
|
@ -2988,8 +2990,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<string>https://bitbucket.org/lindenlab/vmp-standalone</string>
|
||||
<key>source_type</key>
|
||||
<string>hg</string>
|
||||
<key>version</key>
|
||||
<string>3.0-f14b5ec</string>
|
||||
</map>
|
||||
<key>vlc-bin</key>
|
||||
<map>
|
||||
|
|
@ -3138,11 +3138,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>21e31d2c2fffdb59d8f50b80db079f86f2df2483</string>
|
||||
<string>0a0a972036f2b2c9c97dead40c91f7443b8ab339</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.58/webrtc-m114.5735.08.58.8716173807-darwin64-8716173807.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.61-debug/webrtc-m114.5735.08.61-debug.9571929057-darwin64-9571929057.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -3152,11 +3152,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>600cabb49a889db3a29f2910f5bda08f28dd04c8</string>
|
||||
<string>8725ad23f33d946bd5a4e5f28e8c8324925c71a7</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>sha1</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.58/webrtc-m114.5735.08.58.8716173807-linux64-8716173807.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.61-debug/webrtc-m114.5735.08.61-debug.9571929057-linux64-9571929057.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>linux64</string>
|
||||
|
|
@ -3166,11 +3166,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>915c9face95efcc6da240aa2c4f8e6c4aa803af8</string>
|
||||
<string>db560661807db276a3c7d1e7d9531198c9268f68</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>sha1</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.58/webrtc-m114.5735.08.58.8716173807-windows64-8716173807.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-webrtc-build/releases/download/m114.5735.08.61-debug/webrtc-m114.5735.08.61-debug.9571929057-windows64-9571929057.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
|
|
@ -3183,7 +3183,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>copyright</key>
|
||||
<string>Copyright (c) 2011, The WebRTC project authors. All rights reserved.</string>
|
||||
<key>version</key>
|
||||
<string>m114.5735.08.59-debug.8823062977</string>
|
||||
<string>m114.5735.08.61-debug.9571929057</string>
|
||||
<key>name</key>
|
||||
<string>webrtc</string>
|
||||
<key>vcs_branch</key>
|
||||
|
|
|
|||
|
|
@ -611,6 +611,7 @@ Henri Beauchamp
|
|||
SL-19110
|
||||
SL-19159
|
||||
[NO JIRA] (fullbright HUD alpha fix)
|
||||
secondlife/viewer#1744
|
||||
herina Bode
|
||||
Hikkoshi Sakai
|
||||
VWR-429
|
||||
|
|
|
|||
|
|
@ -134,6 +134,9 @@ if (WINDOWS)
|
|||
# https://github.com/actions/runner-images/issues/10004#issuecomment-2153445161
|
||||
# can be removed after the above issue is resolved and deployed across GHA
|
||||
add_compile_definitions(_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR)
|
||||
|
||||
# Allow use of sprintf etc
|
||||
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
||||
endif (WINDOWS)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ elseif (DARWIN)
|
|||
FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY AudioToolbox)
|
||||
FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation)
|
||||
FIND_LIBRARY(COCOA_LIBRARY Cocoa)
|
||||
|
||||
|
||||
target_link_libraries( ll::webrtc INTERFACE
|
||||
libwebrtc.a
|
||||
${COREAUDIO_LIBRARY}
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ public: \
|
|||
void ll_aligned_free_fallback( void* ptr );
|
||||
//------------------------------------------------------------------------------------------------
|
||||
#else
|
||||
inline void* ll_aligned_malloc_fallback( size_t size, int align )
|
||||
inline void* ll_aligned_malloc_fallback( size_t size, size_t align )
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_MEMORY;
|
||||
#if defined(LL_WINDOWS)
|
||||
|
|
|
|||
|
|
@ -233,20 +233,8 @@ LLOSInfo::LLOSInfo() :
|
|||
if (mBuild >= 22000)
|
||||
{
|
||||
// At release Windows 11 version was 10.0.22000.194
|
||||
// Windows 10 version was 10.0.19043.1266
|
||||
// There is no warranty that Win10 build won't increase,
|
||||
// so until better solution is found or Microsoft updates
|
||||
// SDK with IsWindows11OrGreater(), indicate "10/11"
|
||||
//
|
||||
// Current alternatives:
|
||||
// Query WMI's Win32_OperatingSystem for OS string. Slow
|
||||
// and likely to return 'compatibility' string.
|
||||
// Check presence of dlls/libs or may be their version.
|
||||
// <FS:Ansariel> Windows 11 detection
|
||||
//mOSStringSimple = "Microsoft Windows 10/11 ";
|
||||
mMajorVer = 11;
|
||||
LLStringUtil::replaceString(mOSStringSimple, "10", "11");
|
||||
// </FS:Ansariel>
|
||||
// According to microsoft win 10 won't ever get that far.
|
||||
mOSStringSimple = "Microsoft Windows 11 ";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -941,15 +941,15 @@ std::string LLDir::getTempFilename() const
|
|||
}
|
||||
|
||||
// static
|
||||
std::string LLDir::getScrubbedFileName(const std::string uncleanFileName)
|
||||
std::string LLDir::getScrubbedFileName(std::string_view uncleanFileName)
|
||||
{
|
||||
std::string name(uncleanFileName);
|
||||
const std::string illegalChars(getForbiddenFileChars());
|
||||
// replace any illegal file chars with and underscore '_'
|
||||
for( unsigned int i = 0; i < illegalChars.length(); i++ )
|
||||
for (const char& ch : illegalChars)
|
||||
{
|
||||
std::string::size_type j = -1;
|
||||
while((j = name.find(illegalChars[i])) > std::string::npos)
|
||||
std::string::size_type j{ 0 };
|
||||
while ((j = name.find(ch, j)) != std::string::npos)
|
||||
{
|
||||
name[j] = '_';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@ class LLDir
|
|||
static std::string getDumpLogsDirPath(const std::string &file_name = "");
|
||||
|
||||
// For producing safe download file names from potentially unsafe ones
|
||||
static std::string getScrubbedFileName(const std::string uncleanFileName);
|
||||
static std::string getScrubbedFileName(std::string_view uncleanFileName);
|
||||
static std::string getForbiddenFileChars();
|
||||
void setDumpDir( const std::string& path );
|
||||
|
||||
|
|
|
|||
|
|
@ -517,7 +517,7 @@ inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)
|
|||
i++;
|
||||
}
|
||||
|
||||
S32 j = data.size()-1;
|
||||
size_t j = data.size()-1;
|
||||
while (j > 0 && data[j] > max)
|
||||
{
|
||||
j--;
|
||||
|
|
|
|||
|
|
@ -476,6 +476,7 @@ bool LLGLSLShader::createShader()
|
|||
}
|
||||
else if (mFeatures.mIndexedTextureChannels > 0)
|
||||
{ //override texture channels for indexed texture rendering
|
||||
llassert(mFeatures.mIndexedTextureChannels == LLGLSLShader::sIndexedTextureChannels); // these numbers must always match
|
||||
bind();
|
||||
S32 channel_count = mFeatures.mIndexedTextureChannels;
|
||||
|
||||
|
|
@ -485,19 +486,41 @@ bool LLGLSLShader::createShader()
|
|||
uniform1i(uniName, i);
|
||||
}
|
||||
|
||||
S32 cur_tex = channel_count; //adjust any texture channels that might have been overwritten
|
||||
//adjust any texture channels that might have been overwritten
|
||||
for (U32 i = 0; i < mTexture.size(); i++)
|
||||
{
|
||||
if (mTexture[i] > -1 && mTexture[i] < channel_count)
|
||||
if (mTexture[i] > -1)
|
||||
{
|
||||
llassert(cur_tex < gGLManager.mNumTextureImageUnits);
|
||||
uniform1i(i, cur_tex);
|
||||
mTexture[i] = cur_tex++;
|
||||
S32 new_tex = mTexture[i] + channel_count;
|
||||
uniform1i(i, new_tex);
|
||||
mTexture[i] = new_tex;
|
||||
}
|
||||
}
|
||||
|
||||
// get the true number of active texture channels
|
||||
mActiveTextureChannels = channel_count;
|
||||
for (auto& tex : mTexture)
|
||||
{
|
||||
mActiveTextureChannels = llmax(mActiveTextureChannels, tex + 1);
|
||||
}
|
||||
|
||||
// when indexed texture channels are used, enforce an upper limit of 16
|
||||
// this should act as a canary in the coal mine for adding textures
|
||||
// and breaking machines that are limited to 16 texture channels
|
||||
llassert(mActiveTextureChannels <= 16);
|
||||
unbind();
|
||||
}
|
||||
|
||||
LL_DEBUGS("GLSLTextureChannels") << mName << " has " << mActiveTextureChannels << " active texture channels" << LL_ENDL;
|
||||
|
||||
for (U32 i = 0; i < mTexture.size(); i++)
|
||||
{
|
||||
if (mTexture[i] > -1)
|
||||
{
|
||||
LL_DEBUGS("GLSLTextureChannels") << "Texture " << LLShaderMgr::instance()->mReservedUniforms[i] << " assigned to channel " << mTexture[i] << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LL_PROFILER_ENABLE_RENDER_DOC
|
||||
setLabel(mName.c_str());
|
||||
#endif
|
||||
|
|
@ -736,6 +759,10 @@ void LLGLSLShader::mapUniform(GLint index)
|
|||
//found it
|
||||
mUniform[i] = location;
|
||||
mTexture[i] = mapUniformTextureChannel(location, type, size);
|
||||
if (mTexture[i] != -1)
|
||||
{
|
||||
LL_DEBUGS("GLSLTextureChannels") << name << " assigned to texture channel " << mTexture[i] << LL_ENDL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -774,25 +801,21 @@ GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type, GLint
|
|||
if (size == 1)
|
||||
{
|
||||
glUniform1i(location, mActiveTextureChannels);
|
||||
LL_DEBUGS("ShaderUniform") << "Assigned to texture channel " << mActiveTextureChannels << LL_ENDL;
|
||||
mActiveTextureChannels++;
|
||||
}
|
||||
else
|
||||
{
|
||||
//is array of textures, make sequential after this texture
|
||||
GLint channel[32]; // <=== only support up to 32 texture channels
|
||||
llassert(size <= 32);
|
||||
size = llmin(size, 32);
|
||||
GLint channel[16]; // <=== only support up to 16 texture channels
|
||||
llassert(size <= 16);
|
||||
size = llmin(size, 16);
|
||||
for (int i = 0; i < size; ++i)
|
||||
{
|
||||
channel[i] = mActiveTextureChannels++;
|
||||
}
|
||||
glUniform1iv(location, size, channel);
|
||||
LL_DEBUGS("ShaderUniform") << "Assigned to texture channel " <<
|
||||
(mActiveTextureChannels - size) << " through " << (mActiveTextureChannels - 1) << LL_ENDL;
|
||||
}
|
||||
|
||||
llassert(mActiveTextureChannels <= 32); // too many textures (probably)
|
||||
return ret;
|
||||
}
|
||||
return -1;
|
||||
|
|
@ -1076,7 +1099,8 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLTexture* texture, LLTexUnit::eTextu
|
|||
|
||||
if (uniform < 0 || uniform >= (S32)mTexture.size())
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform out of range: " << uniform << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << uniform << LL_ENDL;
|
||||
llassert(false);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1097,6 +1121,8 @@ S32 LLGLSLShader::bindTexture(S32 uniform, LLRenderTarget* texture, bool depth,
|
|||
|
||||
if (uniform < 0 || uniform >= (S32)mTexture.size())
|
||||
{
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << uniform << LL_ENDL;
|
||||
llassert(false);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1144,7 +1170,8 @@ S32 LLGLSLShader::unbindTexture(S32 uniform, LLTexUnit::eTextureType mode)
|
|||
|
||||
if (uniform < 0 || uniform >= (S32)mTexture.size())
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform out of range: " << uniform << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << uniform << LL_ENDL;
|
||||
llassert(false);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1169,7 +1196,8 @@ S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode, LLTex
|
|||
|
||||
if (uniform < 0 || uniform >= (S32)mTexture.size())
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform out of range: " << uniform << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << uniform << LL_ENDL;
|
||||
llassert(false);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -1190,7 +1218,8 @@ S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode, LLTe
|
|||
|
||||
if (uniform < 0 || uniform >= (S32)mTexture.size())
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform out of range: " << uniform << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << uniform << LL_ENDL;
|
||||
llassert(false);
|
||||
return -1;
|
||||
}
|
||||
S32 index = mTexture[uniform];
|
||||
|
|
@ -1221,7 +1250,8 @@ void LLGLSLShader::uniform1i(U32 index, GLint x)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1246,7 +1276,8 @@ void LLGLSLShader::uniform1f(U32 index, GLfloat x)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1281,7 +1312,8 @@ void LLGLSLShader::uniform2f(U32 index, GLfloat x, GLfloat y)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1307,7 +1339,8 @@ void LLGLSLShader::uniform3f(U32 index, GLfloat x, GLfloat y, GLfloat z)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1333,7 +1366,8 @@ void LLGLSLShader::uniform4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1359,7 +1393,8 @@ void LLGLSLShader::uniform1iv(U32 index, U32 count, const GLint* v)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1385,7 +1420,8 @@ void LLGLSLShader::uniform4iv(U32 index, U32 count, const GLint* v)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1412,7 +1448,8 @@ void LLGLSLShader::uniform1fv(U32 index, U32 count, const GLfloat* v)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1438,7 +1475,8 @@ void LLGLSLShader::uniform2fv(U32 index, U32 count, const GLfloat* v)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1464,7 +1502,8 @@ void LLGLSLShader::uniform3fv(U32 index, U32 count, const GLfloat* v)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1490,7 +1529,8 @@ void LLGLSLShader::uniform4fv(U32 index, U32 count, const GLfloat* v)
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1517,7 +1557,8 @@ void LLGLSLShader::uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, c
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1537,7 +1578,8 @@ void LLGLSLShader::uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, c
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1557,7 +1599,8 @@ void LLGLSLShader::uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose,
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1577,7 +1620,8 @@ void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, c
|
|||
{
|
||||
if (mUniform.size() <= index)
|
||||
{
|
||||
LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
|
||||
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
|
||||
llassert(false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@ public:
|
|||
bool hasSrgb = false;
|
||||
bool isDeferred = false;
|
||||
bool hasScreenSpaceReflections = false;
|
||||
bool disableTextureIndex = false;
|
||||
bool hasAlphaMask = false;
|
||||
bool hasReflectionProbes = false;
|
||||
bool attachNothing = false;
|
||||
|
|
|
|||
|
|
@ -567,6 +567,5 @@ glh::matrix4f gl_perspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloa
|
|||
glh::matrix4f gl_lookat(LLVector3 eye, LLVector3 center, LLVector3 up);
|
||||
|
||||
#define LL_SHADER_LOADING_WARNS(...) LL_WARNS()
|
||||
#define LL_SHADER_UNIFORM_ERRS(...) LL_ERRS("Shader")
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -295,7 +295,7 @@ bool LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
|
|||
|
||||
if (features->hasLighting)
|
||||
{
|
||||
if (features->disableTextureIndex)
|
||||
if (features->mIndexedTextureChannels <= 1)
|
||||
{
|
||||
if (features->hasAlphaMask)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -636,12 +636,20 @@ void LLView::deleteAllChildren()
|
|||
updateBoundingRect();
|
||||
}
|
||||
|
||||
void LLView::setAllChildrenEnabled(bool b)
|
||||
void LLView::setAllChildrenEnabled(bool b, bool recursive /*= false*/)
|
||||
{
|
||||
for (LLView* viewp : mChildList)
|
||||
{
|
||||
viewp->setEnabled(b);
|
||||
}
|
||||
|
||||
if (recursive)
|
||||
{
|
||||
for (LLView* viewp : mChildList)
|
||||
{
|
||||
viewp->setAllChildrenEnabled(b, recursive);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
|
|
|
|||
|
|
@ -287,7 +287,7 @@ public:
|
|||
// children, etc.
|
||||
virtual void deleteAllChildren();
|
||||
|
||||
void setAllChildrenEnabled(bool b);
|
||||
void setAllChildrenEnabled(bool b, bool recursive = false);
|
||||
|
||||
virtual void setVisible(bool visible);
|
||||
void setVisibleDirect(bool visible) { mVisible = visible; }
|
||||
|
|
|
|||
|
|
@ -452,7 +452,7 @@ void ll_set_device_module_render_device(rtc::scoped_refptr<webrtc::AudioDeviceMo
|
|||
{
|
||||
device_module->SetPlayoutDevice(webrtc::AudioDeviceModule::kDefaultDevice);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
device_module->SetPlayoutDevice(device);
|
||||
}
|
||||
|
|
@ -648,7 +648,7 @@ void LLWebRTCImpl::freePeerConnection(LLWebRTCPeerConnectionInterface* peer_conn
|
|||
// Most peer connection (signaling) happens on
|
||||
// the signaling thread.
|
||||
|
||||
LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() :
|
||||
LLWebRTCPeerConnectionImpl::LLWebRTCPeerConnectionImpl() :
|
||||
mWebRTCImpl(nullptr),
|
||||
mPeerConnection(nullptr),
|
||||
mMute(false),
|
||||
|
|
@ -1163,7 +1163,7 @@ void LLWebRTCPeerConnectionImpl::OnSuccess(webrtc::SessionDescriptionInterface *
|
|||
{
|
||||
observer->OnOfferAvailable(mangled_sdp);
|
||||
}
|
||||
|
||||
|
||||
mPeerConnection->SetLocalDescription(std::unique_ptr<webrtc::SessionDescriptionInterface>(
|
||||
webrtc::CreateSessionDescription(webrtc::SdpType::kOffer, mangled_sdp)),
|
||||
rtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface>(this));
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ class LLWebRTCDeviceInterface
|
|||
};
|
||||
|
||||
virtual void setAudioConfig(AudioConfig config) = 0;
|
||||
|
||||
|
||||
// instructs webrtc to refresh the device list.
|
||||
virtual void refreshDevices() = 0;
|
||||
|
||||
|
|
@ -230,7 +230,7 @@ class LLWebRTCSignalingObserver
|
|||
class LLWebRTCPeerConnectionInterface
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
struct InitOptions
|
||||
{
|
||||
// equivalent of PeerConnectionInterface::IceServer
|
||||
|
|
|
|||
|
|
@ -230,7 +230,7 @@ class LLWebRTCImpl : public LLWebRTCDeviceInterface, public webrtc::AudioDeviceS
|
|||
|
||||
// The factory that allows creation of native webrtc PeerConnections.
|
||||
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> mPeerConnectionFactory;
|
||||
|
||||
|
||||
rtc::scoped_refptr<webrtc::AudioProcessing> mAudioProcessingModule;
|
||||
|
||||
// more native webrtc stuff
|
||||
|
|
|
|||
|
|
@ -418,7 +418,6 @@ LLWindow* LLWindowManager::createWindow(
|
|||
bool ignore_pixel_depth,
|
||||
U32 fsaa_samples,
|
||||
U32 max_cores,
|
||||
U32 max_vram,
|
||||
F32 max_gl_version,
|
||||
bool useLegacyCursors) // <FS:LO> Legacy cursor setting from main program
|
||||
{
|
||||
|
|
@ -438,13 +437,13 @@ LLWindow* LLWindowManager::createWindow(
|
|||
#elif LL_WINDOWS
|
||||
new_window = new LLWindowWin32(callbacks,
|
||||
title, name, x, y, width, height, flags,
|
||||
//fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples, max_cores, max_vram, max_gl_version);
|
||||
fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples, max_cores, max_vram, max_gl_version, useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
//fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples, max_cores, max_gl_version);
|
||||
fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples, max_cores, max_gl_version, useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
#elif LL_DARWIN
|
||||
new_window = new LLWindowMacOSX(callbacks,
|
||||
title, name, x, y, width, height, flags,
|
||||
//fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples, max_vram);
|
||||
fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples, max_vram, useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
//fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples);
|
||||
fullscreen, clearBg, enable_vsync, use_gl, ignore_pixel_depth, fsaa_samples, useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
#endif
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -164,8 +164,6 @@ public:
|
|||
virtual F32 getPixelAspectRatio() = 0;
|
||||
virtual void setNativeAspectRatio(F32 aspect) = 0;
|
||||
|
||||
virtual void setMaxVRAMMegabytes(U32 max_vram) = 0;
|
||||
|
||||
virtual void beforeDialog() {}; // prepare to put up an OS dialog (if special measures are required, such as in fullscreen mode)
|
||||
virtual void afterDialog() {}; // undo whatever was done in beforeDialog()
|
||||
|
||||
|
|
@ -293,14 +291,14 @@ protected:
|
|||
|
||||
// Platform-neutral for accessing the platform specific message box
|
||||
S32 OSMessageBox(const std::string& text, const std::string& caption, U32 type);
|
||||
const U32 OSMB_OK = 0;
|
||||
const U32 OSMB_OKCANCEL = 1;
|
||||
const U32 OSMB_YESNO = 2;
|
||||
constexpr U32 OSMB_OK = 0;
|
||||
constexpr U32 OSMB_OKCANCEL = 1;
|
||||
constexpr U32 OSMB_YESNO = 2;
|
||||
|
||||
const S32 OSBTN_YES = 0;
|
||||
const S32 OSBTN_NO = 1;
|
||||
const S32 OSBTN_OK = 2;
|
||||
const S32 OSBTN_CANCEL = 3;
|
||||
constexpr S32 OSBTN_YES = 0;
|
||||
constexpr S32 OSBTN_NO = 1;
|
||||
constexpr S32 OSBTN_OK = 2;
|
||||
constexpr S32 OSBTN_CANCEL = 3;
|
||||
|
||||
//
|
||||
// LLWindowManager
|
||||
|
|
@ -320,7 +318,6 @@ public:
|
|||
bool ignore_pixel_depth = false,
|
||||
U32 fsaa_samples = 0,
|
||||
U32 max_cores = 0,
|
||||
U32 max_vram = 0,
|
||||
F32 max_gl_version = 4.6f,
|
||||
bool useLegacyCursors = false); // <FS:LO> Legacy cursor setting from main program
|
||||
static bool destroyWindow(LLWindow* window);
|
||||
|
|
@ -337,6 +334,4 @@ extern const S32 gURLProtocolWhitelistCount;
|
|||
extern const std::string gURLProtocolWhitelist[];
|
||||
//extern const std::string gURLProtocolWhitelistHandler[];
|
||||
|
||||
void simpleEscapeString ( std::string& stringIn );
|
||||
|
||||
#endif // _LL_window_h_
|
||||
|
|
|
|||
|
|
@ -101,8 +101,6 @@ public:
|
|||
/*virtual*/ F32 getPixelAspectRatio() override { return 1.0f; }
|
||||
/*virtual*/ void setNativeAspectRatio(F32 ratio) override {}
|
||||
|
||||
void setMaxVRAMMegabytes(U32 max_vram) override {}
|
||||
|
||||
/*virtual*/ void *getPlatformWindow() override { return 0; }
|
||||
/*virtual*/ void bringToFront() override {}
|
||||
|
||||
|
|
|
|||
|
|
@ -128,7 +128,6 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
|
|||
bool enable_vsync, bool use_gl,
|
||||
bool ignore_pixel_depth,
|
||||
U32 fsaa_samples,
|
||||
U32 max_vram,
|
||||
bool useLegacyCursors) // <FS:LO> Legacy cursor setting from main program
|
||||
: LLWindow(NULL, fullscreen, flags)
|
||||
, mUseLegacyCursors(useLegacyCursors) // <FS:LO> Legacy cursor setting from main program
|
||||
|
|
|
|||
|
|
@ -100,8 +100,6 @@ public:
|
|||
F32 getPixelAspectRatio() override;
|
||||
void setNativeAspectRatio(F32 ratio) override { mOverrideAspectRatio = ratio; }
|
||||
|
||||
virtual void setMaxVRAMMegabytes(U32 max_vram) override {}
|
||||
|
||||
void beforeDialog() override;
|
||||
void afterDialog() override;
|
||||
|
||||
|
|
@ -157,7 +155,6 @@ protected:
|
|||
bool fullscreen, bool clearBg, bool enable_vsync, bool use_gl,
|
||||
bool ignore_pixel_depth,
|
||||
U32 fsaa_samples,
|
||||
U32 max_vram,
|
||||
bool useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
~LLWindowMacOSX();
|
||||
|
||||
|
|
|
|||
|
|
@ -404,7 +404,6 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
|
|||
|
||||
using FuncType = std::function<void()>;
|
||||
// call GetMessage() and pull enqueue messages for later processing
|
||||
void gatherInput();
|
||||
HWND mWindowHandleThrd = NULL;
|
||||
HDC mhDCThrd = 0;
|
||||
|
||||
|
|
@ -412,8 +411,6 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
|
|||
// until after some graphics setup. See SL-20177. -Cosmic,2023-09-18
|
||||
bool mGLReady = false;
|
||||
bool mGotGLBuffer = false;
|
||||
|
||||
U32 mMaxVRAM = 0; // maximum amount of vram to allow in the "budget", or 0 for no maximum (see updateVRAMUsage)
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -425,7 +422,6 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
|
|||
bool ignore_pixel_depth,
|
||||
U32 fsaa_samples,
|
||||
U32 max_cores,
|
||||
U32 max_vram,
|
||||
F32 max_gl_version,
|
||||
bool useLegacyCursors) // <FS:LO> Legacy cursor setting from main program
|
||||
:
|
||||
|
|
@ -435,7 +431,6 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
|
|||
{
|
||||
sMainThreadId = LLThread::currentID();
|
||||
mWindowThread = new LLWindowWin32Thread();
|
||||
mWindowThread->mMaxVRAM = max_vram;
|
||||
|
||||
//MAINT-516 -- force a load of opengl32.dll just in case windows went sideways
|
||||
LoadLibrary(L"opengl32.dll");
|
||||
|
|
@ -4636,15 +4631,6 @@ std::vector<std::string> LLWindowWin32::getDynamicFallbackFontList()
|
|||
// Fonts previously in getFontListSans() have moved to fonts.xml.
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
void LLWindowWin32::setMaxVRAMMegabytes(U32 max_vram)
|
||||
{
|
||||
if (mWindowThread)
|
||||
{
|
||||
mWindowThread->mMaxVRAM = max_vram;
|
||||
}
|
||||
}
|
||||
|
||||
// <FS:ND> Allow to query for window chrome sizes.
|
||||
void LLWindowWin32::getWindowChrome( U32 &aChromeW, U32 &aChromeH )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -108,8 +108,6 @@ public:
|
|||
/*virtual*/ F32 getPixelAspectRatio();
|
||||
/*virtual*/ void setNativeAspectRatio(F32 ratio) { mOverrideAspectRatio = ratio; }
|
||||
|
||||
/*virtual*/ void setMaxVRAMMegabytes(U32 max_vram) override;
|
||||
|
||||
/*virtual*/ bool dialogColorPicker(F32 *r, F32 *g, F32 *b );
|
||||
|
||||
/*virtual*/ void *getPlatformWindow();
|
||||
|
|
@ -143,13 +141,12 @@ protected:
|
|||
LLWindowWin32(LLWindowCallbacks* callbacks,
|
||||
const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags,
|
||||
bool fullscreen, bool clearBg, bool enable_vsync, bool use_gl,
|
||||
//bool ignore_pixel_depth, U32 fsaa_samples, U32 max_cores, U32 max_vram, F32 max_gl_version);
|
||||
bool ignore_pixel_depth, U32 fsaa_samples, U32 max_cores, U32 max_vram, F32 max_gl_version, bool useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
//bool ignore_pixel_depth, U32 fsaa_samples, U32 max_cores, F32 max_gl_version);
|
||||
bool ignore_pixel_depth, U32 fsaa_samples, U32 max_cores, F32 max_gl_version, bool useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
~LLWindowWin32();
|
||||
|
||||
//void initCursors();
|
||||
void initCursors(bool useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
void initInputDevices();
|
||||
HCURSOR loadColorCursor(LPCTSTR name);
|
||||
bool isValid();
|
||||
void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
|
||||
|
|
@ -166,7 +163,6 @@ protected:
|
|||
|
||||
bool shouldPostQuit() { return mPostQuit; }
|
||||
|
||||
void fillCompositionForm(const LLRect& bounds, COMPOSITIONFORM *form);
|
||||
void fillCandidateForm(const LLCoordGL& caret, const LLRect& bounds, CANDIDATEFORM *form);
|
||||
void fillCharPosition(const LLCoordGL& caret, const LLRect& bounds, const LLRect& control, IMECHARPOSITION *char_position);
|
||||
void fillCompositionLogfont(LOGFONT *logfont);
|
||||
|
|
@ -181,10 +177,8 @@ protected:
|
|||
//
|
||||
|
||||
bool getClientRectInScreenSpace(RECT* rectp);
|
||||
void updateJoystick( );
|
||||
|
||||
static LRESULT CALLBACK mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_param, LPARAM l_param);
|
||||
static bool CALLBACK enumChildWindows(HWND h_wnd, LPARAM l_param);
|
||||
|
||||
|
||||
//
|
||||
|
|
@ -295,8 +289,6 @@ private:
|
|||
extern LLW32MsgCallback gAsyncMsgCallback;
|
||||
extern LPWSTR gIconResource;
|
||||
|
||||
static void handleMessage( const MSG& msg );
|
||||
|
||||
S32 OSMessageBoxWin32(const std::string& text, const std::string& caption, U32 type);
|
||||
|
||||
#endif //LL_LLWINDOWWIN32_H
|
||||
|
|
|
|||
|
|
@ -1945,6 +1945,15 @@
|
|||
<key>tooltip</key>
|
||||
<string/>
|
||||
</map>
|
||||
<key>INVENTORY_SETTING</key>
|
||||
<map>
|
||||
<key>type</key>
|
||||
<string>integer</string>
|
||||
<key>value</key>
|
||||
<integer>56</integer>
|
||||
<key>tooltip</key>
|
||||
<string/>
|
||||
</map>
|
||||
<key>INVENTORY_SOUND</key>
|
||||
<map>
|
||||
<key>type</key>
|
||||
|
|
|
|||
|
|
@ -71,8 +71,8 @@
|
|||
<string>Avatar</string>
|
||||
<string>Inventory</string>
|
||||
<string>SceneLoadTiming</string>
|
||||
<string>Voice</string>
|
||||
<string>Avatar</string>
|
||||
<string>Avatar</string>
|
||||
<string>Voice</string>
|
||||
-->
|
||||
<string>import</string>
|
||||
<string>export</string>
|
||||
|
|
|
|||
|
|
@ -12772,17 +12772,6 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RenderTerrainPBRForce</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Force-load PBR terrain if enabled</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RenderTerrainPBRDetail</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -23,8 +23,7 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
uniform sampler2D noiseMap;
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D noiseMap;
|
||||
uniform sampler2D depthMap;
|
||||
|
||||
uniform float ssao_radius;
|
||||
|
|
|
|||
|
|
@ -27,8 +27,6 @@
|
|||
|
||||
out vec4 frag_color;
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
void main()
|
||||
{
|
||||
frag_color = vec4(1,1,1,1);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
out vec4 frag_color;
|
||||
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D lightMap;
|
||||
|
||||
uniform float dist_factor;
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@ SOFTWARE.
|
|||
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D depthMap;
|
||||
uniform sampler2D emissiveRect;
|
||||
uniform sampler2D projectionMap; // rgba
|
||||
uniform sampler2D brdfLut;
|
||||
|
||||
|
|
|
|||
|
|
@ -27,8 +27,6 @@
|
|||
|
||||
out vec4 frag_color;
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
in vec4 post_pos;
|
||||
in float target_pos_x;
|
||||
in vec4 vertex_color;
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@
|
|||
*/
|
||||
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D depthMap;
|
||||
|
||||
#if defined(SUN_SHADOW)
|
||||
uniform sampler2DShadow shadowMap0;
|
||||
|
|
|
|||
|
|
@ -135,8 +135,7 @@ vec3 tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] kh
|
|||
return (weights.x * vertex_binormal.xyz) + (weights.y * vertex_tangent.xyz);
|
||||
}
|
||||
|
||||
// Similar to tangent_space_transform but no offset during coordinate system
|
||||
// conversion, and no texture animation support.
|
||||
// Similar to tangent_space_transform but no texture animation support.
|
||||
vec3 terrain_tangent_space_transform(vec4 vertex_tangent, vec3 vertex_normal, vec4[2] khr_gltf_transform)
|
||||
{
|
||||
// Immediately convert to left-handed coordinate system ((0,1) -> (0, -1))
|
||||
|
|
|
|||
|
|
@ -25,7 +25,10 @@
|
|||
|
||||
in vec2 tc;
|
||||
|
||||
#if defined(COPY_DEPTH)
|
||||
uniform sampler2D depthMap;
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
out vec4 frag_color;
|
||||
|
|
|
|||
|
|
@ -25,8 +25,6 @@
|
|||
|
||||
out vec4 frag_color;
|
||||
|
||||
uniform sampler2D normalMap;
|
||||
|
||||
// Inputs
|
||||
uniform vec3 sun_dir;
|
||||
uniform vec3 moon_dir;
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
out vec4 frag_color;
|
||||
|
||||
uniform sampler2D depthMap;
|
||||
uniform sampler2D diffuseRect;
|
||||
uniform sampler2D specularRect;
|
||||
uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl
|
||||
|
|
|
|||
|
|
@ -29,10 +29,8 @@ out vec4 frag_color;
|
|||
|
||||
uniform sampler2D diffuseRect;
|
||||
uniform sampler2D specularRect;
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl
|
||||
uniform sampler2D lightFunc;
|
||||
uniform sampler2D depthMap;
|
||||
|
||||
uniform vec3 env_mat[3];
|
||||
uniform float sun_wash;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ out vec4 frag_color;
|
|||
|
||||
uniform sampler2D diffuseRect;
|
||||
uniform sampler2D specularRect;
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl
|
||||
|
||||
const float M_PI = 3.14159265;
|
||||
|
|
@ -38,7 +37,6 @@ const float M_PI = 3.14159265;
|
|||
uniform sampler2D lightMap;
|
||||
#endif
|
||||
|
||||
uniform sampler2D depthMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
uniform float blur_size;
|
||||
|
|
|
|||
|
|
@ -29,12 +29,9 @@ out vec4 frag_color;
|
|||
|
||||
uniform sampler2D diffuseRect;
|
||||
uniform sampler2D specularRect;
|
||||
uniform sampler2D depthMap;
|
||||
uniform sampler2D normalMap;
|
||||
uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D lightMap;
|
||||
uniform sampler2D projectionMap; // rgba
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
uniform mat4 proj_mat; //screen space to light space
|
||||
|
|
|
|||
|
|
@ -28,8 +28,6 @@ out vec4 frag_color;
|
|||
// Inputs
|
||||
in vec4 vary_fragcoord;
|
||||
|
||||
uniform sampler2D normalMap;
|
||||
|
||||
vec4 getPositionWithDepth(vec2 pos_screen, float depth);
|
||||
float getDepth(vec2 pos_screen);
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
out vec4 frag_color;
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
uniform sampler2D bumpMap;
|
||||
|
||||
#ifdef TRANSPARENT_WATER
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@
|
|||
#include "BugSplat.h"
|
||||
#include "boost/json.hpp" // Boost.Json
|
||||
#include "llagent.h" // for agent location
|
||||
#include "llstartup.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llvoavatarself.h" // for agent name
|
||||
#pragma optimize( "", off )
|
||||
|
|
@ -155,8 +156,7 @@ namespace
|
|||
// We don't have an email address for any user. Hijack this
|
||||
// metadata field for the platform identifier.
|
||||
// sBugSplatSender->setDefaultUserEmail(
|
||||
// WCSTR(STRINGIZE(LLOSInfo::instance().getOSStringSimple() << " ("
|
||||
// << ADDRESS_SIZE << "-bit)")));
|
||||
// WCSTR(LLOSInfo::instance().getOSStringSimple()));
|
||||
|
||||
// <FS:ND> Add which flavor of FS generated an error
|
||||
std::string flavor = "hvk";
|
||||
|
|
@ -195,6 +195,8 @@ namespace
|
|||
|
||||
// LL_ERRS message, when there is one
|
||||
sBugSplatSender->setDefaultUserDescription(WCSTR(LLError::getFatalMessage()));
|
||||
// App state
|
||||
sBugSplatSender->setAttribute(WCSTR(L"AppState"), WCSTR(LLStartUp::getStartupStateString()));
|
||||
|
||||
if (gAgent.getRegion())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -756,9 +756,12 @@ void LLRenderPass::pushGLTFBatch(LLDrawInfo& params)
|
|||
{
|
||||
auto& mat = params.mGLTFMaterial;
|
||||
|
||||
mat->bind(params.mTexture);
|
||||
if (mat.notNull())
|
||||
{
|
||||
mat->bind(params.mTexture);
|
||||
}
|
||||
|
||||
LLGLDisable cull_face(mat->mDoubleSided ? GL_CULL_FACE : 0);
|
||||
LLGLDisable cull_face(mat.notNull() && mat->mDoubleSided ? GL_CULL_FACE : 0);
|
||||
|
||||
setup_texture_matrix(params);
|
||||
|
||||
|
|
|
|||
|
|
@ -220,7 +220,7 @@ void LLDrawPoolTerrain::drawLoop()
|
|||
|
||||
void LLDrawPoolTerrain::renderFullShader()
|
||||
{
|
||||
const bool use_local_materials = gLocalTerrainMaterials.materialsReady(true, false);
|
||||
const bool use_local_materials = gLocalTerrainMaterials.makeMaterialsReady(true, false);
|
||||
// Hack! Get the region that this draw pool is rendering from!
|
||||
LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
|
||||
LLVLComposition *compp = regionp->getComposition();
|
||||
|
|
|
|||
|
|
@ -375,7 +375,7 @@ void LLFloaterRegionInfo::requestRegionInfo()
|
|||
{
|
||||
tab->getChild<LLPanel>("General")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Debug")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Terrain")->setAllChildrenEnabled(false, true);
|
||||
tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Access")->setCtrlsEnabled(false);
|
||||
}
|
||||
|
|
@ -601,7 +601,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
|
|||
panel->getChild<LLUICtrl>("terrain_raise_spin")->setValue(region_info.mTerrainRaiseLimit);
|
||||
panel->getChild<LLUICtrl>("terrain_lower_spin")->setValue(region_info.mTerrainLowerLimit);
|
||||
|
||||
panel->setCtrlsEnabled(allow_modify);
|
||||
panel->setAllChildrenEnabled(allow_modify, true);
|
||||
|
||||
if (floater->getVisible())
|
||||
{
|
||||
|
|
@ -716,7 +716,7 @@ void LLFloaterRegionInfo::disableTabCtrls()
|
|||
|
||||
tab->getChild<LLPanel>("General")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Debug")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Terrain")->setAllChildrenEnabled(false, true);
|
||||
tab->getChild<LLPanel>("panel_env_info")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(false);
|
||||
tab->getChild<LLPanel>("Access")->setCtrlsEnabled(false);
|
||||
|
|
@ -1843,7 +1843,7 @@ bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
|
|||
|| (region && (region->getOwner() == gAgent.getID()));
|
||||
bool owner_or_god_or_manager = owner_or_god
|
||||
|| (region && region->isEstateManager());
|
||||
setCtrlsEnabled(owner_or_god_or_manager);
|
||||
setAllChildrenEnabled(owner_or_god_or_manager, true);
|
||||
|
||||
getChildView("apply_btn")->setEnabled(false);
|
||||
|
||||
|
|
@ -1855,8 +1855,8 @@ bool LLPanelRegionTerrainInfo::refreshFromRegion(LLViewerRegion* region)
|
|||
|
||||
static LLCachedControl<bool> feature_pbr_terrain_enabled(gSavedSettings, "RenderTerrainPBREnabled", false);
|
||||
|
||||
const bool textures_ready = compp->texturesReady(false, false);
|
||||
const bool materials_ready = feature_pbr_terrain_enabled && compp->materialsReady(false, false);
|
||||
const bool textures_ready = compp->makeTexturesReady(false, false);
|
||||
const bool materials_ready = feature_pbr_terrain_enabled && compp->makeMaterialsReady(false, false);
|
||||
|
||||
bool set_texture_swatches;
|
||||
bool set_material_swatches;
|
||||
|
|
|
|||
|
|
@ -561,7 +561,7 @@ public:
|
|||
// Inherited from LLCore::HttpHandler
|
||||
virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response);
|
||||
|
||||
LLViewerFetchedTexture* FindViewerTexture(const LLImportMaterial& material);
|
||||
static LLViewerFetchedTexture* FindViewerTexture(const LLImportMaterial& material);
|
||||
|
||||
private:
|
||||
LLHandle<LLWholeModelFeeObserver> mFeeObserverHandle;
|
||||
|
|
|
|||
|
|
@ -765,6 +765,32 @@ void LLModelPreview::rebuildUploadData()
|
|||
}
|
||||
instance.mTransform = mat;
|
||||
mUploadData.push_back(instance);
|
||||
|
||||
// if uploading textures, make sure textures are present
|
||||
if (mFMP->childGetValue("upload_textures").asBoolean()) // too early to cheack if still loading
|
||||
{
|
||||
for (auto& mat_pair : instance.mMaterial)
|
||||
{
|
||||
LLImportMaterial& material = mat_pair.second;
|
||||
|
||||
if (material.mDiffuseMapFilename.size())
|
||||
{
|
||||
LLViewerFetchedTexture* texture = LLMeshUploadThread::FindViewerTexture(material);
|
||||
if (texture && texture->isMissingAsset())
|
||||
{
|
||||
// in case user provided a missing file later
|
||||
texture->setIsMissingAsset(false);
|
||||
texture->setLoadedCallback(LLModelPreview::textureLoadedCallback, 0, true, false, this, NULL, false);
|
||||
texture->forceToSaveRawImage(0, F32_MAX);
|
||||
texture->updateFetch();
|
||||
if (mModelLoader)
|
||||
{
|
||||
mModelLoader->mNumOfFetchingTextures++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1957,7 +1957,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
|||
mCtrlShinyOffsetV->setValue(offset_y);
|
||||
getChild<LLUICtrl>("glossiness")->setValue(material->getSpecularLightExponent());
|
||||
getChild<LLUICtrl>("environment")->setValue(material->getEnvironmentIntensity());
|
||||
getChild<LLUICtrl>("mirror")->setValue(material->getEnvironmentIntensity());
|
||||
|
||||
updateShinyControls(!material->getSpecularID().isNull(), true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ public:
|
|||
// Implements LLVoiceClientStatusObserver::onChange() to enable call buttons
|
||||
// when voice is available
|
||||
void onChange(EStatusType status, const LLSD& channelInfo, bool proximal) override;
|
||||
|
||||
// <FS:Ansariel> CTRL-F focusses local search editor
|
||||
bool handleKeyHere(KEY key, MASK mask) override;
|
||||
bool hasAccelerators() const override { return true; }
|
||||
|
|
|
|||
|
|
@ -251,32 +251,27 @@ bool LLReflectionMap::getBox(LLMatrix4& box)
|
|||
if (mViewerObject)
|
||||
{
|
||||
LLVolume* volume = mViewerObject->getVolume();
|
||||
if (volume)
|
||||
if (volume && mViewerObject->getReflectionProbeIsBox())
|
||||
{
|
||||
LLVOVolume* vobjp = (LLVOVolume*)mViewerObject;
|
||||
|
||||
if (vobjp->getReflectionProbeIsBox())
|
||||
glh::matrix4f mv(gGLModelView);
|
||||
glh::matrix4f scale;
|
||||
LLVector3 s = mViewerObject->getScale().scaledVec(LLVector3(0.5f, 0.5f, 0.5f));
|
||||
mRadius = s.magVec();
|
||||
scale.set_scale(glh::vec3f(s.mV));
|
||||
if (mViewerObject->mDrawable != nullptr)
|
||||
{
|
||||
glh::matrix4f mv(gGLModelView);
|
||||
glh::matrix4f scale;
|
||||
LLVector3 s = vobjp->getScale().scaledVec(LLVector3(0.5f, 0.5f, 0.5f));
|
||||
mRadius = s.magVec();
|
||||
scale.set_scale(glh::vec3f(s.mV));
|
||||
if (vobjp->mDrawable != nullptr)
|
||||
{
|
||||
// object to agent space (no scale)
|
||||
glh::matrix4f rm((F32*)vobjp->mDrawable->getWorldMatrix().mMatrix);
|
||||
// object to agent space (no scale)
|
||||
glh::matrix4f rm((F32*)mViewerObject->mDrawable->getWorldMatrix().mMatrix);
|
||||
|
||||
// construct object to camera space (with scale)
|
||||
mv = mv * rm * scale;
|
||||
// construct object to camera space (with scale)
|
||||
mv = mv * rm * scale;
|
||||
|
||||
// inverse is camera space to object unit cube
|
||||
mv = mv.inverse();
|
||||
// inverse is camera space to object unit cube
|
||||
mv = mv.inverse();
|
||||
|
||||
box = LLMatrix4(mv.m);
|
||||
box = LLMatrix4(mv.m);
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -294,6 +294,10 @@ LLSpeakerMgr::~LLSpeakerMgr()
|
|||
|
||||
LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::string& name, LLSpeaker::ESpeakerStatus status, LLSpeaker::ESpeakerType type)
|
||||
{
|
||||
if (!mVoiceChannel)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
LLUUID session_id = getSessionID();
|
||||
if (id.isNull() || (id == session_id))
|
||||
{
|
||||
|
|
@ -496,7 +500,7 @@ void LLSpeakerMgr::updateSpeakerList()
|
|||
(LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL));
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (mVoiceChannel)
|
||||
{
|
||||
// If not, check if the list is empty, except if it's Nearby Chat (session_id NULL).
|
||||
LLUUID session_id = getSessionID();
|
||||
|
|
@ -827,7 +831,7 @@ void LLIMSpeakerMgr::allowTextChat(const LLUUID& speaker_id, bool allow)
|
|||
// is unreliable and this leads to situations where people can't be
|
||||
// chat muted at all anymore
|
||||
// LLPointer<LLSpeaker> speakerp = findSpeaker(speaker_id);
|
||||
// if (!speakerp) return;
|
||||
// if (!speakerp || !mVoiceChannel) return;
|
||||
|
||||
std::string url = gAgent.getRegionCapability("ChatSessionRequest");
|
||||
LLSD data;
|
||||
|
|
@ -848,7 +852,7 @@ void LLIMSpeakerMgr::allowTextChat(const LLUUID& speaker_id, bool allow)
|
|||
void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
|
||||
{
|
||||
LLPointer<LLSpeaker> speakerp = findSpeaker(avatar_id);
|
||||
if (!speakerp) return;
|
||||
if (!speakerp || !mVoiceChannel) return;
|
||||
|
||||
// *NOTE: mantipov: probably this condition will be incorrect when avatar will be blocked for
|
||||
// text chat via moderation (LLSpeaker::mModeratorMutedText == true)
|
||||
|
|
|
|||
|
|
@ -519,10 +519,17 @@ void draw_shockwave(F32 center_z, F32 t, S32 steps, LLColor4 color)
|
|||
gGL.end();
|
||||
}
|
||||
|
||||
|
||||
void LLTracker::drawBeacon(LLVector3 pos_agent, std::string direction, LLColor4 fogged_color, F32 dist)
|
||||
{
|
||||
const U32 BEACON_VERTS = 256;
|
||||
F32 step;
|
||||
const F32 MAX_HEIGHT = 5020.f;
|
||||
const U32 BEACON_ROWS = 256;
|
||||
|
||||
U32 nRows;
|
||||
F32 height;
|
||||
F32 rowHeight;
|
||||
|
||||
LLColor4 c_col, col_next, col_edge, col_edge_next;
|
||||
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
gGL.pushMatrix();
|
||||
|
|
@ -531,59 +538,99 @@ void LLTracker::drawBeacon(LLVector3 pos_agent, std::string direction, LLColor4
|
|||
{
|
||||
gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
|
||||
draw_shockwave(1024.f, gRenderStartTime.getElapsedTimeF32(), 32, fogged_color);
|
||||
step = (5020.0f - pos_agent.mV[2]) / BEACON_VERTS;
|
||||
height = MAX_HEIGHT - pos_agent.mV[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], 0);
|
||||
step = pos_agent.mV[2] / BEACON_VERTS;
|
||||
height = pos_agent.mV[2];
|
||||
}
|
||||
|
||||
gGL.color4fv(fogged_color.mV);
|
||||
nRows = ceil((BEACON_ROWS * height) / MAX_HEIGHT);
|
||||
if(nRows<2) nRows=2;
|
||||
rowHeight = height / nRows;
|
||||
|
||||
LLVector3 x_axis = LLViewerCamera::getInstance()->getLeftAxis();
|
||||
F32 t = gRenderStartTime.getElapsedTimeF32();
|
||||
gGL.color4fv(fogged_color.mV);
|
||||
|
||||
for (U32 i = 0; i < BEACON_VERTS; i++)
|
||||
{
|
||||
F32 x = x_axis.mV[0];
|
||||
F32 y = x_axis.mV[1];
|
||||
LLVector3 x_axis = LLViewerCamera::getInstance()->getLeftAxis();
|
||||
F32 t = gRenderStartTime.getElapsedTimeF32();
|
||||
|
||||
F32 z = i * step;
|
||||
F32 z_next = (i+1)*step;
|
||||
F32 x = x_axis.mV[0];
|
||||
F32 y = x_axis.mV[1];
|
||||
F32 z = 0.f;
|
||||
F32 z_next;
|
||||
|
||||
bool tracking_avatar = getTrackingStatus() == TRACKING_AVATAR;
|
||||
F32 a = pulse_func(t, z, tracking_avatar, direction);
|
||||
F32 an = pulse_func(t, z_next, tracking_avatar, direction);
|
||||
F32 a,an;
|
||||
F32 xa,xan;
|
||||
F32 ya,yan;
|
||||
|
||||
LLColor4 c_col = fogged_color + LLColor4(a,a,a,a);
|
||||
LLColor4 col_next = fogged_color + LLColor4(an,an,an,an);
|
||||
LLColor4 col_edge = fogged_color * LLColor4(a,a,a,0.0f);
|
||||
LLColor4 col_edge_next = fogged_color * LLColor4(an,an,an,0.0f);
|
||||
bool tracking_avatar = getTrackingStatus() == TRACKING_AVATAR;
|
||||
|
||||
a *= 2.f;
|
||||
a += 1.0f;
|
||||
gGL.begin(LLRender::TRIANGLES);
|
||||
|
||||
an *= 2.f;
|
||||
an += 1.0f;
|
||||
for (U32 i = 0; i < nRows; i++)
|
||||
{
|
||||
z_next = z + rowHeight;
|
||||
|
||||
gGL.begin(LLRender::TRIANGLE_STRIP);
|
||||
gGL.color4fv(col_edge.mV);
|
||||
gGL.vertex3f(-x*a, -y*a, z);
|
||||
gGL.color4fv(col_edge_next.mV);
|
||||
gGL.vertex3f(-x*an, -y*an, z_next);
|
||||
a = pulse_func(t, z, tracking_avatar, direction);
|
||||
an = pulse_func(t, z_next, tracking_avatar, direction);
|
||||
|
||||
gGL.color4fv(c_col.mV);
|
||||
gGL.vertex3f(0, 0, z);
|
||||
gGL.color4fv(col_next.mV);
|
||||
gGL.vertex3f(0, 0, z_next);
|
||||
c_col = fogged_color + LLColor4(a, a, a, a);
|
||||
col_next = fogged_color + LLColor4(an, an, an, an);
|
||||
col_edge = fogged_color * LLColor4(a, a, a, 0.0f);
|
||||
col_edge_next = fogged_color * LLColor4(an, an, an, 0.0f);
|
||||
|
||||
gGL.color4fv(col_edge.mV);
|
||||
gGL.vertex3f(x*a,y*a,z);
|
||||
gGL.color4fv(col_edge_next.mV);
|
||||
gGL.vertex3f(x*an,y*an,z_next);
|
||||
gGL.end();
|
||||
a = a + a + 1.f;
|
||||
an = an + an + 1.f;
|
||||
|
||||
xa = x*a;
|
||||
ya = y*a;
|
||||
xan = x*an;
|
||||
yan = y*an;
|
||||
|
||||
gGL.color4fv(col_edge.mV);
|
||||
gGL.vertex3f(-xa, -ya, z);
|
||||
|
||||
gGL.color4fv(col_next.mV);
|
||||
gGL.vertex3f(0, 0, z_next);
|
||||
|
||||
gGL.color4fv(col_edge_next.mV);
|
||||
gGL.vertex3f(-xan, -yan, z_next);
|
||||
|
||||
|
||||
gGL.color4fv(col_edge.mV);
|
||||
gGL.vertex3f(-xa, -ya, z);
|
||||
|
||||
gGL.color4fv(c_col.mV);
|
||||
gGL.vertex3f(0, 0, z);
|
||||
|
||||
gGL.color4fv(col_next.mV);
|
||||
gGL.vertex3f(0, 0, z_next);
|
||||
|
||||
|
||||
gGL.color4fv(c_col.mV);
|
||||
gGL.vertex3f(0, 0, z);
|
||||
|
||||
gGL.color4fv(col_edge_next.mV);
|
||||
gGL.vertex3f(xan, yan, z_next);
|
||||
|
||||
gGL.color4fv(col_next.mV);
|
||||
gGL.vertex3f(0, 0, z_next);
|
||||
|
||||
|
||||
gGL.color4fv(c_col.mV);
|
||||
gGL.vertex3f(0, 0, z);
|
||||
|
||||
gGL.color4fv(col_edge.mV);
|
||||
gGL.vertex3f(xa, ya, z);
|
||||
|
||||
gGL.color4fv(col_edge_next.mV);
|
||||
gGL.vertex3f(xan, yan, z_next);
|
||||
|
||||
z += rowHeight;
|
||||
}
|
||||
|
||||
gGL.end();
|
||||
gGL.popMatrix();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity()
|
|||
std::string channel = getChannel();
|
||||
|
||||
static const boost::regex is_test_channel("\\bTest\\b");
|
||||
static const boost::regex is_beta_channel("\\bBeta\\b");
|
||||
static const boost::regex is_beta_channel("\\b(Beta|Develop)\\b"); // Develop is an alias for Beta
|
||||
static const boost::regex is_project_channel("\\bProject\\b");
|
||||
static const boost::regex is_release_channel("\\bRelease\\b");
|
||||
|
||||
|
|
|
|||
|
|
@ -97,7 +97,13 @@ LLViewerCamera::LLViewerCamera() : LLCamera()
|
|||
mZoomSubregion = 1;
|
||||
mAverageSpeed = 0.f;
|
||||
mAverageAngularSpeed = 0.f;
|
||||
gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2));
|
||||
|
||||
mCameraAngleChangedSignal = gSavedSettings.getControl("CameraAngle")->getCommitSignal()->connect(boost::bind(&LLViewerCamera::updateCameraAngle, this, _2));
|
||||
}
|
||||
|
||||
LLViewerCamera::~LLViewerCamera()
|
||||
{
|
||||
mCameraAngleChangedSignal.disconnect();
|
||||
}
|
||||
|
||||
void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVector3 &up_direction, const LLVector3 &point_of_interest)
|
||||
|
|
@ -909,10 +915,8 @@ bool LLViewerCamera::isDefaultFOVChanged()
|
|||
return false;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerCamera::updateCameraAngle( void* user_data, const LLSD& value)
|
||||
void LLViewerCamera::updateCameraAngle(const LLSD& value)
|
||||
{
|
||||
LLViewerCamera* self=(LLViewerCamera*)user_data;
|
||||
self->setDefaultFOV(value.asReal());
|
||||
setDefaultFOV(value.asReal());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ class alignas(16) LLViewerCamera : public LLCamera, public LLSimpleton<LLViewerC
|
|||
LL_ALIGN_NEW
|
||||
public:
|
||||
LLViewerCamera();
|
||||
~LLViewerCamera();
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
|
@ -65,7 +66,7 @@ public:
|
|||
const LLVector3 &point_of_interest);
|
||||
|
||||
static void updateFrustumPlanes(LLCamera& camera, bool ortho = false, bool zflip = false, bool no_hacks = false);
|
||||
static void updateCameraAngle(void* user_data, const LLSD& value);
|
||||
void updateCameraAngle(const LLSD& value);
|
||||
void setPerspective(bool for_selection, S32 x, S32 y_from_bot, S32 width, S32 height, bool limit_select_distance, F32 z_near = 0, F32 z_far = 0);
|
||||
|
||||
const LLMatrix4 &getProjection() const;
|
||||
|
|
@ -125,6 +126,8 @@ protected:
|
|||
F32 mZoomFactor;
|
||||
S16 mZoomSubregion;
|
||||
|
||||
boost::signals2::connection mCameraAngleChangedSignal;
|
||||
|
||||
public:
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -269,6 +269,7 @@ public:
|
|||
virtual bool isRiggedMesh() const { return false; }
|
||||
virtual bool hasLightTexture() const { return false; }
|
||||
virtual bool isReflectionProbe() const { return false; }
|
||||
virtual bool getReflectionProbeIsBox() const { return false; }
|
||||
|
||||
// This method returns true if the object is over land owned by
|
||||
// the agent, one of its groups, or it encroaches and
|
||||
|
|
|
|||
|
|
@ -2662,11 +2662,11 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
|
|||
if (features.has("PBRTerrainTransformsEnabled"))
|
||||
{
|
||||
bool enabled = features["PBRTerrainTransformsEnabled"];
|
||||
gSavedSettings.setBOOL("RenderTerrainTransformsPBREnabled", enabled);
|
||||
gSavedSettings.setBOOL("RenderTerrainPBRTransformsEnabled", enabled);
|
||||
}
|
||||
else
|
||||
{
|
||||
gSavedSettings.setBOOL("RenderTerrainTransformsPBREnabled", false);
|
||||
gSavedSettings.setBOOL("RenderTerrainPBRTransformsEnabled", false);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -3060,7 +3060,11 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss
|
|||
if(entry->isState(LLVOCacheEntry::ACTIVE))
|
||||
{
|
||||
// <FS:Beq> Bugsplat-fix
|
||||
// ((LLDrawable*)entry->getEntry()->getDrawable())->getVObj()->loadFlags(flags);
|
||||
//LLDrawable* drawable = (LLDrawable*)entry->getEntry()->getDrawable();
|
||||
//if (drawable && drawable->getVObj())
|
||||
//{
|
||||
// drawable->getVObj()->loadFlags(flags);
|
||||
//}
|
||||
// split each get...() to include a !null check
|
||||
const auto *octeeEntry = entry->getEntry();
|
||||
if(octeeEntry)
|
||||
|
|
|
|||
|
|
@ -519,8 +519,8 @@ void LLViewerShaderMgr::setShaders()
|
|||
// when using indexed texture rendering, leave some texture units available for shadow and reflection maps
|
||||
static LLCachedControl<S32> reserved_texture_units(gSavedSettings, "RenderReservedTextureIndices", 14);
|
||||
|
||||
LLGLSLShader::sIndexedTextureChannels =
|
||||
llclamp<S32>(max_texture_index, 1, gGLManager.mNumTextureImageUnits-reserved_texture_units);
|
||||
LLGLSLShader::sIndexedTextureChannels = 4;
|
||||
//llclamp<S32>(max_texture_index, 1, gGLManager.mNumTextureImageUnits-reserved_texture_units);
|
||||
|
||||
reentrance = true;
|
||||
|
||||
|
|
@ -1452,7 +1452,6 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
(mapping == 1 ? "flat" : "triplanar"));
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.isAlphaLighting = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
|
||||
gDeferredPBRTerrainProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredPBRTerrainProgram.mFeatures.hasGamma = true;
|
||||
|
|
@ -1666,7 +1665,6 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
shader->mFeatures.calculatesLighting = false;
|
||||
shader->mFeatures.hasLighting = false;
|
||||
shader->mFeatures.isAlphaLighting = true;
|
||||
shader->mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
|
||||
shader->mFeatures.hasSrgb = true;
|
||||
shader->mFeatures.calculatesAtmospherics = true;
|
||||
shader->mFeatures.hasAtmospherics = true;
|
||||
|
|
@ -1774,7 +1772,6 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAvatarEyesProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredAvatarEyesProgram.mFeatures.hasGamma = true;
|
||||
gDeferredAvatarEyesProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredAvatarEyesProgram.mFeatures.disableTextureIndex = true;
|
||||
gDeferredAvatarEyesProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredAvatarEyesProgram.mFeatures.hasShadows = true;
|
||||
|
||||
|
|
@ -2175,7 +2172,6 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredTerrainProgram.mName = "Deferred Terrain Shader";
|
||||
gDeferredTerrainProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredTerrainProgram.mFeatures.isAlphaLighting = true;
|
||||
gDeferredTerrainProgram.mFeatures.disableTextureIndex = true; //hack to disable auto-setup of texture channels
|
||||
gDeferredTerrainProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredTerrainProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredTerrainProgram.mFeatures.hasGamma = true;
|
||||
|
|
@ -2207,7 +2203,6 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = false;
|
||||
gDeferredAvatarAlphaProgram.mFeatures.hasLighting = false;
|
||||
gDeferredAvatarAlphaProgram.mFeatures.isAlphaLighting = true;
|
||||
gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true;
|
||||
gDeferredAvatarAlphaProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredAvatarAlphaProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredAvatarAlphaProgram.mFeatures.hasAtmospherics = true;
|
||||
|
|
@ -2446,7 +2441,6 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredWLSunProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredWLSunProgram.mFeatures.hasGamma = true;
|
||||
gDeferredWLSunProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredWLSunProgram.mFeatures.disableTextureIndex = true;
|
||||
gDeferredWLSunProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredWLSunProgram.mShaderFiles.clear();
|
||||
gDeferredWLSunProgram.mShaderFiles.push_back(make_pair("deferred/sunDiscV.glsl", GL_VERTEX_SHADER));
|
||||
|
|
@ -2465,7 +2459,6 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredWLMoonProgram.mFeatures.hasGamma = true;
|
||||
gDeferredWLMoonProgram.mFeatures.hasAtmospherics = true;
|
||||
gDeferredWLMoonProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredWLMoonProgram.mFeatures.disableTextureIndex = true;
|
||||
|
||||
gDeferredWLMoonProgram.mShaderFiles.clear();
|
||||
gDeferredWLMoonProgram.mShaderFiles.push_back(make_pair("deferred/moonV.glsl", GL_VERTEX_SHADER));
|
||||
|
|
@ -2583,7 +2576,6 @@ bool LLViewerShaderMgr::loadShadersObject()
|
|||
gObjectAlphaMaskNoColorProgram.mFeatures.hasGamma = true;
|
||||
gObjectAlphaMaskNoColorProgram.mFeatures.hasAtmospherics = true;
|
||||
gObjectAlphaMaskNoColorProgram.mFeatures.hasLighting = true;
|
||||
gObjectAlphaMaskNoColorProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectAlphaMaskNoColorProgram.mFeatures.hasAlphaMask = true;
|
||||
gObjectAlphaMaskNoColorProgram.mShaderFiles.clear();
|
||||
gObjectAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("objects/simpleNoColorV.glsl", GL_VERTEX_SHADER));
|
||||
|
|
@ -2595,7 +2587,6 @@ bool LLViewerShaderMgr::loadShadersObject()
|
|||
if (success)
|
||||
{
|
||||
gImpostorProgram.mName = "Impostor Shader";
|
||||
gImpostorProgram.mFeatures.disableTextureIndex = true;
|
||||
gImpostorProgram.mFeatures.hasSrgb = true;
|
||||
gImpostorProgram.mShaderFiles.clear();
|
||||
gImpostorProgram.mShaderFiles.push_back(make_pair("objects/impostorV.glsl", GL_VERTEX_SHADER));
|
||||
|
|
@ -2607,7 +2598,6 @@ bool LLViewerShaderMgr::loadShadersObject()
|
|||
if (success)
|
||||
{
|
||||
gObjectPreviewProgram.mName = "Object Preview Shader";
|
||||
gObjectPreviewProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectPreviewProgram.mShaderFiles.clear();
|
||||
gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewV.glsl", GL_VERTEX_SHADER));
|
||||
gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewF.glsl", GL_FRAGMENT_SHADER));
|
||||
|
|
@ -2626,8 +2616,6 @@ bool LLViewerShaderMgr::loadShadersObject()
|
|||
gPhysicsPreviewProgram.mFeatures.hasGamma = false;
|
||||
gPhysicsPreviewProgram.mFeatures.hasAtmospherics = false;
|
||||
gPhysicsPreviewProgram.mFeatures.hasLighting = false;
|
||||
gPhysicsPreviewProgram.mFeatures.mIndexedTextureChannels = 0;
|
||||
gPhysicsPreviewProgram.mFeatures.disableTextureIndex = true;
|
||||
gPhysicsPreviewProgram.mShaderFiles.clear();
|
||||
gPhysicsPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewPhysicsV.glsl", GL_VERTEX_SHADER));
|
||||
gPhysicsPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewPhysicsF.glsl", GL_FRAGMENT_SHADER));
|
||||
|
|
@ -2668,7 +2656,6 @@ bool LLViewerShaderMgr::loadShadersAvatar()
|
|||
gAvatarProgram.mFeatures.hasAtmospherics = true;
|
||||
gAvatarProgram.mFeatures.hasLighting = true;
|
||||
gAvatarProgram.mFeatures.hasAlphaMask = true;
|
||||
gAvatarProgram.mFeatures.disableTextureIndex = true;
|
||||
gAvatarProgram.mShaderFiles.clear();
|
||||
gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER));
|
||||
gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarF.glsl", GL_FRAGMENT_SHADER));
|
||||
|
|
@ -2692,7 +2679,6 @@ bool LLViewerShaderMgr::loadShadersAvatar()
|
|||
gAvatarEyeballProgram.mFeatures.hasAtmospherics = true;
|
||||
gAvatarEyeballProgram.mFeatures.hasLighting = true;
|
||||
gAvatarEyeballProgram.mFeatures.hasAlphaMask = true;
|
||||
gAvatarEyeballProgram.mFeatures.disableTextureIndex = true;
|
||||
gAvatarEyeballProgram.mShaderFiles.clear();
|
||||
gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballV.glsl", GL_VERTEX_SHADER));
|
||||
gAvatarEyeballProgram.mShaderFiles.push_back(make_pair("avatar/eyeballF.glsl", GL_FRAGMENT_SHADER));
|
||||
|
|
|
|||
|
|
@ -1973,15 +1973,6 @@ LLViewerWindow::LLViewerWindow(const Params& p)
|
|||
U32 max_core_count = gSavedSettings.getU32("EmulateCoreCount");
|
||||
F32 max_gl_version = gSavedSettings.getF32("RenderMaxOpenGLVersion");
|
||||
|
||||
LLControlVariable* vram_control = gSavedSettings.getControl("RenderMaxVRAMBudget");
|
||||
U32 max_vram = vram_control->getValue().asInteger();
|
||||
mMaxVRAMControlConnection = vram_control->getSignal()->connect(
|
||||
[this](LLControlVariable* control, const LLSD& new_val, const LLSD& old_val)
|
||||
{
|
||||
if (mWindow) mWindow->setMaxVRAMMegabytes(new_val.asInteger());
|
||||
});
|
||||
|
||||
|
||||
mWindow = LLWindowManager::createWindow(this,
|
||||
p.title, p.name, p.x, p.y, p.width, p.height, 0,
|
||||
p.fullscreen,
|
||||
|
|
@ -1991,7 +1982,6 @@ LLViewerWindow::LLViewerWindow(const Params& p)
|
|||
p.ignore_pixel_depth,
|
||||
0,
|
||||
max_core_count,
|
||||
max_vram,
|
||||
max_gl_version, //don't use window level anti-aliasing
|
||||
useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
|
||||
|
||||
|
|
@ -2706,8 +2696,6 @@ LLViewerWindow::~LLViewerWindow()
|
|||
LLViewerShaderMgr::releaseInstance();
|
||||
LLViewerShaderMgr::sInitialized = false;
|
||||
}
|
||||
|
||||
mMaxVRAMControlConnection.disconnect();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -556,8 +556,6 @@ private:
|
|||
// Object temporarily hovered over while dragging
|
||||
LLPointer<LLViewerObject> mDragHoveredObject;
|
||||
|
||||
boost::signals2::connection mMaxVRAMControlConnection;
|
||||
|
||||
static LLTrace::SampleStatHandle<> sMouseVelocityStat;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -127,12 +127,12 @@ void LLTerrainMaterials::apply(const LLModifyRegion& other)
|
|||
|
||||
bool LLTerrainMaterials::generateMaterials()
|
||||
{
|
||||
if (texturesReady(true, true))
|
||||
if (makeTexturesReady(true, true))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (materialsReady(true, true))
|
||||
if (makeMaterialsReady(true, true))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
@ -220,17 +220,17 @@ LLTerrainMaterials::Type LLTerrainMaterials::getMaterialType()
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
|
||||
const bool use_textures = texturesReady(false, false) || !materialsReady(false, false);
|
||||
const bool use_textures = makeTexturesReady(false, false) || !makeMaterialsReady(false, false);
|
||||
return use_textures ? Type::TEXTURE : Type::PBR;
|
||||
}
|
||||
|
||||
bool LLTerrainMaterials::texturesReady(bool boost, bool strict)
|
||||
bool LLTerrainMaterials::makeTexturesReady(bool boost, bool strict)
|
||||
{
|
||||
bool ready[ASSET_COUNT];
|
||||
// *NOTE: Calls to textureReady may boost textures. Do not early-return.
|
||||
// *NOTE: Calls to makeTextureReady may boost textures. Do not early-return.
|
||||
for (S32 i = 0; i < ASSET_COUNT; i++)
|
||||
{
|
||||
ready[i] = mDetailTextures[i].notNull() && textureReady(mDetailTextures[i], boost);
|
||||
ready[i] = mDetailTextures[i].notNull() && makeTextureReady(mDetailTextures[i], boost);
|
||||
}
|
||||
|
||||
bool one_ready = false;
|
||||
|
|
@ -251,7 +251,7 @@ namespace
|
|||
bool material_asset_ready(LLFetchedGLTFMaterial* mat) { return mat && mat->isLoaded(); }
|
||||
};
|
||||
|
||||
bool LLTerrainMaterials::materialsReady(bool boost, bool strict)
|
||||
bool LLTerrainMaterials::makeMaterialsReady(bool boost, bool strict)
|
||||
{
|
||||
bool ready[ASSET_COUNT];
|
||||
// *NOTE: This section may boost materials/textures. Do not early-return if ready[i] is false.
|
||||
|
|
@ -315,7 +315,7 @@ bool LLTerrainMaterials::materialsReady(bool boost, bool strict)
|
|||
// Boost the texture loading priority
|
||||
// Return true when ready to use (i.e. texture is sufficiently loaded)
|
||||
// static
|
||||
bool LLTerrainMaterials::textureReady(LLPointer<LLViewerFetchedTexture>& tex, bool boost)
|
||||
bool LLTerrainMaterials::makeTextureReady(LLPointer<LLViewerFetchedTexture>& tex, bool boost)
|
||||
{
|
||||
llassert(tex);
|
||||
if (!tex) { return false; }
|
||||
|
|
@ -377,17 +377,17 @@ bool LLTerrainMaterials::materialTexturesReady(LLPointer<LLFetchedGLTFMaterial>&
|
|||
mat->mEmissiveTexture = fetch_terrain_texture(mat->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE]);
|
||||
}
|
||||
|
||||
// *NOTE: Calls to textureReady may boost textures. Do not early-return.
|
||||
// *NOTE: Calls to makeTextureReady may boost textures. Do not early-return.
|
||||
bool ready[LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT];
|
||||
ready[LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR] =
|
||||
mat->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR].isNull() || textureReady(mat->mBaseColorTexture, boost);
|
||||
mat->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR].isNull() || makeTextureReady(mat->mBaseColorTexture, boost);
|
||||
ready[LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL] =
|
||||
mat->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL].isNull() || textureReady(mat->mNormalTexture, boost);
|
||||
mat->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL].isNull() || makeTextureReady(mat->mNormalTexture, boost);
|
||||
ready[LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS] =
|
||||
mat->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].isNull() ||
|
||||
textureReady(mat->mMetallicRoughnessTexture, boost);
|
||||
makeTextureReady(mat->mMetallicRoughnessTexture, boost);
|
||||
ready[LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE] =
|
||||
mat->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE].isNull() || textureReady(mat->mEmissiveTexture, boost);
|
||||
mat->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE].isNull() || makeTextureReady(mat->mEmissiveTexture, boost);
|
||||
|
||||
if (strict)
|
||||
{
|
||||
|
|
@ -406,7 +406,7 @@ bool LLTerrainMaterials::materialTexturesReady(LLPointer<LLFetchedGLTFMaterial>&
|
|||
// Boost the loading priority of every known texture in the material
|
||||
// Return true when ready to use
|
||||
// static
|
||||
bool LLTerrainMaterials::materialReady(LLPointer<LLFetchedGLTFMaterial> &mat, bool &textures_set, bool boost, bool strict)
|
||||
bool LLTerrainMaterials::makeMaterialReady(LLPointer<LLFetchedGLTFMaterial> &mat, bool &textures_set, bool boost, bool strict)
|
||||
{
|
||||
if (!material_asset_ready(mat)) { return false; }
|
||||
|
||||
|
|
@ -697,11 +697,11 @@ bool LLVLComposition::generateMinimapTileLand(const F32 x, const F32 y,
|
|||
const bool use_textures = getMaterialType() != LLTerrainMaterials::Type::PBR;
|
||||
if (use_textures)
|
||||
{
|
||||
if (!texturesReady(true, true)) { return false; }
|
||||
if (!makeTexturesReady(true, true)) { return false; }
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!materialsReady(true, true)) { return false; }
|
||||
if (!makeMaterialsReady(true, true)) { return false; }
|
||||
}
|
||||
|
||||
for (S32 i = 0; i < ASSET_COUNT; i++)
|
||||
|
|
|
|||
|
|
@ -74,18 +74,18 @@ public:
|
|||
const LLGLTFMaterial* getMaterialOverride(S32 asset) const override;
|
||||
virtual void setMaterialOverride(S32 asset, LLGLTFMaterial* mat_override);
|
||||
Type getMaterialType();
|
||||
bool texturesReady(bool boost, bool strict);
|
||||
bool makeTexturesReady(bool boost, bool strict);
|
||||
// strict = true -> all materials must be sufficiently loaded
|
||||
// strict = false -> at least one material must be loaded
|
||||
bool materialsReady(bool boost, bool strict);
|
||||
bool makeMaterialsReady(bool boost, bool strict);
|
||||
|
||||
protected:
|
||||
void unboost();
|
||||
static bool textureReady(LLPointer<LLViewerFetchedTexture>& tex, bool boost);
|
||||
static bool makeTextureReady(LLPointer<LLViewerFetchedTexture>& tex, bool boost);
|
||||
// strict = true -> all materials must be sufficiently loaded
|
||||
// strict = false -> at least one material must be loaded
|
||||
static bool materialReady(LLPointer<LLFetchedGLTFMaterial>& mat, bool& textures_set, bool boost, bool strict);
|
||||
// *NOTE: Prefer calling materialReady if mat is known to be LLFetchedGLTFMaterial
|
||||
static bool makeMaterialReady(LLPointer<LLFetchedGLTFMaterial>& mat, bool& textures_set, bool boost, bool strict);
|
||||
// *NOTE: Prefer calling makeMaterialReady if mat is known to be LLFetchedGLTFMaterial
|
||||
static bool materialTexturesReady(LLPointer<LLFetchedGLTFMaterial>& mat, bool& textures_set, bool boost, bool strict);
|
||||
|
||||
LLPointer<LLViewerFetchedTexture> mDetailTextures[ASSET_COUNT];
|
||||
|
|
|
|||
|
|
@ -636,8 +636,8 @@ bool LLVOAvatar::sShowAnimationDebug = false;
|
|||
bool LLVOAvatar::sVisibleInFirstPerson = false;
|
||||
F32 LLVOAvatar::sLODFactor = 1.f;
|
||||
F32 LLVOAvatar::sPhysicsLODFactor = 1.f;
|
||||
bool LLVOAvatar::sJointDebug = false;
|
||||
bool LLVOAvatar::sLipSyncEnabled = false;
|
||||
bool LLVOAvatar::sJointDebug = false;
|
||||
bool LLVOAvatar::sLipSyncEnabled = false;
|
||||
F32 LLVOAvatar::sUnbakedTime = 0.f;
|
||||
F32 LLVOAvatar::sUnbakedUpdateTime = 0.f;
|
||||
F32 LLVOAvatar::sGreyTime = 0.f;
|
||||
|
|
@ -2751,7 +2751,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
|
|||
return;
|
||||
}
|
||||
|
||||
LLCachedControl<bool> friends_only(gSavedSettings, "RenderAvatarFriendsOnly", false);
|
||||
static LLCachedControl<bool> friends_only(gSavedSettings, "RenderAvatarFriendsOnly", false);
|
||||
if (friends_only()
|
||||
&& !isUIAvatar()
|
||||
&& !isControlAvatar()
|
||||
|
|
@ -9414,17 +9414,29 @@ bool LLVOAvatar::isTooComplex() const
|
|||
|
||||
bool LLVOAvatar::isTooSlow() const
|
||||
{
|
||||
if (mIsControlAvatar)
|
||||
{
|
||||
return mTooSlow;
|
||||
}
|
||||
|
||||
static LLCachedControl<S32> compelxity_render_mode(gSavedSettings, "RenderAvatarComplexityMode");
|
||||
bool render_friend = (LLAvatarTracker::instance().isBuddy(getID()) && compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY);
|
||||
static LLCachedControl<bool> friends_only(gSavedSettings, "RenderAvatarFriendsOnly", false);
|
||||
bool is_friend = LLAvatarTracker::instance().isBuddy(getID());
|
||||
bool render_friend = is_friend && compelxity_render_mode > AV_RENDER_LIMIT_BY_COMPLEXITY;
|
||||
|
||||
if (render_friend || mVisuallyMuteSetting == AV_ALWAYS_RENDER)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (compelxity_render_mode == AV_RENDER_ONLY_SHOW_FRIENDS && !mIsControlAvatar)
|
||||
else if (compelxity_render_mode == AV_RENDER_ONLY_SHOW_FRIENDS)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (!is_friend && friends_only())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return mTooSlow;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -384,7 +384,7 @@ public:
|
|||
static F32 sLODFactor; // user-settable LOD factor
|
||||
static F32 sPhysicsLODFactor; // user-settable physics LOD factor
|
||||
static bool sJointDebug; // output total number of joints being touched for each avatar
|
||||
static BOOL sLipSyncEnabled;
|
||||
static bool sLipSyncEnabled;
|
||||
|
||||
static LLPartSysData sCloud;
|
||||
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ public:
|
|||
LLSD mChannelInfo;
|
||||
// true if call was ended by agent
|
||||
bool mCallEndedByAgent;
|
||||
bool mIgnoreNextSessionLeave;
|
||||
bool mIgnoreNextSessionLeave;
|
||||
LLHandle<LLPanel> mLoginNotificationHandle;
|
||||
|
||||
typedef std::map<LLUUID, LLVoiceChannel*> voice_channel_map_t;
|
||||
|
|
@ -164,7 +164,7 @@ private:
|
|||
|
||||
class LLVoiceChannelProximal : public LLVoiceChannel, public LLSingleton<LLVoiceChannelProximal>
|
||||
{
|
||||
LLSINGLETON_C11(LLVoiceChannelProximal);
|
||||
LLSINGLETON(LLVoiceChannelProximal);
|
||||
public:
|
||||
|
||||
void onChange(EStatusType status, const LLSD &channelInfo, bool proximal) override;
|
||||
|
|
|
|||
|
|
@ -282,6 +282,8 @@ bool LLVivoxVoiceClient::sConnected = false;
|
|||
LLPumpIO *LLVivoxVoiceClient::sPump = nullptr;
|
||||
|
||||
LLVivoxVoiceClient::LLVivoxVoiceClient() :
|
||||
mWriteOffset(0),
|
||||
mHidden(true),
|
||||
mSessionTerminateRequested(false),
|
||||
mRelogRequested(false),
|
||||
mTerminateDaemon(false),
|
||||
|
|
@ -2024,7 +2026,7 @@ bool LLVivoxVoiceClient::terminateAudioSession(bool wait)
|
|||
<< " VoiceEnabled " << mVoiceEnabled
|
||||
<< " IsInitialized " << mIsInitialized
|
||||
<< " RelogRequested " << mRelogRequested
|
||||
<< " ShuttingDown " << (sShuttingDown ? "true" : "false")
|
||||
<< " ShuttingDown " << (sShuttingDown ? "True" : "False")
|
||||
<< " returning " << status
|
||||
<< LL_ENDL;
|
||||
return status;
|
||||
|
|
@ -5326,7 +5328,7 @@ std::string LLVivoxVoiceClient::nameFromID(const LLUUID &uuid)
|
|||
LLStringUtil::replaceChar(result, '+', '-');
|
||||
LLStringUtil::replaceChar(result, '/', '_');
|
||||
|
||||
// If you need to transform a GUID to this form on the macOS command line, this will do so:
|
||||
// If you need to transform a GUID to this form on the Mac OS X command line, this will do so:
|
||||
// echo -n x && (echo e669132a-6c43-4ee1-a78d-6c82fff59f32 |xxd -r -p |openssl base64|tr '/+' '_-')
|
||||
|
||||
// The reverse transform can be done with:
|
||||
|
|
@ -5716,7 +5718,7 @@ bool LLVivoxVoiceClient::getIsModeratorMuted(const LLUUID& id)
|
|||
bool result = false;
|
||||
if (!mProcessChannels)
|
||||
{
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
participantStatePtr_t participant(findParticipantByID(id));
|
||||
if(participant)
|
||||
|
|
@ -6407,40 +6409,34 @@ void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESta
|
|||
// so nobody wants to hear from us.
|
||||
return;
|
||||
}
|
||||
for (status_observer_set_t::iterator it = mStatusObservers.begin();
|
||||
it != mStatusObservers.end();
|
||||
)
|
||||
{
|
||||
LLVoiceClientStatusObserver* observer = *it;
|
||||
observer->onChange(status, getAudioSessionChannelInfo(), inSpatialChannel());
|
||||
// In case onError() deleted an entry.
|
||||
it = mStatusObservers.upper_bound(observer);
|
||||
}
|
||||
|
||||
// this function is called from a coroutine, shuttle application hook back to main loop
|
||||
auto work = [=]()
|
||||
// skipped to avoid speak button blinking
|
||||
if (status != LLVoiceClientStatusObserver::STATUS_JOINING
|
||||
&& status != LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL
|
||||
&& status != LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED)
|
||||
{
|
||||
// <FS:Ansariel> Bypass LLCachedControls for voice status update
|
||||
//bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
|
||||
bool voice_status = LLVoiceClient::getInstance()->voiceEnabled(true) && LLVoiceClient::getInstance()->isVoiceWorking();
|
||||
// </FS:Ansariel>
|
||||
|
||||
LL_WARNS("Voice") << "Setting voice connected " << (voice_status ? "True" : "False") << LL_ENDL;
|
||||
gAgent.setVoiceConnected(voice_status);
|
||||
|
||||
if (voice_status)
|
||||
{
|
||||
for (status_observer_set_t::iterator it = mStatusObservers.begin();
|
||||
it != mStatusObservers.end();
|
||||
)
|
||||
{
|
||||
LLVoiceClientStatusObserver* observer = *it;
|
||||
observer->onChange(status, getAudioSessionChannelInfo(), inSpatialChannel());
|
||||
// In case onError() deleted an entry.
|
||||
it = mStatusObservers.upper_bound(observer);
|
||||
}
|
||||
|
||||
// skipped to avoid speak button blinking
|
||||
if (status != LLVoiceClientStatusObserver::STATUS_JOINING
|
||||
&& status != LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL
|
||||
&& status != LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED)
|
||||
{
|
||||
// <FS:Ansariel> Bypass LLCachedControls for voice status update
|
||||
//bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
|
||||
bool voice_status = LLVoiceClient::getInstance()->voiceEnabled(true) && LLVoiceClient::getInstance()->isVoiceWorking();
|
||||
// </FS:Ansariel>
|
||||
|
||||
gAgent.setVoiceConnected(voice_status);
|
||||
|
||||
if (voice_status)
|
||||
{
|
||||
LLFirstUse::speak(true);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
LLAppViewer::instance()->postToMainCoro(work);
|
||||
LLAppViewer::instance()->postToMainCoro([=]() { LLFirstUse::speak(true); });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLVivoxVoiceClient::addObserver(LLFriendObserver* observer)
|
||||
|
|
@ -7068,7 +7064,7 @@ void LLVivoxVoiceClient::updateVoiceMorphingMenu()
|
|||
const voice_effect_list_t& effect_list = effect_interfacep->getVoiceEffectList();
|
||||
if (!effect_list.empty())
|
||||
{
|
||||
LLMenuGL * voice_morphing_menup = gMenuBarView->findChildMenuByName("VoiceMorphing", true);
|
||||
LLMenuGL * voice_morphing_menup = gMenuBarView->findChildMenuByName("VoiceMorphing", TRUE);
|
||||
|
||||
if (NULL != voice_morphing_menup)
|
||||
{
|
||||
|
|
@ -7373,6 +7369,7 @@ LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
|
|||
XML_SetUserData(parser, this);
|
||||
XML_Parse(parser, mInput.data() + start, static_cast<int>(delim - start), false);
|
||||
|
||||
|
||||
LL_DEBUGS("VivoxProtocolParser") << "parsing: " << mInput.substr(start, delim - start) << LL_ENDL;
|
||||
start = delim + 3;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ class LLVivoxVoiceClient : public LLSingleton<LLVivoxVoiceClient>,
|
|||
virtual public LLVoiceEffectInterface,
|
||||
virtual public LLVoiceP2POutgoingCallInterface
|
||||
{
|
||||
LLSINGLETON_C11(LLVivoxVoiceClient);
|
||||
LLSINGLETON(LLVivoxVoiceClient);
|
||||
LOG_CLASS(LLVivoxVoiceClient);
|
||||
virtual ~LLVivoxVoiceClient();
|
||||
|
||||
|
|
|
|||
|
|
@ -76,8 +76,7 @@
|
|||
// for base64 decoding
|
||||
#include "apr_base64.h"
|
||||
|
||||
#include "json/reader.h"
|
||||
#include "json/writer.h"
|
||||
#include "boost/json.hpp"
|
||||
|
||||
const std::string WEBRTC_VOICE_SERVER_TYPE = "webrtc";
|
||||
|
||||
|
|
@ -321,7 +320,7 @@ void LLWebRTCVoiceClient::updateSettings()
|
|||
config.mNoiseSuppressionLevel = (llwebrtc::LLWebRTCDeviceInterface::AudioConfig::ENoiseSuppressionLevel) (U32)sNoiseSuppressionLevel;
|
||||
|
||||
mWebRTCDeviceInterface->setAudioConfig(config);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Observers
|
||||
|
|
@ -389,7 +388,7 @@ void LLWebRTCVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESt
|
|||
|
||||
if (voice_status)
|
||||
{
|
||||
LLFirstUse::speak(true);
|
||||
LLAppViewer::instance()->postToMainCoro([=]() { LLFirstUse::speak(true); });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -621,10 +620,10 @@ void LLWebRTCVoiceClient::setDevicesListUpdated(bool state)
|
|||
void LLWebRTCVoiceClient::OnDevicesChanged(const llwebrtc::LLWebRTCVoiceDeviceList& render_devices,
|
||||
const llwebrtc::LLWebRTCVoiceDeviceList& capture_devices)
|
||||
{
|
||||
|
||||
|
||||
LL::WorkQueue::postMaybe(mMainQueue,
|
||||
[=]
|
||||
{
|
||||
[=]
|
||||
{
|
||||
OnDevicesChangedImpl(render_devices, capture_devices);
|
||||
});
|
||||
}
|
||||
|
|
@ -648,7 +647,7 @@ void LLWebRTCVoiceClient::OnDevicesChangedImpl(const llwebrtc::LLWebRTCVoiceDevi
|
|||
for (auto &device : capture_devices)
|
||||
{
|
||||
LL_DEBUGS("Voice") << "Checking capture device:'" << device.mID << "'" << LL_ENDL;
|
||||
|
||||
|
||||
addCaptureDevice(LLVoiceDevice(device.mDisplayName, device.mID));
|
||||
}
|
||||
setCaptureDevice(inputDevice);
|
||||
|
|
@ -1014,35 +1013,38 @@ void LLWebRTCVoiceClient::sendPositionUpdate(bool force)
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
|
||||
|
||||
Json::FastWriter writer;
|
||||
std::string spatial_data;
|
||||
|
||||
if (mSpatialCoordsDirty || force)
|
||||
{
|
||||
Json::Value spatial = Json::objectValue;
|
||||
boost::json::object spatial;
|
||||
|
||||
spatial["sp"] = Json::objectValue;
|
||||
spatial["sp"]["x"] = (int) (mAvatarPosition[0] * 100);
|
||||
spatial["sp"]["y"] = (int) (mAvatarPosition[1] * 100);
|
||||
spatial["sp"]["z"] = (int) (mAvatarPosition[2] * 100);
|
||||
spatial["sh"] = Json::objectValue;
|
||||
spatial["sh"]["x"] = (int) (mAvatarRot[0] * 100);
|
||||
spatial["sh"]["y"] = (int) (mAvatarRot[1] * 100);
|
||||
spatial["sh"]["z"] = (int) (mAvatarRot[2] * 100);
|
||||
spatial["sh"]["w"] = (int) (mAvatarRot[3] * 100);
|
||||
spatial["sp"] = {
|
||||
{"x", (int) (mAvatarPosition[0] * 100)},
|
||||
{"y", (int) (mAvatarPosition[1] * 100)},
|
||||
{"z", (int) (mAvatarPosition[2] * 100)}
|
||||
};
|
||||
spatial["sh"] = {
|
||||
{"x", (int) (mAvatarRot[0] * 100)},
|
||||
{"y", (int) (mAvatarRot[1] * 100)},
|
||||
{"z", (int) (mAvatarRot[2] * 100)},
|
||||
{"w", (int) (mAvatarRot[3] * 100)}
|
||||
};
|
||||
|
||||
spatial["lp"] = Json::objectValue;
|
||||
spatial["lp"]["x"] = (int) (mListenerPosition[0] * 100);
|
||||
spatial["lp"]["y"] = (int) (mListenerPosition[1] * 100);
|
||||
spatial["lp"]["z"] = (int) (mListenerPosition[2] * 100);
|
||||
spatial["lh"] = Json::objectValue;
|
||||
spatial["lh"]["x"] = (int) (mListenerRot[0] * 100);
|
||||
spatial["lh"]["y"] = (int) (mListenerRot[1] * 100);
|
||||
spatial["lh"]["z"] = (int) (mListenerRot[2] * 100);
|
||||
spatial["lh"]["w"] = (int) (mListenerRot[3] * 100);
|
||||
spatial["lp"] = {
|
||||
{"x", (int) (mListenerPosition[0] * 100)},
|
||||
{"y", (int) (mListenerPosition[1] * 100)},
|
||||
{"z", (int) (mListenerPosition[2] * 100)}
|
||||
};
|
||||
|
||||
spatial["lh"] = {
|
||||
{"x", (int) (mListenerRot[0] * 100)},
|
||||
{"y", (int) (mListenerRot[1] * 100)},
|
||||
{"z", (int) (mListenerRot[2] * 100)},
|
||||
{"w", (int) (mListenerRot[3] * 100)}};
|
||||
|
||||
mSpatialCoordsDirty = false;
|
||||
spatial_data = writer.write(spatial);
|
||||
spatial_data = boost::json::serialize(spatial);
|
||||
|
||||
sessionState::for_each(boost::bind(predSendData, _1, spatial_data));
|
||||
}
|
||||
|
|
@ -1066,10 +1068,10 @@ void LLWebRTCVoiceClient::updateOwnVolume() {
|
|||
|
||||
// Provider-level participant management
|
||||
|
||||
BOOL LLWebRTCVoiceClient::isParticipantAvatar(const LLUUID &id)
|
||||
bool LLWebRTCVoiceClient::isParticipantAvatar(const LLUUID &id)
|
||||
{
|
||||
// WebRTC participants are always SL avatars.
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
void LLWebRTCVoiceClient::getParticipantList(std::set<LLUUID> &participants)
|
||||
|
|
@ -1289,10 +1291,10 @@ bool LLWebRTCVoiceClient::isVoiceWorking() const
|
|||
|
||||
// Returns true if calling back the session URI after the session has closed is possible.
|
||||
// Currently this will be false only for PSTN P2P calls.
|
||||
BOOL LLWebRTCVoiceClient::isSessionCallBackPossible(const LLUUID &session_id)
|
||||
bool LLWebRTCVoiceClient::isSessionCallBackPossible(const LLUUID &session_id)
|
||||
{
|
||||
sessionStatePtr_t session(findP2PSession(session_id));
|
||||
return session && session->isCallbackPossible() ? TRUE : FALSE;
|
||||
return session && session->isCallbackPossible() ? true : false;
|
||||
}
|
||||
|
||||
// Channel Management
|
||||
|
|
@ -1562,9 +1564,9 @@ std::string LLWebRTCVoiceClient::getDisplayName(const LLUUID& id)
|
|||
return result;
|
||||
}
|
||||
|
||||
BOOL LLWebRTCVoiceClient::getIsSpeaking(const LLUUID& id)
|
||||
bool LLWebRTCVoiceClient::getIsSpeaking(const LLUUID& id)
|
||||
{
|
||||
BOOL result = FALSE;
|
||||
bool result = false;
|
||||
if (mProcessChannels && mSession)
|
||||
{
|
||||
participantStatePtr_t participant(mSession->findParticipantByID(id));
|
||||
|
|
@ -1577,9 +1579,9 @@ BOOL LLWebRTCVoiceClient::getIsSpeaking(const LLUUID& id)
|
|||
}
|
||||
|
||||
// TODO: Need to pull muted status from the webrtc server
|
||||
BOOL LLWebRTCVoiceClient::getIsModeratorMuted(const LLUUID& id)
|
||||
bool LLWebRTCVoiceClient::getIsModeratorMuted(const LLUUID& id)
|
||||
{
|
||||
BOOL result = FALSE;
|
||||
bool result = false;
|
||||
if (mProcessChannels && mSession)
|
||||
{
|
||||
participantStatePtr_t participant(mSession->findParticipantByID(id));
|
||||
|
|
@ -2285,7 +2287,7 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro()
|
|||
void LLVoiceWebRTCConnection::OnOfferAvailable(const std::string &sdp)
|
||||
{
|
||||
LL::WorkQueue::postMaybe(mMainQueue,
|
||||
[=] {
|
||||
[=] {
|
||||
if (mShutDown)
|
||||
{
|
||||
return;
|
||||
|
|
@ -2334,7 +2336,7 @@ void LLVoiceWebRTCConnection::OnAudioEstablished(llwebrtc::LLWebRTCAudioInterfac
|
|||
void LLVoiceWebRTCConnection::OnRenegotiationNeeded()
|
||||
{
|
||||
LL::WorkQueue::postMaybe(mMainQueue,
|
||||
[=] {
|
||||
[=] {
|
||||
LL_DEBUGS("Voice") << "Voice channel requires renegotiation." << LL_ENDL;
|
||||
if (!mShutDown)
|
||||
{
|
||||
|
|
@ -2387,12 +2389,8 @@ void LLVoiceWebRTCConnection::setSpeakerVolume(F32 volume)
|
|||
|
||||
void LLVoiceWebRTCConnection::setUserVolume(const LLUUID& id, F32 volume)
|
||||
{
|
||||
Json::Value root = Json::objectValue;
|
||||
Json::Value user_gain = Json::objectValue;
|
||||
user_gain[id.asString()] = (uint32_t)(volume*200); // give it two decimal places with a range from 0-200, where 100 is normal
|
||||
root["ug"] = user_gain;
|
||||
Json::FastWriter writer;
|
||||
std::string json_data = writer.write(root);
|
||||
boost::json::object root = {{"ug", {id.asString(), (uint32_t) (volume * 200)}}};
|
||||
std::string json_data = boost::json::serialize(root);
|
||||
if (mWebRTCDataInterface)
|
||||
{
|
||||
mWebRTCDataInterface->sendData(json_data, false);
|
||||
|
|
@ -2401,12 +2399,8 @@ void LLVoiceWebRTCConnection::setUserVolume(const LLUUID& id, F32 volume)
|
|||
|
||||
void LLVoiceWebRTCConnection::setUserMute(const LLUUID& id, bool mute)
|
||||
{
|
||||
Json::Value root = Json::objectValue;
|
||||
Json::Value muted = Json::objectValue;
|
||||
muted[id.asString()] = mute;
|
||||
root["m"] = muted;
|
||||
Json::FastWriter writer;
|
||||
std::string json_data = writer.write(root);
|
||||
boost::json::object root = {{"m", {id.asString(), mute}}};
|
||||
std::string json_data = boost::json::serialize(root);
|
||||
if (mWebRTCDataInterface)
|
||||
{
|
||||
mWebRTCDataInterface->sendData(json_data, false);
|
||||
|
|
@ -2460,7 +2454,7 @@ void LLVoiceWebRTCConnection::breakVoiceConnectionCoro()
|
|||
|
||||
LLVoiceWebRTCStats::getInstance()->provisionAttemptStart();
|
||||
LLSD body;
|
||||
body["logout"] = TRUE;
|
||||
body["logout"] = true;
|
||||
body["viewer_session"] = mViewerSession;
|
||||
body["voice_server_type"] = WEBRTC_VOICE_SERVER_TYPE;
|
||||
|
||||
|
|
@ -2633,7 +2627,7 @@ bool LLVoiceWebRTCConnection::connectionStateMachine()
|
|||
}
|
||||
mIceCompleted = false;
|
||||
setVoiceConnectionState(VOICE_STATE_WAIT_FOR_SESSION_START);
|
||||
|
||||
|
||||
// tell the webrtc library that we want a connection. The library will
|
||||
// respond with an offer on a separate thread, which will cause
|
||||
// the session state to change.
|
||||
|
|
@ -2807,7 +2801,7 @@ void LLVoiceWebRTCConnection::OnDataReceived(const std::string& data, bool binar
|
|||
|
||||
//
|
||||
// The LLWebRTCVoiceConnection object will not be deleted
|
||||
// before the webrtc connection itself is shut down, so
|
||||
// before the webrtc connection itself is shut down, so
|
||||
// we shouldn't be getting this callback on a nonexistant
|
||||
// this pointer.
|
||||
void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool binary)
|
||||
|
|
@ -2825,27 +2819,36 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
|
|||
return;
|
||||
}
|
||||
|
||||
Json::Reader reader;
|
||||
Json::Value voice_data;
|
||||
if (reader.parse(data, voice_data, false)) // don't collect comments
|
||||
boost::json::error_code ec;
|
||||
boost::json::value voice_data_parsed = boost::json::parse(data, ec);
|
||||
if (!ec) // don't collect comments
|
||||
{
|
||||
if (!voice_data.isObject())
|
||||
if (!voice_data_parsed.is_object())
|
||||
{
|
||||
LL_WARNS("Voice") << "Expected object from data channel:" << data << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
boost::json::object voice_data = voice_data_parsed.as_object();
|
||||
bool new_participant = false;
|
||||
Json::Value mute = Json::objectValue;
|
||||
Json::Value user_gain = Json::objectValue;
|
||||
for (auto &participant_id : voice_data.getMemberNames())
|
||||
boost::json::object mute;
|
||||
boost::json::object user_gain;
|
||||
for (auto &participant_elem : voice_data)
|
||||
{
|
||||
LLUUID agent_id(participant_id);
|
||||
boost::json::string participant_id(participant_elem.key());
|
||||
LLUUID agent_id(participant_id.c_str());
|
||||
if (agent_id.isNull())
|
||||
{
|
||||
// probably a test client.
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!participant_elem.value().is_object())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
boost::json::object participant_obj = participant_elem.value().as_object();
|
||||
|
||||
LLWebRTCVoiceClient::participantStatePtr_t participant =
|
||||
LLWebRTCVoiceClient::getInstance()->findParticipantByID(mChannelID, agent_id);
|
||||
bool joined = false;
|
||||
|
|
@ -2855,11 +2858,16 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
|
|||
// where a participant on a neighboring region may be
|
||||
// connected to multiple servers. We don't want to
|
||||
// add new identical participants from all of those servers.
|
||||
if (voice_data[participant_id].isMember("j"))
|
||||
if (participant_obj.contains("j") &&
|
||||
participant_obj["j"].is_object())
|
||||
{
|
||||
// a new participant has announced that they're joining.
|
||||
joined = true;
|
||||
primary = voice_data[participant_id]["j"].get("p", Json::Value(false)).asBool();
|
||||
if (participant_elem.value().as_object()["j"].as_object().contains("p") &&
|
||||
participant_elem.value().as_object()["j"].as_object()["p"].is_bool())
|
||||
{
|
||||
primary = participant_elem.value().as_object()["j"].as_object()["p"].as_bool();
|
||||
}
|
||||
|
||||
// track incoming participants that are muted so we can mute their connections (or set their volume)
|
||||
bool isMuted = LLMuteList::getInstance()->isMuted(agent_id, LLMute::flagVoiceChat);
|
||||
|
|
@ -2882,7 +2890,7 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
|
|||
|
||||
if (participant)
|
||||
{
|
||||
if (voice_data[participant_id].get("l", Json::Value(false)).asBool())
|
||||
if (participant_obj.contains("l") && participant_obj["l"].is_bool() && participant_obj["l"].as_bool())
|
||||
{
|
||||
// an existing participant is leaving.
|
||||
if (agent_id != gAgentID)
|
||||
|
|
@ -2893,18 +2901,20 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
|
|||
else
|
||||
{
|
||||
// we got a 'power' update.
|
||||
F32 level = (F32) (voice_data[participant_id].get("p", Json::Value(participant->mLevel)).asInt()) / 128;
|
||||
// convert to decibles
|
||||
participant->mLevel = level;
|
||||
|
||||
if (voice_data[participant_id].isMember("v"))
|
||||
if (participant_obj.contains("p") && participant_obj["p"].is_number())
|
||||
{
|
||||
participant->mIsSpeaking = voice_data[participant_id].get("v", Json::Value(false)).asBool();
|
||||
participant->mLevel = (F32)participant_obj["p"].as_int64();
|
||||
}
|
||||
|
||||
if (voice_data[participant_id].isMember("m"))
|
||||
if (participant_obj.contains("v") && participant_obj["v"].is_bool())
|
||||
{
|
||||
participant->mIsModeratorMuted = voice_data[participant_id].get("m", Json::Value(false)).asBool();
|
||||
participant->mIsSpeaking = participant_obj["v"].as_bool();
|
||||
}
|
||||
|
||||
if (participant_obj.contains("v") && participant_obj["m"].is_bool())
|
||||
{
|
||||
participant->mIsModeratorMuted = participant_obj["m"].as_bool();
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2912,8 +2922,7 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
|
|||
|
||||
// tell the simulator to set the mute and volume data for this
|
||||
// participant, if there are any updates.
|
||||
Json::FastWriter writer;
|
||||
Json::Value root = Json::objectValue;
|
||||
boost::json::object root;
|
||||
if (mute.size() > 0)
|
||||
{
|
||||
root["m"] = mute;
|
||||
|
|
@ -2924,7 +2933,7 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b
|
|||
}
|
||||
if (root.size() > 0)
|
||||
{
|
||||
std::string json_data = writer.write(root);
|
||||
std::string json_data = boost::json::serialize(root);
|
||||
mWebRTCDataInterface->sendData(json_data, false);
|
||||
}
|
||||
}
|
||||
|
|
@ -2966,16 +2975,16 @@ void LLVoiceWebRTCConnection::sendJoin()
|
|||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOICE
|
||||
|
||||
Json::FastWriter writer;
|
||||
Json::Value root = Json::objectValue;
|
||||
Json::Value join_obj = Json::objectValue;
|
||||
|
||||
boost::json::object root;
|
||||
boost::json::object join_obj;
|
||||
LLUUID regionID = gAgent.getRegion()->getRegionID();
|
||||
if ((regionID == mRegionID) || !isSpatial())
|
||||
{
|
||||
join_obj["p"] = true;
|
||||
}
|
||||
root["j"] = join_obj;
|
||||
std::string json_data = writer.write(root);
|
||||
std::string json_data = boost::json::serialize(root);
|
||||
mWebRTCDataInterface->sendData(json_data, false);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ class LLWebRTCProtocolParser;
|
|||
#include "llparcel.h"
|
||||
#include "llmutelist.h"
|
||||
#include <queue>
|
||||
#include "json/reader.h"
|
||||
#include "boost/json.hpp"
|
||||
|
||||
#ifdef LL_USESYSTEMLIBS
|
||||
# include "expat.h"
|
||||
|
|
@ -64,7 +64,7 @@ class LLWebRTCVoiceClient : public LLSingleton<LLWebRTCVoiceClient>,
|
|||
public llwebrtc::LLWebRTCDevicesObserver,
|
||||
public LLMuteListObserver
|
||||
{
|
||||
LLSINGLETON_C11(LLWebRTCVoiceClient);
|
||||
LLSINGLETON(LLWebRTCVoiceClient);
|
||||
LOG_CLASS(LLWebRTCVoiceClient);
|
||||
virtual ~LLWebRTCVoiceClient();
|
||||
|
||||
|
|
@ -122,15 +122,15 @@ public:
|
|||
bool isParticipant(const LLUUID& speaker_id) override;
|
||||
|
||||
// Send a text message to the specified user, initiating the session if necessary.
|
||||
// virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message) const {return false;};
|
||||
// virtual bool sendTextMessage(const LLUUID& participant_id, const std::string& message) const {return false;};
|
||||
|
||||
// Returns true if calling back the session URI after the session has closed is possible.
|
||||
// Currently this will be false only for PSTN P2P calls.
|
||||
// NOTE: this will return true if the session can't be found.
|
||||
BOOL isSessionCallBackPossible(const LLUUID &session_id) override;
|
||||
bool isSessionCallBackPossible(const LLUUID &session_id) override;
|
||||
|
||||
// WebRTC doesn't preclude text im
|
||||
BOOL isSessionTextIMPossible(const LLUUID &session_id) override { return TRUE; }
|
||||
bool isSessionTextIMPossible(const LLUUID &session_id) override { return true; }
|
||||
|
||||
////////////////////////////
|
||||
/// @name Channel stuff
|
||||
|
|
@ -177,9 +177,9 @@ public:
|
|||
//////////////////////////
|
||||
/// @name nearby speaker accessors
|
||||
std::string getDisplayName(const LLUUID& id) override;
|
||||
BOOL isParticipantAvatar(const LLUUID &id) override;
|
||||
BOOL getIsSpeaking(const LLUUID& id) override;
|
||||
BOOL getIsModeratorMuted(const LLUUID& id) override;
|
||||
bool isParticipantAvatar(const LLUUID &id) override;
|
||||
bool getIsSpeaking(const LLUUID& id) override;
|
||||
bool getIsModeratorMuted(const LLUUID& id) override;
|
||||
F32 getCurrentPower(const LLUUID& id) override; // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is...
|
||||
F32 getUserVolume(const LLUUID& id) override;
|
||||
void setUserVolume(const LLUUID& id, F32 volume) override; // set's volume for specified agent, from 0-1 (where .5 is nominal)
|
||||
|
|
|
|||
|
|
@ -311,7 +311,7 @@ public:
|
|||
bool isReflectionProbe() const override;
|
||||
F32 getReflectionProbeAmbiance() const;
|
||||
F32 getReflectionProbeNearClip() const;
|
||||
bool getReflectionProbeIsBox() const;
|
||||
bool getReflectionProbeIsBox() const override;
|
||||
bool getReflectionProbeIsDynamic() const;
|
||||
bool getReflectionProbeIsMirror() const;
|
||||
|
||||
|
|
|
|||
|
|
@ -10449,7 +10449,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
|
|||
result.clear();
|
||||
grabReferences(result);
|
||||
|
||||
if (!avatar || !avatar->mDrawable)
|
||||
if (!avatar || avatar->isDead() || !avatar->mDrawable)
|
||||
{
|
||||
LL_WARNS_ONCE("AvatarRenderPipeline") << "Avatar is " << (avatar ? "not drawable" : "null") << LL_ENDL;
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater
|
||||
height="400"
|
||||
height="411"
|
||||
layout="topleft"
|
||||
name="prefs_graphics_advanced"
|
||||
help_topic="Preferences_Graphics_Advanced"
|
||||
|
|
@ -545,7 +545,7 @@
|
|||
</text>
|
||||
<view_border
|
||||
bevel_style="in"
|
||||
height="322"
|
||||
height="357"
|
||||
layout="topleft"
|
||||
left="385"
|
||||
name="vert_border"
|
||||
|
|
@ -889,7 +889,7 @@
|
|||
layout="topleft"
|
||||
left="13"
|
||||
name="horiz_border"
|
||||
top="338"
|
||||
top="373"
|
||||
top_delta="5"
|
||||
width="774"/>
|
||||
<button
|
||||
|
|
@ -899,7 +899,7 @@
|
|||
layout="topleft"
|
||||
left="20"
|
||||
name="Defaults"
|
||||
top_delta="20"
|
||||
top_delta="7"
|
||||
width="210">
|
||||
<button.commit_callback
|
||||
function="Pref.HardwareDefaults" />
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
1a9a3717fde5d0fb3d5f688a1a3dab7fcc2aa308
|
||||
1a9a3717fde5d0fb3d5f688a1a3dab7fcc2aa308
|
||||
|
|
|
|||
Loading…
Reference in New Issue