Ansariel 2024-10-16 19:11:04 +02:00
commit 8fd20a1af6
41 changed files with 383 additions and 113 deletions

View File

@ -31,7 +31,7 @@ jobs:
build_matrix:
strategy:
matrix:
os: [macos-12,ubuntu-22.04,windows-2022]
os: [macos-14,ubuntu-22.04,windows-2022]
grid: [sl,os]
variant: [regular, avx]
runs-on: ${{ matrix.os }}

View File

@ -1074,6 +1074,14 @@ void LLDir::setSkinFolder(const std::string &skin_folder, const std::string& the
// time it's called, reset mSearchSkinDirs.
mSearchSkinDirs.clear();
// <FS:Ansariel> If working directory is different from executable directory, add executable subdirs as searchable folders
if (LLStringUtil::compareInsensitive(mExecutableDir, mWorkingDir) != 0)
{
addSearchSkinDir(add(mExecutableDir, "skins"));
addSearchSkinDir(add(mExecutableDir, "skins", "default"));
}
// </FS:Ansariel>
// base skin which is used as fallback for all skinned files
// e.g. c:\program files\secondlife\skins\default
mDefaultSkinDir = getSkinBaseDir();
@ -1109,14 +1117,6 @@ void LLDir::setSkinFolder(const std::string &skin_folder, const std::string& the
addSearchSkinDir(mUserDefaultSkinDir);
// then user-defined skins.
addSearchSkinDir(mUserSkinDir);
// <FS:Ansariel> If working directory is different from executable directory, add executable subdirs as searchable folders
if (mExecutableDir != mWorkingDir)
{
addSearchSkinDir(add(mExecutableDir, "skins"));
addSearchSkinDir(add(mExecutableDir, "skins", "default"));
}
// </FS:Ansariel>
}
void LLDir::addSearchSkinDir(const std::string& skindir)

View File

@ -88,7 +88,7 @@ void LLImageFilter::executeFilter(LLPointer<LLImageRaw> raw_image)
{
mImage = raw_image;
LLImageDataLock lock(mImage);
LLImageDataSharedLock lock(mImage); // <FS:Beq> FIRE-34564 Bugsplat SHARED vs EXCLUSIVE lock conflict
//std::cout << "Filter : size = " << mFilterData.size() << std::endl;
for (S32 i = 0; i < mFilterData.size(); ++i)

View File

@ -2253,6 +2253,7 @@ if (WINDOWS)
"--fmodstudio=${USE_FMODSTUDIO}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
"--avx2=${USE_AVX2_OPTIMIZATION}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=$<CONFIG>
"--channel=${VIEWER_CHANNEL}"
@ -2316,6 +2317,7 @@ if (WINDOWS)
"--fmodstudio=${USE_FMODSTUDIO}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
"--avx2=${USE_AVX2_OPTIMIZATION}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=$<CONFIG>
"--channel=${VIEWER_CHANNEL}"
@ -2502,6 +2504,7 @@ if (LINUX)
"--fmodstudio=${USE_FMODSTUDIO}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
"--avx2=${USE_AVX2_OPTIMIZATION}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2529,6 +2532,7 @@ if (LINUX)
"--fmodstudio=${USE_FMODSTUDIO}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
"--avx2=${USE_AVX2_OPTIMIZATION}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"
@ -2624,6 +2628,7 @@ if (DARWIN)
"--fmodstudio=${USE_FMODSTUDIO}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
"--avx2=${USE_AVX2_OPTIMIZATION}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=$<CONFIG>
--bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER}
@ -2661,6 +2666,7 @@ if (DARWIN)
"--fmodstudio=${USE_FMODSTUDIO}"
"--openal=${USE_OPENAL}"
"--tracy=${USE_TRACY}"
"--avx2=${USE_AVX2_OPTIMIZATION}"
--build=${CMAKE_CURRENT_BINARY_DIR}
--buildtype=${CMAKE_BUILD_TYPE}
"--channel=${VIEWER_CHANNEL}"

View File

@ -4,18 +4,25 @@ import tarfile
class FSViewerManifest:
def fs_installer_basename(self):
if self.fs_is_avx2():
opt_string = "AVX2"
else:
opt_string = "LEGACY"
substitution_strings = {
'version' : '.'.join(self.args['version']),
'version_short' : '.'.join(self.args['version'][:-1]),
'version_dashes' : '-'.join(self.args['version']),
'app_name':self.app_name(),
'optimized': opt_string,
'app_name_oneword':self.app_name_oneword()
}
return "Phoenix-%(app_name)s-%(version_dashes)s" % substitution_strings
return "Phoenix-%(app_name)s_%(optimized)s-%(version_dashes)s" % substitution_strings
def fs_is_opensim(self):
return self.args['viewer_flavor'] == 'oss' #Havok would be hvk
def fs_is_avx2(self):
return self.args['avx2'] == 'ON'
def fs_splice_grid_substitution_strings( self, subst_strings ):
ret = subst_strings

View File

@ -191,6 +191,7 @@ FSPanelLogin::FSPanelLogin(const LLRect &rect,
setBackgroundOpaque(true);
mPasswordModified = false;
mShowPassword = false;
sInstance = this;
@ -316,6 +317,10 @@ FSPanelLogin::FSPanelLogin(const LLRect &rect,
username_combo->setFocusLostCallback(boost::bind(&FSPanelLogin::onSelectUser, this));
mPreviousUsername = username_combo->getValue().asString();
childSetAction("password_show_btn", onShowHidePasswordClick, this);
childSetAction("password_hide_btn", onShowHidePasswordClick, this);
syncShowHidePasswordButton();
mInitialized = true;
}
@ -1058,6 +1063,37 @@ void FSPanelLogin::onClickForgotPassword(void*)
}
}
// static
void FSPanelLogin::onShowHidePasswordClick(void*)
{
if (sInstance)
{ // mShowPassword is not saved between sessions, it's just for short-term use
sInstance->mShowPassword = !sInstance->mShowPassword;
LL_INFOS("AppInit") << "Showing password text now " << (sInstance->mShowPassword ? "on" : "off") << LL_ENDL;
sInstance->syncShowHidePasswordButton();
}
}
void FSPanelLogin::syncShowHidePasswordButton()
{ // Show or hide the two 'eye' buttons for password visibility
LLButton* show_password_btn = sInstance->findChild<LLButton>("password_show_btn");
if (show_password_btn)
{
show_password_btn->setVisible(!mShowPassword);
}
LLButton* hide_password_btn = sInstance->findChild<LLButton>("password_hide_btn");
if (hide_password_btn)
{
hide_password_btn->setVisible(mShowPassword);
}
// Update the edit field to replace password text with dots ... or not. Will redraw
sInstance->getChild<LLLineEditor>("password_edit")->setDrawAsterixes(!mShowPassword);
}
//static
void FSPanelLogin::onClickHelp(void*)
{

View File

@ -98,6 +98,7 @@ private:
void onSelectServer();
void onLocationSLURL();
void onUsernameTextChanged();
void syncShowHidePasswordButton(); // Update which button is shown based on mShowPassword
static void onClickConnect(void*);
static void onClickNewAccount(void*);
@ -110,6 +111,7 @@ private:
static void onRemoveCallback(const LLSD& notification, const LLSD& response);
static void onClickGridMgrHelp(void*);
static void onClickGridBuilder(void*);
static void onShowHidePasswordClick(void*);
static std::string credentialName();
private:
@ -121,6 +123,8 @@ private:
void* mCallbackData;
bool mPasswordModified;
bool mShowPassword; // Show password in normal text vs. hidden by dots
bool mShowFavorites;
static FSPanelLogin* sInstance;

View File

@ -32,7 +32,7 @@ SetCompressor /solid lzma # Compress whole installer as one block
SetDatablockOptimize off # Only saves us 0.1%, not worth it
XPStyle on # Add an XP manifest to the installer
RequestExecutionLevel admin # For when we write to Program Files
Unicode true # Enable unicode support
Unicode true # Enable unicode support
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Project flags
@ -178,9 +178,88 @@ Var FRIENDLY_APP_NAME # <FS:Ansariel> FIRE-30446: Set FriendlyAppName for prot
Function dirPre
StrCmp $SKIP_DIALOGS "true" 0 +2
Abort
FunctionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Open link in a new browser window
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function openLinkNewWindow
Push $3
Exch
Push $2
Exch
Push $1
Exch
Push $0
Exch
ReadRegStr $0 HKCR "http\shell\open\command" ""
# Get browser path
DetailPrint $0
StrCpy $2 '"'
StrCpy $1 $0 1
StrCmp $1 $2 +2 # if path is not enclosed in " look for space as final char
StrCpy $2 ' '
StrCpy $3 1
loop:
StrCpy $1 $0 1 $3
DetailPrint $1
StrCmp $1 $2 found
StrCmp $1 "" found
IntOp $3 $3 + 1
Goto loop
found:
StrCpy $1 $0 $3
StrCmp $2 " " +2
StrCpy $1 '$1"'
Pop $0
Exec '$1 $0'
Pop $0
Pop $1
Pop $2
Pop $3
FunctionEnd
!macro _OpenURL URL
Push "${URL}"
Call openLinkNewWindow
!macroend
!define OpenURL '!insertmacro "_OpenURL"'
; Add the AVX2 check functions
Function CheckCPUFlagsAVX2
Push $1
System::Call 'kernel32::IsProcessorFeaturePresent(i 40) i .r1' ; 40 is PF_AVX2_INSTRUCTIONS_AVAILABLE
IntCmp $1 1 OK_AVX2
; AVX2 not supported
MessageBox MB_OK $(MissingAVX2)
${OpenURL} 'https://www.firestormviewer.org/early-access-beta-downloads-legacy-cpus'
Quit
OK_AVX2:
Pop $1
Return
FunctionEnd
Function CheckCPUFlagsAVX2_Prompt
Push $1
System::Call 'kernel32::IsProcessorFeaturePresent(i 40) i .r1' ; 40 is PF_AVX2_INSTRUCTIONS_AVAILABLE
IntCmp $1 1 OK_AVX2
Pop $1
Return
OK_AVX2:
MessageBox MB_YESNO $(AVX2Available) IDYES DownloadAVX2 IDNO ContinueInstall
DownloadAVX2:
${OpenURL} 'https://www.firestormviewer.org/early-access-beta-downloads/'
Quit
ContinueInstall:
Pop $1
Return
FunctionEnd
# <FS:Ansariel> Optional start menu entry
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Post-directory page callback
@ -224,6 +303,16 @@ ${If} $0 != ""
${EndIf}
Call CheckCPUFlags # Make sure we have SSE2 support
# Two checks here, if we are an AVX2 build we want to abort if no AVX2 support on this CPU.
# If we are not an AVX2 build but the CPU can support it then we want to prompt them to download the AVX2 version
# but also allow them to override.
${If} ${ISAVX2} == 1
Call CheckCPUFlagsAVX2
${Else}
Call CheckCPUFlagsAVX2_Prompt
${EndIf}
Call CheckWindowsVersion # Don't install On unsupported systems
Push $0
${GetParameters} $COMMANDLINE # Get our command line

View File

@ -57,6 +57,8 @@ 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?"
LangString MissingAVX2 ${LANG_GERMAN} "Ihre CPU unterstützt keine AVX2-Anweisungen. Bitte laden Sie die Version für ältere CPUs von https://www.firestormviewer.org/early-access-beta-downloads-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 https://www.firestormviewer.org/early-access-beta-downloads/ herunterladen. Möchten Sie sie jetzt herunterladen?"
; closesecondlife function (install)
LangString CloseSecondLifeInstDP ${LANG_GERMAN} "Warten auf die Beendigung von Firestorm ..."

View File

@ -309,10 +309,20 @@ void LLHUDObject::renderAllForTimer()
{
sHUDObjects.erase(cur_it);
}
else if (hud_objp->isVisible())
// <FS:Beq> FIRE-33239 - particles do not sie when UI is disabled
// else if (hud_objp->isVisible())
// {
// hud_objp->renderForTimer();
// }
else
{
hud_objp->renderForTimer();
LLHUDEffect* effect = dynamic_cast<LLHUDEffect*>(hud_objp);
if (effect || hud_objp->isVisible())
{
hud_objp->renderForTimer();
}
}
// </FS:Beq>
}
}

