diff --git a/.github/workflows/build_viewer.yml b/.github/workflows/build_viewer.yml index 45d6a297e7..fec716a74d 100644 --- a/.github/workflows/build_viewer.yml +++ b/.github/workflows/build_viewer.yml @@ -6,6 +6,10 @@ on: description: 'Include tracy profiling builds' required: false default: 'false' + override_signing: + description: 'Manual builds are not signned by default. Force code signing for this run.' + required: false + default: 'false' push: branches: - "Firestorm*.*.*" @@ -141,7 +145,18 @@ jobs: echo "Building for channel ${FS_RELEASE_CHAN}" viewer_channel=${FS_RELEASE_CHAN} shell: bash - + - name: Check if release type is signable + if: runner.os == 'Windows' + run: | + if [[ "${FS_RELEASE_TYPE}" == "Release" || "${FS_RELEASE_TYPE}" == "Beta" ]]; then + CODESIGNING_ENABLED=true + else + CODESIGNING_ENABLED=false + fi + echo "CODESIGNING_ENABLED=${CODESIGNING_ENABLED}" >> $GITHUB_ENV + echo "Codesigning enabled: ${CODESIGNING_ENABLED}" + shell: bash + - name: Get the code uses: actions/checkout@v4 with: @@ -261,7 +276,7 @@ jobs: done shell: bash - - name: Set expiration days based on FS_RELEASE_TYPE + - name: Set expiration days and codesigning based on FS_RELEASE_TYPE run: | case "${{ env.FS_RELEASE_TYPE }}" in "Nightly" | "Manual" | "Profiling") @@ -302,6 +317,78 @@ jobs: autobuild configure -c ReleaseFS -A${addrsize} -- --package --chan ${{env.FS_RELEASE_CHAN}} ${{env.EXTRA_ARGS}} ${{env.FS_GRID}} echo "BUGSPLAT_DB=$BUGSPLAT_DB" >> $GITHUB_ENV shell: bash + - name: Generate metadata.json + if: runner.os == 'Windows' + run: | + echo '{ + "Endpoint": "${{ secrets.AZURE_ENDPOINT }}", + "CodeSigningAccountName": "${{ secrets.AZURE_CODE_SIGNING_NAME }}", + "CertificateProfileName": "${{ secrets.AZURE_CERT_PROFILE_NAME }}", + "ExcludeCredentials": [ + "ManagedIdentityCredential" + ] + }' > ${{github.workspace}}/metadata.json + echo "CODESIGNING_METADATA_PATH=${{github.workspace}}/metadata.json" >> $env:GITHUB_ENV + shell: pwsh + - name: Validate Windows 10 SDK version and find signtool.exe IFF codesigning is enabled for these builds or overridden + if: ${{ runner.os == 'Windows' && (env.CODESIGNING_ENABLED == 'true' || github.event.inputs.override_signing == 'true') }} + id: validate-sdk + run: | + try { + $Arch = ($env:RUNNER_ARCH).ToLower() + $SearchBase = "${env:ProgramFiles(x86)}\Windows Kits\10\bin" + + "Searching `"$SearchBase`" for signtool ($Arch)..." + $Tool = Get-ChildItem $SearchBase -Recurse -Force -ErrorAction SilentlyContinue | + Where-Object {$_.Name -eq 'signtool.exe' -and $_.Directory -like "*\$Arch"} | + Sort-Object -Descending | + Select-Object -First 1 + + if (!($Tool)) {throw [System.IO.FileNotFoundException]::new('File not found.', 'signtool.exe')} + + 'Adding signtool to PATH' + $Tool.Directory.FullName | Out-File $env:GITHUB_PATH -Append + "signtool-$Arch=$($Tool.FullName)" | Out-File $env:GITHUB_OUTPUT -Append + $env:PATH = "$($Tool.Directory.FullName);$env:PATH" + + signtool.exe /h + } catch { + Write-Output "::error::$($_.Exception)" + Write-Output '::endgroup::' + + exit 1 + } + echo "SIGNTOOL_PATH=signtool.exe" >> $env:GITHUB_ENV + shell: pwsh + - name: Install nuget.exe + if: runner.os == 'Windows' + run: | + Invoke-WebRequest -Uri https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile nuget.exe + shell: pwsh + + - name: Install Microsoft.Trusted.Signing.Client + if: runner.os == 'Windows' + run: | + .\nuget.exe install Microsoft.Trusted.Signing.Client -Version 1.0.53 -OutputDirectory . + shell: pwsh + + - name: Locate Azure.CodeSigning.Dlib.dll + if: runner.os == 'Windows' + run: | + $dllPath = (Get-ChildItem ".\Microsoft.Trusted.Signing.Client.1.0.53\bin\x64\Azure.CodeSigning.Dlib.dll" -Recurse -File | Select-Object -First 1).FullName + if (-not $dllPath) { + Write-Error "Azure.CodeSigning.Dlib.dll not found." + exit 1 + } + echo "CODESIGNING_DLIB_PATH=$dllPath" >> $env:GITHUB_ENV + shell: pwsh + - name: Prep env for Trusted code on Windows only + if: runner.os == 'Windows' + run: | + echo "AZURE_CLIENT_ID=${{ secrets.AZURE_CLIENT_ID }}" >> $GITHUB_ENV + echo "AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }}" >> $GITHUB_ENV + echo "AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }}" >> $GITHUB_ENV + shell: bash - name: build id: build run: autobuild build -c ReleaseFS -A${addrsize} --no-configure diff --git a/.github/workflows/sign.yml b/.github/workflows/sign.yml index 6cdc719a7b..6d98335165 100644 --- a/.github/workflows/sign.yml +++ b/.github/workflows/sign.yml @@ -6,14 +6,14 @@ on: build_run_number: description: 'GitHub Run Number (per build_viewer.yml workflow)' required: true - policy: - description: 'Policy to sign binaries' - required: true - type: choice - default: "Test" - options: - - "Test" - - "Release" + # policy: + # description: 'Policy to sign binaries' + # required: true + # type: choice + # default: "Test" + # options: + # - "Test" + # - "Release" # viewer_version: # description: 'viewer version not including build' # required: true @@ -33,7 +33,7 @@ on: jobs: find-setup-files: - runs-on: ubuntu-latest + runs-on: windows-latest permissions: actions: read contents: read @@ -69,7 +69,7 @@ jobs: sign-and-upload: name: Sign and Upload each Setup.exe needs: find-setup-files - runs-on: ubuntu-latest + runs-on: windows-latest strategy: matrix: file: ${{ fromJson( needs.find-setup-files.outputs.setup_files) }} @@ -83,6 +83,7 @@ jobs: curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts + shell: bash - name: Download Setup.exe Files Artifact uses: actions/download-artifact@v4 @@ -93,28 +94,49 @@ jobs: run: | mkdir -p to_sign cp "setup_exe_files/${{ matrix.file }}" to_sign/ - - name: Upload unsigned artifact + shell: bash + # - name: Upload unsigned artifact + # id: upload-unsigned-artifact + # uses: actions/upload-artifact@v4 + # with: + # name: unsigned-artifact-${{ matrix.file }} + # path: to_sign/${{ matrix.file }} + + # - name: sign the file + # uses: signpath/github-action-submit-signing-request@v1 + # env: + # SIGNPATH_SIGNING_POLICY_SLUG: ${{ github.event.inputs.policy == 'Test' && vars.SIGNPATH_SIGNING_POLICY_SLUG_TEST || vars.SIGNPATH_SIGNING_POLICY_SLUG_RELEASE }} + # with: + # api-token: '${{ secrets.SIGNPATH_API_TOKEN }}' + # organization-id: '${{ vars.SIGNPATH_ORGANIZATION_ID }}' + # project-slug: '${{ vars.SIGNPATH_PROJECT_SLUG }}' + # signing-policy-slug: '${{ env.SIGNPATH_SIGNING_POLICY_SLUG }}' + # github-artifact-id: "${{steps.upload-unsigned-artifact.outputs.artifact-id}}" + # wait-for-completion: true + # output-artifact-directory: 'application-signed' + - name: Azure Trusted Signing + uses: azure/trusted-signing-action@v0.5.1 + with: + azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} + azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} + azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }} + endpoint: ${{ secrets.AZURE_ENDPOINT }} + trusted-signing-account-name: ${{ secrets.AZURE_CODE_SIGNING_NAME }} + certificate-profile-name: ${{ secrets.AZURE_CERT_PROFILE_NAME }} + + # Sign all exes inside the folder + files-folder: ${{ github.workspace }}\to_sign + files-folder-filter: exe + + # - name: Upload signed artifact + # uses: actions/upload-artifact@v4 + # with: + # name: signed-artifact-${{ matrix.file }} + # path: ./application-signed + # - name: Upload unsigned artifact + - name: Upload signed artifact id: upload-unsigned-artifact uses: actions/upload-artifact@v4 with: name: unsigned-artifact-${{ matrix.file }} - path: to_sign/${{ matrix.file }} - - - name: sign the file - uses: signpath/github-action-submit-signing-request@v1 - env: - SIGNPATH_SIGNING_POLICY_SLUG: ${{ github.event.inputs.policy == 'Test' && vars.SIGNPATH_SIGNING_POLICY_SLUG_TEST || vars.SIGNPATH_SIGNING_POLICY_SLUG_RELEASE }} - with: - api-token: '${{ secrets.SIGNPATH_API_TOKEN }}' - organization-id: '${{ vars.SIGNPATH_ORGANIZATION_ID }}' - project-slug: '${{ vars.SIGNPATH_PROJECT_SLUG }}' - signing-policy-slug: '${{ env.SIGNPATH_SIGNING_POLICY_SLUG }}' - github-artifact-id: "${{steps.upload-unsigned-artifact.outputs.artifact-id}}" - wait-for-completion: true - output-artifact-directory: 'application-signed' - - - name: Upload signed artifact - uses: actions/upload-artifact@v4 - with: - name: signed-artifact-${{ matrix.file }} - path: ./application-signed \ No newline at end of file + path: to_sign\${{ matrix.file }} diff --git a/FIRESTORM-SOURCE_LICENSE_HEADER.txt b/FIRESTORM-SOURCE_LICENSE_HEADER.txt index 44f7834caf..f3c2eb557d 100644 --- a/FIRESTORM-SOURCE_LICENSE_HEADER.txt +++ b/FIRESTORM-SOURCE_LICENSE_HEADER.txt @@ -2,9 +2,9 @@ * @file * @brief * - * $LicenseInfo:firstyear=2024&license=fsviewerlgpl$ + * $LicenseInfo:firstyear=2025&license=fsviewerlgpl$ * Phoenix Firestorm Viewer Source Code - * Copyright (C) 2024, The Phoenix Firestorm Project, Inc. + * Copyright (C) 2025, The Phoenix Firestorm Project, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/autobuild.xml b/autobuild.xml index 9d9a630cf0..c0a0fdd884 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -4193,7 +4193,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors license_file docs/LICENSE-source.txt copyright - Copyright (c) 2024, The Phoenix Firestorm Project, Inc. + Copyright (c) 2025, The Phoenix Firestorm Project, Inc. version_file newview/viewer_version.txt name diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 31b17807e2..d2a0bb629b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2655,7 +2655,7 @@ if (DARWIN) set(MACOSX_BUNDLE_BUNDLE_NAME "Firestorm") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}") - set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2024 The Phoenix Firestorm Project, Inc.") + set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2025 The Phoenix Firestorm Project, Inc.") set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "Firestorm.nib") set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "LLApplication") diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index b19cda2ddd..84bd1775ce 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -3,4 +3,4 @@ CFBundleName = "Firestorm"; CFBundleShortVersionString = "Firestorm version %%VERSION%%"; -CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2024 The Phoenix Firestorm Project, Inc."; +CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2025 The Phoenix Firestorm Project, Inc."; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 4f1913dcd5..71b5918270 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9242,6 +9242,20 @@ Change of this parameter will affect the layout of buttons in notification toast Value 1 + + + OpenDebugStatMaterials + + Comment + Expand Materials performance stats display + Persist + 1 + Type + Boolean + Value + 1 + + OpenDebugStatTexture Comment diff --git a/indra/newview/fs_viewer_manifest.py b/indra/newview/fs_viewer_manifest.py index 8093f9d3f6..1bff85c928 100644 --- a/indra/newview/fs_viewer_manifest.py +++ b/indra/newview/fs_viewer_manifest.py @@ -59,25 +59,55 @@ class FSViewerManifest: def fs_channel_unique(self): return self.channel().replace("Firestorm", "").strip() - def fs_sign_win_binaries( self ): - try: - subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com","/t","http://timestamp.verisign.com/scripts/timstamp.dll",self.args['configuration']+"\\firestorm-bin.exe"], - stderr=subprocess.PIPE,stdout=subprocess.PIPE) - subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com","/t","http://timestamp.verisign.com/scripts/timstamp.dll",self.args['configuration']+"\\slplugin.exe"], - stderr=subprocess.PIPE,stdout=subprocess.PIPE) - subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com","/t","http://timestamp.verisign.com/scripts/timstamp.dll",self.args['configuration']+"\\SLVoice.exe"], - stderr=subprocess.PIPE,stdout=subprocess.PIPE) - subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com","/t","http://timestamp.verisign.com/scripts/timstamp.dll",self.args['configuration']+"\\"+self.final_exe()], - stderr=subprocess.PIPE,stdout=subprocess.PIPE) - except Exception as e: - print("Couldn't sign final binary. Tried to sign %s" % self.args['configuration']+"\\"+self.final_exe()) + def fs_sign_win_binaries(self): + signtool_path = os.getenv('SIGNTOOL_PATH') + codesigning_dlib_path = os.getenv('CODESIGNING_DLIB_PATH') + metadata_file = os.getenv("CODESIGNING_METADATA_PATH") + # at some point we might want to sign other DLLs as well. + executable_paths = [ + # self.args['configuration'] + "\\firestorm-bin.exe", # no need to sign this we are not packaging it. + self.args['configuration'] + "\\slplugin.exe", + self.args['configuration'] + "\\SLVoice.exe", + self.args['configuration'] + "\\llwebrtc.dll", + self.args['configuration'] + "\\llplugin\\dullahan_host.exe", + self.args['configuration'] + "\\" + self.final_exe() + ] + + if not signtool_path or not codesigning_dlib_path: + print("Signing configuration is missing. Skipping signing process.") + return + + print("Signing executables.") + for exe_path in executable_paths: + try: + subprocess.check_call([ + signtool_path, "sign", "/v", "/debug", "/fd", "SHA256", + "/tr", "http://timestamp.acs.microsoft.com", "/td", "SHA256", + "/dlib", codesigning_dlib_path, "/dmdf", metadata_file, exe_path + ], stderr=subprocess.PIPE, stdout=subprocess.PIPE) + print(f"Signed {exe_path}") + except Exception as e: + print(f"Couldn't sign binary: {exe_path}. Error: {e}") + + def fs_sign_win_installer(self, substitution_strings): + signtool_path = os.getenv('SIGNTOOL_PATH') + codesigning_dlib_path = os.getenv('CODESIGNING_DLIB_PATH') + metadata_file = os.getenv("CODESIGNING_METADATA_PATH") + installer_path = self.args['configuration'] + "\\" + substitution_strings['installer_file'] + + if not signtool_path or not codesigning_dlib_path: + print("Signing configuration is missing. Skipping signing process.") + return + print("Signing installer.") - def fs_sign_win_installer( self, substitution_strings ): try: - subprocess.check_call(["signtool.exe","sign","/n","Phoenix","/d","Firestorm","/du","http://www.phoenixviewer.com",self.args['configuration']+"\\"+substitution_strings['installer_file']],stderr=subprocess.PIPE,stdout=subprocess.PIPE) + subprocess.check_call([ + signtool_path, "sign", "/v", "/debug", "/fd", "SHA256", + "/tr", "http://timestamp.acs.microsoft.com", "/td", "SHA256", + "/dlib", codesigning_dlib_path, "/dmdf", metadata_file, installer_path + ], stderr=subprocess.PIPE, stdout=subprocess.PIPE) except Exception as e: - print("Working directory: %s" % os.getcwd()) - print("Couldn't sign windows installer. Tried to sign %s" % self.args['configuration']+"\\"+substitution_strings['installer_file']) + print(f"Couldn't sign windows installer: {installer_path}. Error: {e}") def fs_delete_linux_symbols( self ): debugDir = os.path.join( self.get_dst_prefix(), "bin", ".debug" ) diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index b0ec3c7469..cb4d9ce43a 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -63,7 +63,7 @@ Unicode true # Enable unicode support ##!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi" !include "%%SOURCE%%\installers\windows\lang_ru.nsi" ##!include "%%SOURCE%%\installers\windows\lang_tr.nsi" -##!include "%%SOURCE%%\installers\windows\lang_zh.nsi" +!include "%%SOURCE%%\installers\windows\lang_zh.nsi" # *TODO: Move these into the language files themselves ##LangString LanguageCode ${LANG_DANISH} "da" @@ -77,7 +77,7 @@ LangString LanguageCode ${LANG_POLISH} "pl" ##LangString LanguageCode ${LANG_PORTUGUESEBR} "pt" LangString LanguageCode ${LANG_RUSSIAN} "ru" ##LangString LanguageCode ${LANG_TURKISH} "tr" -##LangString LanguageCode ${LANG_TRADCHINESE} "zh" +LangString LanguageCode ${LANG_TRADCHINESE} "zh" # This placeholder is replaced by viewer_manifest.py %%INST_VARS%% @@ -240,8 +240,19 @@ Function CheckCPUFlagsAVX2 ; AVX2 not supported ; Replace %DLURL% in the language string with the URL ${WordReplace} "$(MissingAVX2)" "%DLURL%" "${DL_URL}-legacy-cpus" "+*" $3 - MessageBox MB_OK "$3" + MessageBox MB_OK "$3" ${OpenURL} "${DL_URL}-legacy-cpus" + + MessageBox MB_YESNO $(AVX2OverrideConfirmation) IDNO NoInstall + MessageBox MB_OKCANCEL $(AVX2OverrideNote) IDCANCEL NoInstall + + ; User chose to proceed + Pop $3 + Pop $2 + Pop $1 + Return + + NoInstall: Quit OK_AVX2: @@ -579,7 +590,7 @@ WriteRegStr SHELL_CONTEXT "${MSUNINSTALL_KEY}" "DisplayVersion" "${VERSION_LONG} # Separate install sizes for 32 and 64 bit #WriteRegDWORD SHELL_CONTEXT "${MSUNINSTALL_KEY}" "EstimatedSize" "0x0001D500" # ~117 MB ${If} ${IS64BIT} == "1" - WriteRegDWORD SHELL_CONTEXT "${MSUNINSTALL_KEY}" "EstimatedSize" "0x00064000" # 400 MB + WriteRegDWORD SHELL_CONTEXT "${MSUNINSTALL_KEY}" "EstimatedSize" "0x00098800" # 610 MB ${Else} WriteRegDWORD SHELL_CONTEXT "${MSUNINSTALL_KEY}" "EstimatedSize" "0x00061800" # 390 MB ${EndIf} diff --git a/indra/newview/installers/windows/lang_da.nsi b/indra/newview/installers/windows/lang_da.nsi index f0284cdf37..3045f3351c 100644 Binary files a/indra/newview/installers/windows/lang_da.nsi and b/indra/newview/installers/windows/lang_da.nsi differ diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi index d0b4111d93..af51432590 100755 --- a/indra/newview/installers/windows/lang_de.nsi +++ b/indra/newview/installers/windows/lang_de.nsi @@ -57,8 +57,12 @@ LangString CheckAdministratorUnInstMB ${LANG_GERMAN} 'Sie besitzen ungenügende ; checkcpuflags LangString MissingSSE2 ${LANG_GERMAN} "Dieser PC besitzt möglicherweise keinen Prozessor mit SSE2-Unterstützung, die für die Ausführung von Firestorm ${VERSION_LONG} benötigt wird. Trotzdem installieren?" + +; Extended cpu checks (AVX2) LangString MissingAVX2 ${LANG_GERMAN} "Ihre CPU unterstützt keine AVX2-Anweisungen. Bitte laden Sie die Version für ältere CPUs von %DLURL%-legacy-cpus/ herunter." LangString AVX2Available ${LANG_GERMAN} "Ihre CPU unterstützt AVX2-Anweisungen. Sie können die für AVX2 optimierte Version für eine bessere Leistung unter %DLURL%/ herunterladen. Möchten Sie sie jetzt herunterladen?" +LangString AVX2OverrideConfirmation ${LANG_GERMAN} "Falls Sie glauben, dass Ihr PC AVX2-Anweisungen unterstützt, können Sie die Installation dennoch durchführen. Möchten Sie fortfahren?" +LangString AVX2OverrideNote ${LANG_GERMAN} "Durch das Übersteuern des Installers installieren Sie möglicherweise eine Version, die beim Starten direkt abstürzt. In diesem Fall installieren Sie bitte stattdessen die Standard-Version." ; closesecondlife function (install) LangString CloseSecondLifeInstDP ${LANG_GERMAN} "Warten auf die Beendigung von Firestorm ..." diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi index dcdca3fc24..e857ebac5a 100644 Binary files a/indra/newview/installers/windows/lang_en-us.nsi and b/indra/newview/installers/windows/lang_en-us.nsi differ diff --git a/indra/newview/installers/windows/lang_es.nsi b/indra/newview/installers/windows/lang_es.nsi index 88df05af6d..52cd2891f2 100755 Binary files a/indra/newview/installers/windows/lang_es.nsi and b/indra/newview/installers/windows/lang_es.nsi differ diff --git a/indra/newview/installers/windows/lang_fr.nsi b/indra/newview/installers/windows/lang_fr.nsi index c3f7a643a6..4b11807f76 100755 Binary files a/indra/newview/installers/windows/lang_fr.nsi and b/indra/newview/installers/windows/lang_fr.nsi differ diff --git a/indra/newview/installers/windows/lang_it.nsi b/indra/newview/installers/windows/lang_it.nsi index f7a6b6120b..85932d0abc 100755 Binary files a/indra/newview/installers/windows/lang_it.nsi and b/indra/newview/installers/windows/lang_it.nsi differ diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi index 9890e21546..64a278637e 100755 Binary files a/indra/newview/installers/windows/lang_ja.nsi and b/indra/newview/installers/windows/lang_ja.nsi differ diff --git a/indra/newview/installers/windows/lang_pl.nsi b/indra/newview/installers/windows/lang_pl.nsi index 424f30267b..eb63b0bd10 100644 Binary files a/indra/newview/installers/windows/lang_pl.nsi and b/indra/newview/installers/windows/lang_pl.nsi differ diff --git a/indra/newview/installers/windows/lang_pt-br.nsi b/indra/newview/installers/windows/lang_pt-br.nsi index f25e8f00e0..ffa8838976 100755 Binary files a/indra/newview/installers/windows/lang_pt-br.nsi and b/indra/newview/installers/windows/lang_pt-br.nsi differ diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi index aa65abb6e0..7f81784ff1 100755 Binary files a/indra/newview/installers/windows/lang_ru.nsi and b/indra/newview/installers/windows/lang_ru.nsi differ diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi index b19fdbf4c5..7fc231b258 100755 Binary files a/indra/newview/installers/windows/lang_tr.nsi and b/indra/newview/installers/windows/lang_tr.nsi differ diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi index dae2b48fed..f514a937eb 100755 Binary files a/indra/newview/installers/windows/lang_zh.nsi and b/indra/newview/installers/windows/lang_zh.nsi differ diff --git a/indra/newview/installers/windows/language_menu.nsi b/indra/newview/installers/windows/language_menu.nsi index 6a0082e760..f445080b26 100644 Binary files a/indra/newview/installers/windows/language_menu.nsi and b/indra/newview/installers/windows/language_menu.nsi differ diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index ade5c477c7..9ce3cbe273 100755 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -161,7 +161,7 @@ BEGIN VALUE "FileDescription", "Firestorm" VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}" VALUE "InternalName", "Firestorm" - VALUE "LegalCopyright", "Copyright \251 2010-2024, The Phoenix Firestorm Project, Inc." + VALUE "LegalCopyright", "Copyright \251 2010-2025, The Phoenix Firestorm Project, Inc." VALUE "OriginalFilename", "Firestorm.exe" VALUE "ProductName", "Firestorm" VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}" diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index cb52fca190..2b5cc98f3a 100644 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -155,13 +155,18 @@ stat="glboundmemstat" setting="DebugStatModeBoundMem"/> + + + + setting="OpenDebugStatMaterials"> + stat="nummaterials" + setting="DebugStatModeMaterials"/> + diff --git a/indra/newview/skins/default/xui/fr/floater_fs_poser.xml b/indra/newview/skins/default/xui/fr/floater_fs_poser.xml index 112be594ea..c49cab8095 100644 --- a/indra/newview/skins/default/xui/fr/floater_fs_poser.xml +++ b/indra/newview/skins/default/xui/fr/floater_fs_poser.xml @@ -214,6 +214,7 @@ + @@ -226,7 +227,7 @@