# Conflicts:
#	indra/newview/CMakeLists.txt
#	indra/newview/llviewermenu.cpp
#	indra/newview/llvocache.cpp
master
Ansariel 2024-05-30 21:46:44 +02:00
commit c3fe64e6be
112 changed files with 1677 additions and 820 deletions

View File

@ -2,20 +2,52 @@ name: Build
on:
workflow_dispatch:
inputs:
release_run:
type: boolean
description: Do a release of this build
default: false
pull_request:
push:
branches: ["main", "release/*", "project/*"]
tags: ["Second_Life*"]
jobs:
# The whole point of the setvar job is that we want to set a variable once
# that will be consumed by multiple subsequent jobs. We tried setting it in
# the global env, but a job.env can't directly reference the global env
# context.
setvar:
runs-on: ubuntu-latest
outputs:
release_run: ${{ steps.setvar.outputs.release_run }}
env:
# Build with a tag like "Second_Life#abcdef0" to generate a release page
# (used for builds we are planning to deploy).
# When you want to use a string variable as a workflow YAML boolean, it's
# important to ensure it's the empty string when false. If you omit || '',
# its value when false is "false", which is interpreted as true.
RELEASE_RUN: ${{ (github.event.inputs.release_run || github.ref_type == 'tag' && startsWith(github.ref_name, 'Second_Life')) && 'Y' || '' }}
steps:
- name: Set Variable
id: setvar
shell: bash
run: |
echo "release_run=$RELEASE_RUN" >> "$GITHUB_OUTPUT"
build:
needs: setvar
strategy:
matrix:
runner: [windows-large, macos-12-xl]
configuration: [Release]
Linden: [true]
include:
- runner: macos-12-xl
developer_dir: "/Applications/Xcode_14.0.1.app/Contents/Developer"
- runner: windows-large
configuration: ReleaseOS
Linden: false
runs-on: ${{ matrix.runner }}
outputs:
viewer_channel: ${{ steps.build.outputs.viewer_channel }}
@ -37,7 +69,10 @@ jobs:
AUTOBUILD_VSVER: "170"
DEVELOPER_DIR: ${{ matrix.developer_dir }}
# Ensure that Linden viewer builds engage Bugsplat.
BUGSPLAT_DB: ${{ matrix.configuration != 'ReleaseOS' && 'SecondLife_Viewer_2018' || '' }}
BUGSPLAT_DB: ${{ matrix.Linden && 'SecondLife_Viewer_2018' || '' }}
# Run BUILD steps for Release configuration.
# Run BUILD steps for ReleaseOS configuration only for release runs.
BUILD: ${{ (matrix.Linden || needs.setvar.outputs.release_run) && 'Y' || '' }}
build_coverity: false
build_log_dir: ${{ github.workspace }}/.logs
build_viewer: true
@ -56,16 +91,19 @@ jobs:
variants: ${{ matrix.configuration }}
steps:
- name: Checkout code
if: env.BUILD
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Setup python
if: env.BUILD
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Checkout build variables
if: env.BUILD
uses: actions/checkout@v4
with:
repository: secondlife/build-variables
@ -73,17 +111,20 @@ jobs:
path: .build-variables
- name: Checkout master-message-template
if: env.BUILD
uses: actions/checkout@v4
with:
repository: secondlife/master-message-template
path: .master-message-template
- name: Install autobuild and python dependencies
if: env.BUILD
run: pip3 install autobuild llsd
- name: Cache autobuild packages
uses: actions/cache@v4
id: cache-installables
if: env.BUILD
uses: actions/cache@v4
with:
path: .autobuild-installables
key: ${{ runner.os }}-64-${{ matrix.configuration }}-${{ hashFiles('autobuild.xml') }}
@ -92,17 +133,19 @@ jobs:
${{ runner.os }}-64-
- name: Install windows dependencies
if: runner.os == 'Windows'
if: env.BUILD && runner.os == 'Windows'
run: choco install nsis-unicode
- name: Determine source branch
id: which-branch
if: env.BUILD
uses: secondlife/viewer-build-util/which-branch@v2
with:
token: ${{ github.token }}
- name: Build
id: build
if: env.BUILD
shell: bash
env:
AUTOBUILD_VCS_BRANCH: ${{ steps.which-branch.outputs.branch }}
@ -225,7 +268,7 @@ jobs:
echo "artifact=$RUNNER_OS$cfg_suffix" >> $GITHUB_OUTPUT
- name: Upload executable
if: matrix.configuration != 'ReleaseOS' && steps.build.outputs.viewer_app
if: matrix.Linden && steps.build.outputs.viewer_app
uses: actions/upload-artifact@v4
with:
name: "${{ steps.build.outputs.artifact }}-app"
@ -235,7 +278,7 @@ jobs:
# The other upload of nontrivial size is the symbol file. Use a distinct
# artifact for that too.
- name: Upload symbol file
if: matrix.configuration != 'ReleaseOS'
if: matrix.Linden
uses: actions/upload-artifact@v4
with:
name: "${{ steps.build.outputs.artifact }}-symbols"
@ -243,7 +286,7 @@ jobs:
${{ steps.build.outputs.symbolfile }}
- name: Upload metadata
if: matrix.configuration != 'ReleaseOS'
if: matrix.Linden
uses: actions/upload-artifact@v4
with:
name: "${{ steps.build.outputs.artifact }}-metadata"
@ -254,7 +297,7 @@ jobs:
- name: Upload physics package
uses: actions/upload-artifact@v4
# should only be set for viewer-private
if: matrix.configuration != 'ReleaseOS' && steps.build.outputs.physicstpv
if: matrix.Linden && steps.build.outputs.physicstpv
with:
name: "${{ steps.build.outputs.artifact }}-physics"
# emitted by build.sh, zero or one lines
@ -358,10 +401,9 @@ jobs:
version: ${{ needs.build.outputs.viewer_version }}
release:
needs: [build, sign-and-package-windows, sign-and-package-mac]
needs: [setvar, build, sign-and-package-windows, sign-and-package-mac]
runs-on: ubuntu-latest
# Build with a tag like "Second_Life#abcdef0" to generate a release page (used for builds we are planning to deploy).
if: github.ref_type == 'tag' && startsWith(github.ref_name, 'Second_Life')
if: needs.setvar.outputs.release_run
steps:
- uses: actions/download-artifact@v4
with:

View File

@ -115,8 +115,8 @@ jobs:
FS_RELEASE_TYPE=Alpha
elif [[ "${{ github.ref_name }}" == *nightly* ]] || [[ "${{ github.event_name }}" == 'schedule' ]]; then
FS_RELEASE_TYPE=Nightly
else
FS_RELEASE_TYPE=Unknown
elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
FS_RELEASE_TYPE=Manual
fi
if [[ "${{ matrix.addrsize }}" == "64" ]]; then
FS_RELEASE_CHAN="${FS_RELEASE_TYPE}x64"
@ -240,21 +240,31 @@ jobs:
done
shell: bash
- name: make Nightly builds expire after 14 days
if: env.FS_RELEASE_TYPE == 'Nightly'
- name: Set expiration days based on FS_RELEASE_TYPE
run: |
echo "EXTRA_ARGS=${{ env.EXTRA_ARGS}} --testbuild=14" >> $GITHUB_ENV
shell: bash
- name: make Alpha builds expire after 28 days
if: env.FS_RELEASE_TYPE == 'Alpha'
run: |
echo "EXTRA_ARGS=${{ env.EXTRA_ARGS}} --testbuild=28" >> $GITHUB_ENV
shell: bash
- name: make Beta builds expire after 28 days
if: env.FS_RELEASE_TYPE == 'Beta'
run: |
echo "EXTRA_ARGS=${{ env.EXTRA_ARGS}} --testbuild=60" >> $GITHUB_ENV
case "${{ env.FS_RELEASE_TYPE }}" in
"Nightly" | "Manual")
EXPIRE_DAYS=14
;;
"Alpha")
EXPIRE_DAYS=28
;;
"Beta")
EXPIRE_DAYS=60
;;
*)
EXPIRE_DAYS=""
;;
esac
if [ -n "$EXPIRE_DAYS" ]; then
echo "This ${{ env.FS_RELEASE_TYPE }} build will expire in $EXPIRE_DAYS"
echo "EXTRA_ARGS=${{ env.EXTRA_ARGS}} --testbuild=$EXPIRE_DAYS" >> $GITHUB_ENV
else
echo "This ${{ env.FS_RELEASE_TYPE }} has no built in expiry"
echo "EXTRA_ARGS=${{ env.EXTRA_ARGS}}" >> $GITHUB_ENV
fi
shell: bash
- name: Clean up packages to give more space
run: rm *${{ env.fallback_platform }}*bz2
shell: bash
@ -353,9 +363,12 @@ jobs:
elif [[ "${{ github.ref_name }}" == *alpha* ]]; then
FS_RELEASE_FOLDER=test
FS_BUILD_WEBHOOK_URL=${{ secrets.BETA_WEBHOOK_URL }}
elif [[ "${{ github.ref_name }}" == *nightly* ]] || [[ "${{ github.event_name }}" == 'schedule' ]]; then
elif [[ "${{ github.ref_name }}" == *nightly* ]] || [[ "${{ github.event_name }}" == 'schedule' ]]; then
FS_RELEASE_FOLDER=nightly
FS_BUILD_WEBHOOK_URL=${{ secrets.NIGHTLY_WEBHOOK_URL }}
elif [[ "${{github.event_name }}" == "workflow_dispatch" ]]; then
FS_RELEASE_FOLDER=test
FS_BUILD_WEBHOOK_URL=${{ secrets.BETA_WEBHOOK_URL }}
else
FS_RELEASE_TYPE=Unknown
fi

View File

@ -2817,51 +2817,37 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<map>
<key>platforms</key>
<map>
<key>darwin64</key>
<key>windows</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>49650353442698c3e05102676fe427d0ebe02f0b</string>
<string>fc67514183e7dbbb96bebb9970e1431c</string>
<key>hash_algorithm</key>
<string>sha1</string>
<string>md5</string>
<key>url</key>
<string>https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-darwin64-eecbf72.tar.zst</string>
<string>https://3p.firestormviewer.org/tracy-v0.10.241491433-windows-241491433.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
</map>
<key>windows64</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>2b80e7407e4f3e82eff3879add0e9ad63e7fcace</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
<string>https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-windows64-eecbf72.tar.zst</string>
</map>
<key>name</key>
<string>windows64</string>
<string>windows</string>
</map>
</map>
<key>license</key>
<string>bsd</string>
<key>license_file</key>
<string>LICENSES/tracy_license.txt</string>
<string>LICENSES/Tracy.txt</string>
<key>copyright</key>
<string>Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl)</string>
<key>version</key>
<string>v0.8.1-eecbf72</string>
<string>v0.10.241491433</string>
<key>name</key>
<string>tracy</string>
<key>canonical_repo</key>
<string>https://bitbucket.org/lindenlab/3p-tracy</string>
<string>https://github.com/beqjanus/3p-tracy</string>
<key>description</key>
<string>Tracy Profiler Library</string>
<key>source</key>
<string>https://bitbucket.org/lindenlab/3p-tracy</string>
<string>https://github.com/beqjanus/3p-tracy</string>
<key>source_type</key>
<string>git</string>
</map>

View File

@ -117,7 +117,7 @@ if(WINDOWS)
elseif (MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1930) # Visual Studio 2019
set(MSVC_VER 140)
set(MSVC_TOOLSET_VER 142)
elseif (MSVC_VERSION GREATER_EQUAL 1930 AND MSVC_VERSION LESS 1940) # Visual Studio 2022
elseif (MSVC_VERSION GREATER_EQUAL 1930 AND MSVC_VERSION LESS 1950) # Visual Studio 2022
set(MSVC_VER 140)
set(MSVC_TOOLSET_VER 143)
else (MSVC80)

View File

@ -10,7 +10,7 @@ if (USE_TRACY)
use_prebuilt_binary(tracy)
target_include_directories( ll::tracy SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/tracy)
target_link_libraries( ll::tracy INTERFACE TracyClient )
# target_link_libraries( ll::tracy INTERFACE TracyClient )
# See: indra/llcommon/llprofiler.h
add_compile_definitions(LL_PROFILER_CONFIGURATION=3)

View File

@ -268,8 +268,12 @@ if (DARWIN)
list(APPEND llcommon_SOURCE_FILES llsys_objc.mm)
endif (DARWIN)
# <FS:Beq/> Tracy Profiler support
# <FS:Beq> Tracy Profiler support
list(APPEND llcommon_SOURCE_FILES llprofiler.cpp)
if (USE_TRACY)
list(APPEND llcommon_SOURCE_FILES fstracyclient.cpp)
endif()
# </FS:Beq>
# <FS:ND> Add all nd* files. memory pool, intrinsics, ...

View File

@ -0,0 +1,8 @@
// Just a simple wrapper to easily import the single tracy source file and save
// all the pain of cross platform libraries in the Tracy 3p build.
#include "linden_common.h"
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY || LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY_FAST_TIMER
#include "TracyClient.cpp"
#endif // LL_PROFILER_CONFIGURATION

View File

@ -91,12 +91,12 @@ namespace LLProfiler
// #define TRACY_NO_BROADCAST 1
// #define TRACY_ONLY_LOCALHOST 1
#define TRACY_ONLY_IPV4 1
#include "Tracy.hpp"
#include "tracy/Tracy.hpp"
// <FS:Beq> Fixed mutual exclusion issues with RAM and GPU. NOTE: This might still break on Apple in which case we'll need to restrict that platform
//// GPU Mutually exclusive with detailed memory tracing
// #define LL_PROFILER_ENABLE_TRACY_OPENGL 0
#define LL_PROFILER_ENABLE_TRACY_MEMORY 0
#define LL_PROFILER_ENABLE_TRACY_OPENGL 0
#define LL_PROFILER_ENABLE_TRACY_OPENGL 1
// Enable RenderDoc labeling
#define LL_PROFILER_ENABLE_RENDER_DOC 0
@ -104,37 +104,37 @@ namespace LLProfiler
#endif
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY
#define LL_PROFILER_FRAME_END FrameMark
#define LL_PROFILER_FRAME_END FrameMark;
// <FS:Beq> Note: this threadlocal forces memory colelction enabled from the start. It conflicts with deferred profiling.
#define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name ); gProfilerEnabled = true;
// </FS:Beq>
#define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ) // C string
#define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ) // C string
#define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ); // C string
#define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ); // C string
// <FS:Beq> revert change that obscures custom FTM zones. We may want to may FTM Zones unique in future.
// #define LL_RECORD_BLOCK_TIME(name) ZoneScoped // Want descriptive names; was: ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active );
#define LL_RECORD_BLOCK_TIME(name) ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active )
#define LL_RECORD_BLOCK_TIME(name) ZoneNamedN( ___tracy_scoped_zone, #name, LLProfiler::active );
// </FS:Beq>
// <FS:Beq>
// #define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, true )
// #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, true ) // RGB
// #define LL_PROFILE_ZONE_SCOPED ZoneScoped
#define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active )
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ) // RGB
#define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ) // <FS:Beq/> Enable deferred collection through filters
#define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active );
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ); // RGB
#define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ); // <FS:Beq/> Enable deferred collection through filters
// </FS:Beq>
#define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val )
#define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size )
#define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val );
#define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size );
#define LL_PROFILE_ZONE_ERR(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0XFF0000 ) // RGB yellow
#define LL_PROFILE_ZONE_INFO(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0X00FFFF ) // RGB cyan
#define LL_PROFILE_ZONE_WARN(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0x0FFFF00 ) // RGB red
// <FS:Beq> Additional FS Tracy macros
#define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active ) // <FS:Beq/> Additional Tracy macro
#define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value)
#define LL_PROFILE_PLOT_SQ( name, prev, value ) TracyPlot(name,prev);TracyPlot( name, value)
#define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active );
#define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value);
#define LL_PROFILE_PLOT_CONFIG_SQUARE(name) TracyPlotConfig(name, tracy::PlotFormatType::Number, true, false, 0);
#define LL_PROFILE_IS_CONNECTED TracyIsConnected
// </FS:Beq>
#endif
@ -158,15 +158,15 @@ namespace LLProfiler
// <FS:Beq> Additional FS Tracy macros
#define LL_PROFILE_ZONE_COLOR(color)
#define LL_PROFILE_PLOT( name, value )
#define LL_PROFILE_PLOT_SQ( name, prev, value )
#define LL_PROFILE_PLOT_CONFIG_SQUARE(name)
#define LL_PROFILE_IS_CONNECTED
// </FS:Beq>
#endif
#if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY_FAST_TIMER
#define LL_PROFILER_FRAME_END FrameMark
#define LL_PROFILER_FRAME_END FrameMark;
#define LL_PROFILER_SET_THREAD_NAME( name ) tracy::SetThreadName( name ); gProfilerEnabled = true;
#define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ) // C string
#define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ) // C string
#define LL_PROFILER_THREAD_BEGIN(name) FrameMarkStart( name ); // C string
#define LL_PROFILER_THREAD_END(name) FrameMarkEnd( name ); // C string
// <FS:Beq> revert change that obscures custom FTM zones.
// #define LL_RECORD_BLOCK_TIME(name) ZoneScoped const LLTrace::BlockTimer& LL_GLUE_TOKENS(block_time_recorder, __LINE__)(LLTrace::timeThisBlock(name)); (void)LL_GLUE_TOKENS(block_time_recorder, __LINE__);
@ -177,20 +177,20 @@ namespace LLProfiler
// #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, true ) // RGB
// #define LL_PROFILE_ZONE_SCOPED ZoneScoped
#define LL_PROFILE_ZONE_NAMED(name) ZoneNamedN( ___tracy_scoped_zone, name, LLProfiler::active );
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ) // RGB
#define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ) // <FS:Beq/> Enable deferred collection through filters
#define LL_PROFILE_ZONE_NAMED_COLOR(name,color) ZoneNamedNC( ___tracy_scopped_zone, name, color, LLProfiler::active ); // RGB
#define LL_PROFILE_ZONE_SCOPED ZoneNamed( ___tracy_scoped_zone, LLProfiler::active ); // <FS:Beq/> Enable deferred collection through filters
// </FS:Beq>
#define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val )
#define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size )
#define LL_PROFILE_ZONE_NUM( val ) ZoneValue( val );
#define LL_PROFILE_ZONE_TEXT( text, size ) ZoneText( text, size );
#define LL_PROFILE_ZONE_ERR(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0XFF0000 ) // RGB yellow
#define LL_PROFILE_ZONE_INFO(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0X00FFFF ) // RGB cyan
#define LL_PROFILE_ZONE_WARN(name) LL_PROFILE_ZONE_NAMED_COLOR( name, 0x0FFFF00 ) // RGB red
// <FS:Beq> Additional FS Tracy macros
#define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active )
#define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value)
#define LL_PROFILE_PLOT_SQ( name, prev, value ) TracyPlot( name, prev );TracyPlot( name, value )
#define LL_PROFILE_ZONE_COLOR(color) ZoneNamedC( ___tracy_scoped_zone, color, LLProfiler::active );
#define LL_PROFILE_PLOT( name, value ) TracyPlot( name, value);
#define LL_PROFILE_PLOT_CONFIG_SQUARE(name) TracyPlotConfig(name, tracy::PlotFormatType::Number, true, false, 0);
#define LL_PROFILE_IS_CONNECTED TracyIsConnected
// </FS:Beq>
#endif
@ -215,16 +215,17 @@ namespace LLProfiler
// <FS:Ansariel> Additional FS Tracy macros
#define LL_PROFILE_ZONE_COLOR(color)
#define LL_PROFILE_PLOT( name, value )
#define LL_PROFILE_PLOT_SQ( name, prev, value )
#define LL_PROFILE_PLOT_CONFIG_SQUARE(name)
#define LL_PROFILE_IS_CONNECTED
// </FS:Ansariel>
#endif // LL_PROFILER
#if LL_PROFILER_ENABLE_TRACY_OPENGL
#define LL_PROFILE_GPU_ZONE(name) TracyGpuZone(name)
#define LL_PROFILE_GPU_ZONEC(name,color) TracyGpuZoneC(name,color)
#define LL_PROFILER_GPU_COLLECT TracyGpuCollect
#define LL_PROFILER_GPU_CONTEXT TracyGpuContext
#define LL_PROFILE_GPU_ZONE(name) TracyGpuZone(name);
#define LL_PROFILE_GPU_ZONEC(name,color) TracyGpuZoneC(name,color);
#define LL_PROFILER_GPU_COLLECT TracyGpuCollect;
#define LL_PROFILER_GPU_CONTEXT TracyGpuContext;
#define LL_PROFILER_GPU_CONTEXT_NS(name, size) TracyGpuContext;TracyGpuContextName(name,size);
// disable memory tracking (incompatible with GPU tracing
#define LL_PROFILE_ALLOC(ptr, size) (void)(ptr); (void)(size);
@ -234,12 +235,13 @@ namespace LLProfiler
#define LL_PROFILE_GPU_ZONEC(name,color) (void)name;(void)color;
#define LL_PROFILER_GPU_COLLECT
#define LL_PROFILER_GPU_CONTEXT
#define LL_PROFILER_GPU_CONTEXT_NS(name, size) (void)name;(void)size;
#define LL_LABEL_OBJECT_GL(type, name, length, label)
#if LL_PROFILER_CONFIGURATION > 1
#define LL_PROFILE_ALLOC(ptr, size) TracyAlloc(ptr, size)
#define LL_PROFILE_FREE(ptr) TracyFree(ptr)
#define LL_PROFILE_ALLOC(ptr, size) TracyAlloc(ptr, size);
#define LL_PROFILE_FREE(ptr) TracyFree(ptr);
#else
#define LL_PROFILE_ALLOC(ptr, size) (void)(ptr); (void)(size);
#define LL_PROFILE_FREE(ptr) (void)(ptr);
@ -248,7 +250,7 @@ namespace LLProfiler
#endif
#if LL_PROFILER_ENABLE_RENDER_DOC
#define LL_LABEL_OBJECT_GL(type, name, length, label) glObjectLabel(type, name, length, label)
#define LL_LABEL_OBJECT_GL(type, name, length, label) glObjectLabel(type, name, length, label);
#else
#define LL_LABEL_OBJECT_GL(type, name, length, label)
#endif

View File

@ -122,6 +122,7 @@ void LLSDSerialize::serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize
// static
bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, llssize max_bytes)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_LLSD;
char hdr_buf[MAX_HDR_LEN + 1] = ""; /* Flawfinder: ignore */
bool fail_if_not_legacy = false;

View File

@ -456,6 +456,7 @@ template<class T> std::string LLStringUtilBase<T>::sLocale;
typedef LLStringUtilBase<char> LLStringUtil;
typedef LLStringUtilBase<llwchar> LLWStringUtil;
typedef std::basic_string<llwchar> LLWString;
typedef std::basic_string_view<llwchar> LLWStringView;
//@ Use this where we want to disallow input in the form of "foo"
// This is used to catch places where english text is embedded in the code

View File

@ -70,7 +70,7 @@ LLTimer* LLTimer::sTimer = NULL;
#if 0
void ms_sleep(U32 ms)
{
LL_PROFILE_ZONE_SCOPED;
// LL_PROFILE_ZONE_SCOPED;
using TimePoint = std::chrono::steady_clock::time_point;
auto resume_time = TimePoint::clock::now() + std::chrono::milliseconds(ms);
while (TimePoint::clock::now() < resume_time)

View File

@ -213,6 +213,7 @@ void HttpPolicy::retryOp(const HttpOpRequest::ptr_t &op)
//
HttpService::ELoopSpeed HttpPolicy::processReadyQueue()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;// <FS:Beq/> missing http trace
const HttpTime now(totalTime());
HttpService::ELoopSpeed result(HttpService::REQUEST_SLEEP);
HttpLibcurl & transport(mService->getTransport());

View File

@ -365,6 +365,7 @@ public:
BOOL callHandlerFunc(LLMessageSystem *msgsystem) const
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if (mHandlerFunc)
{

View File

@ -541,6 +541,11 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
llassert( mCurrentRMessageTemplate);
llassert( !mCurrentRMessageData );
delete mCurrentRMessageData; // just to make sure
// <FS:Beq> storage for Tracy tag
#ifdef TRACY_ENABLE
static char msgstr[36];
#endif
// </FS:Beq>
// The offset tells us how may bytes to skip after the end of the
// message name.
@ -556,6 +561,7 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
iter != mCurrentRMessageTemplate->mMemberBlocks.end();
++iter)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("BuildFromTemplate");
LLMessageBlock* mbci = *iter;
U8 repeat_number;
S32 i;
@ -598,6 +604,13 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
}
LLMsgBlkData* cur_data_block = NULL;
// <FS:Beq> Tracy Message processing
LL_DEBUGS("LLMessage") << "Processing " << mbci->mName << " with " << repeat_number << " repetitions" << LL_ENDL;
#ifdef TRACY_ENABLE
strncpy(msgstr, mbci->mName, 35);
LL_PROFILE_ZONE_TEXT(msgstr, 35);
#endif
// </FS:Beq>
// now loop through the block
for (i = 0; i < repeat_number; i++)
@ -622,6 +635,7 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
mbci->mMemberVariables.begin();
iter != mbci->mMemberVariables.end(); iter++)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("AddVariables");
const LLMessageVariable& mvci = **iter;
// ok, build out the variables
@ -704,6 +718,12 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
}
{
// <FS:Beq> Tracy Message processing
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("ProcessMessage");
#ifdef TRACY_ENABLE
LL_PROFILE_ZONE_TEXT(msgstr, 35);
#endif
// </FS:Beq>
static LLTimer decode_timer;
if(LLMessageReader::getTimeDecodes() || gMessageSystem->getTimingCallback())
@ -742,7 +762,7 @@ BOOL LLTemplateMessageReader::decodeData(const U8* buffer, const LLHost& sender
if(decode_time > LLMessageReader::getTimeDecodesSpamThreshold())
{
LL_DEBUGS() << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" <<
LL_DEBUGS("LLMessage") << "--------- Message " << mCurrentRMessageTemplate->mName << " decode took " << decode_time << " seconds. (" <<
mCurrentRMessageTemplate->mMaxDecodeTimePerMsg << " max, " <<
(mCurrentRMessageTemplate->mTotalDecodeTime / mCurrentRMessageTemplate->mTotalDecoded) << " avg)" << LL_ENDL;
}

View File

@ -2547,6 +2547,7 @@ void LLImageGLThread::run()
// WorkQueue, likewise cleanup afterwards.
mWindow->makeContextCurrent(mContext);
gGL.init(false);
LL_PROFILER_GPU_CONTEXT_NS("LLImageGL Context", 17);
LL::ThreadPool::run();
gGL.shutdown();
mWindow->destroySharedContext(mContext);

View File

@ -237,6 +237,7 @@ public:
{
mWindow->makeContextCurrent(mContext);
gGL.init(false);
LL_PROFILER_GPU_CONTEXT_NS("LLGLWorker Context", 18);
mQueue->runUntilClose();
gGL.shutdown();
mWindow->destroySharedContext(mContext);

View File

@ -1686,6 +1686,7 @@ const S32 max_format = (S32)num_formats - 1;
close();
return FALSE;
}
//LL_PROFILER_GPU_CONTEXT; <FS:Beq/> TODO(Beq) review this
LL_PROFILER_GPU_CONTEXT
@ -1720,7 +1721,7 @@ const S32 max_format = (S32)num_formats - 1;
swapBuffers();
}
LL_PROFILER_GPU_CONTEXT;
LL_PROFILER_GPU_CONTEXT_NS("MainGL Context", 14);
return TRUE;
}
@ -1890,7 +1891,7 @@ void* LLWindowWin32::createSharedContext()
void LLWindowWin32::makeContextCurrent(void* contextPtr)
{
wglMakeCurrent(mhDC, (HGLRC) contextPtr);
LL_PROFILER_GPU_CONTEXT;
}
void LLWindowWin32::destroySharedContext(void* contextPtr)

