diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 321ba281cf..ddb0f44150 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -42,8 +42,6 @@ jobs:
DEVELOPER_DIR: ${{ matrix.developer_dir }}
# Ensure that Linden viewer builds engage Bugsplat.
BUGSPLAT_DB: ${{ matrix.configuration != 'ReleaseOS' && 'SecondLife_Viewer_2018' || '' }}
- BUGSPLAT_PASS: ${{ secrets.BUGSPLAT_PASS }}
- BUGSPLAT_USER: ${{ secrets.BUGSPLAT_USER }}
build_coverity: false
build_log_dir: ${{ github.workspace }}/.logs
build_viewer: true
@@ -67,7 +65,7 @@ jobs:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Setup python
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
@@ -88,7 +86,7 @@ jobs:
run: pip3 install autobuild llsd
- name: Cache autobuild packages
- uses: actions/cache@v3
+ uses: actions/cache@v4
id: cache-installables
with:
path: .autobuild-installables
@@ -103,7 +101,7 @@ jobs:
- name: Determine source branch
id: which-branch
- uses: secondlife/viewer-build-util/which-branch@relnotes
+ uses: secondlife/viewer-build-util/which-branch@v1
with:
token: ${{ github.token }}
@@ -262,23 +260,36 @@ jobs:
${{ steps.build.outputs.physicstpv }}
sign-and-package-windows:
+ env:
+ AZURE_KEY_VAULT_URI: ${{ secrets.AZURE_KEY_VAULT_URI }}
+ AZURE_CERT_NAME: ${{ secrets.AZURE_CERT_NAME }}
+ AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
+ AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
+ AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
needs: build
runs-on: windows
steps:
- name: Sign and package Windows viewer
+ if: env.AZURE_KEY_VAULT_URI && env.AZURE_CERT_NAME && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET && env.AZURE_TENANT_ID
uses: secondlife/viewer-build-util/sign-pkg-windows@v1
with:
- vault_uri: "${{ secrets.AZURE_KEY_VAULT_URI }}"
- cert_name: "${{ secrets.AZURE_CERT_NAME }}"
- client_id: "${{ secrets.AZURE_CLIENT_ID }}"
- client_secret: "${{ secrets.AZURE_CLIENT_SECRET }}"
- tenant_id: "${{ secrets.AZURE_TENANT_ID }}"
+ vault_uri: "${{ env.AZURE_KEY_VAULT_URI }}"
+ cert_name: "${{ env.AZURE_CERT_NAME }}"
+ client_id: "${{ env.AZURE_CLIENT_ID }}"
+ client_secret: "${{ env.AZURE_CLIENT_SECRET }}"
+ tenant_id: "${{ env.AZURE_TENANT_ID }}"
sign-and-package-mac:
+ env:
+ NOTARIZE_CREDS_MACOS: ${{ secrets.NOTARIZE_CREDS_MACOS }}
+ SIGNING_CERT_MACOS: ${{ secrets.SIGNING_CERT_MACOS }}
+ SIGNING_CERT_MACOS_IDENTITY: ${{ secrets.SIGNING_CERT_MACOS_IDENTITY }}
+ SIGNING_CERT_MACOS_PASSWORD: ${{ secrets.SIGNING_CERT_MACOS_PASSWORD }}
needs: build
runs-on: macos-latest
steps:
- name: Unpack Mac notarization credentials
+ if: env.NOTARIZE_CREDS_MACOS
id: note-creds
shell: bash
run: |
@@ -286,7 +297,7 @@ jobs:
# USERNAME="..."
# PASSWORD="..."
# TEAM_ID="..."
- eval "${{ secrets.NOTARIZE_CREDS_MACOS }}"
+ eval "${{ env.NOTARIZE_CREDS_MACOS }}"
echo "::add-mask::$USERNAME"
echo "::add-mask::$PASSWORD"
echo "::add-mask::$TEAM_ID"
@@ -298,39 +309,48 @@ jobs:
[[ -n "$USERNAME" && -n "$PASSWORD" && -n "$TEAM_ID" ]]
- name: Sign and package Mac viewer
+ if: env.SIGNING_CERT_MACOS && env.SIGNING_CERT_MACOS_IDENTITY && env.SIGNING_CERT_MACOS_PASSWORD && steps.note-creds.outputs.note_user && steps.note-creds.outputs.note_pass && steps.note-creds.outputs.note_team
uses: secondlife/viewer-build-util/sign-pkg-mac@v1
with:
channel: ${{ needs.build.outputs.viewer_channel }}
imagename: ${{ needs.build.outputs.imagename }}
- cert_base64: ${{ secrets.SIGNING_CERT_MACOS }}
- cert_name: ${{ secrets.SIGNING_CERT_MACOS_IDENTITY }}
- cert_pass: ${{ secrets.SIGNING_CERT_MACOS_PASSWORD }}
+ cert_base64: ${{ env.SIGNING_CERT_MACOS }}
+ cert_name: ${{ env.SIGNING_CERT_MACOS_IDENTITY }}
+ cert_pass: ${{ env.SIGNING_CERT_MACOS_PASSWORD }}
note_user: ${{ steps.note-creds.outputs.note_user }}
note_pass: ${{ steps.note-creds.outputs.note_pass }}
note_team: ${{ steps.note-creds.outputs.note_team }}
post-windows-symbols:
+ env:
+ BUGSPLAT_USER: ${{ secrets.BUGSPLAT_USER }}
+ BUGSPLAT_PASS: ${{ secrets.BUGSPLAT_PASS }}
needs: build
runs-on: ubuntu-latest
steps:
- name: Post Windows symbols
+ if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
uses: secondlife/viewer-build-util/post-bugsplat-windows@v1
with:
- username: ${{ secrets.BUGSPLAT_USER }}
- password: ${{ secrets.BUGSPLAT_PASS }}
+ username: ${{ env.BUGSPLAT_USER }}
+ password: ${{ env.BUGSPLAT_PASS }}
database: "SecondLife_Viewer_2018"
channel: ${{ needs.build.outputs.viewer_channel }}
version: ${{ needs.build.outputs.viewer_version }}
post-mac-symbols:
+ env:
+ BUGSPLAT_USER: ${{ secrets.BUGSPLAT_USER }}
+ BUGSPLAT_PASS: ${{ secrets.BUGSPLAT_PASS }}
needs: build
runs-on: ubuntu-latest
steps:
- name: Post Mac symbols
+ if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS
uses: secondlife/viewer-build-util/post-bugsplat-mac@v1
with:
- username: ${{ secrets.BUGSPLAT_USER }}
- password: ${{ secrets.BUGSPLAT_PASS }}
+ username: ${{ env.BUGSPLAT_USER }}
+ password: ${{ env.BUGSPLAT_PASS }}
database: "SecondLife_Viewer_2018"
channel: ${{ needs.build.outputs.viewer_channel }}
version: ${{ needs.build.outputs.viewer_version }}
diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml
index 35ac41420c..e44e223589 100644
--- a/.github/workflows/stale.yaml
+++ b/.github/workflows/stale.yaml
@@ -17,7 +17,8 @@ jobs:
with:
stale-pr-message: This pull request is stale because it has been open 30 days with no activity. Remove stale label or comment or it will be closed in 7 days
days-before-stale: 30
- days-before-close: 7
+ days-before-close: 7
+ days-before-issue-close: -1
exempt-pr-labels: blocked,must,should,keep
stale-pr-label: stale
- name: Print outputs
diff --git a/autobuild.xml b/autobuild.xml
index 7319b07230..0ddce9e4ca 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -112,9 +112,11 @@
archive
name
linux64
@@ -413,56 +415,6 @@
description
Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.
- tracy
-
apr_suite
platforms
@@ -544,9 +496,11 @@
archive
hash
- 8d96a9d1a9a208b1f48ac677edb7ca4d
+ 5d1952e270a873d4587f7b943ed6e3f87d5023da
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/boost-1.72-linux64-222121224.tar.bz2
+ https://3p.firestormviewer.org/boost-1.81-linux64-240621158.tar.zst
name
linux64
@@ -648,9 +602,11 @@
archive
hash
- 8b79711b4fa914c16f1284939d55dcc1
+ 83f9c9aff5a7b96711c04bd33cb453c108dee3a5
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/colladadom-2.3.230940029-linux64-230940029.tar.bz2
+ https://3p.firestormviewer.org/colladadom-2.3.240621210-linux64-240621210.tar.zst
name
linux64
@@ -762,9 +718,11 @@
archive
hash
- 8e92fc9ec2b3be6d2a5387fc283f954f
+ 7bb9bbadb44dd7490c3e6804395df01ab800bc18
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/curl-8.3.0.232750741-linux64-232750741.tar.bz2
+ https://github.com/secondlife/3p-curl/releases/download/v7.54.1-513145c/curl-7.54.1-513145c-linux64-513145c.tar.zst
name
linux64
@@ -850,9 +808,11 @@
archive
hash
- c539c58aee1d010928ae29ad344656a5
+ 2845d791c0f00392ba1573bc645a0fc8a7fd37ae
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/dullahan-1.14.0.202311061750_118.6.8_ge44bee1_chromium-118.0.5993.117-linux64-233100650.tar.bz2
+ https://3p.firestormviewer.org/dullahan-1.14.0.202403161609_118.6.8_ge44bee1_chromium-118.0.5993.117-linux64-240760509.tar.zst
name
linux64
@@ -913,6 +873,20 @@
name
darwin64
+ linux64
+
+ archive
+
+ hash
+ c036cc042523fb6a3dafb7134f83e52c566c0765
+ hash_algorithm
+ sha1
+ url
+ https://3p.firestormviewer.org/emoji_shortcodes-6.1.0.240620448-linux64-240620448.tar.zst
+
+ name
+ linux64
+
windows64
archive
@@ -1110,11 +1084,11 @@
archive
hash
- 4a999279562e8f3e4ba02d3e78a844ddf6fe18f1
+ a8326f592bf608095f0854383eec2baf36257ea9
hash_algorithm
sha1
url
- https://github.com/secondlife/3p-freetype/releases/download/v.2.12.1.557becd/freetype-2.12.1.557becd-linux64-557becd.tar.zst
+ https://3p.firestormviewer.org/freetype-2.12.1.240700637-linux64-240700637.tar.zst
name
linux64
@@ -1379,6 +1353,20 @@
name
darwin64
+ linux64
+
+ archive
+
+ hash
+ f5e5be3af96f1eb0842219a94765c04aa9c561c5
+ hash_algorithm
+ sha1
+ url
+ https://3p.firestormviewer.org/icu4c-4.8.1-linux64-240621048.tar.zst
+
+ name
+ linux64
+
windows64
archive
@@ -1750,9 +1738,11 @@
archive
hash
- 134089ec8c1eead9436b69c326790fc0
+ e646a9da0ddfe1dfbffc6600d7d35f78ac48c75e
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/libpng-1.6.38.222890126-linux64-222890126.tar.bz2
+ https://3p.firestormviewer.org/libpng-1.6.38-240620624-linux64-240620624.tar.zst
name
linux64
@@ -1838,9 +1828,11 @@
archive
hash
- d72c6d8db827ce3d83c5703f519a2ac9
+ fda5d399c21c3ad29a78f29599523ca4ecf76bd2
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/libxml2-2.10.3.230940019-linux64-230940019.tar.bz2
+ https://github.com/secondlife/3p-libxml2/releases/download/v2.9.4-2db4418/libxml2-2.9.4.2db4418-linux64-2db4418.tar.zst
name
linux64
@@ -1945,11 +1937,11 @@
creds
github
hash
- 48bca5d0233d1e724a59f649a2c6c7ac5f40ec3c
+ b037cc0b29ea70ee834cfae6dda5b7a25cd57174
hash_algorithm
sha1
url
- https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/117009335
+ https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/144851460
name
darwin64
@@ -1961,11 +1953,11 @@
creds
github
hash
- 39f52d0350e130f41c5c758f7cb94e87b962c223
+ bdea1fd5c4da9da5afde088d16188b45d0853e04
hash_algorithm
sha1
url
- https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/117009336
+ https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/144851461
name
linux64
@@ -1977,11 +1969,11 @@
creds
github
hash
- 7b5e645fb7eb399abbea63bd21e8063bbb32a911
+ f652ce0d6aef864689f0ed44255da4d9cd65a43f
hash_algorithm
sha1
url
- https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/117009339
+ https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/144851463
name
windows64
@@ -1994,7 +1986,7 @@
copyright
Copyright (c) 2010, Linden Research, Inc.
version
- 1.0.565768
+ 1.0.479d20a
name
llphysicsextensions_source
@@ -2026,18 +2018,6 @@
name
linux64
- windows
-
- archive
-
- hash
- 2e5f1f7046a49d8b0bc295aa878116bc
- url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/60043/564063/llphysicsextensions_stub-1.0.542456-windows-542456.tar.bz2
-
- name
- windows
-
license
internal
@@ -2190,18 +2170,6 @@
mikktspace
- canonical_repo
- https://bitbucket.org/lindenlab/3p-mikktspace
- copyright
- Copyright (C) 2011 by Morten S. Mikkelsen
- description
- Mikktspace Tangent Generator
- license
- Copyright (C) 2011 by Morten S. Mikkelsen
- license_file
- mikktspace.txt
- name
- mikktspace
platforms
darwin64
@@ -2209,52 +2177,58 @@
archive
hash
- b48b7ac0792d3ea8f087d99d9e4a29d8
+ 6cc1585dba85b0226a2e7033a7e2a2ceaae7c983
+ hash_algorithm
+ sha1
url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104415/914944/mikktspace-1-darwin64-574859.tar.bz2
+ https://github.com/secondlife/3p-mikktspace/releases/download/v1-5cee1f4/mikktspace-1-darwin64-5cee1f4.tar.zst
name
darwin64
- linux64
-
- archive
-
- hash
- 5b719b8d3602f8dc9401cc92d606b34e
- url
- https://3p.firestormviewer.org/mikktspace-1-linux64-223421209.tar.bz2
-
- name
- linux64
-
- windows
-
- archive
-
- hash
- 0a016b9c0c1e2c0b557e0124094da6c5
- url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104407/914918/mikktspace-1-windows-574859.tar.bz2
-
- name
- windows
-
windows64
archive
hash
- 02e9e5b6fe6788f4d2babb83ec544843
+ 6b7d01ad54e4a88a001f66840c32329cedb28202
+ hash_algorithm
+ sha1
url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104406/914909/mikktspace-1-windows64-574859.tar.bz2
+ https://github.com/secondlife/3p-mikktspace/releases/download/v1-5cee1f4/mikktspace-1-windows64-5cee1f4.tar.zst
name
windows64
+ linux64
+
+ archive
+
+ hash
+ edc9782bf209e17ad1845498b42f16d733582082
+ hash_algorithm
+ sha1
+ url
+ https://github.com/secondlife/3p-mikktspace/releases/download/v1-5cee1f4/mikktspace-1-linux64-5cee1f4.tar.zst
+
+ name
+ linux64
+
+ license
+ Copyright (C) 2011 by Morten S. Mikkelsen
+ license_file
+ mikktspace.txt
+ copyright
+ Copyright (C) 2011 by Morten S. Mikkelsen
version
1
+ name
+ mikktspace
+ canonical_repo
+ https://bitbucket.org/lindenlab/3p-mikktspace
+ description
+ Mikktspace Tangent Generator
minizip-ng
@@ -2279,9 +2253,11 @@
archive
hash
- ee4e3a02ad4669a4d84e9c32e509530e
+ d4f35ebcea53ab6e9f2e6cbc0d680b10d10b9c53
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/minizip_ng-3.0.2.222121607-linux64-222121607.tar.bz2
+ https://github.com/secondlife/3p-minizip-ng/releases/download/v3.0.2.3e9876e/minizip_ng-3.0.2.3e9876e-linux64-3e9876e.tar.zst
name
linux64
@@ -2395,9 +2371,11 @@
archive
hash
- 57670eaa6333d9127b8ba88f120e56dd
+ 5798b5f6c8579ad44f211a873c072ee8d3fd8c93
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/nghttp2-1.56.0.232750738-linux64-232750738.tar.bz2
+ https://github.com/secondlife/3p-nghttp2/releases/download/v1.40.0.b1526c6/nghttp2-1.40.0.b1526c6-linux64-b1526c6.tar.zst
name
linux64
@@ -2696,9 +2674,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- a3b2dbffa28a2b2a63c5d3ce2c12bc85
+ 5f6953db991ef6badb0525ecc98daf28d368e9e7
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/openssl-1.1.1w.232750656-linux64-232750656.tar.bz2
+ https://github.com/secondlife/3p-openssl/releases/download/v1.1.1q.de53f55/openssl-1.1.1q.de53f55-linux64-de53f55.tar.zst
name
linux64
@@ -2754,9 +2734,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- 742a145c1518b9dc195ae0862828e6ae
+ 3a722c508a9278a49317e3f749f3256768f1c50b
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/pcre-8.35.202021522-linux64-202021522.tar.bz2
+ https://github.com/secondlife/3p-pcre/releases/download/v8.35-3c0eb51/pcre-8.35.3c0eb51-linux64-3c0eb51.tar.zst
name
linux64
@@ -2901,18 +2883,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
tinygltf
- canonical_repo
- https://bitbucket.org/lindenlab/3p-tinygltf
- copyright
- // Copyright (c) 2015 - Present Syoyo Fujita, Aurélien Chatelain and many contributors.
- description
- tinygltf import library
- license
- MIT
- license_file
- LICENSES/tinygltf_license.txt
- name
- tinygltf
platforms
common
@@ -2920,20 +2890,34 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- 4dad1c0948141e1667c01a3ee755e4dc
+ 2c47ae2d0c38c86b8c2db8d9317f0ab15edfc74f
+ hash_algorithm
+ sha1
url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105849/926137/tinygltf-v2.5.0-common-575729.tar.bz2
+ https://github.com/secondlife/3p-tinygltf/releases/download/v2.5.0-1ae57fd/tinygltf-v2.5.0-common-1ae57fd.tar.zst
name
common
+ license
+ MIT
+ license_file
+ LICENSES/tinygltf_license.txt
+ copyright
+ // Copyright (c) 2015 - Present Syoyo Fujita, Aurélien Chatelain and many contributors.
+ version
+ v2.5.0
+ name
+ tinygltf
+ canonical_repo
+ https://bitbucket.org/lindenlab/3p-tinygltf
+ description
+ tinygltf import library
source
https://bitbucket.org/lindenlab/3p-tinygltf
source_type
git
- version
- v2.5.0
tracy
@@ -2944,9 +2928,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- 9b6e1a1f4b0969d38a1ca8ee00aeb548
+ 49650353442698c3e05102676fe427d0ebe02f0b
+ hash_algorithm
+ sha1
url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110584/960613/tracy-v0.8.1.578241-darwin64-578241.tar.bz2
+ https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-darwin64-eecbf72.tar.zst
name
darwin64
@@ -2956,11 +2942,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- 05b72ae5d733aed7d3bf142287601cc6
+ 2b80e7407e4f3e82eff3879add0e9ad63e7fcace
hash_algorithm
- md5
+ sha1
url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110586/960637/tracy-v0.8.1.578241-windows64-578241.tar.bz2
+ https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-windows64-eecbf72.tar.zst
name
windows64
@@ -2973,7 +2959,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
copyright
Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl)
version
- v0.8.1.235e98f
+ v0.8.1-eecbf72
name
tracy
canonical_repo
@@ -2984,8 +2970,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
https://bitbucket.org/lindenlab/3p-tracy
source_type
git
- version
- v0.8.1.578241
tut
@@ -3096,21 +3080,33 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- 6041bbd4001e3951f96ac3456c7906da
+ deb47841d8e6c82fe9704aaa79d62846
url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113314/980656/viewer_fonts-1.579464-darwin64-579464.tar.bz2
+ https://3p.firestormviewer.org/viewer_fonts-1.240681616-common-240681616.tar.bz2
name
darwin64
+ linux64
+
+ archive
+
+ hash
+ deb47841d8e6c82fe9704aaa79d62846
+ url
+ https://3p.firestormviewer.org/viewer_fonts-1.240681616-common-240681616.tar.bz2
+
+ name
+ linux64
+
windows64
archive
hash
- 1745ba6eec0108250446fe01d4aa065c
+ deb47841d8e6c82fe9704aaa79d62846
url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113307/980631/viewer_fonts-1.579464-windows64-579464.tar.bz2
+ https://3p.firestormviewer.org/viewer_fonts-1.240681616-common-240681616.tar.bz2
name
windows64
@@ -3289,59 +3285,37 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
vulkan_gltf
- canonical_repo
- https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr
- copyright
- Copyright (c) 2018 Sascha Willems
- description
- Vulkan GLTF Sample Implementation
+ platforms
+
+ common
+
+ archive
+
+ hash
+ 8e365eff8dcace48d91e2530f8b13e420849aefc
+ hash_algorithm
+ sha1
+ url
+ https://github.com/secondlife/3p-vulkan-gltf-pbr/releases/download/v1.0.0-d7c372f/vulkan_gltf-1.0.0-common-d7c372f.tar.zst
+
+ name
+ common
+
+
license
Copyright (c) 2018 Sascha Willems
license_file
- LICENSES/vulkan_gltf.txt
+ vulkan_gltf.txt
+ copyright
+ Copyright (c) 2018 Sascha Willems
+ version
+ 1.0.0
name
vulkan_gltf
- platforms
-
- darwin64
-
- archive
-
- hash
- 8cff2060843db3db788511ee34a8e8cc
- url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2
-
- name
- darwin64
-
- windows
-
- archive
-
- hash
- 58eea384be49ba756ce9c5e66669540b
- url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2
-
- name
- windows
-
- windows64
-
- archive
-
- hash
- 79b6a11622c2f83cfc2b7cd1fafb867b
- url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2
-
- name
- windows64
-
-
- version
- 1
+ canonical_repo
+ https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr
+ description
+ Vulkan GLTF Sample Implementation
xxhash
@@ -3352,55 +3326,15 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- e4f77ba0a9b8ec3cc3fabc51c4da81d2
+ 1a73c476b371b62066d1c3eced249660e9467e53
+ hash_algorithm
+ sha1
url
- https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110070/956941/xxhash-0.8.1.578006-windows-578006.tar.bz2
+ https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-69ff69a/xxhash-0.8.1-69ff69a-common-69ff69a.tar.zst
name
common
- darwin64
-
- archive
-
- hash
- fdcc803a76a3359bb426db7dac161406676d51e7
- hash_algorithm
- sha1
- url
- https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-darwin64-7501c90.tar.zst
-
- name
- darwin64
-
- linux64
-
- archive
-
- hash
- 7acb3f94a549fbb9bd7bc16604e34f33c5365a9b
- hash_algorithm
- sha1
- url
- https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-linux64-7501c90.tar.zst
-
- name
- linux64
-
- windows64
-
- archive
-
- hash
- 4522d075ea4703ef4b527c3039864ef735ea7953
- hash_algorithm
- sha1
- url
- https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-windows64-7501c90.tar.zst
-
- name
- windows64
-
license
xxhash
@@ -3409,7 +3343,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
copyright
Copyright (c) 2012-2021 Yann Collet
version
- 0.8.1.7501c90
+ 0.8.1-69ff69a
name
xxhash
description
@@ -3438,9 +3372,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
archive
hash
- 5ee7cda65cede06190c811e59b3880b0
+ fba88375e12454ae19f4528e11ffc7ddf7d879ec
+ hash_algorithm
+ sha1
url
- https://3p.firestormviewer.org/zlib_ng-2.0.5.222121000-linux64-222121000.tar.bz2
+ https://github.com/secondlife/3p-zlib-ng/releases/download/v1.2.11.zlib-ng.32fd361/zlib_ng-1.2.11.zlib-ng.32fd361-linux64-32fd361.tar.zst
name
linux64
diff --git a/build.sh b/build.sh
index f0ed0e2d87..c55179f423 100755
--- a/build.sh
+++ b/build.sh
@@ -176,28 +176,6 @@ pre_build()
VIEWER_SYMBOL_FILE="$(native_path "$abs_build_dir/newview/$variant/secondlife-symbols-$symplat-${AUTOBUILD_ADDRSIZE}.tar.bz2")"
fi
- # expect these variables to be set in the environment from GitHub secrets
- if [[ -n "$BUGSPLAT_DB" ]]
- then
- # don't spew credentials into build log
- set +x
- if [[ -z "$BUGSPLAT_USER" || -z "$BUGSPLAT_PASS" ]]
- then
- # older mechanism involving build-secrets repo -
- # if build_secrets_checkout isn't set, report its name
- bugsplat_sh="${build_secrets_checkout:-\$build_secrets_checkout}/bugsplat/bugsplat.sh"
- if [ -r "$bugsplat_sh" ]
- then # show that we're doing this, just not the contents
- echo source "$bugsplat_sh"
- source "$bugsplat_sh"
- else
- fatal "BUGSPLAT_USER or BUGSPLAT_PASS missing, and no $bugsplat_sh"
- fi
- fi
- set -x
- export BUGSPLAT_USER BUGSPLAT_PASS
- fi
-
# honor autobuild_configure_parameters same as sling-buildscripts
eval_autobuild_configure_parameters=$(eval $(echo echo $autobuild_configure_parameters))
diff --git a/doc/releasenotes-where.txt b/doc/releasenotes-where.txt
deleted file mode 100755
index 4af5866905..0000000000
--- a/doc/releasenotes-where.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-For full release notes, see:
- http://wiki.secondlife.com/wiki/Release_Notes
-
-For a log of viewer changes, see:
- doc/viewer-changes.txt
diff --git a/doc/sl-logo-dark.png b/doc/sl-logo-dark.png
deleted file mode 100644
index fa9ef32aea..0000000000
Binary files a/doc/sl-logo-dark.png and /dev/null differ
diff --git a/doc/sl-logo.png b/doc/sl-logo.png
deleted file mode 100644
index b9563c7ac7..0000000000
Binary files a/doc/sl-logo.png and /dev/null differ
diff --git a/doc/testplans/optimize_away_alpha.md b/doc/testplans/optimize_away_alpha.md
new file mode 100644
index 0000000000..f0c8d1e8d6
--- /dev/null
+++ b/doc/testplans/optimize_away_alpha.md
@@ -0,0 +1,5 @@
+Textures imported via Build->Upload->Material that have an all opaque (255) alpha channel should have their alpha channel removed before upload.
+
+1. Make 4 images that have different colors but all 255 alpha channels
+2. Upload them all using Build->Upload->Material, with one in each of the material texture slots
+3. Verify that using the textures as a blinn-phong diffuse map does not make the corresponding face render in the alpha pass (face should stay visible after disabling alpha pass by unchecking Advanced->Render Types->Alpha).
diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake
index 816174c4ba..3b9f41b3f9 100644
--- a/indra/cmake/FreeType.cmake
+++ b/indra/cmake/FreeType.cmake
@@ -4,12 +4,7 @@ include(Prebuilt)
include_guard()
add_library( ll::freetype INTERFACE IMPORTED )
-if (LINUX)
- find_package(Freetype REQUIRED) # linux fontconfig and freetype should come from the user's system Linux links this via llwindow/CMakeLists
- target_link_libraries( ll::freetype INTERFACE Freetype::Freetype )
-else ()
use_system_binary(freetype)
use_prebuilt_binary(freetype)
target_include_directories( ll::freetype SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/freetype2/)
target_link_libraries( ll::freetype INTERFACE freetype )
-endif()
diff --git a/indra/cmake/ICU4C.cmake b/indra/cmake/ICU4C.cmake
index 7b27665483..806ad28e99 100644
--- a/indra/cmake/ICU4C.cmake
+++ b/indra/cmake/ICU4C.cmake
@@ -12,8 +12,13 @@ if (WINDOWS)
target_link_libraries( ll::icu4c INTERFACE icuuc)
elseif(DARWIN)
target_link_libraries( ll::icu4c INTERFACE icuuc)
-#elseif(LINUX)
-## target_link_libraries( ll::icu4c INTERFACE )
+elseif(LINUX)
+ #
+ #The icu4c 3p puts the libraries in "lib" rather than the normal "release/lib".
+ #Add this to the link search path (otherwise link to the library fails)
+ target_link_directories( ll::icu4c INTERFACE ${LIBS_PREBUILT_DIR}/lib)
+
+ target_link_libraries( ll::icu4c INTERFACE icuuc)
else()
message(FATAL_ERROR "Invalid platform")
endif()
diff --git a/indra/linux_crash_logger/linux_crash_logger.cpp b/indra/linux_crash_logger/linux_crash_logger.cpp
index 5d55e551a4..f14c170939 100644
--- a/indra/linux_crash_logger/linux_crash_logger.cpp
+++ b/indra/linux_crash_logger/linux_crash_logger.cpp
@@ -68,6 +68,11 @@ int main(int argc, char **argv)
curl_global_init(CURL_GLOBAL_ALL);
auto curl = curl_easy_init();
+
+//Not compatible with LL's crusty old curl - support for the curl_mime functions
+//was introduced in curl 7.57.0, LL is still using 7.54 :(
+
+/*
if( curl)
{
auto form = curl_mime_init(curl);
@@ -95,6 +100,47 @@ int main(int argc, char **argv)
curl_easy_cleanup(curl);
curl_mime_free(form);
- }
+ }*/
+
+if (auto curl_handle = curl_easy_init()) {
+ struct curl_httppost* formpost = NULL;
+ struct curl_httppost* lastptr = NULL;
+
+ // Add the file part
+ curl_formadd(&formpost, &lastptr,
+ CURLFORM_COPYNAME, "upload_file_minidump",
+ CURLFORM_FILE, dmpFile.c_str(),
+ CURLFORM_END);
+
+ // Add the 'product' part
+ curl_formadd(&formpost, &lastptr,
+ CURLFORM_COPYNAME, "product",
+ CURLFORM_COPYCONTENTS, "Firestorm-Releasex64",
+ CURLFORM_END);
+
+ // Add the 'version' part
+ curl_formadd(&formpost, &lastptr,
+ CURLFORM_COPYNAME, "version",
+ CURLFORM_COPYCONTENTS, version.c_str(),
+ CURLFORM_END);
+
+ // Set the URL
+ curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());
+
+ // Set the form post data
+ curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost);
+
+ // Perform the request
+ auto res = curl_easy_perform(curl_handle);
+
+ // Cleanup
+ curl_easy_cleanup(curl_handle);
+ curl_formfree(formpost);
+
+ // Check for errors
+ if (res != CURLE_OK)
+ std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
+}
+
return 0;
}
diff --git a/indra/llcommon/indra_constants.cpp b/indra/llcommon/indra_constants.cpp
index 1b48e4daf3..9a0c565b06 100644
--- a/indra/llcommon/indra_constants.cpp
+++ b/indra/llcommon/indra_constants.cpp
@@ -50,6 +50,7 @@ const LLUUID IMG_FIRE ("aca40aa8-44cf-44ca-a0fa-93e1a2986f82"); // dataserver
const LLUUID IMG_FACE_SELECT ("a85ac674-cb75-4af6-9499-df7c5aaf7a28"); // face selector
const LLUUID IMG_DEFAULT_AVATAR ("c228d1cf-4b5d-4ba8-84f4-899a0796aa97"); // dataserver
const LLUUID IMG_INVISIBLE ("3a367d1c-bef1-6d43-7595-e88c1e3aadb3"); // dataserver
+const LLUUID IMG_WHITE ("5748decc-f629-461c-9a36-a35a221fe21f"); // dataserver
const LLUUID IMG_EXPLOSION ("68edcf47-ccd7-45b8-9f90-1649d7f12806"); // On dataserver
const LLUUID IMG_EXPLOSION_2 ("21ce046c-83fe-430a-b629-c7660ac78d7c"); // On dataserver
@@ -71,6 +72,11 @@ const LLUUID TERRAIN_ROCK_DETAIL ("53a2f406-4895-1d13-d541-d2e3b86bc19c"); // V
const LLUUID DEFAULT_WATER_NORMAL ("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); // VIEWER
+const LLUUID DEFAULT_OBJECT_TEXTURE ("89556747-24cb-43ed-920b-47caed15465f"); // On dataserver
+const LLUUID DEFAULT_OBJECT_SPECULAR ("87e0e8f7-8729-1ea8-cfc9-8915773009db"); // On dataserver
+const LLUUID DEFAULT_OBJECT_NORMAL ("85f28839-7a1c-b4e3-d71d-967792970a7b"); // On dataserver
+const LLUUID BLANK_OBJECT_NORMAL ("5b53359e-59dd-d8a2-04c3-9e65134da47a"); // VIEWER (has a verion on dataserver, but with compression artifacts)
+
const LLUUID IMG_USE_BAKED_HEAD ("5a9f4a74-30f2-821c-b88d-70499d3e7183");
const LLUUID IMG_USE_BAKED_UPPER ("ae2de45c-d252-50b8-5c6e-19f39ce79317");
const LLUUID IMG_USE_BAKED_LOWER ("24daea5f-0539-cfcf-047f-fbc40b2786ba");
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index ead46bfa5f..6dc88a538f 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -201,6 +201,7 @@ LL_COMMON_API extern const LLUUID IMG_FIRE;
LL_COMMON_API extern const LLUUID IMG_FACE_SELECT;
LL_COMMON_API extern const LLUUID IMG_DEFAULT_AVATAR;
LL_COMMON_API extern const LLUUID IMG_INVISIBLE;
+LL_COMMON_API extern const LLUUID IMG_WHITE;
LL_COMMON_API extern const LLUUID IMG_EXPLOSION;
LL_COMMON_API extern const LLUUID IMG_EXPLOSION_2;
@@ -234,6 +235,10 @@ LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX3;
LL_COMMON_API extern const LLUUID DEFAULT_WATER_NORMAL;
+LL_COMMON_API extern const LLUUID DEFAULT_OBJECT_TEXTURE;
+LL_COMMON_API extern const LLUUID DEFAULT_OBJECT_SPECULAR;
+LL_COMMON_API extern const LLUUID DEFAULT_OBJECT_NORMAL;
+LL_COMMON_API extern const LLUUID BLANK_OBJECT_NORMAL;
// radius within which a chat message is fully audible
const F32 CHAT_NORMAL_RADIUS = 20.f;
diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp
index 3deed2e199..c13900f74a 100644
--- a/indra/llcommon/llcoros.cpp
+++ b/indra/llcommon/llcoros.cpp
@@ -278,6 +278,7 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl
catch (std::bad_alloc&)
{
// Out of memory on stack allocation?
+ LLError::LLUserWarningMsg::showOutOfMemory();
printActiveCoroutines();
LL_ERRS("LLCoros") << "Bad memory allocation in LLCoros::launch(" << prefix << ")!" << LL_ENDL;
}
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index 0cd494bc96..87fc5b1922 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -1619,6 +1619,48 @@ namespace LLError
{
return out << boost::stacktrace::stacktrace();
}
+
+ // LLOutOfMemoryWarning
+ std::string LLUserWarningMsg::sLocalizedOutOfMemoryTitle;
+ std::string LLUserWarningMsg::sLocalizedOutOfMemoryWarning;
+ LLUserWarningMsg::Handler LLUserWarningMsg::sHandler;
+
+ void LLUserWarningMsg::show(const std::string& message)
+ {
+ if (sHandler)
+ {
+ sHandler(std::string(), message);
+ }
+ }
+
+ void LLUserWarningMsg::showOutOfMemory()
+ {
+ if (sHandler && !sLocalizedOutOfMemoryTitle.empty())
+ {
+ sHandler(sLocalizedOutOfMemoryTitle, sLocalizedOutOfMemoryWarning);
+ }
+ }
+
+ void LLUserWarningMsg::showMissingFiles()
+ {
+ // Files Are missing, likely can't localize.
+ const std::string error_string =
+ "Firestorm viewer couldn't access some of the files it needs and will be closed."
+ "\n\nPlease reinstall viewer from https://firestormviewer.org/download and "
+ "contact https://www.firestormviewer.org/support if issue persists after reinstall.";
+ sHandler("Missing Files", error_string);
+ }
+
+ void LLUserWarningMsg::setHandler(const LLUserWarningMsg::Handler &handler)
+ {
+ sHandler = handler;
+ }
+
+ void LLUserWarningMsg::setOutOfMemoryStrings(const std::string& title, const std::string& message)
+ {
+ sLocalizedOutOfMemoryTitle = title;
+ sLocalizedOutOfMemoryWarning = message;
+ }
}
void crashdriver(void (*callback)(int*))
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 2a8e69402b..c41e0363f7 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -39,6 +39,7 @@
#include "llpreprocessor.h"
#include
+#include // std::function
// Disable C6011 code analyses warning for now popping up everywhere because of the LL_ENDL / LLERROR_CRASH macro
#if LL_WINDOWS
@@ -313,6 +314,28 @@ namespace LLError
{
friend std::ostream& operator<<(std::ostream& out, const LLStacktrace&);
};
+
+ // Provides access to OS notification popup on error, since
+ // not everything has access to OS's messages
+ class LLUserWarningMsg
+ {
+ public:
+ typedef std::function Handler;
+ static void setHandler(const Handler&);
+ static void setOutOfMemoryStrings(const std::string& title, const std::string& message);
+
+ // When viewer encounters bad alloc or can't access files try warning user about reasons
+ static void showOutOfMemory();
+ static void showMissingFiles();
+ // Genering error
+ static void show(const std::string&);
+
+ private:
+ // needs to be preallocated before viewer runs out of memory
+ static std::string sLocalizedOutOfMemoryTitle;
+ static std::string sLocalizedOutOfMemoryWarning;
+ static Handler sHandler;
+ };
}
//this is cheaper than llcallstacks if no need to output other variables to call stacks.
diff --git a/indra/llcommon/llexception.cpp b/indra/llcommon/llexception.cpp
index 46560b5e4c..0787bde57f 100644
--- a/indra/llcommon/llexception.cpp
+++ b/indra/llcommon/llexception.cpp
@@ -37,6 +37,7 @@
#include "llerror.h"
#include "llerrorcontrol.h"
+
// used to attach and extract stacktrace information to/from boost::exception,
// see https://www.boost.org/doc/libs/release/doc/html/stacktrace/getting_started.html#stacktrace.getting_started.exceptions_with_stacktrace
// apparently the struct passed as the first template param needs no definition?
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index ec3c562599..034bfadeca 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -496,7 +496,7 @@ public:
static DERIVED_TYPE* getInstance()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD;
+ //LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD; // TODO -- reenable this when we have a fix for using Tracy with coroutines
// We know the viewer has LLSingleton dependency circularities. If you
// feel strongly motivated to eliminate them, cheers and good luck.
// (At that point we could consider a much simpler locking mechanism.)
diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp
index e711451b8a..50317a8f0b 100644
--- a/indra/llcorehttp/_httpoprequest.cpp
+++ b/indra/llcorehttp/_httpoprequest.cpp
@@ -276,15 +276,10 @@ void HttpOpRequest::visitNotifier(HttpRequest * request)
HttpResponse::TransferStats::ptr_t stats = HttpResponse::TransferStats::ptr_t(new HttpResponse::TransferStats);
-#if LL_LINUX
- curl_easy_getinfo(mCurlHandle, CURLINFO_SIZE_DOWNLOAD_T, &stats->mSizeDownload);
- curl_easy_getinfo(mCurlHandle, CURLINFO_TOTAL_TIME, &stats->mTotalTime);
- curl_easy_getinfo(mCurlHandle, CURLINFO_SPEED_DOWNLOAD_T, &stats->mSpeedDownload);
-#else
curl_easy_getinfo(mCurlHandle, CURLINFO_SIZE_DOWNLOAD, &stats->mSizeDownload);
curl_easy_getinfo(mCurlHandle, CURLINFO_TOTAL_TIME, &stats->mTotalTime);
curl_easy_getinfo(mCurlHandle, CURLINFO_SPEED_DOWNLOAD, &stats->mSpeedDownload);
-#endif
+
response->setTransferStats(stats);
mUserHandler->onCompleted(this->getHandle(), response);
diff --git a/indra/llcorehttp/_httpservice.cpp b/indra/llcorehttp/_httpservice.cpp
index 294acd7f63..517076804d 100644
--- a/indra/llcorehttp/_httpservice.cpp
+++ b/indra/llcorehttp/_httpservice.cpp
@@ -320,6 +320,7 @@ void HttpService::threadRun(LLCoreInt::HttpThread * thread)
LLMemory::logMemoryInfo(TRUE);
//output possible call stacks to log file.
+ LLError::LLUserWarningMsg::showOutOfMemory();
LLError::LLCallStacks::print();
LL_ERRS() << "Bad memory allocation in HttpService::threadRun()!" << LL_ENDL;
diff --git a/indra/llcorehttp/httpresponse.h b/indra/llcorehttp/httpresponse.h
index 1403e1c64f..b834085e5c 100644
--- a/indra/llcorehttp/httpresponse.h
+++ b/indra/llcorehttp/httpresponse.h
@@ -75,16 +75,9 @@ public:
typedef boost::shared_ptr ptr_t;
TransferStats() : mSizeDownload(0.0), mTotalTime(0.0), mSpeedDownload(0.0) {}
-
-#if LL_LINUX
- curl_off_t mSizeDownload;
- curl_off_t mSpeedDownload;
- F64 mTotalTime;
-#else
F64 mSizeDownload;
F64 mTotalTime;
F64 mSpeedDownload;
-#endif
};
diff --git a/indra/llimage/llimagebmp.cpp b/indra/llimage/llimagebmp.cpp
index 763f5a3328..39f9e6be6b 100644
--- a/indra/llimage/llimagebmp.cpp
+++ b/indra/llimage/llimagebmp.cpp
@@ -321,6 +321,7 @@ bool LLImageBMP::updateData()
mColorPalette = new(std::nothrow) U8[color_palette_size];
if (!mColorPalette)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_WARNS() << "Out of memory in LLImageBMP::updateData(), size: " << color_palette_size << LL_ENDL;
return false;
}
diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp
index 36317a5ba8..ae76c5243f 100644
--- a/indra/llimage/llimagedxt.cpp
+++ b/indra/llimage/llimagedxt.cpp
@@ -437,6 +437,7 @@ bool LLImageDXT::convertToDXR()
U8* newdata = (U8*)ll_aligned_malloc_16(total_bytes);
if (!newdata)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "Out of memory in LLImageDXT::convertToDXR()" << LL_ENDL;
return false;
}
diff --git a/indra/llimage/llimagetga.cpp b/indra/llimage/llimagetga.cpp
index d43f8dcc3b..ceb02d87c3 100644
--- a/indra/llimage/llimagetga.cpp
+++ b/indra/llimage/llimagetga.cpp
@@ -266,6 +266,7 @@ bool LLImageTGA::updateData()
mColorMap = new(std::nothrow) U8[ color_map_bytes ];
if (!mColorMap)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_WARNS() << "Out of Memory in bool LLImageTGA::updateData(), size: " << color_map_bytes << LL_ENDL;
return false;
}
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index d39c4eb834..37be6ef835 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -1090,16 +1090,30 @@ LLFontGL::VAlign LLFontGL::vAlignFromName(const std::string& name)
}
//static
-LLFontGL* LLFontGL::getFontEmoji()
+LLFontGL* LLFontGL::getFontEmoji( bool useBW ) // Add B&W emoji font support
{
static LLFontGL* fontp = getFont(LLFontDescriptor("Emoji", "Large", 0));
+// Add B&W emoji font support
+ static LLFontGL* fontp_bw = getFont(LLFontDescriptor("EmojiBW", "Large", 0));
+ if( useBW )
+ {
+ return fontp_bw;
+ }
+//
return fontp;;
}
//static
-LLFontGL* LLFontGL::getFontEmojiHuge()
+LLFontGL* LLFontGL::getFontEmojiHuge( bool useBW ) // Add B&W emoji font support
{
static LLFontGL* fontp = getFont(LLFontDescriptor("Emoji", "Huge", 0));
+// Add B&W emoji font support
+ static LLFontGL* fontp_bw = getFont(LLFontDescriptor("EmojiBW", "Huge", 0));
+ if( useBW )
+ {
+ return fontp_bw;
+ }
+//
return fontp;;
}
diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h
index 13c9e8bfce..6ba652bc48 100644
--- a/indra/llrender/llfontgl.h
+++ b/indra/llrender/llfontgl.h
@@ -194,8 +194,8 @@ public:
static void setFontDisplay(BOOL flag) { sDisplayFont = flag; }
- static LLFontGL* getFontEmoji();
- static LLFontGL* getFontEmojiHuge();
+ static LLFontGL* getFontEmoji( bool useBW = false ); // Add B&W emoji font support
+ static LLFontGL* getFontEmojiHuge( bool useBW = false ); // Add B&W emoji font support
static LLFontGL* getFontMonospace();
static LLFontGL* getFontSansSerifSmall();
static LLFontGL* getFontSansSerifSmallBold();
diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp
index 0e12f5225d..5773aeafdc 100644
--- a/indra/llrender/llfontregistry.cpp
+++ b/indra/llrender/llfontregistry.cpp
@@ -47,8 +47,35 @@ bool init_from_xml(LLFontRegistry* registry, LLXMLNodePtr node);
const std::string MACOSX_FONT_PATH_LIBRARY = "/Library/Fonts/";
const std::string MACOSX_FONT_SUPPLEMENTAL = "Supplemental/";
+
+
+// font functors with UI control access
+static bool isEmojiUseBW(llwchar wch)
+{
+ static LLCachedControl emoji_use_bw(gSavedSettings, "FSUseEmojiBW", false);
+ if(emoji_use_bw)
+ {
+ return (LLStringOps::isEmoji(wch));
+ }
+ return false;
+}
+
+
+static bool isEmojiUseColor(llwchar wch)
+{
+ static LLCachedControl emoji_use_bw(gSavedSettings, "FSUseEmojiBW", false);
+ if(!emoji_use_bw)
+ {
+ return (LLStringOps::isEmoji(wch));
+ }
+ return false;
+}
+//
+
LLFontDescriptor::char_functor_map_t LLFontDescriptor::mCharFunctors({
{ "is_emoji", LLStringOps::isEmoji }
+ , { "is_emoji_use_color", isEmojiUseColor }
+ , { "is_emoji_use_bw", isEmojiUseBW }
});
LLFontDescriptor::LLFontDescriptor():
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 9e3ef13bba..e0a7c2c958 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -1353,6 +1353,7 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
scratch = new(std::nothrow) U32[width * height];
if (!scratch)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
<< " bytes for a manual image W" << width << " H" << height << LL_ENDL;
}
@@ -1378,6 +1379,7 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
scratch = new(std::nothrow) U32[width * height];
if (!scratch)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
<< " bytes for a manual image W" << width << " H" << height << LL_ENDL;
}
@@ -1406,6 +1408,7 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
scratch = new(std::nothrow) U32[width * height];
if (!scratch)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
<< " bytes for a manual image W" << width << " H" << height << LL_ENDL;
}
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 24b0653d26..92432b4f38 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -862,7 +862,7 @@ LLRender::~LLRender()
shutdown();
}
-void LLRender::init(bool needs_vertex_buffer)
+bool LLRender::init(bool needs_vertex_buffer)
{
#if LL_WINDOWS
if (gGLManager.mHasDebugOutput && gDebugGL)
@@ -884,6 +884,13 @@ void LLRender::init(bool needs_vertex_buffer)
// necessary for reflection maps
glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
+#if LL_WINDOWS
+ if (glGenVertexArrays == nullptr)
+ {
+ return false;
+ }
+#endif
+
{ //bind a dummy vertex array object so we're core profile compliant
U32 ret;
glGenVertexArrays(1, &ret);
@@ -904,6 +911,8 @@ void LLRender::init(bool needs_vertex_buffer)
stop_glerror();
mMaxLineWidthSmooth = range[1];
//
+
+ return true;
}
void LLRender::initVertexBuffer()
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 6cc570543b..1956715e5b 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -386,7 +386,7 @@ public:
LLRender();
~LLRender();
- void init(bool needs_vertex_buffer);
+ bool init(bool needs_vertex_buffer);
void initVertexBuffer();
void resetVertexBuffer();
void shutdown();
diff --git a/indra/llrender/llrendernavprim.cpp b/indra/llrender/llrendernavprim.cpp
index d610a44bc6..eea3077632 100644
--- a/indra/llrender/llrendernavprim.cpp
+++ b/indra/llrender/llrendernavprim.cpp
@@ -40,20 +40,20 @@ LLRenderNavPrim gRenderNav;
//=============================================================================
void LLRenderNavPrim::renderLLTri( const LLVector3& a, const LLVector3& b, const LLVector3& c, const LLColor4U& color ) const
{
- LLColor4 cV(color);
- gGL.color4fv( cV.mV );
- gGL.begin(LLRender::TRIANGLES);
+ gGL.color4ubv(color.mV);
+
+ gGL.begin(LLRender::TRIANGLES);
{
gGL.vertex3fv( a.mV );
gGL.vertex3fv( b.mV );
gGL.vertex3fv( c.mV );
}
- gGL.end();
+ gGL.end();
}
//=============================================================================
void LLRenderNavPrim::renderNavMeshVB( U32 mode, LLVertexBuffer* pVBO, int vertCnt )
{
pVBO->setBuffer();
- pVBO->drawArrays( mode, 0, vertCnt );
+ pVBO->drawArrays( mode, 0, vertCnt );
}
//=============================================================================
diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp
index 89e6ddf987..96e92f3379 100644
--- a/indra/llui/llemojihelper.cpp
+++ b/indra/llui/llemojihelper.cpp
@@ -57,6 +57,14 @@ bool LLEmojiHelper::isActive(const LLUICtrl* ctrl_p) const
// static
bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S32* pShortCodePos)
{
+ // FIRE-33735: Option to suppress emoji chooser window from automatically popping up while typing in chat bars
+ static LLUICachedControl FSEnableEmojiWindowPopupWhileTyping("FSEnableEmojiWindowPopupWhileTyping");
+ if (!FSEnableEmojiWindowPopupWhileTyping)
+ {
+ return false;
+ }
+ //
+ if (cursorPos < 0 || wtext.size() < cursorPos) return false; // FIRE-33773 - fix logic to avoid OOB access to wtext
// If the cursor is currently on a colon start the check one character further back
S32 shortCodePos = (cursorPos == 0 || L':' != wtext[cursorPos - 1]) ? cursorPos : cursorPos - 1;
@@ -76,7 +84,7 @@ bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S
shortCodePos--;
}
- bool isShortCode = (L':' == wtext[shortCodePos - 1]) && (cursorPos - shortCodePos >= 2);
+ bool isShortCode = (cursorPos - shortCodePos >= 2) && (L':' == wtext[shortCodePos - 1]); // FIRE-33773 - fix logic to avoid OOB access to wtext
if (pShortCodePos)
*pShortCodePos = (isShortCode) ? shortCodePos - 1 : -1;
return isShortCode;
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 18101d7b82..9572971fc7 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1562,6 +1562,7 @@ bool LLNotifications::loadTemplates()
if (!success || root.isNull() || !root->hasName( "notifications" ))
{
+ LLError::LLUserWarningMsg::show(LLTrans::getString("MBMissingFile"));
LL_ERRS() << "Problem reading XML from UI Notifications file: " << base_filename << LL_ENDL;
return false;
}
@@ -1572,6 +1573,7 @@ bool LLNotifications::loadTemplates()
if(!params.validateBlock())
{
+ LLError::LLUserWarningMsg::show(LLTrans::getString("MBMissingFile"));
LL_ERRS() << "Problem reading XUI from UI Notifications file: " << base_filename << LL_ENDL;
return false;
}
@@ -1638,6 +1640,7 @@ bool LLNotifications::loadVisibilityRules()
if(!params.validateBlock())
{
+ LLError::LLUserWarningMsg::show(LLTrans::getString("MBMissingFile"));
LL_ERRS() << "Problem reading UI Notification Visibility Rules file: " << full_filename << LL_ENDL;
return false;
}
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 3e0b4ae11f..69aedb647b 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1053,6 +1053,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
// Insert special segments where necessary (insertSegment takes care of splitting normal text segments around them for us)
{
+ static LLUICachedControl useBWEmojis("FSUseBWEmojis", false); // Add B&W emoji font support
LLStyleSP emoji_style;
LLEmojiDictionary* ed = LLEmojiDictionary::instanceExists() ? LLEmojiDictionary::getInstance() : NULL;
for (S32 text_kitty = 0, text_len = wstr.size(); text_kitty < text_len; text_kitty++)
@@ -1064,7 +1065,7 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s
if (!emoji_style)
{
emoji_style = new LLStyle(getStyleParams());
- emoji_style->setFont(LLFontGL::getFontEmoji());
+ emoji_style->setFont(LLFontGL::getFontEmoji( useBWEmojis )); // Add B&W emoji font support
}
S32 new_seg_start = pos + text_kitty;
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index e91e6894f4..e938fa3c8f 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -734,9 +734,10 @@ void LLTextEditor::selectByCursorPosition(S32 prev_cursor_pos, S32 next_cursor_p
void LLTextEditor::insertEmoji(llwchar emoji)
{
- LL_INFOS() << "LLTextEditor::insertEmoji(" << wchar_utf8_preview(emoji) << ")" << LL_ENDL;
+ static LLUICachedControl useBWEmojis( "FSUseBWEmojis", false); // Add B&W emoji font support
+ LL_DEBUGS("Emoji") << "LLTextEditor::insertEmoji(" << wchar_utf8_preview(emoji) << ")" << LL_ENDL; // reduce Emoji log spam
auto styleParams = LLStyle::Params();
- styleParams.font = LLFontGL::getFontEmoji();
+ styleParams.font = LLFontGL::getFontEmoji( useBWEmojis ); // Add B&W emoji font support
auto segment = new LLEmojiTextSegment(new LLStyle(styleParams), mCursorPos, mCursorPos + 1, *this);
insert(mCursorPos, LLWString(1, emoji), false, segment);
setCursorPos(mCursorPos + 1);
@@ -2901,6 +2902,7 @@ BOOL LLTextEditor::importBuffer(const char* buffer, S32 length )
char* text = new char[ text_len + 1];
if (text == NULL)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "Memory allocation failure." << LL_ENDL;
return FALSE;
}
diff --git a/indra/llui/lltransutil.cpp b/indra/llui/lltransutil.cpp
index ebbdae2e9a..dbf50f818c 100644
--- a/indra/llui/lltransutil.cpp
+++ b/indra/llui/lltransutil.cpp
@@ -44,8 +44,13 @@ bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::setdumpCurrentDirectories(LLError::LEVEL_WARN);
- LL_ERRS() << "Couldn't load string table " << xml_filename << ". Please reinstall viewer from https://www.firestormviewer.org/choose-your-platform/ and contact https://www.firestormviewer.org/support if issue persists after reinstall." << LL_ENDL;
+ LL_ERRS() << "Couldn't load string table " << xml_filename << " " << errno << LL_ENDL;
return false;
}
@@ -60,6 +65,7 @@ bool LLTransUtil::parseLanguageStrings(const std::string& xml_filename)
if (!success)
{
+ LLError::LLUserWarningMsg::showMissingFiles();
LL_ERRS() << "Couldn't load localization table " << xml_filename << LL_ENDL;
return false;
}
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index b7f8ee41e6..69adf3456f 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-7.1.4
+7.1.5
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index e7dd7ea589..3655ba6b32 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5189,17 +5189,6 @@
Backup
0
- DefaultBlankNormalTexture
-
- Comment
- Texture used as 'Blank' in texture picker for normal maps. (UUID texture reference)
- Persist
- 1
- Type
- String
- Value
- 5b53359e-59dd-d8a2-04c3-9e65134da47a
-
DefaultFemaleAvatar
Comment
@@ -5233,39 +5222,6 @@
Value
Male Shape & Outfit
- DefaultObjectNormalTexture
-
- Comment
- Texture used as 'Default' in texture picker for normal map. (UUID texture reference)
- Persist
- 1
- Type
- String
- Value
- 85f28839-7a1c-b4e3-d71d-967792970a7b
-
- DefaultObjectSpecularTexture
-
- Comment
- Texture used as 'Default' in texture picker for specular map. (UUID texture reference)
- Persist
- 1
- Type
- String
- Value
- 87e0e8f7-8729-1ea8-cfc9-8915773009db
-
- DefaultObjectTexture
-
- Comment
- Texture used as 'Default' in texture picker. (UUID texture reference)
- Persist
- 1
- Type
- String
- Value
- 89556747-24cb-43ed-920b-47caed15465f
-
DefaultUploadCost
Comment
@@ -13622,7 +13578,7 @@ Change of this parameter will affect the layout of buttons in notification toast
Type
F32
Value
- 2.0
+ 1.0
RendeSkyAutoAdjustBlueHorizonScale
@@ -13666,7 +13622,7 @@ Change of this parameter will affect the layout of buttons in notification toast
Type
F32
Value
- 0.001
+ 0.01
RenderSkySunlightScale
@@ -16681,17 +16637,6 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
F3E07BC8-A973-476D-8C7F-F3B7293975D1
- UIImgWhiteUUID
-
- Comment
-
- Persist
- 0
- Type
- String
- Value
- 5748decc-f629-461c-9a36-a35a221fe21f
-
UIImgTransparentUUID
Comment
@@ -26561,5 +26506,49 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
1
+ FSEnableEmojiWindowPopupWhileTyping
+
+ Comment
+ Enables automatic opening of emoji chooser window while typing in chat bars.
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ FSUseBWEmojis
+
+ Comment
+ Use Black and White Emojis.
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 0
+
+ FSUsePrettyEmojiButton
+
+ Comment
+ Use an emoji for the emoji button.
+ Persist
+ 1
+ Type
+ Boolean
+ Value
+ 1
+
+ FSPrettyEmojiButtonCode
+
+ Comment
+ Decimal code for the emoji button. Try 128569 or 128571 for example
+ Persist
+ 1
+ Type
+ U32
+ Value
+ 128578
+
diff --git a/indra/newview/fonts/fonts.xml b/indra/newview/fonts/fonts.xml
index 58f45e6d80..e3a0b1f3e8 100644
--- a/indra/newview/fonts/fonts.xml
+++ b/indra/newview/fonts/fonts.xml
@@ -3,7 +3,8 @@
DejaVuSans.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
DejaVuSansMono.ttf
diff --git a/indra/newview/fonts/fonts_cascadia_code.xml b/indra/newview/fonts/fonts_cascadia_code.xml
index c854b7b2b9..895cf7eabb 100644
--- a/indra/newview/fonts/fonts_cascadia_code.xml
+++ b/indra/newview/fonts/fonts_cascadia_code.xml
@@ -3,7 +3,8 @@
CascadiaCode-Light.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
CascadiaCode-Light.ttf
diff --git a/indra/newview/fonts/fonts_celestia_medium_redux.xml b/indra/newview/fonts/fonts_celestia_medium_redux.xml
index 7a37d265ae..6b28aee211 100644
--- a/indra/newview/fonts/fonts_celestia_medium_redux.xml
+++ b/indra/newview/fonts/fonts_celestia_medium_redux.xml
@@ -3,7 +3,8 @@
CelestiaMediumRedux1.55.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
DejaVuSansMono.ttf
diff --git a/indra/newview/fonts/fonts_deja_vu_all_caps.xml b/indra/newview/fonts/fonts_deja_vu_all_caps.xml
index a40030d90b..8780cc6262 100644
--- a/indra/newview/fonts/fonts_deja_vu_all_caps.xml
+++ b/indra/newview/fonts/fonts_deja_vu_all_caps.xml
@@ -3,7 +3,8 @@
DejaVuSansAllCaps.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -80,6 +81,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
DejaVuSansAllCapsMono.ttf
diff --git a/indra/newview/fonts/fonts_droid.xml b/indra/newview/fonts/fonts_droid.xml
index ec61de5fa6..5e575b984f 100644
--- a/indra/newview/fonts/fonts_droid.xml
+++ b/indra/newview/fonts/fonts_droid.xml
@@ -3,7 +3,8 @@
DroidSans.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
DroidSansMono.ttf
diff --git a/indra/newview/fonts/fonts_dyslexia.xml b/indra/newview/fonts/fonts_dyslexia.xml
index 98e36c4c24..b41fdc1306 100644
--- a/indra/newview/fonts/fonts_dyslexia.xml
+++ b/indra/newview/fonts/fonts_dyslexia.xml
@@ -3,7 +3,8 @@
MobiSans.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
SourceCodePro-Regular.ttf
diff --git a/indra/newview/fonts/fonts_liberation.xml b/indra/newview/fonts/fonts_liberation.xml
index 343c319dd8..0261b75696 100644
--- a/indra/newview/fonts/fonts_liberation.xml
+++ b/indra/newview/fonts/fonts_liberation.xml
@@ -3,7 +3,8 @@
LiberationSans-Regular.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
LiberationMono-Regular.ttf
diff --git a/indra/newview/fonts/fonts_mobi.xml b/indra/newview/fonts/fonts_mobi.xml
index 500cde4657..d9f6db65f9 100644
--- a/indra/newview/fonts/fonts_mobi.xml
+++ b/indra/newview/fonts/fonts_mobi.xml
@@ -3,7 +3,8 @@
MobiSans.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
MobiSansMono.ttf
diff --git a/indra/newview/fonts/fonts_noto.xml b/indra/newview/fonts/fonts_noto.xml
index c9a35877b4..d57a8c209c 100644
--- a/indra/newview/fonts/fonts_noto.xml
+++ b/indra/newview/fonts/fonts_noto.xml
@@ -3,7 +3,8 @@
NotoSans.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
NotoMono-Regular.ttf
diff --git a/indra/newview/fonts/fonts_roboto.xml b/indra/newview/fonts/fonts_roboto.xml
index 83872ff9c4..18fad6b060 100644
--- a/indra/newview/fonts/fonts_roboto.xml
+++ b/indra/newview/fonts/fonts_roboto.xml
@@ -3,7 +3,8 @@
DroidSans.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
MobiSansMono.ttf
diff --git a/indra/newview/fonts/fonts_ubuntu.xml b/indra/newview/fonts/fonts_ubuntu.xml
index d8a99a4baf..08d6051436 100644
--- a/indra/newview/fonts/fonts_ubuntu.xml
+++ b/indra/newview/fonts/fonts_ubuntu.xml
@@ -3,7 +3,8 @@
Ubuntu-R.ttf
- TwemojiSVG.ttf
+ TwemojiSVG.ttf
+ NotoEmoji-Regular.ttf
meiryo.TTC
YuGothR.ttc
@@ -82,6 +83,11 @@
TwemojiSVG.ttf
+
+ NotoEmoji-Regular.ttf
+
+
UbuntuMono-R.ttf
diff --git a/indra/newview/fsassetblacklist.cpp b/indra/newview/fsassetblacklist.cpp
index bd59437e4a..098543a998 100644
--- a/indra/newview/fsassetblacklist.cpp
+++ b/indra/newview/fsassetblacklist.cpp
@@ -66,7 +66,7 @@ LLAssetType::EType S32toAssetType(S32 assetindex)
return type;
}
-void FSAssetBlacklist::initSingleton()
+void FSAssetBlacklist::init()
{
mBlacklistFileName = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "asset_blacklist.xml");
loadBlacklist();
diff --git a/indra/newview/fsassetblacklist.h b/indra/newview/fsassetblacklist.h
index d7a90b10ff..d7fbdcb612 100644
--- a/indra/newview/fsassetblacklist.h
+++ b/indra/newview/fsassetblacklist.h
@@ -44,7 +44,7 @@ class FSAssetBlacklist : public LLSingleton
LLSINGLETON_EMPTY_CTOR(FSAssetBlacklist);
public:
- void initSingleton() override;
+ void init();
bool isBlacklisted(const LLUUID& id, LLAssetType::EType type);
void addNewItemToBlacklist(const LLUUID& id, const std::string& name, const std::string& region, LLAssetType::EType type, bool permanent = true, bool save = true);
void addNewItemToBlacklistData(const LLUUID& id, const LLSD& data, bool save = true);
diff --git a/indra/newview/fscommon.cpp b/indra/newview/fscommon.cpp
index b4421c4ae9..bc40a832b0 100644
--- a/indra/newview/fscommon.cpp
+++ b/indra/newview/fscommon.cpp
@@ -478,7 +478,8 @@ bool FSCommon::isDefaultTexture(const LLUUID& asset_id)
asset_id == LL_DEFAULT_PLASTIC_UUID ||
asset_id == LL_DEFAULT_RUBBER_UUID ||
asset_id == LL_DEFAULT_LIGHT_UUID ||
- asset_id == LLUUID("5748decc-f629-461c-9a36-a35a221fe21f") || // UIImgWhiteUUID
+ asset_id == IMG_WHITE ||
+ asset_id == LLUUID("5748decc-f629-461c-9a36-a35a221fe21f") || // UIImgWhiteUUID (legacy: replaced by IMG_WHITE)
asset_id == LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903") || // UIImgTransparentUUID
asset_id == LLUUID("f54a0c32-3cd1-d49a-5b4f-7b792bebc204") || // UIImgInvisibleUUID
asset_id == LLUUID("6522e74d-1660-4e7f-b601-6f48c1659a77") || // UIImgDefaultEyesUUID
diff --git a/indra/newview/fsfloaterim.cpp b/indra/newview/fsfloaterim.cpp
index 897289cc91..193ab0d1a8 100644
--- a/indra/newview/fsfloaterim.cpp
+++ b/indra/newview/fsfloaterim.cpp
@@ -972,8 +972,21 @@ BOOL FSFloaterIM::postBuild()
mEmojiRecentIconsCtrl->setCommitCallback([this](LLUICtrl*, const LLSD& value) { onRecentEmojiPicked(value); });
mEmojiRecentIconsCtrl->setVisible(false);
+ static bool usePrettyEmojiButton = gSavedSettings.getBOOL( "FSUsePrettyEmojiButton" );
+ static bool useBWEmojis = gSavedSettings.getBOOL( "FSUseBWEmojis" );
mEmojiPickerToggleBtn = getChild("emoji_picker_toggle_btn");
- mEmojiPickerToggleBtn->setLabel(LLUIString(LLWString(1, 128512)));
+ if (usePrettyEmojiButton)
+ {
+ static auto emoji_btn_char = gSavedSettings.getU32("FSPrettyEmojiButtonCode");
+ mEmojiPickerToggleBtn->setImageOverlay(LLUUID::null);
+ mEmojiPickerToggleBtn->setFont(LLFontGL::getFontEmoji(useBWEmojis));
+ mEmojiPickerToggleBtn->setLabel(LLUIString(LLWString(1, emoji_btn_char)));
+ }
+ else
+ {
+ mEmojiPickerToggleBtn->setLabel(LLUIString(""));
+ mEmojiPickerToggleBtn->setImageOverlay("Emoji_Picker_Icon");
+ }
mEmojiPickerToggleBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerToggleBtnClicked(); });
mRecentEmojisUpdatedCallbackConnection = LLFloaterEmojiPicker::setRecentEmojisUpdatedCallback([this](const std::list& recent_emojis_list) { initEmojiRecentPanel(); });
diff --git a/indra/newview/fsfloaternearbychat.cpp b/indra/newview/fsfloaternearbychat.cpp
index db9c677fdf..34f66d2850 100644
--- a/indra/newview/fsfloaternearbychat.cpp
+++ b/indra/newview/fsfloaternearbychat.cpp
@@ -161,8 +161,21 @@ BOOL FSFloaterNearbyChat::postBuild()
mEmojiRecentIconsCtrl->setCommitCallback([this](LLUICtrl*, const LLSD& value) { onRecentEmojiPicked(value); });
mEmojiRecentIconsCtrl->setVisible(false);
+ static bool usePrettyEmojiButton = gSavedSettings.getBOOL( "FSUsePrettyEmojiButton" );
+ static bool useBWEmojis = gSavedSettings.getBOOL( "FSUseBWEmojis" );
mEmojiPickerToggleBtn = getChild("emoji_picker_toggle_btn");
- mEmojiPickerToggleBtn->setLabel(LLUIString(LLWString(1, 128512)));
+ if (usePrettyEmojiButton)
+ {
+ static auto emoji_btn_char = gSavedSettings.getU32("FSPrettyEmojiButtonCode");
+ mEmojiPickerToggleBtn->setImageOverlay(LLUUID::null);
+ mEmojiPickerToggleBtn->setFont(LLFontGL::getFontEmoji(useBWEmojis));
+ mEmojiPickerToggleBtn->setLabel(LLUIString(LLWString(1, emoji_btn_char)));
+ }
+ else
+ {
+ mEmojiPickerToggleBtn->setLabel(LLUIString(""));
+ mEmojiPickerToggleBtn->setImageOverlay("Emoji_Picker_Icon");
+ }
mEmojiPickerToggleBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerToggleBtnClicked(); });
mRecentEmojisUpdatedCallbackConnection = LLFloaterEmojiPicker::setRecentEmojisUpdatedCallback([this](const std::list& recent_emojis_list) { initEmojiRecentPanel(); });
diff --git a/indra/newview/fsgridhandler.h b/indra/newview/fsgridhandler.h
index 1b1e8ad21f..8ac57866b2 100644
--- a/indra/newview/fsgridhandler.h
+++ b/indra/newview/fsgridhandler.h
@@ -128,7 +128,7 @@ public:
void initCmdLineGrids();
void resetGrids();
// grid list management
- bool isReadyToLogin(){return mReadyToLogin;}
+ bool isReadyToLogin() const {return mReadyToLogin;}
// add a grid to the list of grids
void addGrid(const std::string& loginuri);
diff --git a/indra/newview/fslslbridge.h b/indra/newview/fslslbridge.h
index 630c98a4be..a7efb1ec7e 100644
--- a/indra/newview/fslslbridge.h
+++ b/indra/newview/fslslbridge.h
@@ -77,19 +77,19 @@ public:
void processAttach(LLViewerObject* object, const LLViewerJointAttachment* attachment);
void processDetach(LLViewerObject* object, const LLViewerJointAttachment* attachment);
- bool getBridgeCreating() { return mBridgeCreating; };
+ bool getBridgeCreating() const { return mBridgeCreating; };
void setBridgeCreating(bool status) { mBridgeCreating = status; };
void setBridge(LLViewerInventoryItem* item) { mpBridge = item; };
- LLViewerInventoryItem* getBridge() { return mpBridge; };
+ LLViewerInventoryItem* getBridge() const { return mpBridge; };
bool canUseBridge();
bool isBridgeValid() const { return nullptr != mpBridge; }
void checkBridgeScriptName();
- std::string currentFullName() { return mCurrentFullName; }
+ std::string currentFullName() const { return mCurrentFullName; }
- LLUUID getBridgeFolder() { return mBridgeFolderID; }
- LLUUID getAttachedID() { return mBridgeUUID; }
+ LLUUID getBridgeFolder() const { return mBridgeFolderID; }
+ LLUUID getAttachedID() const { return mBridgeUUID; }
bool canDetach(const LLUUID& item_id);
@@ -97,10 +97,10 @@ public:
void setTimerResult(TimerResult result);
// from LLVOInventoryListener
- virtual void inventoryChanged(LLViewerObject* object,
- LLInventoryObject::object_list_t* inventory,
- S32 serial_num,
- void* user_data);
+ void inventoryChanged(LLViewerObject* object,
+ LLInventoryObject::object_list_t* inventory,
+ S32 serial_num,
+ void* user_data) override;
private:
std::string mCurrentURL;
diff --git a/indra/newview/fsnearbychathub.h b/indra/newview/fsnearbychathub.h
index 9c59cdd334..bd2c9fbfe2 100644
--- a/indra/newview/fsnearbychathub.h
+++ b/indra/newview/fsnearbychathub.h
@@ -39,8 +39,6 @@ class FSNearbyChat : public LLSingleton
LLSINGLETON(FSNearbyChat);
~FSNearbyChat();
- void sendMsg();
-
static S32 sLastSpecialChatChannel;
FSNearbyChatControl* mDefaultChatBar;
diff --git a/indra/newview/fspanelprefs.cpp b/indra/newview/fspanelprefs.cpp
index 0f2bf603bd..001add788a 100644
--- a/indra/newview/fspanelprefs.cpp
+++ b/indra/newview/fspanelprefs.cpp
@@ -70,7 +70,7 @@ BOOL FSPanelPrefs::postBuild()
LLTextureCtrl* tex_ctrl = getChild("texture control");
tex_ctrl->setCommitCallback(boost::bind(&FSPanelPrefs::onCommitTexture, this, _2));
- tex_ctrl->setDefaultImageAssetID(LLUUID(gSavedSettings.getString("DefaultObjectTexture")));
+ tex_ctrl->setDefaultImageAssetID(DEFAULT_OBJECT_TEXTURE);
mInvDropTarget = getChild("embed_item");
mInvDropTarget->setDADCallback(boost::bind(&FSPanelPrefs::onDADEmbeddedItem, this, _1));
diff --git a/indra/newview/llappcorehttp.cpp b/indra/newview/llappcorehttp.cpp
index f586a64575..f25906552c 100644
--- a/indra/newview/llappcorehttp.cpp
+++ b/indra/newview/llappcorehttp.cpp
@@ -179,6 +179,7 @@ void LLAppCoreHttp::init()
}
else
{
+ LLError::LLUserWarningMsg::showMissingFiles();
LL_ERRS("Init") << "Missing CA File; should be at " << ca_file << LL_ENDL;
}
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 6ec6c183f1..64b30dad15 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -392,7 +392,6 @@ BOOL gRandomizeFramerate = FALSE;
BOOL gPeriodicSlowFrame = FALSE;
BOOL gCrashOnStartup = FALSE;
-BOOL gLLErrorActivated = FALSE;
BOOL gLogoutInProgress = FALSE;
BOOL gSimulateMemLeak = FALSE;
@@ -2653,9 +2652,6 @@ void errorCallback(LLError::ELevel level, const std::string &error_string)
OSMessageBox(error_display_string, caption, OSMB_OK);
#endif // !LL_RELEASE_FOR_DOWNLOAD
- //Set the ErrorActivated global so we know to create a marker file
- gLLErrorActivated = true;
-
gDebugInfo["FatalMessage"] = error_string;
// We're not already crashing -- we simply *intend* to crash. Since we
// haven't actually trashed anything yet, we can afford to write the whole
@@ -2664,6 +2660,14 @@ void errorCallback(LLError::ELevel level, const std::string &error_string)
}
}
+void errorMSG(const std::string& title_string, const std::string& message_string)
+{
+ if (!message_string.empty())
+ {
+ OSMessageBox(message_string, title_string.empty() ? LLTrans::getString("MBFatalError") : title_string, OSMB_OK);
+ }
+}
+
void LLAppViewer::initLoggingAndGetLastDuration()
{
//
@@ -2675,6 +2679,8 @@ void LLAppViewer::initLoggingAndGetLastDuration()
LLError::addGenericRecorder(&errorCallback);
//LLError::setTimeFunction(getRuntime);
+ LLError::LLUserWarningMsg::setHandler(errorMSG);
+
if (mSecondInstance)
{
@@ -2823,6 +2829,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
{ // failed to load
if(file.required)
{
+ LLError::LLUserWarningMsg::showMissingFiles();
LL_ERRS() << "Error: Cannot load required settings file from: " << full_settings_path << LL_ENDL;
return false;
}
@@ -2921,6 +2928,7 @@ bool LLAppViewer::initConfiguration()
if (!success)
{
LL_WARNS() << "Cannot load default configuration file " << settings_file_list << LL_ENDL;
+ LLError::LLUserWarningMsg::showMissingFiles();
if (gDirUtilp->fileExists(settings_file_list))
{
LL_ERRS() << "Cannot load default configuration file settings_files.xml. "
@@ -2944,6 +2952,7 @@ bool LLAppViewer::initConfiguration()
if (!mSettingsLocationList->validateBlock())
{
+ LLError::LLUserWarningMsg::showMissingFiles();
LL_ERRS() << "Invalid settings file list " << settings_file_list << LL_ENDL;
}
@@ -3500,6 +3509,8 @@ bool LLAppViewer::initConfiguration()
LLEventPumps::instance().obtain("LLControlGroup").post(LLSDMap("init", key));
}
+ LLError::LLUserWarningMsg::setOutOfMemoryStrings(LLTrans::getString("MBOutOfMemoryTitle"), LLTrans::getString("MBOutOfMemoryErr"));
+
// [RLVa:KB] - Patch: RLVa-2.1.0
if (LLControlVariable* pControl = gSavedSettings.getControl(RlvSettingNames::Main))
{
@@ -3552,6 +3563,7 @@ void LLAppViewer::initStrings()
// initial check to make sure files are there failed
gDirUtilp->dumpCurrentDirectories(LLError::LEVEL_WARN);
+ LLError::LLUserWarningMsg::showMissingFiles();
LL_ERRS() << "Viewer failed to find localization and UI files."
<< " Please reinstall viewer from https://www.firestormviewer.org/downloads"
<< " and contact https://www.firestormviewer.org/support if issue persists after reinstall." << LL_ENDL;
@@ -3984,7 +3996,6 @@ LLSD LLAppViewer::getViewerInfo() const
//info["NET_BANDWITH"] = gSavedSettings.getF32("ThrottleBandwidthKBPS");
//info["LOD_FACTOR"] = gSavedSettings.getF32("RenderVolumeLODFactor");
//info["RENDER_QUALITY"] = (F32)gSavedSettings.getU32("RenderQualityPerformance");
- //info["GPU_SHADERS"] = gSavedSettings.getBOOL("RenderDeferred") ? "Enabled" : "Disabled";
//info["TEXTURE_MEMORY"] = gGLManager.mVRAM;
//
@@ -5134,6 +5145,7 @@ void LLAppViewer::loadKeyBindings()
key_bindings_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "key_bindings.xml");
if (!gViewerInput.loadBindingsXML(key_bindings_file))
{
+ LLError::LLUserWarningMsg::showMissingFiles();
LL_ERRS("InitInfo") << "Unable to open default key bindings from " << key_bindings_file << LL_ENDL;
}
}
@@ -6300,6 +6312,14 @@ void LLAppViewer::forceErrorLLError()
LL_ERRS() << "This is a deliberate llerror" << LL_ENDL;
}
+void LLAppViewer::forceErrorLLErrorMsg()
+{
+ LLError::LLUserWarningMsg::show("Deliberate error");
+ // Note: under debug this will show a message as well,
+ // but release won't show anything and will quit silently
+ LL_ERRS() << "This is a deliberate llerror with a message" << LL_ENDL;
+}
+
void LLAppViewer::forceErrorBreakpoint()
{
LL_WARNS() << "Forcing a deliberate breakpoint" << LL_ENDL;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index f166a5830a..95a443131d 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -149,6 +149,7 @@ public:
// LLAppViewer testing helpers.
// *NOTE: These will potentially crash the viewer. Only for debugging.
virtual void forceErrorLLError();
+ virtual void forceErrorLLErrorMsg();
virtual void forceErrorBreakpoint();
virtual void forceErrorBadMemoryAccess();
virtual void forceErrorInfiniteLoop();
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 3538de13b9..10cde35f9c 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -216,10 +216,6 @@ public:
void sendAvatarGroupsRequest(const LLUUID& avatar_id);
void sendAvatarTexturesRequest(const LLUUID& avatar_id);
void sendAvatarClassifiedsRequest(const LLUUID& avatar_id);
- // enable legacy profile access for OpenSim to work with new profile
- void sendGenericRequestLegacy(const LLUUID& avatar_id, EAvatarProcessorType type, const std::string method);
- void sendAvatarPropertiesRequestLegacy(const LLUUID& avatar_id);
- //
// Duplicate pick info requests are not suppressed.
void sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id);
diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp
index a6c9a41fa4..b95b971890 100644
--- a/indra/newview/llavatarrenderinfoaccountant.cpp
+++ b/indra/newview/llavatarrenderinfoaccountant.cpp
@@ -339,6 +339,7 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio
}
catch (std::bad_alloc&)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "LLCoros::launch() allocation failure" << LL_ENDL;
}
}
@@ -370,6 +371,7 @@ void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regi
}
catch (std::bad_alloc&)
{
+ LLError::LLUserWarningMsg::showOutOfMemory();
LL_ERRS() << "LLCoros::launch() allocation failure" << LL_ENDL;
}
}
diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h
index 710491f36a..44dbf76697 100644
--- a/indra/newview/llchicletbar.h
+++ b/indra/newview/llchicletbar.h
@@ -49,11 +49,11 @@ public:
~LLChicletBar();
// LLIMSessionObserver observe triggers
- /*virtual*/ void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg);
- /*virtual*/ void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) {}
- /*virtual*/ void sessionVoiceOrIMStarted(const LLUUID& session_id) {};
- /*virtual*/ void sessionRemoved(const LLUUID& session_id);
- /*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+ /*virtual*/ void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg) override;
+ /*virtual*/ void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) override {}
+ /*virtual*/ void sessionVoiceOrIMStarted(const LLUUID& session_id) override {};
+ /*virtual*/ void sessionRemoved(const LLUUID& session_id) override;
+ /*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) override;
S32 getTotalUnreadIMCount();
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index 6c92e60cf3..ce1f46464b 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -822,7 +822,7 @@ const F64Seconds LLEnvironment::TRANSITION_SLOW(10.0f);
const F64Seconds LLEnvironment::TRANSITION_ALTITUDE(5.0f);
const LLUUID LLEnvironment::KNOWN_SKY_SUNRISE("01e41537-ff51-2f1f-8ef7-17e4df760bfb");
-const LLUUID LLEnvironment::KNOWN_SKY_MIDDAY("651510b8-5f4d-8991-1592-e7eeab2a5a06");
+const LLUUID LLEnvironment::KNOWN_SKY_MIDDAY("c46226b4-0e43-5a56-9708-d27ca1df3292");
const LLUUID LLEnvironment::KNOWN_SKY_LEGACY_MIDDAY("cef49723-0292-af49-9b14-9598a616b8a3");
const LLUUID LLEnvironment::KNOWN_SKY_SUNSET("084e26cd-a900-28e8-08d0-64a9de5c15e2");
const LLUUID LLEnvironment::KNOWN_SKY_MIDNIGHT("8a01b97a-cb20-c1ea-ac63-f7ea84ad0090");
@@ -976,6 +976,14 @@ void LLEnvironment::initSingleton()
gGenericDispatcher.addHandler(MESSAGE_PUSHENVIRONMENT, &environment_push_dispatch_handler);
}
+ gSavedSettings.getControl("RenderSkyAutoAdjustProbeAmbiance")->getSignal()->connect(
+ [](LLControlVariable*, const LLSD& new_val, const LLSD& old_val)
+ {
+ LLSettingsSky::sAutoAdjustProbeAmbiance = new_val.asReal();
+ }
+ );
+ LLSettingsSky::sAutoAdjustProbeAmbiance = gSavedSettings.getF32("RenderSkyAutoAdjustProbeAmbiance");
+
LLEventPumps::instance().obtain(PUMP_EXPERIENCE).stopListening(LISTENER_NAME);
LLEventPumps::instance().obtain(PUMP_EXPERIENCE).listen(LISTENER_NAME, [this](LLSD message) { listenExperiencePump(message); return false; });
}
diff --git a/indra/newview/llfloaterchangeitemthumbnail.cpp b/indra/newview/llfloaterchangeitemthumbnail.cpp
index 42be15ae37..7bdeff4b4d 100644
--- a/indra/newview/llfloaterchangeitemthumbnail.cpp
+++ b/indra/newview/llfloaterchangeitemthumbnail.cpp
@@ -752,7 +752,8 @@ void LLFloaterChangeItemThumbnail::showTexturePicker(const LLUUID &thumbnail_id)
PERM_NONE,
PERM_NONE,
FALSE,
- NULL);
+ NULL,
+ PICK_TEXTURE);
mPickerHandle = floaterp->getHandle();
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index bb47feaa95..4e764674e5 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -1724,7 +1724,9 @@ void LLFloaterEditExtDayCycle::showHDRNotification(const LLSettingsDay::ptr_t &p
while (iter != end)
{
LLSettingsSky::ptr_t sky = std::static_pointer_cast(iter->second);
- if (sky && sky->canAutoAdjust())
+ if (sky
+ && sky->canAutoAdjust()
+ && sky->getReflectionProbeAmbiance(true) != 0.f)
{
LLNotificationsUtil::add("AutoAdjustHDRSky");
return;
diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp
index 6b49756df3..3b06b0f4f2 100644
--- a/indra/newview/llfloateremojipicker.cpp
+++ b/indra/newview/llfloateremojipicker.cpp
@@ -41,6 +41,7 @@
#include "llsdserialize.h"
#include "lltextbox.h"
#include "llviewerchat.h"
+#include "llviewercontrol.h" // Add B&W emoji font support
LLFloaterEmojiPicker::recent_emojis_updated_callback_t LLFloaterEmojiPicker::sRecentEmojisUpdatedCallback{}; // Live-update recently used emojis
@@ -136,11 +137,15 @@ public:
virtual void draw() override
{
+ static LLCachedControl useBWEmojis(gSavedSettings, "FSUseBWEmojis", false); // Add B&W emoji font support
LLScrollingPanel::draw();
F32 x = getRect().getWidth() / 2;
F32 y = getRect().getHeight() / 2;
- LLFontGL::getFontEmoji()->render(
+ // Add B&W emoji font support
+ // LLFontGL::getFontEmoji()->render(
+ LLFontGL::getFontEmoji(useBWEmojis)->render(
+ //
mText, // wstr
0, // begin_offset
x, // x
@@ -213,7 +218,11 @@ public:
protected:
void drawIcon(F32 x, F32 y, S32 max_pixels)
{
- LLFontGL::getFontEmojiHuge()->render(
+ // Add B&W emoji font support
+ // LLFontGL::getFontEmojiHuge()->render(
+ static LLCachedControl useBWEmojis(gSavedSettings, "FSUseBWEmojis", false);
+ LLFontGL::getFontEmojiHuge( useBWEmojis )->render(
+ //
mWStr, // wstr
0, // begin_offset
x, // x
@@ -229,9 +238,11 @@ protected:
void drawName(F32 x, F32 y, S32 max_pixels, LLColor4& color)
{
+ static LLCachedControl useBWEmojis(gSavedSettings, "FSUseBWEmojis", false); // Add B&W emoji font support
+
F32 x0 = x;
F32 x1 = max_pixels;
- LLFontGL* font = LLFontGL::getFontEmoji();
+ LLFontGL* font = LLFontGL::getFontEmoji( useBWEmojis ); // Add B&W emoji font support
if (mBegin)
{
std::string text = mTitle.substr(0, mBegin);
@@ -415,6 +426,7 @@ void LLFloaterEmojiPicker::initialize()
void LLFloaterEmojiPicker::fillGroups()
{
+ static LLCachedControl useBWEmojis(gSavedSettings, "FSUseBWEmojis", false); // Add B&W emoji font support
// Do not use deleteAllChildren() because mBadge shouldn't be removed
for (LLButton* button : mGroupButtons)
{
@@ -425,7 +437,7 @@ void LLFloaterEmojiPicker::fillGroups()
mGroupButtons.clear();
LLButton::Params params;
- params.font = LLFontGL::getFontEmoji();
+ params.font = LLFontGL::getFontEmoji( useBWEmojis ); // Add B&W emoji font support
LLRect rect;
rect.mTop = mGroups->getRect().getHeight();
diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp
index c64ee5a69c..c98afefa65 100644
--- a/indra/newview/llfloaterenvironmentadjust.cpp
+++ b/indra/newview/llfloaterenvironmentadjust.cpp
@@ -116,7 +116,7 @@ BOOL LLFloaterEnvironmentAdjust::postBuild()
getChild(FIELD_SKY_CLOUD_MAP)->setAllowNoTexture(TRUE);
getChild(FIELD_WATER_NORMAL_MAP)->setDefaultImageAssetID(LLSettingsWater::GetDefaultWaterNormalAssetId());
- getChild(FIELD_WATER_NORMAL_MAP)->setBlankImageAssetID(LLUUID(gSavedSettings.getString("DefaultBlankNormalTexture")));
+ getChild(FIELD_WATER_NORMAL_MAP)->setBlankImageAssetID(BLANK_OBJECT_NORMAL);
getChild(FIELD_WATER_NORMAL_MAP)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onWaterMapChanged(); });
getChild(FIELD_REFLECTION_PROBE_AMBIANCE)->setCommitCallback([this](LLUICtrl*, const LLSD&) { onReflectionProbeAmbianceChanged(); });
diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp
index 8e28fd6234..3e8bad3ef5 100644
--- a/indra/newview/llfloaterfixedenvironment.cpp
+++ b/indra/newview/llfloaterfixedenvironment.cpp
@@ -186,7 +186,8 @@ void LLFloaterFixedEnvironment::setEditSettingsAndUpdate(const LLSettingsBase::p
// teach user about HDR settings
if (mSettings
&& mSettings->getSettingsType() == "sky"
- && ((LLSettingsSky*)mSettings.get())->canAutoAdjust())
+ && ((LLSettingsSky*)mSettings.get())->canAutoAdjust()
+ && ((LLSettingsSky*)mSettings.get())->getReflectionProbeAmbiance(true) != 0.f)
{
LLNotificationsUtil::add("AutoAdjustHDRSky");
}
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp
index 8919229c78..92c58a2dbc 100644
--- a/indra/newview/llgltfmateriallist.cpp
+++ b/indra/newview/llgltfmateriallist.cpp
@@ -139,69 +139,18 @@ static bool is_valid_update(const LLSD& data)
}
#endif
-class LLGLTFMaterialOverrideDispatchHandler : public LLDispatchHandler
+class LLGLTFMaterialOverrideDispatchHandler
{
LOG_CLASS(LLGLTFMaterialOverrideDispatchHandler);
public:
LLGLTFMaterialOverrideDispatchHandler() = default;
- ~LLGLTFMaterialOverrideDispatchHandler() override = default;
+ ~LLGLTFMaterialOverrideDispatchHandler() = default;
void addCallback(void(*callback)(const LLUUID& object_id, S32 side))
{
mSelectionCallbacks.push_back(callback);
}
- bool operator()(const LLDispatcher* dispatcher, const std::string& key, const LLUUID& invoice, const sparam_t& strings) override
- {
- LL_PROFILE_ZONE_SCOPED;
- // receive override data from simulator via LargeGenericMessage
- // message should have:
- // object_id - UUID of LLViewerObject
- // sides - array of S32 indices of texture entries
- // gltf_json - array of corresponding Strings of GLTF json for override data
-
- LLSD message;
- bool success = true;
-#if 0 //deprecated
- for(const std::string& llsdRaw : strings)
- {
- std::istringstream llsdData(llsdRaw);
- if (!LLSDSerialize::deserialize(message, llsdData, llsdRaw.length()))
- {
- LL_WARNS() << "LLGLTFMaterialOverrideDispatchHandler: Attempted to read parameter data into LLSD but failed:" << llsdRaw << LL_ENDL;
- success = false;
- continue;
- }
-
- LLGLTFOverrideCacheEntry object_override;
- if (!object_override.fromLLSD(message))
- {
- // malformed message, nothing we can do to handle it
- LL_DEBUGS("GLTF") << "Message without id:" << message << LL_ENDL;
- success = false;
- continue;
- }
-
- // Cache the data
- {
- LLViewerRegion * region = LLWorld::instance().getRegionFromHandle(object_override.mRegionHandle);
-
- if (region)
- {
- region->cacheFullUpdateGLTFOverride(object_override);
- }
- else
- {
- LL_WARNS("GLTF") << "could not access region for material overrides message cache, region_handle: " << LL_ENDL;
- }
- }
- applyData(object_override);
- }
-
-#endif
- return success;
- }
-
void doSelectionCallbacks(const LLUUID& object_id, S32 side)
{
for (auto& callback : mSelectionCallbacks)
@@ -210,112 +159,6 @@ public:
}
}
- void applyData(const LLGLTFOverrideCacheEntry &object_override)
- {
- // Parse the data
-
-#if 0 // DEPRECATED
- LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop");
- LL::WorkQueue::ptr_t general_queue = LL::WorkQueue::getInstance("General");
-
- struct ReturnData
- {
- public:
- LLGLTFMaterial mMaterial;
- S32 mSide;
- bool mSuccess;
- };
-
- if (!object_override.mSides.empty())
- {
- // fromJson() is performance heavy offload to a thread.
- main_queue->postTo(
- general_queue,
- [sides=object_override.mSides]() // Work done on general queue
- {
- std::vector results;
-
- results.reserve(sides.size());
- // parse json
- std::unordered_map::const_iterator iter = sides.begin();
- std::unordered_map::const_iterator end = sides.end();
- while (iter != end)
- {
- ReturnData result;
-
- result.mMaterial.applyOverrideLLSD(iter->second);
-
- result.mSuccess = true;
- result.mSide = iter->first;
-
- results.push_back(result);
- iter++;
- }
- return results;
- },
- [object_id=object_override.mObjectId, this](std::vector results) // Callback to main thread
- {
- LLViewerObject * obj = gObjectList.findObject(object_id);
-
- if (results.size() > 0 )
- {
- std::unordered_set side_set;
-
- for (auto const & result : results)
- {
- S32 side = result.mSide;
- if (result.mSuccess)
- {
- // copy to heap here because LLTextureEntry is going to take ownership with an LLPointer
- LLGLTFMaterial * material = new LLGLTFMaterial(result.mMaterial);
-
- // flag this side to not be nulled out later
- side_set.insert(side);
-
- if (obj)
- {
- obj->setTEGLTFMaterialOverride(side, material);
- }
- }
-
- // unblock material editor
- if (obj && obj->getTE(side) && obj->getTE(side)->isSelected())
- {
- doSelectionCallbacks(object_id, side);
- }
- }
-
- if (obj && side_set.size() != obj->getNumTEs())
- { // object exists and at least one texture entry needs to have its override data nulled out
- for (int i = 0; i < obj->getNumTEs(); ++i)
- {
- if (side_set.find(i) == side_set.end())
- {
- obj->setTEGLTFMaterialOverride(i, nullptr);
- if (obj->getTE(i) && obj->getTE(i)->isSelected())
- {
- doSelectionCallbacks(object_id, i);
- }
- }
- }
- }
- }
- else if (obj)
- { // override list was empty or an error occurred, null out all overrides for this object
- for (int i = 0; i < obj->getNumTEs(); ++i)
- {
- obj->setTEGLTFMaterialOverride(i, nullptr);
- if (obj->getTE(i) && obj->getTE(i)->isSelected())
- {
- doSelectionCallbacks(obj->getID(), i);
- }
- }
- }
- });
- }
-#endif
- }
-
private:
std::vector mSelectionCallbacks;
@@ -821,12 +664,6 @@ void LLGLTFMaterialList::flushMaterials()
}
}
-// static
-void LLGLTFMaterialList::registerCallbacks()
-{
- gGenericDispatcher.addHandler("GLTFMaterialOverride", &handle_gltf_override_message);
-}
-
// static
void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides, void(*done_callback)(bool) )
{
@@ -864,7 +701,3 @@ void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides,
}
}
-void LLGLTFMaterialList::loadCacheOverrides(const LLGLTFOverrideCacheEntry& override)
-{
- handle_gltf_override_message.applyData(override);
-}
diff --git a/indra/newview/llgltfmateriallist.h b/indra/newview/llgltfmateriallist.h
index 7317214019..f1c4ce20f9 100644
--- a/indra/newview/llgltfmateriallist.h
+++ b/indra/newview/llgltfmateriallist.h
@@ -52,8 +52,6 @@ public:
void flushMaterials();
- static void registerCallbacks();
-
// Queue an modification of a material that we want to send to the simulator. Call "flushUpdates" to flush pending updates.
// id - ID of object to modify
// side - TexureEntry index to modify, or -1 for all sides
@@ -99,8 +97,6 @@ public:
// any override data that arrived before the object was ready to receive it
void applyQueuedOverrides(LLViewerObject* obj);
- static void loadCacheOverrides(const LLGLTFOverrideCacheEntry& override);
-
// Apply an override update with the given data
void applyOverrideMessage(LLMessageSystem* msg, const std::string& data);
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index bf3901a62b..8ca337d4bf 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -2726,6 +2726,12 @@ bool LLIsOfAssetType::operator()(LLInventoryCategory* cat, LLInventoryItem* item
return FALSE;
}
+bool LLAssetIDAndTypeMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ if (!item) return false;
+ return (item->getActualType() == mType && item->getAssetUUID() == mAssetID);
+}
+
bool LLIsValidItemLink::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
LLViewerInventoryItem *vitem = dynamic_cast(item);
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index e9bacaf5b0..6d77c8a48d 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -286,6 +286,28 @@ protected:
LLAssetType::EType mType;
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLAssetIDAndTypeMatches
+//
+// Implementation of a LLInventoryCollectFunctor which returns TRUE if
+// the item matches both asset type and asset id.
+// This is needed in case you are looking for a specific type with default id
+// (since null is default for multiple asset types)
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLAssetIDAndTypeMatches: public LLInventoryCollectFunctor
+{
+public:
+ LLAssetIDAndTypeMatches(const LLUUID& asset_id, LLAssetType::EType type): mAssetID(asset_id), mType(type) {}
+ virtual ~LLAssetIDAndTypeMatches() {}
+ bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+
+protected:
+ LLUUID mAssetID;
+ LLAssetType::EType mType;
+};
+
class LLIsValidItemLink : public LLInventoryCollectFunctor
{
public:
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 9f696f2787..97902aa64f 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -43,6 +43,7 @@
#include "llnotificationsutil.h"
#include "lltexturectrl.h"
#include "lltrans.h"
+#include "llviewercontrol.h"
#include "llviewermenufile.h"
#include "llviewertexture.h"
#include "llsdutil.h"
@@ -451,6 +452,8 @@ BOOL LLMaterialEditor::postBuild()
mEmissiveTextureCtrl->setCommitCallback(boost::bind(&LLMaterialEditor::onCommitTexture, this, _1, _2, MATERIAL_EMISIVE_TEX_DIRTY));
mNormalTextureCtrl->setCommitCallback(boost::bind(&LLMaterialEditor::onCommitTexture, this, _1, _2, MATERIAL_NORMAL_TEX_DIRTY));
+ mNormalTextureCtrl->setBlankImageAssetID(BLANK_OBJECT_NORMAL);
+
if (mIsOverride)
{
// Live editing needs a recovery mechanism on cancel
@@ -1379,10 +1382,23 @@ bool LLMaterialEditor::saveIfNeeded()
LLPermissions local_permissions;
local_permissions.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
- U32 everyone_perm = LLFloaterPerms::getEveryonePerms("Materials");
- U32 group_perm = LLFloaterPerms::getGroupPerms("Materials");
- U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Materials");
- local_permissions.initMasks(PERM_ALL, PERM_ALL, everyone_perm, group_perm, next_owner_perm);
+ if (mIsOverride)
+ {
+ // Shouldn't happen, but just in case it ever changes
+ U32 everyone_perm = LLFloaterPerms::getEveryonePerms("Materials");
+ U32 group_perm = LLFloaterPerms::getGroupPerms("Materials");
+ U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Materials");
+ local_permissions.initMasks(PERM_ALL, PERM_ALL, everyone_perm, group_perm, next_owner_perm);
+
+ }
+ else
+ {
+ // Uploads are supposed to use Upload permissions, not material permissions
+ U32 everyone_perm = LLFloaterPerms::getEveryonePerms("Uploads");
+ U32 group_perm = LLFloaterPerms::getGroupPerms("Uploads");
+ U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Uploads");
+ local_permissions.initMasks(PERM_ALL, PERM_ALL, everyone_perm, group_perm, next_owner_perm);
+ }
std::string res_desc = buildMaterialDescription();
createInventoryItem(buffer, mMaterialName, res_desc, local_permissions);
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 2c38f10a17..6494d445fe 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1430,7 +1430,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry)
U8* buffer = new(std::nothrow) U8[size];
if (!buffer)
{
- LL_WARNS_ONCE(LOG_MESH) << "Failed to allocate memory for skin info, size: " << size << LL_ENDL;
+ LL_WARNS(LOG_MESH) << "Failed to allocate memory for skin info, size: " << size << LL_ENDL;
return false;
}
LLMeshRepository::sCacheBytesRead += size;
@@ -1550,7 +1550,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
U8* buffer = new(std::nothrow) U8[size];
if (!buffer)
{
- LL_WARNS_ONCE(LOG_MESH) << "Failed to allocate memory for mesh decomposition, size: " << size << LL_ENDL;
+ LL_WARNS(LOG_MESH) << "Failed to allocate memory for mesh decomposition, size: " << size << LL_ENDL;
return false;
}
LLMeshRepository::sCacheBytesRead += size;
@@ -1659,7 +1659,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
U8* buffer = new(std::nothrow) U8[size];
if (!buffer)
{
- LL_WARNS_ONCE(LOG_MESH) << "Failed to allocate memory for physics shape, size: " << size << LL_ENDL;
+ LL_WARNS(LOG_MESH) << "Failed to allocate memory for physics shape, size: " << size << LL_ENDL;
return false;
}
file.read(buffer, size);
@@ -1868,7 +1868,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,
U8* buffer = new(std::nothrow) U8[size];
if (!buffer)
{
- LL_WARNS_ONCE(LOG_MESH) << "Can't allocate memory for mesh " << mesh_id << " LOD " << lod << ", size: " << size << LL_ENDL;
+ LL_WARNS(LOG_MESH) << "Can't allocate memory for mesh " << mesh_id << " LOD " << lod << ", size: " << size << LL_ENDL;
// todo: for now it will result in indefinite constant retries, should result in timeout
// or in retry-count and disabling mesh. (but usually viewer is beyond saving at this point)
return false;
diff --git a/indra/newview/llpaneleditwater.cpp b/indra/newview/llpaneleditwater.cpp
index a09964e17d..cf536dd87e 100644
--- a/indra/newview/llpaneleditwater.cpp
+++ b/indra/newview/llpaneleditwater.cpp
@@ -89,7 +89,7 @@ BOOL LLPanelSettingsWaterMainTab::postBuild()
getChild(FIELD_WATER_UNDERWATER_MOD)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onFogUnderWaterChanged(); });
mTxtNormalMap->setDefaultImageAssetID(LLSettingsWater::GetDefaultWaterNormalAssetId());
- mTxtNormalMap->setBlankImageAssetID(LLUUID( gSavedSettings.getString( "DefaultBlankNormalTexture" )));
+ mTxtNormalMap->setBlankImageAssetID(BLANK_OBJECT_NORMAL);
mTxtNormalMap->setCommitCallback([this](LLUICtrl *, const LLSD &) { onNormalMapChanged(); });
getChild(FIELD_WATER_WAVE2_XY)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onSmallWaveChanged(); });
diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp
index e6e3a10e13..fe8ee69597 100644
--- a/indra/newview/llpanelemojicomplete.cpp
+++ b/indra/newview/llpanelemojicomplete.cpp
@@ -31,6 +31,7 @@
#include "llpanelemojicomplete.h"
#include "llscrollbar.h"
#include "lluictrlfactory.h"
+#include "llviewercontrol.h" // Add B&W emoji font support
constexpr U32 MIN_MOUSE_MOVE_DELTA = 4;
constexpr U32 MIN_SHORT_CODE_WIDTH = 100;
@@ -60,10 +61,14 @@ LLPanelEmojiComplete::LLPanelEmojiComplete(const LLPanelEmojiComplete::Params& p
, mMaxVisible(p.max_visible)
, mPadding(p.padding)
, mSelectedImage(p.selected_image)
- , mIconFont(LLFontGL::getFontEmojiHuge())
+ // , mIconFont(LLFontGL::getFontEmojiHuge()) // Add B&W emoji font support
, mTextFont(LLFontGL::getFontSansSerifBig())
, mScrollbar(nullptr)
{
+ // Add B&W emoji font support
+ static LLCachedControl useBWEmojis(gSavedSettings, "FSUseBWEmojis");
+ mIconFont = LLFontGL::getFontEmojiHuge( useBWEmojis );
+ //
if (mVertical)
{
LLScrollbar::Params sbparams;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 91595ac8c6..6143151fe8 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -229,6 +229,17 @@ LLRender::eTexIndex LLPanelFace::getTextureDropChannel()
return LLRender::eTexIndex(MATTYPE_DIFFUSE);
}
+LLGLTFMaterial::TextureInfo LLPanelFace::getPBRDropChannel()
+{
+ if (mComboMatMedia && mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
+ {
+ LLRadioGroup* radio_pbr_type = getChild("radio_pbr_type");
+ return texture_info_from_pbrtype(radio_pbr_type->getSelectedIndex());
+ }
+
+ return texture_info_from_pbrtype(PBRTYPE_BASE_COLOR);
+}
+
// Things the UI provides...
//
LLUUID LLPanelFace::getCurrentNormalMap() { return mBumpyTextureCtrl->getImageAssetID(); }
@@ -428,13 +439,13 @@ BOOL LLPanelFace::postBuild()
pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
pbr_ctrl->setBakeTextureEnabled(false);
- pbr_ctrl->setInventoryPickType(LLTextureCtrl::PICK_MATERIAL);
+ pbr_ctrl->setInventoryPickType(PICK_MATERIAL);
}
mTextureCtrl = getChild("texture control");
if(mTextureCtrl)
{
- mTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectTexture" )));
+ mTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_TEXTURE);
mTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitTexture, this, _2) );
mTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelTexture, this, _2) );
mTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectTexture, this, _2) );
@@ -451,7 +462,7 @@ BOOL LLPanelFace::postBuild()
mShinyTextureCtrl = getChild("shinytexture control");
if(mShinyTextureCtrl)
{
- mShinyTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectSpecularTexture" )));
+ mShinyTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_SPECULAR);
mShinyTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitSpecularTexture, this, _2) );
mShinyTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelSpecularTexture, this, _2) );
mShinyTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectSpecularTexture, this, _2) );
@@ -468,8 +479,8 @@ BOOL LLPanelFace::postBuild()
mBumpyTextureCtrl = getChild("bumpytexture control");
if(mBumpyTextureCtrl)
{
- mBumpyTextureCtrl->setDefaultImageAssetID(LLUUID( gSavedSettings.getString( "DefaultObjectNormalTexture" )));
- mBumpyTextureCtrl->setBlankImageAssetID(LLUUID( gSavedSettings.getString( "DefaultBlankNormalTexture" )));
+ mBumpyTextureCtrl->setDefaultImageAssetID(DEFAULT_OBJECT_NORMAL);
+ mBumpyTextureCtrl->setBlankImageAssetID(BLANK_OBJECT_NORMAL);
mBumpyTextureCtrl->setCommitCallback( boost::bind(&LLPanelFace::onCommitNormalTexture, this, _2) );
mBumpyTextureCtrl->setOnCancelCallback( boost::bind(&LLPanelFace::onCancelNormalTexture, this, _2) );
mBumpyTextureCtrl->setOnSelectCallback( boost::bind(&LLPanelFace::onSelectNormalTexture, this, _2) );
@@ -4597,7 +4608,7 @@ void LLPanelFace::onCopyTexture()
LLUUID id = mat_data["NormMap"].asUUID();
if (id.notNull() && !get_can_copy_texture(id))
{
- mat_data["NormMap"] = LLUUID(gSavedSettings.getString("DefaultObjectTexture"));
+ mat_data["NormMap"] = DEFAULT_OBJECT_TEXTURE;
mat_data["NormMapNoCopy"] = true;
}
@@ -4607,7 +4618,7 @@ void LLPanelFace::onCopyTexture()
LLUUID id = mat_data["SpecMap"].asUUID();
if (id.notNull() && !get_can_copy_texture(id))
{
- mat_data["SpecMap"] = LLUUID(gSavedSettings.getString("DefaultObjectTexture"));
+ mat_data["SpecMap"] = DEFAULT_OBJECT_TEXTURE;
mat_data["SpecMapNoCopy"] = true;
}
@@ -4837,7 +4848,8 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)
LLToolDragAndDrop::dropTextureAllFaces(objectp,
itemp_res,
from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT,
- LLUUID::null);
+ LLUUID::null,
+ false);
}
else // one face
{
@@ -4846,6 +4858,7 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)
itemp_res,
from_library ? LLToolDragAndDrop::SOURCE_LIBRARY : LLToolDragAndDrop::SOURCE_AGENT,
LLUUID::null,
+ false,
0);
}
}
@@ -5385,8 +5398,9 @@ void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp)
bool can_modify = itemp->getPermissions().allowOperationBy(PERM_MODIFY, gAgentID); // do we have perm to transfer this material?
bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply material belong to the agent?
bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply material not for sale?
+ bool from_library = ALEXANDRIA_LINDEN_ID == itemp->getPermissions().getOwner();
- if (can_copy && can_transfer && can_modify)
+ if ((can_copy && can_transfer && can_modify) || from_library)
{
pbr_ctrl->setCanApply(true, true);
return;
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 8345122f41..66d335bdc0 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -128,6 +128,7 @@ public:
LLRender::eTexIndex getTextureChannelToEdit();
LLRender::eTexIndex getTextureDropChannel();
+ LLGLTFMaterial::TextureInfo getPBRDropChannel();
protected:
void navigateToTitleMedia(const std::string url);
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index d6aa884027..bc66e387b0 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -2515,7 +2515,8 @@ void LLPanelProfileSecondLife::onShowTexturePicker()
PERM_NONE,
PERM_NONE,
FALSE,
- NULL);
+ NULL,
+ PICK_TEXTURE);
mFloaterTexturePickerHandle = texture_floaterp->getHandle();
@@ -2917,7 +2918,8 @@ void LLPanelProfileFirstLife::onChangePhoto()
PERM_NONE,
PERM_NONE,
FALSE,
- NULL);
+ NULL,
+ PICK_TEXTURE);
mFloaterTexturePickerHandle = texture_floaterp->getHandle();
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 6e2ff170ca..a4bdf6950a 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -1966,7 +1966,8 @@ bool LLSelectMgr::selectionSetImage(const LLUUID& imageid)
te,
mItem,
LLToolDragAndDrop::SOURCE_AGENT,
- LLUUID::null);
+ LLUUID::null,
+ false);
}
else // not an inventory item
{
@@ -2046,26 +2047,30 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
{
return false;
}
- if (mItem && objectp->isAttachment())
- {
- const LLPermissions& perm = mItem->getPermissions();
- BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
- if (!unrestricted)
- {
- // Attachments are in world and in inventory simultaneously,
- // at the moment server doesn't support such a situation.
- return false;
- }
- }
LLUUID asset_id = mMatId;
if (mItem)
{
- // If success, the material may be copied into the object's inventory
- BOOL success = LLToolDragAndDrop::handleDropMaterialProtections(objectp, mItem, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null);
- if (!success)
+ const LLPermissions& perm = mItem->getPermissions();
+ bool from_library = perm.getOwner() == ALEXANDRIA_LINDEN_ID;
+ if (objectp->isAttachment())
+ {
+ bool unrestricted = (perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED;
+
+ if (!unrestricted && !from_library)
+ {
+ // Attachments are in world and in inventory simultaneously,
+ // at the moment server doesn't support such a situation.
+ return false;
+ }
+ }
+
+ if (!from_library
+ // Check if item may be copied into the object's inventory
+ && !LLToolDragAndDrop::handleDropMaterialProtections(objectp, mItem, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null))
{
return false;
}
+
asset_id = mItem->getAssetUUID();
if (asset_id.isNull())
{
@@ -2081,11 +2086,13 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
};
bool success = true;
- if (item &&
- (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) ||
+ if (item
+ && (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) ||
!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()) ||
!item->getPermissions().allowOperationBy(PERM_MODIFY, gAgent.getID())
- ))
+ )
+ && item->getPermissions().getOwner() != ALEXANDRIA_LINDEN_ID
+ )
{
success = success && getSelection()->applyRestrictedPbrMaterialToTEs(item);
}
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index 7009fb98ab..c07c939862 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -739,7 +739,6 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
static LLCachedControl auto_adjust_blue_horizon_scale(gSavedSettings, "RenderSkyAutoAdjustBlueHorizonScale", 1.f);
static LLCachedControl auto_adjust_blue_density_scale(gSavedSettings, "RenderSkyAutoAdjustBlueDensityScale", 1.f);
static LLCachedControl auto_adjust_sun_color_scale(gSavedSettings, "RenderSkyAutoAdjustSunColorScale", 1.f);
- static LLCachedControl auto_adjust_probe_ambiance(gSavedSettings, "RenderSkyAutoAdjustProbeAmbiance", 1.f);
static LLCachedControl sunlight_scale(gSavedSettings, "RenderSkySunlightScale", 1.5f);
static LLCachedControl ambient_scale(gSavedSettings, "RenderSkyAmbientScale", 1.5f);
@@ -772,8 +771,7 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
shader->uniform3fv(LLShaderMgr::BLUE_DENSITY, blue_density.mV);
shader->uniform3fv(LLShaderMgr::BLUE_HORIZON, blue_horizon.mV);
- LLSettingsSky::sAutoAdjustProbeAmbiance = auto_adjust_probe_ambiance;
- probe_ambiance = auto_adjust_probe_ambiance; // NOTE -- must match LLSettingsSky::getReflectionProbeAmbiance value for "auto_adjust" true
+ probe_ambiance = sAutoAdjustProbeAmbiance;
}
else
{
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index e9c8479459..09a17e97d4 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1532,7 +1532,7 @@ bool idle_startup()
LLFile::mkdir(user_fonts_path_name.c_str());
// Initalize Account based asset_blacklist
- FSAssetBlacklist::instance();
+ FSAssetBlacklist::getInstance()->init();
// load per grid data
FSData::instance().downloadAgents();
@@ -2176,9 +2176,6 @@ bool idle_startup()
gXferManager->registerCallbacks(gMessageSystem);
display_startup();
- LLGLTFMaterialList::registerCallbacks();
- display_startup();
-
LLStartUp::initNameCache();
display_startup();
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 376396856c..8a5aee64b7 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -83,9 +83,11 @@
//static
bool get_is_predefined_texture(LLUUID asset_id)
{
- if (asset_id == LLUUID(gSavedSettings.getString("DefaultObjectTexture"))
- || asset_id == LLUUID(gSavedSettings.getString("UIImgWhiteUUID"))
- || asset_id == LLUUID(gSavedSettings.getString("UIImgInvisibleUUID"))
+ if (asset_id == DEFAULT_OBJECT_TEXTURE
+ || asset_id == DEFAULT_OBJECT_SPECULAR
+ || asset_id == DEFAULT_OBJECT_NORMAL
+ || asset_id == BLANK_OBJECT_NORMAL
+ || asset_id == IMG_WHITE
|| asset_id == LLUUID(SCULPT_DEFAULT_TEXTURE))
{
return true;
@@ -152,7 +154,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
PermissionMask immediate_filter_perm_mask,
PermissionMask dnd_filter_perm_mask,
BOOL can_apply_immediately,
- LLUIImagePtr fallback_image)
+ LLUIImagePtr fallback_image,
+ EPickInventoryType pick_type)
: LLFloater(LLSD()),
mOwner( owner ),
mImageAssetID( image_asset_id ),
@@ -183,7 +186,7 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mSetImageAssetIDCallback(NULL),
mOnUpdateImageStatsCallback(NULL),
mBakeTextureEnabled(FALSE),
- mInventoryPickType(LLTextureCtrl::PICK_TEXTURE)
+ mInventoryPickType(pick_type)
{
mCanApplyImmediately = can_apply_immediately;
buildFromFile("floater_texture_ctrl.xml");
@@ -235,7 +238,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
LLInventoryItem* itemp = gInventory.getItem(inv_view->getUUID());
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL
+ if (mInventoryPickType == PICK_MATERIAL
&& mImageAssetID == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID
&& itemp && itemp->getAssetUUID().isNull())
{
@@ -304,7 +307,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
void LLFloaterTexturePicker::setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection)
{
LLUUID asset_id = itemp->getAssetUUID();
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL && asset_id.isNull())
+ if (mInventoryPickType == PICK_MATERIAL && asset_id.isNull())
{
// If an inventory item has a null asset, consider it a valid blank material(gltf)
asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
@@ -465,11 +468,11 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
bool is_material = cargo_type == DAD_MATERIAL;
bool allow_dnd = false;
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ if (mInventoryPickType == PICK_MATERIAL)
{
allow_dnd = is_material;
}
- else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+ else if (mInventoryPickType == PICK_TEXTURE)
{
allow_dnd = is_texture || is_mesh;
}
@@ -671,9 +674,7 @@ BOOL LLFloaterTexturePicker::postBuild()
// don't put keyboard focus on selected item, because the selection callback
// will assume that this was user input
-
-
- if(!mImageAssetID.isNull())
+ if(!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL)
{
mInventoryPanel->setSelection(findItemID(mImageAssetID, FALSE), TAKE_FOCUS_NO);
}
@@ -725,7 +726,7 @@ void LLFloaterTexturePicker::draw()
mGLTFMaterial = NULL;
if (mImageAssetID.notNull())
{
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ if (mInventoryPickType == PICK_MATERIAL)
{
mGLTFMaterial = (LLFetchedGLTFMaterial*) gGLTFMaterialList.getMaterial(mImageAssetID);
llassert(mGLTFMaterial == nullptr || dynamic_cast(gGLTFMaterialList.getMaterial(mImageAssetID)) != nullptr);
@@ -851,27 +852,43 @@ void LLFloaterTexturePicker::draw()
const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library)
{
- LLUUID loockup_id = asset_id;
- if (loockup_id.isNull())
+ if (asset_id.isNull())
{
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
- {
- loockup_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
- }
- else
- {
- return LLUUID::null;
- }
+ // null asset id means, no material or texture assigned
+ return LLUUID::null;
}
+ LLUUID loockup_id = asset_id;
+ if (mInventoryPickType == PICK_MATERIAL && loockup_id == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID)
+ {
+ // default asset id means we are looking for an inventory item with a default asset UUID (null)
+ loockup_id = LLUUID::null;
+ }
+
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
- LLAssetIDMatches asset_id_matches(loockup_id);
- gInventory.collectDescendentsIf(LLUUID::null,
- cats,
- items,
- LLInventoryModel::INCLUDE_TRASH,
- asset_id_matches);
+
+ if (loockup_id.isNull())
+ {
+ // looking for a material with a null id, null id is shared by a lot
+ // of objects as a default value, so have to filter by type as well
+ LLAssetIDAndTypeMatches matches(loockup_id, LLAssetType::AT_MATERIAL);
+ gInventory.collectDescendentsIf(LLUUID::null,
+ cats,
+ items,
+ LLInventoryModel::INCLUDE_TRASH,
+ matches);
+ }
+ else
+ {
+ LLAssetIDMatches asset_id_matches(loockup_id);
+ gInventory.collectDescendentsIf(LLUUID::null,
+ cats,
+ items,
+ LLInventoryModel::INCLUDE_TRASH,
+ asset_id_matches);
+ }
+
if (items.size())
{
@@ -939,7 +956,7 @@ void LLFloaterTexturePicker::commitCallback(LLTextureCtrl::ETexturePickOp op)
LLInventoryItem* itemp = gInventory.getItem(inv_view->getUUID());
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL
+ if (mInventoryPickType == PICK_MATERIAL
&& mImageAssetID == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID
&& itemp && itemp->getAssetUUID().isNull())
{
@@ -1185,15 +1202,15 @@ void LLFloaterTexturePicker::onBtnAdd(void* userdata)
{
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)userdata;
- if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+ if (self->mInventoryPickType == PICK_TEXTURE_MATERIAL)
{
LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL_TEXTURE, true);
}
- else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+ else if (self->mInventoryPickType == PICK_TEXTURE)
{
LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_IMAGE, true);
}
- else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ else if (self->mInventoryPickType == PICK_MATERIAL)
{
LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL, true);
}
@@ -1480,7 +1497,7 @@ void LLFloaterTexturePicker::changeMode()
//getChild("hide_base_mesh_region")->setVisible(FALSE);// index == 2 ? TRUE : FALSE); // Does not exist 11-10-2023
bool pipette_visible = (index == PICKER_INVENTORY)
- && (mInventoryPickType != LLTextureCtrl::PICK_MATERIAL);
+ && (mInventoryPickType != PICK_MATERIAL);
mPipetteBtn->setVisible(pipette_visible);
if (index == PICKER_BAKE)
@@ -1543,16 +1560,16 @@ void LLFloaterTexturePicker::refreshLocalList()
{
mLocalScrollCtrl->clearRows();
- if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+ if (mInventoryPickType == PICK_TEXTURE_MATERIAL)
{
LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
}
- else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+ else if (mInventoryPickType == PICK_TEXTURE)
{
LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
}
- else if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ else if (mInventoryPickType == PICK_MATERIAL)
{
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
}
@@ -1562,18 +1579,18 @@ void LLFloaterTexturePicker::refreshInventoryFilter()
{
U32 filter_types = 0x0;
- if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+ if (mInventoryPickType == PICK_TEXTURE_MATERIAL)
{
filter_types |= 0x1 << LLInventoryType::IT_TEXTURE;
filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT;
filter_types |= 0x1 << LLInventoryType::IT_MATERIAL;
}
- else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+ else if (mInventoryPickType == PICK_TEXTURE)
{
filter_types |= 0x1 << LLInventoryType::IT_TEXTURE;
filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT;
}
- else if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ else if (mInventoryPickType == PICK_MATERIAL)
{
filter_types |= 0x1 << LLInventoryType::IT_MATERIAL;
}
@@ -1625,13 +1642,13 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
onModeSelect(0, this);
}
-void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryType type)
+void LLFloaterTexturePicker::setInventoryPickType(EPickInventoryType type)
{
mInventoryPickType = type;
refreshLocalList();
refreshInventoryFilter();
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ if (mInventoryPickType == PICK_MATERIAL)
{
getChild("Pipette")->setVisible(false);
}
@@ -1647,7 +1664,7 @@ void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryT
setTitle(pick + mLabel);
}
- else if(mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ else if(mInventoryPickType == PICK_MATERIAL)
{
setTitle(getString("pick_material"));
}
@@ -1655,6 +1672,12 @@ void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryT
{
setTitle(getString("pick_texture"));
}
+
+ // refresh selection
+ if (!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL)
+ {
+ mInventoryPanel->setSelection(findItemID(mImageAssetID, FALSE), TAKE_FOCUS_NO);
+ }
}
void LLFloaterTexturePicker::setImmediateFilterPermMask(PermissionMask mask)
@@ -1689,16 +1712,16 @@ void LLFloaterTexturePicker::onPickerCallback(const std::vector& fi
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)handle.get();
self->mLocalScrollCtrl->clearRows();
- if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
+ if (self->mInventoryPickType == PICK_TEXTURE_MATERIAL)
{
LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
- else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+ else if (self->mInventoryPickType == PICK_TEXTURE)
{
LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
- else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ else if (self->mInventoryPickType == PICK_MATERIAL)
{
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
@@ -1711,7 +1734,7 @@ void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te )
if (inventory_item_id.notNull())
{
LLToolPipette::getInstance()->setResult(TRUE, "");
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ if (mInventoryPickType == PICK_MATERIAL)
{
// tes have no data about material ids
// Plus gltf materials are layered with overrides,
@@ -1778,8 +1801,7 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)
mCaptionHeight = p.show_caption ? BTN_HEIGHT_SMALL : 0; // leave some room underneath the image for the caption
// Default of defaults is white image for diff tex
//
- LLUUID whiteImage( gSavedSettings.getString( "UIImgWhiteUUID" ) );
- setBlankImageAssetID( whiteImage );
+ setBlankImageAssetID(IMG_WHITE);
setAllowNoTexture(p.allow_no_texture);
setCanApplyImmediately(p.can_apply_immediately);
@@ -1983,7 +2005,8 @@ void LLTextureCtrl::showPicker(BOOL take_focus)
mImmediateFilterPermMask,
mDnDFilterPermMask,
mCanApplyImmediately,
- mFallbackImage);
+ mFallbackImage,
+ mInventoryPickType);
mFloaterHandle = floaterp->getHandle();
LLFloaterTexturePicker* texture_floaterp = dynamic_cast(floaterp);
@@ -2001,7 +2024,6 @@ void LLTextureCtrl::showPicker(BOOL take_focus)
texture_floaterp->setSetImageAssetIDCallback(boost::bind(&LLTextureCtrl::setImageAssetID, this, _1));
texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled);
- texture_floaterp->setInventoryPickType(mInventoryPickType);
}
LLFloater* root_floater = gFloaterView->getParentFloater(this);
@@ -2064,7 +2086,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
if (!mOpenTexPreview)
{
showPicker(FALSE);
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ if (mInventoryPickType == PICK_MATERIAL)
{
//grab materials first...
LLInventoryModelBackgroundFetch::instance().start(gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL));
@@ -2274,11 +2296,11 @@ BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
bool is_material = cargo_type == DAD_MATERIAL;
bool allow_dnd = false;
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ if (mInventoryPickType == PICK_MATERIAL)
{
allow_dnd = is_material;
}
- else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
+ else if (mInventoryPickType == PICK_TEXTURE)
{
allow_dnd = is_texture || is_mesh;
}
@@ -2344,7 +2366,7 @@ void LLTextureCtrl::draw()
if (texture.isNull())
{
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ if (mInventoryPickType == PICK_MATERIAL)
{
LLPointer material = gGLTFMaterialList.getMaterial(mImageAssetID);
if (material)
@@ -2512,7 +2534,7 @@ BOOL LLTextureCtrl::doDrop(LLInventoryItem* item)
// no callback installed, so just set the image ids and carry on.
LLUUID asset_id = item->getAssetUUID();
- if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL && asset_id.isNull())
+ if (mInventoryPickType == PICK_MATERIAL && asset_id.isNull())
{
// If an inventory material has a null asset, consider it a valid blank material(gltf)
asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 77b4565da1..aae52ddcca 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -73,6 +73,13 @@ enum LLPickerSource
PICKER_UNKNOWN, // on cancel, default ids
};
+typedef enum e_pick_inventory_type
+{
+ PICK_TEXTURE_MATERIAL = 0,
+ PICK_TEXTURE = 1,
+ PICK_MATERIAL = 2,
+} EPickInventoryType;
+
//////////////////////////////////////////////////////////////////////////////////////////
// LLTextureCtrl
@@ -88,13 +95,6 @@ public:
TEXTURE_CANCEL
} ETexturePickOp;
- typedef enum e_pick_inventory_type
- {
- PICK_TEXTURE_MATERIAL = 0,
- PICK_TEXTURE = 1,
- PICK_MATERIAL = 2,
- } EPickInventoryType;
-
public:
struct Params : public LLInitParam::Block
{
@@ -293,7 +293,7 @@ private:
S32 mLabelWidth;
bool mOpenTexPreview;
bool mBakeTextureEnabled;
- LLTextureCtrl::EPickInventoryType mInventoryPickType;
+ EPickInventoryType mInventoryPickType;
// Mask texture if desired
BOOL mIsMasked;
@@ -323,8 +323,8 @@ public:
PermissionMask immediate_filter_perm_mask,
PermissionMask dnd_filter_perm_mask,
BOOL can_apply_immediately,
- LLUIImagePtr fallback_image_name
- );
+ LLUIImagePtr fallback_image_name,
+ EPickInventoryType pick_type);
virtual ~LLFloaterTexturePicker();
@@ -398,7 +398,7 @@ public:
void setLocalTextureEnabled(BOOL enabled);
void setBakeTextureEnabled(BOOL enabled);
- void setInventoryPickType(LLTextureCtrl::EPickInventoryType type);
+ void setInventoryPickType(EPickInventoryType type);
void setImmediateFilterPermMask(PermissionMask mask);
static void onPickerCallback(const std::vector& filenames, LLHandle handle);
@@ -464,7 +464,7 @@ private:
bool mLimitsSet;
S32 mMaxDim;
S32 mMinDim;
- LLTextureCtrl::EPickInventoryType mInventoryPickType;
+ EPickInventoryType mInventoryPickType;
texture_selected_callback mTextureSelectedCallback;
diff --git a/indra/newview/lltinygltfhelper.cpp b/indra/newview/lltinygltfhelper.cpp
index 8990797286..977d39a5e6 100644
--- a/indra/newview/lltinygltfhelper.cpp
+++ b/indra/newview/lltinygltfhelper.cpp
@@ -178,6 +178,7 @@ LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tiny
{
rawImage = new LLImageRaw(&image->image[0], image->width, image->height, image->component);
rawImage->verticalFlip();
+ rawImage->optimizeAwayAlpha();
}
return rawImage;
diff --git a/indra/newview/lltoolcomp.h b/indra/newview/lltoolcomp.h
index ec50d32a7a..7b462c1525 100644
--- a/indra/newview/lltoolcomp.h
+++ b/indra/newview/lltoolcomp.h
@@ -168,8 +168,8 @@ public:
static void pickCallback(const LLPickInfo& pick_info);
// Add middle mouse control for switching uniform scaling on the fly
- virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
- virtual BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask);
+ virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask) override;
+ virtual BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask) override;
//
};
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index a7c469bd3d..5f03f80327 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1080,10 +1080,64 @@ BOOL LLToolDragAndDrop::handleDropMaterialProtections(LLViewerObject* hit_obj,
return TRUE;
}
+void set_texture_to_material(LLViewerObject* hit_obj,
+ S32 hit_face,
+ const LLUUID& asset_id,
+ LLGLTFMaterial::TextureInfo drop_channel)
+{
+ LLTextureEntry* te = hit_obj->getTE(hit_face);
+ if (te)
+ {
+ LLPointer material = te->getGLTFMaterialOverride();
+
+ // make a copy to not invalidate existing
+ // material for multiple objects
+ if (material.isNull())
+ {
+ // Start with a material override which does not make any changes
+ material = new LLGLTFMaterial();
+ }
+ else
+ {
+ material = new LLGLTFMaterial(*material);
+ }
+
+ switch (drop_channel)
+ {
+ case LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR:
+ default:
+ {
+ material->setBaseColorId(asset_id);
+ }
+ break;
+
+ case LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS:
+ {
+ material->setOcclusionRoughnessMetallicId(asset_id);
+ }
+ break;
+
+ case LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE:
+ {
+ material->setEmissiveId(asset_id);
+ }
+ break;
+
+ case LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL:
+ {
+ material->setNormalId(asset_id);
+ }
+ break;
+ }
+ LLGLTFMaterialList::queueModify(hit_obj, hit_face, material);
+ }
+}
+
void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj,
LLInventoryItem* item,
LLToolDragAndDrop::ESource source,
- const LLUUID& src_id)
+ const LLUUID& src_id,
+ bool remove_pbr)
{
if (!item)
{
@@ -1100,28 +1154,46 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj,
break;
}
}
- if (!has_non_pbr_faces)
+
+ if (has_non_pbr_faces || remove_pbr)
{
- return;
+ BOOL res = handleDropMaterialProtections(hit_obj, item, source, src_id);
+ if (!res)
+ {
+ return;
+ }
}
LLUUID asset_id = item->getAssetUUID();
- BOOL success = handleDropMaterialProtections(hit_obj, item, source, src_id);
- if (!success)
- {
- return;
- }
+
+ // Overrides require textures to be copy and transfer free
+ LLPermissions item_permissions = item->getPermissions();
+ bool allow_adding_to_override = item_permissions.allowOperationBy(PERM_COPY, gAgent.getID());
+ allow_adding_to_override &= item_permissions.allowOperationBy(PERM_TRANSFER, gAgent.getID());
+
LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(asset_id);
add(LLStatViewer::EDIT_TEXTURE, 1);
for( S32 face = 0; face < num_faces; face++ )
{
- if (hit_obj->getRenderMaterialID(face).isNull())
+ if (remove_pbr)
{
- // update viewer side image in anticipation of update from simulator
+ hit_obj->setRenderMaterialID(face, LLUUID::null);
hit_obj->setTEImage(face, image);
dialog_refresh_all();
}
+ else if (hit_obj->getRenderMaterialID(face).isNull())
+ {
+ // update viewer side
+ hit_obj->setTEImage(face, image);
+ dialog_refresh_all();
+ }
+ else if (allow_adding_to_override)
+ {
+ set_texture_to_material(hit_obj, face, asset_id, LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR);
+ }
}
+
// send the update to the simulator
+ LLGLTFMaterialList::flushUpdates(nullptr);
hit_obj->sendTEUpdate();
}
@@ -1269,21 +1341,13 @@ void LLToolDragAndDrop::dropMesh(LLViewerObject* hit_obj,
dialog_refresh_all();
}
-/*
-void LLToolDragAndDrop::dropTextureOneFaceAvatar(LLVOAvatar* avatar, S32 hit_face, LLInventoryItem* item)
-{
- if (hit_face == -1) return;
- LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(item->getAssetUUID());
-
- avatar->userSetOptionalTE( hit_face, image);
-}
-*/
void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj,
S32 hit_face,
LLInventoryItem* item,
ESource source,
const LLUUID& src_id,
bool all_faces,
+ bool remove_pbr,
S32 tex_channel)
{
LLSelectNode* nodep = nullptr;
@@ -1295,13 +1359,15 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj,
if (all_faces)
{
- dropTextureAllFaces(hit_obj, item, source, src_id);
+ dropTextureAllFaces(hit_obj, item, source, src_id, remove_pbr);
// If user dropped a texture onto face it implies
// applying texture now without cancel, save to selection
if (nodep)
{
uuid_vec_t texture_ids;
+ uuid_vec_t material_ids;
+ gltf_materials_vec_t override_materials;
S32 num_faces = hit_obj->getNumTEs();
for (S32 face = 0; face < num_faces; face++)
{
@@ -1314,13 +1380,35 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj,
{
texture_ids.push_back(LLUUID::null);
}
+
+ // either removed or modified materials
+ if (remove_pbr)
+ {
+ material_ids.push_back(LLUUID::null);
+ }
+ else
+ {
+ material_ids.push_back(hit_obj->getRenderMaterialID(face));
+ }
+
+ LLTextureEntry* te = hit_obj->getTE(hit_face);
+ if (te && !remove_pbr)
+ {
+ override_materials.push_back(te->getGLTFMaterialOverride());
+ }
+ else
+ {
+ override_materials.push_back(nullptr);
+ }
}
+
nodep->saveTextures(texture_ids);
+ nodep->saveGLTFMaterials(material_ids, override_materials);
}
}
else
{
- dropTextureOneFace(hit_obj, hit_face, item, source, src_id);
+ dropTextureOneFace(hit_obj, hit_face, item, source, src_id, remove_pbr, tex_channel);
// If user dropped a texture onto face it implies
// applying texture now without cancel, save to selection
@@ -1340,6 +1428,16 @@ void LLToolDragAndDrop::dropTexture(LLViewerObject* hit_obj,
{
nodep->mSavedTextures[hit_face] = LLUUID::null;
}
+
+ LLTextureEntry* te = hit_obj->getTE(hit_face);
+ if (te && !remove_pbr)
+ {
+ nodep->mSavedGLTFOverrideMaterials[hit_face] = te->getGLTFMaterialOverride();
+ }
+ else
+ {
+ nodep->mSavedGLTFOverrideMaterials[hit_face] = nullptr;
+ }
}
}
}
@@ -1349,6 +1447,7 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj,
LLInventoryItem* item,
LLToolDragAndDrop::ESource source,
const LLUUID& src_id,
+ bool remove_pbr,
S32 tex_channel)
{
if (hit_face == -1) return;
@@ -1357,21 +1456,44 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj,
LL_WARNS() << "LLToolDragAndDrop::dropTextureOneFace no texture item." << LL_ENDL;
return;
}
- if (hit_obj->getRenderMaterialID(hit_face).notNull())
+
+ LLUUID asset_id = item->getAssetUUID();
+
+ if (hit_obj->getRenderMaterialID(hit_face).notNull() && !remove_pbr)
{
+ // Overrides require textures to be copy and transfer free
+ LLPermissions item_permissions = item->getPermissions();
+ bool allow_adding_to_override = item_permissions.allowOperationBy(PERM_COPY, gAgent.getID());
+ allow_adding_to_override &= item_permissions.allowOperationBy(PERM_TRANSFER, gAgent.getID());
+
+ if (allow_adding_to_override)
+ {
+ LLGLTFMaterial::TextureInfo drop_channel = LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR;
+ LLPanelFace* panel_face = gFloaterTools->getPanelFace();
+ if (gFloaterTools->getVisible() && panel_face)
+ {
+ drop_channel = panel_face->getPBRDropChannel();
+ }
+ set_texture_to_material(hit_obj, hit_face, asset_id, drop_channel);
+ LLGLTFMaterialList::flushUpdates(nullptr);
+ }
return;
}
- LLUUID asset_id = item->getAssetUUID();
BOOL success = handleDropMaterialProtections(hit_obj, item, source, src_id);
if (!success)
{
return;
}
+ if (remove_pbr)
+ {
+ hit_obj->setRenderMaterialID(hit_face, LLUUID::null);
+ }
+
// update viewer side image in anticipation of update from simulator
LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture(asset_id);
add(LLStatViewer::EDIT_TEXTURE, 1);
- LLTextureEntry* tep = hit_obj ? (hit_obj->getTE(hit_face)) : NULL;
+ LLTextureEntry* tep = hit_obj->getTE(hit_face);
LLPanelFace* panel_face = gFloaterTools->getPanelFace();
@@ -1389,6 +1511,7 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj,
break;
case 1:
+ if (tep)
{
LLMaterialPtr old_mat = tep->getMaterialParams();
LLMaterialPtr new_mat = panel_face->createDefaultMaterial(old_mat);
@@ -1400,6 +1523,7 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj,
break;
case 2:
+ if (tep)
{
LLMaterialPtr old_mat = tep->getMaterialParams();
LLMaterialPtr new_mat = panel_face->createDefaultMaterial(old_mat);
@@ -2284,6 +2408,7 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
if (!item || !item->isFinished()) return ACCEPT_NO;
+ LLPermissions item_permissions = item->getPermissions();
EAcceptance rv = willObjectAcceptInventory(obj, item);
if((mask & MASK_CONTROL))
{
@@ -2298,12 +2423,12 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
return ACCEPT_NO_LOCKED;
}
- if (cargo_type == DAD_TEXTURE)
+ if (cargo_type == DAD_TEXTURE && (mask & MASK_ALT) == 0)
{
+ bool has_non_pbr_faces = false;
if ((mask & MASK_SHIFT))
{
S32 num_faces = obj->getNumTEs();
- bool has_non_pbr_faces = false;
for (S32 face = 0; face < num_faces; face++)
{
if (obj->getRenderMaterialID(face).isNull())
@@ -2312,14 +2437,19 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
break;
}
}
- if (!has_non_pbr_faces)
- {
- return ACCEPT_NO;
- }
}
- else if (obj->getRenderMaterialID(face).notNull())
+ else
{
- return ACCEPT_NO;
+ has_non_pbr_faces = obj->getRenderMaterialID(face).isNull();
+ }
+
+ if (!has_non_pbr_faces)
+ {
+ // Only pbr faces selected, texture will be added to an override
+ // Overrides require textures to be copy and transfer free
+ bool allow_adding_to_override = item_permissions.allowOperationBy(PERM_COPY, gAgent.getID());
+ allow_adding_to_override &= item_permissions.allowOperationBy(PERM_TRANSFER, gAgent.getID());
+ if (!allow_adding_to_override) return ACCEPT_NO;
}
}
@@ -2328,15 +2458,16 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
if (cargo_type == DAD_TEXTURE)
{
bool all_faces = mask & MASK_SHIFT;
- if (item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
+ bool remove_pbr = mask & MASK_ALT;
+ if (item_permissions.allowOperationBy(PERM_COPY, gAgent.getID()))
{
- dropTexture(obj, face, item, mSource, mSourceID, all_faces);
+ dropTexture(obj, face, item, mSource, mSourceID, all_faces, remove_pbr);
}
else
{
ESource source = mSource;
LLUUID source_id = mSourceID;
- LLNotificationsUtil::add("ApplyInventoryToObject", LLSD(), LLSD(), [obj, face, item, source, source_id, all_faces](const LLSD& notification, const LLSD& response)
+ LLNotificationsUtil::add("ApplyInventoryToObject", LLSD(), LLSD(), [obj, face, item, source, source_id, all_faces, remove_pbr](const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
// if Cancel pressed
@@ -2344,7 +2475,7 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
{
return;
}
- dropTexture(obj, face, item, source, source_id, all_faces);
+ dropTexture(obj, face, item, source, source_id, all_faces, remove_pbr);
});
}
}
@@ -2411,23 +2542,6 @@ EAcceptance LLToolDragAndDrop::dad3dMeshObject(
return dad3dApplyToObject(obj, face, mask, drop, DAD_MESH);
}
-
-/*
-EAcceptance LLToolDragAndDrop::dad3dTextureSelf(
- LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
-{
- LL_DEBUGS() << "LLToolDragAndDrop::dad3dTextureAvatar()" << LL_ENDL;
- if(drop)
- {
- if( !(mask & MASK_SHIFT) )
- {
- dropTextureOneFaceAvatar( (LLVOAvatar*)obj, face, (LLInventoryItem*)mCargoData);
- }
- }
- return (mask & MASK_SHIFT) ? ACCEPT_NO : ACCEPT_YES_SINGLE;
-}
-*/
-
EAcceptance LLToolDragAndDrop::dad3dWearItem(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index f69774952c..60a2f01107 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -249,17 +249,20 @@ public:
ESource source,
const LLUUID& src_id,
bool all_faces,
+ bool replace_pbr,
S32 tex_channel = -1);
static void dropTextureOneFace(LLViewerObject* hit_obj,
S32 hit_face,
LLInventoryItem* item,
ESource source,
const LLUUID& src_id,
+ bool remove_pbr,
S32 tex_channel = -1);
static void dropTextureAllFaces(LLViewerObject* hit_obj,
LLInventoryItem* item,
ESource source,
- const LLUUID& src_id);
+ const LLUUID& src_id,
+ bool remove_pbr);
static void dropMaterial(LLViewerObject* hit_obj,
S32 hit_face,
LLInventoryItem* item,
diff --git a/indra/newview/lltoolface.h b/indra/newview/lltoolface.h
index 654c9baec8..d5b6da3d95 100644
--- a/indra/newview/lltoolface.h
+++ b/indra/newview/lltoolface.h
@@ -48,8 +48,8 @@ public:
static void pickCallback(const LLPickInfo& pick_info);
// Add control to drag texture faces around
- virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
- virtual void stopGrabbing();
+ virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override;
+ void stopGrabbing();
static BOOL mTextureGrabbed;
static LLViewerObject* mTextureObject;
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 0c0d9114f3..6d635b872c 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -846,8 +846,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("display - 2")
if (gResizeScreenTexture)
{
- gResizeScreenTexture = FALSE;
gPipeline.resizeScreenTexture();
+ gResizeScreenTexture = FALSE;
}
gGL.setColorMask(true, true);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 8d0731dda9..e8c46b6c13 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -352,6 +352,7 @@ void handle_disconnect_viewer(void *);
void force_error_breakpoint(void *);
void force_error_llerror(void *);
+void force_error_llerror_msg(void*);
void force_error_bad_memory_access(void *);
void force_error_infinite_loop(void *);
void force_error_software_exception(void *);
@@ -2720,6 +2721,15 @@ class LLAdvancedForceErrorLlerror : public view_listener_t
}
};
+class LLAdvancedForceErrorLlerrorMsg: public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ force_error_llerror_msg(NULL);
+ return true;
+ }
+};
+
class LLAdvancedForceErrorBadMemoryAccess : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -10752,6 +10762,11 @@ void force_error_llerror(void *)
LLAppViewer::instance()->forceErrorLLError();
}
+void force_error_llerror_msg(void*)
+{
+ LLAppViewer::instance()->forceErrorLLErrorMsg();
+}
+
void force_error_bad_memory_access(void *)
{
LLAppViewer::instance()->forceErrorBadMemoryAccess();
@@ -10960,7 +10975,6 @@ void handle_report_bug(const LLSD& param)
// Keep linking to out JIRA
//std::string url = gSavedSettings.getString("ReportBugURL");
//LLWeb::loadURLExternal(url);
- LLUIString url(param.asString());
LLSD sysinfo = FSData::getSystemInfo();
LLStringUtil::format_map_t replace;
replace["[ENVIRONMENT]"] = LLURI::escape(sysinfo["Part1"].asString().substr(1) + sysinfo["Part2"].asString().substr(1));
@@ -12443,6 +12457,7 @@ void initialize_menus()
// Advanced > Debugging
view_listener_t::addMenu(new LLAdvancedForceErrorBreakpoint(), "Advanced.ForceErrorBreakpoint");
view_listener_t::addMenu(new LLAdvancedForceErrorLlerror(), "Advanced.ForceErrorLlerror");
+ view_listener_t::addMenu(new LLAdvancedForceErrorLlerrorMsg(), "Advanced.ForceErrorLlerrorMsg");
view_listener_t::addMenu(new LLAdvancedForceErrorBadMemoryAccess(), "Advanced.ForceErrorBadMemoryAccess");
view_listener_t::addMenu(new LLAdvancedForceErrorBadMemoryAccessCoro(), "Advanced.ForceErrorBadMemoryAccessCoro");
view_listener_t::addMenu(new LLAdvancedForceErrorInfiniteLoop(), "Advanced.ForceErrorInfiniteLoop");
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 286330cc1f..d29029a89a 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -5230,11 +5230,6 @@ void LLViewerObject::updateTEMaterialTextures(U8 te)
LLViewerObject* obj = gObjectList.findObject(id);
if (obj)
{
- LLViewerRegion* region = obj->getRegion();
- if(region)
- {
- region->loadCacheMiscExtras(obj->getLocalID());
- }
obj->markForUpdate();
}
});
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index d55a7ddb26..23c91fc660 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1972,8 +1972,6 @@ LLViewerObject* LLViewerRegion::addNewObject(LLVOCacheEntry* entry)
addActiveCacheEntry(entry);
}
- loadCacheMiscExtras(entry->getLocalID());
-
return obj;
}
@@ -3935,15 +3933,6 @@ std::string LLViewerRegion::getSimHostName()
return std::string("...");
}
-void LLViewerRegion::loadCacheMiscExtras(U32 local_id)
-{
- auto iter = mImpl->mGLTFOverridesLLSD.find(local_id);
- if (iter != mImpl->mGLTFOverridesLLSD.end())
- {
- LLGLTFMaterialList::loadCacheOverrides(iter->second);
- }
-}
-
void LLViewerRegion::applyCacheMiscExtras(LLViewerObject* obj)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 3c810f15cb..9303f63710 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -464,8 +464,6 @@ private:
bool isNonCacheableObjectCreated(U32 local_id);
public:
- void loadCacheMiscExtras(U32 local_id);
-
void applyCacheMiscExtras(LLViewerObject* obj);
struct CompareDistance
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 1121b07476..c8db0876a0 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -124,8 +124,17 @@ void LLViewerTextureList::doPreloadImages()
LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();
LLUIImageList* image_list = LLUIImageList::getInstance();
- // Set the default flat normal map
- LLViewerFetchedTexture::sFlatNormalImagep = LLViewerTextureManager::getFetchedTextureFromFile("flatnormal.tga", FTT_LOCAL_FILE, MIPMAP_NO, LLViewerFetchedTexture::BOOST_BUMP);
+ // Set the default flat normal map
+ // BLANK_OBJECT_NORMAL has a version on dataserver, but it has compression artifacts
+ LLViewerFetchedTexture::sFlatNormalImagep =
+ LLViewerTextureManager::getFetchedTextureFromFile("flatnormal.tga",
+ FTT_LOCAL_FILE,
+ MIPMAP_NO,
+ LLViewerFetchedTexture::BOOST_BUMP,
+ LLViewerTexture::FETCHED_TEXTURE,
+ 0,
+ 0,
+ BLANK_OBJECT_NORMAL);
// PBR: irradiance
LLViewerFetchedTexture::sDefaultIrradiancePBRp = LLViewerTextureManager::getFetchedTextureFromFile("default_irradiance.png", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 7ef40dbe7f..e5f49879dd 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2067,7 +2067,11 @@ LLViewerWindow::LLViewerWindow(const Params& p)
// Initialize OpenGL Renderer
LLVertexBuffer::initClass(mWindow);
LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ;
- gGL.init(true);
+ if (!gGL.init(true))
+ {
+ LLError::LLUserWarningMsg::show(LLTrans::getString("MBVideoDrvErr"));
+ LL_ERRS() << "gGL not initialized" << LL_ENDL;
+ }
// Exodus vignette
if (LLFeatureManager::getInstance()->isSafe()
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index cbb24e50ae..2eacc94943 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -209,7 +209,7 @@ public:
virtual void removeObserver(LLVoiceClientParticipantObserver* observer) override;
// Add callback for user volume change
- boost::signals2::connection setUserVolumeUpdateCallback(const user_voice_volume_change_callback_t::slot_type& cb)
+ boost::signals2::connection setUserVolumeUpdateCallback(const user_voice_volume_change_callback_t::slot_type& cb) override
{
return mUserVolumeUpdateSignal.connect(cb);
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 43b6ce463e..c5e7cff9c0 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -5537,8 +5537,9 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
//drawable->getVObj()->setDebugText(llformat("%d", drawable->isState(LLDrawable::ANIMATED_CHILD)));
- U8 bump = (type == LLRenderPass::PASS_BUMP || type == LLRenderPass::PASS_POST_BUMP) ? facep->getTextureEntry()->getBumpmap() : 0;
- U8 shiny = facep->getTextureEntry()->getShiny();
+ const LLTextureEntry* te = facep->getTextureEntry();
+ U8 bump = (type == LLRenderPass::PASS_BUMP || type == LLRenderPass::PASS_POST_BUMP) ? te->getBumpmap() : 0;
+ U8 shiny = te->getShiny();
LLViewerTexture* tex = facep->getTexture();
@@ -5548,22 +5549,22 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
LLUUID mat_id;
- auto* gltf_mat = (LLFetchedGLTFMaterial*) facep->getTextureEntry()->getGLTFRenderMaterial();
- llassert(gltf_mat == nullptr || dynamic_cast(facep->getTextureEntry()->getGLTFRenderMaterial()) != nullptr);
+ auto* gltf_mat = (LLFetchedGLTFMaterial*)te->getGLTFRenderMaterial();
+ llassert(gltf_mat == nullptr || dynamic_cast(te->getGLTFRenderMaterial()) != nullptr);
if (gltf_mat != nullptr)
{
mat_id = gltf_mat->getHash(); // TODO: cache this hash
- if (!facep->hasMedia())
+ if (!facep->hasMedia() || (tex && tex->getType() != LLViewerTexture::MEDIA_TEXTURE))
{ // no media texture, face texture will be unused
tex = nullptr;
}
}
else
{
- mat = facep->getTextureEntry()->getMaterialParams().get();
+ mat = te->getMaterialParams().get();
if (mat)
{
- mat_id = facep->getTextureEntry()->getMaterialParams()->getHash();
+ mat_id = te->getMaterialParams()->getHash();
}
}
@@ -5578,7 +5579,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
if (mat)
{
- BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) || (facep->getTextureEntry()->getColor().mV[3] < 0.999f) ? TRUE : FALSE;
+ BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) || (te->getColor().mV[3] < 0.999f) ? TRUE : FALSE;
if (type == LLRenderPass::PASS_ALPHA)
{
shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND, is_alpha);
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index a7e60a5a07..14d2830296 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -8580,7 +8580,7 @@ void LLPipeline::doWaterHaze()
else
{
//render water patches like LLDrawPoolWater does
- LLGLDepthTest depth(GL_FALSE);
+ LLGLDepthTest depth(GL_TRUE, GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
gGLLastMatrix = NULL;
diff --git a/indra/newview/qtoolalign.h b/indra/newview/qtoolalign.h
index ca3da4fa56..6fae2a7e82 100644
--- a/indra/newview/qtoolalign.h
+++ b/indra/newview/qtoolalign.h
@@ -19,12 +19,12 @@ class QToolAlign : public LLTool, public LLSingleton
virtual ~QToolAlign();
public:
- virtual void handleSelect();
- virtual void handleDeselect();
- virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
- virtual BOOL handleHover(S32 x, S32 y, MASK mask);
- virtual void render();
- virtual BOOL canAffectSelection();
+ virtual void handleSelect() override;
+ virtual void handleDeselect() override;
+ virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override;
+ virtual BOOL handleHover(S32 x, S32 y, MASK mask) override;
+ virtual void render() override;
+ BOOL canAffectSelection();
static void pickCallback(const LLPickInfo& pick_info);
diff --git a/indra/newview/rlvinventory.h b/indra/newview/rlvinventory.h
index 482a308392..cf57a84bb1 100644
--- a/indra/newview/rlvinventory.h
+++ b/indra/newview/rlvinventory.h
@@ -41,7 +41,7 @@ class RlvInventory : public LLSingleton, public LLInventoryObserve
public:
// LLInventoryObserver override
- /*virtual*/ void changed(U32 mask);
+ /*virtual*/ void changed(U32 mask) override;
/*
* #RLV Shared inventory
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index a757b23a46..b5ef098e84 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -455,6 +455,7 @@
+
+ NotoEmoji-Regular.ttf
+
+
DejaVuSansMono.ttf
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 2dd7e71011..a87cc3773c 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -4002,6 +4002,12 @@
+
+
+
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_UI.xml b/indra/newview/skins/default/xui/en/panel_preferences_UI.xml
index e0e5d7ab7c..7019b57a72 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_UI.xml
@@ -1806,7 +1806,33 @@ Default 0. Larger values may not work well.
-
+
+ Emoji Font Settings: (restart required for full effect)
+
+
+
+If your computer's RAM is low, quit any heavy applications before runing [APP_NAME], allocate a page file or reduce graphical settings like draw distance.
+
+
+ [APP_NAME] couldn't access or find some of the files it needs and will be closed.
+
+Please reinstall viewer from [DOWNLOAD_URL] and contact [SUPPORT_SITE] if issue persists after reinstall.
+
+
+
5 O'Clock Shadow
All White
diff --git a/indra/newview/skins/default/xui/en/widgets/chat_editor.xml b/indra/newview/skins/default/xui/en/widgets/chat_editor.xml
index 82da716e26..6426acec03 100644
--- a/indra/newview/skins/default/xui/en/widgets/chat_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chat_editor.xml
@@ -2,6 +2,7 @@
diff --git a/indra/newview/skins/default/xui/fr/floater_emoji_picker.xml b/indra/newview/skins/default/xui/fr/floater_emoji_picker.xml
new file mode 100644
index 0000000000..cff1f19361
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_emoji_picker.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+ Aucun émoji sélectionné
+
+
diff --git a/indra/newview/skins/default/xui/fr/floater_fs_im_session.xml b/indra/newview/skins/default/xui/fr/floater_fs_im_session.xml
index f9e1296b9f..ded7046d91 100644
--- a/indra/newview/skins/default/xui/fr/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/fr/floater_fs_im_session.xml
@@ -1,19 +1,45 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -27,7 +53,18 @@
-
+
+
+
+
+
+
+
+
+
+ Les emojis récemment utilisés apparaîtront ici
+
+
diff --git a/indra/newview/skins/default/xui/fr/floater_fs_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_fs_nearby_chat.xml
index 80c65117f9..0ba5774936 100644
--- a/indra/newview/skins/default/xui/fr/floater_fs_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/fr/floater_fs_nearby_chat.xml
@@ -14,7 +14,13 @@
-
+
+
+
+
+
+
+
@@ -25,6 +31,11 @@
+
+
+ Les émojis récemment utilisés apparaîtront ici
+
+
diff --git a/indra/newview/skins/default/xui/fr/floater_im_session.xml b/indra/newview/skins/default/xui/fr/floater_im_session.xml
index c8eeb6f5b6..6586a3a4f6 100644
--- a/indra/newview/skins/default/xui/fr/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/fr/floater_im_session.xml
@@ -12,7 +12,18 @@
-
+
+
+
+
+
+
+
+
+ Les émojis récemment utilisés apparaîtront ici
+
+
+
diff --git a/indra/newview/skins/default/xui/fr/menu_fs_chat_options.xml b/indra/newview/skins/default/xui/fr/menu_fs_chat_options.xml
index b4595de308..816ae7f3dc 100644
--- a/indra/newview/skins/default/xui/fr/menu_fs_chat_options.xml
+++ b/indra/newview/skins/default/xui/fr/menu_fs_chat_options.xml
@@ -14,6 +14,7 @@
+
diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml
index a824cf9ef5..ee3765a3a1 100644
--- a/indra/newview/skins/default/xui/fr/menu_login.xml
+++ b/indra/newview/skins/default/xui/fr/menu_login.xml
@@ -16,6 +16,11 @@
diff --git a/indra/newview/skins/default/xui/it/menu_fs_chat_options.xml b/indra/newview/skins/default/xui/it/menu_fs_chat_options.xml
index 9faf966408..32f21b08cc 100644
--- a/indra/newview/skins/default/xui/it/menu_fs_chat_options.xml
+++ b/indra/newview/skins/default/xui/it/menu_fs_chat_options.xml
@@ -15,6 +15,7 @@
+
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index 7cf7a386f6..90df9e75a6 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -25,6 +25,11 @@
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index c6bc732506..49459152e6 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -542,25 +542,28 @@
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
+
-
+
diff --git a/indra/newview/skins/default/xui/pl/floater_emoji_picker.xml b/indra/newview/skins/default/xui/pl/floater_emoji_picker.xml
new file mode 100644
index 0000000000..01c16bcb81
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_emoji_picker.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+ Nie wybrano emoji
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml b/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
index 70887395b0..61bf58ede2 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_im_session.xml
@@ -62,9 +62,18 @@
+
+
+
+
+
+
+ Tutaj pojawią się ostatnio używane emoji
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_fs_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_fs_nearby_chat.xml
index aef77908db..7dc9a543fa 100644
--- a/indra/newview/skins/default/xui/pl/floater_fs_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/pl/floater_fs_nearby_chat.xml
@@ -27,6 +27,10 @@
+
+
+
+
@@ -40,6 +44,11 @@
+
+
+ Tutaj pojawią się ostatnio używane emoji
+
+
diff --git a/indra/newview/skins/default/xui/pl/floater_im_session.xml b/indra/newview/skins/default/xui/pl/floater_im_session.xml
index b969afe44f..f298f0fc51 100644
--- a/indra/newview/skins/default/xui/pl/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/pl/floater_im_session.xml
@@ -21,11 +21,19 @@
+
+
+
+
+
+ Tutaj pojawią się ostatnio używane emoji
+
+
diff --git a/indra/newview/skins/default/xui/pl/menu_fs_chat_options.xml b/indra/newview/skins/default/xui/pl/menu_fs_chat_options.xml
index 71ae4f6189..2bb638b728 100644
--- a/indra/newview/skins/default/xui/pl/menu_fs_chat_options.xml
+++ b/indra/newview/skins/default/xui/pl/menu_fs_chat_options.xml
@@ -15,6 +15,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/menu_login.xml b/indra/newview/skins/default/xui/pl/menu_login.xml
index 38778fa432..2d880b499f 100644
--- a/indra/newview/skins/default/xui/pl/menu_login.xml
+++ b/indra/newview/skins/default/xui/pl/menu_login.xml
@@ -25,6 +25,11 @@
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index 2473dc79cb..7a2d53d5e2 100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -554,6 +554,8 @@
+
+
@@ -565,6 +567,7 @@
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml b/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml
index ff8d3be577..c59f246a35 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_UI.xml
@@ -263,6 +263,11 @@ Domyślnie 0. Większa wartość może sprawiać kłopoty.
+
+ Ustawienia czcionki emoji: (wymaga restartu)
+
+
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index b7c72f4fbb..2a6b7354c5 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -141,7 +141,9 @@
-
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/floater_emoji_picker.xml b/indra/newview/skins/default/xui/ru/floater_emoji_picker.xml
new file mode 100644
index 0000000000..56286fbca0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ru/floater_emoji_picker.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Эмодзи не выбраны
+
diff --git a/indra/newview/skins/default/xui/ru/floater_fs_im_session.xml b/indra/newview/skins/default/xui/ru/floater_fs_im_session.xml
index 7fb369a8cc..a62ec2c8cb 100644
--- a/indra/newview/skins/default/xui/ru/floater_fs_im_session.xml
+++ b/indra/newview/skins/default/xui/ru/floater_fs_im_session.xml
@@ -49,14 +49,15 @@
-
+
+ tool_tip="Добавляет текущую версию и внешний вид программы просмотра, операционную систему и статус RLVa в начало сообщений, отправляемых вами в эту группу, что поможет сотрудникам службы поддержки правильно диагностировать ваши проблемы и повысить точность ответов на ваши вопросы. (Это отдельно от групп поддержки)"/>
+
@@ -67,11 +68,18 @@
+
+
+
+
+
+ Здесь появятся недавно использованные эмодзи
+
diff --git a/indra/newview/skins/default/xui/ru/floater_fs_nearby_chat.xml b/indra/newview/skins/default/xui/ru/floater_fs_nearby_chat.xml
index 942f6b854b..88a1bc40d9 100644
--- a/indra/newview/skins/default/xui/ru/floater_fs_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/ru/floater_fs_nearby_chat.xml
@@ -33,6 +33,10 @@
+
+
+
+
@@ -47,6 +51,9 @@
+
+ Здесь появятся недавно использованные эмодзи
+
diff --git a/indra/newview/skins/default/xui/ru/floater_im_session.xml b/indra/newview/skins/default/xui/ru/floater_im_session.xml
index 026398fbbc..02c91c4b85 100644
--- a/indra/newview/skins/default/xui/ru/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/ru/floater_im_session.xml
@@ -34,13 +34,18 @@
-
+
+
+ Здесь появятся недавно использованные эмодзи
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_fs_chat_options.xml b/indra/newview/skins/default/xui/ru/menu_fs_chat_options.xml
index e1c451fad9..a96f42ef42 100644
--- a/indra/newview/skins/default/xui/ru/menu_fs_chat_options.xml
+++ b/indra/newview/skins/default/xui/ru/menu_fs_chat_options.xml
@@ -15,6 +15,7 @@
+
diff --git a/indra/newview/skins/default/xui/ru/menu_login.xml b/indra/newview/skins/default/xui/ru/menu_login.xml
index fad02d0ed0..599dd878c6 100644
--- a/indra/newview/skins/default/xui/ru/menu_login.xml
+++ b/indra/newview/skins/default/xui/ru/menu_login.xml
@@ -26,6 +26,11 @@
+
+
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml
index 8d0498ee9e..18f8ad3b38 100644
--- a/indra/newview/skins/default/xui/ru/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml
@@ -593,6 +593,8 @@
+
+
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_UI.xml b/indra/newview/skins/default/xui/ru/panel_preferences_UI.xml
index 77b37113ef..82c599f71c 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_UI.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_UI.xml
@@ -275,6 +275,11 @@
+
+ Настройки шрифта Эмодзи: (требуется перезапуск)
+
+
+
diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
index 0b3a989c35..109e1e6393 100644
--- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml
@@ -141,6 +141,8 @@
+
+
@@ -269,15 +271,15 @@
Очистить историю чата
-
+
Установить url для медиа
-
+
Установить url для потоковой музыки
-
+
Выложить платформу (0 - 64)
diff --git a/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml b/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
index d0a6087a2f..e056fff42b 100644
--- a/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
+++ b/indra/newview/skins/vintage/xui/en/floater_fs_im_session.xml
@@ -449,7 +449,7 @@
top="0"
left_delta="5"
name="FSSupportGroupChatPrefix_toggle"
- tool_tip="Adds your current viewer version and skin information to the front of messages sent by you to this group which will assist support staff in correctly diagnosing your issues and improve accuracy in answering your questions"
+ tool_tip="Adds current viewer version, viewer skin, operating system and RLVa status to the front of messages sent by you to this group which will assist support staff in correctly diagnosing your issues and improve accuracy in answering your questions"
width="110" />
@@ -603,6 +603,44 @@
right="-2"
wrap="true" />
+
+
+
+
+
+ Recently used emojis will appear here
+
+
diff --git a/indra/newview/skins/vintage/xui/en/floater_fs_nearby_chat.xml b/indra/newview/skins/vintage/xui/en/floater_fs_nearby_chat.xml
index 42e10cf146..d756c87547 100644
--- a/indra/newview/skins/vintage/xui/en/floater_fs_nearby_chat.xml
+++ b/indra/newview/skins/vintage/xui/en/floater_fs_nearby_chat.xml
@@ -252,6 +252,41 @@
right="-4"
wrap="true" />
+
+
+
+
+
+ Recently used emojis will appear here
+
+
diff --git a/indra/newview/utilitybar.h b/indra/newview/utilitybar.h
index f1bab26fe8..d58a24082c 100644
--- a/indra/newview/utilitybar.h
+++ b/indra/newview/utilitybar.h
@@ -39,7 +39,7 @@ class UtilityBar
public:
void init();
- virtual BOOL tick();
+ virtual BOOL tick() override;
void setAOInterfaceButtonExpanded(bool expanded);
void setVolumeControlsButtonExpanded(bool expanded);
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index dec8cd1fde..824754c410 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -2085,6 +2085,7 @@ class LinuxManifest(ViewerManifest):
self.path("ca-bundle.crt")
with self.prefix(src=os.path.join(pkgdir, 'lib', 'release'), dst="lib"):
+ self.path("libfreetype.so*")
self.path("libapr-1.so*")
self.path("libaprutil-1.so*")
#self.path("libboost_context-mt.so*")
@@ -2263,7 +2264,7 @@ class Linux_i686_Manifest(LinuxManifest):
# self.path("libfontconfig.so.*.*") # fontconfig and freetype should be taken from the user's system
# Include libfreetype.so. but have it work as libfontconfig does.
- # self.path("libfreetype.so.*.*") # fontconfig and freetype should be taken from the user's system
+ self.path("libfreetype.so.*.*")
try:
self.path("libtcmalloc.so*") #formerly called google perf tools
diff --git a/indra/newview/vjlocalmesh.cpp b/indra/newview/vjlocalmesh.cpp
index c0217bb9cd..e8871f58c7 100644
--- a/indra/newview/vjlocalmesh.cpp
+++ b/indra/newview/vjlocalmesh.cpp
@@ -468,8 +468,9 @@ LLLocalMeshFile::LLLocalMeshFile(const std::string& filename, bool try_lods)
mFilenames[LOCAL_LOD_HIGH] = filename;
// check if we have a valid extension, can't switch with string can we?
- if( std::string exten_str = boost::filesystem::extension(filename);
- boost::iequals(exten_str, ".dae") )
+ auto path = boost::filesystem::path(filename);
+ if (std::string exten_str = path.extension().string();
+ boost::iequals(exten_str, ".dae") )
{
mExtension = LLLocalMeshFileExtension::EXTEN_DAE;
pushLog("LLLocalMeshFile", "Extension found: COLLADA");