# 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.sha1
master
Ansariel 2024-06-21 19:46:51 +02:00
commit 684bc1d1ea
78 changed files with 567 additions and 455 deletions

View File

@ -3,6 +3,7 @@
# Trim trailing whitespace
a0b3021bdcf76859054fda8e30abb3ed47749e83
8444cd9562a6a7b755fcb075864e205122354192
863c541ce0b2e3e1e566cc88423d3e87aaedb6ca
# Wrong line endings
1b67dd855c41f5a0cda7ec2a68d98071986ca703
6cc7dd09d5e69cf57e6de7fb568a0ad2693f9c9a

View File

@ -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

48
.github/workflows/tag-release.yaml vendored Normal file
View File

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

View File

@ -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>

View File

@ -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

View File

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

View File

@ -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}

View File

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

View File

@ -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 ";
}
}

View File

@ -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] = '_';
}

View File

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

View File

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

View File

@ -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;
}

View File

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

View File

@ -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

View File

@ -295,7 +295,7 @@ bool LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if (features->hasLighting)
{
if (features->disableTextureIndex)
if (features->mIndexedTextureChannels <= 1)
{
if (features->hasAlphaMask)
{

View File

@ -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

View File

@ -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; }

View File

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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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_

View File

@ -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 {}

View File

@ -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

View File

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

View File

@ -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 )
{

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -23,8 +23,7 @@
* $/LicenseInfo$
*/
uniform sampler2D noiseMap;
uniform sampler2D normalMap;
uniform sampler2D noiseMap;
uniform sampler2D depthMap;
uniform float ssao_radius;

View File

@ -27,8 +27,6 @@
out vec4 frag_color;
uniform sampler2D diffuseMap;
void main()
{
frag_color = vec4(1,1,1,1);

View File

@ -27,7 +27,6 @@
out vec4 frag_color;
uniform sampler2D normalMap;
uniform sampler2D lightMap;
uniform float dist_factor;

View File

@ -50,7 +50,6 @@ SOFTWARE.
uniform sampler2D normalMap;
uniform sampler2D depthMap;
uniform sampler2D emissiveRect;
uniform sampler2D projectionMap; // rgba
uniform sampler2D brdfLut;

View File

@ -27,8 +27,6 @@
out vec4 frag_color;
uniform sampler2D diffuseMap;
in vec4 post_pos;
in float target_pos_x;
in vec4 vertex_color;

View File

@ -24,7 +24,6 @@
*/
uniform sampler2D normalMap;
uniform sampler2D depthMap;
#if defined(SUN_SHADOW)
uniform sampler2DShadow shadowMap0;

View File

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

View File

@ -25,7 +25,10 @@
in vec2 tc;
#if defined(COPY_DEPTH)
uniform sampler2D depthMap;
#endif
uniform sampler2D diffuseMap;
out vec4 frag_color;

View File

@ -25,8 +25,6 @@
out vec4 frag_color;
uniform sampler2D normalMap;
// Inputs
uniform vec3 sun_dir;
uniform vec3 moon_dir;

View File

@ -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

View File

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

View File

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

View File

@ -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

View File

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

View File

@ -25,7 +25,6 @@
out vec4 frag_color;
uniform sampler2D diffuseMap;
uniform sampler2D bumpMap;
#ifdef TRANSPARENT_WATER

View File

@ -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())
{

View File

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

View File

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

View File

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

View File

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

View File

@ -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++;
}
}
}
}
}
}
}

View File

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

View File

@ -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; }

View File

@ -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;
}
}
}

View File

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

View File

@ -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();
}

View File

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

View File

@ -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 &center, 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());
}

View File

@ -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:
};

View File

@ -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

View File

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

View File

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

View File

@ -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();
}

View File

@ -556,8 +556,6 @@ private:
// Object temporarily hovered over while dragging
LLPointer<LLViewerObject> mDragHoveredObject;
boost::signals2::connection mMaxVRAMControlConnection;
static LLTrace::SampleStatHandle<> sMouseVelocityStat;
};

View File

@ -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++)

View File

@ -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];

View File

@ -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;
}

View File

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

View File

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

View File

@ -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;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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" />

View File

@ -1 +1 @@
1a9a3717fde5d0fb3d5f688a1a3dab7fcc2aa308
1a9a3717fde5d0fb3d5f688a1a3dab7fcc2aa308