View File

@ -1646,6 +1646,13 @@ void render_ui(F32 zoom_factor, int subfield)
LLHUDObject::renderAll();
render_ui_2d();
}
// <FS:Beq> FIRE-33239 - particles do not sie when UI is disabled
if (!render_ui)
{
// Make sure particle effects disappear
LLHUDObject::renderAllForTimer();
}
// </FS:Beq>
gViewerWindow->setup2DRender();
gViewerWindow->updateDebugText();

View File

@ -82,7 +82,7 @@ LLViewerPart::LLViewerPart() :
mPartSourcep = NULL;
mParent = NULL;
mChild = NULL;
LLViewerPartSim::incParticleCount2( 1 ); // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
++LLViewerPartSim::sParticleCount2 ;
}
LLViewerPart::~LLViewerPart()
@ -107,7 +107,7 @@ LLViewerPart::~LLViewerPart()
mPartSourcep = NULL;
LLViewerPartSim::decParticleCount2( 1 ); // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
--LLViewerPartSim::sParticleCount2 ;
}
void LLViewerPart::init(LLPointer<LLViewerPartSource> sourcep, LLViewerTexture *imagep, LLVPCallback cb)
@ -205,7 +205,7 @@ LLViewerPartGroup::~LLViewerPartGroup()
}
mParticles.clear();
LLViewerPartSim::decParticleCount(count); // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
LLViewerPartSim::sParticleCount -= count; // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
}
void LLViewerPartGroup::cleanup()
@ -268,7 +268,7 @@ bool LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size)
mParticles.push_back(part);
part->mSkipOffset=mSkippedTime;
LLViewerPartSim::incParticleCount(1); // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
++LLViewerPartSim::sParticleCount; // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
return true;
}
@ -279,15 +279,14 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
LLVector3 gravity(0.f, 0.f, GRAVITY);
// <FS:Beq> FIRE-34600 off by one particle count triggering bugsplat (LL_ERR)
S32 end = (S32) mParticles.size();
LLViewerPartSim::checkParticleCount(static_cast<U32>(mParticles.size()));
std::atomic_signal_fence(std::memory_order_seq_cst);
// </FS:Beq>
LLViewerCamera* camera = LLViewerCamera::getInstance();
LLViewerRegion *regionp = getRegion();
//S32 end = (S32) mParticles.size();// <FS:Beq> FIRE-34600 off by one particle count triggering bugsplat (LL_ERR)
// <FS:Beq> FIRE-34600 - Bugsplat AVX2 particle count mismatch
// S32 end = (S32) mParticles.size();
bool changed = false;
// </FS:Beq>
for (S32 i = 0 ; i < (S32)mParticles.size();)
{
LLVector3 a(0.f, 0.f, 0.f);
@ -403,9 +402,15 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
// Kill dead particles (either flagged dead, or too old)
if ((part->mLastUpdateTime > part->mMaxAge) || (LLViewerPart::LL_PART_DEAD_MASK == part->mFlags))
{
mParticles[i] = mParticles.back() ;
mParticles.pop_back() ;
// <FS:Beq> FIRE-34600 - Bugsplat AVX2 particle count mismatch
// mParticles[i] = mParticles.back() ;
// mParticles.pop_back() ;
// delete part ;
vector_replace_with_last(mParticles, mParticles.begin() + i);
--LLViewerPartSim::sParticleCount;
delete part ;
changed = true;
// </FS:Beq>
}
else
{
@ -413,9 +418,18 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
if (!posInGroup(part->mPosAgent, desired_size))
{
// Transfer particles between groups
LLViewerPartSim::getInstance()->put(part) ;
mParticles[i] = mParticles.back() ;
mParticles.pop_back() ;
// <FS:Beq> FIRE-34600 - Bugsplat AVX2 particle count mismatch
// LLViewerPartSim::getInstance()->put(part) ;
// mParticles[i] = mParticles.back() ;
// mParticles.pop_back() ;
vector_replace_with_last(mParticles, mParticles.begin() + i);
LLViewerPartSim::getInstance()->put(part) ;
// Note: put() uses addpart when succesful, this increase sParticleCount by 1
// even though it has stayed the same. If it is not succesful then we need to decrease by 1
// so a decrement here works for both cases.
--LLViewerPartSim::sParticleCount;
changed = true;
// </FS:Beq>
}
else
{
@ -424,16 +438,25 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
}
}
S32 removed = end - (S32)mParticles.size();
if (removed > 0)
// <FS:Beq> FIRE-34600 - Bugsplat AVX2 particle count mismatch
// S32 removed = end - (S32)mParticles.size();
// if (removed > 0)
// {
// // we removed one or more particles, so flag this group for update
// if (mVOPartGroupp.notNull())
// {
// gPipeline.markRebuild(mVOPartGroupp->mDrawable, LLDrawable::REBUILD_ALL);
// }
// LLViewerPartSim::decPartCount(removed);
// }
if (changed)
{
// we removed one or more particles, so flag this group for update
if (mVOPartGroupp.notNull())
{
gPipeline.markRebuild(mVOPartGroupp->mDrawable, LLDrawable::REBUILD_ALL);
}
LLViewerPartSim::decParticleCount(removed); // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
}
// </FS:Beq>
// Kill the viewer object if this particle group is empty
if (mParticles.empty())
@ -480,21 +503,42 @@ void LLViewerPartSim::checkParticleCount(U32 size)
{
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// if(LLViewerPartSim::sParticleCount2 != LLViewerPartSim::sParticleCount)
S32 count = LLViewerPartSim::getParticleCount();
S32 count2 = LLViewerPartSim::getParticleCount2();
if( count != count2 )
// <FS:Beq/>
// {
// LL_ERRS() << "sParticleCount: " << LLViewerPartSim::sParticleCount << " ; sParticleCount2: " << LLViewerPartSim::sParticleCount2 << LL_ENDL ;
// }
//
// if(size > (U32)LLViewerPartSim::sParticleCount2)
// {
// LL_ERRS() << "current particle size: " << LLViewerPartSim::sParticleCount2 << " array size: " << size << LL_ENDL ; // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
// }
if(LLViewerPartSim::sParticleCount2 != LLViewerPartSim::sParticleCount)
{
LL_ERRS() << "sParticleCount: " << count << " ; sParticleCount2: " << count2 << LL_ENDL ; //<FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
static int fail_count{0};
if(fail_count > 10)
{
LL_ERRS() << "sParticleCount: " << LLViewerPartSim::sParticleCount << " ; sParticleCount2: " << LLViewerPartSim::sParticleCount2 << LL_ENDL ;
}
else
{
LL_WARNS() << "sParticleCount: " << LLViewerPartSim::sParticleCount << " ; sParticleCount2: " << LLViewerPartSim::sParticleCount2 << LL_ENDL ;
}
fail_count++;
}
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// if(size > (U32)LLViewerPartSim::sParticleCount2)
if( size > static_cast<U32>(count2) )
// <FS:Beq/>
if(size > (U32)LLViewerPartSim::sParticleCount2)
{
LL_ERRS() << "current particle size: " << count2 << " array size: " << size << LL_ENDL ; // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
static int size_mismatch_count{0};
if(size_mismatch_count > 10)
{
LL_ERRS() << "current particle size: " << LLViewerPartSim::sParticleCount2 << " array size: " << size << LL_ENDL ;
}
else
{
LL_WARNS() << "current particle size: " << LLViewerPartSim::sParticleCount2 << " array size: " << size << LL_ENDL ;
}
size_mismatch_count++;
}
// </FS:Beq>
}
LLViewerPartSim::LLViewerPartSim()
@ -539,18 +583,14 @@ void LLViewerPartSim::destroyClass()
//static
bool LLViewerPartSim::shouldAddPart()
{
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// if (sParticleCount < MAX_PART_COUNT)
auto count = LLViewerPartSim::getParticleCount();
if ( count >= MAX_PART_COUNT)
// <FS:Beq/>
if (sParticleCount >= MAX_PART_COUNT)
{
return false;
}
if ( count > PART_THROTTLE_THRESHOLD*sMaxParticleCount) // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
if ( sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
{
F32 frac = (F32)count/(F32)sMaxParticleCount; // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
F32 frac = (F32)sParticleCount/(F32)sMaxParticleCount;
frac -= PART_THROTTLE_THRESHOLD;
frac *= PART_THROTTLE_RESCALE;
if (ll_frand() < frac)
@ -572,7 +612,7 @@ bool LLViewerPartSim::shouldAddPart()
void LLViewerPartSim::addPart(LLViewerPart* part)
{
if (LLViewerPartSim::getParticleCount() < MAX_PART_COUNT)
if (LLViewerPartSim::sParticleCount < MAX_PART_COUNT)
{
put(part);
}
@ -806,19 +846,14 @@ void LLViewerPartSim::updateSimulation()
}
if (LLDrawable::getCurrentFrame()%16==0)
{
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// if (sParticleCount > sMaxParticleCount * 0.875f
// && sParticleAdaptiveRate < 2.0f)
auto count = LLViewerPartSim::getParticleCount();
if ( count > sMaxParticleCount * 0.875f
&& sParticleAdaptiveRate < 2.0f)
// <FS:Beq/>
if (sParticleCount > sMaxParticleCount * 0.875f
&& sParticleAdaptiveRate < 2.0f)
{
sParticleAdaptiveRate *= PART_ADAPT_RATE_MULT;
}
else
{
if ( count < sMaxParticleCount * 0.5f // <FS:Beq/> FIRE-34600 - bugsplat AVX2 particle count mismatch
if ( sParticleCount < sMaxParticleCount * 0.5f
&& sParticleAdaptiveRate > 0.03125f)
{
sParticleAdaptiveRate *= PART_ADAPT_RATE_MULT_RECIP;
@ -835,25 +870,15 @@ void LLViewerPartSim::updatePartBurstRate()
{
if (!(LLDrawable::getCurrentFrame() & 0xf))
{
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// if (sParticleCount >= MAX_PART_COUNT) //set rate to zero
auto count = LLViewerPartSim::getParticleCount();
if (count >= MAX_PART_COUNT) //set rate to zero
// <FS:Beq/>
if (sParticleCount >= MAX_PART_COUNT) //set rate to zero
{
sParticleBurstRate = 0.0f ;
}
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// else if(sParticleCount > 0)
else if (count > 0)
// <FS:Beq/>
else if(sParticleCount > 0)
{
if(sParticleBurstRate > 0.0000001f)
{
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// F32 total_particles = sParticleCount / sParticleBurstRate ; //estimated
F32 total_particles = count / sParticleBurstRate ; //estimated
// <FS:Beq/>
F32 total_particles = sParticleCount / sParticleBurstRate ; //estimated
F32 new_rate = llclamp(0.9f * sMaxParticleCount / total_particles, 0.0f, 1.0f) ;
F32 delta_rate_threshold = llmin(0.1f * llmax(new_rate, sParticleBurstRate), 0.1f) ;
F32 delta_rate = llclamp(new_rate - sParticleBurstRate, -1.0f * delta_rate_threshold, delta_rate_threshold) ;

View File

@ -155,25 +155,14 @@ public:
static bool shouldAddPart(); // Just decides whether this particle should be added or not (for particle count capping)
F32 maxRate() // Return maximum particle generation rate
{
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// if (sParticleCount >= MAX_PART_COUNT)
// {
// return 1.f;
// }
// if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
// {
// return (((F32)sParticleCount/(F32)sMaxParticleCount)-PART_THROTTLE_THRESHOLD)*PART_THROTTLE_RESCALE;
// }
const auto count = getParticleCount();
if ( count >= MAX_PART_COUNT)
if (sParticleCount >= MAX_PART_COUNT)
{
return 1.f;
}
if ( count > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
{
return (((F32)count/(F32)sMaxParticleCount)-PART_THROTTLE_THRESHOLD)*PART_THROTTLE_RESCALE;
return (((F32)sParticleCount/(F32)sMaxParticleCount)-PART_THROTTLE_THRESHOLD)*PART_THROTTLE_RESCALE;
}
// </FS:Beq>
return 0.f;
}
F32 getRefRate() { return sParticleAdaptiveRate; }
@ -188,29 +177,15 @@ public:
friend class LLViewerPartGroup;
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// bool aboveParticleLimit() const { return sParticleCount > sMaxParticleCount; }
bool aboveParticleLimit() const { return getParticleCount() > sMaxParticleCount; }
// </FS:Beq>
bool aboveParticleLimit() const { return sParticleCount > sMaxParticleCount; }
static void setMaxPartCount(const S32 max_parts) { sMaxParticleCount = max_parts; }
static S32 getMaxPartCount() { return sMaxParticleCount; }
// <FS:Beq> FIRE-34600 - bugsplat AVX2 particle count mismatch
// Deprecate these and use native operators for consistency
// static void incPartCount(const S32 count) { sParticleCount += count; }
// static void decPartCount(const S32 count) { sParticleCount -= count; }
static void incParticleCount(const S32 count, std::memory_order order = std::memory_order_seq_cst )
{ sParticleCount.fetch_add( count , std::memory_order_seq_cst ); }
static void decParticleCount(const S32 count, std::memory_order order = std::memory_order_seq_cst )
{ sParticleCount.fetch_sub( count , std::memory_order_seq_cst ); }
static void incParticleCount2(const S32 count, std::memory_order order = std::memory_order_seq_cst )
{ sParticleCount2.fetch_add( count , std::memory_order_seq_cst ); }
static void decParticleCount2(const S32 count, std::memory_order order = std::memory_order_seq_cst )
{ sParticleCount2.fetch_sub( count , std::memory_order_seq_cst ); }
static inline S32 getParticleCount(std::memory_order order = std::memory_order_seq_cst) { return sParticleCount.load(order); }
static inline S32 getParticleCount2(std::memory_order order = std::memory_order_seq_cst) { return sParticleCount2.load(order); }
// </FS:Beq>
U32 mID;
protected:

View File

@ -56,6 +56,8 @@
</panel>
<panel name="zoom">
<joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/>
<button name="roll_left" tool_tip="Kamera nach links rollen" />
<button name="roll_right" tool_tip="Kamera nach rechts rollen" />
<slider_bar name="zoom_slider" tool_tip="Hierdurch wird die Kamera hinein- und herausbewegt. HINWEIS: Es handelt sich hierbei nicht um einen Zoom wie im echten Leben, diese Einstellung hat keinen Effekt auf das Sichtfeld der Kamera. Für echtes Zoomen muss der Regler „Sichtwinkel“ verwendet werden!"/>
<joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
</panel>

View File

@ -51,6 +51,8 @@
<button label="Anmelden" name="connect_btn"/>
<check_box label="Benutzername speichern" name="remember_username_check"/>
<check_box label="Kennwort speichern" name="remember_check"/>
<button name="password_show_btn" tool_tip="Passwort anzeigen"/>
<button name="password_hide_btn" tool_tip="Passwort verstecken"/>
</layout_panel>
<layout_panel name="mode_selection">
<text name="mode_selection_text">

View File

@ -21,6 +21,8 @@
<layout_panel name="password_container">
<line_editor name="password_edit" label="Kennwort"/>
<check_box label="Kennwort speichern" name="remember_check"/>
<button name="password_show_btn" tool_tip="Passwort anzeigen"/>
<button name="password_hide_btn" tool_tip="Passwort verstecken"/>
</layout_panel>
<layout_panel name="start_location_panel">
<combo_box name="start_location_combo" label="Hier starten:">

View File

@ -238,6 +238,36 @@
tool_tip="Orbit camera around focus"
top="5"
width="100"/>
<!-- <FS:Beq> FIRE-34509 Add Camera roll -->
<button
follows="bottom|left"
width="12"
height="12"
image_selected="VirtualTrackball_Rotate_Left_Active"
image_unselected="VirtualTrackball_Rotate_Left"
layout="topleft"
top_delta="85"
left_delta="5"
name="roll_left"
tool_tip="Roll camera Left">
<commit_callback function="Camera.roll_left" />
<mouse_held_callback function="Camera.roll_left" />
</button>
<button
follows="bottom|right"
width="12"
height="12"
image_selected="VirtualTrackball_Rotate_Right_Active"
image_unselected="VirtualTrackball_Rotate_Right"
layout="topleft"
top_delta="0"
left_delta="78"
name="roll_right"
tool_tip="Roll camera Right">
<commit_callback function="Camera.roll_right" />
<mouse_held_callback function="Camera.roll_right" />
</button>
<!-- </FS:Beq> -->
<button
follows="top|left"
height="18"

View File

@ -274,6 +274,30 @@
top_pad="1"
name="remember_check"
width="145" />
<button
name="password_show_btn"
tool_tip="Show password text"
follows="left|bottom"
left="256"
bottom_delta="0"
height="20"
width="20"
image_pressed="Profile_Group_Visibility_Off_Pressed"
image_unselected="Profile_Group_Visibility_Off"
tab_stop="false"
visible="true" />
<button
name="password_hide_btn"
tool_tip="Hide password text"
follows="left|bottom"
left="256"
bottom_delta="0"
height="20"
width="20"
image_pressed="Profile_Group_Visibility_On_Pressed"
image_unselected="Profile_Group_Visibility_On"
tab_stop="false"
visible="false" />
</layout_panel>
<layout_panel
tab_stop="false"

View File

@ -184,6 +184,30 @@
top_pad="10"
name="remember_check"
width="204" />
<button
name="password_show_btn"
tool_tip="Show password text"
follows="left|bottom"
left="194"
bottom_delta="0"
height="20"
width="20"
image_pressed="Profile_Group_Visibility_Off_Pressed"
image_unselected="Profile_Group_Visibility_Off"
tab_stop="false"
visible="true" />
<button
name="password_hide_btn"
tool_tip="Hide password text"
follows="left|bottom"
left="194"
bottom_delta="0"
height="20"
width="20"
image_pressed="Profile_Group_Visibility_On_Pressed"
image_unselected="Profile_Group_Visibility_On"
tab_stop="false"
visible="false" />
</layout_panel> <!-- password_container -->
<layout_panel
auto_resize="false"

View File

@ -3,7 +3,7 @@
<layout_stack name="maint_layout">
<layout_panel name="count_panel">
<text name="number_of_items">
Éléments à envoyer : [COUNT]
Éléments à charger : [COUNT]
</text>
</layout_panel>
<layout_panel name="warning_panel">
@ -20,7 +20,7 @@
</text>
</layout_panel>
<layout_panel name="buttoms_panel">
<button label="Envoyer" name="upload_btn" />
<button label="Charger" name="upload_btn" />
<button label="Annuler" name="cancel_btn" />
</layout_panel>
<layout_panel name="link_panel">

View File

@ -56,6 +56,8 @@
</panel>
<panel name="zoom">
<joystick_rotate name="cam_rotate_stick" tool_tip="Fait tourner la caméra autour du focus"/>
<button name="roll_left" tool_tip="Faire pivoter la caméra vers la gauche"/>
<button name="roll_right" tool_tip="Faire pivoter la caméra vers la droite"/>
<slider_bar name="zoom_slider" tool_tip="Fait simplement bouger la caméra. NOTE : Il ne s'agit pas d'un vrai zoom, ce réglage n'a aucun effet sur le champ de vision de la caméra. Pour un vrai zoom, il faut utiliser le curseur Angle de vue"/>
<joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut, le bas, la gauche et la droite"/>
</panel>

View File

@ -4,8 +4,9 @@
<menu_item_call label="Image..." name="Upload Image"/>
<menu_item_call label="Son (L$[COST])..." name="Upload Sound"/>
<menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
<menu_item_call label="Mesh..." name="Upload Model"/>
<menu_item_call label="En Bloc..." name="Bulk Upload"/>
<menu_item_call label="Maillage..." name="Upload Model"/>
<menu_item_call label="Matériau PBR..." name="Upload Material"/>
<menu_item_call label="Par lot..." name="Bulk Upload"/>
<menu_item_call label="Importer un ensemble lié..." name="import linkset"/>
</menu>
<menu_item_call label="Nouveau dossier" name="New Folder"/>

View File

@ -7,5 +7,5 @@
<menu_item_call label="Modifier la tenue" name="edit"/>
<menu_item_call label="Renommer la tenue" name="rename"/>
<menu_item_call label="Enregister dans cette tenue" name="save"/>
<menu_item_call label="Suprimmer la tenue" name="delete"/>
<menu_item_call label="Supprimer la tenue" name="delete"/>
</context_menu>

View File

@ -242,7 +242,8 @@
<menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
<menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
<menu_item_call label="Modèle..." name="Upload Model"/>
<menu_item_call label="Lot..." name="Bulk Upload"/>
<menu_item_call label="Matériau PBR..." name="Upload Material"/>
<menu_item_call label="Par lot..." name="Bulk Upload"/>
<menu_item_call label="Importer un groupe d'objets" name="import linkset"/>
</menu>
<menu_item_call label="Maillage local" name="local_mesh"/>

View File

@ -26,8 +26,10 @@
<text name="create_new_account_text">S'enregistrer</text>
<text name="forgot_password_text">Mot de passe/Nom d'utilisateur oublié ?</text>
<button label="Connexion" name="connect_btn"/>
<check_box label="Mémoriser le nom d'utilisateur" name="remember_username_check"/>
<check_box label="Mémoriser le mot de passe" name="remember_check"/>
<check_box label="Enr. le nom" name="remember_username_check"/>
<check_box label="Enr. le mot de passe" name="remember_check"/>
<button name="password_show_btn" tool_tip="Afficher le mot de passe"/>
<button name="password_hide_btn" tool_tip="Masquer le mot de passe"/>
</layout_panel>
<layout_panel name="mode_selection">
<text name="mode_selection_text">MODE DE CONNEXION</text>

View File

@ -13,14 +13,16 @@
<layout_stack name="1st_row_stack">
<layout_panel name="login">
<combo_box name="username_combo" label="Nom de résident(e) :" tool_tip="Le nom de compte que vous avez choisi lors de votre inscription, par exemple, bobsmith420 ou Steller Sunshine"/>
<check_box label="Mémoriser le nom de résident(e)" name="remember_username_check"/>
<check_box label="Enr. le nom" name="remember_username_check"/>
</layout_panel>
<layout_panel name="delete_container">
<button tool_tip="Supprimer ce nom de résident(e)" name="remove_user_btn"/>
</layout_panel>
<layout_panel name="password_container">
<line_editor name="password_edit" label="Mot de passe"/>
<check_box label="Mémoriser le mot de passe" name="remember_check"/>
<check_box label="Enr. le mot de passe" name="remember_check"/>
<button name="password_show_btn" tool_tip="Afficher le mot de passe"/>
<button name="password_hide_btn" tool_tip="Masquer le mot de passe"/>
</layout_panel>
<layout_panel name="start_location_panel">
<combo_box name="start_location_combo" label="Démarrer :">

View File

@ -7000,7 +7000,7 @@ Votre position actuelle : [AVATAR_POS]
Agent inconnu
</string>
<string name="groupcountstring">
Vous faites partie de [COUNT] groups ([REMAINING] restant).
Vous faites partie de [COUNT] groupes ([REMAINING] restant).
</string>
<string name="groupcountunlimitedstring">
Vous faites partie de [COUNT] groupes.

View File

@ -55,6 +55,8 @@
</panel>
<panel name="zoom">
<joystick_rotate name="cam_rotate_stick" tool_tip="Obróć kamerę wokół punktu skupienia"/>
<button name="roll_left" tool_tip="Przechyl kamerę w lewo" />
<button name="roll_right" tool_tip="Przechyl kamerę w prawo" />
<slider_bar name="zoom_slider" tool_tip="Ta opcja po prostu przesuwa kamerę w przód i w tył. UWAGA: To nie ma nic wspólnego z opcją powiększania (zoomowania) z prawdziwego życia! Nie ma żadnego wpływu na pole widzenia (FOV). Użyj suwaka 'Kąt widzenia', aby uzyskać prawdziwy efekt zoomowania."/>
<joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerą w górę, w dół, w lewo i w prawo."/>
</panel>

View File

@ -45,6 +45,8 @@
<button label="Zaloguj" name="connect_btn"/>
<check_box label="Zapamiętaj login" name="remember_username_check"/>
<check_box label="Zapamiętaj hasło" name="remember_check"/>
<button name="password_show_btn" tool_tip="Pokaż hasło" />
<button name="password_hide_btn" tool_tip="Ukryj hasło" />
</layout_panel>
<layout_panel name="mode_selection">
<text name="mode_selection_text">

View File

@ -18,6 +18,8 @@
<layout_panel name="password_container">
<line_editor name="password_edit" label="Hasło" />
<check_box label="Zapamiętaj hasło" name="remember_check" />
<button name="password_show_btn" tool_tip="Pokaż hasło" />
<button name="password_hide_btn" tool_tip="Ukryj hasło" />
</layout_panel>
<layout_panel name="start_location_panel">
<combo_box label="Rozpocznij w" name="start_location_combo">

View File

@ -54,6 +54,10 @@
<!--TODO: replace + - images -->
<panel name="zoom">
<joystick_rotate name="cam_rotate_stick" tool_tip="Орбита камеры вокруг фокуса"/>
<!-- <FS:Beq> FIRE-34509 Add Camera roll -->
<button name="roll_left" tool_tip="Повернуть камеру влево"/>
<button name="roll_right" tool_tip="Повернуть камеру вправо"/>
<!-- </FS:Beq> -->
<slider_bar name="zoom_slider" tool_tip="Это просто перемещает камеру. ПРИМЕЧАНИЕ. Это не масштаб камеры! Это не влияет на угол обзора. Используйте ползунок «Угол обзора» для реального масштабирования."/>
<joystick_track name="cam_track_stick" tool_tip="Двигает камеру вверх и вниз, влево и вправо."/>
</panel>

View File

@ -45,6 +45,8 @@
<button label="Войти" name="connect_btn"/>
<check_box label="Запомнить пользователя" name="remember_username_check" />
<check_box label="Запомнить пароль" name="remember_check"/>
<button name="password_show_btn" tool_tip="Показать текст пароля"/>
<button name="password_hide_btn" tool_tip="Скрыть текст пароляt"/>
</layout_panel>
<layout_panel name="mode_selection">
<text name="mode_selection_text">

View File

@ -19,6 +19,8 @@
<!-- The max length might be changed in FSPanelLogin.cpp for Opensim! -->
<line_editor name="password_edit" label="Пароль"/>
<check_box label="Запомнить пароль" name="remember_check"/>
<button name="password_show_btn" tool_tip="Показать текст пароля"/>
<button name="password_hide_btn" tool_tip="Скрыть текст пароляt"/>
</layout_panel> <!-- password_container -->
<layout_panel name="start_location_panel">
<combo_box label="Стартовое место" name="start_location_combo">

View File

@ -951,6 +951,7 @@ class Windows_x86_64_Manifest(ViewerManifest):
substitution_strings['installer_file'] = installer_file
substitution_strings['is64bit'] = (1 if (self.address_size == 64) else 0)
substitution_strings['isavx2'] = (1 if (self.fs_is_avx2()) else 0)
substitution_strings['is_opensim'] = self.fs_is_opensim() # <FS:Ansariel> FIRE-30446: Register hop-protocol for OS version only
substitution_strings['friendly_app_name'] = self.friendly_app_name() # <FS:Ansariel> FIRE-30446: Set FriendlyAppName for protocol registrations
substitution_strings['icon_suffix'] = ("_os" if (self.fs_is_opensim()) else "") # <FS:Ansariel> FIRE-24335: Use different icon for OpenSim version
@ -975,6 +976,7 @@ class Windows_x86_64_Manifest(ViewerManifest):
!define SHORTCUT "%(app_name)s"
!define URLNAME "secondlife"
!define IS64BIT "%(is64bit)d"
!define ISAVX2 "%(isavx2)d"
!define ISOPENSIM "%(is_opensim)d"
!define APPNAME "%(friendly_app_name)s"
!define ICON_SUFFIX "%(icon_suffix)s"
@ -2454,6 +2456,7 @@ if __name__ == "__main__":
dict(name='fmodstudio', description="""Indication if fmod studio libraries are needed""", default='OFF'),
dict(name='openal', description="""Indication openal libraries are needed""", default='OFF'),
dict(name='tracy', description="""Indication tracy profiler is enabled""", default='OFF'),
dict(name='avx2', description="""Indication avx2 instruction set is enabled""", default='OFF'),
]
try:
main(extra=extra_arguments)