diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 4bf2af644a..ed0fb48c78 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -85,7 +85,7 @@ jobs: variants: ${{ matrix.configuration }} steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: ref: ${{ github.event.pull_request.head.sha || github.sha }} @@ -95,14 +95,14 @@ jobs: python-version: "3.11" - name: Checkout build variables - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: secondlife/build-variables ref: master path: .build-variables - name: Checkout master-message-template - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: secondlife/master-message-template path: .master-message-template @@ -369,13 +369,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Download viewer exe - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: Windows-app path: _artifacts - name: Download Windows Symbols if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: Windows-symbols - name: Extract viewer pdb @@ -405,7 +405,7 @@ jobs: steps: - name: Download Mac Symbols if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: macOS-symbols - name: Post Mac symbols @@ -425,11 +425,11 @@ jobs: runs-on: ubuntu-latest if: needs.setup.outputs.release_run steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: pattern: "*-installer" - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v5 with: pattern: "*-metadata" diff --git a/.github/workflows/build_viewer.yml b/.github/workflows/build_viewer.yml index 790502eb8a..f5b0f1f6a8 100644 --- a/.github/workflows/build_viewer.yml +++ b/.github/workflows/build_viewer.yml @@ -58,7 +58,7 @@ jobs: echo "/usr/local/bin" >> $GITHUB_PATH echo "$(brew --prefix)/opt/gnu-sed/libexec/gnubin" >> $GITHUB_PATH - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 # Use apt-based Python when inside the Ubuntu 22.04 container - name: Install Python 3.11 (container case) if: matrix.container_image == 'ubuntu:22.04' @@ -185,12 +185,12 @@ jobs: shell: bash - name: Get the code - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 - name: Checkout build vars (after the main code) - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: FirestormViewer/fs-build-variables path: build-variables @@ -515,7 +515,7 @@ jobs: if: always() steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: sparse-checkout: | fsutils/download_list.py @@ -529,7 +529,7 @@ jobs: run: pip install discord-webhook - name: Download artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 id: download with: path: to_deploy diff --git a/.github/workflows/deploy_only.yml b/.github/workflows/deploy_only.yml index 376a0a9400..8cd0e08e89 100644 --- a/.github/workflows/deploy_only.yml +++ b/.github/workflows/deploy_only.yml @@ -31,7 +31,7 @@ jobs: contents: read steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: sparse-checkout: | fsutils/download_list.py diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index dcb64a3b29..73ec1c32e9 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -11,7 +11,7 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-python@v5 with: python-version: 3.x diff --git a/.github/workflows/sign.yml b/.github/workflows/sign.yml index 8766aa99d5..828f8fd6ad 100644 --- a/.github/workflows/sign.yml +++ b/.github/workflows/sign.yml @@ -86,7 +86,7 @@ jobs: shell: bash - name: Download Setup.exe Files Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: setup-exe-files path: setup_exe_files diff --git a/.github/workflows/tag-fs-build.yml b/.github/workflows/tag-fs-build.yml index bdb406b64d..5192eacbc5 100644 --- a/.github/workflows/tag-fs-build.yml +++ b/.github/workflows/tag-fs-build.yml @@ -50,7 +50,7 @@ jobs: steps: # Checkout the Repository - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 # Necessary to fetch all history for tagging diff --git a/.gitignore b/.gitignore index 0a684b7ce5..8589efc875 100755 --- a/.gitignore +++ b/.gitignore @@ -112,8 +112,10 @@ indra/newview/pilot.xml # Firestorm additions indra/newview/exoflickrkeys.h indra/newview/fsdiscordkey.h +indra/tools/vstool/obj/*/*.cache my_autobuild.xml .vscode +.vs *.srctrlbm *.srctrldb *.srctrlprj diff --git a/doc/building_linux.md b/doc/building_linux.md index 92348765ca..0a9726dd14 100644 --- a/doc/building_linux.md +++ b/doc/building_linux.md @@ -43,9 +43,22 @@ A few packages must be installed on the build system. Some may already be instal sudo apt install libgl1-mesa-dev libglu1-mesa-dev libpulse-dev build-essential python3-pip git libssl-dev libxinerama-dev libxrandr-dev libfontconfig-dev libfreetype6-dev gcc-11 cmake ``` +### Optional: Set up a Python virtual environment + +If you do not want to install the required Python packages into the default Python directory, you can optionally create a virtual environment. + +- Create the Python virtual environment (only once): + `python -m venv .venv` +- Activate the virtual environment: + `source .venv/bin/activate` +- Activate the virtual environment each time you want to build. +- Type all the subsequent commands in this virtual environment. +- In case of issue or Python update, you can delete this .venv directory and create a new virtual environment again. + ### Install Autobuild Autobuild is a Linden Lab resource that does all the hard work. +If you created a Python virtual environment, activate it first. You can install it using the same versions as our automated builds as follows: ``` sudo pip3 install --upgrade pip @@ -156,27 +169,36 @@ This will set up to compile with all defaults and without non-default libraries. Available premade firestorm-specific build targets: ``` -ReleaseFS (includes KDU, FMOD) -ReleaseFS_open (no KDU, no FMOD) -RelWithDebInfoFS_open (no KDU, no FMOD) +ReleaseFS (with KDU, with FMOD, no OpenSim) +ReleaseFS_AVX (with KDU, with FMOD, no OpenSim, optimized for AVX-enabled CPUs) +ReleaseFS_AVX2 (with KDU, with FMOD, no OpenSim, optimized for AVX2-enabled CPUs) +ReleaseFS_open ( no KDU, no FMOD, no OpenSim) +ReleaseOS ( no KDU, no FMOD, with OpenSim) +RelWithDebInfoFS (with KDU, with FMOD, no OpenSim, with debug info) +RelWithDebInfoFS_open ( no KDU, no FMOD, no OpenSim, with debug info) +RelWithDebInfoOS ( no KDU, no FMOD, with OpenSim, with debug info) ``` ### Configuration Switches There are a number of switches you can use to modify the configuration process. The name of each switch is followed by its type and then by the value you want to set. -- **LL_TESTS** (bool) controls if the tests are compiled and run. There are quite a lot of them so excluding them is recommended unless you have some reason to need one or more of them. -- **clean** will cause autobuild to remove any previously compiled objects and fetched packages. It can be useful if you need to force a reload of all packages -- **package** will result in a bzip2 archive of the completed viewer. Enabled by default, you would have to use **-DPACKAGE:BOOL=Off** to disable it -- **chan** will set a unique channel (and the name) for the viewer, appending whatever is defined to "Firestorm-". By default, the channel is "private" followed by your computer's name. -- **fmodstudio** will tell autobuiild to use the FmodStudio package when compiling. +- **-A \** sets the target architecture, that is if you want to build a 32bit or 64bit viewer (32bit is default if omitted). You probably want to set this to `-A 64`. +- **--avx** will enable AVX optimizations for AVX-enabled CPUs. Mutually exclusive with --avx2. +- **--avx2** will enable AVX2 optimizations for AVX2-enabled CPUs. Mutually exclusive with --avx. +- **--clean** will cause autobuild to remove any previously compiled objects and fetched packages. It can be useful if you need to force a reload of all packages +- **--fmodstudio** will tell autobuiild to use the FmodStudio package when compiling. +- **--kdu** will tell autobuiild to use the KDU (Kakadu) package when compiling. +- **--package** makes sure all files are copied into viewers output directory. It will also result in a bzip2 archive of the completed viewer. Enabled by default, you would have to use **-DPACKAGE:BOOL=Off** to disable it +- **--chan \** will set a unique channel (and the name) for the viewer, appending whatever is defined to "Firestorm-". By default, the channel is "private" followed by your computer's name. +- **-LL_TESTS:BOOL=\** controls if the tests are compiled and run. There are quite a lot of them so excluding them is recommended unless you have some reason to need one or more of them. Most switches start with a double-dash (\--). And if you use any switches you must enclose them with a double-dash at the start and an optional double-dash at the end. > [!TIP] > **OFF** and **NO** are the same as **FALSE**; anything else is considered to be **TRUE** -Examples: +### Examples: ### ``` autobuild configure -A 64 -c ReleaseFS_open -- -DLL_TESTS:BOOL=FALSE diff --git a/doc/building_macos.md b/doc/building_macos.md index ce251a4673..986346b931 100644 --- a/doc/building_macos.md +++ b/doc/building_macos.md @@ -14,21 +14,33 @@ The steps listed below are expected to be run from a shell prompt. Simply copy a You will need to install the following tools: ### Xcode -- Xcode, It's a free download from Apple, but the latest version (12.x) is too new, so you will need to get an older version. -- To download a version that will work (11.7 in this case), go [here](https://developer.apple.com/download) and log in with an apple ID. -- Either find the 11.7 download in the list or use this [direct link](https://download.developer.apple.com/Developer_Tools/Xcode_11.7/Xcode_11.7.xip) (will prompt you to log in if you skipped the above step.) +XCode is a free download from Apple but you will need an Apple ID to login and access the download section. The current version used to compile Firestorm is 16.4. +- Go [here](https://developer.apple.com/download) and log in with an apple ID. +- Either find the 16.4 download in the list or use this [direct link](https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_16.4/Xcode_16.4.xip) (will prompt you to log in if you skipped the above step.) - Open the downloaded file and copy the Xcode application to the Applications folder. - Open Xcode at least once to set up everything to compile the viewer later on. - Test by running `clang --version` from the terminal window. -- It should report version 11 something (Apple clang version 11.0.3 (clang-1103.0.32.62) for example.) -- If it reports version 12, something is messed up and you installed Xcode 12. + - It should report version 17 something (Apple clang version 17.0.0 (clang-1700.0.13.5) for example). + - If it reports an inferior version, something is messed up and you installed another version of XCode. It might still work, but the supported version is currently 16.4. ### CMake -- Download [CMake](http://www.cmake.org/download) version 3.16.0 or higher +- Download [CMake](http://www.cmake.org/download) version 4.1.1 or higher - Open the downloaded file and copy CMake to the Applications folder. - You will need to install the command line links manually. To do this, run from the terminal: `sudo /Applications/CMake.app/Contents/MacOS/CMake --install` - Again, test by running: `cmake --version` from the terminal window. +### Optional: Set up a Python virtual environment + +If you do not want to install the required Python packages into the default Python directory, you can optionally create a virtual environment. + +- Create the Python virtual environment (only once): + `python -m venv .venv` +- Activate the virtual environment: + `source .venv/bin/activate` +- Activate the virtual environment each time you want to build. +- Type all the subsequent commands in this virtual environment. +- In case of issue or Python update, you can delete this .venv directory and create a new virtual environment again. + ### Pip The pip Python package installation tool is required for the next step. To install it, run from terminal: ``` @@ -38,63 +50,34 @@ sudo python3 get-pip.py ### Autobuild The Linden Lab [Autobuild](https://github.com/secondlife/autobuild) tool. +- Activate your Python virtual environment if you created one earlier - Use the following command to install it on your machine: ``` pip3 install --user -r requirements.txt ``` +If you created a Python virtual environment, autobuild will be located in .venv/bin/autobuild and already added to $PATH. But if you did not create a virtual environment, do the following: + - Add it to your PATH environment variable so it can be found by the shell. The macOS-approved way to do this is to issue the following command (This change will not take effect until the next time you open a Terminal window.): ``` -echo '~/Library/Python/3.7/bin/' | sudo tee /etc/paths.d/99-autobuild +echo '~/Library/Python/3.9/bin/' | sudo tee /etc/paths.d/99-autobuild ``` - If you do not want to close and re-open your terminal, type the following to add it your PATH (otherwise if you did close it down, re-open it as shown above [here](#obtaining-a-shell-to-work-with)): ``` -export PATH=$PATH:~/Library/Python/3.7/bin/ +export PATH=$PATH:~/Library/Python/3.9/bin/ ``` -- Check Autobuild version to be "autobuild 3.9.3" or higher: `autobuild --version` +- Once Autobuild is correctly installed, check Autobuild version to be "autobuild 3.9.6" or higher: `autobuild --version` ### Additional third party libraries -If you want to use licensed FMOD Studio API or KDU build libraries (they are optional) you have to provide these yourself. If you're building Firestorm as part of the project team, ask for the libraries for fmodstudio and kdu. Put them into `/opt/firestorm`. +If you want to use licensed FMOD Studio API or KDU (short for Kakadu) build libraries (they are optional) you have to provide these yourself. If you're building Firestorm as part of the project team, ask for the libraries for fmodstudio and kdu. Put them into `/opt/firestorm`. Some libraries like Kakadu or Havok require that you purchase a license so do not set the flags to include those packages if you do not have the according licenses. If you're a community builder, you'll need to build these libraries yourself, then change your autobuild.xml file to point to your own versions, or create a different autobuild.xml with your customizations, and use this with autobuild instead of our default autobuild.xml. There are some examples of how to build FMOD Studio on the LL Wiki and opensource-dev mailing list. We've created a non-KDU build target to make this easier. Everywhere you see "ReleaseFS" below, use "ReleaseFS_open" instead. This will perform the same build, using openjpeg instead of KDU and omitting FMOD Studio. -Available premade firestorm-specific build targets: - -``` -ReleaseFS (includes KDU, FMOD) -ReleaseFS_open (no KDU, no FMOD) -RelWithDebInfo_open (no KDU, no FMOD) -``` - -To build firestorm: - -``` -autobuild build -c ReleaseFS -``` - -Other examples: - -``` -autobuild configure -c ReleaseFS # basic configuration step, don't build, just configure -autobuild configure -c ReleaseFS -- --clean # clean the output area first, then configure -autobuild configure -c ReleaseFS -- --chan Private-Yourname # configure with a custom channel - -autobuild build -c ReleaseFS --no-configure # default quick rebuild -autobuild build -c ReleaseFS --no-configure -- --clean # Clean rebuild - -autobuild configure -c ReleaseFS_open -- # configure with no third-party libraries -autobuild configure -c ReleaseFS_open -- --fmodstudio # configure with FMOD Studio but no KDU -``` - -Any of the configure options can also be used (and do the same thing) with the build options. Typical LL autobuild configure options should also work, as long as they don't duplicate configuration we are already doing. - -Logs: Look for logs in `build-darwin-x86_64/logs`. - -Output: Look for output in `build-darwin-x86_64/newview/Release`. +You will probably want to have FMOD enabled and no Kakadu, in that case, you can use the ReleaseFS_open target with the --fmodstudio switch. ## Set up your source code tree @@ -124,6 +107,44 @@ Again, if you do not wish to restart your terminal: export AUTOBUILD_VARIABLES_FILE=~/firestorm/fs-build-variables/variables ``` +## Firestorm build targets +Available premade firestorm-specific build targets: + +``` +ReleaseFS (with KDU, with FMOD, no OpenSim) +ReleaseFS_open ( no KDU, no FMOD, no OpenSim) +ReleaseOS ( no KDU, no FMOD, with OpenSim) +RelWithDebInfoFS (with KDU, with FMOD, no OpenSim, with debug info) +RelWithDebInfoFS_open ( no KDU, no FMOD, no OpenSim, with debug info) +RelWithDebInfoOS ( no KDU, no FMOD, with OpenSim, with debug info) +``` + +To build firestorm: + +``` +autobuild build -c ReleaseFS +``` + +Other examples: + +``` +autobuild configure -c ReleaseFS # basic configuration step, don't build, just configure +autobuild configure -c ReleaseFS -- --clean # clean the output area first, then configure +autobuild configure -c ReleaseFS -- --chan Private-Yourname # configure with a custom channel + +autobuild build -c ReleaseFS --no-configure # default quick rebuild +autobuild build -c ReleaseFS --no-configure -- --clean # Clean rebuild + +autobuild configure -c ReleaseFS_open -- # configure with no third-party libraries +autobuild configure -c ReleaseFS_open -- --fmodstudio # configure with FMOD Studio but no KDU +``` + +Any of the configure options can also be used (and do the same thing) with the build options. Typical LL autobuild configure options should also work, as long as they don't duplicate configuration we are already doing. + +Logs: Look for logs in `build-darwin-x86_64/logs`. + +Output: Look for output in `build-darwin-x86_64/newview/Release`. + ## Prepare third party libraries Most third party libraries needed to build the viewer will be automatically downloaded for you and installed into the build directory within your source tree during compilation. Some need to be manually prepared and are not normally required when using an open source configuration (ReleaseFS_open). @@ -149,7 +170,7 @@ autobuild build autobuild package --results-file result.txt ``` -Near the top of the output you will see the package name written: +Near the top of the output you will see the package name written (version might differ): ``` wrote /Users/yourname/3p-fmodstudio/fmodstudio-2.01.05-darwin-202981448.tar.bz2 @@ -157,7 +178,7 @@ wrote /Users/yourname/3p-fmodstudio/fmodstudio-2.01.05-darwin-202981448.tar.bz2 Additionally, a file `result.txt` has been created containing the md5 hash value of the package file, which you will need in the next step. -- Next, update Firestorms autobuild.xml file to use your FMOD Studio. +- Next, make a copy of Firestorms autobuild.xml named for example my_autobuild.xml to use your FMOD Studio. ``` cd ~/firestorm/phoenix-firestorm @@ -192,13 +213,18 @@ This will configure the viewer for compiling with all defaults and without third There are a number of switches you can use to modify the configuration process. The name of each switch is followed by its type and then by the value you want to set. -- FMODSTUDIO (bool) controls if the FMOD Studio package is incorporated into the viewer. You must have performed the FMOD Studio installation steps in [FMOD Studio using autobuild](#fmod-studio-using-autobuild) for this to work. This is the switch the --fmodstudio build argument sets. -- LL_TESTS (bool) controls if the tests are compiled and run. There are quite a lot of them so excluding them is recommended unless you have some reason to need one or more of them. +- **-A \** sets the target architecture, that is if you want to build a 32bit or 64bit viewer (32bit is default if omitted). You probably want to set this to `-A 64`. +- **--clean** will cause autobuild to remove any previously compiled objects and fetched packages. It can be useful if you need to force a reload of all packages +- **--fmodstudio** controls if the FMOD Studio package is incorporated into the viewer. You must have performed the FMOD Studio installation steps in [FMOD Studio using autobuild](#fmod-studio-using-autobuild) for this to work. +- **--kdu** will tell autobuiild to use the KDU (Kakadu) package when compiling. +- **--package** makes sure all files are copied into viewers output directory. It will also generate a DMG installer package +- **--chan \** will set a unique channel (and the name) for the viewer, appending whatever is defined to "Firestorm-". By default, the channel is "private" followed by your computer's name. +- **-LL_TESTS:BOOL=\** controls if the tests are compiled and run. There are quite a lot of them so excluding them is recommended unless you have some reason to need one or more of them. > [!TIP] -> OFF and NO are the same as FALSE; anything else is considered to be TRUE +> **OFF** and **NO** are the same as **FALSE**; anything else is considered to be **TRUE** -Example: +### Example: ### ``` autobuild configure -A 64 -c ReleaseFS_open -- -DLL_TESTS:BOOL=FALSE -DFMODSTUDIO:BOOL=TRUE @@ -234,6 +260,8 @@ open build-darwin-x86_64/newview/Release From here you can run it directly or copy it to the Applications folder for ease of finding and running later. +If you used the --package switch, you will also find the DMG installer package in `build-darwin-x86_64/newview`. + ## Updating the viewer If you want to update your self-compiled viewer, you don't have to go through this entire page again. Follow these steps to pull down any new code and re-compile. @@ -243,6 +271,7 @@ If you want to update your self-compiled viewer, you don't have to go through th - If you have picked to do a clean build, run the following in the terminal window, otherwise skip to the next step: `rm -r build-darwin-x86_64` - If you are using a custom autobuild.xml file, then run the following in the terminal window, otherwise skip this step: `export AUTOBUILD_CONFIG_FILE=my_autobuild.xml` - Now, to pull down any new code, run the following in the terminal window: `git pull` +- If you are using a custom autobuild.xml file, compare my_autobuild.xml to autobuild.xml to see if anything has been updated and update your custom file accordingly. - After any new code is downloaded, it needs to be reconfigured. Run the following in the terminal window: `autobuild configure -A 64 -c ReleaseFS_open` - Finally, re-compile the viewer with the new changes. Again, in the terminal window, run: `autobuild build -A 64 -c ReleaseFS_open --no-configure` diff --git a/doc/building_windows.md b/doc/building_windows.md index 64f5b682db..09eb52d162 100644 --- a/doc/building_windows.md +++ b/doc/building_windows.md @@ -28,14 +28,31 @@ All installations are done with default settings (unless told explicitly) - if y > [!TIP] > If you don't own a copy of a commercial edition of Visual Studio 2022 (e.g. Professional), you might consider installing the [Community version](https://visualstudio.microsoft.com/free-developer-offers) -### Tortoise Git +### Command Prompt vs Powershell +- Make sure that you use the Windows Command Prompt / Terminal (cmd.exe) and not Powershell or it won't detect the Visual Studio build tools properly. -- Download and install [TortoiseGit 2.9.0 or newer](https://tortoisegit.org) (64bit) +### Git + +- If you prefer having a GUI for Git, download and install [TortoiseGit 2.17.0 or newer](https://tortoisegit.org) (64bit) - Note: No option available to install as Administrator - Use default options (path, components etc.) for Tortoise Git itself - At some point, it will ask you to download and install Git for Windows - You can install with default options **EXCEPT** when it asks for "Configuring the line endings conversion": You **MUST** select "Checkout as-is, commit as-is" here! +- If you prefer command line tools, you can also use and install the official [Git for Windows](https://git-scm.com/downloads/win). + - Uncheck "associate .sh files to be run with bash" + - Choose a good text editor such as VS Code or Sublime Text when asked to + - Select "Let Git decide the name of the initial branch" + - Select "Git from the command line and also from 3rd party software" + - Select "Use External SSH" + - Select "Use the native Windows Secure Channel library" + - Select "Checkout as-is, commit as-is" for line endings conversion. + - Select "Use Windows' default console window" + - Select "Fast-forward or merge" + - Select "Git Credential Manager" + - Check "Enable file system caching" + - Once installed, ensure that the git directory (C:\Program Files\Git\cmd) is in your PATH. + ### CMake - Download and install at least [CMake 3.16.0](http://www.cmake.org/download) @@ -56,9 +73,12 @@ All installations are done with default settings (unless told explicitly) - if y - Add additional packages: - Devel/patch - Use default options for everything else - - Make sure that the following directory was added to your path and that it is placed before "%SystemRoot%\system32": + - Make sure that the following directory was added to your path and that it is placed before "%SystemRoot%\system32" but after CMake path (in case you installed CMake in Cygwin): `C:\Cygwin64\bin` +> [!NOTE] +> The Cygwin terminal is only needed for testing. All commands for actually building the viewer will be run from the Windows command shell. + ### Python - Download and install the most recent version of [Python 3](https://www.python.org/downloads/windows) @@ -87,14 +107,25 @@ pip --version If they all report sensible values and not "Command not found" errors, then you are in good shape. -> [!NOTE] -> The Cygwin terminal is only needed for testing. All commands for actually building the viewer will be run from the Windows command shell. +### Optional: Set up a Python virtual environment + +If you do not want to install the required Python packages into the default Python directory, you can optionally create a virtual environment. + +- Create the Python Virtual Environment (only once). Open Windows Command Prompt and navigate to the directory where you want to install the virtual environment. To create the virtual environment, enter: + `python -m venv ` (`` is a placeholder for the name you want to use for the virtual environment) +- Activate the virtual environment by typing: + `\Scripts\activate.bat` +- Activate the virtual environment each time you want to build. +- Type all the subsequent commands in this virtual environment. +- In case of issue or Python update, you can delete this directory for the virtual environemt and create a new one again. ### Set up Autobuild - Install Autobuild You can install autobuild and its dependencies using the `requirements.txt` file that is part of the repo, this will build using the same versions that our official builds use. - - Open Windows Command Prompt and enter: pip install -r requirements.txt + - Open Windows Command Prompt + - If you created a Python virtual environment earlier, activate it + - Enter: pip install -r requirements.txt - Autobuild will be installed. **Earlier versions of Autobuild could be made to work by just putting the source files into your path correctly; this is no longer true - Autobuild _must_ be installed as described here.** - Open Windows Command Prompt and enter: `pip install git+https://github.com/secondlife/autobuild.git#egg=autobuild` @@ -136,7 +167,7 @@ git clone https://github.com/FirestormViewer/phoenix-firestorm.git ## Prepare third party libraries -Most third party libraries needed to build the viewer will be automatically downloaded for you and installed into the build directory within your source tree during compilation. Some need to be manually prepared and are not normally required when using an open source configuration (ReleaseFS_open). +Most third party libraries needed to build the viewer will be automatically downloaded for you and installed into the build directory within your source tree during compilation. Some need to be manually prepared and are not normally required when using an open source configuration (ReleaseFS_open). Some libraries like Kakadu or Havok requires you to purchase a license and you will need to figure out yourself how to build and use them. > [!IMPORTANT] > If you are manually building the third party libraries, you will have to build the correct version (32bit libraries for a 32bit viewer, 64bit versions for a 64bit viewer)! @@ -219,9 +250,14 @@ This will configure Firestorm to be built with all defaults and without third pa Available premade firestorm-specific build targets: ``` -ReleaseFS (includes KDU, FMOD) -ReleaseFS_open (no KDU, no FMOD) -RelWithDebInfoFS_open (no KDU, no FMOD) +ReleaseFS (with KDU, with FMOD, no OpenSim) +ReleaseFS_AVX (with KDU, with FMOD, no OpenSim, optimized for AVX-enabled CPUs) +ReleaseFS_AVX2 (with KDU, with FMOD, no OpenSim, optimized for AVX2-enabled CPUs) +ReleaseFS_open ( no KDU, no FMOD, no OpenSim) +ReleaseOS ( no KDU, no FMOD, with OpenSim) +RelWithDebInfoFS (with KDU, with FMOD, no OpenSim, with debug info) +RelWithDebInfoFS_open ( no KDU, no FMOD, no OpenSim, with debug info) +RelWithDebInfoOS ( no KDU, no FMOD, with OpenSim, with debug info) ``` > [!TIP] @@ -232,16 +268,20 @@ RelWithDebInfoFS_open (no KDU, no FMOD) There are a number of switches you can use to modify the configuration process. The name of each switch is followed by its type and then by the value you want to set. -- -A \ sets the target architecture, that is if you want to build a 32bit or 64bit viewer (32bit is default if omitted). -- --fmodstudio controls if the FMOD Studio package is incorporated into the viewer. You must have performed the FMOD Studio installation steps in [FMOD Studio using Autobuild](#fmod-studio-using-autobuild) for this to work. -- --package makes sure all files are copied into viewers output directory. You won't be able to start your compiled viewer if you don't enable package or do 'compile' it in VS. -- --chan \ lets you define a custom channel name for the viewer -- -LL_TESTS:BOOL=\ controls if the tests are compiled and run. There are quite a lot of them so excluding them is recommended unless you have some reason to need one or more of them. +- **-A \** sets the target architecture, that is if you want to build a 32bit or 64bit viewer (32bit is default if omitted). You probably want to set this to `-A 64`. +- **--avx** will enable AVX optimizations for AVX-enabled CPUs. Mutually exclusive with --avx2. +- **--avx2** will enable AVX2 optimizations for AVX2-enabled CPUs. Mutually exclusive with --avx. +- **--clean** will cause autobuild to remove any previously compiled objects and fetched packages. It can be useful if you need to force a reload of all packages. +- **--fmodstudio** controls if the FMOD Studio package is incorporated into the viewer. You must have performed the FMOD Studio installation steps in [FMOD Studio using Autobuild](#fmod-studio-using-autobuild) for this to work. You will not have any sound if you do not include FMOD. +- **--kdu** will tell autobuiild to use the KDU (Kakadu) package when compiling. +- **--package** makes sure all files are copied into viewers output directory. You won't be able to start your compiled viewer if you don't enable package or do 'compile' it in VS. It will also run NSIS to create a setup package. +- **--chan \** will set a unique channel (and the name) for the viewer, appending whatever is defined to "Firestorm-". By default, the channel is "private" followed by your computer's name. +- **-LL_TESTS:BOOL=\** controls if the tests are compiled and run. There are quite a lot of them so excluding them is recommended unless you have some reason to need one or more of them. > [!TIP] > **OFF** and **NO** are the same as **FALSE**; anything else is considered to be **TRUE** -Examples: +### Examples: ### - To build a 64bit viewer with FMOD Studio and to create an installer package, run this command in the Windows command window: `autobuild configure -A 64 -c ReleaseFS_open -- --fmodstudio --package --chan MyViewer -DLL_TESTS:BOOL=FALSE` @@ -255,6 +295,8 @@ There are two ways to build the viewer: Via Windows command line or from within ### Building from the Windows command line +Make sure that you are using the Windows Command Prompt / Terminal (cmd.exe) and not Powershell. + If you are building with FMOD Studio and have followed the previous FMOD Studio setup instructions AND you are now using a new terminal you will need to reset the environment variable with `set AUTOBUILD_CONFIG_FILE=my_autobuild.xml` diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index c120ad545d..c2c851bb08 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -243,7 +243,7 @@ if (LINUX OR DARWIN) endif () if(LINUX) - set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor -Wno-unused-variable -Wno-unused-but-set-variable -Wno-pragmas -Wno-deprecated") + set(GCC_CXX_WARNINGS "${GCC_WARNINGS} -Wno-reorder -Wno-non-virtual-dtor -Wno-unused-variable -Wno-pragmas -Wno-deprecated") endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0) diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index bcd5e30b1e..efc9cb6180 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -1070,6 +1070,7 @@ std::optional llstring_getoptenv(const std::string& key) long LLStringOps::sPacificTimeOffset = 0; long LLStringOps::sLocalTimeOffset = 0; bool LLStringOps::sPacificDaylightTime = 0; +bool LLStringOps::sUsingPacificTime = false; // [FIRE-34775] Use PST/PDT when logged into OpenSim std::map LLStringOps::datetimeToCodes; std::vector LLStringOps::sWeekDayList; @@ -1628,12 +1629,21 @@ bool LLStringUtil::formatDatetime(std::string& replacement, std::string token, } else { -#if 0 +// [FIRE-34775] Use PST/PDT when logged into OpenSim +#ifdef OPENSIM // EXT-1565 : Zai Lynch, James Linden : 15/Oct/09 // [BSI] Feedback: Viewer clock mentions SLT, but would prefer it to show PST/PDT // "slt" = Second Life Time, which is deprecated. // If not utc or user local time, fallback to Pacific time - replacement = LLStringOps::getPacificDaylightTime() ? "PDT" : "PST"; + if (LLStringOps::getUsingPacificTime()) + { + replacement = LLStringOps::getPacificDaylightTime() ? "PDT" : "PST"; + } + else + { + replacement = "SLT"; + } +// #else // SL-20370 : Steeltoe Linden : 29/Sep/23 // Change "PDT" to "SLT" on menu bar diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 07615aa027..9375534f3c 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -153,6 +153,7 @@ private: static long sPacificTimeOffset; static long sLocalTimeOffset; static bool sPacificDaylightTime; + static bool sUsingPacificTime; // [FIRE-34775] Use PST/PDT when logged into OpenSim static std::map datetimeToCodes; @@ -204,6 +205,9 @@ public: static S32 collate(const llwchar* a, const llwchar* b); static void setupDatetimeInfo(bool pacific_daylight_time); + // [FIRE-34775] Use PST/PDT when logged into OpenSim + static void setupUsingPacificTime(bool use_pacific_time) { sUsingPacificTime = use_pacific_time; } + // static void setupWeekDaysNames(const std::string& data); static void setupWeekDaysShortNames(const std::string& data); @@ -217,6 +221,9 @@ public: // Is the Pacific time zone (aka server time zone) // currently in daylight savings time? static bool getPacificDaylightTime(void) { return sPacificDaylightTime;} + // [FIRE-34775] Use PST/PDT when logged into OpenSim + static bool getUsingPacificTime() { return sUsingPacificTime; } + // static std::string getDatetimeCode (std::string key); diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 2bd6239dd3..0cc0646f63 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -576,15 +576,6 @@ public: } - if (!opj_setup_encoder(encoder, ¶meters, image)) - { - return false; - } - - opj_set_info_handler(encoder, opj_info, this); - opj_set_warning_handler(encoder, opj_warn, this); - opj_set_error_handler(encoder, opj_error, this); - U32 width_tiles = (rawImageIn.getWidth() >> 6); U32 height_tiles = (rawImageIn.getHeight() >> 6); @@ -598,6 +589,23 @@ public: height_tiles = 1; } + if (width_tiles == 1 || height_tiles == 1) + { + // Images with either dimension less than 32 need less number of resolutions otherwise they error + int min_dim = rawImageIn.getWidth() < rawImageIn.getHeight() ? rawImageIn.getWidth() : rawImageIn.getHeight(); + int max_res = 1 + (int)floor(log2(min_dim)); + parameters.numresolution = max_res; + } + + if (!opj_setup_encoder(encoder, ¶meters, image)) + { + return false; + } + + opj_set_info_handler(encoder, opj_info, this); + opj_set_warning_handler(encoder, opj_warn, this); + opj_set_error_handler(encoder, opj_error, this); + U32 tile_count = width_tiles * height_tiles; U32 data_size_guess = tile_count * TILE_SIZE; diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 5c3b7ded7a..63c4ea8ecb 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -2368,7 +2368,7 @@ bool LLVolume::unpackVolumeFacesInternal(const LLSD& mdl) const LLSD::Binary& pos = mdl[i]["Position"].asBinary(); const LLSD::Binary& norm = mdl[i]["Normal"].asBinary(); - const LLSD::Binary& tangent = mdl[i]["Tangent"].asBinary(); + // const LLSD::Binary& tangent = mdl[i]["Tangent"].asBinary(); // more set but unused const LLSD::Binary& tc = mdl[i]["TexCoord0"].asBinary(); const LLSD::Binary& idx = mdl[i]["TriangleList"].asBinary(); diff --git a/indra/llrender/llcubemaparray.cpp b/indra/llrender/llcubemaparray.cpp index 998b57217d..6799010789 100644 --- a/indra/llrender/llcubemaparray.cpp +++ b/indra/llrender/llcubemaparray.cpp @@ -123,7 +123,7 @@ LLCubeMapArray::LLCubeMapArray(LLCubeMapArray& lhs, U32 width, U32 count) : mTex GLint components = GL_RGB; if (mImage->getComponents() == 4) components = GL_RGBA; - GLint format = GL_RGB; + // GLint format = GL_RGB; // unused // Handle different resolutions by scaling the image LLPointer src_image = new LLImageRaw(lhs.mWidth, lhs.mWidth, lhs.mImage->getComponents()); diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index 58266fc2d8..495ba2f40f 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -316,11 +316,7 @@ void LLAccordionCtrl::ctrlShiftVertical(LLView* panel, S32 delta) //--------------------------------------------------------------------------------- -// If adding a lot of controls rapidly, calling arrange will cost a lot of times, as it's running through n! controls. -// In that case we can avvoid calling arrange over and over and just call it once when finished. -//void LLAccordionCtrl::addCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab) -void LLAccordionCtrl::addCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab, bool aArrange) -// +void LLAccordionCtrl::addCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab) { if (!accordion_tab) return; @@ -329,14 +325,7 @@ void LLAccordionCtrl::addCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab, bool mAccordionTabs.push_back(accordion_tab); accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLAccordionCtrl::onCollapseCtrlCloseOpen, this, (S16)(mAccordionTabs.size() - 1)) ); - - // If adding a lot of controls rapidly, calling arrange will cost a lot of times, as it's running through n! controls. - // In that case we can avvoid calling arrange over and over and just call it once when finished. - - // arrange(); - if( aArrange ) - arrange(); - // + arrange(); } void LLAccordionCtrl::removeCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab) diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index c4d7c276e1..43a33a2b3c 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -103,11 +103,7 @@ public: // Call reshape after changing splitter's size virtual void reshape(S32 width, S32 height, bool called_from_parent = true); - // If adding a lot of controls rapidly, calling arrange will cost a lot of times, as it's running through n! controls. - // In that case we can avvoid calling arrange over and over and just call it once when finished. - // void addCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab); - void addCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab, bool aArrange = true /*Standard is true as to not mess with old code all over the place*/ ); - // + void addCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab); void removeCollapsibleCtrl(LLAccordionCtrlTab* accordion_tab); void arrange(); diff --git a/indra/llui/llfiltereditor.cpp b/indra/llui/llfiltereditor.cpp index f7b3a1e9a6..1ce8a6d9d0 100644 --- a/indra/llui/llfiltereditor.cpp +++ b/indra/llui/llfiltereditor.cpp @@ -44,3 +44,11 @@ void LLFilterEditor::handleKeystroke() // Commit on every keystroke. onCommit(); } + +// Allow any UICtrl to override the transparency with a callback +void LLFilterEditor::setTransparencyOverrideCallback(boost::function cb) +{ + // Simply setting it on the LLFilterEditor object doesn't work + mSearchEditor->setTransparencyOverrideCallback(cb); +} +// diff --git a/indra/llui/llfiltereditor.h b/indra/llui/llfiltereditor.h index 685219c9f6..76a633eb45 100644 --- a/indra/llui/llfiltereditor.h +++ b/indra/llui/llfiltereditor.h @@ -45,6 +45,10 @@ public: {}; virtual ~LLFilterEditor() {} + // Allow any UICtrl to override the transparency with a callback + void setTransparencyOverrideCallback(boost::function cb) override; + // + protected: LLFilterEditor(const Params&); friend class LLUICtrlFactory; diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index c971c70314..812063feda 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -378,7 +378,7 @@ protected: virtual bool hasParent() override { return mParent != NULL; } // - virtual LLFolderViewModelItem* getParent() const { return mParent; } + virtual LLFolderViewModelItem* getParent() const override { return mParent; } S32 mSortVersion; bool mPassedFilter; diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index e23acd85b9..5f77c3346f 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -1086,6 +1086,13 @@ F32 LLUICtrl::getCurrentTransparency() } + // Allow any UICtrl to override the transparency with a callback + if (mTransparencyOverrideCallback) + { + return mTransparencyOverrideCallback(mTransparencyType, alpha); + } + // + return alpha; } diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 4be0a23261..13ab720ef4 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -238,6 +238,11 @@ public: void setTransparencyType(ETypeTransparency type); ETypeTransparency getTransparencyType() const {return mTransparencyType;} + // Allow any UICtrl to override the transparency with a callback + boost::function mTransparencyOverrideCallback; + virtual void setTransparencyOverrideCallback(boost::function cb) { mTransparencyOverrideCallback = cb; } + // + bool focusNextItem(bool text_entry_only); bool focusPrevItem(bool text_entry_only); diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index b26a34e470..77f5bec5b2 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.2.1 +7.2.2 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 473ae81e32..d7f957bb82 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -18420,6 +18420,17 @@ Change of this parameter will affect the layout of buttons in notification toast Value 0 + fsregioncornerbeacons + + Comment + Show beacons at region corners to help avoid region boundary disconnects + Persist + 1 + Type + Boolean + Value + 0 + renderhighlights Comment @@ -23992,6 +24003,17 @@ Change of this parameter will affect the layout of buttons in notification toast Value 0 + FSRestoreOpenIMs + + Comment + Restore open IM windows from the previous session on startup. + Persist + 1 + Type + Boolean + Value + 0 + FSUseBuiltInHistory Comment @@ -26949,5 +26971,51 @@ Change of this parameter will affect the layout of buttons in notification toast Value 0 + FSIMOpacity + + Comment + Opacity of the IM floater + Persist + 1 + Type + F32 + Value + 1.0 + + FSImActiveOpacityOverride + + Comment + When enabled, uses the Active Opacity value when IM window is focused + Persist + 1 + Type + Boolean + Value + 0 + + FSDisableNeighbourRegionConnections + + Comment + Do not connect to neighbouring regions, only to the current region (limits region crossing) - experimental + Persist + 1 + Type + Boolean + Value + 0 + + FSLargeOutfitsWarningInThisSession + + Comment + Internal; Suppresses the 'too many outfits' warning (does not persist across sessions) + HideFromEditor + 1 + Persist + 0 + Type + Boolean + Value + 0 + diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index ce0a20c443..4193a4edca 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -876,6 +876,18 @@ Value 0 + FSLastOpenIMs + + Comment + List of IM session IDs that were open when the viewer was last closed + Persist + 1 + Type + LLSD + Value + + + FSKeywordCaseSensitive Comment diff --git a/indra/newview/fsfloatercontacts.cpp b/indra/newview/fsfloatercontacts.cpp index e3f08b2ac3..03c3cd8e95 100644 --- a/indra/newview/fsfloatercontacts.cpp +++ b/indra/newview/fsfloatercontacts.cpp @@ -131,6 +131,9 @@ bool FSFloaterContacts::postBuild() mFriendsCountTb->setTextArg("COUNT", llformat("%d", mFriendsList->getItemCount())); mFriendFilter = mFriendsTab->getChild("friend_filter_input"); mFriendFilter->setCommitCallback(boost::bind(&FSFloaterContacts::onFriendFilterEdit, this, _2)); + // [FIRE-35804] Allow the IM floater to have separate transparency + mFriendFilter->setTransparencyOverrideCallback(boost::bind(&FSFloaterContacts::onGetFilterOpacityCallback, this, _1, _2)); + // mGroupsTab = getChild(GROUP_TAB_NAME); mGroupList = mGroupsTab->getChild("group_list"); @@ -163,6 +166,9 @@ bool FSFloaterContacts::postBuild() mGroupssCountTb = mGroupsTab->getChild("groupcount"); mGroupFilter = mGroupsTab->getChild("group_filter_input"); mGroupFilter->setCommitCallback(boost::bind(&FSFloaterContacts::onGroupFilterEdit, this, _2)); + // [FIRE-35804] Allow the IM floater to have separate transparency + mGroupFilter->setTransparencyOverrideCallback(boost::bind(&FSFloaterContacts::onGetFilterOpacityCallback, this, _1, _2)); + // mRlvBehaviorCallbackConnection = gRlvHandler.setBehaviourCallback(boost::bind(&FSFloaterContacts::updateRlvRestrictions, this, _1)); @@ -1345,4 +1351,19 @@ void FSFloaterContacts::onGroupFilterEdit(const std::string& search_string) { mGroupList->setNameFilter(search_string); } + +// [FIRE-35804] Allow the IM floater to have separate transparency +// This is specifically for making the filter editors such as mFriendFilter and mGroupFilter always active opacity when the IM floater is focused +// Otherwise if they aren't active, it will use either the IM opacity, or inactive opacity, whatever is smaller +F32 FSFloaterContacts::onGetFilterOpacityCallback(ETypeTransparency type, F32 alpha) +{ + static LLCachedControl im_opacity(gSavedSettings, "FSIMOpacity", 1.0f); + if (type != TT_ACTIVE) + { + return llmin(im_opacity, alpha); + } + + return alpha; +} +// // EOF diff --git a/indra/newview/fsfloatercontacts.h b/indra/newview/fsfloatercontacts.h index 660ed8905b..5c3061eff3 100644 --- a/indra/newview/fsfloatercontacts.h +++ b/indra/newview/fsfloatercontacts.h @@ -70,6 +70,10 @@ public: void onDisplayNameChanged(); void resetFriendFilter(); + // [FIRE-35804] Allow the IM floater to have separate transparency + F32 onGetFilterOpacityCallback(ETypeTransparency type, F32 alpha); + // + private: typedef std::vector listitem_vec_t; diff --git a/indra/newview/fsfloaterim.cpp b/indra/newview/fsfloaterim.cpp index ef83dd0f4f..2521526440 100644 --- a/indra/newview/fsfloaterim.cpp +++ b/indra/newview/fsfloaterim.cpp @@ -1010,6 +1010,9 @@ bool FSFloaterIM::postBuild() mInputEditor->setFont(LLViewerChat::getChatFont()); mInputEditor->enableSingleLineMode(gSavedSettings.getBOOL("FSUseSingleLineChatEntry")); mInputEditor->setCommitCallback(boost::bind(&FSFloaterIM::sendMsgFromInputEditor, this, CHAT_TYPE_NORMAL)); + // [FIRE-35804] Allow the IM floater to have separate transparency + mInputEditor->setTransparencyOverrideCallback(boost::bind(&FSFloaterIM::onGetChatEditorOpacityCallback, this, _1, _2)); + // mEmojiRecentPanelToggleBtn = getChild("emoji_recent_panel_toggle_btn"); mEmojiRecentPanelToggleBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiRecentPanelToggleBtnClicked(); }); @@ -2650,3 +2653,18 @@ uuid_vec_t FSFloaterIM::getSessionParticipants() const return mControlPanel->getParticipants(); } + +// [FIRE-35804] Allow the IM floater to have separate transparency +// This is specifically for making the text editors such as chat_editor always active opacity when the IM floater is focused +// Otherwise if they aren't active, it will use either the IM opacity, or inactive opacity, whatever is smaller +F32 FSFloaterIM::onGetChatEditorOpacityCallback(ETypeTransparency type, F32 alpha) +{ + static LLCachedControl im_opacity(gSavedSettings, "FSIMOpacity", 1.0f); + if (type != TT_ACTIVE) + { + return llmin(im_opacity, alpha); + } + + return alpha; +} +// diff --git a/indra/newview/fsfloaterim.h b/indra/newview/fsfloaterim.h index 0b5d65bf7e..3d20957063 100644 --- a/indra/newview/fsfloaterim.h +++ b/indra/newview/fsfloaterim.h @@ -164,6 +164,10 @@ public: uuid_vec_t getSessionParticipants() const; + // [FIRE-35804] Allow the IM floater to have separate transparency + F32 onGetChatEditorOpacityCallback(ETypeTransparency type, F32 alpha); + // + protected: /* virtual */ void onClickCloseBtn(bool app_quitting = false); diff --git a/indra/newview/fsfloaterimcontainer.cpp b/indra/newview/fsfloaterimcontainer.cpp index a4db0dc21a..2ad367287e 100644 --- a/indra/newview/fsfloaterimcontainer.cpp +++ b/indra/newview/fsfloaterimcontainer.cpp @@ -42,6 +42,11 @@ #include "llurlregistry.h" #include "llvoiceclient.h" +// Restore open IMs from previous session +#include "llconversationlog.h" +#include "llimview.h" +// + constexpr F32 VOICE_STATUS_UPDATE_INTERVAL = 1.0f; // @@ -173,6 +178,7 @@ void FSFloaterIMContainer::onClose(bool app_quitting) { if (app_quitting) { + saveOpenIMs(); // Save open IM sessions before closing for (S32 i = 0; i < mTabContainer->getTabCount(); ++i) { FSFloaterIM* floater = dynamic_cast(mTabContainer->getPanelByIndex(i)); @@ -373,6 +379,22 @@ FSFloaterIMContainer* FSFloaterIMContainer::getInstance() return LLFloaterReg::getTypedInstance("fs_im_container"); } +// [FIRE-35804] Allow the IM floater to have separate transparency +F32 FSFloaterIMContainer::getCurrentTransparency() +{ + static LLCachedControl im_opacity(gSavedSettings, "FSIMOpacity", 1.0f); + static LLCachedControl im_active_opacity_override(gSavedSettings, "FSImActiveOpacityOverride", false); + + F32 floater_opacity = LLUICtrl::getCurrentTransparency(); + if (im_active_opacity_override && getTransparencyType() == TT_ACTIVE) + { + return floater_opacity; + } + + return llmin(im_opacity(), floater_opacity); +} +// + void FSFloaterIMContainer::setVisible(bool b) { LLMultiFloater::setVisible(b); @@ -600,4 +622,74 @@ void FSFloaterIMContainer::startFlashingTab(LLFloater* floater, const std::strin } LLMultiFloater::setFloaterFlashing(floater, true, is_alt_flashing); } + +// Restore open IMs from previous session +void FSFloaterIMContainer::saveOpenIMs() +{ + if (!gSavedSettings.getBOOL("FSRestoreOpenIMs")) + { + gSavedPerAccountSettings.setLLSD("FSLastOpenIMs", LLSD::emptyArray()); + return; + } + + LLSD openIMs = LLSD::emptyArray(); + for (S32 i = 0; i < mTabContainer->getTabCount(); ++i) + { + FSFloaterIM* floater = dynamic_cast(mTabContainer->getPanelByIndex(i)); + if (floater) + { + LLUUID session_id = floater->getKey(); + if (session_id.notNull()) + { + LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id); + if (session && session->mSessionType == LLIMModel::LLIMSession::P2P_SESSION) + { + LLSD session_data = LLSD::emptyMap(); + session_data["other_participant_id"] = session->mOtherParticipantID; + session_data["session_name"] = session->mName; + openIMs.append(session_data); + } + } + } + } + + gSavedPerAccountSettings.setLLSD("FSLastOpenIMs", openIMs); +} + +void FSFloaterIMContainer::restoreOpenIMs() +{ + LLSD openIMs = gSavedPerAccountSettings.getLLSD("FSLastOpenIMs"); + if (!openIMs.isArray() || openIMs.size() == 0) + { + return; + } + + for (LLSD::array_const_iterator it = openIMs.beginArray(); it != openIMs.endArray(); ++it) + { + LLSD session_data = *it; + if (session_data.isMap()) + { + LLUUID other_participant_id = session_data["other_participant_id"].asUUID(); + std::string session_name = session_data["session_name"].asString(); + if (other_participant_id.notNull()) + { + LLUUID new_session_id; + new_session_id = LLIMMgr::getInstance()->addSession(session_name, IM_NOTHING_SPECIAL, other_participant_id); + if (new_session_id.notNull()) + { + FSFloaterIM* im_floater = FSFloaterIM::show(new_session_id); + if (im_floater) + { + if (im_floater->getHost() != this) + { + addFloater(im_floater, false); + } + } + } + } + } + } +} +// + // EOF diff --git a/indra/newview/fsfloaterimcontainer.h b/indra/newview/fsfloaterimcontainer.h index 50b9b36d1f..21b790d26f 100644 --- a/indra/newview/fsfloaterimcontainer.h +++ b/indra/newview/fsfloaterimcontainer.h @@ -41,17 +41,16 @@ public: FSFloaterIMContainer(const LLSD& seed); virtual ~FSFloaterIMContainer(); - /*virtual*/ bool postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - /*virtual*/ void onClose(bool app_quitting); + bool postBuild() override; + void onOpen(const LLSD& key) override; + void onClose(bool app_quitting) override; void onCloseFloater(LLUUID& id); - /*virtual*/ void draw(); - - /*virtual*/ void addFloater(LLFloater* floaterp, - bool select_added_floater, - LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END); + void draw() override; + void addFloater(LLFloater* floaterp, + bool select_added_floater, + LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END) override; // [SL:KB] - Patch: Chat-NearbyChatBar | Checked: 2011-12-11 (Catznip-3.2.0d) | Added: Catznip-3.2.0d - /*virtual*/ void removeFloater(LLFloater* floaterp); + void removeFloater(LLFloater* floaterp) override; // [/SL:KB] bool hasFloater(LLFloater* floaterp); @@ -60,26 +59,33 @@ public: static FSFloaterIMContainer* findInstance(); static FSFloaterIMContainer* getInstance(); - virtual void setVisible(bool b); - /*virtual*/ void setMinimized(bool b); + F32 getCurrentTransparency() override; - void onNewMessageReceived(const LLSD& msg); // public so nearbychat can call it directly. TODO: handle via callback. -AO + void setVisible(bool b) override; + void setMinimized(bool b) override; - 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); + void onNewMessageReceived(const LLSD& msg); + + void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, bool has_offline_msg) override; + void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) override {}; + void sessionVoiceOrIMStarted(const LLUUID& session_id) override {}; + void sessionRemoved(const LLUUID& session_id) override; + void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) override; static void reloadEmptyFloaters(); void initTabs(); void addFlashingSession(const LLUUID& session_id); - void tabOpen(LLFloater* opened_floater, bool from_click); + void tabOpen(LLFloater* opened_floater, bool from_click) override; void startFlashingTab(LLFloater* floater, const std::string& message); + // Restore open IMs from previous session + void saveOpenIMs(); + void restoreOpenIMs(); + // + private: enum eVoiceState { diff --git a/indra/newview/fsfloaternearbychat.cpp b/indra/newview/fsfloaternearbychat.cpp index 80e58347e8..51e1d31fad 100644 --- a/indra/newview/fsfloaternearbychat.cpp +++ b/indra/newview/fsfloaternearbychat.cpp @@ -148,6 +148,9 @@ bool FSFloaterNearbyChat::postBuild() mInputEditor->setFont(LLViewerChat::getChatFont()); mInputEditor->setLabel(getString("chatbox_label")); mInputEditor->enableSingleLineMode(gSavedSettings.getBOOL("FSUseSingleLineChatEntry")); + // [FIRE-35804] Allow the IM floater to have separate transparency + mInputEditor->setTransparencyOverrideCallback(boost::bind(&FSFloaterNearbyChat::onGetChatBoxOpacityCallback, this, _1, _2)); + // mChatLayoutPanel = getChild("chat_layout_panel"); mInputPanels = getChild("input_panels"); @@ -1107,3 +1110,18 @@ uuid_vec_t FSFloaterNearbyChat::getSessionParticipants() const return avatarIds; } + +// [FIRE-35804] Allow the IM floater to have separate transparency +// This is specifically for making the text editors such as chat_editor always active opacity when the IM floater is focused +// Otherwise if they aren't active, it will use either the IM opacity, or inactive opacity, whatever is smaller +F32 FSFloaterNearbyChat::onGetChatBoxOpacityCallback(ETypeTransparency type, F32 alpha) +{ + static LLCachedControl im_opacity(gSavedSettings, "FSIMOpacity", 1.0f); + if (type != TT_ACTIVE) + { + return llmin(im_opacity, alpha); + } + + return alpha; +} +// diff --git a/indra/newview/fsfloaternearbychat.h b/indra/newview/fsfloaternearbychat.h index 37641a4be3..ee485e5498 100644 --- a/indra/newview/fsfloaternearbychat.h +++ b/indra/newview/fsfloaternearbychat.h @@ -104,6 +104,10 @@ public: uuid_vec_t getSessionParticipants() const; + // [FIRE-35804] Allow the IM floater to have separate transparency + F32 onGetChatBoxOpacityCallback(ETypeTransparency type, F32 alpha); + // + protected: void onChatBoxKeystroke(); void onChatBoxFocusLost(); diff --git a/indra/newview/fspanelface.cpp b/indra/newview/fspanelface.cpp index 5ec5738064..39becffb47 100644 --- a/indra/newview/fspanelface.cpp +++ b/indra/newview/fspanelface.cpp @@ -1122,10 +1122,10 @@ LLMaterialPtr FSPanelFace::createDefaultMaterial(LLMaterialPtr current_material) void FSPanelFace::onVisibilityChange(bool new_visibility) { - if (new_visibility) + /* if (new_visibility) { gAgent.showLatestFeatureNotification("gltf"); - } + } */ LLPanel::onVisibilityChange(new_visibility); // Since we allow both PBR and BP textures to be applied at the same time, diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index c77d1b7493..d7a8dc0a22 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -719,6 +719,13 @@ void LLAgent::showLatestFeatureNotification(const std::string key) flag = 4; } + // FIRE-35931 Guard against empty "new feature" popup + if (flag == 0) + { + return; + } + // + if ((flags & flag) == 0) { // Need to open on top even if called from onOpen, diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index d2bb1325ce..7280c79ee5 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -5322,7 +5322,7 @@ bool wear_category(const LLSD& query_map, bool append) { if (LLViewerInventoryCategory* cat = gInventory.getCategory(folder_uuid)) { - if (bool is_library = gInventory.isObjectDescendentOf(folder_uuid, gInventory.getRootFolderID())) + if (gInventory.isObjectDescendentOf(folder_uuid, gInventory.getRootFolderID())) // set and unused { LLPointer new_category = new LLInventoryCategory(folder_uuid, LLUUID::null, LLFolderType::FT_CLOTHING, "Quick Appearance"); LLAppearanceMgr::getInstance()->wearInventoryCategory(new_category, true, append); diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 92759d9d49..d8dc8ec549 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -166,8 +166,8 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass) //bool has_normal_mips = gSavedSettings.getBOOL("RenderWaterMipNormal"); bool has_normal_mips = mRenderWaterMipNormal; bool underwater = LLViewerCamera::getInstance()->cameraUnderWater(); - LLColor4 fog_color = LLColor4(pwater->getWaterFogColor(), 0.f); - LLColor3 fog_color_linear = linearColor3(fog_color); + // LLColor4 fog_color = LLColor4(pwater->getWaterFogColor(), 0.f); // set but unused + // LLColor3 fog_color_linear = linearColor3(fog_color); // set but unused if (sun_up) { @@ -244,11 +244,12 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass) F32 fog_density = pwater->getModifiedWaterFogDensity(underwater); shader->bindTexture(LLShaderMgr::WATER_SCREENTEX, &gPipeline.mWaterDis); - - if (mShaderLevel == 1) - { - fog_color.mV[VALPHA] = (F32)(log(fog_density) / log(2)); - } + // set but unused "fog_color" + // if (mShaderLevel == 1) + // { + // fog_color.mV[VALPHA] = (F32)(log(fog_density) / log(2)); + // } + // F32 water_height = environment.getWaterHeight(); F32 camera_height = LLViewerCamera::getInstance()->getOrigin().mV[2]; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index ba5e40d832..e18bd47947 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -597,7 +597,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color) // on faces with GLTF textures we use a spectal vertex buffer with other transforms if (const LLTextureEntry* te = getTextureEntry()) { - if (LLGLTFMaterial* gltf_mat = te->getGLTFRenderMaterial()) + if (te->getGLTFRenderMaterial()) { vertex_buffer = mVertexBufferGLTF.get(); } diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 73b7fa7c9c..eaacb6704f 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -754,6 +754,10 @@ void LLFloaterCamera::updateItemsSelection() getChild("group_view")->setValue(argument); argument["selected"] = (preset == CAMERA_PRESET_FRONT_VIEW) && !sFreeCamera; getChild("front_view")->setValue(argument); +// Third Person Perspective camera + argument["selected"] = (preset == CAMERA_PRESET_TPP_VIEW) && !sFreeCamera; + getChild("tpp_view")->setValue(argument); +// argument["selected"] = gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK; getChild("mouselook_view")->setValue(argument); argument["selected"] = mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA; diff --git a/indra/newview/llfloatergltfasseteditor.cpp b/indra/newview/llfloatergltfasseteditor.cpp index a127f5d43e..229317a3c9 100644 --- a/indra/newview/llfloatergltfasseteditor.cpp +++ b/indra/newview/llfloatergltfasseteditor.cpp @@ -299,7 +299,7 @@ void LLFloaterGLTFAssetEditor::loadFromSelection() setTitle(node->mName); } - LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE); + // LLUIColor item_color = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE); // set but unused for (S32 i = 0; i < mAsset->mScenes.size(); i++) { LL::GLTF::Scene& scene = mAsset->mScenes[i]; diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index c4d4eae860..92e79968a0 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -459,7 +459,7 @@ void LLFloaterImagePreview::onBtnOK() void LLFloaterImagePreview::draw() { LLFloater::draw(); - LLRect r = getRect(); + // LLRect r = getRect(); set but unused if (mRawImagep.notNull()) { diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index d9b016f8e2..d98520bef6 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1978,7 +1978,7 @@ void LLFloaterPreference::changeExternalEditorPath(const std::vector another new complaint from clang char executable_buf[max_file_length]; if (CFStringGetCString(executable_cfstr, executable_buf, max_file_length, kCFStringEncodingMacRoman)) // convert CFStringRef to char* { diff --git a/indra/newview/llhudeffectresetskeleton.cpp b/indra/newview/llhudeffectresetskeleton.cpp index 31065a3e76..2bb5696f59 100644 --- a/indra/newview/llhudeffectresetskeleton.cpp +++ b/indra/newview/llhudeffectresetskeleton.cpp @@ -53,6 +53,15 @@ LLHUDEffectResetSkeleton::~LLHUDEffectResetSkeleton() { } +//----------------------------------------------------------------------------- +// packData() +//----------------------------------------------------------------------------- +void LLHUDEffectResetSkeleton::render() +{ + // HUDEffectResetSkeleton is a fake effect meant to reset skeleton only. + // Just wait for an update() call to do its work and then die. +} + //----------------------------------------------------------------------------- // packData() //----------------------------------------------------------------------------- diff --git a/indra/newview/llhudeffectresetskeleton.h b/indra/newview/llhudeffectresetskeleton.h index 39a6137054..c89516d7fc 100644 --- a/indra/newview/llhudeffectresetskeleton.h +++ b/indra/newview/llhudeffectresetskeleton.h @@ -38,20 +38,21 @@ class LLHUDEffectResetSkeleton final : public LLHUDEffect public: friend class LLHUDObject; - /*virtual*/ void markDead(); - /*virtual*/ void setSourceObject(LLViewerObject* objectp); + /*virtual*/ void markDead() override; + /*virtual*/ void setSourceObject(LLViewerObject* objectp) override; - void setTargetObject(LLViewerObject *objp); + void setTargetObject(LLViewerObject *objp) override; void setResetAnimations(bool enable){ mResetAnimations = enable; }; protected: LLHUDEffectResetSkeleton(const U8 type); ~LLHUDEffectResetSkeleton(); - /*virtual*/ void packData(LLMessageSystem *mesgsys); - /*virtual*/ void unpackData(LLMessageSystem *mesgsys, S32 blocknum); + void render() override; + void packData(LLMessageSystem *mesgsys) override; + void unpackData(LLMessageSystem *mesgsys, S32 blocknum) override; - void update(); + void update() override; private: bool mResetAnimations; }; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 9e765bab82..161cab8ce1 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -2417,6 +2417,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes } if (request_skin) { + LLMutexLock lock(mMutex); mSkinRequests.push_back(UUIDBasedRequest(mesh_id)); } } diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 9b35bf425d..f81bc78ed0 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -220,11 +220,7 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id) // *TODO: LLUICtrlFactory::defaultBuilder does not use "display_children" from xml. Should be investigated. tab->setDisplayChildren(false); - - // Calling this when there's a lot of outfits causes horrible perfomance and disconnects, due to arrange eating so many cpu cycles. - //mAccordion->addCollapsibleCtrl(tab); - mAccordion->addCollapsibleCtrl(tab, false); - // + mAccordion->addCollapsibleCtrl(tab); // Start observing the new outfit category. LLWearableItemsList* list = tab->getChild("wearable_items_list"); @@ -1120,8 +1116,21 @@ void LLOutfitListBase::refreshList(const LLUUID& category_id) } // FIRE-6958/VWR-2862; Handle large amounts of outfits, write a least a warning into the logs. - if (mRefreshListState.Added.size() > 128) - LL_WARNS() << "Large amount of outfits found: " << mRefreshListState.Added.size() << " this may cause hangs and disconnects" << LL_ENDL; + S32 currentOutfitsAmount = (S32)mRefreshListState.Added.size(); + constexpr S32 maxSuggestedOutfits = 200; + if (currentOutfitsAmount > maxSuggestedOutfits) + { + LL_WARNS() << "Large amount of outfits found: " << currentOutfitsAmount << " this may cause hangs and disconnects" << LL_ENDL; + static LLCachedControl fsLargeOutfitsWarningInThisSession(gSavedSettings, "FSLargeOutfitsWarningInThisSession"); + if (!fsLargeOutfitsWarningInThisSession) + { + gSavedSettings.setBOOL("FSLargeOutfitsWarningInThisSession", true); + LLSD args; + args["AMOUNT"] = currentOutfitsAmount; + args["MAX"] = maxSuggestedOutfits; + LLNotificationsUtil::add("FSLargeOutfitsWarningInThisSession", args); + } + } // // FIRE-12939: Add outfit count to outfits list @@ -1157,7 +1166,18 @@ void LLOutfitListBase::onIdleRefreshList() return; } - const F64 MAX_TIME = 0.05f; + // Scale MAX_TIME with FPS to avoid overloading the viewer with function calls at low frame rates + // const F64 MAX_TIME = 0.05f; + F64 MAX_TIME = 0.05f; + constexpr F64 min_time = 0.001f; + constexpr F64 threshold_fps = 30.0; + const auto current_fps = LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, 1); + if (current_fps < threshold_fps) + { + MAX_TIME = min_time + (current_fps / threshold_fps) * (MAX_TIME - min_time); + } + // + F64 curent_time = LLTimer::getTotalSeconds(); const F64 end_time = curent_time + MAX_TIME; @@ -1174,9 +1194,6 @@ void LLOutfitListBase::onIdleRefreshList() mRefreshListState.Added.clear(); mRefreshListState.AddedIterator = mRefreshListState.Added.end(); - // We called mAccordion->addCollapsibleCtrl with false as second paramter and did not let it arrange itself each time. Do this here after all is said and done. - arrange(); - // Handle removed tabs. while (mRefreshListState.RemovedIterator < mRefreshListState.Removed.end()) { @@ -1200,8 +1217,8 @@ void LLOutfitListBase::onIdleRefreshList() // Links aren't supposed to be allowed here, check only cats if (cat) - { - std::string name = cat->getName(); + { + std::string name = cat->getName(); updateChangedCategoryName(cat, name); } diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp index 831ad7827a..6136d72882 100644 --- a/indra/newview/llpanelenvironment.cpp +++ b/indra/newview/llpanelenvironment.cpp @@ -1100,7 +1100,7 @@ void LLPanelEnvironmentInfo::onEnvironmentChanged(LLEnvironment::EnvSelection_t else if ((env == LLEnvironment::ENV_PARCEL) && (getParcelId() == LLViewerParcelMgr::instance().getAgentParcelId())) { - if (LLParcel* parcel = getParcel()) + if (getParcel()) // more set-but-unused { // first for parcel own settings, second is for case when parcel uses region settings if (mCurEnvVersion < new_version diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 55b6a859d2..5aa420ff5c 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -365,6 +365,12 @@ void LLSidepanelAppearance::toggleMyOutfitsPanel(bool visible, const std::string mFilterEditor->setVisible(visible); mCurrOutfitPanel->setVisible(visible); + // FIRE-35947 Ensure the top menu buttons (gear/sort/trash) are only visible in the outfits panel + getChildView("options_gear_btn_panel")->setVisible(visible); + getChildView("options_sort_btn_panel")->setVisible(visible); + getChildView("trash_btn_panel")->setVisible(visible); + // + if (visible) { mPanelOutfitsInventory->onOpen(LLSD()); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index c693c9ff25..6e0bb1d39d 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3385,6 +3385,14 @@ bool idle_startup() } // + // Restore open IMs from previous session + if (gSavedSettings.getBOOL("FSRestoreOpenIMs")) + { + FSFloaterIMContainer* floater_imcontainer = FSFloaterIMContainer::getInstance(); + floater_imcontainer->restoreOpenIMs(); + } + // + return true; } @@ -4875,6 +4883,9 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y //setup map of datetime strings to codes and slt & local time offset from utc LLStringOps::setupDatetimeInfo(pacific_daylight_time); + // [FIRE-34775] Use PST/PDT when logged into OpenSim + LLStringOps::setupUsingPacificTime(!LLGridManager::getInstance()->isInSecondLife()); + // } // set up the voice configuration. Ultimately, we should pass this up as part of each voice diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index a87494062c..2bf13b9317 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -1030,7 +1030,7 @@ void LLSurfacePatch::updateGL() F32 grids_per_patch_edge = (F32)getSurface()->getGridsPerPatchEdge(); LLViewerRegion *regionp = getSurface()->getRegion(); - LLVector3d origin_region = getOriginGlobal() - getSurface()->getOriginGlobal(); + // LLVector3d origin_region = getOriginGlobal() - getSurface()->getOriginGlobal(); // set but not used LLVLComposition* comp = regionp->getComposition(); diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index 963de67bdf..a86309754b 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -160,9 +160,9 @@ bool LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVecto // update pixel meter ratio using default fov, not modified one mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f))); // update screen pixel area + mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect())); return true; - mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect())); } const LLMatrix4 &LLViewerCamera::getProjection() const diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d31df58e99..5c46be454c 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -8284,7 +8284,7 @@ class LLAvatarEnableResetSkeleton : public view_listener_t { bool handleEvent(const LLSD& userdata) { - if (LLVOAvatar* avatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject())) + if (find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject())) // set but unused. { return true; } @@ -11584,6 +11584,13 @@ class LLViewToggleBeacon : public view_listener_t LLPipeline::toggleRenderSoundBeacons(); gSavedSettings.setBOOL( "soundsbeacon", LLPipeline::getRenderSoundBeacons() ); } + // FIRE-33085 Region corner markers + else if (beacon == "fsregioncornerbeacons") + { + LLPipeline::toggleRenderRegionCornerBeacons(); + gSavedSettings.setBOOL( "fsregioncornerbeacons", LLPipeline::getRenderRegionCornerBeacons() ); + } + // else if (beacon == "particlesbeacon") { LLPipeline::toggleRenderParticleBeacons(); @@ -11661,6 +11668,13 @@ class LLViewCheckBeaconEnabled : public view_listener_t new_value = gSavedSettings.getBOOL( "soundsbeacon"); LLPipeline::setRenderSoundBeacons(new_value); } + // FIRE-33085 Region corner markers + else if (beacon == "fsregioncornerbeacons") + { + new_value = gSavedSettings.getBOOL( "fsregioncornerbeacons"); + LLPipeline::setRenderRegionCornerBeacons(new_value); + } + // else if (beacon == "particlesbeacon") { new_value = gSavedSettings.getBOOL( "particlesbeacon"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 5e7a36fd3c..95e64ca158 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -8507,7 +8507,10 @@ void process_script_teleport_request(LLMessageSystem* msg, void**) << LL_ENDL; instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); - if (flags & BEACON_SHOW_MAP) + // FIRE-35747 Do not ignore @showworldmap=n for llMapDestination() [RLVa v2.4.2, 2025-09-11] + // if (flags & BEACON_SHOW_MAP) + if (flags & BEACON_SHOW_MAP && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWWORLDMAP)) + // { bool old_auto_focus = instance->getAutoFocus(); instance->setAutoFocus(flags & BEACON_FOCUS_MAP); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 006eafdb89..e64615c478 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -491,6 +491,7 @@ public: static const std::string beacon_scripted = LLTrans::getString("BeaconScripted"); static const std::string beacon_scripted_touch = LLTrans::getString("BeaconScriptedTouch"); static const std::string beacon_sound = LLTrans::getString("BeaconSound"); + static const std::string beacon_region_corners = LLTrans::getString("BeaconRegionCorners"); // FIRE-33085 Region corner markers static const std::string beacon_media = LLTrans::getString("BeaconMedia"); static const std::string beacon_sun = LLTrans::getString("BeaconSun"); static const std::string beacon_moon = LLTrans::getString("BeaconMoon"); @@ -920,6 +921,14 @@ public: ypos += y_inc; } + // FIRE-33085 Region corner markers + if (LLPipeline::getRenderRegionCornerBeacons()) + { + addText(xpos, ypos, beacon_region_corners); + ypos += y_inc; + } + // + if (LLPipeline::getRenderScriptedBeacons()) { addText(xpos, ypos, beacon_scripted); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index a4238880a8..46a976dc1c 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5942,7 +5942,7 @@ void LLVOAvatar::updateVisibility() if (sDebugInvisible) { - if (LLNameValue* firstname = getNVPair("FirstName")) + if (getNVPair("FirstName"))// Fix more Mac whining. { LL_DEBUGS("Avatar") << avString() << " updating visibility" << LL_ENDL; } @@ -12052,7 +12052,7 @@ void LLVOAvatar::getAssociatedVolumes(std::vector& volumes) for (const auto& iter : mAttachmentPoints) { LLViewerJointAttachment* attachment = iter.second; - LLViewerJointAttachment::attachedobjs_vec_t::iterator attach_end = attachment->mAttachedObjects.end(); + // LLViewerJointAttachment::attachedobjs_vec_t::iterator attach_end = attachment->mAttachedObjects.end(); // set but not used for (LLViewerObject* attached_object : attachment->mAttachedObjects) { diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index bf1b71825a..59e27956a1 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -610,6 +610,14 @@ void LLWebRTCVoiceClient::updateNeighboringRegions() // add current region. mNeighboringRegions.insert(gAgent.getRegion()->getRegionID()); + // Do not connect to neighbouring regions + static LLCachedControl fsDisableNeighbourRegionConnections(gSavedSettings, "FSDisableNeighbourRegionConnections"); + if (fsDisableNeighbourRegionConnections) + { + return; + } + // + // base off of speaker position as it'll move more slowly than camera position. // Once we have hysteresis, we may be able to track off of speaker and camera position at 50m // TODO: Add hysteresis so we don't flip-flop connections to neighbors diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index ec4beff41f..7d84984c02 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -575,9 +575,9 @@ void FSPanelCOFWearableOutfitListItem::updateItemWeight(U32 item_weight) } //virtual -void FSPanelCOFWearableOutfitListItem::updateItem(const std::string& name, EItemState item_state) +void FSPanelCOFWearableOutfitListItem::updateItem(const std::string& name, bool favorite, EItemState item_state) { - LLPanelWearableOutfitItem::updateItem(name, item_state); + LLPanelWearableOutfitItem::updateItem(name, favorite, item_state); mWeightCtrl->setVisible(true); reshapeWidgets(); } @@ -1204,6 +1204,15 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu bool rlvCanRemove = !RlvActions::isRlvEnabled(); // [/RLVa:KB] +// Fix for "Delete from outfit" context menu option showing in favorites window. + bool is_outfit_menu = false; + LLUUID outfit_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + if (!ids.empty()) + { + is_outfit_menu = gInventory.isObjectDescendentOf(ids.front(), outfit_folder_id); + } +// + for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { LLUUID id = *it; @@ -1315,8 +1324,8 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu setMenuItemVisible(menu, "show_original", !standalone); setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items); // Delete from outfit context menu entry - setMenuItemVisible(menu, "delete_from_outfit", n_links > 0); - setMenuItemEnabled(menu, "delete_from_outfit", n_links > 0); + setMenuItemVisible(menu, "delete_from_outfit", n_links > 0 && is_outfit_menu); + setMenuItemEnabled(menu, "delete_from_outfit", n_links > 0 && is_outfit_menu); // setMenuItemVisible(menu, "favorites_add", can_favorite); setMenuItemVisible(menu, "favorites_remove", can_unfavorite); diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 57cb51e01f..263a04c86c 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -256,7 +256,7 @@ public: void updateItemWeight(U32 item_weight); - /*virtual*/ void updateItem(const std::string& name, EItemState item_state = IS_DEFAULT); + /*virtual*/ void updateItem(const std::string& name, bool favorite, EItemState item_state = IS_DEFAULT); /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index cd2b666613..fc6ca69c5f 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1594,6 +1594,26 @@ void process_enable_simulator(LLMessageSystem *msg, void **user_data) msg->getIPAddrFast(_PREHASH_SimulatorInfo, _PREHASH_IP, ip_u32); msg->getIPPortFast(_PREHASH_SimulatorInfo, _PREHASH_Port, port); + // Only connect if neighbour connections are not disabled, or if this is the current region being established (login/teleport target) + static LLCachedControl fsDisableNeighbourRegionConnections(gSavedSettings, "FSDisableNeighbourRegionConnections"); + if (fsDisableNeighbourRegionConnections) + { + LLViewerRegion* current_region = gAgent.getRegion(); + if (current_region) + { + F32 regionSize = current_region->getWidth(); + LLVector3 avPos = gAgent.getPositionAgent(); + if (avPos.mV[VX] >= 0 && avPos.mV[VX] <= regionSize && avPos.mV[VY] >= 0 && avPos.mV[VY] <= regionSize) + { + if (current_region->getHandle() != handle) + { + return; + } + } + } + } + // + // which simulator should we modify? LLHost sim(ip_u32, port); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 7196dbfadb..ebc6783128 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -328,6 +328,7 @@ bool LLPipeline::sRenderScriptedBeacons = false; bool LLPipeline::sRenderScriptedTouchBeacons = true; bool LLPipeline::sRenderParticleBeacons = false; bool LLPipeline::sRenderSoundBeacons = false; +bool LLPipeline::sRenderRegionCornerBeacons = false; // FIRE-33085 Region corner markers bool LLPipeline::sRenderBeacons = false; bool LLPipeline::sRenderHighlight = true; LLRender::eTexIndex LLPipeline::sRenderHighlightTextureChannel = LLRender::DIFFUSE_MAP; @@ -470,6 +471,7 @@ void LLPipeline::init() sRenderScriptedTouchBeacons = gSavedSettings.getBOOL("scripttouchbeacon"); sRenderParticleBeacons = gSavedSettings.getBOOL("particlesbeacon"); sRenderSoundBeacons = gSavedSettings.getBOOL("soundsbeacon"); + sRenderRegionCornerBeacons = gSavedSettings.getBOOL("fsregioncornerbeacons"); // FIRE-33085 Region corner markers sRenderBeacons = gSavedSettings.getBOOL("renderbeacons"); sRenderHighlight = gSavedSettings.getBOOL("renderhighlights"); @@ -663,6 +665,9 @@ void LLPipeline::init() connectRefreshCachedSettingsSafe("FSFocusPointFollowsPointer"); connectRefreshCachedSettingsSafe("FSFocusPointLocked"); // + // FIRE-33085 Region corner markers + connectRefreshCachedSettingsSafe("fsregioncornerbeacons"); + // LLPointer cntrl_ptr = gSavedSettings.getControl("CollectFontVertexBuffers"); if (cntrl_ptr.notNull()) @@ -1168,6 +1173,9 @@ void LLPipeline::refreshCachedSettings() LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); LLPipeline::sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles"); // + // FIRE-33085 Region corner markers + LLPipeline::sRenderRegionCornerBeacons = gSavedSettings.getBOOL("fsregioncornerbeacons"); + // LLPipeline::sUseOcclusion = (!gUseWireframe @@ -3917,6 +3925,37 @@ void LLPipeline::postSort(LLCamera &camera) // now deal with highlights for all those seeable sound sources forAllVisibleDrawables(renderSoundHighlights); } + + // FIRE-33085 Region corner markers + if (sRenderRegionCornerBeacons) + { + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + LLVector3 origin = region->getOriginAgent(); + F32 width = region->getWidth(); + + LLVector3 corner1 = origin; // Southwest + LLVector3 corner2 = origin + LLVector3(width, 0, 0); // Southeast + LLVector3 corner3 = origin + LLVector3(0, width, 0); // Northwest + LLVector3 corner4 = origin + LLVector3(width, width, 0); // Northeast + + corner1.mV[VZ] = region->getLandHeightRegion(LLVector3(0, 0, 0)); + corner2.mV[VZ] = region->getLandHeightRegion(LLVector3(width, 0, 0)); + corner3.mV[VZ] = region->getLandHeightRegion(LLVector3(0, width, 0)); + corner4.mV[VZ] = region->getLandHeightRegion(LLVector3(width, width, 0)); + + LLColor4 corner_color(1.0f, 1.0f, 0.0f, 0.8f); + LLColor4 text_color(1.0f, 1.0f, 1.0f, 1.0f); + + gObjectList.addDebugBeacon(corner1, "SW", corner_color, text_color, DebugBeaconLineWidth); + gObjectList.addDebugBeacon(corner2, "SE", corner_color, text_color, DebugBeaconLineWidth); + gObjectList.addDebugBeacon(corner3, "NW", corner_color, text_color, DebugBeaconLineWidth); + gObjectList.addDebugBeacon(corner4, "NE", corner_color, text_color, DebugBeaconLineWidth); + } + } + // + } } LL_PUSH_CALLSTACKS(); @@ -6709,6 +6748,23 @@ bool LLPipeline::getRenderHighlights() return sRenderHighlight; } +// FIRE-33085 Region corner markers +void LLPipeline::setRenderRegionCornerBeacons(bool val) +{ + sRenderRegionCornerBeacons = val; +} + +void LLPipeline::toggleRenderRegionCornerBeacons() +{ + sRenderRegionCornerBeacons = !sRenderRegionCornerBeacons; +} + +bool LLPipeline::getRenderRegionCornerBeacons() +{ + return sRenderRegionCornerBeacons; +} +// + // static void LLPipeline::setRenderHighlightTextureChannel(LLRender::eTexIndex channel) { @@ -8821,12 +8877,12 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ shader.uniform1f(LLShaderMgr::DEFERRED_BLUR_SIZE, RenderShadowBlurSize); // Compute scale factor to match AO appearance between view and snapshot. - F32 screen_to_target_scale_factor = (F32)gViewerWindow->getWindowHeightRaw() / deferred_target->getHeight(); - //shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_RADIUS, RenderSSAOScale); - shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_RADIUS, RenderSSAOScale / screen_to_target_scale_factor); - //shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_MAX_RADIUS, (GLfloat)RenderSSAOMaxScale); - shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_MAX_RADIUS, RenderSSAOMaxScale / screen_to_target_scale_factor); - // + F32 screen_to_target_scale_factor = (F32)gViewerWindow->getWindowHeightRaw() / deferred_target->getHeight(); + //shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_RADIUS, RenderSSAOScale); + shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_RADIUS, RenderSSAOScale / screen_to_target_scale_factor); + //shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_MAX_RADIUS, (GLfloat)RenderSSAOMaxScale); + shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_MAX_RADIUS, RenderSSAOMaxScale / screen_to_target_scale_factor); + // F32 ssao_factor = RenderSSAOFactor; shader.uniform1f(LLShaderMgr::DEFERRED_SSAO_FACTOR, ssao_factor); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 323cc92355..0abac4c4c4 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -436,6 +436,12 @@ public: static void toggleRenderSoundBeacons(); static bool getRenderSoundBeacons(); + // FIRE-33085 Region corner markers + static void setRenderRegionCornerBeacons(bool val); + static void toggleRenderRegionCornerBeacons(); + static bool getRenderRegionCornerBeacons(); + // + static void setRenderMOAPBeacons(bool val); static void toggleRenderMOAPBeacons(); static bool getRenderMOAPBeacons(); @@ -1023,6 +1029,7 @@ protected: static bool sRenderScriptedBeacons; static bool sRenderParticleBeacons; static bool sRenderSoundBeacons; + static bool sRenderRegionCornerBeacons; // FIRE-33085 Region corner markers public: static bool sRenderBeacons; static bool sRenderHighlight; diff --git a/indra/newview/rlvinventory.cpp b/indra/newview/rlvinventory.cpp index a0994d6b03..48307d48b3 100644 --- a/indra/newview/rlvinventory.cpp +++ b/indra/newview/rlvinventory.cpp @@ -635,7 +635,7 @@ void RlvGiveToRLVTaskOffer::doneIdle() void RlvGiveToRLVTaskOffer::onDestinationCreated(const LLUUID& idDestFolder, const std::string& strName) { - if (const LLViewerInventoryCategory* pTarget = (idDestFolder.notNull()) ? gInventory.getCategory(idDestFolder) : nullptr) + if (idDestFolder.notNull()) { moveAndRename(m_Folders.front(), idDestFolder, strName, new LLBoostFuncInventoryCallback(boost::bind(&RlvGiveToRLVTaskOffer::onOfferCompleted, this, _1))); } diff --git a/indra/newview/skins/ansastorm/xui/de/floater_camera.xml b/indra/newview/skins/ansastorm/xui/de/floater_camera.xml index 509214b11c..245791f0e7 100644 --- a/indra/newview/skins/ansastorm/xui/de/floater_camera.xml +++ b/indra/newview/skins/ansastorm/xui/de/floater_camera.xml @@ -37,6 +37,10 @@ + + + + diff --git a/indra/newview/skins/ansastorm/xui/en/floater_camera.xml b/indra/newview/skins/ansastorm/xui/en/floater_camera.xml index fede8909aa..6eea845370 100644 --- a/indra/newview/skins/ansastorm/xui/en/floater_camera.xml +++ b/indra/newview/skins/ansastorm/xui/en/floater_camera.xml @@ -20,7 +20,7 @@ title="Camera Controls" chrome="true" save_rect="true" - width="340"> + width="360"> Rotate Camera Around Focus @@ -167,7 +167,7 @@ left_pad="2" name="buttons_panel" top_delta="18" - width="120"> + width="140"> + + + + + + width="136"> + width="80"> @@ -295,7 +308,7 @@ left_pad="3" name="save_btn" top_delta="0" - width="70"> + width="80"> diff --git a/indra/newview/skins/ansastorm/xui/ja/floater_camera.xml b/indra/newview/skins/ansastorm/xui/ja/floater_camera.xml index 9f078e0221..150e59e293 100644 --- a/indra/newview/skins/ansastorm/xui/ja/floater_camera.xml +++ b/indra/newview/skins/ansastorm/xui/ja/floater_camera.xml @@ -29,6 +29,7 @@ + diff --git a/indra/newview/skins/ansastorm/xui/pl/floater_camera.xml b/indra/newview/skins/ansastorm/xui/pl/floater_camera.xml index 8e03199c8b..b0fcd6aa0d 100644 --- a/indra/newview/skins/ansastorm/xui/pl/floater_camera.xml +++ b/indra/newview/skins/ansastorm/xui/pl/floater_camera.xml @@ -28,6 +28,7 @@ + diff --git a/indra/newview/skins/ansastorm/xui/zh/floater_camera.xml b/indra/newview/skins/ansastorm/xui/zh/floater_camera.xml index 6bac0ba251..a87bb82282 100644 --- a/indra/newview/skins/ansastorm/xui/zh/floater_camera.xml +++ b/indra/newview/skins/ansastorm/xui/zh/floater_camera.xml @@ -25,24 +25,13 @@ - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/indra/newview/skins/ansastorm/xui/zh/panel_main_inventory.xml b/indra/newview/skins/ansastorm/xui/zh/panel_main_inventory.xml index 21f086793b..ea54ef6a70 100644 --- a/indra/newview/skins/ansastorm/xui/zh/panel_main_inventory.xml +++ b/indra/newview/skins/ansastorm/xui/zh/panel_main_inventory.xml @@ -125,6 +125,7 @@ + diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_TPP_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_TPP_Off.png new file mode 100644 index 0000000000..d947ffce40 Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_TPP_Off.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_TPP_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_TPP_On.png new file mode 100644 index 0000000000..ea9e0d9921 Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_TPP_On.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index f72ee8694b..f72efb9fb2 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -118,6 +118,11 @@ with the same filename but different name + + + + + diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml index 2e0ebef02e..f999201e6e 100644 --- a/indra/newview/skins/default/xui/de/floater_camera.xml +++ b/indra/newview/skins/default/xui/de/floater_camera.xml @@ -43,6 +43,10 @@ + + + + diff --git a/indra/newview/skins/default/xui/de/floater_fs_camera_small.xml b/indra/newview/skins/default/xui/de/floater_fs_camera_small.xml index f5e2154c7d..5fa8d91e9f 100644 --- a/indra/newview/skins/default/xui/de/floater_fs_camera_small.xml +++ b/indra/newview/skins/default/xui/de/floater_fs_camera_small.xml @@ -41,6 +41,10 @@ + + + + diff --git a/indra/newview/skins/default/xui/de/floater_phototools_camera.xml b/indra/newview/skins/default/xui/de/floater_phototools_camera.xml index 25490cfcad..d997c9b96c 100644 --- a/indra/newview/skins/default/xui/de/floater_phototools_camera.xml +++ b/indra/newview/skins/default/xui/de/floater_phototools_camera.xml @@ -36,6 +36,11 @@ Rückansicht + + + TPP-Ansicht + + diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index e448e8b932..da59e66d5b 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -5896,6 +5896,10 @@ https://wiki.firestormviewer.org/antivirus_whitelisting Bestehende Pose „[POSE_NAME]“ überschreiben? + + Eine große Anzahl an Outfits wurde erkannt: [AMOUNT]. Dies kann zu einem Blockieren des Viewers oder zu Verbindungsabbrüchen führen. Ziehen Sie eine Reduzierung der Outfits für eine bessere Performance in Betracht (unter [MAX]). + + Login-Anfrage wurde von Primfeed abgelehnt. diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 2fd9f646f6..b2031ed5eb 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -180,6 +180,7 @@ + [https://accounts.secondlife.com/change_email?lang=de-DE Einstellungen für E-Mail-Benachrichtigungs für Offline-IMs öffnen] diff --git a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml index 6a4366bd37..236c5bf039 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml @@ -206,6 +206,8 @@ + + Konsolen-Deckkraft: diff --git a/indra/newview/skins/default/xui/en/floater_beacons.xml b/indra/newview/skins/default/xui/en/floater_beacons.xml index 221751cd90..b28f1428a1 100644 --- a/indra/newview/skins/default/xui/en/floater_beacons.xml +++ b/indra/newview/skins/default/xui/en/floater_beacons.xml @@ -1,7 +1,7 @@ + + + + + width="170" + min_width="155"> Rotate Camera Around Focus @@ -43,7 +43,7 @@ layout="topleft" left="2" name="buttons_panel" - width="120" + width="140" top_pad="-5"> + + + + + + width="133"> @@ -302,7 +313,7 @@ mouse_opaque="true" name="preset_combo" top_pad="0" - width="113"> + width="133"> + width="165" + min_width="165"> Rotate Camera Around Focus @@ -60,7 +60,7 @@ free_mode_title name="zoom" follows="all" top="25" - width="150"> + width="160"> + width="76"> + + + + + + + + "" + + + top_pad="1"> @@ -115,9 +115,8 @@ + top_pad="1"> @@ -131,12 +130,30 @@ Rear View + + + + + + TPP View + + @@ -146,8 +163,8 @@ value="default" />