View File

@ -123,16 +123,21 @@ LLXmlTreeNode::LLXmlTreeNode( const std::string& name, LLXmlTreeNode* parent, LL
{
}
// <FS:Beq/> Fix formatting and modernise
// I don't even think the for loops are needed though.
LLXmlTreeNode::~LLXmlTreeNode()
{
attribute_map_t::iterator iter;
for (iter=mAttributes.begin(); iter != mAttributes.end(); iter++)
delete iter->second;
for(LLXmlTreeNode* node : mChildren)
{
delete node;
}
mChildren.clear();
for (auto& attr : mAttributes)
{
delete attr.second;
}
mAttributes.clear();
for (auto& child : mChildren)
{
delete child;
}
mChildren.clear();
}
void LLXmlTreeNode::dump( const std::string& prefix )

View File

@ -139,6 +139,7 @@ set(viewer_SOURCE_FILES
fsfloatervolumecontrols.cpp
fsfloatervramusage.cpp
fsfloaterwearablefavorites.cpp
fsfloaterwhitelisthelper.cpp
fskeywords.cpp
fslslbridge.cpp
fslslbridgerequest.cpp
@ -167,6 +168,7 @@ set(viewer_SOURCE_FILES
fsscriptlibrary.cpp
fsscrolllistctrl.cpp
fsslurlcommand.cpp
fsworldmapmessage.cpp
lggbeamcolormapfloater.cpp
lggbeammapfloater.cpp
lggbeammaps.cpp
@ -178,8 +180,6 @@ set(viewer_SOURCE_FILES
llpanelopenregionsettings.cpp
# <FS:Ansariel> [Legacy Bake]
llagentwearablesfetch.cpp
# local mesh
vjlocalmesh.cpp
vjfloaterlocalmesh.cpp
vjlocalmeshimportdae.cpp
@ -938,6 +938,7 @@ set(viewer_HEADER_FILES
fsfloatervolumecontrols.h
fsfloatervramusage.h
fsfloaterwearablefavorites.h
fsfloaterwhitelisthelper.h
fsgridhandler.h
fskeywords.h
fslslbridge.h
@ -968,6 +969,7 @@ set(viewer_HEADER_FILES
fsscrolllistctrl.h
fsslurl.h
fsslurlcommand.h
fsworldmapmessage.h
lggbeamcolormapfloater.h
lggbeammapfloater.h
lggbeammaps.h
@ -978,8 +980,6 @@ set(viewer_HEADER_FILES
llfloaterflickr.h
# <FS:Ansariel> [Legacy Bake]
llagentwearablesfetch.h
# local mesh
vjlocalmesh.h
vjfloaterlocalmesh.h
vjlocalmeshimportdae.h

View File

@ -505,7 +505,7 @@ bool FSCommon::isFilterEditorKeyCombo(KEY key, MASK mask)
LLUUID FSCommon::getGroupForRezzing()
{
LLUUID group_id = gAgent.getGroupID();
LLUUID group_id{ gAgent.getGroupID() };
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if (parcel && gSavedSettings.getBOOL("RezUnderLandGroup"))
@ -523,12 +523,12 @@ LLUUID FSCommon::getGroupForRezzing()
return group_id;
}
void FSCommon::updateUsedEmojis(LLWString text)
void FSCommon::updateUsedEmojis(LLWStringView text)
{
LLEmojiDictionary* dictionary = LLEmojiDictionary::getInstance();
bool emojiSent = false;
for (llwchar& c : text)
bool emojiSent{ false };
for (const llwchar& c : text)
{
if (dictionary->isEmoji(c))
{

View File

@ -94,7 +94,7 @@ namespace FSCommon
LLUUID getGroupForRezzing();
void updateUsedEmojis(LLWString text);
void updateUsedEmojis(LLWStringView text);
};
#endif // FS_COMMON_H

View File

@ -1307,16 +1307,15 @@ void FSFloaterIM::setDocked(bool docked, bool pop_on_undock)
{
// update notification channel state
LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
(LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLNotificationsUI::NOTIFICATION_CHANNEL_UUID));
if(!isChatMultiTab())
if (!isChatMultiTab())
{
LLTransientDockableFloater::setDocked(docked, pop_on_undock);
}
// update notification channel state
if(channel)
if (channel)
{
channel->updateShowToastsState();
channel->redrawToasts();
@ -1326,8 +1325,7 @@ void FSFloaterIM::setDocked(bool docked, bool pop_on_undock)
void FSFloaterIM::setVisible(BOOL visible)
{
LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
(LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLNotificationsUI::NOTIFICATION_CHANNEL_UUID));
LLTransientDockableFloater::setVisible(visible);
// update notification channel state
@ -1552,9 +1550,8 @@ void FSFloaterIM::updateMessages()
{
// remove embedded notification from channel
LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
if (getVisible())
(LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLNotificationsUI::NOTIFICATION_CHANNEL_UUID));
if (channel && getVisible())
{
// toast will be automatically closed since it is not storable toast
channel->hideToast(chat.mNotifId);

View File

@ -0,0 +1,87 @@
/**
* @file fsfloaterwhitelisthelper.cpp
* @brief Helper tool implementation to display paths to whitelist in antivirus tools
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* 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
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "fsfloaterwhitelisthelper.h"
#include "lltexteditor.h"
#include "llviewercontrol.h"
#include "lldir.h"
FSFloaterWhiteListHelper::FSFloaterWhiteListHelper(const LLSD& key) : LLFloater(key)
{
}
BOOL FSFloaterWhiteListHelper::postBuild()
{
populateWhitelistInfo();
return TRUE;
}
void FSFloaterWhiteListHelper::populateWhitelistInfo()
{
// Hopefully we can trash this bit soon in favor of webRTC
#if LL_WINDOWS
// On windows use exe (not work or RO) directory
std::string voiceexe_path = gDirUtilp->getExecutableDir();
gDirUtilp->append(voiceexe_path, "SLVoice.exe");
#elif LL_DARWIN
// On MAC use resource directory
std::string voiceexe_path = gDirUtilp->getAppRODataDir();
gDirUtilp->append(voiceexe_path, "SLVoice");
#else
std::string voiceexe_path = gDirUtilp->getExecutableDir();
bool usingWine = gSavedSettings.getBOOL("FSLinuxEnableWin64VoiceProxy");
if (!usingWine)
{
gDirUtilp->append(voiceexe_path, "SLVoice"); // native version
}
else
{
gDirUtilp->append(voiceexe_path, "win64/SLVoice.exe"); // use bundled win64 version
}
#endif
const std::string slpluginexe_path = gDirUtilp->getLLPluginLauncher();
std::string whitelist_folder_info =
gDirUtilp->getExecutableDir() + "\n" // Executable Dir
+ gDirUtilp->getOSUserAppDir() + "\n" // Top-level User Data Dir
+ gDirUtilp->getCacheDir(); // "Cache Dir
std::string whitelist_exe_info =
gDirUtilp->getExecutableFilename() + "\n" // Viewer Binary
+ gDirUtilp->getExecutablePathAndName() + "\n" // Viewer Binary full path
+ gDirUtilp->getBaseFileName(voiceexe_path, false) + "\n" // " Voice Binary"
+ voiceexe_path + "\n" // slvoice full path
+ gDirUtilp->getBaseFileName(slpluginexe_path, false) + "\n" // SLPlugin Launcher Binary
+ slpluginexe_path + "\n"; // SLPlugin Launcher full path
getChild<LLTextEditor>("whitelist_folders_editor")->setText(whitelist_folder_info);
getChild<LLTextEditor>("whitelist_exes_editor")->setText(whitelist_exe_info);
}

View File

@ -0,0 +1,44 @@
/**
* @file fsfloaterwhitelisthelper.h
* @brief Helper tool header file to display paths to whitelist in antivirus tools
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* 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
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#ifndef FSFLOATERWHITELISTHELPER_H
#define FSFLOATERWHITELISTHELPER_H
#include "llfloater.h"
class FSFloaterWhiteListHelper : public LLFloater
{
public:
explicit FSFloaterWhiteListHelper(const LLSD& key);
~FSFloaterWhiteListHelper() final = default;
BOOL postBuild() override final;
private:
void populateWhitelistInfo();
};
#endif // FSFLOATERWHITELISTHELPER_H

View File

@ -90,13 +90,15 @@ public:
//=============================================================================
FSRadar::FSRadar() :
mRadarAlertRequest(false),
mRadarFrameCount(0),
mRadarLastBulkOffsetRequestTime(0),
mRadarLastRequestTime(0.f),
mShowUsernamesCallbackConnection(),
mNameFormatCallbackConnection(),
mAgeAlertCallbackConnection()
mRadarAlertRequest(false),
mRadarFrameCount(0),
mRadarLastBulkOffsetRequestTime(0),
mRadarLastRequestTime(0.f),
mShowUsernamesCallbackConnection(),
mNameFormatCallbackConnection(),
mAgeAlertCallbackConnection(),
mRegionCapabilitiesReceivedCallbackConnection(),
mRegionChangedCallbackConnection()
{
// Use the callback from LLAvatarNameCache here or we might update the names too early!
LLAvatarNameCache::getInstance()->addUseDisplayNamesCallback(boost::bind(&FSRadar::updateNames, this));
@ -104,10 +106,18 @@ FSRadar::FSRadar() :
mNameFormatCallbackConnection = gSavedSettings.getControl("RadarNameFormat")->getSignal()->connect(boost::bind(&FSRadar::updateNames, this));
mAgeAlertCallbackConnection = gSavedSettings.getControl("RadarAvatarAgeAlertValue")->getSignal()->connect(boost::bind(&FSRadar::updateAgeAlertCheck, this));
mRegionChangedCallbackConnection = gAgent.addRegionChangedCallback([this]() { onRegionChanged(); });
}
FSRadar::~FSRadar()
{
gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection);
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
}
if (mShowUsernamesCallbackConnection.connected())
{
mShowUsernamesCallbackConnection.disconnect();
@ -594,9 +604,9 @@ void FSRadar::updateRadarList()
entry_options["name_style"] = nameCellStyle;
LLColor4 name_color = colortable.getColor("AvatarListItemIconDefaultColor", LLColor4::white).get();
name_color = contactsets->colorize(avId, (sFSRadarColorNamesByDistance ? range_color.get() : name_color), LGG_CS_RADAR);
name_color = contactsets->colorize(avId, (sFSRadarColorNamesByDistance ? range_color.get() : name_color), ContactSetType::RADAR);
contactsets->hasFriendColorThatShouldShow(avId, LGG_CS_RADAR, name_color);
contactsets->hasFriendColorThatShouldShow(avId, ContactSetType::RADAR, name_color);
entry_options["name_color"] = name_color.getValue();
@ -1040,8 +1050,35 @@ void FSRadar::updateAgeAlertCheck()
void FSRadar::updateNotes(const LLUUID& avatar_id, std::string_view notes)
{
if (auto entry = getEntry(avatar_id); entry)
if (auto entry = getEntry(avatar_id))
{
entry->setNotes(notes);
}
}
void FSRadar::onRegionChanged()
{
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
}
if (auto region = gAgent.getRegion())
{
if (region->capabilitiesReceived())
{
for (auto& [id, entry] : mEntryList)
entry->requestProperties();
}
else
{
mRegionCapabilitiesReceivedCallbackConnection = region->setCapabilitiesReceivedCallback(
[this](const LLUUID&, LLViewerRegion*)
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
for (auto& [id, entry] : mEntryList)
entry->requestProperties();
});
}
}
}

View File

@ -119,6 +119,8 @@ private:
void radarAlertMsg(const LLUUID& agent_id, const LLAvatarName& av_name, std::string_view postMsg);
void updateAgeAlertCheck();
void onRegionChanged();
std::unique_ptr<Updater> mRadarListUpdater;
struct RadarFields
@ -150,6 +152,9 @@ private:
boost::signals2::connection mShowUsernamesCallbackConnection;
boost::signals2::connection mNameFormatCallbackConnection;
boost::signals2::connection mAgeAlertCallbackConnection;
boost::signals2::connection mRegionCapabilitiesReceivedCallbackConnection;
boost::signals2::connection mRegionChangedCallbackConnection;
};
#endif // FS_RADAR_H

View File

@ -35,7 +35,7 @@
#include "llviewerregion.h"
#include "rlvhandler.h"
static constexpr char* CAPNAME = "AgentProfile";
static constexpr char CAPNAME[] = "AgentProfile";
FSRadarEntry::FSRadarEntry(const LLUUID& avid)
: mID(avid),
@ -55,85 +55,10 @@ FSRadarEntry::FSRadarEntry(const LLUUID& avid)
mNotes(LLStringUtil::null),
mAlertAge(false),
mAgeAlertPerformed(false),
mAvatarNameCallbackConnection(),
mRegionCapabilitiesReceivedCallbackConnection(),
mRegionChangedCallbackConnection()
mPropertiesRequested(false),
mAvatarNameCallbackConnection()
{
if (mID.notNull())
{
// NOTE: typically we request these once on creation to avoid excess traffic/processing.
//This means updates to these properties won't typically be seen while target is in nearby range.
LLAvatarPropertiesProcessor* processor = LLAvatarPropertiesProcessor::getInstance();
processor->addObserver(mID, this);
if (auto region = gAgent.getRegion(); region)
{
if (region->capabilitiesReceived())
{
if (LLGridManager::instance().isInSecondLife() || region->isCapabilityAvailable(CAPNAME))
{
processor->sendAvatarPropertiesRequest(mID);
}
else
{
processor->sendAvatarLegacyPropertiesRequest(mID);
processor->sendAvatarNotesRequest(mID);
}
}
else
{
auto capsReceivedCb = [this](const LLUUID&, LLViewerRegion* reg)
{
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
}
gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection);
if (LLGridManager::instance().isInSecondLife() || (reg && reg->isCapabilityAvailable(CAPNAME)))
{
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(mID);
}
else
{
LLAvatarPropertiesProcessor::getInstance()->sendAvatarLegacyPropertiesRequest(mID);
LLAvatarPropertiesProcessor::getInstance()->sendAvatarNotesRequest(mID);
}
};
mRegionChangedCallbackConnection = gAgent.addRegionChangedCallback([this, capsReceivedCb]()
{
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
}
if (auto newregion = gAgent.getRegion(); newregion)
{
if (newregion->capabilitiesReceived())
{
gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection);
if (LLGridManager::instance().isInSecondLife() || newregion->isCapabilityAvailable(CAPNAME))
{
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(mID);
}
else
{
LLAvatarPropertiesProcessor::getInstance()->sendAvatarLegacyPropertiesRequest(mID);
LLAvatarPropertiesProcessor::getInstance()->sendAvatarNotesRequest(mID);
}
}
else
{
mRegionCapabilitiesReceivedCallbackConnection = newregion->setCapabilitiesReceivedCallback(capsReceivedCb);
}
}
});
mRegionCapabilitiesReceivedCallbackConnection = region->setCapabilitiesReceivedCallback(capsReceivedCb);
}
}
}
requestProperties();
updateName();
}
@ -147,11 +72,34 @@ FSRadarEntry::~FSRadarEntry()
{
mAvatarNameCallbackConnection.disconnect();
}
if (mRegionCapabilitiesReceivedCallbackConnection.connected())
}
void FSRadarEntry::requestProperties()
{
if (!mPropertiesRequested && mID.notNull())
{
mRegionCapabilitiesReceivedCallbackConnection.disconnect();
// NOTE: typically we request these once on creation to avoid excess traffic/processing.
//This means updates to these properties won't typically be seen while target is in nearby range.
LLAvatarPropertiesProcessor* processor = LLAvatarPropertiesProcessor::getInstance();
processor->addObserver(mID, this);
if (auto region = gAgent.getRegion())
{
if (region->capabilitiesReceived())
{
if (LLGridManager::instance().isInSecondLife() || region->isCapabilityAvailable(CAPNAME))
{
processor->sendAvatarPropertiesRequest(mID);
}
else
{
processor->sendAvatarLegacyPropertiesRequest(mID);
processor->sendAvatarNotesRequest(mID);
}
mPropertiesRequested = true;
}
}
}
gAgent.removeRegionChangedCallback(mRegionChangedCallbackConnection);
}
void FSRadarEntry::updateName()

View File

@ -68,6 +68,7 @@ public:
private:
void updateName();
void onAvatarNameCache(const LLUUID& av_id, const LLAvatarName& av_name);
void requestProperties();
void processProperties(void* data, EAvatarProcessorType type);
LLUUID mID;
@ -87,10 +88,9 @@ private:
bool mIgnore;
bool mAlertAge;
bool mAgeAlertPerformed;
bool mPropertiesRequested;
LLAvatarNameCache::callback_connection_t mAvatarNameCallbackConnection;
boost::signals2::connection mRegionCapabilitiesReceivedCallbackConnection;
boost::signals2::connection mRegionChangedCallbackConnection;
};
#endif // FS_RADARENTRY_H

View File

@ -0,0 +1,211 @@
/**
* @file fsworldmapmessage.cpp
* @brief FS specific extensions to world map handling for OpenSim
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* 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
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*
*/
// potential workaround for hop://grid:port/Partial/x/y/z resolution
// 2024.04.30 humbletim
// notes:
// - exact MapNameRequests are sent flagless here (not using LAYER_FLAG)
// - this is to avoid triggering OpenSim code paths that modify result names
// - only affects LLWorldMapMessage->sendNamedRegionRequest(name, callback, ...)
// - in particular where a grid hosts overlapping names, hop Region matching may work better
#include "llviewerprecompiledheaders.h"
#ifdef OPENSIM
#include "fsworldmapmessage.h"
#include "llagent.h"
#include "llworldmap.h" // grid_to_region_handle
#include "fsgridhandler.h"
#include "llworldmapmessage.h"
#include "message.h"
#include <regex>
#define htxhop_log(format, ...) LL_DEBUGS("GridManager") << llformat(format, __VA_ARGS__) << LL_ENDL;
static inline std::string extract_region(const std::string& s)
{
static auto const& patterns = {
std::regex { R"(/ ([^/:=]+)$)" }, // TODO: figure out where the spec lives for hop "slash space" embedding...
std::regex { R"(([^/:=]+)$)" }, // TODO: figure out where the spec lives for hop "grid:port:region" embedding...
};
std::smatch match_results;
std::string ls { s };
LLStringUtil::toLower(ls);
for (const auto& pattern : patterns)
{
if (std::regex_search(ls, match_results, pattern))
{
return match_results[1].str();
}
}
return {};
}
// helper to encapsulate Region Map Block responses
struct _MapBlock
{
S32 index {};
U16 x_regions {}, y_regions {}, x_size { REGION_WIDTH_UNITS }, y_size { REGION_WIDTH_UNITS };
std::string name {};
U8 accesscode {};
U32 region_flags {};
LLUUID image_id {};
inline U32 x_world() const { return (U32)(x_regions)*REGION_WIDTH_UNITS; }
inline U32 y_world() const { return (U32)(y_regions)*REGION_WIDTH_UNITS; }
inline U64 region_handle() const { return grid_to_region_handle(x_regions, y_regions); }
// see: LLWorldMapMessage::processMapBlockReply
_MapBlock(LLMessageSystem* msg, S32 block)
: index(block)
{
msg->getU16Fast(_PREHASH_Data, _PREHASH_X, x_regions, block);
msg->getU16Fast(_PREHASH_Data, _PREHASH_Y, y_regions, block);
msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block);
msg->getU8Fast(_PREHASH_Data, _PREHASH_Access, accesscode, block);
msg->getU32Fast(_PREHASH_Data, _PREHASH_RegionFlags, region_flags, block);
// msg->getU8Fast(_PREHASH_Data, _PREHASH_WaterHeight, water_height, block);
// msg->getU8Fast(_PREHASH_Data, _PREHASH_Agents, agents, block);
msg->getUUIDFast(_PREHASH_Data, _PREHASH_MapImageID, image_id, block);
// <FS:CR> Aurora Sim
if (msg->getNumberOfBlocksFast(_PREHASH_Size) > 0)
{
msg->getU16Fast(_PREHASH_Size, _PREHASH_SizeX, x_size, block);
msg->getU16Fast(_PREHASH_Size, _PREHASH_SizeY, y_size, block);
}
if (x_size == 0 || (x_size % 16) != 0 || (y_size % 16) != 0)
{
x_size = 256;
y_size = 256;
}
// </FS:CR> Aurora Sim
}
};
constexpr U32 EXACT_FLAG = 0x00000000;
constexpr U32 LAYER_FLAG = 0x00000002;
// see: LLWorldMapMessage::sendNamedRegionRequest
static void _hypergrid_sendMapNameRequest(const std::string& region_name, U32 flags)
{
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_MapNameRequest);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->addU32Fast(_PREHASH_Flags, flags);
msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
msg->addBOOLFast(_PREHASH_Godlike, false); // Filled in on sim
msg->nextBlockFast(_PREHASH_NameData);
msg->addStringFast(_PREHASH_Name, region_name);
gAgent.sendReliableMessage();
}
struct _AdoptedRegionNameQuery
{
std::string key{};
std::string region_name{};
url_callback_t arbitrary_callback;
std::string arbitrary_slurl{};
bool arbitrary_teleport{ false };
};
// map extracted region names => pending query entries
static std::map<std::string, _AdoptedRegionNameQuery> _region_name_queries;
bool hypergrid_sendExactNamedRegionRequest(const std::string& region_name, const url_callback_t& callback, const std::string& callback_url, bool teleport)
{
if (!LLGridManager::instance().isInOpenSim() || !callback)
{
return false;
}
auto key = extract_region(region_name);
if (key.empty())
{
return false;
}
_region_name_queries[key] = { key, region_name, callback, callback_url, teleport };
htxhop_log("Send Region Name '%s' (key: %s)", region_name.c_str(), key.c_str());
_hypergrid_sendMapNameRequest(region_name, EXACT_FLAG);
return true;
}
bool hypergrid_processExactNamedRegionResponse(LLMessageSystem* msg, U32 agent_flags)
{
if (!LLGridManager::instance().isInOpenSim() || !msg || agent_flags & LAYER_FLAG)
{
return false;
}
// NOTE: we assume only agent_flags have been read from msg so far
S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data);
std::vector<_MapBlock> blocks;
blocks.reserve(num_blocks);
for (S32 b = 0; b < num_blocks; b++)
{
blocks.emplace_back(msg, b);
}
for (const auto& _block : blocks)
{
htxhop_log("#%02d key='%s' block.name='%s' block.region_handle=%llu", _block.index, extract_region(_block.name).c_str(), _block.name.c_str(), _block.region_handle());
}
// special case: handle singular result w/empty name tho valid region handle AND singular pending query as a match
// (might be that a landing area / redirect hop URL is coming back: "^hop://grid:port/$", which extract_region's into "")
bool solo_result = blocks.size() == 2 && blocks[0].region_handle() && extract_region(blocks[0].name).empty() && !blocks[1].region_handle();
if (solo_result && _region_name_queries.size() == 1)
{
htxhop_log("applying first block as redirect; region_handle: %llu", blocks[0].region_handle());
blocks[0].name = _region_name_queries.begin()->second.region_name;
}
for (const auto& _block : blocks)
{
auto key = extract_region(_block.name);
if (key.empty())
{
continue;
}
auto idx = _region_name_queries.find(key);
if (idx == _region_name_queries.end())
{
continue;
}
const auto& pending = idx->second;
htxhop_log("Recv Region Name '%s' (key: %s) block.name='%s' block.region_handle=%llu)", pending.region_name.c_str(),
pending.key.c_str(), _block.name.c_str(), _block.region_handle());
_region_name_queries.erase(idx);
pending.arbitrary_callback(_block.region_handle(), pending.arbitrary_slurl, _block.image_id, pending.arbitrary_teleport);
return true;
}
return false;
}
#endif

View File

@ -0,0 +1,46 @@
/**
* @file fsworldmapmessage.h
* @brief FS specific extensions to world map handling for OpenSim
*
* $LicenseInfo:firstyear=2024&license=fsviewerlgpl$
* Phoenix Firestorm Viewer Source Code
* 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
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
* http://www.firestormviewer.org
* $/LicenseInfo$
*/
#ifndef FS_WORLDMAPMESSAGE_H
#define FS_WORLDMAPMESSAGE_H
#ifdef OPENSIM
#include <stdtypes.h>
#include <functional>
#include <string>
class LLMessageSystem;
class LLUUID;
using url_callback_t = std::function<void(uint64_t region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)>;
bool hypergrid_sendExactNamedRegionRequest(const std::string& region_name, const url_callback_t& callback, const std::string& callback_url, bool teleport);
bool hypergrid_processExactNamedRegionResponse(LLMessageSystem* msg, U32 agent_flags);
#endif
#endif // FS_WORLDMAPMESSAGE_H

View File

@ -22,11 +22,13 @@
#include "lggcontactsets.h"
#include "fscommon.h"
#include "fsdata.h"
#include "fsradar.h"
#include "llagent.h"
#include "llavatarnamecache.h"
#include "llcallingcard.h"
#include "lldir.h"
#include "llsdutil.h"
#include "llmutelist.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
@ -35,13 +37,11 @@
#include "lluicolortable.h"
#include "llviewercontrol.h"
#include "llvoavatar.h"
#include "fsdata.h"
#include "rlvactions.h"
#include "rlvhandler.h"
constexpr F32 COLOR_DAMPENING = 0.8f;
const std::string CONTACT_SETS_FILE = "settings_friends_groups.xml";
const std::string CS_PSEUDONYM_QUOTED = "'--- ---'";
constexpr char CONTACT_SETS_FILE[] = "settings_friends_groups.xml";
LGGContactSets::LGGContactSets()
{
@ -223,14 +223,13 @@ LLSD LGGContactSets::exportToLLSD()
void LGGContactSets::importFromLLSD(const LLSD& data)
{
for (LLSD::map_const_iterator data_it = data.beginMap(); data_it != data.endMap(); ++data_it)
for (const auto& [key, value] : llsd::inMap(data))
{
std::string name = data_it->first;
if (isInternalSetName(name))
if (isInternalSetName(key))
{
if (name == CS_GLOBAL_SETTINGS)
if (key == CS_GLOBAL_SETTINGS)
{
LLSD global_setting_data = data_it->second;
LLSD global_setting_data = value;
LLColor4 color = LLColor4::grey;
if (global_setting_data.has("defaultColor"))
@ -240,32 +239,28 @@ void LGGContactSets::importFromLLSD(const LLSD& data)
mDefaultColor = color;
}
if (name == CS_SET_EXTRA_AVS)
if (key == CS_SET_EXTRA_AVS)
{
LLSD extra_avatar_data = data_it->second;
for (LLSD::map_const_iterator extra_avatar_it = extra_avatar_data.beginMap(); extra_avatar_it != extra_avatar_data.endMap(); ++extra_avatar_it)
for (const auto& [av_key, av_value] : llsd::inMap(value))
{
mExtraAvatars.insert(LLUUID(extra_avatar_it->first));
mExtraAvatars.insert(LLUUID(av_key));
}
}
if (name == CS_SET_PSEUDONYM)
if (key == CS_SET_PSEUDONYM)
{
LLSD pseudonym_data = data_it->second;
for (LLSD::map_const_iterator pseudonym_data_it = pseudonym_data.beginMap(); pseudonym_data_it != pseudonym_data.endMap(); ++pseudonym_data_it)
for (const auto& [av_key, av_value] : llsd::inMap(value))
{
mPseudonyms[LLUUID(pseudonym_data_it->first)] = pseudonym_data_it->second.asString();
mPseudonyms.emplace(LLUUID(av_key), av_value.asString());
}
}
}
else
{
LLSD set_data = data_it->second;
LLSD set_data = value;
ContactSet* new_set = new ContactSet();
new_set->mName = name;
new_set->mName = key;
LLColor4 color = getDefaultColor();
if (set_data.has("color"))
@ -283,14 +278,13 @@ void LGGContactSets::importFromLLSD(const LLSD& data)
if (set_data.has("friends"))
{
LLSD friend_data = set_data["friends"];
for (LLSD::map_const_iterator friend_it = friend_data.beginMap(); friend_it != friend_data.endMap(); ++friend_it)
for (const auto& [av_key, av_value] : llsd::inMap(set_data["friends"]))
{
new_set->mFriends.insert(LLUUID(friend_it->first));
new_set->mFriends.emplace(LLUUID(av_key));
}
}
mContactSets[name] = new_set;
mContactSets[key] = new_set;
}
}
}
@ -305,7 +299,7 @@ LLColor4 LGGContactSets::getSetColor(std::string_view set_name) const
return getDefaultColor();
};
LLColor4 LGGContactSets::colorize(const LLUUID& uuid, LLColor4 color, ELGGCSType type) const
LLColor4 LGGContactSets::colorize(const LLUUID& uuid, LLColor4 color, ContactSetType type) const
{
static LLCachedControl<bool> legacy_radar_friend(gSavedSettings, "FSLegacyRadarFriendColoring");
static LLCachedControl<bool> legacy_radar_linden(gSavedSettings, "FSLegacyRadarLindenColoring");
@ -315,17 +309,17 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, LLColor4 color, ELGGCSType
{
switch (type)
{
case LGG_CS_CHAT:
case LGG_CS_IM:
case ContactSetType::CHAT:
case ContactSetType::IM:
color = LLUIColorTable::instance().getColor("UserChatColor", LLColor4::white).get();
break;
case LGG_CS_TAG:
case ContactSetType::TAG:
color = LLUIColorTable::instance().getColor("NameTagSelf", LLColor4::white).get();
break;
case LGG_CS_MINIMAP:
case ContactSetType::MINIMAP:
color = LLUIColorTable::instance().getColor("MapAvatarSelfColor", LLColor4::white).get();
break;
case LGG_CS_RADAR:
case ContactSetType::RADAR:
default:
LL_DEBUGS("ContactSets") << "Unhandled colorize case!" << LL_ENDL;
break;
@ -335,14 +329,14 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, LLColor4 color, ELGGCSType
{
switch (type)
{
case LGG_CS_CHAT:
case ContactSetType::CHAT:
if (!rlv_shownames)
color = LLUIColorTable::instance().getColor("FriendsChatColor", LLColor4::white).get();
break;
case LGG_CS_IM:
case ContactSetType::IM:
color = LLUIColorTable::instance().getColor("FriendsChatColor", LLColor4::white).get();
break;
case LGG_CS_TAG:
case ContactSetType::TAG:
{
// This is optional per prefs.
static LLCachedControl<bool> color_friends(gSavedSettings, "NameTagShowFriends");
@ -351,12 +345,12 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, LLColor4 color, ELGGCSType
color = LLUIColorTable::instance().getColor("NameTagFriend", LLColor4::white).get();
}
}
break;
case LGG_CS_MINIMAP:
break;
case ContactSetType::MINIMAP:
if (!rlv_shownames)
color = LLUIColorTable::instance().getColor("MapAvatarFriendColor", LLColor4::white).get();
break;
case LGG_CS_RADAR:
case ContactSetType::RADAR:
if (legacy_radar_friend && !rlv_shownames)
color = LLUIColorTable::instance().getColor("MapAvatarFriendColor", LLColor4::white).get();
break;
@ -373,17 +367,17 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, LLColor4 color, ELGGCSType
{
switch (type)
{
case LGG_CS_CHAT:
case LGG_CS_IM:
case ContactSetType::CHAT:
case ContactSetType::IM:
color = LLUIColorTable::instance().getColor("MutedChatColor", LLColor4::grey3).get();
break;
case LGG_CS_TAG:
case ContactSetType::TAG:
color = LLUIColorTable::instance().getColor("NameTagMuted", LLColor4::grey3).get();
break;
case LGG_CS_MINIMAP:
case ContactSetType::MINIMAP:
color = LLUIColorTable::instance().getColor("MapAvatarMutedColor", LLColor4::grey3).get();
break;
case LGG_CS_RADAR:
case ContactSetType::RADAR:
default:
LL_DEBUGS("ContactSets") << "Unhandled colorize case!" << LL_ENDL;
break;
@ -393,17 +387,17 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, LLColor4 color, ELGGCSType
{
switch (type)
{
case LGG_CS_CHAT:
case LGG_CS_IM:
case ContactSetType::CHAT:
case ContactSetType::IM:
color = LLUIColorTable::instance().getColor("FirestormChatColor", LLColor4::red).get();
break;
case LGG_CS_TAG:
case ContactSetType::TAG:
color = LLUIColorTable::instance().getColor("NameTagFirestorm", LLColor4::red).get();
break;
case LGG_CS_MINIMAP:
case ContactSetType::MINIMAP:
color = LLUIColorTable::instance().getColor("MapAvatarFirestormColor", LLColor4::red).get();
break;
case LGG_CS_RADAR:
case ContactSetType::RADAR:
default:
LL_DEBUGS("ContactSets") << "Unhandled colorize case!" << LL_ENDL;
break;
@ -415,17 +409,17 @@ LLColor4 LGGContactSets::colorize(const LLUUID& uuid, LLColor4 color, ELGGCSType
{
switch (type)
{
case LGG_CS_CHAT:
case LGG_CS_IM:
case ContactSetType::CHAT:
case ContactSetType::IM:
color = LLUIColorTable::instance().getColor("LindenChatColor", LLColor4::blue).get();
break;
case LGG_CS_TAG:
case ContactSetType::TAG:
color = LLUIColorTable::instance().getColor("NameTagLinden", LLColor4::blue).get();
break;
case LGG_CS_MINIMAP:
case ContactSetType::MINIMAP:
color = LLUIColorTable::instance().getColor("MapAvatarLindenColor", LLColor4::blue).get();
break;
case LGG_CS_RADAR:
case ContactSetType::RADAR:
if (legacy_radar_linden)
color = LLUIColorTable::instance().getColor("MapAvatarLindenColor", LLColor4::blue).get();
break;
@ -452,7 +446,7 @@ LLColor4 LGGContactSets::getFriendColor(const LLUUID& friend_id, std::string_vie
return color;
}
U32 lowest = U32_MAX;
U32 lowest{ U32_MAX };
for (const auto& set_name : getFriendSets(friend_id))
{
if (set_name != ignored_set_name)
@ -485,14 +479,14 @@ LLColor4 LGGContactSets::getFriendColor(const LLUUID& friend_id, std::string_vie
return color;
}
bool LGGContactSets::hasFriendColorThatShouldShow(const LLUUID& friend_id, ELGGCSType type) const
bool LGGContactSets::hasFriendColorThatShouldShow(const LLUUID& friend_id, ContactSetType type) const
{
LLColor4 color = LLColor4::white;
return hasFriendColorThatShouldShow(friend_id, type, color);
}
// handle all settings and rlv that would prevent us from showing the cs color
bool LGGContactSets::hasFriendColorThatShouldShow(const LLUUID& friend_id, ELGGCSType type, LLColor4& color) const
bool LGGContactSets::hasFriendColorThatShouldShow(const LLUUID& friend_id, ContactSetType type, LLColor4& color) const
{
if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, friend_id))
{
@ -506,20 +500,20 @@ bool LGGContactSets::hasFriendColorThatShouldShow(const LLUUID& friend_id, ELGGC
switch (type)
{
case LGG_CS_CHAT:
case LGG_CS_IM:
case ContactSetType::CHAT:
case ContactSetType::IM:
if (!fsContactSetsColorizeChat)
return false;
break;
case LGG_CS_TAG:
case ContactSetType::TAG:
if (!fsContactSetsColorizeTag)
return false;
break;
case LGG_CS_RADAR:
case ContactSetType::RADAR:
if (!fsContactSetsColorizeRadar)
return false;
break;
case LGG_CS_MINIMAP:
case ContactSetType::MINIMAP:
if (!fsContactSetsColorizeMiniMap)
return false;
break;
@ -607,9 +601,9 @@ uuid_vec_t LGGContactSets::getFriendsInAnySet() const
for (const auto& [set_name, set] : mContactSets)
{
for (uuid_set_t::iterator itr = set->mFriends.begin(); itr != set->mFriends.end(); ++itr)
for (const auto& friend_id : set->mFriends)
{
friendsInAnySet.insert(*itr);
friendsInAnySet.emplace(friend_id);
}
}
@ -648,7 +642,7 @@ bool LGGContactSets::isFriendInSet(const LLUUID& friend_id, std::string_view set
return isNonFriend(friend_id);
}
if( set_name.empty() )
if (set_name.empty())
return false;
if (ContactSet* set = getContactSet(set_name); set)
@ -1056,12 +1050,10 @@ bool LGGContactSets::handleRemoveAvatarFromSetCallback(const LLSD& notification,
LGGContactSets& instance = LGGContactSets::instance();
LLAvatarTracker& tracker = LLAvatarTracker::instance();
for (LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray();
it != notification["payload"]["ids"].endArray();
++it)
const std::string set_name = notification["payload"]["contact_set"].asString();
for (const auto& item : llsd::inArray(notification["payload"]["ids"]))
{
const LLUUID& id = it->asUUID();
std::string set_name = notification["payload"]["contact_set"].asString();
const LLUUID& id = item.asUUID();
instance.removeFriendFromSet(id, set_name, false);

View File

@ -26,21 +26,22 @@
#include <unordered_set>
#include <boost/signals2.hpp>
typedef enum e_lgg_cs
enum class ContactSetType
{
LGG_CS_CHAT,
LGG_CS_IM,
LGG_CS_TAG,
LGG_CS_RADAR,
LGG_CS_MINIMAP
} ELGGCSType;
CHAT,
IM,
TAG,
RADAR,
MINIMAP
};
const std::string CS_SET_ALL_SETS = "All Sets";
const std::string CS_SET_NO_SETS = "No Sets";
const std::string CS_SET_EXTRA_AVS = "extraAvs";
const std::string CS_SET_PSEUDONYM = "Pseudonyms";
const std::string CS_GLOBAL_SETTINGS = "globalSettings";
const std::string CS_PSEUDONYM = "--- ---";
constexpr char CS_SET_ALL_SETS[] = "All Sets";
constexpr char CS_SET_NO_SETS[] = "No Sets";
constexpr char CS_SET_EXTRA_AVS[] = "extraAvs";
constexpr char CS_SET_PSEUDONYM[] = "Pseudonyms";
constexpr char CS_GLOBAL_SETTINGS[] = "globalSettings";
constexpr char CS_PSEUDONYM[] = "--- ---";
constexpr char CS_PSEUDONYM_QUOTED[] = "'--- ---'";
class LGGContactSets : public LLSingleton<LGGContactSets>
{
@ -58,7 +59,7 @@ public:
void setSetColor(std::string_view set_name, const LLColor4& color);
LLColor4 getSetColor(std::string_view set_name) const;
LLColor4 getFriendColor(const LLUUID& friend_id, std::string_view ignored_set_name = "") const;
LLColor4 colorize(const LLUUID& uuid, LLColor4 color, ELGGCSType type) const;
LLColor4 colorize(const LLUUID& uuid, LLColor4 color, ContactSetType type) const;
void setDefaultColor(const LLColor4& default_color) { mDefaultColor = default_color; };
LLColor4 getDefaultColor() const { return mDefaultColor; };
@ -81,8 +82,8 @@ public:
void removeFriendFromSet(const LLUUID& friend_id, std::string_view set_name, bool save_changes = true);
void removeFriendFromAllSets(const LLUUID& friend_id, bool save_changes = true);
bool isFriendInSet(const LLUUID& friend_id, std::string_view set_name) const;
bool hasFriendColorThatShouldShow(const LLUUID& friend_id, ELGGCSType type) const;
bool hasFriendColorThatShouldShow(const LLUUID& friend_id, ELGGCSType type, LLColor4& color) const;
bool hasFriendColorThatShouldShow(const LLUUID& friend_id, ContactSetType type) const;
bool hasFriendColorThatShouldShow(const LLUUID& friend_id, ContactSetType type, LLColor4& color) const;
void addSet(std::string_view set_name);
bool renameSet(std::string_view set_name, std::string_view new_set_name);

View File

@ -2145,10 +2145,19 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)
}
// [/RLVa:KB]
// <FS:humbletim> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
F32 camera_ground_plane{ F_ALMOST_ZERO };
// integrate OpenSimExtras.MinSimHeight into the camera ground plane calculation
if (auto regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global))
{
camera_ground_plane += regionp->getMinSimHeight();
}
// </FS:humbletim>
// Don't let camera go underground
F32 camera_min_off_ground = getCameraMinOffGround();
camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
F32 minZ = llmax(F_ALMOST_ZERO, camera_land_height + camera_min_off_ground);
F32 minZ = llmax(camera_ground_plane, camera_land_height + camera_min_off_ground); // <FS:humbletim/> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
if (camera_position_global.mdV[VZ] < minZ)
{
camera_position_global.mdV[VZ] = minZ;

View File

@ -2106,10 +2106,10 @@ LLColor4 LLNetMap::getAvatarColor(const LLUUID& avatar_id)
LGGContactSets& cs_instance = LGGContactSets::instance();
// Color "special" avatars with special colors (Friends, muted, Lindens, etc)
color = cs_instance.colorize(avatar_id, color, LGG_CS_MINIMAP);
color = cs_instance.colorize(avatar_id, color, ContactSetType::MINIMAP);
// Color based on contact sets prefs
cs_instance.hasFriendColorThatShouldShow(avatar_id, LGG_CS_MINIMAP, color);
cs_instance.hasFriendColorThatShouldShow(avatar_id, ContactSetType::MINIMAP, color);
// Mark Avatars with special colors
avatar_marks_map_t::iterator found = sAvatarMarksMap.find(avatar_id);

View File

@ -232,6 +232,11 @@ BOOL LLPanelGroup::postBuild()
button = getChild<LLButton>("btn_refresh");
button->setClickedCallback(onBtnRefresh, this);
// <FS:PP> FIRE-33939: Activate button
button = getChild<LLButton>("btn_activate");
button->setClickedCallback(onBtnActivateClicked, this);
// <FS:PP>
childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL);
LLPanelGroupTab* panel_general = findChild<LLPanelGroupTab>("group_general_tab_panel");
@ -296,6 +301,7 @@ void LLPanelGroup::reposButtons()
reposButton("btn_cancel");
reposButton("btn_chat");
reposButton("btn_call");
reposButton("btn_activate"); // <FS:PP> FIRE-33939: Activate button
}
void LLPanelGroup::reshape(S32 width, S32 height, BOOL called_from_parent )
@ -347,6 +353,15 @@ void LLPanelGroup::onBtnGroupChatClicked(void* user_data)
self->chatGroup();
}
// <FS:PP> FIRE-33939: Activate button
void LLPanelGroup::onBtnActivateClicked(void* user_data)
{
LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);
self->activateGroup();
self->refreshData();
}
// </FS:PP>
void LLPanelGroup::onBtnJoin()
{
if (LLGroupActions::isInGroup(mID))
@ -486,6 +501,15 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(button_chat)
button_chat->setVisible(!is_null_group_id);
// <FS:PP> FIRE-33939: Activate button
LLButton* button_activate = findChild<LLButton>("btn_activate");
if (button_activate)
{
button_activate->setVisible(!is_null_group_id);
button_activate->setEnabled(group_id != gAgent.getGroupID());
}
// </FS:PP>
getChild<LLUICtrl>("prepend_founded_by")->setVisible(!is_null_group_id);
// <FS:Ansariel> TabContainer switch
@ -566,6 +590,10 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
button_call->setVisible(false);
if(button_chat)
button_chat->setVisible(false);
// <FS:PP> FIRE-33939: Activate button
if(button_activate)
button_activate->setVisible(false);
// </FS:PP>
}
else
{
@ -625,6 +653,10 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
button_call->setVisible(is_member);
if(button_chat)
button_chat->setVisible(is_member);
// <FS:PP> FIRE-33939: Activate button
if(button_activate)
button_activate->setVisible(is_member);
// </FS:PP>
}
// <FS:Ansariel> TabContainer switch
@ -710,6 +742,12 @@ void LLPanelGroup::draw()
mRefreshTimer.stop();
childEnable("btn_refresh");
childEnable("groups_accordion");
// <FS:PP> FIRE-33939: Activate button
if (gAgent.getGroupID() != getID())
{
childEnable("btn_activate");
}
// </FS:PP>
}
LLButton* button_apply = findChild<LLButton>("btn_apply");
@ -741,6 +779,7 @@ void LLPanelGroup::refreshData()
// 5 second timeout
childDisable("btn_refresh");
childDisable("groups_accordion");
childDisable("btn_activate"); // <FS:PP> FIRE-33939: Activate button
mRefreshTimer.start();
mRefreshTimer.setTimerExpirySec(5);
@ -756,6 +795,17 @@ void LLPanelGroup::chatGroup()
LLGroupActions::startIM(getID());
}
// <FS:PP> FIRE-33939: Activate button
void LLPanelGroup::activateGroup()
{
LLUUID group_id = getID();
if (gAgent.getGroupID() != group_id)
{
LLGroupActions::activate(group_id);
}
}
// </FS:PP>
void LLPanelGroup::showNotice(const std::string& subject,
const std::string& message,
const bool& has_inventory,

View File

@ -76,6 +76,7 @@ public:
void refreshData();
void callGroup();
void chatGroup();
void activateGroup(); // <FS:PP> FIRE-33939: Activate button
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
@ -102,6 +103,7 @@ protected:
static void onBtnRefresh(void*);
static void onBtnGroupCallClicked(void*);
static void onBtnGroupChatClicked(void*);
static void onBtnActivateClicked(void*); // <FS:PP> FIRE-33939: Activate button
void reposButton(const std::string& name);
void reposButtons();

View File

@ -279,13 +279,16 @@ namespace LLPerfStats
auto ot{upd.objType};
auto& key{upd.objID};
auto& avKey{upd.avID};
auto type {upd.statType};
auto val {upd.time};
// <FS:Beq> markup to support coverage testing on stats collection
#ifdef TRACY_ENABLE
//LL_PROFILE_ZONE_TEXT(key.toStringFast(obstr), 36);
//LL_PROFILE_ZONE_TEXT(avKey.toStringFast(avstr), 36);
//LL_PROFILE_ZONE_NUM(val);
static char obstr[36];
static char avstr[36];
LL_PROFILE_ZONE_TEXT(key.toStringFast(obstr), 36);
LL_PROFILE_ZONE_TEXT(avKey.toStringFast(avstr), 36);
LL_PROFILE_ZONE_NUM(val);
#endif
// </FS:Beq>
@ -295,6 +298,14 @@ namespace LLPerfStats
doUpd(key, ot, type,val);
return;
}
if (ot == ObjType_t::OT_AVATAR)
{
// LL_INFOS("perfstats") << "Avatar update:" << LL_ENDL;
doUpd(avKey, ot, type, val);
return;
}
}
static inline void doUpd(const LLUUID& key, ObjType_t ot, StatType_t type, uint64_t val)
@ -429,13 +440,13 @@ namespace LLPerfStats
// </FS:Beq>
stat.time = LLTrace::BlockTimer::getCPUClockCount64() - start;
// <FS:Beq> extra profiling coverage tracking
#ifdef ATTACHMENT_TRACKING
static char obstr[36];
static char avstr[36];
LL_PROFILE_ZONE_NUM(static_cast<U64>(stat.objType));
LL_PROFILE_ZONE_TEXT(stat.avID.toStringFast(avstr), 36);
LL_PROFILE_ZONE_TEXT(stat.objID.toStringFast(obstr), 36);
LL_PROFILE_ZONE_NUM(stat.time);
#if TRACY_ENABLE && defined(ATTACHMENT_TRACKING)
// static char obstr[36];
// static char avstr[36];
// LL_PROFILE_ZONE_NUM(static_cast<U64>(stat.objType));
// LL_PROFILE_ZONE_TEXT(stat.avID.toStringFast(avstr), 36);
// LL_PROFILE_ZONE_TEXT(stat.objID.toStringFast(obstr), 36);
// LL_PROFILE_ZONE_NUM(stat.time);
#endif
// </FS:Beq>
StatsRecorder::send(std::move(stat));

View File

@ -34,6 +34,9 @@
#include "llviewernetwork.h"
#include "llfiltersd2xmlrpc.h"
#include "curl/curl.h"
#include "rlvhandler.h"
const char* LLSLURL::SLURL_HTTP_SCHEME = "http";
const char* LLSLURL::SLURL_HTTPS_SCHEME = "https";
const char* LLSLURL::SLURL_SECONDLIFE_SCHEME = "secondlife";

View File

@ -99,16 +99,16 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color, LLSD args
if (chat.mChatType == CHAT_TYPE_IM || chat.mChatType == CHAT_TYPE_IM_GROUP)
{
r_color = LGGContactSets::getInstance()->colorize(chat.mFromID, r_color, LGG_CS_IM);
r_color = LGGContactSets::getInstance()->colorize(chat.mFromID, r_color, ContactSetType::IM);
}
else
{
r_color = LGGContactSets::getInstance()->colorize(chat.mFromID, r_color, LGG_CS_CHAT);
r_color = LGGContactSets::getInstance()->colorize(chat.mFromID, r_color, ContactSetType::CHAT);
}
// </FS:CR>
//color based on contact sets prefs
LGGContactSets::getInstance()->hasFriendColorThatShouldShow(chat.mFromID, LGG_CS_CHAT, r_color);
LGGContactSets::getInstance()->hasFriendColorThatShouldShow(chat.mFromID, ContactSetType::CHAT, r_color);
}
break;
case CHAT_SOURCE_OBJECT:

View File

@ -229,6 +229,7 @@
#include "particleeditor.h"
#include "quickprefs.h"
#include "vjfloaterlocalmesh.h" // local mesh
#include "fsfloaterwhitelisthelper.h" // fs whitelist helper
// handle secondlife:///app/openfloater/{NAME} URLs
@ -649,6 +650,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("sound_explorer", "floater_NACL_explore_sounds.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<NACLFloaterExploreSounds>);
LLFloaterReg::add("vram_usage", "floater_fs_vram_usage.xml", static_cast<LLFloaterBuildFunc>(&LLFloaterReg::build<FSFloaterVRAMUsage>));
LLFloaterReg::add("local_mesh_floater", "floater_vj_local_mesh.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLocalMesh>); // local mesh
LLFloaterReg::add("fs_whitelist_floater", "floater_whitelist.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterWhiteListHelper>); // white list advisor
LLFloaterReg::registerControlVariables(); // Make sure visibility and rect controls get preserved when saving
}

View File

@ -9152,13 +9152,10 @@ class LLAttachmentDetach : public view_listener_t
// [RLVa:KB] - Checked: 2010-03-15 (RLVa-1.2.0a) | Modified: RLVa-1.0.5
// NOTE: copy/paste of the code in enable_detach()
if ((rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)))
if ((rlv_handler_t::isEnabled()) && (gRlvAttachmentLocks.hasLockedAttachmentPoint(RLV_LOCK_REMOVE)) &&
gRlvAttachmentLocks.isLockedAttachment(objectp->getRootEdit()))
{
//LLObjectSelectionHandle hSelect = LLSelectMgr::getInstance()->getSelection();
//RlvSelectHasLockedAttach f;
//if ((hSelect->isAttachment()) && (hSelect->getFirstRootNode(&f, FALSE) != NULL))
// return true;
return !gRlvAttachmentLocks.isLockedAttachment(objectp->getRootEdit()); // <FS:Ansariel> Kitty will have to check this...
return false;
}
// [/RLVa:KB]

View File

@ -675,7 +675,8 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
// </FS:Beq>
// <FS:CR> Aurora Sim
mWidth(region_width_meters),
mWidthScaleFactor(region_width_meters / REGION_WIDTH_METERS) // <FS:Ansariel> FIRE-19563: Scaling for OpenSim VarRegions
mWidthScaleFactor(region_width_meters / REGION_WIDTH_METERS), // <FS:Ansariel> FIRE-19563: Scaling for OpenSim VarRegions
mMinSimHeight(0.f) // <FS:humbletim> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
{
// Moved this up... -> mWidth = region_width_meters;
// </FS:CR>
@ -833,6 +834,7 @@ void LLViewerRegion::setRegionID(const LLUUID& region_id)
void LLViewerRegion::loadObjectCache()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if (mCacheLoaded)
{
return;
@ -2655,7 +2657,7 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
LL::WorkQueue::postMaybe(workqueue, work);
}
// <FS:CR> Opensim god names
// <FS> Opensim
#ifdef OPENSIM
if (LLGridManager::getInstance()->isInOpenSim())
{
@ -2664,31 +2666,23 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
{
if (mSimulatorFeatures["god_names"].has("full_names"))
{
LLSD god_names = mSimulatorFeatures["god_names"]["full_names"];
for (LLSD::array_iterator itr = god_names.beginArray();
itr != god_names.endArray();
itr++)
for (const auto& item : llsd::inArray(mSimulatorFeatures["god_names"]["full_names"]))
{
mGodNames.insert((*itr).asString());
mGodNames.emplace(item.asString());
}
}
if (mSimulatorFeatures["god_names"].has("last_names"))
{
LLSD god_names = mSimulatorFeatures["god_names"]["last_names"];
for (LLSD::array_iterator itr = god_names.beginArray();
itr != god_names.endArray();
itr++)
for (const auto& item : llsd::inArray(mSimulatorFeatures["god_names"]["last_names"]))
{
mGodNames.insert((*itr).asString());
mGodNames.emplace(item.asString());
}
}
}
}
#endif // OPENSIM
// </FS:CR>
// <FS:Beq> limit num bakes by region support
#ifdef OPENSIM
if (mSimulatorFeatures.has("BakesOnMeshEnabled") && (mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean()==true))
#endif
if (LLGridManager::getInstance()->isInSecondLife() || (mSimulatorFeatures.has("BakesOnMeshEnabled") && mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean()))
{
mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES;
mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES;
@ -2698,11 +2692,8 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)
mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM;
mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO;
}
#else
mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES;
mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES;
#endif // OPENSIM
// </FS:Beq>
mMinSimHeight = mSimulatorFeatures.has("OpenSimExtras") && mSimulatorFeatures["OpenSimExtras"].has("MinSimHeight") ? mSimulatorFeatures["OpenSimExtras"]["MinSimHeight"].asReal() : 0.0f;
// </FS>
}
//this is called when the parent is not cacheable.
@ -3207,6 +3198,7 @@ void LLViewerRegion::clearVOCacheFromMemory()
void LLViewerRegion::unpackRegionHandshake()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
LLMessageSystem *msg = gMessageSystem;
U64 region_flags = 0;
@ -3281,9 +3273,8 @@ void LLViewerRegion::unpackRegionHandshake()
mCentralBakeVersion = region_protocols & 1; // was (S32)gSavedSettings.getBOOL("UseServerTextureBaking");
// <FS:Beq> Earlier trigger for BOM support on region
#ifdef OPENSIM
constexpr U64 REGION_SUPPORTS_BOM {(U64)1<<63};
if(region_protocols & REGION_SUPPORTS_BOM) // OS sets bit 63 when BOM supported
constexpr U64 REGION_SUPPORTS_BOM{ 1ULL << 63 };
if (region_protocols & REGION_SUPPORTS_BOM) // OS sets bit 63 when BOM supported
{
mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_NUM_INDICES;
mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_NUM_INDICES;
@ -3293,7 +3284,6 @@ void LLViewerRegion::unpackRegionHandshake()
mMaxBakes = LLAvatarAppearanceDefines::EBakedTextureIndex::BAKED_LEFT_ARM;
mMaxTEs = LLAvatarAppearanceDefines::ETextureIndex::TEX_HEAD_UNIVERSAL_TATTOO;
}
#endif
// </FS:Beq>
LLVLComposition *compp = getComposition();
if (compp)

View File

@ -252,6 +252,7 @@ public:
F32 getWidth() const { return mWidth; }
F32 getWidthScaleFactor() const { return mWidthScaleFactor; } // <FS:Ansariel> FIRE-19563: Scaling for OpenSim VarRegions
F32 getMinSimHeight() const { return mMinSimHeight; } // <FS:humbletim/> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
// regions are expensive to release, this function gradually releases cache from memory
static void idleCleanup(F32 max_update_time);
@ -551,7 +552,8 @@ public:
S32 mLastUpdate; //last time called idleUpdate()
F32 mWidthScaleFactor; // <FS:Ansariel> FIRE-19563: Scaling for OpenSim VarRegions
S32 mMaxBakes; // <FS:Beq/> store max bakes on the region
S32 mMaxTEs; // <FS:Beq/> store max bakes on the region
S32 mMaxTEs; // <FS:Beq/> store max texture entries on the region
F32 mMinSimHeight; // <FS:humbletim/> FIRE-33613: [OpenSim] [PBR] Camera cannot be located at negative Z
// simulator name
std::string mName;
std::string mZoning;

View File

@ -3064,10 +3064,10 @@ void LLViewerWindow::draw()
}
LLColor4 targetColor = map_avatar_color.get();
targetColor = contact_sets.colorize(targetKey, targetColor, LGG_CS_MINIMAP);
targetColor = contact_sets.colorize(targetKey, targetColor, ContactSetType::MINIMAP);
//color based on contact sets prefs
contact_sets.hasFriendColorThatShouldShow(targetKey, LGG_CS_MINIMAP, targetColor);
contact_sets.hasFriendColorThatShouldShow(targetKey, ContactSetType::MINIMAP, targetColor);
LLColor4 mark_color;
if (LLNetMap::getAvatarMarkColor(targetKey, mark_color))

View File

@ -3638,7 +3638,7 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name)
// then use that color as name_tag_color
static LLUICachedControl<bool> show_friends("NameTagShowFriends");
static LLUICachedControl<U32> color_client_tags("FSColorClienttags");
bool special_color_override = (show_friends && (is_friend || LGGContactSets::getInstance()->hasFriendColorThatShouldShow(getID(), LGG_CS_TAG))) ||
bool special_color_override = (show_friends && (is_friend || LGGContactSets::getInstance()->hasFriendColorThatShouldShow(getID(), ContactSetType::TAG))) ||
LLNetMap::hasAvatarMarkColor(getID());
if (mClientTagData.has("color")
&& !special_color_override
@ -3983,10 +3983,10 @@ void LLVOAvatar::idleUpdateNameTagText(bool new_name)
LLColor4 new_chat = LLUIColorTable::instance().getColor( isSelf() ? "UserChatColor" : "AgentChatColor" );
// <FS:CR> Colorize tags
new_chat = LGGContactSets::getInstance()->colorize(getID(), new_chat, LGG_CS_CHAT);
new_chat = LGGContactSets::getInstance()->colorize(getID(), new_chat, ContactSetType::CHAT);
//color based on contact sets prefs
LGGContactSets::getInstance()->hasFriendColorThatShouldShow(getID(), LGG_CS_CHAT, new_chat);
LGGContactSets::getInstance()->hasFriendColorThatShouldShow(getID(), ContactSetType::CHAT, new_chat);
// </FS:CR>
if (mVisibleChat)
@ -4240,10 +4240,10 @@ LLColor4 LLVOAvatar::getNameTagColor()
}
// <FS:CR> FIRE-1061 - Color friends, lindens, muted, etc
color = LGGContactSets::getInstance()->colorize(getID(), color, LGG_CS_TAG);
color = LGGContactSets::getInstance()->colorize(getID(), color, ContactSetType::TAG);
// </FS:CR>
LGGContactSets::getInstance()->hasFriendColorThatShouldShow(getID(), LGG_CS_TAG, color);
LGGContactSets::getInstance()->hasFriendColorThatShouldShow(getID(), ContactSetType::TAG, color);
LLNetMap::getAvatarMarkColor(getID(), color);

View File

@ -1538,6 +1538,7 @@ BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry)
// this in turn forces a rewrite after a partial read due to corruption.
bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if(!mEnabled)
{
LL_WARNS() << "Not reading cache for handle " << handle << "): Cache is currently disabled." << LL_ENDL;
@ -1556,6 +1557,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
S32 num_entries = 0 ; // lifted out of inner loop.
std::string filename; // lifted out of loop
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("VOCache:loadRegionObjectCache");
LLUUID cache_id;
getObjectCacheFilename(handle, filename);
LLAPRFile apr_file(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp);
@ -1564,6 +1566,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
if(success)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("VOCache:loadCacheForRegion");
if(cache_id != id)
{
LL_INFOS() << "Cache ID doesn't match for this region, discarding"<< LL_ENDL;
@ -1607,6 +1610,7 @@ bool LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca
// We now pass in the cache entry map, so that we can remove entries from extras that are no longer in the primary cache.
void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
int loaded= 0;
int discarded = 0;
// get ViewerRegion pointer from handle
@ -1626,6 +1630,13 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac
}
std::string filename(getObjectCacheExtrasFilename(handle));
// <FS:Beq> Material Override Cache caused long delays
#ifdef TRACY_ENABLE
static char extra_filename[256];
strncpy(extra_filename, filename.c_str(), 256);
LL_PROFILE_ZONE_TEXT(extra_filename,256);
#endif
// </FS:Beq>
llifstream in(filename, std::ios::in | std::ios::binary);
std::string line;
@ -1699,8 +1710,10 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac
LL_DEBUGS("GLTF") << "Beginning reading extras cache for handle " << handle << " from " << getObjectCacheExtrasFilename(handle) << LL_ENDL;
LLSD entry_llsd;
LL_PROFILE_ZONE_NUM(num_entries);
for (U32 i = 0; i < num_entries && !in.eof(); i++)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_NETWORK("RegionExtrasReadEntries");
static const U32 max_size = 4096;
bool success = LLSDSerialize::deserialize(entry_llsd, in, max_size);
// check bool(in) this time since eof is not a failure condition here
@ -1737,6 +1750,7 @@ void LLVOCache::readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCac
void LLVOCache::purgeEntries(U32 size)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
LL_DEBUGS("VOCache","GLTF") << "Purging " << size << " entries from cache" << LL_ENDL;
while(mHeaderEntryQueue.size() > size)
{
@ -1752,6 +1766,7 @@ void LLVOCache::purgeEntries(U32 size)
void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache, bool removal_enabled)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
std::string filename;
getObjectCacheFilename(handle, filename);
if(!mEnabled)
@ -1894,18 +1909,19 @@ void LLVOCache::removeGenericExtrasForHandle(U64 handle)
auto* entry = mHandleEntryMap[handle];
if (entry)
{
LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << entry->mHandle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL;
removeEntry(entry);
}
else
{
//shouldn't happen, but if it does, we should remove the extras file since it's orphaned
LL_WARNS("GLTF", "VOCache") << "Removing generic extras for handle " << entry->mHandle << "Filename: " << getObjectCacheExtrasFilename(handle) << LL_ENDL;
LLFile::remove(getObjectCacheExtrasFilename(entry->mHandle));
LLFile::remove(getObjectCacheExtrasFilename(handle));
}
}
void LLVOCache::writeGenericExtrasToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map, BOOL dirty_cache, bool removal_enabled)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK;
if(!mEnabled)
{
LL_WARNS() << "Not writing extras cache for handle " << handle << "): Cache is currently disabled." << LL_ENDL;

View File

@ -36,6 +36,7 @@
// <FS:CR> Aurora Sim
#include "llviewernetwork.h"
// </FS:CR> Aurora Sim
#include "fsworldmapmessage.h" // <FS:humbletim/> FIRE-31368: [OPENSIM] ... Search returns more than one result
const U32 LAYER_FLAG = 2;
@ -99,6 +100,14 @@ void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name,
const std::string& callback_url,
bool teleport) // immediately teleport when result returned
{
// <FS:humbletim> FIRE-31368: [OPENSIM] ... Search returns more than one result
#ifdef OPENSIM
if (hypergrid_sendExactNamedRegionRequest(region_name, callback, callback_url, teleport))
{
return;
}
#endif
// </FS:humbletim>
//LL_INFOS("WorldMap") << LL_ENDL;
mSLURLRegionName = region_name;
mSLURLRegionHandle = 0;
@ -160,6 +169,14 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
}
U32 agent_flags;
msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
// <FS:humbletim> FIRE-31368: [OPENSIM] ... Search returns more than one result
#ifdef OPENSIM
if (hypergrid_processExactNamedRegionResponse(msg, agent_flags))
{
return;
}
#endif
// </FS:humbletim>
// There's only one flag that we ever use here
if (agent_flags != LAYER_FLAG)

View File

@ -8342,6 +8342,12 @@ void LLPipeline::renderDeferredLighting()
const F32 *c = center.getF32ptr();
F32 s = volume->getLightRadius() * 1.5f;
// <FS:Beq> relocated above colour calc for early exit on small lights
if (s <= 0.001f)
{
continue;
}
// </FS:Beq>
// send light color to shader in linear space
LLColor3 col = volume->getLightLinearColor() * light_scale;
@ -8349,12 +8355,12 @@ void LLPipeline::renderDeferredLighting()
{
continue;
}
if (s <= 0.001f)
{
continue;
}
// <FS:Beq> relocated above colour calc for early exit on small lights
// if (s <= 0.001f)
// {
// continue;
// }
// </FS:Beq>
LLVector4a sa;
sa.splat(s);
if (camera->AABBInFrustumNoFarClip(center, sa) == 0)

View File

@ -22,10 +22,10 @@ background_visible="false"
name="group_join_btn">
Join (L$[AMOUNT])
</panel.string>
<panel.string
name="group_join_free">
Free
</panel.string>
<panel.string name="group_join_free">Free</panel.string>
<panel.string name="group_member">Member</panel.string>
<panel.string name="join_txt">Join</panel.string>
<panel.string name="leave_txt">Leave</panel.string>
<layout_stack
name="group_info_sidetray_main"
@ -219,6 +219,26 @@ background_visible="false"
width="23" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
layout="topleft"
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="71" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -227,7 +247,7 @@ background_visible="false"
name="btn_chat_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
layout="topleft"
follows="bottom|left|right"
@ -236,7 +256,7 @@ background_visible="false"
left="1"
height="23"
top="0"
width="96" />
width="71" />
</layout_panel>
<layout_panel
@ -247,7 +267,7 @@ background_visible="false"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
follows="bottom|left|right"
left="1"
@ -257,7 +277,7 @@ background_visible="false"
layout="topleft"
tool_tip="Call this group"
top="0"
width="96" />
width="71" />
</layout_panel>
<layout_panel
@ -268,7 +288,7 @@ background_visible="false"
name="btn_apply_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
follows="bottom|left|right"
height="23"
@ -277,7 +297,7 @@ background_visible="false"
name="btn_apply"
left="1"
top="0"
width="96" />
width="71" />
</layout_panel>
</layout_stack>

View File

@ -69,16 +69,16 @@
</panel>
<panel name="P_R_Res">
<text name="T_R_Res" tool_tip="Su əks etdirmələrinin ayırdetmə qabiliyyətini/keyfiyyətini müəyyən edir. Çözünürlük seçimləri 'Çox Yaxşı' və ya daha yüksək olaraq təyin edilərsə, 'İşıq' pəncərəsində 'Qabaqcıl İşıqlandırma Modeli'ni də aktivləşdirməlisiniz.">
<text name="T_R_Res" tool_tip="Su əks etdirmələrinin ayırdetmə qabiliyyətini/keyfiyyətini müəyyən edir.">
Çözünürlük
</text>
<combo_box name="ReflectionRescombo">
<combo_box.item name="0" label="Məqbul"/>
<combo_box.item name="1" label="Yaxşı"/>
<combo_box.item name="2" label="Çox Yaxşı - 'Qabaqcıl İşıqlandırma Modeli' aktivləşdirilməlidir (İşıq pəncərəsi)"/>
<combo_box.item name="3" label="Əla - 'Qabaqcıl İşıqlandırma Modeli' aktivləşdirilməlidir (İşıq pəncərəsi)"/>
<combo_box.item name="4" label="Görkəmli - 'Qabaqcıl İşıqlandırma Modeli' aktivləşdirilməlidir (İşıq pəncərəsi)"/>
<combo_box.item name="5" label="Canlı kimi - 'Qabaqcıl İşıqlandırma Modeli' aktivləşdirilməlidir (İşıq pəncərəsi)"/>
<combo_box.item name="2" label="Çox Yaxşı"/>
<combo_box.item name="3" label="Əla"/>
<combo_box.item name="4" label="Görkəmli"/>
<combo_box.item name="5" label="Canlı kimi"/>
</combo_box>
<check_box name="TransparentWater" label="Şəffaf Su" tool_tip="Su şəffaflığını göstərir. Onu söndürmək, tətbiq olunan sadə tekstura ilə suyu qeyri-şəffaf edir."/>
</panel>
@ -92,10 +92,6 @@
</panel>
<panel adı="P_L_S_Settings">
<check_box name="RenderDeferred" label="Qabaqcıl işıqlandırma modeli"
tool_tip="Bu, Günəşdən və Aydan, eləcə də xarici işıqlardan kölgələr yaradacaq. Bu, həmçinin sizə Sahənin Dərinliyini və digər qrafik xüsusiyyətlərini aktiv etməyə imkan verəcək. Əsasən, siz dünyada ən yaxşı şeyləri görmək üçün bunu aktiv etməlisiniz. . Əgər bu funksiyanı aktiv edə bilmirsinizsə və ya onun təsirini görə bilmirsinizsə, əvvəlcə Ətraf mühit nişanında Atmosfer Kölgələrinin aktiv olduğundan əmin olun."/>
<check_box name="LocalLights" label="Bütün yerli işıqları aktivləşdir"
tool_tip="Bu, dünyadakı bütün işıqları yandıracaq. Bu funksiyanı deaktiv etsəniz, Günəş/Aydan gələn işıq hələ də göstəriləcək. SİM kartın işıqlandırmasını çıxarmaq və yalnız Günəş işığından istifadə etmək istəyirsinizsə faydalıdır. /Ay."/>
<check_box name="Render Attached Lights" label="Birləşdirilmiş İşıqları Aktivləşdir"
tool_tip="Bu, avatar işıqları kimi istənilən işığı yandıracaq. Lazım olduqda işıqları söndürmək üçün faydalıdır."/>
</panel>

View File

@ -66,16 +66,16 @@
</panel>
<panel name="P_R_Res">
<text name="T_R_Res" tool_tip="Legt die Qualität der Wasserreflektionen fest. Falls eine Qualität von „Sehr gut“ oder höher verwendet wird, muss „Erweitertes Beleuchtungsmodell“ aktiviert sein (siehe Reiter „Licht“).">
<text name="T_R_Res" tool_tip="Legt die Qualität der Wasserreflektionen fest.">
Qualität
</text>
<combo_box name="ReflectionRescombo">
<combo_box.item label="Annehmbar" name="0"/>
<combo_box.item label="Gut" name="1"/>
<combo_box.item label="Sehr gut - HINWEIS: „Erweitertes Beleuchtungsmodell“ muss aktiviert sein (Reiter „Licht“)" name="2"/>
<combo_box.item label="Exzellent - HINWEIS: „Erweitertes Beleuchtungsmodell“ muss aktiviert sein (Reiter „Licht“)" name="3"/>
<combo_box.item label="Überragend - HINWEIS: „Erweitertes Beleuchtungsmodell“ muss aktiviert sein (Reiter „Licht“)" name="4"/>
<combo_box.item label="Lebensecht - HINWEIS: „Erweitertes Beleuchtungsmodell“ muss aktiviert sein (Reiter „Licht“)" name="5"/>
<combo_box.item label="Sehr gut" name="2"/>
<combo_box.item label="Exzellent" name="3"/>
<combo_box.item label="Überragend" name="4"/>
<combo_box.item label="Lebensecht" name="5"/>
</combo_box>
<check_box label="Transparentes Wasser" name="TransparentWater" tool_tip="Stellt Wasser transparent dar. Falls diese Einstellung deaktiert ist, wird Wasser undurchsichtig und mit einer einfachen Textur versehen dargestellt."/>
</panel>
@ -89,7 +89,6 @@
</panel>
<panel name="P_L_S_Settings">
<check_box label="Alle Lokalen Lichtquellen aktivieren" name="LocalLights" tool_tip="Diese Einstellung aktiviert alle lokalen Lichtquellen innerhalb der Welt. Wird sie deaktiviert, wird weiterhin das von Sonne und Mond ausgestrahlte Licht angezeigt. Nützlich, falls lokale Lichtquellen nicht und nur noch von Sonne und Mond angezeigt werden soll."/>
<check_box label="Angehängte Lichter aktivieren (Facelights)" name="Render Attached Lights" tool_tip="Diese Einstellung aktiviert alle Lichter wie zum Beispiel Facelights, die von Avataren getragen werden. Nützlich, falls Facelights deaktiviert werden sollen."/>
</panel>

View File

@ -0,0 +1,17 @@
<floater name="whitelist_floater" title="Whitelist für Verzeichnnisse und Dateien">
<text name="whitelist_intro">
Anti-Virus- und Anti-Malware-Software sind essenziell für die sichere Nutzung des Internet, können aber eine Vielzahl an Problem für den Viewer erzeugen.
Um die Beinträchtigung zu minimieren und Stabilität und Performance zu erhöhen, raten wir daher eingehend alle Benutzer Ausnahmen (auch bekannt als Whitelisting) für wichtige Verzeichnisse und Programme einzurichten, die vom Viewer verwendet werden.
Weitere Details hierzu finden Sie unter
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text name="whitelist_folder_instruction">
Das folgende Textfeld die Verzeichnisse angezeigt, die vom Viewer verwendet werden.
Bitte fügen Sie diese zu den Verzeichnis-Ausnahmen hinzu.
</text>
<text name="whitelist_exe_instruction">
Das folgende Textfeld zeigt die Namen und vollständigen Pfade der ausführbaren Dateien des Viewers an.
Bitte fügen Sie diese zu den Ausnahmen für ausführbare Dateien hinzu hinzu.
</text>
</floater>

View File

@ -283,6 +283,7 @@
<menu_item_check label="Anweisungen..." name="How To"/>
<menu_item_call label="[CURRENT_GRID]-Hilfe" name="current_grid_help"/>
<menu_item_call label="Über [CURRENT_GRID]" name="current_grid_about"/>
<menu_item_call label="Whitelist-Unterstützung" name="whitelist_folders"/>
<menu_item_call label="Grid-Status prüfen" name="Grid Status"/>
<menu_item_call label="Missbrauch melden" name="Report Abuse"/>
<menu_item_call label="Problem melden" name="Report Bug"/>

View File

@ -45,6 +45,9 @@
</layout_panel>
</layout_stack>
<layout_stack name="button_row_ls">
<layout_panel name="btn_activate_lp">
<button label="Aktivieren" name="btn_activate"/>
</layout_panel>
<layout_panel name="btn_chat_lp">
<button label="Chat" name="btn_chat"/>
</layout_panel>

View File

@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
top_pad="4"
width="450"
wrap="true">
Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Angus Boyd, Animats, Armin Weatherwax, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Makidoll, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, MorganMegan, Morgan Pennent, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Tapple Gao, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Angus Boyd, Animats, Armin Weatherwax, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, humbletim, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Makidoll, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, MorganMegan, Morgan Pennent, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Tapple Gao, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
</text>
<text
follows="top|left"

View File

@ -492,7 +492,7 @@
top_pad="13"
width="80"
layout="topleft"
tool_tip="Determines the resolution/quality of water reflections. Whenever resolution settings are set to 'Very Good' or above, you must also enable 'Advanced Lighting Model' in tab 'Light'.">
tool_tip="Determines the resolution/quality of water reflections.">
Resolution
</text>
<combo_box
@ -513,19 +513,19 @@
name="1"
value="512"/>
<combo_box.item
label="Very Good - NOTE: You must also enable 'Advanced Lighting Model' (Light Tab)"
label="Very Good"
name="2"
value="1024"/>
<combo_box.item
label="Excellent - NOTE: You must also enable 'Advanced Lighting Model' (Light Tab)"
label="Excellent"
name="3"
value="1536"/>
<combo_box.item
label="Outstanding - NOTE: You must also enable 'Advanced Lighting Model' (Light Tab)"
label="Outstanding"
name="4"
value="2048"/>
<combo_box.item
label="Life-Like - NOTE: You must also enable 'Advanced Lighting Model' (Light Tab)"
label="Life-Like"
name="5"
value="4096"/>
<combo_box.commit_callback
@ -549,7 +549,7 @@
name="P_Lighting"
follows="all"
layout="topleft"
width="285"
width="267"
top="0"
label="Light"
left="0">
@ -584,24 +584,14 @@
top_pad="5"
left="4"
width="275"
height="45"
height="28"
border_visible="true"
background_visible="true">
<check_box
control_name="RenderLocalLights"
height="16"
label="Enable All Local Lights"
layout="topleft"
left="5"
name="LocalLights"
tool_tip="This will turn on all in-world lights. If you disable this feature, light from Sun and Moon will still appear. Useful when you wish to eliminate SIM lighting and use only the Sun and Moon light."
top_pad="7"
width="240"/>
<check_box
follows="top|left"
layout="topleft"
left="5"
top_pad="2"
top_pad="9"
height="16"
label="Enable Attached Lights (Face Lights)"
tool_tip="This will enable any lights, such as face lights, avatars have attached to them. Useful for turning off facelights when necessary."

View File

@ -0,0 +1,74 @@
<floater name="whitelist_floater"
title="Whitelist Folders and Binaries"
width="700"
height="470"
can_minimize="true"
can_resize="false">
<text
follows="top|left|right"
font="SansSerif"
height="120"
layout="topleft"
left="11"
name="whitelist_intro"
top="16"
width="689"
wrap="true">
Anti-virus and Anti-malware are an essential part of safe Internet use, but they can cause a variety of issues for the viewer.
To reduce interference and improve stability and performance, we strongly advise that all users ensure that there are exclusions (known as Whitelisting) for important folders and programs that the viewer uses.
For more detailed information, visit
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text
follows="top|left|right"
font="SansSerif"
height="35"
layout="topleft"
left="11"
name="whitelist_folder_instruction"
top_pad="10"
width="689"
wrap="true">
To help simplify the task the box below shows the folders the viewer is using.
Please add these to your AV folder exclusions as shown on the above wiki page.
</text>
<text_editor
parse_urls="true"
follows="top|left|right|bottom"
font="SansSerif"
height="100"
bg_readonly_color="Transparent"
left="5"
max_length="65536"
name="whitelist_folders_editor"
top_pad="5"
width="689"
word_wrap="true" />
<text
follows="top|left|right"
font="SansSerif"
height="35"
layout="topleft"
left="11"
name="whitelist_exe_instruction"
top_pad="5"
width="689"
wrap="true">
The following box is the name and full path of the viewer executables.
Add these to you AV executable exclusions as shown in the above wiki.
</text>
<text_editor
parse_urls="true"
follows="top|left|right|bottom"
font="SansSerif"
height="130"
bg_readonly_color="Transparent"
left="5"
max_length="65536"
name="whitelist_exes_editor"
top_pad="5"
width="689"
word_wrap="true" />
</floater>

View File

@ -2642,6 +2642,13 @@
parameter="http://community.secondlife.com/t5/Blogs/ct-p/Blogs"/>
</menu_item_call>-->
<menu_item_separator/>
<menu_item_call
name="whitelist_folders"
label="Whitelist adviser">
<menu_item_call.on_click
function="Floater.Show"
parameter="fs_whitelist_floater" />
</menu_item_call>
<menu_item_check
label="Check Grid status"
name="Grid Status">

View File

@ -256,7 +256,25 @@ background_visible="false"
name="btn_refresh"
width="23" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
auto_resize="true"
width="67">
<button
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="66" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -264,7 +282,7 @@ background_visible="false"
left_pad="3"
name="btn_chat_lp"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
label="Chat"
@ -272,7 +290,7 @@ background_visible="false"
left="1"
height="23"
top="0"
width="90" />
width="66" />
</layout_panel>
<layout_panel
@ -282,7 +300,7 @@ background_visible="false"
left_pad="3"
name="call_btn_lp"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
left="1"
@ -292,7 +310,7 @@ background_visible="false"
layout="topleft"
tool_tip="Call this group"
top="0"
width="90" />
width="66" />
</layout_panel>
<layout_panel
@ -302,7 +320,7 @@ background_visible="false"
left_pad="3"
name="btn_apply_lp"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
height="23"
@ -311,7 +329,7 @@ background_visible="false"
name="btn_apply"
left="1"
top="0"
width="90" />
width="66" />
</layout_panel>
</layout_stack>

View File

@ -63,16 +63,16 @@
</combo_box>
</panel>
<panel name="P_R_Res">
<text name="T_R_Res" tool_tip="Determina la resolución/calidad de los reflejos en el agua. Siempre que las configuraciones de resolución se establezcan a 'Muy buena' o superior, debes activar también 'Modelo avanzado de iluminación' en la pestaña 'Luz'.">
<text name="T_R_Res" tool_tip="Determina la resolución/calidad de los reflejos en el agua.">
Resolución
</text>
<combo_box name="ReflectionRescombo">
<combo_box.item label="Decente" name="0"/>
<combo_box.item label="Buena" name="1"/>
<combo_box.item label="Muy buena - NOTA: Debes activar también 'Modelo avanzado de iluminación' (pestaña 'Luz')" name="2"/>
<combo_box.item label="Excelente - NOTA: Debes activar también 'Modelo avanzado de iluminación' (pestaña 'Luz')" name="3"/>
<combo_box.item label="Excepcional - NOTA: Debes activar también 'Modelo avanzado de iluminación' (pestaña 'Luz')" name="4"/>
<combo_box.item label="Realista - NOTA: Debes activar también 'Modelo avanzado de iluminación' (pestaña 'Luz')" name="5"/>
<combo_box.item label="Muy buena" name="2"/>
<combo_box.item label="Excelente" name="3"/>
<combo_box.item label="Excepcional" name="4"/>
<combo_box.item label="Realista" name="5"/>
</combo_box>
<check_box label="Agua transparente" name="TransparentWater" tool_tip="Dibujar el agua como transparente. Desactivarlo dibuja el agua como opaca con una textura simple aplicada."/>
<!--slider label="Resolución" name="REflection Res"/-->
@ -85,8 +85,6 @@
</text>
</panel>
<panel name="P_L_S_Settings">
<check_box label="Modelo avanzado de iluminación" name="RenderDeferred" tool_tip="Activa las sombras de sol, luna y fuentes de luz. También permite activar la profundidad de campo y otras características gráficas. Básicamente, necesitas activarlo para apreciar casi todo lo vistoso de SL. Si no puedes activar esta característica o apreciar sus efectos, asegúrate de que los efectos atmosféricos y los efectos básicos están activados en la pestaña 'WL'."/>
<check_box label="Activar todas las luces locales" name="LocalLights" tool_tip="Activa todas las luces del entorno. Si desactivas esta característica, la luz del sol y de la luna aún se verán. Útil cuando quieres eliminar toda iluminación que no provenga del sol y de la luna."/>
<check_box label="Activar luces anexadas" tool_tip="Activa cualquier luz, como las iluminaciones faciales que los avatares tengan anexadas. Útil para desactivar las iluminaciones faciales cuando sea necesario." name="Render Attached Lights"/>
</panel>
<panel name="P_Shadows">

View File

@ -2,6 +2,7 @@
<floater name="emojipicker" title="Choisir un émoji">
<floater.string name="title_for_recently_used" value="Récemment utilisé"/>
<floater.string name="title_for_frequently_used" value="Souvent utilisé"/>
<floater.string name="text_no_emoji_for_filter" value="Aucun emoji trouvé pour '[FILTER]'"/>
<text name="Dummy">
Aucun émoji sélectionné
</text>

View File

@ -2,7 +2,7 @@
<floater name="floater_about" title="Navigateur Multimédia">
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Précédent" name="back"/>
<button label="Avant" name="back"/>
<button label="Suivant" name="forward"/>
<button label="Actualiser" name="reload"/>
<button label="Lecture" name="go"/>

View File

@ -1,21 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater title="Outils de prise de vue" name="phototools">
<tab_container name="tabs">
<panel name="EnvironmentTab" label="Env">
<panel name="PT_WL_Settings">
<text name="T_WL_Settings">
Paramètres environnementaux
</text>
</panel>
<panel name="P_WL_Settings">
<check_box label="Activer les shaders atmosphèriques" name="WindLightUseAtmosShaders" tool_tip="Cela activera pleinement l'EEP (shaders atmosphériques). Si vous ne pouvez pas activer cette fonctionnalité, assurez-vous que les Shaders de base soient activés ci-dessous."/>
</panel>
<panel name="P_WL_Sky_Water">
<text name="WL Sky" tool_tip="Des préréglages pour le ciel.">
Ciel
@ -28,10 +22,8 @@
</text>
<button name="btn_personal_lighting" label="Éclairage personnel..."/>
<button name="ResetToRegionDefault" tool_tip="Remet l'environnement partagé comme paramètre d'environnement."/>
<button label="Nuages en pause" name="PauseClouds" tool_tip="Mets les nuages en pause."/>
</panel>
<panel name="P_Q_Windlights">
<text name="T_Q_Windlights">
Environnements standards
@ -49,59 +41,38 @@
</text>
<button name="new_sky_preset" label="Nouveau préréglage du ciel"/>
<button name="edit_sky_preset" label="Modifier le préréglage du ciel"/>
<button name="new_water_preset" label="Nouveau préréglage de l'eau"/>
<button name="edit_water_preset" label="Modifier le préréglage de l'eau"/>
</panel>
<panel name="P_W_Reflections">
<text name="T_W_Reflections">
Paramètres de réflexion de l'eau
</text>
</panel>
<panel name="P_W_R_Types">
<text name="T_W_R_Types" tool_tip="Détermine ce qui se reflètera dans l'eau.">
Type
</text>
<combo_box name="Reflections">
<combo_box.item label="Minimum" name="0"/>
<combo_box.item label="Terrain et arbres" name="1"/>
<combo_box.item label="Tous les objets statiques" name="2"/>
<combo_box.item label="Tous les avatars et objets" name="3"/>
<combo_box.item label="Tout" name="4"/>
</combo_box>
</panel>
<panel name="P_R_Res">
<text name="T_R_Res" tool_tip="Détermine la résolution/qualité des réflets dans l'eau. Lorsque les paramètres de résolution sont réglés sur 'Très bon' ou au delà, vous devez activer 'Modèle d'éclairage avancé' dans l'onglet 'Lumière'.">
Resolution
<text name="T_R_Res" tool_tip="Détermine la résolution/qualité des réflets dans l'eau.">
Résolution
</text>
<combo_box name="ReflectionRescombo">
<combo_box.item label="Décent" name="0"/>
<combo_box.item label="Bon" name="1"/>
<combo_box.item label="Trés bon - NOTE: Vous devez activer le 'modèle d'éclairage avancé' (Onglet Lumière)" name="2"/>
<combo_box.item label="Excellent - NOTE: Vous devez activer le 'modèle d'éclairage avancé' (Onglet Lumière)" name="3"/>
<combo_box.item label="Exceptionnel - NOTE: Vous devez activer le 'modèle d'éclairage avancé' (Onglet Lumière)" name="4"/>
<combo_box.item label="Comme la vie - NOTE: Vous devez activer le 'modèle d'éclairage avancé' (Onglet Lumière)" name="5"/>
<combo_box.item label="Trés bon" name="2"/>
<combo_box.item label="Excellent" name="3"/>
<combo_box.item label="Exceptionnel" name="4"/>
<combo_box.item label="Comme la vie" name="5"/>
</combo_box>
<check_box label="Eau transparente" name="TransparentWater" tool_tip="Rendre l'eau transparente. La désactivation rend l'eau opaque par l'application d'une simple texture."/>
</panel>
</panel>
<panel name="P_Lighting" label="Lum.">
<panel name="PT_Light_Shadows">
<text name="T_Light_Shadows">
Réglages des lumières et des ombres
</text>
</panel>
<panel name="P_L_S_Settings">
<check_box label="Activer le mode d'éclairage avancé" name="RenderDeferred" tool_tip="Cela permettra d'utiliser les ombres du Soleil et de la Lune ainsi que toutes les autres sources de lumière. Il vous permettra également d'activer la profondeur de champ et d'autres fonctions graphiques. En principe, vous devez l'activer pour voir la plupart des ' effets visuels ' du monde. Si vous ne pouvez pas activer cette fonction ou voir son effet, assurez-vous d'abord que les Shaders atmosphériques et les Shaders de base sont activés dans l'onglet 'WL'."/>
<check_box label="Activer toutes les lumières locales" name="LocalLights" tool_tip="Cette option allume toutes les lumières autour de vous. Si vous la désactivez, la lumière du soleil ou de la lune sera toujours présente. Utile lorsque vous souhaitez supprimer l'éclairage local et n'utiliser que la lumière du soleil ou de la lune."/>
<check_box label="Activer les lumières attachées" tool_tip="Cette option active toutes les lumières portées par l'avatar, par exemple celles utilisées pour éclairer le visage. Utile pour éteindre ce type de lumières lorsque c'est nécessaire." name="Render Attached Lights"/>
</panel>
<panel name="P_Shadows">
<text name="T_Shadow_Types" tool_tip="Ce réglage n'affecte que les ombres qui sont rendues par les sources de lumière, les lumières elles-mêmes continuant à fonctionner normalement. La lumière ponctuelle (les lumières qui n'ont pas la fonction de projection activée) créera toujours une sensation d'ombre, mais elle ne la projettera sur aucune surface. Il est important de noter que, quel que soit le réglage que vous choisissez ici, les textures projetées par les lumières de projection seront toujours activées.">
Types d'ombre
@ -112,52 +83,43 @@
<combo_box.item label="Soleil/Lune + Projecteurs" name="2"/>
</combo_box>
</panel>
<panel name="P_Shadow_Res">
<text name="T_Shadow_Res" tool_tip="Résolution de l'ombre : C'est un réglage TRÈS important. Il détermine la qualité des ombres. Il est également TRÈS lourd pour l'ordinateur. Il est préférable de laisser ce réglage aussi bas que possible lorsque vous ne faîtes pas de prises de vue. Réglez-le sur 1.0 pendant la préparation d'une prise de vue. Lorsque vous êtes prêt à prendre votre photo, déplacez lentement la barre de défilement vers la droite. Vous devez faire attention au frame rate lorsque vous augmentez ce réglage. Activez la barre de statistiques (dans l'onglet 'Aides' sous 'Aides de l'interface') lorsque vous faites cela pour la première fois afin de vous familiariser avec le résolution de l'ombre qui fonctionne le mieux avec votre système. REMARQUE : Si vous réglez ce niveau trop haut ou si vous le déplacez trop rapidement, vous risquez de provoquer des plantages.">
Résolution
</text>
<button name="Reset_Shadow_Res" label="D" tool_tip="Rétablir la valeur par défaut."/>
<!-- RenderShadowSplitExponent Y component -->
<text name="T_Shd_Clarity" tool_tip="'est un réglage TRÈS important. Il détermine essentiellement la clarté de l'ensemble des ombres du soleil et de la lune. Ce paramètre doit être réglé en premier avant de régler le paramètre ci-dessous. Avec la valeur de 'Rés. Omb.' au-dessus de 1.0, faites glisser la valeur de 'Clarté Omb.' jusqu'à obtenir le résultat le plus net possible. Veuillez noter que la clarté des ombres est directement liée à la position de la caméra et du soleil/lune. Chaque fois que vous déplacez la caméra ou le Soleil/Lune, il est préférable d'ajuster à nouveau cette valeur. En outre, pour faciliter l'ajustement de cette valeur, il est utile de régler 'Flou Omb.' à 0.0.">
Clarté
</text>
<button name="Shd_Clarity_Reset" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Blur_Size" tool_tip="Plus le nombre est élevé, plus les bords de l'ombre sont doux. Réglez sur '0' pour obtenir les ombres les plus nettes possibles. Ce réglage est aussi directement lié à celui qui est en dessous. Il vous permet de définir la quantité totale possible de flou d'ombre. S'il est défini à 4.00, vous pouvez utiliser Adouc. Omb. pour ajuster le flou de l'ombre indépendamment de l'occlusion ambiante. VEUILLEZ NOTER : L'occlusion ambiante doit être activée pour que ce paramètre fonctionne.">
Flou
</text>
<button name="Blur_Reset" label="D" tool_tip="Rétablir la valeur par défaut."/>
<!-- RenderShadowGaussian X component -->
<text name="T_Shd_Soften" tool_tip="Contrôle l'effet adoucissant des ombres du soleil et de la lune. Une façon simple de régler cette valeur en fonction de vos besoins spécifiques est de régler d'abord le 'Flou Omb.' à environ 3.0. Ensuite, le curseur ici pour adoucir l'AO à votre convenance. Veuillez noter qu'une valeur de 0,0 désactivera effectivement toutes les ombres du soleil et de la lune. De plus, cela n'a aucun effet sur les ombres causées par les lumières du projecteur">
Adoucir.
</text>
<button name="Shd_Soften_Reset" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Blur_Dist" tool_tip="Cela déterminera le point par rapport à la caméra à partir duquel les ombres commenceront à se brouiller. Plus la valeur est faible, plus le point de flou des ombres commencera à se rapprocher. VEUILLEZ NOTER : L'occlusion ambiante doit être activée pour que ce paramètre fonctionne.">
Dist. Flou.
</text>
<button name="Blur_Dist_Reset" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_FOV_Cutoff" tool_tip="Cela détermine le seuil de champ de vision à partir duquel le spectateur passera de la projection en ortho à la projection en perspective. Si vous obtenez des ombres qui sont 'irrégulières', essayez d'ajuster ce paramètre pour les améliorer. L'ajustement des valeurs XYZ du paramètre de débogage RenderShadowSplitExponent peut également être TRÈS utile.">
Cutoff FOV
</text>
<button name="FOV_Cutoff_Reset" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Shd_Bias" tool_tip="">
Bias.
</text>
<button name="Shd_Bias_Reset" label="D" tool_tip="Rétablir la valeur par défaut."/>
</panel>
<panel name="P_Ambient_Occlusion">
<text name="T_Ambient_Occlusion">
Paramètres d'occlusion ambiante
</text>
</panel>
<panel name="P_Amb_Occ_Settings">
<check_box label="Activer l'occl. amb. (Perception de la prof.)" name="UseSSAO" tool_tip="L'occlusion ambiante ajoute de l'ombre à tous les objets. Elle est plus efficace lorsque les paramètres Effet et Adoucissement ci-dessous sont utilisés. Elle peut ajouter un haut niveau de réalisme à l'image. Cela est particulièrement vrai lorsque les images sont réalisées à des résolutions de 2048 pixels ou plus."/>
</panel>
@ -167,23 +129,19 @@
Échelle
</text>
<button name="Reset_Scale" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Max_Scale" tool_tip="Contrôle le rayon maximal de l'écran à partir duquel on peut échantillonner , afin d'éviter les erreurs de cache de la carte graphique et la diminution importante des performances qui en découle. Il peut être utile de régler ces valeurs à un niveau élevé, puis d'ajouter un peu de flou d'ombre pour adoucir leur effet.">
Éch. max.
</text>
<button name="Reset_Max_Scale" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Scaling_Factor" tool_tip="Facteur d'échelle pour l'effet (plus c'est grand, plus c'est sombre). Il peut être utile de régler ces valeurs à un niveau élevé, puis d'ajouter un peu de flou d'ombre pour adoucir leur effet.">
Facteur
</text>
<button name="Reset_Scaling_Factor" label="D" tool_tip="Rétablir la valeur par défaut."/>
<!-- RenderSSAOEffect X component -->
<text name="T_Effect" tool_tip="Contrôle l'effet d'obscurcissement global de l'occlusion ambiante. La valeur par défaut de 0,8 produit un effet presque imperceptible. Les valeurs de 0,0 et moins donnent un résultat plus réaliste. Veuillez noter que l'occlusion ambiante produit un effet semblable à un bruit et que celui-ci peut être atténué en utilisant les commandes 'AO Soften' ci-dessous. De plus, l'avatar standard peut être moins attrayant avec des valeurs d'Effet élevées en raison de la géométrie de faible qualité de celui-ci. Veuillez noter : La valeur la plus basse que vous pouvez régler avec le curseur est 0, tandis que avec les flèches, vous pouvez entrer des valeurs négatives allant jusqu'à -10000.">
Effet
</text>
<button name="Reset_Effect" label="D" tool_tip="Rétablir la valeur par défaut."/>
<!-- RenderShadowGaussian Y component -->
<text name="T_AO_Soften" tool_tip="Contrôle l'adoucissement de l'effet d'occlusion ambiante. Une façon simple de régler cette valeur en fonction de vos besoins spécifiques est de régler d'abord le 'Flou Omb.' à environ 4,0. Ensuite, le curseur ici pour adoucir l'occlusion ambiante à votre convenance. Veuillez noter qu'une valeur de 0.0 désactivera le rendu d'occlusion ambiante.">
Adouc. AO
@ -191,63 +149,52 @@
<button name="Reset_AO_Soften" label="D" tool_tip="Rétablir la valeur par défaut."/>
</panel>
</panel>
<panel name="P_DoF_Glow" label="PdC/Lum.">
<panel name="PT_DoF_Glow">
<text name="T_DoF">
Paramètres de profondeur de champ
</text>
</panel>
<panel name="P_DoF_Settings">
<check_box label="Activer la profondeur de champ (PdC)" name="UseDepthofField" tool_tip="Cela active la profondeur de champ qui 'détermine la distance entre les objets les plus proches et les plus éloignés d'une scène qui apparaissent avec une netteté acceptable dans une image' (Wikipédia). Si vous ne l'utilisez pas, désactivez-la et elle accélérera votre fréquence d'images. Si vous ne pouvez pas activer cette fonction ou si vous ne voyez pas son effet, veuillez activer le Modèle d'éclairage avancé dans l'onglet 'Lumière'."/>
<check_box label="La mise au point de la PdC suit le pointeur" name="FSFocusPointFollowsPointer" tool_tip="La mise au point de la profondeur de champ (PdC) suivra votre souris. Ce comportement correspond à celui observé lors de l'utilisation de flycam. A utiliser en conjonction avec le verrouillage de la mise au point de la profondeur de champ"/>
<check_box label="Afficher le CdV actuel de l'écran du Viewer" tool_tip="Cela vous montrera le champ de vision vertical de la caméra. Il est possible de modifier la focale de l'objectif comme dans la vie réelle. Plus le champ de vision est petit, plus la longueur focale de l'objectif est élevée. Un objectif de 50 mm a un champ de vision de 27,0 degrés. Pour ajuster le champ de vision, utilisez la barre de défilement du zoom ci-dessous. Voir : https://fr.wikipedia.org/wiki/Angle_de_champ pour un tableau montrant la relation entre la distance focale et la longueur focale de l'objectif (mm). DÉSACTIVEZ LE ZOOM AVANT DE PRENDRE DES PHOTOS, SINON IL APPARAÎTRA SUR CELLES-CI !" name="MIC_Show_FOV"/>
</panel>
<panel name="P_Zoom">
<text name="T_Zoom" tool_tip="Dans le monde réel, il s'agit d'une fonction de Zoom. Elle permet de modifier le champ de vision dans votre fenêtre de visualisation. C'est la même chose que d'appuyer sur Ctrl + 0 ou Ctrl + 8. NOTE : Cette fonction ne marche pas si vous avez activé flycam (3D SpaceNavigator).">
Ang. de vue
</text>
<button name="Reset_Zoom" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_FOV" tool_tip="Champ de vision : Il indique à l'utilisateur le champ de vision que vous souhaitez simuler pour l'effet de profondeur de champ. Il est préférable de régler ce champ sur le champ de vision du viewer.">
CdV
</text>
<button name="Reset_FOV" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_F_Number" tool_tip="Dans la réalité, il s'agit du réglage de l'ouverture de l'objectif et plus la valeur est faible, plus la profondeur de champ sera réduite. Il en va de même pour SL.">
Ouverture
</text>
<button name="Reset_F_Number" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Focal_Length" tool_tip="Longueur focale (mm) : Ceci indique au viewer quelle longueur focale il doit simuler pour l'effet de profondeur de champ. Des nombres plus élevés produisent une profondeur de champ plus étroite.">
Long Foc
</text>
<button name="Reset_Focal_Length" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Foc_Time" tool_tip="Temps de transition de la mise au point : Ce paramètre règle le temps en secondes qu'il faut au viewer pour changer la mise au point d'un objet.">
Temps Foc
</text>
<button name="Reset_Foc_Time" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_CoC" tool_tip="Cercle de confusion : Ceci est un RÉGLAGE TRES IMPORTANT. Il détermine la force du flou lui-même. Il ne modifie pas la profondeur de champ, il ajuste la quantité de flou des objets qui se trouvent à l'extérieur. Vous pouvez utiliser des valeurs négatives pour des effets intéressants en entrant la valeur directement dans la zone de saisie à droite.">
CoC
</text>
<button name="Reset_CoC" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Resolution" tool_tip="Résolution : Cela détermine la qualité de l'effet de profondeur de champ. Pour les utilisations non photographiques, le 0,25 est bon. Pour régler les prises de vue, '0.50' ou '0.70' est très bien. Pour les prises de vue de qualité, la valeur '1.00' est la meilleure. Des valeurs élevées ralentiront votre FPS ! Vous pouvez également utiliser à des valeurs négatives pour des effets intéressants en entrant la valeur directement dans la zone de saisie à droite.">
Résolution
</text>
<button name="Reset_Resolution" label="D" tool_tip="Rétablir la valeur par défaut."/>
</panel>
<panel name="P_Glow_Settings">
<text name="T_Glow_Settings">
Luminosité
</text>
</panel>
<panel name="P_Glow_Quality">
<!--
<check_box label="Enable Glow Effect (please read the tool tip)" name="UseGlow" tool_tip="If Shadows are turned on, you must set the Strength to 0.0 to turn off this effect as the check box will not work."/>
@ -257,47 +204,39 @@
</text>
<button name="Reset_Glow_Quality" label="D" tool_tip="Rétablir la valeur par défaut."/>
</panel>
<panel name="P_Glow_Iterations">
<text name="T_Glow_Iterations" tool_tip="Nombre de fois où il faut itérer/répéter la lueur (une valeur plus haute donne un effet plus large et plus lisse et un peu plus lent).">
Itérations
</text>
<button name="Reset_Glow_Iterations" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Glow_Strength" tool_tip="Force additive de la luminosité. Des valeurs très faibles sont nécessaires pour voir cet effet. Commencez par des valeurs faibles !">
Force
</text>
<button name="Reset_Glow_Strength" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Luminance" tool_tip="Intensité minimale de luminance nécessaire pour considérer qu'un objet est suffisamment lumineux pour s'illuminer automatiquement.">
Luminance
</text>
<button name="Reset_Luminance" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Warmth" tool_tip="Quantité d'extraction de chaleur à utiliser (par rapport à l'extraction de luminance). 0 = lum, 1,0 = chaleur. N'A SOUVENT QUE PEU OU PAS D'EFFET !">
Chaleur
</text>
<button name="Reset_Warmth" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Glow_Width" tool_tip="Taille de l'échantillon lumineux. Plus haut = lueur plus large et plus douce, mais elle finira par devenir plus pixélisée.">
Largeur
</text>
<button name="Reset_Glow_Width" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Alpha" tool_tip="Fondamentalement, il s'agit de savoir jusqu'à quel point la lueur peut etre brillante.">
Alpha
</text>
<button name="Reset_Alpha" label="D" tool_tip="Rétablir la valeur par défaut."/>
</panel>
</panel>
<panel name="P_General" label="Gén">
<panel name="PT_General">
<text name="T_General">
Réglages généraux du rendu
</text>
</panel>
<panel name="P_General_Settings">
<text name="T_Draw_Distance" tool_tip="Cela règle la distance jusqu'à laquelle le viewer affichera quelque chose. Des valeurs élevées diminueront votre framerate !">
Dist. Aff.
@ -312,48 +251,39 @@
Détail Avi
</text>
<button name="Reset_Avi_Detail" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Avi_Physics" tool_tip="Contrôle le niveau de détail du physique de l'avatar (comme la la poitrine). Plus la valeur est haute, meilleur est le niveau de détail.">
Phys. Avi
</text>
<button name="Reset_Avi_Physics" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Particle_Cnt" tool_tip="Règle le nombre maximum de particules à rendre.">
Nb Part.
</text>
<button name="Reset_Particle_Cnt" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Terrain_Scale" tool_tip="Règle la qualité de la texture du sol (terrain) par défaut.">
Éch. Terr.
</text>
<button name="Reset_Terrain_Scale" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Terrain_Quality" tool_tip="Règle la qualité du terrain. Des chiffres élevés signifient un terrain plus détaillé au loin.">
Qual. Terr.
</text>
<button name="Reset_Terrain_Quality" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Object_Detail" tool_tip="Détermine quand des objets moins détaillés peuvent être utilisés pour réduire les coûts de rendu. Des valeurs plus élevées génèrent du lag.Å utiliser avec précaution.">
Détail Obj.
</text>
<button name="Reset_Object_Detail" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Flexi_Detail" tool_tip="Contrôle le niveau de détail des objets flexibles. Une valeur plus élevée signifie plus de détails.">
Flexiprims
</text>
<button name="Reset_Flexi_Detail" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Tree_Detail" tool_tip="Contrôle le niveau de détail de la végétation. Plus le nombre est élevé, plus le niveau de détail est élevé.">
Détail vég.
</text>
<button name="Reset_Tree_Detail" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Sky_Detail" tool_tip="Contrôle le niveau de détails du ciel avec WindLight. Des valeurs plus basses aboutiront à de meilleures performances mais des cieux moins beaux.">
Détail ciel
</text>
<button name="Reset_Sky_Detail" label="D" tool_tip="Rétablir la valeur par défaut."/>
</panel>
<panel name="P_Vignetting">
<text name="T_VignetteX" tool_tip="">
Vig. Quant.
@ -368,7 +298,6 @@
</text>
<button name="Reset_VignetteZ" label="D" tool_tip="Rétablir la valeur par défaut." />
</panel>
<panel name="P_Render">
<check_box label="Activer la distance d'affichage" name="UseFarClip" tool_tip="Active la distance d'affichage, si vous désactivez cette fonction, la visionneuse rendra les objets au-delà de la distance de dessin réglée."/>
<check_box label="Ajuster dynamiquement le niveau de détail" name="RednerLod1" tool_tip="Cette fonction permet au viewer d'ajuster dynamiquement le niveau de détail de la scène à mesure qu'il s'éloigne des objets. Elle permet d'améliorer les performances, elle peut également réduire la qualité des objets de la scène."/>
@ -376,7 +305,6 @@
<check_box label="Filtrage anisotropique (texture nette)" tool_tip="Cela permet d'obtenir une texture encore plus nette." name="Anisotropic"/>
<check_box label="Aff. les part. attachées à d'autres avatars" tool_tip="Permet au viewer de rendre toutes les particules attachées à/en provenance d'autres avatars." name="Render Attached Particle"/>
</panel>
<panel name="P_Anti-aliasing">
<text name="T_Anti-aliasing" tool_tip="Détermine le degré de netteté et de douceur des bords des objets. Sur les cartes graphiques de haut niveau, des valeurs plus élevées n'ont pratiquement AUCUN impact sur les performances. Sur les cartes graphiques de niveau inférieur, des valeurs plus élevées peuvent ralentir les performances.">
Anti-aliasing
@ -423,7 +351,6 @@
</combo_box>
</panel>
</panel>
<panel name="P_Aids" label="Aides">
<panel name="PT_Aids">
<text name="T_Aids">
@ -445,7 +372,6 @@
<button name="Rebake Texture" label="Forcer la Maj de l'apparance (Rebake)"/>
<button name="Set Window Size..." label="Régler la taille de la fenêtre du viewer..."/>
<button name="Debug Settings" label="Afficher le menu des paramètres de débogage"/>
<panel name="P_Quick_Stats">
<text name="T_Quick_Stats" tool_tip="Vous trouverez ici des statistiques très utiles pour évaluer les performances du système. Développez/réduisez les éléments ci-dessous en cliquant sur leurs étiquettes.">
Stats rapides
@ -466,7 +392,6 @@
</container_view>
</scroll_container>
</panel>
<panel name="P_Cam" label="Cam">
<panel name="PT_Cam">
<text name="T_Cam">
@ -479,7 +404,6 @@
Gauche/Dte
</text>
<button name="Reset_LR_Axis" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text
name="T_UD_Axis"
follows="top|left"
@ -491,38 +415,31 @@
Haut/bas
</text>
<button name="Reset_UD_Axis" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_IO_Axis" tool_tip="Règle la sensibilité du mouvement vers l'avant/vers l'arrière. Si vous avez des difficultés à vous déplacer avec précision, utilisez des valeurs d'échelle plus faibles.">
Avant/Arr.
</text>
<button name="Reset_IO_Axis" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Tilt" tool_tip="Ajuste la sensibilité du mouvement de tangage. Si vous avez du mal à vous déplacer avec précision, utilisez des valeurs d'échelle plus faibles.">
Tangage
</text>
<button name="Reset_Tilt" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Spin" tool_tip="Ajuste la sensibilité du mouvement de balancement. Si vous avez des difficultés à vous déplacer avec précision, utilisez des valeurs d'échelle plus faibles.">
Balance
</text>
<button name="Reset_Spin" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Roll" tool_tip="Ajuste la sensibilité du mouvement de rotation. Si vous avez des difficultés à vous déplacer avec précision, utilisez des valeurs d'échelle plus faibles.">
Rotation
</text>
<button name="Reset_Roll" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Zoom_Speed" tool_tip="Règle la sensibilité de la vitesse du zoom. Si vous avez des difficultés à zoomer avec précision, utilisez des valeurs d'échelle plus faibles.">
Vit. Zoom
</text>
<button name="Reset_Zoom_Speed" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Feathering" tool_tip="Régler le curseur à fond à droite rendra la caméra très rigide, donnant un contrôle complet au joystick. Si vous réglez le curseur à fond à gauche, l'appareil sera très fluide, comme si la caméra pesait beaucoup ; c'est bon pour les prises de vue en rafale, mais pas pour le cadrage.">
Feathering
</text>
<button name="Reset_Feathering" label="D" tool_tip="Rétablir la valeur par défaut."/>
</panel>
<panel name="P_Axis_Mapping">
<spinner label="Mappage des axes de zoom" name="JoystickAxis6" tool_tip="Contrôle l'axe de la souris sur lequel la fonction de zoom est mappée (réglé pour fonctionner)."/>
<check_box label="Activer la souris 3D" tool_tip="Cela active la souris 3D." name="enable_joystick"/>
@ -533,13 +450,11 @@
<check_box label="Afficher la FOV de l'écran du viewer" tool_tip="Cela vous montrera le champ de vision vertical de la caméra. Il est possible de modifier la longueur de l'objectif comme dans la vie réelle. Plus le champ de vision est petit, plus l'objectif de la caméra est long. Un objectif de 50 mm a un champ de vision de 27,0 degrés. Pour ajuster le champ de vision, utilisez la barre de défilement du zoom ci-dessous. Voir ci-dessous : https://fr.wikipedia.org/wiki/Angle_de_champ pour un tableau montrant la relation entre la distance focale et la longueur focale de l'objectif (mm). DÉSACTIVEZ LE ZOOM AVANT DE PRENDRE DES PHOTOS, SINON IL APPARAÎTRA SUR LA PHOTO !" name="CAM_Show_FOV"/>
<check_box label="Données détaillées sur la pos. de la caméra" name="Camera"/>
</panel>
<panel name="P_Viewer_Cam_Menu">
<text name="PT_Viewer_Cam_Menu">
Paramètres du menu de la caméra
</text>
</panel>
<panel name="P_Viewer_Cam_Menu_Settings">
<tab_container name="TC_Viewer_Cam_Menu_Settings">
<panel name="CamMov" label="Mouvement de la caméra">
@ -548,29 +463,24 @@
Angle de vue
</text>
<button name="Reset_Zoom2" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Zoom_Speed2" tool_tip="Contrôle la vitesse de zoom avant et arrière de la caméra. Des valeurs plus élevées produisent un zoom plus lent et plus régulier.">
Vitesse du zoom
</text>
<button name="Reset_Zoom_Speed2" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Camera_Lag" tool_tip="Quantité de décalage de la caméra par rapport au mouvement de l'avatar (0 = aucune, 30 = vitesse de l'avatar).">
Décalage caméra
</text>
<button name="Reset_Camera_Lag" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Camera_Offset" tool_tip="Contrôle la distance à laquelle la caméra est décalée/distante du point de vue par défaut.">
Décalage caméra
</text>
<button name="Reset_Camera_Offset" label="D" tool_tip="Rétablir la valeur par défaut."/>
<text name="T_Cam_Smoothing" tool_tip="Contrôle la douceur avec laquelle la caméra démarre et s'arrête. Des valeurs plus élevées produisent un mouvement plus doux (et un peu plus lent).">
Lissage Cam.
</text>
<button name="Reset_Cam_Smoothing" label="D" tool_tip="Rétablir la valeur par défaut."/>
</panel>
</panel>
<panel name="P_Mouse" label="Souris">
<panel name="P_Mouse_Settings">
<text name="T_Mouse_Sens" tool_tip="Contrôle la réactivité de la souris lorsqu'elle est en mode 'mouselook'.">
@ -581,7 +491,6 @@
<check_box label="Fluidifier les mvts en mouselook" tool_tip="Lisse le mouvement de la souris lorsqu'elle est en mode 'mouselook'." name="MouseSmooth"/>
</panel>
</panel>
<panel name="P_Misc" label="Réglages divers">
<panel name="P_Misc_Settings">
<check_box label="Clic sur votre avi garde la pos. de la caméra" name="clickonavatarkeepscamera" tool_tip="Normalement, un clic sur votre avatar réinitialise la position de la caméra. Cette option supprime ce comportement."/>

View File

@ -15,7 +15,7 @@
<text name="key_label">Raccourci :</text>
<combo_box label="Non" name="modifier_combo"/>
<combo_box label="Non" name="key_combo"/>
<text name="library_label">Librairie :</text>
<text name="library_label">Bibliothèque :</text>
<button label="Ajouter &gt;&gt;" name="add_btn"/>
<text name="steps_label">Étapes:</text>
<button label="Haut" name="up_btn"/>
@ -26,6 +26,7 @@
<radio_item label="Démarrer" name="start"/>
<radio_item label="Arrêter" name="stop"/>
</radio_group>
<check_box label="jusqu'au relâchement de la touche" name="wait_key_release_check"/>
<check_box label="Jusqu'à ce que les anims. soient jouées" name="wait_anim_check"/>
<check_box label="Durée en secondes :" name="wait_time_check"/>
<text name="help_label">Toutes les étapes se produisent simultanément, sauf si vous insérez des pauses.</text>

View File

@ -18,6 +18,7 @@
<menu_item_call label="Vider la corbeille" name="Empty Trash"/>
<menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>
<menu_item_call label="Nouveau dossier" name="New Folder"/>
<menu_item_call label="Nouveau dossier" name="New Listing Folder"/>
<menu_item_call label="Nouveau script" name="New Script"/>
<menu_item_call label="Nouvelle note" name="New Note"/>
<menu_item_call label="Nouveau geste" name="New Gesture"/>

View File

@ -31,6 +31,7 @@
</menu>
<menu label="Détacher" name="Avatar Detach" />
<menu_item_call label="Tout détacher" name="Detach All" />
<menu_item_call label="Détacher les éléments sélectionnés" name="Remove Selected Attachments"/>
</menu>
<menu_item_call label="Choisir un avatar..." name="Avatar Picker"/>
<menu label="Déplacements" name="Movement">

View File

@ -180,6 +180,11 @@ L&apos;initialisation de la Place du marché a échoué en raison d&apos;une err
&apos;[ERROR_CODE]&apos;
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="InvalidKeystroke">
Une entrée de touche non valide a été saisie.
[REASON].
Veuillez saisir un texte valide.
</notification>
<notification name="MerchantForceValidateListing">
Pour créer votre annonce, nous avons corrigé la hiérarchie de votre contenu dannonces.
<usetemplate ignoretext="Mavertir que la création dune annonce corrige la hiérarchie du contenu" name="okignore" yestext="OK"/>
@ -1793,14 +1798,14 @@ Continuer ?
<usetemplate ignoretext="Confirmer avant de rendre les objets à leurs propriétaires" name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Vous êtes actuellement membre du groupe &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Quitter le groupe ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
Quitter le &apos;&lt;nolink&gt;[GROUP]&lt;/nolink&gt;&apos; ?
Une nouvelle adhésion coûtera [COST]L$.
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Quitter"/>
</notification>
<notification name="GroupLeaveConfirmMemberWithFee">
Vous êtes actuellement membre du groupe &lt;nolink&gt;[GROUP]&lt;/nolink&gt;. Une nouvelle adhésion coûtera [AMOUNT]L$.
Quitter le groupe ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
<notification name="GroupLeaveConfirmMemberNoFee">
Quitter le groupe &apos;&lt;nolink&gt;[GROUP]&lt;/nolink&gt;&apos; ?
Une nouvelle adhésion ne vous coûtera rien.
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Quitter"/>
</notification>
<notification name="OwnerCannotLeaveGroup">
Impossible de quitter le groupe. Vous ne pouvez pas quitter le groupe car vous en êtes le dernier propriétaire. Vous devez d&apos;abord affecter le rôle de propriétaire à un autre membre.
@ -2507,6 +2512,16 @@ Vous ne pouvez pas l&apos;annuler.
Voulez-vous vraiment les supprimer ?
<usetemplate ignoretext="Confirmer avant de supprimer des articles filtrés." name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="DeleteWornItems">
Un ou plusieurs objets que vous souhaitez supprimer sont portés par votre avatar.
Retirer ces éléments de votre avatar ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Retirer le(s) élément(s) et supprimer"/>
</notification>
<notification name="CantDeleteRequiredClothing">
Certains éléments que vous souhaitez supprimer sont obligatoires (peau, forme, cheveux, yeux).
Vous devez les remplacer avant de les supprimer.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="DeleteThumbnail">
Supprimer l'image de cet élément ? Il n'y a pas d'annulation possible.
<usetemplate ignoretext="Confirmer la suppression d'une vignette." name="okcancelignore" notext="Annuler" yestext="Supprimer"/>

View File

@ -4,6 +4,9 @@
<panel.string name="want_apply_text">Voulez-vous enregistrer vos modifications ?</panel.string>
<panel.string name="group_join_btn">Rejoindre ([AMOUNT] L$)</panel.string>
<panel.string name="group_join_free">Gratuit</panel.string>
<panel.string name="group_member">Membre</panel.string>
<panel.string name="join_txt">Joindre</panel.string>
<panel.string name="leave_txt">Quitter</panel.string>
<layout_stack name="group_info_sidetray_main">
<layout_panel name="header_container">
<panel name="group_info_top"><line_editor label="Saisissez le nom de votre nouveau groupe ici" name="group_name_editor"/></panel>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="group_list_item">
<button name="notices_btn" tool_tip="Notices du groupe"/>
<button name="info_btn" tool_tip="Plus d'infos"/>
<button name="profile_btn" tool_tip="Voir le profil"/>
</panel>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="group_list_item">
<text name="group_name" value="Inconnu"/>
<button name="notices_btn" tool_tip="Notices de groupe"/>
<button name="visibility_hide_btn" tool_tip="Masquer le groupe sur mon profil"/>
<button name="visibility_show_btn" tool_tip="Afficher le groupe sur mon profil"/>
<button name="info_btn" tool_tip="En savoir plus"/>

View File

@ -82,7 +82,8 @@
<button label="Débloquer" name="unblock" tool_tip="Débloquer ce Résident"/>
</layout_panel>
</layout_stack>
<check_box label="Afficher dans la recherche" name="show_in_search_checkbox" tool_tip="Permettez aux usagers de vous voir dans les résultats de recherche"/>
<check_box label="Afficher dans la recherche" name="show_in_search" tool_tip="Permettez aux usagers de vous voir dans les résultats de recherche"/>
<check_box name="hide_sl_age" label="Afficher la date de naissance complète'" tool_tip="Laissez les gens voir votre âge SL"/>
<button name="save_description_changes" label="Enregistrer" />
<button name="discard_description_changes" label="Annuler" />
</panel>

View File

@ -18,23 +18,17 @@
<panel.string name="owner_can">
Le propriétaire peut :
</panel.string>
<panel.string name="acquiredDate">
[wkday,datetime,slt] [mth,datetime,slt] [day,datetime,slt] [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt] [year,datetime,slt]
</panel.string>
<panel.string name="origin_inventory">
(inventaire)
</panel.string>
<panel.string name="origin_inworld">
(dans Second Life)
</panel.string>
<text name="title" value="Profil de l&apos;article"/>
<text name="origin" value="(inventaire)"/>
<scroll_container name="item_profile_scroll">
<panel label="" name="item_profile">
<text name="LabelItemNameTitle">
Nom :
</text>
<layout_stack name="main_stack">
<layout_panel name="layout_item_name">
<line_editor name="LabelItemName" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l&apos;exception de la barre / pipe verticale &apos;|&apos;."/>
</layout_panel>
<layout_panel name="layout_item_details">
<text name="LabelOwnerTitle">
Propriétaire :
</text>
@ -44,31 +38,42 @@
<text name="LabelAcquiredTitle">
Acquis le :
</text>
<button label="Photo..." name="change_thumbnail_btn" />
</layout_panel>
<layout_panel name="layout_item_description">
<text name="LabelItemDescTitle">
Description :
</text>
<text_editor name="LabelItemDesc" tool_tip="Lorsque les utilisateurs ont sélectionné &apos;Afficher les infobulles sur tous les objets&apos; dans les paramètres de la visionneuse, ils verront la description de l'objet s'afficher pour tout objet placé sous le pointeur de leur souris. La description de l'objet est limitée à 127 octets. Toute chaîne de caractères plus longue sera tronquée." />
<text name="LabelItemExperienceTitle">
Expérience :
</text>
<panel name="perms_inv">
<text name="perm_modify">
Vous pouvez :
</text>
<check_box label="Modifier" name="CheckOwnerModify"/>
<check_box label="Copier" name="CheckOwnerCopy"/>
<check_box label="Transférer" name="CheckOwnerTransfer"/>
<text name="AnyoneLabel">
N&apos;importe qui :
</text>
<check_box label="Copier" name="CheckEveryoneCopy" tool_tip="Tout le monde peut prendre une copie de l&apos;objet. L&apos;objet et tout son contenu doit être autorisé à être copié et transféré."/>
<text name="GroupLabel">
Groupe :
</text>
<check_box label="Partager" name="CheckShareWithGroup" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Céder."/>
<text name="NextOwnerLabel">
Prochain propriétaire :
</text>
<check_box label="Modifier" name="CheckNextOwnerModify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l&apos;élément ou l&apos;échelle de cet objet."/>
<check_box label="Copier" name="CheckNextOwnerCopy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l&apos;élément qui est copié."/>
<check_box label="Transférer" name="CheckNextOwnerTransfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/>
</panel>
</layout_panel>
<layout_panel name="layout_item_permissions_sale">
<text name="perm_modify">
Autorisations
</text>
<text name="you_perm_modify">
Vous pouvez :
</text>
<check_box label="Modifier" name="CheckOwnerModify"/>
<check_box label="Copier" name="CheckOwnerCopy"/>
<check_box label="Transférer" name="CheckOwnerTransfer"/>
<text name="AnyoneLabel">
N&apos;importe qui :
</text>
<check_box label="Copier" name="CheckEveryoneCopy" tool_tip="Tout le monde peut prendre une copie de l&apos;objet. L&apos;objet et tout son contenu doit être autorisé à être copié et transféré."/>
<text name="GroupLabel">
Groupe :
</text>
<check_box label="Partager" name="CheckShareWithGroup" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Céder."/>
<text name="NextOwnerLabel">
Prochain propriétaire :
</text>
<check_box label="Modifier" name="CheckNextOwnerModify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l&apos;élément ou l&apos;échelle de cet objet."/>
<check_box label="Copier" name="CheckNextOwnerCopy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l&apos;élément qui est copié."/>
<check_box label="Transférer" name="CheckNextOwnerTransfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/>
<check_box label="À vendre" name="CheckPurchase" tool_tip="Permet aux gens d&apos;acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/>
<combo_box name="ComboBoxSaleType" tool_tip="Indiquez si lacheteur recevra une copie, une copie du contenu ou larticle lui-même.">
<combo_box.item label="Copier" name="Copy"/>
@ -76,9 +81,6 @@
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Prix : L$" name="Edit Cost" tool_tip="Coût de l&apos;objet."/>
</panel>
</scroll_container>
<panel name="button_panel">
<button label="Annuler" name="cancel_btn"/>
</panel>
</layout_panel>
</layout_stack>
</panel>

View File

@ -44,94 +44,86 @@
</panel.string>
<text name="title" value="Profil de l&apos;objet"/>
<text name="where" value="(dans Second Life)"/>
<panel label="" name="properties_panel">
<text name="Name:">
Nom :
</text>
<line_editor name="Object Name" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l&apos;exception de la barre / pipe verticale &apos;|&apos;."/>
<text name="Description:">
Description :
</text>
<line_editor name="Object Description" tool_tip="Lorsque les utilisateurs sélectionnent &apos;Conseils de survol sur tous les objets&apos; dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/>
<text name="CreatorNameLabel">
Créateur :
</text>
<text name="Owner:">
Propriétaire :
</text>
<text name="Group_label">
Groupe :
</text>
<button name="button set group" tool_tip="Choisir un groupe pour partager les droits relatifs à cet objet"/>
<name_box initial_value="Chargement…" name="Group Name Proxy"/>
<button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets partagés d&apos;un groupe."/>
<text name="label click action">
Cliquer pour :
</text>
<combo_box name="clickaction" tool_tip="Une action de clic vous permet d&apos;interagir avec un objet avec un simple clic gauche. Chaque action de clic a un curseur spécial indiquant ce qu&apos;il fait. Certaines actions de clic ont des exigences pour fonctionner. Par exemple, Toucher and Payer nécessitent des scripts">
<combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
<combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
<combo_box.item label="Acheter l&apos;objet" name="Buyobject"/>
<combo_box.item label="Payer l&apos;objet" name="Payobject"/>
<combo_box.item label="Ouvrir" name="Open"/>
<combo_box.item label="Zoom" name="Zoom"/>
<combo_box.item label="Ignorer l'objet" name="Ignoreobject"/>
<combo_box.item label="Aucun" name="None"/>
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">
Vous pouvez modifier cet objet
<scroll_container name="item_profile_scroll">
<panel name="properties_panel">
<text name="Name:">
Nom :
</text>
<text name="Anyone can:">
N&apos;importe qui :
<line_editor name="Object Name" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l&apos;exception de la barre / pipe verticale &apos;|&apos;."/>
<text name="Description:">
Description :
</text>
<check_box label="Copier" name="checkbox allow everyone copy" tool_tip="Tout le monde peut prendre une copie de l&apos;objet. L&apos;objet et tout son contenu doit être autorisé à être copié et transféré."/>
<check_box label="Bouger" name="checkbox allow everyone move" tool_tip="Tout le monde peut déplacer l&apos;objet."/>
<text name="GroupLabel">
<line_editor name="Object Description" tool_tip="Lorsque les utilisateurs sélectionnent &apos;Conseils de survol sur tous les objets&apos; dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/>
<text name="CreatorNameLabel">
Créateur :
</text>
<text name="Owner:">
Propriétaire :
</text>
<text name="Group_label">
Groupe :
</text>
<check_box label="Partager" name="checkbox share with group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Céder."/>
<text name="NextOwnerLabel">
Le prochain propriétaire :
<button name="button set group" tool_tip="Choisir un groupe pour partager les droits relatifs à cet objet"/>
<name_box initial_value="Chargement…" name="Group Name Proxy"/>
<button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets partagés d&apos;un groupe."/>
<text name="label click action">
Cliquer pour :
</text>
<combo_box name="clickaction" tool_tip="Une action de clic vous permet d&apos;interagir avec un objet avec un simple clic gauche. Chaque action de clic a un curseur spécial indiquant ce qu&apos;il fait. Certaines actions de clic ont des exigences pour fonctionner. Par exemple, Toucher and Payer nécessitent des scripts">
<combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
<combo_box.item label="S&apos;asseoir sur l&apos;objet" name="Sitonobject"/>
<combo_box.item label="Acheter l&apos;objet" name="Buyobject"/>
<combo_box.item label="Payer l&apos;objet" name="Payobject"/>
<combo_box.item label="Ouvrir" name="Open"/>
<combo_box.item label="Zoom" name="Zoom"/>
<combo_box.item label="Aucun" name="None"/>
<combo_box.item label="Ignorer l'objet" name="Ignoreobject"/>
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">
Vous pouvez modifier cet objet
</text>
<text name="Anyone can:">
N&apos;importe qui :
</text>
<check_box label="Copier" name="checkbox allow everyone copy" tool_tip="Tout le monde peut prendre une copie de l&apos;objet. L&apos;objet et tout son contenu doit être autorisé à être copié et transféré."/>
<check_box label="Bouger" name="checkbox allow everyone move" tool_tip="Tout le monde peut déplacer l&apos;objet."/>
<text name="GroupLabel">
Le groupe :
</text>
<check_box label="Partager" name="checkbox share with group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Céder."/>
<text name="NextOwnerLabel">
Le prochain propriétaire :
</text>
<check_box label="Modifier" name="checkbox next owner can modify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l&apos;élément ou l&apos;échelle de cet objet."/>
<check_box label="Copier" name="checkbox next owner can copy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l&apos;élément qui est copié."/>
<check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
</panel>
<check_box label="À vendre" name="checkbox for sale" tool_tip="Permet aux gens d&apos;acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/>
<combo_box name="sale type" tool_tip="Indiquez si lacheteur recevra une copie, une copie du contenu ou larticle lui-même.">
<combo_box.item label="Copier" name="Copy"/>
<combo_box.item label="Contenus" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Prix : L$" name="Edit Cost" tool_tip="Coût de l&apos;objet."/>
<check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
<text name="pathfinding_attributes_label">
Attributs recherche chemin :
</text>
<check_box label="Modifier" name="checkbox next owner can modify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l&apos;élément ou l&apos;échelle de cet objet."/>
<check_box label="Copier" name="checkbox next owner can copy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l&apos;élément qui est copié."/>
<check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/>
</panel>
<check_box label="À vendre" name="checkbox for sale" tool_tip="Permet aux gens d&apos;acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/>
<combo_box name="sale type" tool_tip="Indiquez si lacheteur recevra une copie, une copie du contenu ou larticle lui-même.">
<combo_box.item label="Copier" name="Copy"/>
<combo_box.item label="Contenus" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Prix : L$" name="Edit Cost" tool_tip="Coût de l&apos;objet."/>
<check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
<text name="pathfinding_attributes_label">
Attributs de recherche de chemin :
</text>
<text name="B:">
B :
</text>
<text name="O:">
O :
</text>
<text name="G:">
G :
</text>
<text name="E:">
E :
</text>
<text name="N:">
N :
</text>
<text name="F:">
F :
</text>
</panel>
<panel name="button_panel">
<button label="Ouvrir" name="open_btn" tool_tip="Ouvrir pour afficher le contenu de l&apos;objet."/>
<button label="Payer" name="pay_btn" tool_tip="Ouvrir la fenêtre Payer. L&apos;objet doit avoir un script payant pour que cela fonctionne."/>
<button label="Acheter" name="buy_btn" tool_tip="Ouvrir la fenêtre Acheter Nécessite que l&apos;objet soit mis en vente."/>
<button label="Détails" name="details_btn" tool_tip="Ouvrir la fenêtre Inspecter l&apos;objet"/>
</panel>
</scroll_container>
<layout_stack name="buttons_ls">
<layout_panel name="open_btn_panel">
<button label="Ouvrir" name="open_btn" tool_tip="Ouvrir pour afficher le contenu de l&apos;objet."/>
</layout_panel>
<layout_panel name="pay_btn_panel">
<button label="Payer" name="pay_btn" tool_tip="Ouvrir la fenêtre Payer. L&apos;objet doit avoir un script payant pour que cela fonctionne."/>
</layout_panel>
<layout_panel name="buy_btn_panel">
<button label="Acheter" name="buy_btn" tool_tip="Ouvrir la fenêtre Acheter Nécessite que l&apos;objet soit mis en vente."/>
</layout_panel>
<layout_panel name="details_btn_panel">
<button label="Détails" name="details_btn" tool_tip="Ouvrir la fenêtre Inspecter l&apos;objet"/>
</layout_panel>
</layout_stack>
</panel>

View File

@ -1388,6 +1388,19 @@ http://secondlife.com/support pour vous aider à résoudre ce problème.
<string name="executable_files">
Fichiers de programmes exécutables
</string>
<string name="Validator_InvalidNumericString">Chaîne numérique non valide : "[STR]"</string>
<string name="Validator_ShouldNotBeMinus">Caractère initial non valide : '[CH]' (ne doit pas être un moins)</string>
<string name="Validator_ShouldNotBeMinusOrZero">Caractère initial non valide : '[CH]' (ne doit être ni un moins ni un zéro)</string>
<string name="Validator_ShouldBeDigit">Caractère non valide [NR] : '[CH]' (ne doit être qu'un chiffre)</string>
<string name="Validator_ShouldBeDigitOrDot">Caractère non valide [NR] : '[CH]' (ne doit être qu'un chiffre ou un point décimal)</string>
<string name="Validator_ShouldBeDigitOrAlpha">Caractère non valide [NR] : '[CH]' (ne peut être qu'un chiffre ou un caractère alphanumérique ASCII)</string>
<string name="Validator_ShouldBeDigitOrAlphaOrSpace">Caractère non valide [NR] : '[CH]' (ne peut être qu'un chiffre, un caractère alphanumérique ASCII ou un espace.)</string>
<string name="Validator_ShouldBeDigitOrAlphaOrPunct">Caractère non valide [NR] : '[CH]' (ne peut être qu'un chiffre, un caractère alphanumérique ASCII ou un signe de ponctuation.)</string>
<string name="Validator_ShouldBeDigitOrAlphaOrPunctNotSpace">Caractère non valide [NR] : '[CH]' (ne peut être qu'un chiffre ou un caractère alphanumérique ASCII ou une ponctuation sans espace.)</string>
<string name="Validator_ShouldBeDigitNotSpace">Caractère non valide [NR] : '[CH]' (ne doit être qu'un chiffre sans espace)</string>
<string name="Validator_ShouldBeASCII">Caractère non valide [NR] : '[CH]' (ne peut être qu'un caractère ASCII)</string>
<string name="Validator_ShouldBeNewLineOrASCII">Caractère non valide [NR] : '[CH]' (ne doit être qu'un caractère ASCII ou une nouvelle ligne.)</string>
<string name="LSLTipSleepTime" translate="false">Pause le script pendant [SLEEP_TIME] secondes.</string>
<string name="shape">
Silhouette
</string>
@ -5416,7 +5429,8 @@ Si le problème persiste, vérifiez la configuration de votre réseau et de votr
Cette tenue ne contient aucun article.
</string>
<string name="ExternalEditorNotSet">
Sélectionnez un éditeur à l&apos;aide du paramètre ExternalEditor.
Sélectionnez un éditeur en définissant la variable d'environnement LL_SCRIPT_EDITOR ou le paramètre ExternalEditor.
Voyez https://wiki.secondlife.com/wiki/LSL_Alternate_Editors
</string>
<string name="ExternalEditorNotFound">
Éditeur externe spécifié introuvable.
@ -6841,6 +6855,7 @@ Votre position actuelle : [AVATAR_POS]
<string name="avatar_age_alert">
a déclenché l'alerte sur l'âge. Âge: [AGE] jour(s)
</string>
<string name="avatar_age_not_available">n.d.</string>
<string name="TotalScriptCountChangeIncrease">
Le nombre total de scripts dans la région est passé de [OLD_VALUE] à [NEW_VALUE] ([DIFFERENCE]).

View File

@ -61,16 +61,16 @@
</combo_box>
</panel>
<panel name="P_R_Res">
<text name="T_R_Res" tool_tip="Determina la qualità dei riflessi sull'acqua. Impostando 'Molto buona' o superiore, è necessario abilitare anche 'Illuminazione Avanzata' nella scheda 'Luce'.">
<text name="T_R_Res" tool_tip="Determina la qualità dei riflessi sull'acqua.">
Risoluzione
</text>
<combo_box name="ReflectionRescombo">
<combo_box.item label="Discreta" name="0"/>
<combo_box.item label="Buona" name="1"/>
<combo_box.item label="Molto buona - NOTA: è necessario abilitare anche 'Illuminazione Avanzata' (scheda Luce)" name="2"/>
<combo_box.item label="Eccellente - NOTA: è necessario abilitare anche 'Illuminazione Avanzata' (scheda Luce)" name="3"/>
<combo_box.item label="Eccezionale - NOTA: è necessario abilitare anche 'Illuminazione Avanzata' (scheda Luce)" name="4"/>
<combo_box.item label="Realistica - NOTA: è necessario abilitare anche 'Illuminazione Avanzata' (scheda Luce)" name="5"/>
<combo_box.item label="Molto buona" name="2"/>
<combo_box.item label="Eccellente" name="3"/>
<combo_box.item label="Eccezionale" name="4"/>
<combo_box.item label="Realistica" name="5"/>
</combo_box>
<check_box label="Acqua Trasparente" name="TransparentWater" tool_tip="Rende l'acqua trasparente. Senza questa spunta, l'acqua apparirà opaca con una semplice texture."/>
</panel>
@ -82,8 +82,6 @@
</text>
</panel>
<panel name="P_L_S_Settings">
<check_box label="Abilita Illuminazione Avanzata" name="RenderDeferred" tool_tip="Abilita le ombre di sole e luna e dalle altre fonti di luce. Permette anche di abilitare la profondità di campo ed altre funzioni grafiche. In sostanza questa impostazione abilita la maggior parte degli abbellimenti grafici."/>
<check_box label="Abilita Luci Locali" name="LocalLights" tool_tip="Abilita tutte le luci. Se disabilitata, rimarranno attive solo le luci del sole e della luna. Utile per disabilitare le luci provenienti dagli oggetti ed usare soltanto quelle di sole e luna."/>
<check_box label="Abilita Luci Attachments" tool_tip="Abilita tutte le luci provenienti da oggetti indossati dagli avatar, come ad esempio le face-light. Utile per disabilitare le face-light quando necessario." name="Render Attached Lights"/>
</panel>
<panel name="P_Shadows">

View File

@ -36,7 +36,7 @@
<button label="Chat" name="btn_chat"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Chiamata al gruppo" name="btn_call" tool_tip="Avvia una conferenza vocale in questo gruppo"/>
<button label="Chiamata" name="btn_call" tool_tip="Avvia una conferenza vocale in questo gruppo"/>
</layout_panel>
<layout_panel name="btn_apply_lp">
<button label="Salva" label_selected="Salva" name="btn_apply"/>

View File

@ -93,16 +93,16 @@
</panel>
<panel name="P_R_Res">
<text name="T_R_Res" tool_tip="水の反射の解像度/品質を決定します。「非常によい」以上に設定する場合は、「光」タブの「高度な照明モデル」を有効にしておく必要があります。">
<text name="T_R_Res" tool_tip="水の反射の解像度/品質を決定します。">
解像度
</text>
<combo_box name="ReflectionRescombo">
<combo_box.item label="ふつう" name="0" />
<combo_box.item label="よい" name="1" />
<combo_box.item label="非常によい - ※注意! 「高度な照明モデル」(光タブ内)を有効にしておく必要があります。" name="2" />
<combo_box.item label="優れている - ※注意! 「高度な照明モデル」(光タブ内)を有効にしておく必要があります。" name="3" />
<combo_box.item label="非常に優れている - ※注意! 「高度な照明モデル」(光タブ内)を有効にしておく必要があります。" name="4" />
<combo_box.item label="実物レベル - ※注意! 「高度な照明モデル」(光タブ内)を有効にしておく必要があります。" name="5" />
<combo_box.item label="非常によい" name="2" />
<combo_box.item label="優れている" name="3" />
<combo_box.item label="非常に優れている" name="4" />
<combo_box.item label="実物レベル" name="5" />
</combo_box>
<check_box label="透明な水" name="TransparentWater" tool_tip="水を透明に描画します。ここにチェックを入れると、単純なテクスチャが適用された不透明な水を描画しなくなります。" />
</panel>
@ -116,8 +116,6 @@
</panel>
<panel name="P_L_S_Settings">
<check_box label="高度な照明モデルを有効にする" name="RenderDeferred" tool_tip="ここにチェックを入れると、太陽、月、およびインワールドの光源による影を描画します。同時に、「被写界深度DOF」その他のグラフィック機能も「オン」にします。基本的に、インワールドにある「魅力的なもの」の殆どはこの機能を有効にしないと見ることができません。もしこの機能を有効にできない、或いは効果が確認できないという場合は、まず「WL」タブの「環境大気シェーダー」と「基本シェーダー」が共に有効になっていることを確認して下さい。" />
<check_box label="近くの光を有効にする" name="LocalLights" tool_tip="ここにチェックを入れるとインワールドにある光を全て点灯します。ここのチェックを外した場合でも、太陽と月は消えません。SIM内の光を除いて、太陽と月の光だけを使用したい場合に便利です。" />
<check_box label="装着している光源(フェイスライト)を有効にする" tool_tip="この機能は、例えばフェイスライトのような装着しているあらゆる光源を有効にします。その必要がある時にフェイスライトをオフにするのに便利な機能です。" name="Render Attached Lights" />
</panel>

View File

@ -46,16 +46,16 @@
</text>
</panel>
<panel name="P_R_Res">
<text name="T_R_Res" tool_tip="Określa rozdzielczość/jakość odbić w wodzie. Aby zmiany odniosły skutek musisz wyłączyć i włączyć 'podstawowe shadery'. Poza tym, gdy ustawienia rozdzielczości są w trybie 'bardzo dobrym' lub wyższym musisz także włączyć 'Zaawansowane oświetlenie' w karcie 'Światła'.">
<text name="T_R_Res" tool_tip="Określa rozdzielczość/jakość odbić w wodzie.">
Rozdzielczość
</text>
<combo_box name="ReflectionRescombo">
<combo_box.item label="Przyzwoita" name="0"/>
<combo_box.item label="Dobra" name="1"/>
<combo_box.item label="Bardzo dobra - UWAGA: Musisz także włączyć 'Zaawansowane oświetlenie' (karta Światła)" name="2"/>
<combo_box.item label="Świetna - UWAGA: Musisz także włączyć 'Zaawansowane oświetlenie' (karta Światła)" name="3"/>
<combo_box.item label="Znakomita - UWAGA: Musisz także włączyć 'Zaawansowane oświetlenie' (karta Światła)" name="4"/>
<combo_box.item label="Jak żywa - UWAGA: Musisz także włączyć 'Zaawansowane oświetlenie' (karta Światła)" name="5"/>
<combo_box.item label="Bardzo dobra" name="2"/>
<combo_box.item label="Świetna" name="3"/>
<combo_box.item label="Znakomita" name="4"/>
<combo_box.item label="Jak żywa" name="5"/>
</combo_box>
<check_box label="Przezroczysta woda" name="TransparentWater" tool_tip="Renderuj wodę jako powierzchnię przezroczystą. Wyłączenie tej opcji pokryje wodę nieprzejrzystą, prostą teksturą."/>
</panel>
@ -67,7 +67,6 @@
</text>
</panel>
<panel name="P_L_S_Settings">
<check_box label="Wszystkie lokalne światła" name="LocalLights" tool_tip="Ta opcja włącza wszystkie światła w świecie. Jeśli ją wyłączysz, to światło pochodzące od Słońca i Księżyca ciągle będzie widoczne. Przydatne, gdy chcesz wyeliminować oświetlenie pochodzące z regionu i użyć tylko światła słonecznego/księżycowego."/>
<check_box label="Włącz doczepiane światła (np. twarzy)" name="Render Attached Lights" tool_tip="Ta opcja włącza światła doczepione do awatarów, na przykład te oświetlające twarze. Użyteczne, gdy trzeba wyłączyć oświetlenie twarzy."/>
</panel>
<panel name="P_Shadows">

View File

@ -0,0 +1,17 @@
<floater name="whitelist_floater" title="Dodaj foldery i pliki binarne do wykluczeń">
<text name="whitelist_intro">
Antywirusy i oprogramowanie chroniące przed złośliwym oprogramowaniem są istotnym elementem bezpiecznego korzystania z Internetu, ale mogą powodować wiele problemów.
Aby poprawić stabilność i wydajność zdecydowanie zalecamy, aby wszyscy użytkownicy upewnili się, że dodali do wykluczeń (tzw. białej listy) ważne foldery i programy używane przez przeglądarkę.
Więcej szczegółowych informacji znajdziesz na stronie
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text name="whitelist_folder_instruction">
Aby uprościć zadanie, w polu poniżej znajdują się foldery używane przez przeglądarkę.
Dodaj je do wykluczeń antywirusa, jak pokazano na stronie wiki powyżej.
</text>
<text name="whitelist_exe_instruction">
Poniższe pole zawiera nazwy i ścieżki plików wykonywalnych przeglądarki.
Dodaj je do wykluczeń antywirusa, jak pokazano na stronie wiki powyżej.
</text>
</floater>

View File

@ -298,6 +298,7 @@
<menu_item_call label="Portal wsparcia" name="Support portal"/>
<menu_item_call label="Newsy: [SECOND_LIFE]" name="Second Life News"/>
<menu_item_call label="Blogi: [SECOND_LIFE]" name="Second Life Blogs"/> -->
<menu_item_call name="whitelist_folders" label="Doradca wykluczeń" />
<menu_item_check label="Sprawdź stan świata" name="Grid Status"/>
<menu_item_call label="Zgłoś nadużycie" name="Report Abuse"/>
<menu_item_call label="Zgłoś problem" name="Report Bug"/>

View File

@ -41,11 +41,14 @@
</layout_panel>
</layout_stack>
<layout_stack name="button_row_ls">
<layout_panel name="btn_activate_lp">
<button label="Aktywuj" name="btn_activate" />
</layout_panel>
<layout_panel name="btn_chat_lp">
<button label="Czat" name="btn_chat"/>
</layout_panel>
<layout_panel name="call_btn_lp">
<button label="Konferencja głosowa" name="btn_call" tool_tip="Rozpocznij konferencję głosową w tej grupie"/>
<button label="Konf. głosowa" name="btn_call" tool_tip="Rozpocznij konferencję głosową w tej grupie"/>
</layout_panel>
<layout_panel name="btn_apply_lp">
<button label="Zapisz" label_selected="Zapisz" name="btn_apply"/>

View File

@ -45,72 +45,72 @@
<text name="title" value="Profil obiektu"/>
<text name="where" value="(W świecie)"/>
<scroll_container name="item_profile_scroll">
<panel name="properties_panel">
<text name="Name:">
Nazwa:
</text>
<line_editor name="Object Name" tool_tip="Nazwa jest ograniczona do 63 znaków. Dłuższe nazwy prim są skracane. Nazwy mogą składać się tylko z widocznych znaków znajdujących się w zestawie ASCII-7 (bez rozszerzenia), z wyjątkiem pionowej kreski &apos;|&apos;." />
<text name="Description:">
Opis:
</text>
<line_editor name="Object Description" tool_tip="Kiedy ludzie mają &apos;Pokaż chmurki pomocy na wszystkich obiektach&apos; włączone w ustawieniach przeglądarki, to zobaczą wyskakujący opis obiektu dla dowolnego obiektu pod ich wskaźnikiem myszy. Opis primy jest ograniczony do 127 bajtów, ciąg znaków dłuższy niż ten limit zostanie obcięty." />
<text name="CreatorNameLabel">
Twórca:
</text>
<text name="Owner:">
Właściciel:
</text>
<text name="Group_label">
Grupa:
</text>
<button name="button set group" tool_tip="Wybierz grupę by udostępnić jej prawa do tego obiektu"/>
<name_box initial_value="Ładowanie..." name="Group Name Proxy"/>
<button label="Przypisz" label_selected="Przypisz" name="button deed" tool_tip="Opcja przypisania udostępnia obiektowi takie same prawa jak zostały zaznaczone dla następnego właściciela. Obiekty udostępnione grupie mogą zostać przypisane dla grupy przez oficera grupy."/>
<text name="label click action">
Po kliku:
</text>
<combo_box name="clickaction" tool_tip="Akcja po kliku umożliwia interakcję z obiektem jednym kliknięciem lewym przyciskiem myszy. Każda akcja ma specjalny kursor wskazujący, co robi. Niektóre działania związane z klikaniem mają pewne wymagania, aby zaczęły działać. Na przykład Dotknij i Zapłać wymagają skryptów.">
<combo_box.item label="Dotknij (domyślne)" name="Touch/grab(default)"/>
<combo_box.item label="Usiądź na obiekcie" name="Sitonobject"/>
<combo_box.item label="Kup obiekt" name="Buyobject"/>
<combo_box.item label="Zapłać obiektowi" name="Payobject"/>
<combo_box.item label="Otwórz" name="Open"/>
<combo_box.item label="Przybliż" name="Zoom"/>
<combo_box.item label="Brak" name="None"/>
<combo_box.item label="Ignoruj obiekt" name="Ignoreobject" />
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">
Możesz modyfikować ten obiekt
<panel name="properties_panel">
<text name="Name:">
Nazwa:
</text>
<text name="Anyone can:">
Każdy:
<line_editor name="Object Name" tool_tip="Nazwa jest ograniczona do 63 znaków. Dłuższe nazwy prim są skracane. Nazwy mogą składać się tylko z widocznych znaków znajdujących się w zestawie ASCII-7 (bez rozszerzenia), z wyjątkiem pionowej kreski &apos;|&apos;." />
<text name="Description:">
Opis:
</text>
<check_box label="Kopiowanie" name="checkbox allow everyone copy" tool_tip="Każdy może wziąć kopię obiektu. Obiekt i cała jego zawartość muszą być kopiowalne i transferowalne." />
<check_box label="Przesuwanie" name="checkbox allow everyone move" tool_tip="Każdy może przesuwać obiekt." />
<text name="GroupLabel">
<line_editor name="Object Description" tool_tip="Kiedy ludzie mają &apos;Pokaż chmurki pomocy na wszystkich obiektach&apos; włączone w ustawieniach przeglądarki, to zobaczą wyskakujący opis obiektu dla dowolnego obiektu pod ich wskaźnikiem myszy. Opis primy jest ograniczony do 127 bajtów, ciąg znaków dłuższy niż ten limit zostanie obcięty." />
<text name="CreatorNameLabel">
Twórca:
</text>
<text name="Owner:">
Właściciel:
</text>
<text name="Group_label">
Grupa:
</text>
<check_box label="Udostępnij" name="checkbox share with group" tool_tip="Pozwól wszystkim osobom z ustawionej grupy na dzielenie prawa do modyfikacji dla tego obiektu. Musisz przypisać obiekt grupie aby aktywować ograniczenia wynikające z funkcji."/>
<text name="NextOwnerLabel">
Nast. właściciel:
<button name="button set group" tool_tip="Wybierz grupę by udostępnić jej prawa do tego obiektu"/>
<name_box initial_value="Ładowanie..." name="Group Name Proxy"/>
<button label="Przypisz" label_selected="Przypisz" name="button deed" tool_tip="Opcja przypisania udostępnia obiektowi takie same prawa jak zostały zaznaczone dla następnego właściciela. Obiekty udostępnione grupie mogą zostać przypisane dla grupy przez oficera grupy."/>
<text name="label click action">
Po kliku:
</text>
<combo_box name="clickaction" tool_tip="Akcja po kliku umożliwia interakcję z obiektem jednym kliknięciem lewym przyciskiem myszy. Każda akcja ma specjalny kursor wskazujący, co robi. Niektóre działania związane z klikaniem mają pewne wymagania, aby zaczęły działać. Na przykład Dotknij i Zapłać wymagają skryptów.">
<combo_box.item label="Dotknij (domyślne)" name="Touch/grab(default)"/>
<combo_box.item label="Usiądź na obiekcie" name="Sitonobject"/>
<combo_box.item label="Kup obiekt" name="Buyobject"/>
<combo_box.item label="Zapłać obiektowi" name="Payobject"/>
<combo_box.item label="Otwórz" name="Open"/>
<combo_box.item label="Przybliż" name="Zoom"/>
<combo_box.item label="Brak" name="None"/>
<combo_box.item label="Ignoruj obiekt" name="Ignoreobject" />
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">
Możesz modyfikować ten obiekt
</text>
<text name="Anyone can:">
Każdy:
</text>
<check_box label="Kopiowanie" name="checkbox allow everyone copy" tool_tip="Każdy może wziąć kopię obiektu. Obiekt i cała jego zawartość muszą być kopiowalne i transferowalne." />
<check_box label="Przesuwanie" name="checkbox allow everyone move" tool_tip="Każdy może przesuwać obiekt." />
<text name="GroupLabel">
Grupa:
</text>
<check_box label="Udostępnij" name="checkbox share with group" tool_tip="Pozwól wszystkim osobom z ustawionej grupy na dzielenie prawa do modyfikacji dla tego obiektu. Musisz przypisać obiekt grupie aby aktywować ograniczenia wynikające z funkcji."/>
<text name="NextOwnerLabel">
Nast. właściciel:
</text>
<check_box label="Modyfikacja" name="checkbox next owner can modify" tool_tip="Następny właściciel może edytować właściwości, takie jak nazwa lub rozmiar tego obiektu." />
<check_box label="Kopiowanie" name="checkbox next owner can copy" tool_tip="Następny właściciel może wykonać nieograniczoną liczbę kopii tego obiektu. Kopie przechowują informacje o twórcy i nigdy nie mogą mieć większych zezwoleń niż kopiowany element." />
<check_box label="Transferowanie" name="checkbox next owner can transfer" tool_tip="Następny właściciel może sprzedać lub oddać ten obiekt." />
</panel>
<check_box label="Na sprzedaż" name="checkbox for sale" tool_tip="Pozwala ludziom kupować ten obiekt, jego zawartość lub kopię w świecie za określoną cenę." />
<combo_box name="sale type" tool_tip="Wybierz, czy kupujący otrzyma kopię przedmiotu, kopię samej zawartości przedmiotu lub oryginalny przedmiot w ogóle.">
<combo_box.item label="Kopia" name="Copy"/>
<combo_box.item label="Zawartość" name="Contents"/>
<combo_box.item label="Oryginał" name="Original"/>
</combo_box>
<spinner label="Cena: L$" name="Edit Cost" tool_tip="Koszt obiektu." />
<check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="Udostępnij widzialność tego obiektu w wyszukiwarce"/>
<text name="pathfinding_attributes_label">
Atrybuty odnajd. ścieżek:
</text>
<check_box label="Modyfikacja" name="checkbox next owner can modify" tool_tip="Następny właściciel może edytować właściwości, takie jak nazwa lub rozmiar tego obiektu." />
<check_box label="Kopiowanie" name="checkbox next owner can copy" tool_tip="Następny właściciel może wykonać nieograniczoną liczbę kopii tego obiektu. Kopie przechowują informacje o twórcy i nigdy nie mogą mieć większych zezwoleń niż kopiowany element." />
<check_box label="Transferowanie" name="checkbox next owner can transfer" tool_tip="Następny właściciel może sprzedać lub oddać ten obiekt." />
</panel>
<check_box label="Na sprzedaż" name="checkbox for sale" tool_tip="Pozwala ludziom kupować ten obiekt, jego zawartość lub kopię w świecie za określoną cenę." />
<combo_box name="sale type" tool_tip="Wybierz, czy kupujący otrzyma kopię przedmiotu, kopię samej zawartości przedmiotu lub oryginalny przedmiot w ogóle.">
<combo_box.item label="Kopia" name="Copy"/>
<combo_box.item label="Zawartość" name="Contents"/>
<combo_box.item label="Oryginał" name="Original"/>
</combo_box>
<spinner label="Cena: L$" name="Edit Cost" tool_tip="Koszt obiektu." />
<check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="Udostępnij widzialność tego obiektu w wyszukiwarce"/>
<text name="pathfinding_attributes_label">
Atrybuty odnajd. ścieżek:
</text>
</panel>
</scroll_container>
<layout_stack name="buttons_ls">
<layout_panel name="open_btn_panel">

View File

@ -2,5 +2,6 @@
<floater name="emojipicker" title="Выберите эмодзи">
<floater.string name="title_for_recently_used" value="Недавно использованный"/>
<floater.string name="title_for_frequently_used" value="Часто используемый"/>
<floater.string name="text_no_emoji_for_filter" value="Не найдено эмодзи для '[FILTER]'"/>
<text name="Dummy">Эмодзи не выбраны</text>
</floater>

View File

@ -11,7 +11,7 @@
<button label="Назад" name="back"/>
<button label="Вперед" name="forward"/>
<button label="Обновить" name="reload"/>
<button label="Перейти" name="go"/>
<button label="Зайти" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
<button label="назад" name="rewind"/>
@ -19,11 +19,18 @@
<button label="вперед" name="seek"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
<button label="Отправить текущую страницу на участок" name="assign"/>
<button label="Отправить страницу на участок" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
<text name="plugin_fail_text">
Похоже, что плагин для веб-браузера открывается не сразу.
Если плагин не загружается, пожалуйста, посетите сайт:
https://wiki.firestormviewer.org/fs_media
для информации о возможных действиях по устранению этой проблемы.
</text>
<button label="Открыть в моем браузере" name="open_browser"/>
<check_box label="Всегда открывать в моем браузере" name="open_always"/>
<button label="Закрыть" name="close"/>
</layout_panel>
</layout_stack>

View File

@ -69,16 +69,16 @@
</panel>
<panel name="P_R_Res">
<text name="T_R_Res" tool_tip="Определяет разрешение/качество отражений воды. Если для параметров разрешения установлено значение «Очень хорошо» или выше, вы также должны включить «Расширенная модель освещения» на вкладке «Свет».">
<text name="T_R_Res" tool_tip="Определяет разрешение/качество отражений воды.">
Разрешение
</text>
<combo_box name="ReflectionRescombo">
<combo_box.item name="0" label="Приемлемо"/>
<combo_box.item name="1" label="Хорошо"/>
<combo_box.item name="2" label="Очень хорошо - Нужно включить «Расширенная модель освещения» (вкладка «Свет»)"/>
<combo_box.item name="3" label="Отлично - Нужно включить «Расширенная модель освещения» (вкладка «Свет»)"/>
<combo_box.item name="4" label="Выдающееся - Нужно включить «Расширенная модель освещения» (вкладка «Свет»)"/>
<combo_box.item name="5" label="Как живое - Нужно включить «Расширенная модель освещения» (вкладка «Свет»)"/>
<combo_box.item name="2" label="Очень хорошо"/>
<combo_box.item name="3" label="Отлично"/>
<combo_box.item name="4" label="Выдающееся"/>
<combo_box.item name="5" label="Как живое"/>
</combo_box>
<check_box name="TransparentWater" label="Прозрачная Вода" tool_tip="Отображает воду прозрачной. Отключение делает воду непрозрачной с применением простой текстуры."/>
</panel>
@ -92,10 +92,6 @@
</panel>
<panel name="P_L_S_Settings">
<check_box name="RenderDeferred" label="Расширенная модель освещения"
tool_tip="Это позволит создать тени от Солнца и Луны, а также от внешних источников света. Это также позволит вам включить Глубину Резкости и другие графические функции. В основном вам нужно включить это, чтобы увидеть большую часть «вкусностей» в мире. Если вы не можете включить эту функцию или увидеть ее эффект, сначала убедитесь, что Атмосферные шейдеры включены на вкладке «Окр.среда»."/>
<check_box name="LocalLights" label="Включить все локальное освещение"
tool_tip="Это включит все огни в мире. Если вы отключите эту функцию, свет от Солнца/Луны по-прежнему будет отображаться. Полезно, если вы хотите устранить освещение SIM-карты и использовать только свет Солнца/Луны."/>
<check_box name="Render Attached Lights" label="Включить прикрепленные огни (Face Lights)"
tool_tip="Это позволит включить любые огни, такие как подсветка аватара. Полезно для отключения фонарей при необходимости."/>
</panel>

View File

@ -62,12 +62,13 @@
<radio_item label="Старт" name="start"/>
<radio_item label="Стоп" name="stop"/>
</radio_group>
<check_box label="до завершения анимации" name="wait_anim_check"/>
<check_box label="время в секундах:" name="wait_time_check"/>
<check_box label="пока нажата кнопка" name="wait_key_release_check" />
<check_box label="до конца анимации" name="wait_anim_check"/>
<check_box label="время, секунды:" name="wait_time_check"/>
<text name="help_label">
Все шаги выполняются одновременно, если только вы не добавите шаги ожидания.
</text>
<check_box label="Активный" name="active_check" tool_tip="Активные жесты можно включить путем ввода их триггеров в чат или нажатием горячих клавиш. Жесты обычно становятся неактивными, если возникает конфликт клавиш."/>
<button label="Предварительный просмотр" name="preview_btn"/>
<button label="Просмотр" name="preview_btn"/>
<button label="Сохранить" name="save_btn"/>
</floater>

View File

@ -0,0 +1,17 @@
<floater name="whitelist_floater" title="Папки и двоичные файлы Белого списка">
<text name="whitelist_intro">
Антивирус и защита от вредоносных программ являются неотъемлемой частью безопасного использования Интернета, но они могут вызвать целый ряд проблем у пользователя.
Чтобы уменьшить помехи и повысить стабильность и производительность, мы настоятельно рекомендуем всем пользователям убедиться в наличии исключений (известных как Белый список) для важных папок и программ, которые использует программа просмотра.
Для получения более подробной информации посетите веб-сайт
https://wiki.firestormviewer.org/antivirus_whitelisting
</text>
<text name="whitelist_folder_instruction">
Чтобы упростить задачу, в поле ниже указаны папки, которые использует программа просмотра.
Пожалуйста добавьте их в список исключений антивируса для папок, как показано на вики-странице выше.
</text>
<text name="whitelist_exe_instruction">
В следующем поле указаны название и полный путь к исполняемым файлам программы просмотра.
Добавьте их в список исключений антивируса для файлов, как показано на вики-странице выше.
</text>
</floater>

View File

@ -18,6 +18,7 @@
<menu_item_call label="Очистить корзину" name="Empty Trash"/>
<menu_item_call label="Очистить 'Найденные вещи'" name="Empty Lost And Found"/>
<menu_item_call label="Новая папка" name="New Folder"/>
<menu_item_call label="Новая папка" name="New Listing Folder"/>
<menu_item_call label="Новый комплект одежды" name="New Outfit"/>
<menu_item_call label="Новый скрипт" name="New Script"/>
<menu_item_call label="Новая заметка" name="New Note"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Gear Outfit">
<menu_item_call label="Переодеться" name="wear"/>
<menu_item_call label="Надеть" name="wear_add"/>
<menu_item_call label="Переодеться (заменить)" name="wear"/>
<menu_item_call label="Надеть (добавить)" name="wear_add"/>
<menu_item_call label="Снять" name="take_off"/>
<menu_item_call label="Изображение" name="thumbnail"/>
<menu_item_call label="Переименовать костюм" name="rename"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Outfit">
<menu_item_call label="Переодеться" name="wear_replace"/>
<menu_item_call label="Надеть" name="wear_add"/>
<menu_item_call label="Переодеться (заменить)" name="wear_replace"/>
<menu_item_call label="Надеть (добавить)" name="wear_add"/>
<menu_item_call label="Снять" name="take_off"/>
<menu_item_call label="Изменить костюм" name="edit"/>
<menu_item_call label="Изображение..." name="thumbnail"/>

View File

@ -37,7 +37,7 @@
</menu>
<menu_item_call label="Выберите аватар" name="Avatar Picker"/>
<menu_item_call label="Удалить выбранные присоединения" name="Remove Selected Attachments"/>
<menu_item_call label="Высота смещения" name="HoverHeight"/>
<menu label="Движение" name="Movement">
<menu_item_call label="Встать" name="Stand up"/>
@ -334,6 +334,7 @@
<menu_item_call label="Support portal" name="Support portal"/>
<menu_item_call label="[SECOND_LIFE] News" name="Second Life News"/>
<menu_item_call label="[SECOND_LIFE] Blogs" name="Second Life Blogs"/> -->
<menu_item_call name="whitelist_folders" label="Советник Белого Списка"/>
<menu_item_call label="Проверка статуса сети (Grid Status)" name="Grid Status"/>
<menu_item_call label="Пожаловаться" name="Report Abuse"/>
<menu_item_call label="Сообщить об ошибке" name="Report Bug"/>

View File

@ -118,6 +118,11 @@
Не удалось активировать эту папку версии, ошибка:
&quot;[ERROR_CODE]&quot;
</notification>
<notification name="InvalidKeystroke">
Было введено неверное нажатие клавиши.
[REASON].
Пожалуйста, введите правильный текст.
</notification>
<notification name="MerchantForceValidateListing">
Для того, чтобы создать свой список, мы исправили иерархию вашего списка содержимого.
@ -1749,18 +1754,18 @@
<usetemplate ignoretext="Подтверждать перед возвратом объектов владельцам" name="okcancelignore" notext="Отмена" yestext="Да"/>
</notification>
<notification name="GroupLeaveConfirmMember">
В настоящее время вы состоите в группе &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Хотите выйти из группы?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
Покинуть группу &apos;&lt;nolink&gt;[GROUP]&lt;/nolink&gt;&apos;?
В настоящее время плата за вступление в эту группу L$[COST].
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="Покинуть"/>
</notification>
<notification name="GroupLeaveConfirmMemberNoFee">
Покинуть группу &apos;&lt;nolink&gt;[GROUP]&lt;/nolink&gt;&apos;?
В настоящее время плата за вступление в эту группу не взимается.
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="Покинуть"/>
</notification>
<notification name="GroupDepart">
Вы покинули группу «[group_name]».
</notification>
<notification name="GroupLeaveConfirmMemberWithFee">
Вы в настоящее время являетесь участником группы &lt;nolink&gt;[GROUP]&lt;/nolink&gt;. Присоединение снова будет стоить L$[AMOUNT].
Покинуть группу?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="Да"/>
</notification>
<notification name="OwnerCannotLeaveGroup">
Невозможно выйти из группы. Вы не можете покинуть группу, потому что вы единственый владелец группы. Пожалуйста, назначить сначала назначьте на данную роль другого пользователя.
</notification>
@ -2457,6 +2462,19 @@
Вы уверены, что хотите удалить их?
<usetemplate ignoretext="Подтвердить удаление отфильтрованных элементов" name="okcancelignore" notext="Отмена" yestext="Да"/>
</notification>
<notification name="DeleteWornItems">
Предмет(ы) которые вы хотите удалить надеты на ваш аватар.
Удалить эти элементы со своего аватара?
<usetemplate name="okcancelbuttons" notext="Отмена" yestext="Снять и удалить предмет(ы)"/>
</notification>
<notification name="CantDeleteRequiredClothing">
Предмет(ы), которые вы хотите удалить, относятся к обязательным слоям одежды (кожа, фигура, волосы, глаза).
Вы должны заменить эти слои, прежде чем удалять их.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="DeleteThumbnail">
Удалить изображение этого товара? Отмена невозможна.
<usetemplate ignoretext="Подтвердите перед удалением миниатюры." name="okcancelignore" notext="Отмена" yestext="Удалить"/>

View File

@ -9,9 +9,10 @@
<panel.string name="group_join_btn">
Присоединиться (L$[AMOUNT])
</panel.string>
<panel.string name="group_join_free">
Бесплатно
</panel.string>
<panel.string name="group_join_free">Бесплатно</panel.string>
<panel.string name="group_member">Член</panel.string>
<panel.string name="join_txt">Вступить</panel.string>
<panel.string name="leave_txt">Покинуть</panel.string>
<layout_stack name="group_info_sidetray_main">
<layout_panel name="header_container">

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="group_list_item">
<text name="group_name" value="Неизвестно"/>
<button name="notices_btn" tool_tip="Групповые уведомления"/>
<button name="info_btn" tool_tip="Дополнительная информация"/>
<button name="profile_btn" tool_tip="Просмотреть профиль"/>
</panel>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="group_list_item">
<text name="group_name" value="Неизвестно"/>
<button name="notices_btn" tool_tip="Групповые уведомления"/>
<button name="visibility_hide_btn" tool_tip="Скрыть группу в моем профиле"/>
<button name="visibility_show_btn" tool_tip="Показывать группу в моем профиле"/>
<button name="info_btn" tool_tip="Больше информации"/>

View File

@ -68,6 +68,7 @@
</layout_panel>
</layout_stack>
<check_box name="show_in_search" label="Показать в поиске" tool_tip="Позволить людям видеть вас в результатах поиска"/>
<check_box name="hide_sl_age" label="Показать полную дату рождения" tool_tip="Позволить людям видеть ваш возраст в СЛ"/>
<button name="save_description_changes" label="Сохранить"/>
<button name="discard_description_changes" label="Отказаться"/>
</panel>

View File

@ -83,8 +83,8 @@
<combo_box.item label="Заплатить за объект" name="Payobject"/>
<combo_box.item label="Открыть" name="Open"/>
<combo_box.item label="Приблизить" name="Zoom"/>
<combo_box.item label="Игнорировать объект" name="Ignoreobject"/>
<combo_box.item label="Нет" name="None"/>
<combo_box.item label="Игнорировать объект" name="Ignoreobject"/>
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">

View File

@ -1444,6 +1444,20 @@ https://www.firestormviewer.org/support за помощь в решении эт
<string name="executable_files">
Исполняемые файлы программы
</string>
<string name="Validator_InvalidNumericString">Недопустимая числовая строка: "[STR]"</string>
<string name="Validator_ShouldNotBeMinus">Недопустимый начальный символ: '[CH]' (не должно быть минусом)</string>
<string name="Validator_ShouldNotBeMinusOrZero">Недопустимый начальный символ: '[CH]' (не должно быть ни минуса, ни нуля)</string>
<string name="Validator_ShouldBeDigit">Недопустимый символ [NR]: '[CH]' (должна быть только цифра)</string>
<string name="Validator_ShouldBeDigitOrDot">Недопустимый символ [NR]: '[CH]' (должна быть только цифра или десятичная точка)</string>
<string name="Validator_ShouldBeDigitOrAlpha">Недопустимый символ [NR]: '[CH]' (должна быть только цифра или буквенно-цифровой символ ASCII)</string>
<string name="Validator_ShouldBeDigitOrAlphaOrSpace">Недопустимый символ [NR]: '[CH]' (должна быть только цифра или буквенно-цифровой символ ASCII или пробел)</string>
<string name="Validator_ShouldBeDigitOrAlphaOrPunct">Недопустимый символ [NR]: '[CH]' (должна быть только цифра или буквенно-цифровой символ ASCII или пунктуация)</string>
<string name="Validator_ShouldBeDigitOrAlphaOrPunctNotSpace">Недопустимый символ [NR]: '[CH]' (должна быть только цифра или буквенно-цифровой символ ASCII или пунктуация без пробела)</string>
<string name="Validator_ShouldBeDigitNotSpace">Недопустимый символ [NR]: '[CH]' (должна быть только цифра без пробела)</string>
<string name="Validator_ShouldBeASCII">Недопустимый символ [NR]: '[CH]' (должен быть только символ ASCII)</string>
<string name="Validator_ShouldBeNewLineOrASCII">Недопустимый символ [NR]: '[CH]' (должен быть только символ ASCII или новая строка)</string>
<string name="LSLTipSleepTime">
Пауза скрипта на [SLEEP_TIME] секунд.
</string>
@ -5297,9 +5311,12 @@ https://www.firestormviewer.org/support за помощь в решении эт
<string name="dance8">
танец8
</string>
<string name="AvatarBirthDateFormat">
<string name="AvatarBirthDateFormatFull">
[day,datetime,utc].[mthnum,datetime,utc].[year,datetime,utc]
</string>
<string name="AvatarBirthDateFormatShort">
[day,datetime,utc].[mthnum,datetime,utc]
</string>
<string name="AvatarBirthDateFormat_legacy">
[day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt]
</string>
@ -5417,7 +5434,8 @@ https://www.firestormviewer.org/support за помощь в решении эт
Для этого комплекта одежды нет вещей
</string>
<string name="ExternalEditorNotSet">
Выберите редактор, используя параметр ExternalEditor.
Выберите редактор, установив переменную среды LL_SCRIPT_EDITOR или параметр Внешнего Редактора.
смотрите https://wiki.secondlife.com/wiki/LSL_Alternate_Editors
</string>
<string name="ExternalEditorNotFound">
Не удается найти указанный внешний редактор.
@ -6580,6 +6598,9 @@ ID объекта: [INSPECTING_KEY]
<string name="avatar_age_alert">
сработало возрастное предупреждение. Возраст: [AGE] дней
</string>
<string name="avatar_age_not_available">
н.д.
</string>
<string name="TotalScriptCountChangeIncrease">
Количество скриптов в регионе возросло с [OLD_VALUE] до [NEW_VALUE] ([DIFFERENCE]).
</string>

View File

@ -22,10 +22,10 @@ background_visible="false"
name="group_join_btn">
Join (L$[AMOUNT])
</panel.string>
<panel.string
name="group_join_free">
Free
</panel.string>
<panel.string name="group_join_free">Free</panel.string>
<panel.string name="group_member">Member</panel.string>
<panel.string name="join_txt">Join</panel.string>
<panel.string name="leave_txt">Leave</panel.string>
<layout_stack
name="group_info_sidetray_main"
@ -219,6 +219,26 @@ background_visible="false"
width="23" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
user_resize="false"
auto_resize="true"
width="72">
<button
layout="topleft"
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="71" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -227,7 +247,7 @@ background_visible="false"
name="btn_chat_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
layout="topleft"
follows="bottom|left|right"
@ -236,7 +256,7 @@ background_visible="false"
left="1"
height="23"
top="0"
width="96" />
width="71" />
</layout_panel>
<layout_panel
@ -247,7 +267,7 @@ background_visible="false"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
follows="bottom|left|right"
left="1"
@ -257,7 +277,7 @@ background_visible="false"
layout="topleft"
tool_tip="Call this group"
top="0"
width="96" />
width="71" />
</layout_panel>
<layout_panel
@ -268,7 +288,7 @@ background_visible="false"
name="btn_apply_lp"
user_resize="false"
auto_resize="true"
width="97">
width="72">
<button
follows="bottom|left|right"
height="23"
@ -277,7 +297,7 @@ background_visible="false"
name="btn_apply"
left="1"
top="0"
width="96" />
width="71" />
</layout_panel>
</layout_stack>

View File

@ -22,10 +22,10 @@ background_visible="true"
name="group_join_btn">
Join (L$[AMOUNT])
</panel.string>
<panel.string
name="group_join_free">
Free
</panel.string>
<panel.string name="group_join_free">Free</panel.string>
<panel.string name="group_member">Member</panel.string>
<panel.string name="join_txt">Join</panel.string>
<panel.string name="leave_txt">Leave</panel.string>
<layout_stack
name="group_info_sidetray_main"
@ -209,6 +209,25 @@ background_visible="true"
orientation="horizontal"
top_delta="2"
width="445">
<layout_panel
follows="bottom|left|right"
height="23"
layout="bottomleft"
left_pad="3"
name="btn_activate_lp"
user_resize="false"
auto_resize="true"
width="67">
<button
follows="bottom|left|right"
label="Activate"
name="btn_activate"
left="1"
height="23"
top="0"
width="66" />
</layout_panel>
<layout_panel
follows="bottom|left|right"
height="23"
@ -217,7 +236,7 @@ background_visible="true"
name="btn_chat_lp"
user_resize="false"
auto_resize="true"
width="91">
width="67">
<button
follows="bottom|left|right"
label="Chat"
@ -225,7 +244,7 @@ background_visible="true"
left="1"
height="23"
top="0"
width="90" />
width="66" />
</layout_panel>
<layout_panel
@ -236,7 +255,7 @@ background_visible="true"
name="call_btn_lp"
user_resize="false"
auto_resize="true"
width="91">
width="77">
<button
follows="bottom|left|right"
left="1"
@ -246,7 +265,7 @@ background_visible="true"
layout="topleft"
tool_tip="Call this group"
top="0"
width="90" />
width="76" />
</layout_panel>
<layout_panel
@ -257,7 +276,7 @@ background_visible="true"
name="btn_apply_lp"
user_resize="false"
auto_resize="true"
width="91">
width="57">
<button
follows="bottom|left|right"
height="23"
@ -266,7 +285,7 @@ background_visible="true"
name="btn_apply"
left="1"
top="0"
width="90" />
width="56" />
</layout_panel>
</layout_stack>

Some files were not shown because too many files have changed in this diff Show More