diff --git a/.github/workflows/build_viewer.yml b/.github/workflows/build_viewer.yml
index d0a6255abf..e4d0f3aa52 100644
--- a/.github/workflows/build_viewer.yml
+++ b/.github/workflows/build_viewer.yml
@@ -9,11 +9,18 @@ on:
- "*preview"
schedule:
- cron: '00 03 * * *' # Run every day at 3am UTC
-env:
+env:
AUTOBUILD_VARIABLES_FILE: ${{github.workspace}}/build-variables/variables
EXTRA_ARGS: -DUSE_FMODSTUDIO=ON -DUSE_KDU=ON --crashreporting
build_secrets_checkout: ${{github.workspace}}/signing
XZ_DEFAULTS: -T0
+ FS_RELEASE_TYPE: Unknown
+ platform: Unknown
+ fallback_platform: ${platform}
+ FS_RELEASE_CHAN: ${FS_RELEASE_TYPE}x64
+ FS_GRID: "GRID FLAGS NOT SET"
+ PYTHON:
+
jobs:
build_matrix:
strategy:
@@ -22,6 +29,9 @@ jobs:
grid: [sl,os]
addrsize: [64]
runs-on: ${{ matrix.os }}
+ outputs:
+ viewer_channel: ${{ steps.channel.outputs.viewer_channel }}
+ viewer_version: ${{ steps.version.outputs.viewer_version }}
steps:
- name: Install Bash 4 and GNU sed on Mac
if: runner.os == 'macOS'
@@ -36,15 +46,20 @@ jobs:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
- id: py312
+ id: py311
with:
- python-version: '3.11.6'
- cache: 'pip'
+ python-version: '3.11'
+
+ - name: Set PYTHON environment for CMake
+ run: |
+ echo "PYTHON=${{ steps.py311.outputs.python-path }}" >> $GITHUB_ENV
+ shell: bash
- name: Install python requirements
run: |
python3 -m pip install -r requirements.txt
python -m pip install -r requirements.txt
+ # export the new python to the environment var $PYTHON
- name: Check python version
run: python -V
@@ -90,6 +105,7 @@ jobs:
shell: bash
- name: find channel from Branch name
+ id: channel
run: |
if [[ "${{ github.ref_name }}" == Firestorm* ]]; then
FS_RELEASE_TYPE=Release
@@ -110,6 +126,7 @@ jobs:
echo "FS_RELEASE_TYPE=${FS_RELEASE_TYPE}" >> $GITHUB_ENV
echo "FS_RELEASE_CHAN=${FS_RELEASE_CHAN}" >> $GITHUB_ENV
echo "Building for channel ${FS_RELEASE_CHAN}"
+ viewer_channel=${FS_RELEASE_CHAN}
shell: bash
- name: Get the code
@@ -238,9 +255,18 @@ jobs:
shell: bash
- name: build
+ id: build
run: autobuild build -c ReleaseFS -A${{matrix.addrsize}} --no-configure
shell: bash
-
+ # - name: Extract version number
+ # id: version
+ # shell: bash
+ # run: |
+ # if [ -r "indra/newview/viewer_version.txt" ]
+ # then
+ # viewer_version="$(<"$build_dir/newview/viewer_version.txt")"
+ # echo "viewer_version=$viewer_version" >> "$GITHUB_OUTPUT"
+ # fi
- name: Publish artifacts
if: runner.os == 'Windows'
uses: actions/upload-artifact@v3
@@ -267,9 +293,37 @@ jobs:
path: |
build-darwin-*/newview/*.dmg
build-darwin-*/newview/*.bz2
+ # post-windows-symbols:
+ # needs: build_matrix
+ # runs-on: ubuntu-latest
+ # steps:
+ # - name: Post Windows symbols
+ # uses: secondlife/viewer-build-util/post-bugsplat-windows@v1
+ # with:
+ # username: ${{ secrets.BUGSPLAT_USER }}
+ # password: ${{ secrets.BUGSPLAT_PASS }}
+ # database: "firestorm_release"
+ # channel: ${{ needs.build_matrix.outputs.viewer_channel }}
+ # version: ${{ needs.build_matrix.outputs.viewer_version }}
+
+ # post-mac-symbols:
+ # needs: build_matrix
+ # runs-on: ubuntu-latest
+ # steps:
+ # - name: Post Mac symbols
+ # uses: secondlife/viewer-build-util/post-bugsplat-mac@v1
+ # with:
+ # username: ${{ secrets.BUGSPLAT_USER }}
+ # password: ${{ secrets.BUGSPLAT_PASS }}
+ # database: "firestorm_release"
+ # channel: ${{ needs.build_matrix.outputs.viewer_channel }}
+ # version: ${{ needs.build_matrix.outputs.viewer_version }}
deploy:
runs-on: ubuntu-latest
needs: build_matrix
+ env:
+ FS_BUILD_WEBHOOK_URL:
+ FS_RELEASE_FOLDER:
if: always()
steps:
- name: Checkout files
diff --git a/FIRESTORM-SOURCE_LICENSE_HEADER.txt b/FIRESTORM-SOURCE_LICENSE_HEADER.txt
index 19eedbfa2e..44f7834caf 100644
--- a/FIRESTORM-SOURCE_LICENSE_HEADER.txt
+++ b/FIRESTORM-SOURCE_LICENSE_HEADER.txt
@@ -2,9 +2,9 @@
* @file
* @brief
*
- * $LicenseInfo:firstyear=2023&license=fsviewerlgpl$
+ * $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
- * Copyright (C) 2020, The Phoenix Firestorm Project, Inc.
+ * Copyright (C) 2024, 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/README.md b/README.md
new file mode 100644
index 0000000000..cb09b89340
--- /dev/null
+++ b/README.md
@@ -0,0 +1,29 @@
+
+
+
+
+**[Firestorm](https://www.firestormviewer.org/) is a free client for 3D virtual worlds such as Second Life and various OpenSim worlds where users can create, connect and chat with others from around the world.** This repository contains the official source code for the Firestorm viewer.
+
+## Open Source
+
+Firestorm is a third party viewer derived from the official [Second Life](https://github.com/secondlife/viewer) client. The client codebase has been open source since 2007 and is available under the LGPL license.
+
+## Download
+
+Pre-built versions of the viewer releases for Windows, Mac and Linux can be downloaded from the [official website](https://www.firestormviewer.org/choose-your-platform/).
+
+## Build Instructions
+
+Build instructions for each operating system can be found in the official [wiki](https://wiki.firestormviewer.org/).
+
+- [Windows](https://wiki.firestormviewer.org/fs_compiling_firestorm_windows)
+
+- [Mac](https://wiki.firestormviewer.org/fs_compiling_firestorm_macos)
+
+- [Linux](https://wiki.firestormviewer.org/fs_compiling_firestorm_linux)
+
+Please note that we do not provide support for compiling the viewer or issues resulting from using a self-compiled viewer. However, there is a self-compilers group within Second Life that can be joined to ask questions related to compiling the viewer: [Firestorm Self Compilers](secondlife:///app/group/2014ce4c-5393-fb67-83ac-910db84c273c/about)
+
+## Contribute
+
+Help make Firestorm better! You can get involved with improvements by filing bugs and suggesting enhancements via [JIRA](https://jira.firestormviewer.org) or creating pull requests.
diff --git a/autobuild.xml b/autobuild.xml
index 2304f7c658..01198472fa 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -4257,7 +4257,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors
license_file
docs/LICENSE-source.txt
copyright
- Copyright (c) 2023, The Phoenix Firestorm Project, Inc.
+ Copyright (c) 2024, The Phoenix Firestorm Project, Inc.
version_file
newview/viewer_version.txt
name
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 7426dd7144..0e728f993a 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -603,6 +603,7 @@ Henri Beauchamp
SL-15175
SL-19110
SL-19159
+ [NO JIRA] (fullbright HUD alpha fix)
herina Bode
Hikkoshi Sakai
VWR-429
diff --git a/doc/firestorm_256.png b/doc/firestorm_256.png
new file mode 100644
index 0000000000..c440137b72
Binary files /dev/null and b/doc/firestorm_256.png differ
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index 2c4a57675e..5f87ac225d 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -411,7 +411,7 @@ void LLAudioEngine::idle()
for (source_map::value_type& src_pair : mAllSources)
{
LLAudioSource *sourcep = src_pair.second;
- if (sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority)
+ if (!sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority)
{
sync_masterp = sourcep;
master_channelp = sync_masterp->getChannel();
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index cd8c0ccb82..420a7e92aa 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -2731,8 +2731,8 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector& mo
//
next->getVolumeFaces() = remainder;
next->mNormalizedScale = ret->mNormalizedScale;
- next->mNormalizedTranslation = ret->mNormalizedTranslation; // Mesh upload fix by Rye Mutt
-
+ next->mNormalizedTranslation = ret->mNormalizedTranslation;
+
if ( ret->mMaterialList.size() > LL_SCULPT_MESH_MAX_FACES)
{
next->mMaterialList.assign(ret->mMaterialList.begin() + LL_SCULPT_MESH_MAX_FACES, ret->mMaterialList.end());
diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp
index ae165f7fa4..237636bd0b 100644
--- a/indra/llprimitive/llgltfmaterial.cpp
+++ b/indra/llprimitive/llgltfmaterial.cpp
@@ -699,24 +699,44 @@ void LLGLTFMaterial::applyOverrideLLSD(const LLSD& data)
if (bc.isDefined())
{
mBaseColor.setValue(bc);
+ if (mBaseColor == getDefaultBaseColor())
+ {
+ // HACK -- nudge by epsilon if we receive a default value (indicates override to default)
+ mBaseColor.mV[3] -= FLT_EPSILON;
+ }
}
const LLSD& ec = data["ec"];
if (ec.isDefined())
{
mEmissiveColor.setValue(ec);
+ if (mEmissiveColor == getDefaultEmissiveColor())
+ {
+ // HACK -- nudge by epsilon if we receive a default value (indicates override to default)
+ mEmissiveColor.mV[0] += FLT_EPSILON;
+ }
}
const LLSD& mf = data["mf"];
if (mf.isReal())
{
mMetallicFactor = mf.asReal();
+ if (mMetallicFactor == getDefaultMetallicFactor())
+ {
+ // HACK -- nudge by epsilon if we receive a default value (indicates override to default)
+ mMetallicFactor -= FLT_EPSILON;
+ }
}
const LLSD& rf = data["rf"];
if (rf.isReal())
{
mRoughnessFactor = rf.asReal();
+ if (mRoughnessFactor == getDefaultRoughnessFactor())
+ {
+ // HACK -- nudge by epsilon if we receive a default value (indicates override to default)
+ mRoughnessFactor -= FLT_EPSILON;
+ }
}
const LLSD& am = data["am"];
@@ -730,6 +750,11 @@ void LLGLTFMaterial::applyOverrideLLSD(const LLSD& data)
if (ac.isReal())
{
mAlphaCutoff = ac.asReal();
+ if (mAlphaCutoff == getDefaultAlphaCutoff())
+ {
+ // HACK -- nudge by epsilon if we receive a default value (indicates override to default)
+ mAlphaCutoff -= FLT_EPSILON;
+ }
}
const LLSD& ds = data["ds"];
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 12eaebd68d..eae19a8f62 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -55,8 +55,8 @@ const int MODEL_NAMES_LENGTH = sizeof(model_names) / sizeof(std::string);
LLModel::LLModel(LLVolumeParams& params, F32 detail)
: LLVolume(params, detail),
- mNormalizedScale(1,1,1),
- mNormalizedTranslation(0, 0, 0), // Mesh upload fix by Rye Mutt
+ mNormalizedScale(1,1,1),
+ mNormalizedTranslation(0, 0, 0),
mPelvisOffset( 0.0f ),
mStatus(NO_ERRORS),
mSubmodelID(0)
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index b8071248e2..43d095f73a 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -41,7 +41,6 @@ public:
bool hasLighting = false; // implies no transport (it's possible to have neither though)
bool isAlphaLighting = false; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
bool isSpecular = false;
- bool hasWaterFog = false; // implies no gamma
bool hasTransport = false; // implies no lighting (it's possible to have neither though)
bool hasSkinning = false;
bool hasObjectSkinning = false;
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 77be50854f..c107292193 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -81,14 +81,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
// NOTE order of shader object attaching is VERY IMPORTANT!!!
if (features->calculatesAtmospherics)
{
- if (features->hasWaterFog)
- {
- if (!shader->attachVertexObject("windlight/atmosphericsVarsWaterV.glsl"))
- {
- return FALSE;
- }
- }
- else if (!shader->attachVertexObject("windlight/atmosphericsVarsV.glsl"))
+ if (!shader->attachVertexObject("windlight/atmosphericsVarsV.glsl"))
{
return FALSE;
}
@@ -201,14 +194,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if(features->calculatesAtmospherics || features->hasGamma || features->isDeferred)
{
- if (features->hasWaterFog)
- {
- if (!shader->attachFragmentObject("windlight/atmosphericsVarsWaterF.glsl"))
- {
- return FALSE;
- }
- }
- else if (!shader->attachFragmentObject("windlight/atmosphericsVarsF.glsl"))
+ if (!shader->attachFragmentObject("windlight/atmosphericsVarsF.glsl"))
{
return FALSE;
}
@@ -292,7 +278,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
}
// NOTE order of shader object attaching is VERY IMPORTANT!!!
- if (features->hasWaterFog)
+ if (features->hasAtmospherics)
{
if (!shader->attachFragmentObject("environment/waterFogF.glsl"))
{
@@ -302,82 +288,40 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
if (features->hasLighting)
{
- if (features->hasWaterFog)
+ if (features->disableTextureIndex)
{
- if (features->disableTextureIndex)
+ if (features->hasAlphaMask)
{
- if (features->hasAlphaMask)
+ if (!shader->attachFragmentObject("lighting/lightAlphaMaskNonIndexedF.glsl"))
{
- if (!shader->attachFragmentObject("lighting/lightWaterAlphaMaskNonIndexedF.glsl"))
- {
- return FALSE;
- }
- }
- else
- {
- if (!shader->attachFragmentObject("lighting/lightWaterNonIndexedF.glsl"))
- {
- return FALSE;
- }
+ return FALSE;
}
}
- else
+ else
{
- if (features->hasAlphaMask)
+ if (!shader->attachFragmentObject("lighting/lightNonIndexedF.glsl"))
{
- if (!shader->attachFragmentObject("lighting/lightWaterAlphaMaskF.glsl"))
- {
- return FALSE;
- }
+ return FALSE;
}
- else
- {
- if (!shader->attachFragmentObject("lighting/lightWaterF.glsl"))
- {
- return FALSE;
- }
- }
- shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
-
- else
+ else
{
- if (features->disableTextureIndex)
+ if (features->hasAlphaMask)
{
- if (features->hasAlphaMask)
+ if (!shader->attachFragmentObject("lighting/lightAlphaMaskF.glsl"))
{
- if (!shader->attachFragmentObject("lighting/lightAlphaMaskNonIndexedF.glsl"))
- {
- return FALSE;
- }
- }
- else
- {
- if (!shader->attachFragmentObject("lighting/lightNonIndexedF.glsl"))
- {
- return FALSE;
- }
+ return FALSE;
}
}
- else
+ else
{
- if (features->hasAlphaMask)
+ if (!shader->attachFragmentObject("lighting/lightF.glsl"))
{
- if (!shader->attachFragmentObject("lighting/lightAlphaMaskF.glsl"))
- {
- return FALSE;
- }
+ return FALSE;
}
- else
- {
- if (!shader->attachFragmentObject("lighting/lightF.glsl"))
- {
- return FALSE;
- }
- }
- shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
+ shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
}
}
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index be9c722913..16e3c99608 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -1937,31 +1937,16 @@ void LLWindowWin32::destroySharedContext(void* contextPtr)
void LLWindowWin32::toggleVSync(bool enable_vsync)
{
- // Fix null pointer guard
- //if (!enable_vsync && wglSwapIntervalEXT)
- //{
- // LL_INFOS("Window") << "Disabling vertical sync" << LL_ENDL;
- // wglSwapIntervalEXT(0);
- //}
- //else
- //{
- // LL_INFOS("Window") << "Enabling vertical sync" << LL_ENDL;
- // wglSwapIntervalEXT(1);
- //}
- if (wglSwapIntervalEXT)
+ if (!enable_vsync && wglSwapIntervalEXT)
{
- if (!enable_vsync)
- {
- LL_INFOS("Window") << "Disabling vertical sync" << LL_ENDL;
- wglSwapIntervalEXT(0);
- }
- else
- {
- LL_INFOS("Window") << "Enabling vertical sync" << LL_ENDL;
- wglSwapIntervalEXT(1);
- }
+ LL_INFOS("Window") << "Disabling vertical sync" << LL_ENDL;
+ wglSwapIntervalEXT(0);
+ }
+ else if (wglSwapIntervalEXT)
+ {
+ LL_INFOS("Window") << "Enabling vertical sync" << LL_ENDL;
+ wglSwapIntervalEXT(1);
}
- //
}
void LLWindowWin32::moveWindow( const LLCoordScreen& position, const LLCoordScreen& size )
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 6154c520aa..be2375d0b8 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -2546,7 +2546,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-2023 The Phoenix Firestorm Project, Inc.")
+ set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2010-2024 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 1afe5749be..b19cda2ddd 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-2023 The Phoenix Firestorm Project, Inc.";
+CFBundleGetInfoString = "Firestorm version %%VERSION%%, Copyright 2010-2024 The Phoenix Firestorm Project, Inc.";
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index a8a1887568..1996c50447 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-7.1.2
+7.1.3
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c0f1c4789d..f9f3aeceaa 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2089,6 +2089,17 @@
Value
0
+ RenderSnapshotNoPost
+
AutomaticFly