Ansariel 2022-05-05 10:43:31 +02:00
commit a4d60d06ec
10192 changed files with 5241 additions and 67646 deletions

View File

@ -3,6 +3,36 @@
<map>
<key>installables</key>
<map>
<key>SDL2</key>
<map>
<key>copyright</key>
<string>Copyright (C) 1997-2022 Sam Lantinga</string>
<key>description</key>
<string>Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.</string>
<key>license</key>
<string>zlib</string>
<key>license_file</key>
<string>LICENSES/SDL.txt</string>
<key>name</key>
<string>SDL2</string>
<key>platforms</key>
<map>
<key>linux64</key>
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>f332d752a72cb524eb5db8ee6fdba3da</string>
<key>url</key>
<string>http://3p.firestormviewer.org/SDL2-2.0.20-linux64_bionic-221151857.tar.bz2</string>
</map>
<key>name</key>
<string>linux64</string>
</map>
</map>
<key>version</key>
<string>1.2.15</string>
</map>
<key>gstreamer10</key>
<map>
<key>copyright</key>

View File

@ -115,28 +115,28 @@ else (USESYSTEMLIBS)
elseif (DARWIN)
set(BOOST_CONTEXT_LIBRARY
optimized boost_context-mt${addrsfx}
debug boost_context-mt${addrsfx}-d)
debug boost_context-mt${addrsfx})
set(BOOST_FIBER_LIBRARY
optimized boost_fiber-mt${addrsfx}
debug boost_fiber-mt${addrsfx}-d)
debug boost_fiber-mt${addrsfx})
set(BOOST_FILESYSTEM_LIBRARY
optimized boost_filesystem-mt${addrsfx}
debug boost_filesystem-mt${addrsfx}-d)
debug boost_filesystem-mt${addrsfx})
set(BOOST_PROGRAM_OPTIONS_LIBRARY
optimized boost_program_options-mt${addrsfx}
debug boost_program_options-mt${addrsfx}-d)
debug boost_program_options-mt${addrsfx})
set(BOOST_REGEX_LIBRARY
optimized boost_regex-mt${addrsfx}
debug boost_regex-mt${addrsfx}-d)
debug boost_regex-mt${addrsfx})
set(BOOST_SIGNALS_LIBRARY
optimized boost_signals-mt${addrsfx}
debug boost_signals-mt${addrsfx}-d)
debug boost_signals-mt${addrsfx})
set(BOOST_SYSTEM_LIBRARY
optimized boost_system-mt${addrsfx}
debug boost_system-mt${addrsfx}-d)
debug boost_system-mt${addrsfx})
set(BOOST_THREAD_LIBRARY
optimized boost_thread-mt${addrsfx}
debug boost_thread-mt${addrsfx}-d)
debug boost_thread-mt${addrsfx})
set(BOOST_WAVE_LIBRARY
optimized boost_wave-mt${addrsfx}
debug boost_wave-mt${addrsfx}-gd)

View File

@ -15,9 +15,16 @@ if (USESYSTEMLIBS)
)
else (USESYSTEMLIBS)
if (LINUX)
use_prebuilt_binary(SDL)
set (SDL_FOUND TRUE)
set (SDL_LIBRARY SDL directfb fusion direct X11)
if( NOT USE_SDL2 )
use_prebuilt_binary(SDL)
set (SDL_FOUND TRUE)
set (SDL_LIBRARY SDL directfb fusion direct X11)
else()
use_prebuilt_binary(SDL2)
set (SDL2_FOUND TRUE)
set (SDL_LIBRARY SDL2 SDL2_mixer X11)
endif()
endif (LINUX)
endif (USESYSTEMLIBS)

View File

@ -61,7 +61,7 @@ else (USESYSTEMLIBS)
set(UI_LIBRARIES ${UI_LIBRARIES} ${UI_LIB_${libname}})
endforeach(libname)
set(UI_LIBRARIES ${UI_LIBRARIES} Xinerama)
set(UI_LIBRARIES ${UI_LIBRARIES} Xinerama X11)
include_directories ( ${GLIB_INCLUDE_DIRS} )
endif (LINUX)

View File

@ -10,6 +10,7 @@ include(LLCommon)
include(LLMath)
include(LLMessage)
include(LLFileSystem)
include(LLWindow)
include_directories( SYSTEM
${LLAUDIO_INCLUDE_DIRS}
@ -75,6 +76,11 @@ if (OPENAL)
)
endif (OPENAL)
if(SDL2_FOUND)
list(APPEND llaudio_SOURCE_FILES llaudioengine_sdl2.cpp )
list(APPEND llaudio_HEADER_FILES llaudioengine_sdl2.h )
endif()
set_source_files_properties(${llaudio_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)

View File

@ -0,0 +1,489 @@
#include "llaudioengine_sdl2.h"
#include "llstreamingaudio.h"
#include "lllistener.h"
#include "SDL2/SDL_mixer.h"
#include "curl/curl.h"
namespace
{
std::string getMixerError()
{
auto pError = Mix_GetError();
if(!pError)
return "Mix_Error: returned nullptr";
return std::string{ "Mix_error: " } + pError;
}
}
struct RWData
{
std::string mURL;
CURLM *mMulti{ nullptr };
CURL *mEasy{ nullptr };
};
Sint64 SDLCALL stream_size (struct SDL_RWops * context)
{
return -1;
}
Sint64(SDLCALL stream_seek) (struct SDL_RWops * context, Sint64 offset,
int whence)
{
if( !context )
return -1;
RWData *pData = reinterpret_cast<RWData*>(context->hidden.unknown.data1);
return -1;
}
size_t SDLCALL stream_read (struct SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
{
if( !context )
return 0;
RWData *pData = reinterpret_cast<RWData*>(context->hidden.unknown.data1);
return 0;
}
size_t SDLCALL stream_write (struct SDL_RWops * context, const void *ptr,
size_t size, size_t num)
{
if( !context )
return 0;
RWData *pData = reinterpret_cast<RWData*>(context->hidden.unknown.data1);
return 0;
}
int SDLCALL stream_close (struct SDL_RWops * context)
{
if( !context )
return 0;
RWData *pData = reinterpret_cast<RWData*>(context->hidden.unknown.data1);
// Free curl multi and easy
return 0;
}
class LLListenerSDL2: public LLListener
{
LLAudioEngineSDL2 *mEngine;
public:
LLListenerSDL2(LLAudioEngineSDL2 *aEngine )
: mEngine( aEngine )
{
}
};
class LLStreamingAudioSDL2: public LLStreamingAudioInterface
{
std::string mURL;
F32 mVolume { 1.0 };
Mix_Music *mMusic{nullptr};
SDL_RWops *mReader{ nullptr };
RWData *mData;
public:
void start(const std::string& url) override
{
mURL = url;
//mMusic = Mix_LoadMUS( url.c_str() );
mReader = SDL_AllocRW();
mData = new RWData{};
mReader->hidden.unknown.data1 = mData;
mReader->size = stream_size;
mReader->seek = stream_seek;
mReader->read = stream_read;
mReader->write = stream_write;
mReader->close = stream_close;
mMusic = Mix_LoadMUS_RW( mReader, 0 );
if( mMusic )
{
auto x = Mix_PlayMusic( mMusic, 0 );
LL_WARNS() << "SDL2: " << getMixerError() << " " << x << LL_ENDL;
}
else
{
LL_WARNS() << "SDL2: MixLoadMUS failed: " << getMixerError() << LL_ENDL;
}
}
void stop() override
{
}
void pause(int pause) override
{
}
void update() override
{
}
int isPlaying() override
{
return mMusic != nullptr;
}
void setGain(F32 vol) override
{
mVolume = vol;
}
F32 getGain() override
{
return mVolume;
}
std::string getURL() override
{
return mURL;
}
bool supportsAdjustableBufferSizes() override
{
return false;
}
void setBufferSizes(U32 streambuffertime, U32 decodebuffertime) override
{
}
};
class LLAudioBufferSDL2: public LLAudioBuffer
{
public:
Mix_Chunk *mChunk;
~LLAudioBufferSDL2()
{
if( mChunk )
Mix_FreeChunk(mChunk);
}
bool loadWAV(const std::string& filename)
{
mChunk = Mix_LoadWAV( filename.c_str() );
return mChunk != nullptr;
}
U32 getLength()
{
return 0; // Not needed here
}
};
class LLAudioChannelSDL2: public LLAudioChannel
{
S32 mChannel;
LLAudioEngineSDL2 *mEngine;
bool mPlayback{false};
uint32_t caclulateVolume()
{
if( mChannel < 0 || !mCurrentSourcep || !mEngine)
return 0.0f;
F32 gain = mCurrentSourcep->getGain() * getSecondaryGain() * mEngine->getMasterGain();
llclamp(gain, 0.0f, 1.f );
gain *= 255.f;
return static_cast<uint32_t>(gain);
}
public:
LLAudioChannelSDL2( S32 nChannel, LLAudioEngineSDL2 *aEngine )
: mChannel( nChannel )
, mEngine( aEngine )
{
}
~LLAudioChannelSDL2()
{
mEngine->deleteChannel( mChannel );
}
void play() override
{
startPlayback();
}
void startPlayback()
{
if( mChannel < 0 )
return;
//if( mPlayback )
// return;
Mix_HaltChannel( mChannel );
LLAudioBufferSDL2* pBuffer = (LLAudioBufferSDL2*)mCurrentBufferp;
if( !pBuffer )
return;
mPlayback = true;
Mix_PlayChannel( mChannel, pBuffer->mChunk, mCurrentSourcep->isLoop()?-1:0 );
Mix_Volume( mChannel, caclulateVolume());
}
void playSynced(LLAudioChannel *channelp) override
{
play();
}
void cleanup() override
{
if( mChannel < 0 )
return;
mPlayback = false;
Mix_HaltChannel( mChannel );
}
bool isPlaying() override
{
if( mChannel < 0 )
return false;
if( !mPlayback )
return false;
bool bRet = Mix_Playing( mChannel ) == 1;
if( !bRet )
{
mPlayback = false;
Mix_HaltChannel( mChannel );
}
return bRet;
}
bool updateBuffer() override
{
if( !mCurrentSourcep || mChannel < 0)
return false;
if( LLAudioChannel::updateBuffer() )
{
if(mCurrentSourcep)
{
startPlayback();
return true;
}
}
else if( mCurrentSourcep )
{
if( mPlayback )
Mix_Volume( mChannel, caclulateVolume());
}
else
{
if( mPlayback )
Mix_HaltChannel(mChannel);
mPlayback = false;
}
return mCurrentSourcep != 0;
}
void update3DPosition() override
{
if(!mCurrentSourcep || mChannel < 0)
return;
if(mPlayback)
{
auto pos = mEngine->getListenerPos();
LLVector3 soundpos{mCurrentSourcep->getPositionGlobal()};
F32 dist = dist_vec(soundpos, pos);
dist = llclamp(dist, 0.0f, 255.0f);
Mix_SetPosition(mChannel, 0, (uint8_t) dist);
}
}
void updateLoop() override
{
}
};
struct LLAudioEngineSDL2::ImplData
{
std::vector< uint8_t > mChannels;
bool mReady { false };
};
LLAudioEngineSDL2::LLAudioEngineSDL2()
{
}
LLAudioEngineSDL2::~LLAudioEngineSDL2()
{
}
bool LLAudioEngineSDL2::init(const S32 num_channels, void *userdata, const std::string &app_title)
{
LL_INFOS() << "Initializing SDL2 audio" << LL_ENDL;
mData = std::make_unique<ImplData>();
LLAudioEngine::init(num_channels, userdata, app_title);
int flags = MIX_INIT_FLAC | MIX_INIT_MP3 | MIX_INIT_MP3;
if( flags != Mix_Init( flags ) )
LL_WARNS() << "Mix_Init failed to intialize all formats: " << getMixerError () << LL_ENDL;
if( 0 != Mix_OpenAudio(44100, AUDIO_S16LSB, MIX_DEFAULT_CHANNELS, 1024 ) )
{
LL_WARNS() << "Mix_OpenAudio failed " << getMixerError() << LL_ENDL;
return false;
}
mData->mChannels.resize( num_channels+2 );
Mix_AllocateChannels( num_channels );
mData->mReady = true;
// Impl is stubbed out, but nothing more
// if (!getStreamingAudioImpl())
// setStreamingAudioImpl( new LLStreamingAudioSDL2() );
return true;
}
std::string LLAudioEngineSDL2::getDriverName(bool verbose)
{
return "SDL mixer";
}
void LLAudioEngineSDL2::shutdown()
{
Mix_CloseAudio();
Mix_Quit();
mData = nullptr;
}
void LLAudioEngineSDL2::updateWind(LLVector3 direction, F32 camera_height_above_water)
{
}
void LLAudioEngineSDL2::idle(F32 max_decode_time )
{
LLAudioEngine::idle(max_decode_time);
}
void LLAudioEngineSDL2::updateChannels()
{
LLAudioEngine::updateChannels();
}
LLAudioEngineSDL2::output_device_map_t LLAudioEngineSDL2::getDevices()
{
// Impl looks like this, but it might not be possible to support this right now
/*
if(mDevices.size())
return;
auto numDevices{SDL_GetNumAudioDevices(0)};
if( numDevices <= 0 )
return {};
LLAudioEngineSDL2::output_device_map_t devices{};
for( auto i{0}; i < numDevices; ++i )
{
auto pName{SDL_GetAudioDeviceName(i, 0)};
if( !pName )
continue;
std::string strName{ pName };
devices[ LLUUID::generateNewID( strName )] = strName;
}
*/
return mDevices;
}
void LLAudioEngineSDL2::setDevice(const LLUUID &device_uuid)
{
}
LLAudioBuffer *LLAudioEngineSDL2::createBuffer()
{
return new LLAudioBufferSDL2();
}
LLAudioChannel *LLAudioEngineSDL2::createChannel()
{
S32 channelNum{ -1 };
if( mData && mData->mReady )
{
for( S32 i = 0; i < mData->mChannels.size(); ++i )
{
if( !mData->mChannels[i])
{
channelNum = i;
mData->mChannels[i] = 1;
break;
}
}
if( channelNum == -1 )
{
channelNum = mData->mChannels.size();
mData->mChannels.push_back(0);
Mix_AllocateChannels( mData->mChannels.size() );
}
}
return new LLAudioChannelSDL2(channelNum, this);
}
void LLAudioEngineSDL2::deleteChannel(S32 aChannel)
{
if( !mData )
return;
if( aChannel < 0 || aChannel >= mData->mChannels.size() )
return;
mData->mChannels[aChannel] = 0;
}
bool LLAudioEngineSDL2::initWind()
{
// Not supported
return false;
}
void LLAudioEngineSDL2::cleanupWind()
{
}
void LLAudioEngineSDL2::setInternalGain(F32 gain)
{
}
void LLAudioEngineSDL2::allocateListener()
{
mListenerp = new LLListenerSDL2(this);
}

View File

@ -0,0 +1,43 @@
#ifndef LL_AUDIOENGINE_SDL2_H
#define LL_AUDIOENGINE_SDL2_H
#include "llaudioengine.h"
#include "llwindgen.h"
class LLAudioEngineSDL2 : public LLAudioEngine
{
public:
LLAudioEngineSDL2();
~LLAudioEngineSDL2();
bool init(const S32 num_channels, void *userdata, const std::string &app_title) override;
std::string getDriverName(bool verbose) override;
void shutdown() override;
void updateWind(LLVector3 direction, F32 camera_height_above_water) override;
void idle(F32 max_decode_time = 0.f) override;
void updateChannels() override;
output_device_map_t getDevices() override;
void setDevice(const LLUUID& device_uuid) override;
void deleteChannel( S32 aChannel );
protected:
LLAudioBuffer *createBuffer() override;
LLAudioChannel *createChannel() override;
bool initWind() override;
void cleanupWind() override;
void setInternalGain(F32 gain) override;
void allocateListener() override;
output_device_map_t mDevices;
struct ImplData;
std::unique_ptr< ImplData > mData;
};
#endif

View File

@ -112,10 +112,15 @@ endif (BUILD_HEADLESS)
add_library (llrender ${llrender_SOURCE_FILES})
if (SDL_FOUND)
set_property(TARGET llrender
PROPERTY COMPILE_DEFINITIONS LL_SDL=1
)
set_property(TARGET llrender
PROPERTY COMPILE_DEFINITIONS LL_SDL=1
)
endif (SDL_FOUND)
if (SDL2_FOUND)
set_property(TARGET llrender
PROPERTY COMPILE_DEFINITIONS LL_SDL2=1 LL_SDL=1
)
endif ()
# Libraries on which this library depends, needed for Linux builds
# Sort by high-level to low-level

View File

@ -81,15 +81,25 @@ if (LINUX)
libfreetype.a
)
list(APPEND viewer_SOURCE_FILES
llkeyboardsdl.cpp
llwindowsdl.cpp
)
list(APPEND viewer_HEADER_FILES
llkeyboardsdl.h
llwindowsdl.h
)
if( NOT USE_SDL2 )
list(APPEND viewer_SOURCE_FILES
llkeyboardsdl.cpp
llwindowsdl.cpp
)
list(APPEND viewer_HEADER_FILES
llkeyboardsdl.h
llwindowsdl.h
)
else()
list(APPEND viewer_SOURCE_FILES
llkeyboardsdl2.cpp
llwindowsdl2.cpp
)
list(APPEND viewer_HEADER_FILES
llkeyboardsdl2.h
llwindowsdl2.h
)
endif()
if (BUILD_HEADLESS)
set(llwindowheadless_LINK_LIBRARIES
${LLCOMMON_LIBRARIES}
@ -193,9 +203,14 @@ endif (llwindow_HEADER_FILES)
if (SDL_FOUND)
set_property(TARGET llwindow
PROPERTY COMPILE_DEFINITIONS LL_SDL=1
)
endif (SDL_FOUND)
PROPERTY COMPILE_DEFINITIONS LL_SDL=1
)
endif ()
if (SDL2_FOUND)
set_property(TARGET llwindow
PROPERTY COMPILE_DEFINITIONS LL_SDL2=1 LL_SDL=1
)
endif ()
target_link_libraries (llwindow ${llwindow_LINK_LIBRARIES})
target_link_libraries (llwindow ${llwindow_LINK_LIBRARIES})

View File

@ -195,12 +195,12 @@ void LLKeyboard::resetKeys()
}
BOOL LLKeyboard::translateKey(const U16 os_key, KEY *out_key)
// <FS:ND/> SDL2 compat
//BOOL LLKeyboard::translateKey(const U16 os_key, KEY *out_key)
BOOL LLKeyboard::translateKey(const NATIVE_KEY_TYPE os_key, KEY *out_key)
{
std::map<U16, KEY>::iterator iter;
// Only translate keys in the map, ignore all other keys for now
iter = mTranslateKeyMap.find(os_key);
auto iter = mTranslateKeyMap.find(os_key);
if (iter == mTranslateKeyMap.end())
{
//LL_WARNS() << "Unknown virtual key " << os_key << LL_ENDL;
@ -215,10 +215,11 @@ BOOL LLKeyboard::translateKey(const U16 os_key, KEY *out_key)
}
U16 LLKeyboard::inverseTranslateKey(const KEY translated_key)
// <FS:ND/> SDL2 compat
//U16 LLKeyboard::inverseTranslateKey(const KEY translated_key)
LLKeyboard::NATIVE_KEY_TYPE LLKeyboard::inverseTranslateKey(const KEY translated_key)
{
std::map<KEY, U16>::iterator iter;
iter = mInvTranslateKeyMap.find(translated_key);
auto iter = mInvTranslateKeyMap.find(translated_key);
if (iter == mInvTranslateKeyMap.end())
{
return 0;

View File

@ -55,6 +55,14 @@ class LLWindowCallbacks;
class LLKeyboard
{
public:
// <FS:ND> For SDL2 input is widened to U32 symbols
#ifndef LL_SDL2
typedef U16 NATIVE_KEY_TYPE;
#else
typedef U32 NATIVE_KEY_TYPE;
#endif
// </FS:MD>
LLKeyboard();
virtual ~LLKeyboard();
@ -67,15 +75,22 @@ public:
BOOL getKeyDown(const KEY key) { return mKeyLevel[key]; }
BOOL getKeyRepeated(const KEY key) { return mKeyRepeated[key]; }
BOOL translateKey(const U16 os_key, KEY *translated_key);
U16 inverseTranslateKey(const KEY translated_key);
// <FS:ND> SDL2 compat
//BOOL translateKey(const U16 os_key, KEY *translated_key);
//U16 inverseTranslateKey(const KEY translated_key);
BOOL translateKey(const NATIVE_KEY_TYPE os_key, KEY *translated_key);
NATIVE_KEY_TYPE inverseTranslateKey(const KEY translated_key);
// </FS:ND>
BOOL handleTranslatedKeyUp(KEY translated_key, U32 translated_mask); // Translated into "Linden" keycodes
BOOL handleTranslatedKeyDown(KEY translated_key, U32 translated_mask); // Translated into "Linden" keycodes
// <FS:ND> SDL2 compat
//virtual BOOL handleKeyUp(const U16 key, MASK mask) = 0;
//virtual BOOL handleKeyDown(const U16 key, MASK mask) = 0;
virtual BOOL handleKeyUp(const NATIVE_KEY_TYPE key, MASK mask) = 0;
virtual BOOL handleKeyDown(const NATIVE_KEY_TYPE key, MASK mask) = 0;
// </FS:ND>
virtual BOOL handleKeyUp(const U16 key, MASK mask) = 0;
virtual BOOL handleKeyDown(const U16 key, MASK mask) = 0;
#ifdef LL_DARWIN
// We only actually use this for OS X.
virtual void handleModifier(MASK mask) = 0;
@ -109,8 +124,13 @@ protected:
void addKeyName(KEY key, const std::string& name);
protected:
std::map<U16, KEY> mTranslateKeyMap; // Map of translations from OS keys to Linden KEYs
std::map<KEY, U16> mInvTranslateKeyMap; // Map of translations from Linden KEYs to OS keys
// <FS:ND> SDL2 compat
//std::map<U16, KEY> mTranslateKeyMap; // Map of translations from OS keys to Linden KEYs
//std::map<KEY, U16> mInvTranslateKeyMap; // Map of translations from Linden KEYs to OS keys
std::map<NATIVE_KEY_TYPE, KEY> mTranslateKeyMap; // Map of translations from OS keys to Linden KEYs
std::map<KEY, NATIVE_KEY_TYPE> mInvTranslateKeyMap; // Map of translations from Linden KEYs to OS keys
//</FS:ND>
LLWindowCallbacks *mCallbacks;
LLTimer mKeyLevelTimer[KEY_COUNT]; // Time since level was set

View File

@ -34,14 +34,6 @@ LLKeyboardHeadless::LLKeyboardHeadless()
void LLKeyboardHeadless::resetMaskKeys()
{ }
BOOL LLKeyboardHeadless::handleKeyDown(const U16 key, const U32 mask)
{ return FALSE; }
BOOL LLKeyboardHeadless::handleKeyUp(const U16 key, const U32 mask)
{ return FALSE; }
MASK LLKeyboardHeadless::currentMask(BOOL for_mouse_event)
{ return MASK_NONE; }

View File

@ -35,8 +35,13 @@ public:
LLKeyboardHeadless();
/*virtual*/ ~LLKeyboardHeadless() {};
/*virtual*/ BOOL handleKeyUp(const U16 key, MASK mask);
/*virtual*/ BOOL handleKeyDown(const U16 key, MASK mask);
#ifndef LL_SDL2
/*virtual*/ BOOL handleKeyUp(const U16 key, MASK mask) { return FALSE; }
/*virtual*/ BOOL handleKeyDown(const U16 key, MASK mask) { return FALSE; }
#else
/*virtual*/ BOOL handleKeyUp(const U32 key, MASK mask) { return FALSE; }
/*virtual*/ BOOL handleKeyDown(const U32 key, MASK mask) { return FALSE; }
#endif
/*virtual*/ void resetMaskKeys();
/*virtual*/ MASK currentMask(BOOL for_mouse_event);
/*virtual*/ void scanKeyboard();

View File

@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
#ifdef LL_SDL2
#include "llkeyboardsdl2.h"
#else
#ifndef LL_LLKEYBOARDSDL_H
#define LL_LLKEYBOARDSDL_H
@ -53,3 +57,4 @@ private:
};
#endif
#endif

View File

@ -0,0 +1,642 @@
#if LL_SDL2
#include "linden_common.h"
#include "llkeyboardsdl2.h"
#include "llwindowcallbacks.h"
#include "SDL2/SDL.h"
#include "SDL2/SDL_keycode.h"
LLKeyboardSDL::LLKeyboardSDL()
{
// Set up key mapping for SDL - eventually can read this from a file?
// Anything not in the key map gets dropped
// Add default A-Z
// Virtual key mappings from SDL_keysym.h ...
// SDL maps the letter keys to the ASCII you'd expect, but it's lowercase...
// <FS:ND> Looks like we need to map those despite of SDL_TEXTINPUT handling most of this, but without
// the translation lower->upper here accelerators will not work.
U16 cur_char;
for (cur_char = 'A'; cur_char <= 'Z'; cur_char++)
{
mTranslateKeyMap[cur_char] = cur_char;
}
for (cur_char = 'a'; cur_char <= 'z'; cur_char++)
{
mTranslateKeyMap[cur_char] = (cur_char - 'a') + 'A';
}
for (cur_char = '0'; cur_char <= '9'; cur_char++)
{
mTranslateKeyMap[cur_char] = cur_char;
}
// These ones are translated manually upon keydown/keyup because
// SDL doesn't handle their numlock transition.
//mTranslateKeyMap[SDLK_KP4] = KEY_PAD_LEFT;
//mTranslateKeyMap[SDLK_KP6] = KEY_PAD_RIGHT;
//mTranslateKeyMap[SDLK_KP8] = KEY_PAD_UP;
//mTranslateKeyMap[SDLK_KP2] = KEY_PAD_DOWN;
//mTranslateKeyMap[SDLK_KP_PERIOD] = KEY_DELETE;
//mTranslateKeyMap[SDLK_KP7] = KEY_HOME;
//mTranslateKeyMap[SDLK_KP1] = KEY_END;
//mTranslateKeyMap[SDLK_KP9] = KEY_PAGE_UP;
//mTranslateKeyMap[SDLK_KP3] = KEY_PAGE_DOWN;
//mTranslateKeyMap[SDLK_KP0] = KEY_INSERT;
mTranslateKeyMap[SDLK_SPACE] = ' '; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_RETURN] = KEY_RETURN;
mTranslateKeyMap[SDLK_LEFT] = KEY_LEFT;
mTranslateKeyMap[SDLK_RIGHT] = KEY_RIGHT;
mTranslateKeyMap[SDLK_UP] = KEY_UP;
mTranslateKeyMap[SDLK_DOWN] = KEY_DOWN;
mTranslateKeyMap[SDLK_KP_ENTER] = KEY_RETURN;
mTranslateKeyMap[SDLK_ESCAPE] = KEY_ESCAPE;
mTranslateKeyMap[SDLK_BACKSPACE] = KEY_BACKSPACE;
mTranslateKeyMap[SDLK_DELETE] = KEY_DELETE;
mTranslateKeyMap[SDLK_LSHIFT] = KEY_SHIFT;
mTranslateKeyMap[SDLK_RSHIFT] = KEY_SHIFT;
mTranslateKeyMap[SDLK_LCTRL] = KEY_CONTROL;
mTranslateKeyMap[SDLK_RCTRL] = KEY_CONTROL;
mTranslateKeyMap[SDLK_LALT] = KEY_ALT;
mTranslateKeyMap[SDLK_RALT] = KEY_ALT;
mTranslateKeyMap[SDLK_HOME] = KEY_HOME;
mTranslateKeyMap[SDLK_END] = KEY_END;
mTranslateKeyMap[SDLK_PAGEUP] = KEY_PAGE_UP;
mTranslateKeyMap[SDLK_PAGEDOWN] = KEY_PAGE_DOWN;
mTranslateKeyMap[SDLK_MINUS] = KEY_HYPHEN;
mTranslateKeyMap[SDLK_EQUALS] = KEY_EQUALS;
mTranslateKeyMap[SDLK_KP_EQUALS] = KEY_EQUALS;
mTranslateKeyMap[SDLK_INSERT] = KEY_INSERT;
mTranslateKeyMap[SDLK_CAPSLOCK] = KEY_CAPSLOCK;
mTranslateKeyMap[SDLK_TAB] = KEY_TAB;
mTranslateKeyMap[SDLK_KP_PLUS] = KEY_ADD;
mTranslateKeyMap[SDLK_KP_MINUS] = KEY_SUBTRACT;
mTranslateKeyMap[SDLK_KP_MULTIPLY] = KEY_MULTIPLY;
mTranslateKeyMap[SDLK_KP_DIVIDE] = KEY_PAD_DIVIDE;
mTranslateKeyMap[SDLK_F1] = KEY_F1;
mTranslateKeyMap[SDLK_F2] = KEY_F2;
mTranslateKeyMap[SDLK_F3] = KEY_F3;
mTranslateKeyMap[SDLK_F4] = KEY_F4;
mTranslateKeyMap[SDLK_F5] = KEY_F5;
mTranslateKeyMap[SDLK_F6] = KEY_F6;
mTranslateKeyMap[SDLK_F7] = KEY_F7;
mTranslateKeyMap[SDLK_F8] = KEY_F8;
mTranslateKeyMap[SDLK_F9] = KEY_F9;
mTranslateKeyMap[SDLK_F10] = KEY_F10;
mTranslateKeyMap[SDLK_F11] = KEY_F11;
mTranslateKeyMap[SDLK_F12] = KEY_F12;
mTranslateKeyMap[SDLK_PLUS] = '='; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_COMMA] = ','; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_MINUS] = '-'; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_PERIOD] = '.'; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_BACKQUOTE] = '`'; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_SLASH] = KEY_DIVIDE; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_SEMICOLON] = ';'; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_LEFTBRACKET] = '['; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_BACKSLASH] = '\\'; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_RIGHTBRACKET] = ']'; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
mTranslateKeyMap[SDLK_QUOTE] = '\''; // <FS:ND/> Those are handled by SDL2 via text input, do not map them
// Build inverse map
for (auto iter = mTranslateKeyMap.begin(); iter != mTranslateKeyMap.end(); iter++)
{
mInvTranslateKeyMap[iter->second] = iter->first;
}
// numpad map
mTranslateNumpadMap[SDLK_KP_0] = KEY_PAD_INS;
mTranslateNumpadMap[SDLK_KP_1] = KEY_PAD_END;
mTranslateNumpadMap[SDLK_KP_2] = KEY_PAD_DOWN;
mTranslateNumpadMap[SDLK_KP_3] = KEY_PAD_PGDN;
mTranslateNumpadMap[SDLK_KP_4] = KEY_PAD_LEFT;
mTranslateNumpadMap[SDLK_KP_5] = KEY_PAD_CENTER;
mTranslateNumpadMap[SDLK_KP_6] = KEY_PAD_RIGHT;
mTranslateNumpadMap[SDLK_KP_7] = KEY_PAD_HOME;
mTranslateNumpadMap[SDLK_KP_8] = KEY_PAD_UP;
mTranslateNumpadMap[SDLK_KP_9] = KEY_PAD_PGUP;
mTranslateNumpadMap[SDLK_KP_PERIOD] = KEY_PAD_DEL;
// build inverse numpad map
for (auto iter = mTranslateNumpadMap.begin();
iter != mTranslateNumpadMap.end();
iter++)
{
mInvTranslateNumpadMap[iter->second] = iter->first;
}
}
void LLKeyboardSDL::resetMaskKeys()
{
SDL_Keymod mask = SDL_GetModState();
// MBW -- XXX -- This mirrors the operation of the Windows version of resetMaskKeys().
// It looks a bit suspicious, as it won't correct for keys that have been released.
// Is this the way it's supposed to work?
if(mask & KMOD_SHIFT)
{
mKeyLevel[KEY_SHIFT] = TRUE;
}
if(mask & KMOD_CTRL)
{
mKeyLevel[KEY_CONTROL] = TRUE;
}
if(mask & KMOD_ALT)
{
mKeyLevel[KEY_ALT] = TRUE;
}
}
MASK LLKeyboardSDL::updateModifiers(const U32 mask)
{
// translate the mask
MASK out_mask = MASK_NONE;
if(mask & KMOD_SHIFT)
{
out_mask |= MASK_SHIFT;
}
if(mask & KMOD_CTRL)
{
out_mask |= MASK_CONTROL;
}
if(mask & KMOD_ALT)
{
out_mask |= MASK_ALT;
}
return out_mask;
}
static U32 adjustNativekeyFromUnhandledMask(const U32 key, const U32 mask)
{
// SDL doesn't automatically adjust the keysym according to
// whether NUMLOCK is engaged, so we massage the keysym manually.
U32 rtn = key;
if (!(mask & KMOD_NUM))
{
switch (key)
{
case SDLK_KP_PERIOD: rtn = SDLK_DELETE; break;
case SDLK_KP_0: rtn = SDLK_INSERT; break;
case SDLK_KP_1: rtn = SDLK_END; break;
case SDLK_KP_2: rtn = SDLK_DOWN; break;
case SDLK_KP_3: rtn = SDLK_PAGEDOWN; break;
case SDLK_KP_4: rtn = SDLK_LEFT; break;
case SDLK_KP_6: rtn = SDLK_RIGHT; break;
case SDLK_KP_7: rtn = SDLK_HOME; break;
case SDLK_KP_8: rtn = SDLK_UP; break;
case SDLK_KP_9: rtn = SDLK_PAGEUP; break;
}
}
return rtn;
}
BOOL LLKeyboardSDL::handleKeyDown(const U32 key, const U32 mask)
{
U32 adjusted_nativekey;
KEY translated_key = 0;
U32 translated_mask = MASK_NONE;
BOOL handled = FALSE;
adjusted_nativekey = adjustNativekeyFromUnhandledMask(key, mask);
translated_mask = updateModifiers(mask);
if(translateNumpadKey(adjusted_nativekey, &translated_key))
{
handled = handleTranslatedKeyDown(translated_key, translated_mask);
}
return handled;
}
BOOL LLKeyboardSDL::handleKeyUp(const U32 key, const U32 mask)
{
U32 adjusted_nativekey;
KEY translated_key = 0;
U32 translated_mask = MASK_NONE;
BOOL handled = FALSE;
adjusted_nativekey = adjustNativekeyFromUnhandledMask(key, mask);
translated_mask = updateModifiers(mask);
if(translateNumpadKey(adjusted_nativekey, &translated_key))
{
handled = handleTranslatedKeyUp(translated_key, translated_mask);
}
return handled;
}
MASK LLKeyboardSDL::currentMask(BOOL for_mouse_event)
{
MASK result = MASK_NONE;
SDL_Keymod mask = SDL_GetModState();
if (mask & KMOD_SHIFT)
result |= MASK_SHIFT;
if (mask & KMOD_CTRL)
result |= MASK_CONTROL;
if (mask & KMOD_ALT)
result |= MASK_ALT;
// For keyboard events, consider Meta keys equivalent to Control
if (!for_mouse_event)
{
if (mask & KMOD_GUI)
result |= MASK_CONTROL;
}
return result;
}
void LLKeyboardSDL::scanKeyboard()
{
for (S32 key = 0; key < KEY_COUNT; key++)
{
// Generate callback if any event has occurred on this key this frame.
// Can't just test mKeyLevel, because this could be a slow frame and
// key might have gone down then up. JC
if (mKeyLevel[key] || mKeyDown[key] || mKeyUp[key])
{
mCurScanKey = key;
mCallbacks->handleScanKey(key, mKeyDown[key], mKeyUp[key], mKeyLevel[key]);
}
}
// Reset edges for next frame
for (S32 key = 0; key < KEY_COUNT; key++)
{
mKeyUp[key] = FALSE;
mKeyDown[key] = FALSE;
if (mKeyLevel[key])
{
mKeyLevelFrameCount[key]++;
}
}
}
BOOL LLKeyboardSDL::translateNumpadKey( const U32 os_key, KEY *translated_key)
{
return translateKey(os_key, translated_key);
}
U16 LLKeyboardSDL::inverseTranslateNumpadKey(const KEY translated_key)
{
return inverseTranslateKey(translated_key);
}
enum class WindowsVK : U32
{
VK_UNKNOWN = 0,
VK_CANCEL = 0x03,
VK_BACK = 0x08,
VK_TAB = 0x09,
VK_CLEAR = 0x0C,
VK_RETURN = 0x0D,
VK_SHIFT = 0x10,
VK_CONTROL = 0x11,
VK_MENU = 0x12,
VK_PAUSE = 0x13,
VK_CAPITAL = 0x14,
VK_KANA = 0x15,
VK_HANGUL = 0x15,
VK_JUNJA = 0x17,
VK_FINAL = 0x18,
VK_HANJA = 0x19,
VK_KANJI = 0x19,
VK_ESCAPE = 0x1B,
VK_CONVERT = 0x1C,
VK_NONCONVERT = 0x1D,
VK_ACCEPT = 0x1E,
VK_MODECHANGE = 0x1F,
VK_SPACE = 0x20,
VK_PRIOR = 0x21,
VK_NEXT = 0x22,
VK_END = 0x23,
VK_HOME = 0x24,
VK_LEFT = 0x25,
VK_UP = 0x26,
VK_RIGHT = 0x27,
VK_DOWN = 0x28,
VK_SELECT = 0x29,
VK_PRINT = 0x2A,
VK_EXECUTE = 0x2B,
VK_SNAPSHOT = 0x2C,
VK_INSERT = 0x2D,
VK_DELETE = 0x2E,
VK_HELP = 0x2F,
VK_0 = 0x30,
VK_1 = 0x31,
VK_2 = 0x32,
VK_3 = 0x33,
VK_4 = 0x34,
VK_5 = 0x35,
VK_6 = 0x36,
VK_7 = 0x37,
VK_8 = 0x38,
VK_9 = 0x39,
VK_A = 0x41,
VK_B = 0x42,
VK_C = 0x43,
VK_D = 0x44,
VK_E = 0x45,
VK_F = 0x46,
VK_G = 0x47,
VK_H = 0x48,
VK_I = 0x49,
VK_J = 0x4A,
VK_K = 0x4B,
VK_L = 0x4C,
VK_M = 0x4D,
VK_N = 0x4E,
VK_O = 0x4F,
VK_P = 0x50,
VK_Q = 0x51,
VK_R = 0x52,
VK_S = 0x53,
VK_T = 0x54,
VK_U = 0x55,
VK_V = 0x56,
VK_W = 0x57,
VK_X = 0x58,
VK_Y = 0x59,
VK_Z = 0x5A,
VK_LWIN = 0x5B,
VK_RWIN = 0x5C,
VK_APPS = 0x5D,
VK_SLEEP = 0x5F,
VK_NUMPAD0 = 0x60,
VK_NUMPAD1 = 0x61,
VK_NUMPAD2 = 0x62,
VK_NUMPAD3 = 0x63,
VK_NUMPAD4 = 0x64,
VK_NUMPAD5 = 0x65,
VK_NUMPAD6 = 0x66,
VK_NUMPAD7 = 0x67,
VK_NUMPAD8 = 0x68,
VK_NUMPAD9 = 0x69,
VK_MULTIPLY = 0x6A,
VK_ADD = 0x6B,
VK_SEPARATOR = 0x6C,
VK_SUBTRACT = 0x6D,
VK_DECIMAL = 0x6E,
VK_DIVIDE = 0x6F,
VK_F1 = 0x70,
VK_F2 = 0x71,
VK_F3 = 0x72,
VK_F4 = 0x73,
VK_F5 = 0x74,
VK_F6 = 0x75,
VK_F7 = 0x76,
VK_F8 = 0x77,
VK_F9 = 0x78,
VK_F10 = 0x79,
VK_F11 = 0x7A,
VK_F12 = 0x7B,
VK_F13 = 0x7C,
VK_F14 = 0x7D,
VK_F15 = 0x7E,
VK_F16 = 0x7F,
VK_F17 = 0x80,
VK_F18 = 0x81,
VK_F19 = 0x82,
VK_F20 = 0x83,
VK_F21 = 0x84,
VK_F22 = 0x85,
VK_F23 = 0x86,
VK_F24 = 0x87,
VK_NUMLOCK = 0x90,
VK_SCROLL = 0x91,
VK_LSHIFT = 0xA0,
VK_RSHIFT = 0xA1,
VK_LCONTROL = 0xA2,
VK_RCONTROL = 0xA3,
VK_LMENU = 0xA4,
VK_RMENU = 0xA5,
VK_BROWSER_BACK = 0xA6,
VK_BROWSER_FORWARD = 0xA7,
VK_BROWSER_REFRESH = 0xA8,
VK_BROWSER_STOP = 0xA9,
VK_BROWSER_SEARCH = 0xAA,
VK_BROWSER_FAVORITES = 0xAB,
VK_BROWSER_HOME = 0xAC,
VK_VOLUME_MUTE = 0xAD,
VK_VOLUME_DOWN = 0xAE,
VK_VOLUME_UP = 0xAF,
VK_MEDIA_NEXT_TRACK = 0xB0,
VK_MEDIA_PREV_TRACK = 0xB1,
VK_MEDIA_STOP = 0xB2,
VK_MEDIA_PLAY_PAUSE = 0xB3,
VK_MEDIA_LAUNCH_MAIL = 0xB4,
VK_MEDIA_LAUNCH_MEDIA_SELECT = 0xB5,
VK_MEDIA_LAUNCH_APP1 = 0xB6,
VK_MEDIA_LAUNCH_APP2 = 0xB7,
VK_OEM_1 = 0xBA,
VK_OEM_PLUS = 0xBB,
VK_OEM_COMMA = 0xBC,
VK_OEM_MINUS = 0xBD,
VK_OEM_PERIOD = 0xBE,
VK_OEM_2 = 0xBF,
VK_OEM_3 = 0xC0,
VK_OEM_4 = 0xDB,
VK_OEM_5 = 0xDC,
VK_OEM_6 = 0xDD,
VK_OEM_7 = 0xDE,
VK_OEM_8 = 0xDF,
VK_OEM_102 = 0xE2,
VK_PROCESSKEY = 0xE5,
VK_PACKET = 0xE7,
VK_ATTN = 0xF6,
VK_CRSEL = 0xF7,
VK_EXSEL = 0xF8,
VK_EREOF = 0xF9,
VK_PLAY = 0xFA,
VK_ZOOM = 0xFB,
VK_NONAME = 0xFC,
VK_PA1 = 0xFD,
VK_OEM_CLEAR = 0xFE,
};
std::map< U32, U32 > mSDL2_to_Win;
std::set< U32 > mIgnoreSDL2Keys;
U32 LLKeyboardSDL::mapSDL2toWin( U32 aSymbol )
{
// <FS:ND> Map SDLK_ virtual keys to Windows VK_ virtual keys.
// Text is handled via unicode input (SDL_TEXTINPUT event) and does not need to be translated into VK_ values as those match already.
if( mSDL2_to_Win.empty() )
{
mSDL2_to_Win[ SDLK_BACKSPACE ] = (U32)WindowsVK::VK_BACK;
mSDL2_to_Win[ SDLK_TAB ] = (U32)WindowsVK::VK_TAB;
mSDL2_to_Win[ 12 ] = (U32)WindowsVK::VK_CLEAR;
mSDL2_to_Win[ SDLK_RETURN ] = (U32)WindowsVK::VK_RETURN;
mSDL2_to_Win[ 19 ] = (U32)WindowsVK::VK_PAUSE;
mSDL2_to_Win[ SDLK_ESCAPE ] = (U32)WindowsVK::VK_ESCAPE;
mSDL2_to_Win[ SDLK_SPACE ] = (U32)WindowsVK::VK_SPACE;
mSDL2_to_Win[ SDLK_QUOTE ] = (U32)WindowsVK::VK_OEM_7;
mSDL2_to_Win[ SDLK_COMMA ] = (U32)WindowsVK::VK_OEM_COMMA;
mSDL2_to_Win[ SDLK_MINUS ] = (U32)WindowsVK::VK_OEM_MINUS;
mSDL2_to_Win[ SDLK_PERIOD ] = (U32)WindowsVK::VK_OEM_PERIOD;
mSDL2_to_Win[ SDLK_SLASH ] = (U32)WindowsVK::VK_OEM_2;
mSDL2_to_Win[ SDLK_0 ] = (U32)WindowsVK::VK_0;
mSDL2_to_Win[ SDLK_1 ] = (U32)WindowsVK::VK_1;
mSDL2_to_Win[ SDLK_2 ] = (U32)WindowsVK::VK_2;
mSDL2_to_Win[ SDLK_3 ] = (U32)WindowsVK::VK_3;
mSDL2_to_Win[ SDLK_4 ] = (U32)WindowsVK::VK_4;
mSDL2_to_Win[ SDLK_5 ] = (U32)WindowsVK::VK_5;
mSDL2_to_Win[ SDLK_6 ] = (U32)WindowsVK::VK_6;
mSDL2_to_Win[ SDLK_7 ] = (U32)WindowsVK::VK_7;
mSDL2_to_Win[ SDLK_8 ] = (U32)WindowsVK::VK_8;
mSDL2_to_Win[ SDLK_9 ] = (U32)WindowsVK::VK_9;
mSDL2_to_Win[ SDLK_SEMICOLON ] = (U32)WindowsVK::VK_OEM_1;
mSDL2_to_Win[ SDLK_LESS ] = (U32)WindowsVK::VK_OEM_102;
mSDL2_to_Win[ SDLK_EQUALS ] = (U32)WindowsVK::VK_OEM_PLUS;
mSDL2_to_Win[ SDLK_KP_EQUALS ] = (U32)WindowsVK::VK_OEM_PLUS;
mSDL2_to_Win[ SDLK_LEFTBRACKET ] = (U32)WindowsVK::VK_OEM_4;
mSDL2_to_Win[ SDLK_BACKSLASH ] = (U32)WindowsVK::VK_OEM_5;
mSDL2_to_Win[ SDLK_RIGHTBRACKET ] = (U32)WindowsVK::VK_OEM_6;
mSDL2_to_Win[ SDLK_BACKQUOTE ] = (U32)WindowsVK::VK_OEM_8;
mSDL2_to_Win[ SDLK_a ] = (U32)WindowsVK::VK_A;
mSDL2_to_Win[ SDLK_b ] = (U32)WindowsVK::VK_B;
mSDL2_to_Win[ SDLK_c ] = (U32)WindowsVK::VK_C;
mSDL2_to_Win[ SDLK_d ] = (U32)WindowsVK::VK_D;
mSDL2_to_Win[ SDLK_e ] = (U32)WindowsVK::VK_E;
mSDL2_to_Win[ SDLK_f ] = (U32)WindowsVK::VK_F;
mSDL2_to_Win[ SDLK_g ] = (U32)WindowsVK::VK_G;
mSDL2_to_Win[ SDLK_h ] = (U32)WindowsVK::VK_H;
mSDL2_to_Win[ SDLK_i ] = (U32)WindowsVK::VK_I;
mSDL2_to_Win[ SDLK_j ] = (U32)WindowsVK::VK_J;
mSDL2_to_Win[ SDLK_k ] = (U32)WindowsVK::VK_K;
mSDL2_to_Win[ SDLK_l ] = (U32)WindowsVK::VK_L;
mSDL2_to_Win[ SDLK_m ] = (U32)WindowsVK::VK_M;
mSDL2_to_Win[ SDLK_n ] = (U32)WindowsVK::VK_N;
mSDL2_to_Win[ SDLK_o ] = (U32)WindowsVK::VK_O;
mSDL2_to_Win[ SDLK_p ] = (U32)WindowsVK::VK_P;
mSDL2_to_Win[ SDLK_q ] = (U32)WindowsVK::VK_Q;
mSDL2_to_Win[ SDLK_r ] = (U32)WindowsVK::VK_R;
mSDL2_to_Win[ SDLK_s ] = (U32)WindowsVK::VK_S;
mSDL2_to_Win[ SDLK_t ] = (U32)WindowsVK::VK_T;
mSDL2_to_Win[ SDLK_u ] = (U32)WindowsVK::VK_U;
mSDL2_to_Win[ SDLK_v ] = (U32)WindowsVK::VK_V;
mSDL2_to_Win[ SDLK_w ] = (U32)WindowsVK::VK_W;
mSDL2_to_Win[ SDLK_x ] = (U32)WindowsVK::VK_X;
mSDL2_to_Win[ SDLK_y ] = (U32)WindowsVK::VK_Y;
mSDL2_to_Win[ SDLK_z ] = (U32)WindowsVK::VK_Z;
mSDL2_to_Win[ SDLK_DELETE ] = (U32)WindowsVK::VK_DELETE;
mSDL2_to_Win[ SDLK_NUMLOCKCLEAR ] = (U32)WindowsVK::VK_NUMLOCK;
mSDL2_to_Win[ SDLK_SCROLLLOCK ] = (U32)WindowsVK::VK_SCROLL;
mSDL2_to_Win[ SDLK_HELP ] = (U32)WindowsVK::VK_HELP;
mSDL2_to_Win[ SDLK_PRINTSCREEN ] = (U32)WindowsVK::VK_SNAPSHOT;
mSDL2_to_Win[ SDLK_CANCEL ] = (U32)WindowsVK::VK_CANCEL;
mSDL2_to_Win[ SDLK_APPLICATION ] = (U32)WindowsVK::VK_APPS;
mSDL2_to_Win[ SDLK_UNKNOWN ] = (U32)WindowsVK::VK_UNKNOWN;
mSDL2_to_Win[ SDLK_BACKSPACE ] = (U32)WindowsVK::VK_BACK;
mSDL2_to_Win[ SDLK_TAB ] = (U32)WindowsVK::VK_TAB;
mSDL2_to_Win[ SDLK_CLEAR ] = (U32)WindowsVK::VK_CLEAR;
mSDL2_to_Win[ SDLK_RETURN ] = (U32)WindowsVK::VK_RETURN;
mSDL2_to_Win[ SDLK_PAUSE ] = (U32)WindowsVK::VK_PAUSE;
mSDL2_to_Win[ SDLK_ESCAPE ] = (U32)WindowsVK::VK_ESCAPE;
mSDL2_to_Win[ SDLK_DELETE ] = (U32)WindowsVK::VK_DELETE;
mSDL2_to_Win[ SDLK_KP_PERIOD ] = (U32)WindowsVK::VK_OEM_PERIOD; // VK_DECIMAL?
mSDL2_to_Win[ SDLK_KP_DIVIDE ] = (U32)WindowsVK::VK_DIVIDE;
mSDL2_to_Win[ SDLK_KP_MULTIPLY] = (U32)WindowsVK::VK_MULTIPLY;
mSDL2_to_Win[ SDLK_KP_MINUS ] = (U32)WindowsVK::VK_OEM_MINUS; // VK_SUBSTRACT?
mSDL2_to_Win[ SDLK_KP_PLUS ] = (U32)WindowsVK::VK_OEM_PLUS; // VK_ADD?
mSDL2_to_Win[ SDLK_KP_ENTER ] = (U32)WindowsVK::VK_RETURN;
mSDL2_to_Win[ SDLK_KP_0 ] = (U32)WindowsVK::VK_NUMPAD0;
mSDL2_to_Win[ SDLK_KP_1 ] = (U32)WindowsVK::VK_NUMPAD1;
mSDL2_to_Win[ SDLK_KP_2 ] = (U32)WindowsVK::VK_NUMPAD2;
mSDL2_to_Win[ SDLK_KP_3 ] = (U32)WindowsVK::VK_NUMPAD3;
mSDL2_to_Win[ SDLK_KP_4 ] = (U32)WindowsVK::VK_NUMPAD4;
mSDL2_to_Win[ SDLK_KP_5 ] = (U32)WindowsVK::VK_NUMPAD5;
mSDL2_to_Win[ SDLK_KP_6 ] = (U32)WindowsVK::VK_NUMPAD6;
mSDL2_to_Win[ SDLK_KP_7 ] = (U32)WindowsVK::VK_NUMPAD7;
mSDL2_to_Win[ SDLK_KP_8 ] = (U32)WindowsVK::VK_NUMPAD8;
mSDL2_to_Win[ SDLK_KP_9 ] = (U32)WindowsVK::VK_NUMPAD9;
// ?
mSDL2_to_Win[ SDLK_UP ] = (U32)WindowsVK::VK_UP;
mSDL2_to_Win[ SDLK_DOWN ] = (U32)WindowsVK::VK_DOWN;
mSDL2_to_Win[ SDLK_RIGHT ] = (U32)WindowsVK::VK_RIGHT;
mSDL2_to_Win[ SDLK_LEFT ] = (U32)WindowsVK::VK_LEFT;
mSDL2_to_Win[ SDLK_INSERT ] = (U32)WindowsVK::VK_INSERT;
mSDL2_to_Win[ SDLK_HOME ] = (U32)WindowsVK::VK_HOME;
mSDL2_to_Win[ SDLK_END ] = (U32)WindowsVK::VK_END;
mSDL2_to_Win[ SDLK_PAGEUP ] = (U32)WindowsVK::VK_PRIOR;
mSDL2_to_Win[ SDLK_PAGEDOWN ] = (U32)WindowsVK::VK_NEXT;
mSDL2_to_Win[ SDLK_F1 ] = (U32)WindowsVK::VK_F1;
mSDL2_to_Win[ SDLK_F2 ] = (U32)WindowsVK::VK_F2;
mSDL2_to_Win[ SDLK_F3 ] = (U32)WindowsVK::VK_F3;
mSDL2_to_Win[ SDLK_F4 ] = (U32)WindowsVK::VK_F4;
mSDL2_to_Win[ SDLK_F5 ] = (U32)WindowsVK::VK_F5;
mSDL2_to_Win[ SDLK_F6 ] = (U32)WindowsVK::VK_F6;
mSDL2_to_Win[ SDLK_F7 ] = (U32)WindowsVK::VK_F7;
mSDL2_to_Win[ SDLK_F8 ] = (U32)WindowsVK::VK_F8;
mSDL2_to_Win[ SDLK_F9 ] = (U32)WindowsVK::VK_F9;
mSDL2_to_Win[ SDLK_F10 ] = (U32)WindowsVK::VK_F10;
mSDL2_to_Win[ SDLK_F11 ] = (U32)WindowsVK::VK_F11;
mSDL2_to_Win[ SDLK_F12 ] = (U32)WindowsVK::VK_F12;
mSDL2_to_Win[ SDLK_F13 ] = (U32)WindowsVK::VK_F13;
mSDL2_to_Win[ SDLK_F14 ] = (U32)WindowsVK::VK_F14;
mSDL2_to_Win[ SDLK_F15 ] = (U32)WindowsVK::VK_F15;
mSDL2_to_Win[ SDLK_CAPSLOCK ] = (U32)WindowsVK::VK_CAPITAL;
mSDL2_to_Win[ SDLK_RSHIFT ] = (U32)WindowsVK::VK_SHIFT;
mSDL2_to_Win[ SDLK_LSHIFT ] = (U32)WindowsVK::VK_SHIFT;
mSDL2_to_Win[ SDLK_RCTRL ] = (U32)WindowsVK::VK_CONTROL;
mSDL2_to_Win[ SDLK_LCTRL ] = (U32)WindowsVK::VK_CONTROL;
mSDL2_to_Win[ SDLK_RALT ] = (U32)WindowsVK::VK_MENU;
mSDL2_to_Win[ SDLK_LALT ] = (U32)WindowsVK::VK_MENU;
mSDL2_to_Win[ SDLK_MENU ] = (U32)WindowsVK::VK_MENU;
// VK_MODECHANGE ?
// mSDL2_to_Win[ SDLK_MODE ] = (U32)WindowsVK::VK_MODE;
// ?
// mSDL2_to_Win[ SDLK_SYSREQ ] = (U32)WindowsVK::VK_SYSREQ;
// mSDL2_to_Win[ SDLK_POWER ] = (U32)WindowsVK::VK_POWER;
// mSDL2_to_Win[ SDLK_UNDO ] = (U32)WindowsVK::VK_UNDO;
// mSDL2_to_Win[ SDLK_KP_EQUALS ] = (U32)WindowsVK::VK_EQUALS;
// mSDL2_to_Win[ 311 ] = (U32)WindowsVK::VK_LWIN;
// mSDL2_to_Win[ 312 ] = (U32)WindowsVK::VK_RWIN;
// mSDL2_to_Win[ SDLK_COLON ] = ?
}
auto itr = mSDL2_to_Win.find( aSymbol );
if( itr != mSDL2_to_Win.end() )
return itr->second;
return aSymbol;
}
#endif

View File

@ -0,0 +1,33 @@
#ifndef LL_LLKEYBOARDSDL2_H
#define LL_LLKEYBOARDSDL2_H
#include "llkeyboard.h"
#include "SDL2/SDL.h"
class LLKeyboardSDL : public LLKeyboard
{
public:
LLKeyboardSDL();
/*virtual*/ ~LLKeyboardSDL() {};
/*virtual*/ BOOL handleKeyUp(const U32 key, MASK mask);
/*virtual*/ BOOL handleKeyDown(const U32 key, MASK mask);
/*virtual*/ void resetMaskKeys();
/*virtual*/ MASK currentMask(BOOL for_mouse_event);
/*virtual*/ void scanKeyboard();
protected:
MASK updateModifiers(const U32 mask);
void setModifierKeyLevel( KEY key, BOOL new_state );
BOOL translateNumpadKey( const U32 os_key, KEY *translated_key );
U16 inverseTranslateNumpadKey(const KEY translated_key);
private:
std::map<U32, KEY> mTranslateNumpadMap; // special map for translating OS keys to numpad keys
std::map<KEY, U32> mInvTranslateNumpadMap; // inverse of the above
public:
static U32 mapSDL2toWin( U32 );
};
#endif

View File

@ -24,6 +24,10 @@
* $/LicenseInfo$
*/
#ifdef LL_SDL2
#include "llwindowsdl2.h"
#else
#ifndef LL_LLWINDOWSDL_H
#define LL_LLWINDOWSDL_H
@ -255,3 +259,4 @@ public:
S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 type);
#endif //LL_LLWINDOWSDL_H
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,261 @@
/**
* @file llwindowsdl.h
* @brief SDL implementation of LLWindow class
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLWINDOWSDL2_H
#define LL_LLWINDOWSDL2_H
// Simple Directmedia Layer (http://libsdl.org/) implementation of LLWindow class
#include "llwindow.h"
#include "lltimer.h"
#include "SDL2/SDL.h"
#include "SDL2/SDL_endian.h"
#if LL_X11
// get X11-specific headers for use in low-level stuff like copy-and-paste support
#include "SDL2/SDL_syswm.h"
#endif
// AssertMacros.h does bad things.
#include "fix_macros.h"
#undef verify
#undef require
class LLWindowSDL : public LLWindow
{
public:
/*virtual*/ void show();
/*virtual*/ void hide();
/*virtual*/ void close();
/*virtual*/ BOOL getVisible();
/*virtual*/ BOOL getMinimized();
/*virtual*/ BOOL getMaximized();
/*virtual*/ BOOL maximize();
/*virtual*/ void minimize();
/*virtual*/ void restore();
/*virtual*/ BOOL getFullscreen();
/*virtual*/ BOOL getPosition(LLCoordScreen *position);
/*virtual*/ BOOL getSize(LLCoordScreen *size);
/*virtual*/ BOOL getSize(LLCoordWindow *size);
/*virtual*/ BOOL setPosition(LLCoordScreen position);
/*virtual*/ BOOL setSizeImpl(LLCoordScreen size);
/*virtual*/ BOOL setSizeImpl(LLCoordWindow size);
/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);
/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);
/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position);
/*virtual*/ void showCursor();
/*virtual*/ void hideCursor();
/*virtual*/ void showCursorFromMouseMove();
/*virtual*/ void hideCursorUntilMouseMove();
/*virtual*/ BOOL isCursorHidden();
/*virtual*/ void updateCursor();
/*virtual*/ void captureMouse();
/*virtual*/ void releaseMouse();
/*virtual*/ void setMouseClipping( BOOL b );
/*virtual*/ void setMinSize(U32 min_width, U32 min_height, bool enforce_immediately = true);
/*virtual*/ BOOL isClipboardTextAvailable();
/*virtual*/ BOOL pasteTextFromClipboard(LLWString &dst);
/*virtual*/ BOOL copyTextToClipboard(const LLWString & src);
/*virtual*/ BOOL isPrimaryTextAvailable();
/*virtual*/ BOOL pasteTextFromPrimary(LLWString &dst);
/*virtual*/ BOOL copyTextToPrimary(const LLWString & src);
/*virtual*/ void flashIcon(F32 seconds);
/*virtual*/ F32 getGamma();
/*virtual*/ BOOL setGamma(const F32 gamma); // Set the gamma
/*virtual*/ U32 getFSAASamples();
/*virtual*/ void setFSAASamples(const U32 samples);
/*virtual*/ BOOL restoreGamma(); // Restore original gamma table (before updating gamma)
/*virtual*/ ESwapMethod getSwapMethod() { return mSwapMethod; }
/*virtual*/ void processMiscNativeEvents();
/*virtual*/ void gatherInput();
/*virtual*/ void swapBuffers();
/*virtual*/ void restoreGLContext() {};
/*virtual*/ void delayInputProcessing() { };
// handy coordinate space conversion routines
/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to);
/*virtual*/ BOOL convertCoords(LLCoordWindow from, LLCoordScreen *to);
/*virtual*/ BOOL convertCoords(LLCoordWindow from, LLCoordGL *to);
/*virtual*/ BOOL convertCoords(LLCoordGL from, LLCoordWindow *to);
/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordGL *to);
/*virtual*/ BOOL convertCoords(LLCoordGL from, LLCoordScreen *to);
/*virtual*/ LLWindowResolution* getSupportedResolutions(S32 &num_resolutions);
/*virtual*/ F32 getNativeAspectRatio();
/*virtual*/ F32 getPixelAspectRatio();
/*virtual*/ void setNativeAspectRatio(F32 ratio) { mOverrideAspectRatio = ratio; }
/*virtual*/ void beforeDialog();
/*virtual*/ void afterDialog();
/*virtual*/ BOOL dialogColorPicker(F32 *r, F32 *g, F32 *b);
/*virtual*/ void *getPlatformWindow();
/*virtual*/ void bringToFront();
/*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async);
/*virtual*/ void openFile(const std::string& file_name);
/*virtual*/ void setTitle(const std::string& title);
static std::vector<std::string> getDynamicFallbackFontList();
// Not great that these are public, but they have to be accessible
// by non-class code and it's better than making them global.
#if LL_X11
Window mSDL_XWindowID;
Display *mSDL_Display;
#endif
void (*Lock_Display)(void);
void (*Unlock_Display)(void);
#if LL_GTK
// Lazily initialize and check the runtime GTK version for goodness.
static bool ll_try_gtk_init(void);
#endif // LL_GTK
#if LL_X11
static Window get_SDL_XWindowID(void);
static Display* get_SDL_Display(void);
#endif // LL_X11
protected:
LLWindowSDL(LLWindowCallbacks* callbacks,
const std::string& title, int x, int y, int width, int height, U32 flags,
BOOL fullscreen, BOOL clearBg, BOOL disable_vsync, BOOL use_gl,
//BOOL ignore_pixel_depth, U32 fsaa_samples);
BOOL ignore_pixel_depth, U32 fsaa_samples, BOOL useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
~LLWindowSDL();
/*virtual*/ BOOL isValid();
/*virtual*/ LLSD getNativeKeyData();
//void initCursors();
void initCursors(BOOL useLegacyCursors); // <FS:LO> Legacy cursor setting from main program
void quitCursors();
void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
// Changes display resolution. Returns true if successful
BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
// Go back to last fullscreen display resolution.
BOOL setFullscreenResolution();
BOOL shouldPostQuit() { return mPostQuit; }
protected:
//
// Platform specific methods
//
// create or re-create the GL context/window. Called from the constructor and switchContext().
BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync);
void destroyContext();
void setupFailure(const std::string& text, const std::string& caption, U32 type);
void fixWindowSize(void);
U32 SDLCheckGrabbyKeys(U32 keysym, BOOL gain);
BOOL SDLReallyCaptureInput(BOOL capture);
//
// Platform specific variables
//
U32 mGrabbyKeyFlags;
int mReallyCapturedCount;
SDL_Window* mWindow;
SDL_Surface* mSurface;
SDL_GLContext mContext;
SDL_Cursor* mSDLCursors[UI_CURSOR_COUNT];
std::string mWindowTitle;
double mOriginalAspectRatio;
BOOL mNeedsResize; // Constructor figured out the window is too big, it needs a resize.
LLCoordScreen mNeedsResizeSize;
F32 mOverrideAspectRatio;
F32 mGamma;
U32 mFSAASamples;
int mSDLFlags;
int mHaveInputFocus; /* 0=no, 1=yes, else unknown */
int mIsMinimized; /* 0=no, 1=yes, else unknown */
friend class LLWindowManager;
private:
#if LL_X11
void x11_set_urgent(BOOL urgent);
BOOL mFlashing;
LLTimer mFlashTimer;
#endif //LL_X11
U32 mKeyVirtualKey;
U32 mKeyModifiers;
std::string mInputType;
BOOL mUseLegacyCursors; // <FS:LO> Legacy cursor setting from main program
public:
#if LL_X11
static Display* getSDLDisplay();
LLWString const& getPrimaryText() const { return mPrimaryClipboard; }
LLWString const& getSecondaryText() const { return mSecondaryClipboard; }
void clearPrimaryText() { mPrimaryClipboard.clear(); }
void clearSecondaryText() { mSecondaryClipboard.clear(); }
private:
void tryFindFullscreenSize( int &aWidth, int &aHeight );
void initialiseX11Clipboard();
bool getSelectionText(Atom selection, LLWString& text);
bool getSelectionText( Atom selection, Atom type, LLWString &text );
bool setSelectionText(Atom selection, const LLWString& text);
#endif
LLWString mPrimaryClipboard;
LLWString mSecondaryClipboard;
};
class LLSplashScreenSDL : public LLSplashScreen
{
public:
LLSplashScreenSDL();
virtual ~LLSplashScreenSDL();
/*virtual*/ void showImpl();
/*virtual*/ void updateImpl(const std::string& mesg);
/*virtual*/ void hideImpl();
};
S32 OSMessageBoxSDL(const std::string& text, const std::string& caption, U32 type);
#endif //LL_LLWINDOWSDL_H

View File

@ -857,6 +857,7 @@ set(viewer_SOURCE_FILES
llxmlrpctransaction.cpp
noise.cpp
particleeditor.cpp
permissionstracker.cpp
piemenu.cpp
pieseparator.cpp
pieslice.cpp
@ -1630,6 +1631,7 @@ set(viewer_HEADER_FILES
macmain.h
noise.h
particleeditor.h
permissionstracker.h
piemenu.h
pieseparator.h
pieslice.h
@ -2205,10 +2207,15 @@ add_executable(${VIEWER_BINARY_NAME}
)
if (SDL_FOUND)
set_property(TARGET ${VIEWER_BINARY_NAME}
PROPERTY COMPILE_DEFINITIONS LL_SDL=1
)
set_property(TARGET ${VIEWER_BINARY_NAME}
PROPERTY COMPILE_DEFINITIONS LL_SDL=1
)
endif (SDL_FOUND)
if (SDL2_FOUND)
set_property(TARGET ${VIEWER_BINARY_NAME}
PROPERTY COMPILE_DEFINITIONS LL_SDL2=1 LL_SDL=1
)
endif ()
if (USE_BUGSPLAT)
set_property(TARGET ${VIEWER_BINARY_NAME}

View File

@ -1 +1 @@
6.5.5
6.5.6

View File

@ -20985,7 +20985,7 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<real>0.0</real>
</map>
<key>StarLightShowMapDetails</key>
<key>FSShowMapDetails</key>
<map>
<key>Comment</key>
<string>Show the details panel on the side of the World Map</string>
@ -21929,6 +21929,30 @@ Change of this parameter will affect the layout of buttons in notification toast
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>CefVerboseLog</key>
<map>
<key>Comment</key>
<string>Enable/disable CEF verbose loggingk</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ResetUIScaleOnFirstRun</key>
<map>
<key>Comment</key>
<string>Resets the UI scale factor on first run due to changed display scaling behavior</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
<key>Backup</key>
<integer>0</integer>
</map>
<key>360CaptureUseInterestListCap</key>
<map>
@ -22007,30 +22031,19 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>3</integer>
</map>
<key>CefVerboseLog</key>
<map>
<key>Comment</key>
<string>Enable/disable CEF verbose loggingk</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ResetUIScaleOnFirstRun</key>
<map>
<key>Comment</key>
<string>Resets the UI scale factor on first run due to changed display scaling behavior</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
<key>Backup</key>
<integer>0</integer>
</map>
<key>MFAHash</key>
<map>
<key>Comment</key>
<string>Override MFA state hash for authentication</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string></string>
<key>Backup</key>
<integer>0</integer>
</map>
<key>FSShowServerVersionChangeNotice</key>
<map>
<key>Comment</key>
@ -24559,19 +24572,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>FSLatencyOneTimeFixRun</key>
<map>
<key>Comment</key>
<string>One time fix has run for this install for script dialog colors on Latency</string>
<key>Persist</key>
<integer>1</integer>
<key>HideFromEditor</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSUseCtrlShout</key>
<map>
<key>Comment</key>

View File

@ -1,774 +0,0 @@
<llsd>
<map>
<key>ShowNetStats</key>
<map>
<key>Comment</key>
<string>Show the Status Indicators for the Viewer and Network Usage in the Status Overlay.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>OpenSidePanelsInFloaters</key>
<map>
<key>Comment</key>
<string>Open Panels in Floaters</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<boolean>1</boolean>
</map>
<key>FSShowMouselookInstructions</key>
<map>
<key>Comment</key>
<string>If true, instructions about leaving Mouseview are displayed.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSColorClienttags</key>
<map>
<key>Comment</key>
<string>Color Client tags by: 0=Off, 1=Single color per Viewer, 2=User defined color (one color per UUID), 3=New Tagsystem Color </string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>2</integer>
</map>
<key>ShowRadarMinimap</key>
<map>
<key>Comment</key>
<string>Toggle visibility of the embedded minimap in the radar panel</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSUseNearbyChatConsole</key>
<map>
<key>Comment</key>
<string>Display popup chat embedded into the read-only world console (v1-style) instead of overlayed floaters (v2-style)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ShowScriptDialogsTopRight</key>
<map>
<key>Comment</key>
<string>Show script llDialog floaters always in the top right corner of the screen.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>EnableGroupChatPopups</key>
<map>
<key>Comment</key>
<string>Enable Incoming Group Chat Popups</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>EnableIMChatPopups</key>
<map>
<key>Comment</key>
<string>Enable Incoming IM Chat Popups</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PlainTextChatHistory</key>
<map>
<key>Comment</key>
<string>Enable/Disable plain text chat history style</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ShowChatMiniIcons</key>
<map>
<key>Comment</key>
<string>Toggles the display of mini icons in chat history</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSChatWindow</key>
<map>
<key>Comment</key>
<string>Show chat in multiple windows(by default) or in one multi-tabbed window(requires restart)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSUseWebProfiles</key>
<map>
<key>Comment</key>
<string>Shows web profiles instead of the v1-style profile floater</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSFolderViewItemHeight</key>
<map>
<key>Comment</key>
<string>Controls the height of folder items, for instance in inventory</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>18</integer>
</map>
<key>ShowGroupNoticesTopRight</key>
<map>
<key>Comment</key>
<string>Show group notifications to the top right corner of the screen.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSConsoleClassicDrawMode</key>
<map>
<key>Comment</key>
<string>Enables classic console draw mode (single background block over all lines with width of the longest line)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>ResetViewTurnsAvatar</key>
<map>
<key>Comment</key>
<string>This option keeps the camera direction and turns the avatar when Reset View is selected (hit ESC key).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSTrimLegacyNames</key>
<map>
<key>Comment</key>
<string>Trim &quot;Resident&quot; from Legacy Names</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSPaymentInfoInChat</key>
<map>
<key>Comment</key>
<string>If true, L$ balance changes will be shown in nearby chat instead of toasts.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSShowInboxFolder</key>
<map>
<key>Comment</key>
<string>If enabled, the Received Items folder aka Inbox is shown in the inventory as folder.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSUseLegacyInventoryAcceptMessages</key>
<map>
<key>Comment</key>
<string>If enabled, the viewer will send accept/decline response for inventory offers after the according button has been pressed and not if the item has been received at the receiver&apos;s inventory already.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSLogImToChatConsole</key>
<map>
<key>Comment</key>
<string>Defines if IM notifications should be sent to the nearby chat console (v1-style) or toasts (v2-style).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSLogGroupImToChatConsole</key>
<map>
<key>Comment</key>
<string>Defines if group IM notifications should be sent to the nearby chat console (v1-style) or toasts (v2-style).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSDisableIMChiclets</key>
<map>
<key>Comment</key>
<string>If enabled, Firestorm will not show any group / IM chat chiclets (notifications envelope and sum of IMs will remain on the screen).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSShowGroupNameLength</key>
<map>
<key>Comment</key>
<string>Max length of group name to be printed in chat (-1 for full group name, 0 for disabled).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>-1</integer>
</map>
<key>FSUseStandalonePlaceDetailsFloater</key>
<map>
<key>Comment</key>
<string>If enabled, Firestorm will use a standalone floater for each landmark details, teleport history details and parcel details view.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSUseStandaloneTeleportHistoryFloater</key>
<map>
<key>Comment</key>
<string>If enabled, Firestorm will use a standalone floater for the teleport history view.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSUseStandaloneBlocklistFloater</key>
<map>
<key>Comment</key>
<string>If enabled, Firestorm will use a standalone floater for the blocklist.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSEnableVolumeControls</key>
<map>
<key>Comment</key>
<string>If true, Firestorm will show volume controls (sounds, media, stream) in upper right corner of the screen. Useful, if skin already has its own controls.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<!-- Latency New -->
<key>ChatConsoleFontSize</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>Size of chat text in chat console (0 to 3, small to huge)</string>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<string>1</string>
</map>
<key>ChatOnlineNotification</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>Provide notifications for when friend log on and off of SL</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>OnlineOfflinetoNearbyChat</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Send online/offline notifications to Nearby Chat panel (v1-style behavior)</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>OnlineOfflinetoNearbyChatHistory</key>
<map>
<key>Backup</key>
<boolean>1</boolean>
<key>Comment</key>
<string>Show online/offline notifications only in chat history</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSColorUsername</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>Color username distinctly from the rest of the tag</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NameTagShowFriends</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Highlight the name tags of your friends</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NameTagShowUsernames</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Show usernames in avatar name tags</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSTagShowDistanceColors</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>If enabled, color other avatars' nametags based on their distance</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSTagShowDistance</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>If enabled, show distance to other avatars in their nametag.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>LetterKeysAffectsMovementNotFocusChatBar</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>When printable characters keys (possibly with Shift held) are pressed, the chat bar does not take focus and movement is affected instead (WASD etc.)</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<string>1</string>
</map>
<key>AutohideChatBar</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Hide the chat bar from the bottom button bar and only show it as an overlay when needed.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>MiniMapRotate</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>Rotate miniature world map to avatar direction</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>ShowNavbarFavoritesPanel</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>Show/hide navigation bar favorites panel</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<boolean>0</boolean>
</map>
<key>ShowSearchTopBar</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>Toggles whether the search field is displayed at the top of the viewer</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<boolean>0</boolean>
</map>
<key>SkinCurrent</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>The currently selected skin.</string>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>latency</string>
</map>
<key>SkinCurrentTheme</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>The selected theme for the current skin.</string>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string />
</map>
<key>FSSkinCurrentReadableName</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>The readable name of the currently selected skin.</string>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>Latency</string>
</map>
<key>FSSkinCurrentThemeReadableName</key>
<map>
<key>Persist</key>
<boolean>1</boolean>
<key>Comment</key>
<string>The readable name of the selected theme for the current skin.</string>
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>Extra Plain</string>
</map>
<key>FSLegacyMinimize</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Minimize floaters to bottom left instead of top left.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSGroupNotifyNoTransparency</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>If true, group notices will be shown opaque and ignore the floater opacity settings.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSScriptDialogNoTransparency</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>If true, script dialogs will be shown opaque and ignore the floater opacity settings.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>NotificationCanEmbedInIM</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Controls notification panel embedding in IMs (0 = default, 1 = focused, 2 = never)</string>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>2</integer>
</map>
<key>FSBetterGroupNoticesToIMLog</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Improved logging of group notices to group IM log.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSFadeGroupNotices</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Fade group notices. (V3 default: true)</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSSortFSFoldersToTop</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Sorts the #FS and #RLV folders to the top like system folders.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>MediaFilterSinglePrompt</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Use a single legacy style dialog for media filter prompt, instead of two seperate allow/deny and whitelist/blacklist prompts.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSEmphasizeShoutWhisper</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Enables bolding shouted chat and italicizing whispered chat</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSLegacyRadarFriendColoring</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Use old style for friends on the radar. Uses same color as minimap.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSLegacyRadarLindenColoring</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Color Lindens on the radar the same as the minimap.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>RenderHiddenSelections</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Show selection lines on objects that are behind other objects</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>RadarNameFormat</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>0=DisplayName,1=Username,2=Displayname/Username,3=Username/Displayname</string>
<key>Type</key>
<string>U32</string>
<key>Value</key>
<integer>2</integer>
</map>
<key>FSFlashOnMessage</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Flash/Bounce the app icon when a new message is recieved and Firestorm is not in focus</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>PlayModeUISndScriptFloaterOpen</key>
<map>
<key>Persist</key>
<integer>1</integer>
<key>Comment</key>
<string>Holds state for Prefs &gt; Sound/Media &gt; UI Sounds - UISndScriptFloaterOpen.</string>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PieMenuPopupFontEffect</key>
<map>
<key>Comment</key>
<string>If enabled, the labels in the pie menu slices are affected by the popup effect (they move into position).</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>PieMenuOuterRingShade</key>
<map>
<key>Comment</key>
<string>If enabled, a shade around the outside of the pie menu will be drawn, adding a further visualization of sub menus.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -80,7 +80,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>starlight</string>
<string>firestorm</string>
</map>
<key>SkinCurrentTheme</key>
@ -106,7 +106,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>Starlight</string>
<string>Firestorm</string>
</map>
<key>FSSkinCurrentThemeReadableName</key>

View File

@ -54,6 +54,9 @@ vec3 fullbrightScaleSoftClip(vec3 light);
uniform float minimum_alpha;
#endif
// <FS> Fullbright fog fix w/ gamma 0 workaround.
uniform float gamma;
void main()
{
#ifdef HAS_DIFFUSE_LOOKUP
@ -72,9 +75,15 @@ void main()
#endif
color.rgb *= vertex_color.rgb;
// <FS> Fullbright fog fix
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = fullbrightScaleSoftClip(color.rgb);
// <FS> Fullbright fog fix w/ gamma 0 workaround.
// color.rgb = fullbrightAtmosTransport(color.rgb);
// color.rgb = fullbrightScaleSoftClip(color.rgb);
if(gamma != 0.)
{
color.rgb = fullbrightAtmosTransport(color.rgb);
color.rgb = fullbrightScaleSoftClip(color.rgb);
}
// </FS> Fullbright fog fix w/ gamma 0 workaround.
#ifdef WATER_FOG
vec3 pos = vary_position;

View File

@ -289,7 +289,7 @@ void DesktopNotifierLinux::showNotification( const std::string& notification_tit
m_pLibNotify->mNotificationUpdate( m_pNotification,(gchar*)notification_title.c_str(), (gchar*)notification_message.c_str(), m_strIcon.c_str() );
m_pLibNotify->mNotificationSetUrgency( m_pNotification, NOTIFY_URGENCY_LOW );
m_pLibNotify->mNotificationSetUrgency( m_pNotification, NOTIFY_URGENCY_NORMAL );
m_pLibNotify->mNotificationSetCategory( m_pNotification, ( gchar* )notification_type.c_str() );
m_pLibNotify->mNotificationSetTimeout( m_pNotification, NOTIFICATION_TIMEOUT_MS ); // NotifyOSD ignores this, sadly.

View File

@ -492,7 +492,7 @@ bool FSCommon::isDefaultTexture(const LLUUID& asset_id)
bool FSCommon::isLegacySkin()
{
std::string current_skin = gSavedSettings.getString("FSInternalSkinCurrent");
return (current_skin == "Vintage" || current_skin == "Latency");
return (current_skin == "Vintage");
}
bool FSCommon::isFilterEditorKeyCombo(KEY key, MASK mask)

View File

@ -411,14 +411,7 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
static LLCachedControl<std::string> FSInternalSkinCurrent(gSavedSettings, "FSInternalSkinCurrent");
std::string skin_indicator(FSInternalSkinCurrent);
LLStringUtil::toLower(skin_indicator);
if (skin_indicator == "starlight cui")
{
skin_indicator = "sc"; // Separate "s" (StarLight) from "sc" (StarLight CUI)
}
else
{
skin_indicator = skin_indicator.substr(0, 1); // "FS 4.4.1f os", "FS 4.4.1v", "FS 4.4.1a", "FS 4.4.1s os", "FS 4.4.1m os" etc.
}
skin_indicator = skin_indicator.substr(0, 1); // "FS 4.4.1f os", "FS 4.4.1v", "FS 4.4.1a", "FS 4.4.1s os", "FS 4.4.1m os" etc.
// </FS:PP>
//Address size check

View File

@ -3464,17 +3464,6 @@ bool LLAppViewer::initConfiguration()
gLastRunVersion = gSavedSettings.getString("LastRunVersion");
loadColorSettings();
//<FS:KC> One time fix for Latency
if ((gLastRunVersion != LLVersionInfo::getInstance()->getChannelAndVersion()) && (gSavedSettings.getString("SkinCurrent") == "latency") && !gSavedSettings.getBOOL("FSLatencyOneTimeFixRun"))
{
LL_INFOS() << "FSLatencyOneTimeFix: Fixing script dialog colors." << LL_ENDL;
// Replace previously saved script dialog colors with new defaults, which happen to be the same as the group notice colors
LLUIColorTable::instance().setColor("ScriptDialog", LLUIColorTable::instance().getColor("GroupNotifyDialogBG", LLColor4::grey4));
LLUIColorTable::instance().setColor("ScriptDialogFg", LLUIColorTable::instance().getColor("GroupNotifyTextColor", LLColor4::white));
}
gSavedSettings.setBOOL("FSLatencyOneTimeFixRun", TRUE);
//</FS:KC>
// Let anyone else who cares know that we've populated our settings
// variables.

View File

@ -5209,34 +5209,6 @@ void LLPanelPreferenceSkins::apply()
gSavedSettings.setBOOL("ResetToolbarSettings", TRUE);
}
if (m_Skin == "starlight" || m_Skin == "starlightcui")
{
std::string noteMessage;
if (gSavedSettings.getBOOL("ShowMenuBarLocation"))
{
noteMessage = LLTrans::getString("skin_defaults_starlight_location");
gSavedSettings.setBOOL("ShowMenuBarLocation", FALSE);
}
if (!gSavedSettings.getBOOL("ShowNavbarNavigationPanel"))
{
if (!noteMessage.empty())
{
noteMessage += "\n";
}
noteMessage += LLTrans::getString("skin_defaults_starlight_navbar");
gSavedSettings.setBOOL("ShowNavbarNavigationPanel", TRUE);
}
if (!noteMessage.empty())
{
LLSD args;
args["MESSAGE"] = noteMessage;
LLNotificationsUtil::add("SkinDefaultsChangeSettings", args, LLSD(), boost::bind(&LLPanelPreferenceSkins::showSkinChangeNotification, this));
return;
}
}
// </FS:AO>
showSkinChangeNotification();

View File

@ -29,6 +29,8 @@
#include "llfollowcam.h"
#include "llagent.h"
#include "permissionstracker.h"
//-------------------------------------------------------
// constants
//-------------------------------------------------------
@ -829,11 +831,13 @@ void LLFollowCamMgr::setCameraActive( const LLUUID& source, bool active )
if (found_it != mParamStack.end())
{
mParamStack.erase(found_it);
PermissionsTracker::instance().removePermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
}
// put on top of stack
if(active)
{
mParamStack.push_back(params);
PermissionsTracker::instance().addPermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
}
}
@ -843,6 +847,8 @@ void LLFollowCamMgr::removeFollowCamParams(const LLUUID& source)
LLFollowCamParams* params = getParamsForID(source);
mParamMap.erase(source);
delete params;
PermissionsTracker::instance().removePermissionsEntry(source, PermissionsTracker::PERM_FOLLOWCAM);
}
bool LLFollowCamMgr::isScriptedCameraSource(const LLUUID& source)

View File

@ -61,6 +61,7 @@
#include "lltrans.h"
#include <boost/scoped_ptr.hpp>
#include <boost/regex.hpp>
#include <sstream>
const S32 LOGIN_MAX_RETRIES = 0; // Viewer should not autmatically retry login
@ -239,8 +240,9 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params["id0"] = mSerialNumber;
request_params["host_id"] = gSavedSettings.getString("HostID");
request_params["extended_errors"] = true; // request message_id and message_args
request_params["token"] = "";
// log request_params _before_ adding the credentials
// log request_params _before_ adding the credentials or sensitive MFA hash data
LL_DEBUGS("LLLogin") << "Login parameters: " << LLSDOStreamer<LLSDNotationFormatter>(request_params) << LL_ENDL;
// Copy the credentials into the request after logging the rest
@ -253,6 +255,33 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
request_params[it->first] = it->second;
}
std::string mfa_hash = gSavedSettings.getString("MFAHash"); //non-persistent to enable testing
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id = user_credential->userID();
if (gSecAPIHandler)
{
if (mfa_hash.empty())
{
// normal execution, mfa_hash was not set from debug setting so load from protected store
LLSD data_map = gSecAPIHandler->getProtectedData("mfa_hash", grid);
if (data_map.isMap() && data_map.has(user_id))
{
mfa_hash = data_map[user_id].asString();
}
}
else
{
// SL-16888 the mfa_hash is being overridden for testing so save it for consistency for future login requests
gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, mfa_hash);
}
}
else
{
LL_WARNS() << "unable to access protected store for mfa_hash" << LL_ENDL;
}
request_params["mfa_hash"] = mfa_hash;
// Specify desired timeout/retry options
LLSD http_params;
F32 srv_timeout = llclamp(gSavedSettings.getF32("LoginSRVTimeout"), LOGIN_SRV_TIMEOUT_MIN, LOGIN_SRV_TIMEOUT_MAX);
@ -425,6 +454,38 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
boost::bind(&LLLoginInstance::syncWithUpdater, this, resp, _1, _2));
}
}
else if(reason_response == "mfa_challenge")
{
LL_DEBUGS("LLLogin") << " MFA challenge" << LL_ENDL;
if (gViewerWindow)
{
gViewerWindow->setShowProgress(FALSE, FALSE);
}
LLSD args(llsd::map( "MESSAGE", LLTrans::getString(response["message_id"]) ));
LLSD payload;
LLNotificationsUtil::add("PromptMFAToken", args, payload, [=](LLSD const & notif, LLSD const & response) {
bool continue_clicked = response["continue"].asBoolean();
std::string token = response["token"].asString();
LL_DEBUGS("LLLogin") << "PromptMFAToken: response: " << response << " continue_clicked" << continue_clicked << LL_ENDL;
// strip out whitespace - SL-17034/BUG-231938
token = boost::regex_replace(token, boost::regex("\\s"), "");
if (continue_clicked && !token.empty())
{
LL_INFOS("LLLogin") << "PromptMFAToken: token submitted" << LL_ENDL;
// Set the request data to true and retry login.
mRequestData["params"]["token"] = token;
reconnect();
} else {
LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL;
attemptComplete();
}
});
}
else if( reason_response == "key"
|| reason_response == "presence"
|| reason_response == "connect"

View File

@ -1909,7 +1909,11 @@ void LLModelPreview::updateStatusMessages()
NOHAVOK = 1,
DEGENERATE = 2,
TOOMANYHULLS = 4,
TOOMANYVERTSINHULL = 8
// <FS:Beq> fIRE-31602 thin mesh physics warning
// TOOMANYVERTSINHULL = 8
TOOMANYVERTSINHULL = 8,
TOOTHIN = 16
// </FS:Beq>
};
assert_main_thread();
@ -2018,10 +2022,22 @@ void LLModelPreview::updateStatusMessages()
mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH];
}
// <FS:Beq> fIRE-31602 thin mesh physics warning
static const float CONVEXIFICATION_SIZE_MESH {0.5};
auto smallest_axis = llmin(mPreviewScale.mV[0], mPreviewScale.mV[1]);
smallest_axis = llmin(smallest_axis, mPreviewScale.mV[2]);
smallest_axis *= 2.f;
if (smallest_axis < CONVEXIFICATION_SIZE_MESH)
{
has_physics_error |= PhysicsError::TOOTHIN;
}
// </FS:Beq<
mHasDegenerate = false;
{//check for degenerate triangles in physics mesh
U32 lod = LLModel::LOD_PHYSICS;
const LLVector4a scale(0.5f);
for (U32 i = 0; i < mModel[lod].size() && !mHasDegenerate; ++i)
{ //for each model in the lod
if (mModel[lod][i] && mModel[lod][i]->mPhysics.mHull.empty())
@ -2268,6 +2284,14 @@ void LLModelPreview::updateStatusMessages()
LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Error");
physStatusIcon->setImage(img);
}
// <FS:Beq> fIRE-31602 thin mesh physics warning
else if (has_physics_error & PhysicsError::TOOTHIN)
{
mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_too_thin"));
LLUIImagePtr img = LLUI::getUIImage("ModelImport_Status_Warning");
physStatusIcon->setImage(img);
}
// </FS:Beq>
else if (has_physics_error & PhysicsError::NOHAVOK)
{
mFMP->childSetValue("physics_status_message_text", mFMP->getString("phys_status_no_havok"));

View File

@ -691,7 +691,7 @@ void LLPanelStandStopFlying::reparent(LLFloaterMove* move_view)
// Attach to movement controls.
parent->removeChild(this);
// <FS:Ansariel> FIRE-9636: Resizable movement controls (for all skins except Starlight/CUI)
// <FS:Ansariel> FIRE-9636: Resizable movement controls
//move_view->addChild(this);
LLView* modes_container = move_view->findChildView("modes_container");
if (modes_container)

View File

@ -485,6 +485,9 @@ public:
const std::string& data_id,
const std::string& map_elem)=0;
// ensure protected store's map is written to storage
virtual void syncProtectedMap() = 0;
public:
virtual LLPointer<LLCredential> createCredential(const std::string& grid,
const LLSD& identifier,

View File

@ -1621,6 +1621,11 @@ void LLSecAPIBasicHandler::removeFromProtectedMap(const std::string& data_type,
}
}
void LLSecAPIBasicHandler::syncProtectedMap()
{
// TODO - consider unifing these functions
_writeProtectedData();
}
//
// Create a credential object from an identifier and authenticator. credentials are
// per credential name (was: grid).

View File

@ -278,6 +278,9 @@ public:
const std::string& data_id,
const std::string& map_elem);
// ensure protected store's map is written to storage
virtual void syncProtectedMap();
// credential management routines
virtual LLPointer<LLCredential> createCredential(const std::string& credName,

View File

@ -43,6 +43,10 @@
# include "llaudioengine_fmodstudio.h"
#endif
#ifdef LL_SDL2
#include "llaudioengine_sdl2.h"
#endif
#ifdef LL_OPENAL
#include "llaudioengine_openal.h"
#endif
@ -137,6 +141,7 @@
#include "llproxy.h"
#include "llproductinforequest.h"
#include "llqueryflags.h"
#include "llsecapi.h"
#include "llselectmgr.h"
#include "llsky.h"
#include "llstatview.h"
@ -997,6 +1002,11 @@ bool idle_startup()
}
#endif
#ifdef LL_SDL2
if( !gAudiop )
gAudiop = new LLAudioEngineSDL2();
#endif
#ifdef LL_OPENAL
#if !LL_WINDOWS
// if (NULL == getenv("LL_BAD_OPENAL_DRIVER"))
@ -1730,10 +1740,10 @@ bool idle_startup()
}
else
{
if (reason_response != "tos")
if (reason_response != "tos" && reason_response != "mfa_challenge")
{
// Don't pop up a notification in the TOS case because
// LLFloaterTOS::onCancel() already scolded the user.
// Don't pop up a notification in the TOS or MFA cases because
// the specialized floater has already scolded the user.
std::string error_code;
if(response.has("errorcode"))
{
@ -4740,6 +4750,17 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
LLViewerMedia::getInstance()->openIDSetup(openid_url, openid_token);
}
// Only save mfa_hash for future logins if the user wants their info remembered.
if(response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && gSavedSettings.getBOOL("RememberPassword"))
{
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id(gUserCredential->userID());
gSecAPIHandler->addToProtectedMap("mfa_hash", grid, user_id, response["mfa_hash"]);
// TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically
gSecAPIHandler->syncProtectedMap();
}
// <FS:Ansariel> OpenSim legacy economy support
#ifdef OPENSIM
if (!LLGridManager::instance().isInSecondLife())

View File

@ -168,6 +168,7 @@
#include "lltexturecache.h"
#include "llvovolume.h"
#include "particleeditor.h"
#include "permissionstracker.h"
using namespace LLAvatarAppearanceDefines;
@ -5450,6 +5451,9 @@ void handle_reset_camera_angles()
// Camera focus and offset with CTRL/SHIFT + Scroll wheel
gSavedSettings.getControl("FocusOffsetRearView")->resetToDefault();
gSavedSettings.getControl("CameraOffsetRearView")->resetToDefault();
// warn the user if there is a scripted followcam active that might stop a camera reset
PermissionsTracker::instance().warnFollowcam();
}
// </FS:Zi>

View File

@ -150,6 +150,7 @@
#include "llfloaterbump.h"
#include "llfloaterreg.h"
#include "llfriendcard.h"
#include "permissionstracker.h" // <FS:Zi> Permissions Tracker
#include "tea.h" // <FS:AW opensim currency support>
#include "NACLantispam.h"
#include "chatbar_as_cmdline.h"
@ -4733,6 +4734,8 @@ void process_object_properties(LLMessageSystem *msg, void**user_data)
{
explorer->requestNameCallback(msg);
}
PermissionsTracker::instance().objectPropertiesCallback(msg);
}
// </FS:Techwolf Lupindo> area search

View File

@ -3147,6 +3147,7 @@ void LLVOAvatarSelf::reportAvatarRezTime() const
//-- SUNSHINE CLEANUP - not clear we need any of this, may be sufficient to request server appearance in llviewermenu.cpp:handle_rebake_textures()
void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)
{
if(!isAgentAvatarValid()){ return; } // <FS:Beq/> Avoid force bak e on invalid avatar pointer (based on similar change by Rye)
LL_INFOS() << "TAT: forced full rebake. " << LL_ENDL;
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)

View File

@ -0,0 +1,274 @@
/**
* @file permissionstracker.cpp
* @brief Permissions Tracker implementation - Initially it's only tracking
* camera control permissions, to warn users about attachments or seats that
* took camera control permissions and might interfere with resetting the
* camera view.
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* Copyright (C) 2022, Zi Ree @ Second Life
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llagentdata.h" // for gAgentID anf gAgentSessionID
#include "llnotificationsutil.h"
#include "llslurl.h"
#include "lltrans.h"
#include "llviewermenu.h" // for handle_object_edit()
#include "llviewerregion.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h" // for gObjectList
#include "llvoavatarself.h" // for gAgentAvatarp
#include "llworld.h"
#include "permissionstracker.h"
#define PERMISSION_ENTRY_EXPIRY_TIME 3600.0
PermissionsTracker::PermissionsTracker()
: LLSingleton<PermissionsTracker>()
{
}
PermissionsTracker::~PermissionsTracker()
{
}
void PermissionsTracker::addPermissionsEntry(const LLUUID& source_id, PermissionsTracker::PERM_TYPE permission_type)
{
// find out if this is a new entry in the list
if (mPermissionsList.find(source_id) == mPermissionsList.end())
{
LL_DEBUGS("PermissionsTracker") << "Creating list entry for source " << source_id << LL_ENDL;
mPermissionsList[source_id].objectName = LLTrans::getString("LoadingData");
// find out if the object is still in reach
LLViewerObject* vo = gObjectList.findObject(source_id);
if (!vo)
{
mPermissionsList[source_id].objectName = LLTrans::getString("ObjectOutOfRange");
}
else
{
mPermissionsList[source_id].attachmentID = vo->getAttachmentItemID();
LL_DEBUGS("PermissionsTracker") << "Requesting ObjectProperties for source " << source_id << LL_ENDL;
// remember which object names we already requested
mRequestedIDs.push_back(source_id);
// send a request out to get this object's details
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ObjectSelect);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
msg->newMessageFast(_PREHASH_ObjectDeselect);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
msg->nextBlockFast(_PREHASH_ObjectData);
msg->addU32Fast(_PREHASH_ObjectLocalID, vo->getLocalID());
msg->sendReliable(gAgentAvatarp->getRegion()->getHost());
}
}
LL_DEBUGS("PermissionsTracker") << "Adding permission type " << permission_type << " to source " << source_id << LL_ENDL;
mPermissionsList[source_id].type |= permission_type;
mPermissionsList[source_id].time = LLDate(LLTimer::getTotalSeconds());
purgePermissionsEntries();
}
void PermissionsTracker::removePermissionsEntry(const LLUUID& source_id, PermissionsTracker::PERM_TYPE permission_type)
{
if (mPermissionsList.find(source_id) == mPermissionsList.end())
{
LL_DEBUGS("PermissionsTracker") << "Could not find list entry for source " << source_id << LL_ENDL;
return;
}
LL_DEBUGS("PermissionsTracker") << "Removing permissions type " << permission_type << " from source " << source_id << LL_ENDL;
mPermissionsList[source_id].type &= ~permission_type;
mPermissionsList[source_id].time = LLDate(LLTimer::getTotalSeconds());
purgePermissionsEntries();
}
void PermissionsTracker::purgePermissionsEntries()
{
F64 expiry_time = LLDate(LLTimer::getTotalSeconds()).secondsSinceEpoch() - PERMISSION_ENTRY_EXPIRY_TIME;
auto it = mPermissionsList.begin();
while (it != mPermissionsList.end())
{
if (it->second.type == PERM_TYPE::PERM_NONE && it->second.time.secondsSinceEpoch() < expiry_time)
{
LL_DEBUGS("PermissionsTracker") << "Erasing list entry for source " << it->first << LL_ENDL;
it = mPermissionsList.erase(it);
}
else
{
++it;
}
}
}
void PermissionsTracker::warnFollowcam()
{
std::string followcamList;
for (auto entry : mPermissionsList)
{
if (entry.second.type & PermissionsTracker::PERM_FOLLOWCAM)
{
if (entry.second.attachmentID.notNull())
{
std::string attachment_point = "???";
gAgentAvatarp->getAttachedPointName(entry.second.attachmentID, attachment_point);
LLSD args;
args["ATTACHMENT_POINT"] = attachment_point;
std::string verb = "select?name=" + LLURI::escape(entry.second.objectName);
followcamList += LLSLURL("inventory", entry.second.attachmentID, verb.c_str()).getSLURLString() + " " +
LLTrans::getString("WornOnAttachmentPoint", args) + "\n";
}
else
{
followcamList += LLSLURL("objectim", entry.first, "").getSLURLString() +
"?name=" + LLURI::escape(entry.second.objectName) +
"&owner=" + entry.second.ownerID.asString();
LLSD args;
std::string slurl = args["slurl"].asString();
if (slurl.empty())
{
LLViewerRegion* region = LLWorld::instance().getRegionFromPosAgent(gAgentAvatarp->getPositionAgent());
if(region)
{
LLSLURL region_slurl(region->getName(), gAgentAvatarp->getPositionAgent());
slurl = region_slurl.getLocationString();
}
}
followcamList += "&slurl=" + LLURI::escape(slurl) + "\n";
}
}
}
if (followcamList.empty())
{
return;
}
LLSD args;
args["SOURCES"] = followcamList;
LLNotificationsUtil::add("WarnScriptedCamera", args);
}
void PermissionsTracker::objectPropertiesCallback(LLMessageSystem* msg)
{
LL_DEBUGS("PermissionsTracker") << "Received ObjectProperties message." << LL_ENDL;
// if we weren't looking for any IDs, ignore this callback
if (mRequestedIDs.empty())
{
LL_DEBUGS("PermissionsTracker") << "No objects in request list." << LL_ENDL;
return;
}
// we might have received more than one answer in one block
S32 num = msg->getNumberOfBlocksFast(_PREHASH_ObjectData);
for (S32 index = 0; index < num; ++index)
{
LLUUID source_id;
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, source_id, index);
auto iter = std::find(mRequestedIDs.begin(), mRequestedIDs.end(), source_id);
// if this is one of the objects we were looking for, process the data
if (iter != mRequestedIDs.end())
{
// get the name of the object
std::string object_name;
msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, object_name, index);
LLUUID object_owner;
msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, object_owner, index);
LL_DEBUGS("PermissionsTracker") << "Received object name " << object_name
<< " and owner " << object_owner.asString() << " for source " << source_id << LL_ENDL;
// remove the object from the lookup list and add it to the known names list
mRequestedIDs.erase(iter);
mPermissionsList[source_id].objectName = object_name;
mPermissionsList[source_id].ownerID = object_owner;
LLAvatarName avatar_name;
if (LLAvatarNameCache::get(object_owner, &avatar_name))
{
LL_DEBUGS("PermissionsTracker") << "Found cached entry for owner " << object_owner.asString()
<< ": " << avatar_name.getCompleteName() << LL_ENDL;
mPermissionsList[source_id].ownerName = avatar_name.getCompleteName();
}
else
{
if (mAvatarNameCacheConnections.find(object_owner) != mAvatarNameCacheConnections.end())
{
boost::signals2::connection cb_connection = LLAvatarNameCache::get(object_owner, boost::bind(&PermissionsTracker::avatarNameCallback, this, _1, _2));
mAvatarNameCacheConnections.insert(std::make_pair(object_owner, cb_connection));
LL_DEBUGS("PermissionsTracker") << "Requesting avatar name for owner " << object_owner.asString() << LL_ENDL;
}
}
}
}
}
void PermissionsTracker::avatarNameCallback(const LLUUID& avatar_id, const LLAvatarName& avatar_name)
{
LL_DEBUGS("PermissionsTracker") << "Received avatar name " << avatar_name.getCompleteName() << LL_ENDL;
auto iter = mAvatarNameCacheConnections.find(avatar_id);
if (iter != mAvatarNameCacheConnections.end())
{
if (iter->second.connected())
{
iter->second.disconnect();
}
mAvatarNameCacheConnections.erase(iter);
}
for (auto entry : mPermissionsList)
{
if (entry.second.ownerID == avatar_id)
{
LL_DEBUGS("PermissionsTracker") << "Saved avatar name " << avatar_name.getCompleteName()<< " for source " << entry.first.asString() << LL_ENDL;
entry.second.ownerName = avatar_name.getCompleteName();
}
}
}

View File

@ -0,0 +1,86 @@
/**
* @file permissionstracker.h
* @brief Permissions Tracker declaration
*
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* Copyright (C) 2022, Zi Ree @ Second Life
*
* 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
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef PERMISSIONSTRACKER_H
#define PERMISSIONSTRACKER_H
#include "llfloater.h"
#include "llsingleton.h"
// --------------------------------------------------------------------------
// PermissionsTracker: holds a list of requested script permissions to be
// referred to e.g. when trying to reset the camera view and a script is
// holding a follow cam which micht prevent it from working.
// --------------------------------------------------------------------------
class PermissionsTracker
: public LLSingleton<PermissionsTracker>
{
LLSINGLETON(PermissionsTracker);
~PermissionsTracker();
public:
enum PERM_TYPE
{
PERM_NONE = 0,
PERM_FOLLOWCAM = 1,
};
struct PermissionsEntry
{
LLUUID ownerID; // agent who owns the requesting object
LLUUID attachmentID; // attachment ID in inventory for attached objects
std::string ownerName;
std::string objectName;
LLDate time; // time when the permission was granted
U32 type; // what kind of permissions were granted
};
std::map<LLUUID, PermissionsEntry> mPermissionsList; // UUID of the requesting object
void addPermissionsEntry(
const LLUUID& source_id,
PermissionsTracker::PERM_TYPE permission_type); // called in llviewermessage.cpp
void removePermissionsEntry(
const LLUUID& source_id,
PermissionsTracker::PERM_TYPE permission_type); // called in llviewermessage.cpp
void purgePermissionsEntries();
void objectPropertiesCallback(LLMessageSystem* msg);
void avatarNameCallback(const LLUUID& avatar_id, const LLAvatarName& av_name);
void warnFollowcam(); // Warn the user if a script is holding followcam parameters
std::vector<LLUUID> mRequestedIDs; // list of object IDs we requested named for
typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;
avatar_name_cache_connection_map_t mAvatarNameCacheConnections;
};
#endif // PERMISSIONSTRACKER_H

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -834,18 +834,9 @@ with the same filename but different name
<texture name="skin firestorm blue" file_name="skinspreview/fs_blue.jpg" preload="true" />
<texture name="skin firestorm high contrast" file_name="skinspreview/fs_contrast.jpg" preload="true" />
<texture name="skin firestorm ctrlaltstudio" file_name="skinspreview/fs_ctrlaltstudio.jpg" preload="true" />
<texture name="skin latency (beta) extra plain" file_name="skinspreview/lat_plain.jpg" preload="true" />
<texture name="skin metaharper modern coolocean" file_name="skinspreview/meta_coolocean.jpg" preload="true" />
<texture name="skin metaharper modern appalachiansky" file_name="skinspreview/meta_appalachia.jpg" preload="true" />
<texture name="skin metaharper modern blackglass" file_name="skinspreview/meta_blackglass.jpg" preload="true" />
<texture name="skin starlight original orange" file_name="skinspreview/slight_orange.jpg" preload="true" />
<texture name="skin starlight original teal" file_name="skinspreview/slight_teal.jpg" preload="true" />
<texture name="skin starlight mono teal" file_name="skinspreview/slight_mteal.jpg" preload="true" />
<texture name="skin starlight nostalgia blue" file_name="skinspreview/slight_nblue.jpg" preload="true" />
<texture name="skin starlight silver blue" file_name="skinspreview/slight_sblue.jpg" preload="true" />
<texture name="skin starlight silver pink" file_name="skinspreview/slight_spink.jpg" preload="true" />
<texture name="skin starlight cui custom dark" file_name="skinspreview/scui_dark.jpg" preload="true" />
<texture name="skin starlight cui custom light" file_name="skinspreview/scui_light.jpg" preload="true" />
<texture name="skin vintage classic" file_name="skinspreview/vintage_classic.jpg" preload="true" />
<texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />
@ -1022,16 +1013,13 @@ with the same filename but different name
<texture name="System_Notification" file_name="icons/SL_Logo.png" preload="true"/>
<texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/>
<texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/>
<!-- StarLight Textures -->
<texture name="SpeakBtn_Left_Selected_Press" file_name="widgets/SpeakBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SpeakBtn_Left_Off" file_name="widgets/SpeakBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SpeakBtn_Right_Selected_Press" file_name="widgets/SpeakBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SpeakBtn_Right_Off" file_name="widgets/SpeakBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<!-- Firestorm Textures -->
<texture name="SpeakBtn_Left_Selected_Press" file_name="widgets/SpeakBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SpeakBtn_Left_Off" file_name="widgets/SpeakBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SpeakBtn_Right_Selected_Press" file_name="widgets/SpeakBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SpeakBtn_Right_Off" file_name="widgets/SpeakBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="profile_icon_24x24" file_name="icons/profile_icon_24x24.png" preload="false" />
<texture name="sale_icon_24x24" file_name="icons/sale_icon_24x24.png" preload="false" />
<texture name="call_icon_24x24" file_name="icons/call_icon_24x24.png" preload="false" />

View File

@ -36,8 +36,6 @@ Zusätzlicher Programmcode von:
Besonderer Dank gilt unserem Firestorm-Support-Team sowie den Wiki-Autoren, Schulungsleitern und Übersetzern:
</text>
<text name="fs_art_intro" >
Firestorm enthält Starlight, modifiziert für Firestorm. Es ist von Einwohnern für Einwohner und hat das Ziel, eine alternative, freundlichere und hoffentlich einfacher zu bedienende Oberfläche bereitzustellen. Für weitere Details, siehe &lt;nolink&gt;https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight&lt;/nolink&gt;.
UI-Künstler und Designer:
</text>
</panel>

View File

@ -76,6 +76,9 @@
<string name="phys_status_no_havok">
Diese Version enthält keine Havok-Unterstützung und wird nicht für das Hochladen von Physik in Second Life empfohlen. Unvorhersehbare Ergebnisse sind möglich!
</string>
<string name="phys_status_too_thin">
Eine oder mehrere Dimensionen sind kleiner als 0,5m - nur Hüllen-basierte (analysierte) physische Formen werden korrekt funktionieren.
</string>
<string name="phys_status_unknown_error">
Ein unbekannter Fehler ist aufgetreten.
</string>

View File

@ -4839,8 +4839,15 @@ Bitte kopieren Sie diese in Ihr Inventar und versuchen Sie es erneut.
Test-Ergebnis für gip-Level 6 Datei-Komprimierung für [FILE] mit Größe [SIZE] KB:
Packen: [PACK_TIME]s [PSIZE]KB
Entpacken: [UNPACK_TIME]s [USIZE]KB
<tag>fail</tag>
</notification>
<tag>fail</tag>
</notification>
<notification label="Eingabe MFA-Token" name="PromptMFAToken">
[MESSAGE]
<form name="form">
<button name="continue" text="Fortsetzen"/>
<button name="cancel" text="Abbrechen"/>
</form>
</notification>
<notification name="NoValidEnvSettingFound">
Keine gültige Einstellung für die Umgebung ausgewählt.
@ -5544,4 +5551,9 @@ Falls Sie diesen Nutzungsbestimmungen nicht zustimmen, sollten keinerlei finanzi
URL auf Standard zurücksetzen?
<usetemplate name="okcancelbuttons" notext="Nächstes Mal erinnern" yestext="Zurücksetzen"/>
</notification>
<notification name="WarnScriptedCamera">
Zurücksetzen der Kamera könnte durch folgende Objekte verhindert werden:
[SOURCES]
</notification>
</notifications>

View File

@ -249,6 +249,7 @@ http://secondlife.com/viewer-access-faq
Stellen Sie sicher, dass Sie die richtigen Informationen eingegeben haben:
* Benutzername (wie robertschmidt12 oder warme.sonne)
* Kennwort
* Zwei-Faktor-Token (falls aktiviert)
Stellen Sie außerdem sicher, dass die Umschaltsperre deaktiviert ist.
</string>
<string name="LoginFailedPasswordChanged">
@ -358,6 +359,10 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="LoginFailedLoggingOutSession">
Das System hat begonnen, Ihre letzte Sitzung abzumelden.
Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
</string>
<string name="LoginFailedAuthenticationMFARequired">
Um die Anmeldung fortzusetzen, geben Sie bitte ein neues Token aus Ihrer Multifaktor-Authentifizierungs-App ein.
Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich an support@secondlife.com.
</string>
<string name="AgentLostConnection">
In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
@ -7039,13 +7044,6 @@ Ihre aktuelle Position: [AVATAR_POS]
Fehler beim Cachen der eingebundenen Datei „[FILENAME]“.
</string>
<string name="skin_defaults_starlight_location">
Die Anzeige der aktuellen Position in der Menüleiste wurde als Standard für Starlight-Oberflächendesigns deaktiviert.
</string>
<string name="skin_defaults_starlight_navbar">
Die Anzeige der Navigationsleiste wurde als Standard für Starlight-Oberflächendesigns aktiviert.
</string>
<string name="animation_explorer_seconds_ago">
Vor [SECONDS] Sekunden
</string>

View File

@ -91,7 +91,7 @@ Dummy Name replaced at run time
</text_editor>
</panel>
<panel
height="905"
height="847"
border="true"
label="Firestorm Credits"
help_topic="about_fscredits_tab"
@ -144,7 +144,7 @@ Ansariel Hiller, ArminWeatherHax, Arrehn Oberlander, Beq Janus, Cinder Roxley, H
</text>
<text
follows="top|left"
height="10"
height="15"
layout="topleft"
left="5"
name="fs_contrib_intro"
@ -194,15 +194,13 @@ Afrika Burton, Albatroz Hird, Alexru Resident, alison Seesaw, AnaLucia Loon, Ang
</text>
<text
follows="top|left"
height="78"
height="15"
layout="topleft"
left="5"
name="fs_art_intro"
top_pad="8"
width="450"
wrap="true">
Firestorm includes Starlight, modified for Firestorm. It is provided by residents for residents, with the intention of providing an alternative, brighter, and hopefully easier to use interface. For further details see &lt;nolink&gt;https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight&lt;/nolink&gt;.
UI Artists and Designers:
</text>
<text

View File

@ -38,6 +38,7 @@
<string name="phys_status_hull_limit_exceeded">Some models exceed the hull limit (256); try 'simplify'.</string>
<string name="phys_status_degenerate_triangles">Physics mesh too dense; remove the small, thin triangles (see preview).</string>
<string name="phys_status_no_havok">This version contains no Havok support and is not recommended for physics upload in Second Life. Results may be unpredictable.</string>
<string name="phys_status_too_thin">One or more dimensions is less than 0.5m, only hull-based (analyzed) physics shapes will work correctly.</string>
<string name="phys_status_unknown_error">An unrecognized error was detected.</string>
<string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
<string name="decomposing">Analyzing...</string>

View File

@ -104,7 +104,7 @@
/>
<button
control_name="StarLightShowMapDetails"
control_name="FSShowMapDetails"
follows="all"
height="512"
image_unselected="Arrow_Left_Unscaled"
@ -128,7 +128,7 @@
left_delta="0"
min_width="258"
height="512"
visibility_control="StarLightShowMapDetails"
visibility_control="FSShowMapDetails"
auto_resize="false"
name="map_details_panel">
<panel

View File

@ -13728,6 +13728,27 @@ Unpacking: [UNPACK_TIME]s [USIZE]KB
<tag>fail</tag>
</notification>
<notification
icon="alertmodal.tga"
label="Prompt for MFA Token"
name="PromptMFAToken"
type="alertmodal">
[MESSAGE]
<tag>confirm</tag>
<form name="form">
<input name="token" type="text" width="400" />
<button
default="true"
index="0"
name="continue"
text="Continue"/>
<button
index="1"
name="cancel"
text="Cancel"/>
</form>
</notification>
<notification
icon="notify.tga"
name="NoValidEnvSettingFound"
@ -13790,4 +13811,14 @@ Reset the URL to default?
notext="Remind me next time"
yestext="Reset"/>
</notification>
<notification
icon="notifytip.tga"
name="WarnScriptedCamera"
type="notifytip">
Camera reset might be inhibited by the following objects:
[SOURCES]
</notification>
</notifications>

View File

@ -308,10 +308,6 @@
label="Hybrid"
name="Hybrid"
value="settings_hybrid.xml" />
<combo_box.item
label="Latency"
name="Latency"
value="settings_latency.xml" />
<combo_box.item
label="Text"
name="Text"

View File

@ -329,10 +329,6 @@
label="Hybrid"
name="Hybrid"
value="settings_hybrid.xml" />
<combo_box.item
label="Latency"
name="Latency"
value="settings_latency.xml" />
<combo_box.item
label="Text"
name="Text"

View File

@ -159,6 +159,7 @@ http://secondlife.com/viewer-access-faq</string>
Please check to make sure you entered the right
* Username (like bobsmith12 or steller.sunshine)
* Password
* Second Factor Token (if enabled)
Also, please make sure your Caps Lock key is off.</string>
<string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
Please go to your account page at http://secondlife.com/password
@ -218,7 +219,8 @@ Please try logging in again in a minute.</string>
Please try logging in again in a minute.</string>
<string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
Please try logging in again in a minute.</string>
<string name="LoginFailedAuthenticationMFARequired">To continue logging in, enter a new token from your multifactor authentication app.
If you feel this is an error, please contact support@secondlife.com</string>
<!-- Disconnection -->
<string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
@ -3159,10 +3161,6 @@ Your current position: [AVATAR_POS]
<string name="fs_preprocessor_caching_err">Error caching included file '[FILENAME]'</string>
<!-- </FS:Cron> -->
<!-- <FS:Zi> Notify user about preferences settings changes to skin defaults -->
<string name="skin_defaults_starlight_location">Showing your current location in the menu bar was disabled as a default for the Starlight skin series.</string>
<string name="skin_defaults_starlight_navbar">Showing the navigation bar was enabled as a default for the Starlight skin series.</string>
<!-- Animation Explorer -->
<string name="animation_explorer_seconds_ago">[SECONDS] seconds ago</string>
<string name="animation_explorer_still_playing">Still playing</string>
@ -3236,7 +3234,6 @@ Your current position: [AVATAR_POS]
<string name="mode_settings_phoenix.xml">Phoenix</string>
<string name="mode_settings_v3.xml">[VIEWER_GENERATION]</string>
<string name="mode_settings_hybrid.xml">Hybrid</string>
<string name="mode_settings_latency.xml">Latency</string>
<string name="mode_settings_text.xml">Text</string>
<string name="Asset_Uploading">Uploading...

View File

@ -60,10 +60,10 @@ Los Linden son,
con contribuciones de código de:
</text>
</panel>
<panel label="Créditos de Firestorm" name="fs_credits_panel" height="850">
<panel label="Créditos de Firestorm" name="fs_credits_panel" height="860">
<scroll_container name="fs_credits_scroll_container">
<panel name="fs_credits_scroll_container_content_panel">
<text name="firestorm_intro" height="110">
<text name="firestorm_intro" height="120">
Firestorm es un proyecto de desarrollo de la comunidad para mejorar la experiencia de uso del Visor de SecondLife(tm). Compilamos contribuciones de varios desarrolladores de la comunidad junto con el código de Linden lab y el nuestro propio para brindarte un visor de calidad, enriquecido con nuevas características y respaldado por un amplio equipo de voluntarios para darte soporte. Firestorm llega a ti a través de The Phoenix Firestorm Project, Inc., una organización sin ánimo de lucro.
Forman el Equipo de Desarrollo de Firestorm:
@ -75,8 +75,6 @@ Forman el Equipo de Desarrollo de Firestorm:
Agradecimientos especiales para nuestro Equipo de Soporte de Firestorm, editores del wiki, educadores, y traductores:
</text>
<text name="fs_art_intro" >
Firestorm incluye Starlight, modificado por Firestorm. Proporcionado por residentes para los residentes, con la intención de proveer una interfaz de uso alternativa, más luminosa y esperamos que más fácil de usar. Para más detalles ver &lt;nolink&gt;https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight&lt;/nolink&gt;.
Artistas y Diseñadores de la interfaz:
</text>
</panel>

View File

@ -41,14 +41,6 @@
<panel name="new_inventory_panel">
<button name="new_inv_btn" tool_tip="Ventana de inventario adicional"/>
</panel>
<!-- Used by StarLight skins -->
<panel name="collapse_panel">
<button label="Contraer" name="collapse_btn" tool_tip="Contraer todas las carpetas"/>
</panel>
<panel name="expand_panel">
<button label="Expandir" name="expand_btn" tool_tip="Expandir todas las carpetas"/>
</panel>
<!-- / Used by StarLight skins -->
<panel name="dummy_panel">
<text name="ItemcountText">
Items

View File

@ -6108,12 +6108,6 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas
<string name="TotalScriptCountChangeIncrease">El total de scripts en la región ha subido de [OLD_VALUE] a [NEW_VALUE] ([DIFFERENCE]).</string>
<string name="TotalScriptCountChangeDecrease">El total de scripts en la región ha bajado de [OLD_VALUE] a [NEW_VALUE] ([DIFFERENCE]).</string>
<string name="preproc_toggle_warning">La conmutación del preprocesador no será efectiva hasta que no cierres y reabras este editor.</string>
<string name="skin_defaults_starlight_location">
Mostrar tu localizacion actual en la barra de menú ha sido desactivado como opción por defecto en la serie de skins Starlight.
</string>
<string name="skin_defaults_starlight_navbar">
Mostrar la barra de navegación ha sido activado como opción por defecto en la serie de skins Starlight.
</string>
<string name="animation_explorer_seconds_ago">
Hace [SECONDS] segundos
</string>

View File

@ -21,4 +21,7 @@
<rows name="start_gesture">
<columns name="lst_action" value="Faire des gestes" />
</rows>
<rows name="script_trigger_lbutton">
<columns name="lst_action" value="Interagir (LMB)" />
</rows>
</contents>

View File

@ -25,10 +25,7 @@
</text>
<text name="fs_contrib_intro">Code additionnel pour Firestorm généreusement fourni par :</text>
<text name="fs_support_intro">Remerciements particuliers à notre équipe d'aide Firestorm, aux contributeurs wiki, éducateurs et traducteurs :</text>
<text name="fs_art_intro" height="70">
Firestorm intègre Starlight modifié pour Firestorm, développé par des résidents pour les résidents, dans le but d'offrir une interface alternative, plus claire et avec de la chance, plus simple à utiliser. Pour plus de détails, consulter &lt;nolink&gt;https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight&lt;/nolink&gt;
Création de l'interface :
</text>
<text name="fs_art_intro">Création de l'interface :</text>
</panel>
</scroll_container>
</panel>

View File

@ -1,406 +1,368 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Model Preview" title="CHARGEMENT DU MODELE">
<string name="status_idle"/>
<string name="status_parse_error">
Erreur : Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.
</string>
<string name="status_bind_shape_orientation">
Avertissement : la matrice de formes de reliure n&apos;est pas dans l&apos;orientation standard X-avant.
</string>
<string name="status_material_mismatch">
Erreur : le matériau du modèle ne correspond pas à un sous-ensemble du modèle de référence.
</string>
<string name="status_reading_file">
Chargement...
</string>
<string name="status_generating_meshes">
Génération des maillages...
</string>
<string name="status_vertex_number_overflow">
Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.
</string>
<string name="bad_element">
Erreur : élément non valide
</string>
<string name="high">
Élevé
</string>
<string name="medium">
Moyen
</string>
<string name="low">
Faible
</string>
<string name="lowest">
Le plus faible
</string>
<string name="mesh_status_good">
Bon à publier !
</string>
<string name="mesh_status_na">
N/A
</string>
<string name="mesh_status_none">
Aucun
</string>
<string name="mesh_status_submesh_mismatch">
Un nombre différent de faces d&apos;application de texture est associé aux niveaux de détail.
</string>
<string name="mesh_status_mesh_mismatch">
Un nombre différent d&apos;instances de maillage est associé aux niveaux de détail.
</string>
<string name="mesh_status_too_many_vertices">
Trop de sommets pour le niveau de détail.
</string>
<string name="mesh_status_missing_lod">
Niveau de détail requis manquant.
</string>
<string name="mesh_status_invalid_material_list">
Les options du niveau de détail ne sont pas une sous-ensemble d&apos;un modèle de référence.
</string>
<string name="phys_status_vertex_limit_exceeded">
Certaines enveloppes physiques dépassent les limites de sommets.
</string>
<string name="layer_all">
Tout
</string>
<string name="decomposing">
Analyse...
</string>
<string name="simplifying">
Simplification...
</string>
<string name="tbd">
TBD
</string>
<panel name="left_panel">
<panel name="model_name_representation_panel">
<text name="name_label">
Nom du modèle :
</text>
<text name="model_category_label">
Ce modèle représente...
</text>
<combo_box name="model_category_combo">
<combo_item label="Choisir une option..." name="Choose one"/>
<combo_item label="Silhouette de l&apos;avatar" name="Avatar shape"/>
<combo_item label="Éléments attachés aux avatars" name="Avatar attachment"/>
<combo_item label="Objet mobile (véhicule, animal)" name="Moving object (vehicle, animal)"/>
<combo_item label="Éléments pour la construction" name="Building Component"/>
<combo_item label="Important, immobile etc." name="Large, non moving etc"/>
<combo_item label="Plus petit, immobile etc." name="Smaller, non-moving etc"/>
<combo_item label="Aucun" name="Not really any of these"/>
<string name="no_havok">téléchargement du maillage avec physique</string>
<string name="status_parse_error">Erreur : Problème d&apos;analyse de fichier .dae ; reportez-vous au journal pour plus de détails.</string>
<string name="status_bind_shape_orientation">Avertissement : la matrice de formes de reliure n&apos;est pas dans l&apos;orientation standard X-avant.</string>
<string name="status_material_mismatch">Erreur : le matériau du modèle ne correspond pas à un sous-ensemble du modèle de référence.</string>
<string name="status_lod_model_mismatch">Error: Le modèle LOD n'a pas de parent.</string>
<string name="status_reading_file">Chargement...</string>
<string name="status_generating_meshes">Génération des maillages...</string>
<string name="status_vertex_number_overflow">Erreur : valeur de sommet supérieure à 65534. Opération abandonnée.</string>
<string name="bad_element">Erreur : élément non valide</string>
<string name="high">Élevé</string>
<string name="medium">Moyen</string>
<string name="low">Faible</string>
<string name="lowest">Le plus faible</string>
<string name="mesh_status_good">Bon à publier !</string>
<string name="mesh_status_na">N/A</string>
<string name="mesh_status_none">Aucun</string>
<string name="mesh_status_submesh_mismatch">Un nombre différent de faces d&apos;application de texture est associé aux niveaux de détail.</string>
<string name="mesh_status_mesh_mismatch">Un nombre différent d&apos;instances de maillage est associé aux niveaux de détail.</string>
<string name="mesh_status_too_many_vertices">Trop de sommets pour le niveau de détail.</string>
<string name="mesh_status_missing_lod">Niveau de détail requis manquant.</string>
<string name="mesh_status_invalid_material_list">Les options du niveau de détail ne sont pas une sous-ensemble d&apos;un modèle de référence.</string>
<string name="phys_status_vertex_limit_exceeded">Certaines enveloppes physiques dépassent les limites de sommets.</string>
<string name="phys_status_hull_limit_exceeded">Certains modèles dépassent la limite de la coque (256) ; essayez de "simplifier"..</string>
<string name="phys_status_degenerate_triangles">Maillage physique trop dense ; supprimez les petits et fins triangles (voir aperçu).</string>
<string name="phys_status_no_havok">Cette version ne contient pas de support Havok et n'est pas recommandée pour le chargement de physiques dans Second Life. Les résultats peuvent être imprévisibles.</string>
<string name="phys_status_too_thin">Une ou plusieurs dimensions sont inférieures à 0,5 m, seules les formes physiques basées sur la coque (analysées) fonctionneront correctement.</string>
<string name="phys_status_unknown_error">Une erreur inconnue a été détectée.</string>
<string name="layer_all">Tout</string>
<string name="decomposing">Analyse...</string>
<string name="simplifying">Simplification...</string>
<string name="TooManyJoint">Le skinning est désactivé en raison d'un trop grand nombre d'articulations : [JOINTS], maximum : [MAX]</string>
<string name="UnrecognizedJoint">Riggé à une articulation au nom inconnu [NAME]</string>
<string name="UnknownJoints">Skinning désactivé à cause de [COUNT] articulation inconnues.</string>
<string name="ModelLoaded">Modèle [MODEL_NAME] chargé</string>
<string name="IncompleteTC">Les données des coordonnées de la texture ne sont pas complètes.</string>
<panel name="left_panel">
<panel name="model_name_representation_panel">
<text name="name_label">
Nom du modèle :
</text>
<text name="model_category_label">
Ce modèle représente...
</text>
<combo_box name="model_category_combo">
<combo_item label="Choisir une option..." name="Choose one"/>
<combo_item label="Silhouette de l&apos;avatar" name="Avatar shape"/>
<combo_item label="Éléments attachés aux avatars" name="Avatar attachment"/>
<combo_item label="Objet mobile (véhicule, animal)" name="Moving object (vehicle, animal)"/>
<combo_item label="Éléments pour la construction" name="Building Component"/>
<combo_item label="Important, immobile etc." name="Large, non moving etc"/>
<combo_item label="Plus petit, immobile etc." name="Smaller, non-moving etc"/>
<combo_item label="Aucun" name="Not really any of these"/>
</combo_box>
</panel>
<tab_container name="import_tab">
<panel label="Niveau de détail" name="lod_panel" title="Niveau de détail">
<text initial_value="Source" name="source" value="Source"/>
<text initial_value="Triangles" name="triangles" value="Triangles"/>
<text initial_value="Sommets" name="vertices" value="Sommets"/>
<text initial_value="Élevé" name="high_label" value="Élevé"/>
<combo_box name="lod_source_high">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_high"/>
<combo_box name="lod_mode_high">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil derreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="high_triangles" value="0"/>
<text initial_value="0" name="high_vertices" value="0"/>
<text initial_value="Moyen" name="medium_label" value="Moyen"/>
<combo_box name="lod_source_medium">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_medium"/>
<combo_box name="lod_mode_medium">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil derreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="medium_triangles" value="0"/>
<text initial_value="0" name="medium_vertices" value="0"/>
<text initial_value="Faible" name="low_label" value="Faible"/>
<combo_box name="lod_source_low">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_low"/>
<combo_box name="lod_mode_low">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil derreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="low_triangles" value="0"/>
<text initial_value="0" name="low_vertices" value="0"/>
<text initial_value="Le plus faible" name="lowest_label" value="Le plus faible"/>
<combo_box name="lod_source_lowest">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_lowest"/>
<combo_box name="lod_mode_lowest">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil derreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="lowest_triangles" value="0"/>
<text initial_value="0" name="lowest_vertices" value="0"/>
<check_box label="Génération de normales" name="gen_normals"/>
<text initial_value="Angle pli :" name="crease_label" value="Angle pli :"/>
<spinner name="crease_angle" value="75"/>
</panel>
<tab_container name="import_tab">
<panel label="Niveau de détail" name="lod_panel" title="Niveau de détail">
<text initial_value="Source" name="source" value="Source"/>
<text initial_value="Triangles" name="triangles" value="Triangles"/>
<text initial_value="Sommets" name="vertices" value="Sommets"/>
<text initial_value="Élevé" name="high_label" value="Élevé"/>
<combo_box name="lod_source_high">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<panel label="Propriétés physiques" name="physics_panel">
<panel name="physics geometry">
<text name="first_step_name">
Étape 1 : Niveau de détail
</text>
<combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme des propriétés physiques.">
<combo_item name="choose_one">
Choisir une option...
</combo_item>
<combo_item name="physics_high">
Élevé
</combo_item>
<combo_item name="physics_medium">
Moyen
</combo_item>
<combo_item name="physics_low">
Faible
</combo_item>
<combo_item name="physics_lowest">
Le plus faible
</combo_item>
<combo_item name="physics_cube">
Cube
</combo_item>
<combo_item name="physics_hex">
Hexagone
</combo_item>
<combo_item name="physics_ud">
Défini par l'utilisateur
</combo_item>
<combo_item name="load_from_file">
Du fichier
</combo_item>
</combo_box>
<button label="Parcourir..." name="lod_browse_high"/>
<combo_box name="lod_mode_high">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil derreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="high_triangles" value="0"/>
<text initial_value="0" name="high_vertices" value="0"/>
<text initial_value="Moyen" name="medium_label" value="Moyen"/>
<combo_box name="lod_source_medium">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_medium"/>
<combo_box name="lod_mode_medium">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil derreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="medium_triangles" value="0"/>
<text initial_value="0" name="medium_vertices" value="0"/>
<text initial_value="Faible" name="low_label" value="Faible"/>
<combo_box name="lod_source_low">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_low"/>
<combo_box name="lod_mode_low">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil derreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="low_triangles" value="0"/>
<text initial_value="0" name="low_vertices" value="0"/>
<text initial_value="Le plus faible" name="lowest_label" value="Le plus faible"/>
<combo_box name="lod_source_lowest">
<item label="Depuis un fichier" name="Load from file" value="Depuis un fichier"/>
<item label="Génération" name="Generate" value="Génération"/>
<item label="Niveau de détail du dessus" name="Use LoD above" value="Niveau de détail du dessus"/>
</combo_box>
<button label="Parcourir..." name="lod_browse_lowest"/>
<combo_box name="lod_mode_lowest">
<item label="Triangles max" name="Triangle Limit" value="Triangles max"/>
<item label="Seuil derreur" name="Error Threshold" value="Seuil d&apos;erreur"/>
</combo_box>
<text initial_value="0" name="lowest_triangles" value="0"/>
<text initial_value="0" name="lowest_vertices" value="0"/>
<check_box label="Génération de normales" name="gen_normals"/>
<text initial_value="Angle pli :" name="crease_label" value="Angle pli :"/>
<spinner name="crease_angle" value="75"/>
<button label="Parcourir..." name="physics_browse"/>
</panel>
<panel label="Propriétés physiques" name="physics_panel">
<panel name="physics geometry">
<text name="first_step_name">
Étape 1 : Niveau de détail
</text>
<combo_box name="physics_lod_combo" tool_tip="Niveau de détail à utiliser pour la forme des propriétés physiques.">
<combo_item name="choose_one">
Choisir une option...
</combo_item>
<combo_item name="physics_high">
Élevé
</combo_item>
<combo_item name="physics_medium">
Moyen
</combo_item>
<combo_item name="physics_low">
Faible
</combo_item>
<combo_item name="physics_lowest">
Le plus faible
</combo_item>
<combo_item name="physics_cube">
Cube
</combo_item>
<combo_item name="physics_hex">
Hexagone
</combo_item>
<combo_item name="physics_ud">
Défini par l'utilisateur
</combo_item>
<combo_item name="load_from_file">
Du fichier
</combo_item>
</combo_box>
<button label="Parcourir..." name="physics_browse"/>
</panel>
<panel name="physics analysis">
<text name="method_label">
Étape 2 : Analyser
</text>
<text name="analysis_method_label">
Moyen :
</text>
<text name="quality_label">
Qualité :
</text>
<text name="smooth_method_label">
Lissage :
</text>
<check_box label="Fermer les trous" name="Close Holes (Slow)"/>
<button label="Analyser" name="Decompose"/>
<button label="Annuler" name="decompose_cancel"/>
</panel>
<panel name="physics simplification">
<text name="second_step_label">
Étape 3 : Simplifier
</text>
<text name="simp_method_header">
Moyen :
</text>
<text name="pass_method_header">
Passes :
</text>
<text name="Detail Scale label">
Échelle détail :
</text>
<text name="Retain%_label">
Retenue :
</text>
<combo_box name="Combine Quality" value="1"/>
<button label="Simplifier" name="Simplify"/>
<button label="Annuler" name="simplify_cancel"/>
</panel>
<panel name="physics info">
<text name="results_text">
Résultats :
</text>
<text name="physics_triangles">
Triangles : [TRIANGLES],
</text>
<text name="physics_points">
Sommets : [POINTS]
</text>
<text name="physics_hulls">
Enveloppes : [HULLS]
</text>
</panel>
<panel name="physics analysis">
<text name="method_label">
Étape 2 : Analyser
</text>
<text name="analysis_method_label">
Moyen :
</text>
<text name="quality_label">
Qualité :
</text>
<text name="smooth_method_label">
Lissage :
</text>
<check_box label="Fermer les trous" name="Close Holes (Slow)"/>
<button label="Analyser" name="Decompose"/>
<button label="Annuler" name="decompose_cancel"/>
</panel>
<panel label="Option de chargement" name="modifiers_panel">
<text name="scale_label">
Échelle (1 = aucune) :
<panel name="physics simplification">
<text name="second_step_label">
Étape 3 : Simplifier
</text>
<text name="dimensions_label">
Dimensions :
<text name="simp_method_header">
Moyen :
</text>
<text name="import_dimensions">
[X] X [Y] X [Z]
<text name="pass_method_header">
Passes :
</text>
<check_box label="Inclure les textures" name="upload_textures"/>
<text name="Detail Scale label">
Échelle détail :
</text>
<text name="Retain%_label">
Retenue :
</text>
<combo_box name="Combine Quality" value="1"/>
<button label="Simplifier" name="Simplify"/>
<button label="Annuler" name="simplify_cancel"/>
</panel>
<panel label="Outrepasser" title="Avatar" name="rigging_panel">
<check_box label="Inclure pondération de la peau :" name="upload_skin"/>
<check_box label="Inclure position des articulations :" name="upload_joints"/>
<check_box label="Verrouiller léchelle si la position des articulations est définie" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Décalage Z (élever/abaisser l&apos;avatar) :
<panel name="physics info">
<text name="results_text">
Résultats :
</text>
<text name="skin_too_many_joints">
Trop d'articulations texturées
<text name="physics_triangles">
Triangles : [TRIANGLES],
</text>
<text name="skin_unknown_joint">
Le modèle a des articulations inconnues
<text name="physics_points">
Sommets : [POINTS]
</text>
<text name="joints_descr">
Articulations :
<text name="physics_hulls">
Enveloppes : [HULLS]
</text>
<text name="conflicts_description">
[CONFLICTS] Conflits dans la/les articulations [JOINTS_COUNT]
</text>
<text name="pos_overrides_descr">
Position annulée pour l'articulation '[JOINT]':
</text>
<scroll_list name="pos_overrides_list">
<scroll_list.columns label="Modèle" name="model_name"/>
<scroll_list.columns label="X" name="axis_x"/>
<scroll_list.columns label="Y" name="axis_y"/>
<scroll_list.columns label="Z" name="axis_z"/>
</scroll_list>
</panel>
<panel label="Journal" name="logs_panel">
<check_box label="Afficher le journal détaillé" name="verbose_logging"/>
</panel>
<panel label="Réglages aperçu" name="mesh_preview_settings_panel">
<text name="mesh_upload_behaviour_label">
Chargement des modèles :
</text>
<check_box label="Activation automatique des poids" tool_tip="Régler automatiquement le poids des mesh avec les informations de rigging" name="mesh_preview_auto_weights"/>
<check_box label="Visualisation automatique des poids" tool_tip="Visualiser automatiquement les poids dans l'aperçu des meshes avec les info de rigging" name="mesh_preview_auto_show_weights"/>
<text name="mesh_preview_ud_preset_label">
Physique défini par l'utilisateur :
</text>
<line_editor name="ud_physics" tool_tip="Chemin d'accès complet vers un fichier Collada à utiliser pour les propriétés physiques."/>
<text name="mesh_preview_colors_label">
Couleurs de l'aperçu des modèles :
</text>
<text name="user_label">
Général :
</text>
<color_swatch label="Arrière-plan" tool_tip="Couleur d'arrière-plan pour l'uploader" name="mesh_preview_canvas_color"/>
<color_swatch label="Arêtes du modèle" tool_tip="Couleur des arêtes du modèle dans l'aperçu de l'uploader" name="mesh_preview_edge_color"/>
<text name="physics_settings_label">
Physiques :
</text>
<color_swatch label="Arêtes du physique" tool_tip="Couleur des arêtes pour les triangles du physique dans l'aperçu de l'uploader" name="mesh_preview_physics_edge_color"/>
<color_swatch label="Physique" tool_tip="Couleur de remplissage pour les physiques dans l'aperçu de l'uploader" name="mesh_preview_physics_fill_color"/>
<text name="physics_issues_setting_label">
Pb des physiques :
</text>
<color_swatch label="Mauvaises arêtes" tool_tip="Couleur des arêtes pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_preview_degenerate_edge_color"/>
<color_swatch label="Mauvais triangles" tool_tip="Couleur de remplissage pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_degenerate_fill_color"/>
</panel>
</tab_container>
<panel name="weights_and_warning_panel">
<button label="Calculer les poids et les frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
<button label="Annuler" name="cancel_btn"/>
<button label="Charger" name="ok_btn" tool_tip="Charger dans le simulateur"/>
<button label="Effacer les paramètres / réinitialiser" name="reset_btn"/>
<text name="upload_fee">
Frais de chargt : [FEE] L$
</panel>
<panel label="Option de chargement" name="modifiers_panel">
<text name="scale_label">
Échelle (1 = aucune) :
</text>
<text name="prim_weight">
Impact terrain : [EQ]
<text name="dimensions_label">
Dimensions :
</text>
<text name="download_weight">
Chargement : [ST]
<text name="import_dimensions">
[X] X [Y] X [Z]
</text>
<text name="physics_weight">
Physique : [PH]
<check_box label="Inclure les textures" name="upload_textures"/>
</panel>
<panel label="Outrepasser" title="Avatar" name="rigging_panel">
<check_box label="Inclure pondération de la peau :" name="upload_skin"/>
<check_box label="Inclure position des articulations :" name="upload_joints"/>
<check_box label="Verrouiller léchelle si la position des articulations est définie" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
Décalage Z (élever/abaisser l&apos;avatar) :
</text>
<text name="server_weight">
Serveur : [SIM]
<text name="skin_too_many_joints">
Trop d'articulations texturées
</text>
<panel name="price_breakdown_panel">
<text name="price_breakdown_title">
Répartition des coûts
</text>
<text name="price_breakdown_labels">
<text name="skin_unknown_joint">
Le modèle a des articulations inconnues
</text>
<text name="joints_descr">
Articulations :
</text>
<text name="conflicts_description">
[CONFLICTS] Conflits dans la/les articulations [JOINTS_COUNT]
</text>
<text name="pos_overrides_descr">
Position annulée pour l'articulation '[JOINT]':
</text>
<scroll_list name="pos_overrides_list">
<scroll_list.columns label="Modèle" name="model_name"/>
<scroll_list.columns label="X" name="axis_x"/>
<scroll_list.columns label="Y" name="axis_y"/>
<scroll_list.columns label="Z" name="axis_z"/>
</scroll_list>
</panel>
<panel label="Journal" name="logs_panel">
<check_box label="Afficher le journal détaillé" name="verbose_logging"/>
</panel>
<panel label="Réglages aperçu" name="mesh_preview_settings_panel">
<text name="mesh_upload_behaviour_label">
Chargement des modèles :
</text>
<check_box label="Activation automatique des poids" tool_tip="Régler automatiquement le poids des mesh avec les informations de rigging" name="mesh_preview_auto_weights"/>
<check_box label="Visualisation automatique des poids" tool_tip="Visualiser automatiquement les poids dans l'aperçu des meshes avec les info de rigging" name="mesh_preview_auto_show_weights"/>
<text name="mesh_preview_ud_preset_label">
Physique défini par l'utilisateur :
</text>
<line_editor name="ud_physics" tool_tip="Chemin d'accès complet vers un fichier Collada à utiliser pour les propriétés physiques."/>
<text name="mesh_preview_colors_label">
Couleurs de l'aperçu des modèles :
</text>
<text name="user_label">
Général :
</text>
<color_swatch label="Arrière-plan" tool_tip="Couleur d'arrière-plan pour l'uploader" name="mesh_preview_canvas_color"/>
<color_swatch label="Arêtes du modèle" tool_tip="Couleur des arêtes du modèle dans l'aperçu de l'uploader" name="mesh_preview_edge_color"/>
<text name="physics_settings_label">
Physiques :
</text>
<color_swatch label="Arêtes du physique" tool_tip="Couleur des arêtes pour les triangles du physique dans l'aperçu de l'uploader" name="mesh_preview_physics_edge_color"/>
<color_swatch label="Physique" tool_tip="Couleur de remplissage pour les physiques dans l'aperçu de l'uploader" name="mesh_preview_physics_fill_color"/>
<text name="physics_issues_setting_label">
Pb des physiques :
</text>
<color_swatch label="Mauvaises arêtes" tool_tip="Couleur des arêtes pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_preview_degenerate_edge_color"/>
<color_swatch label="Mauvais triangles" tool_tip="Couleur de remplissage pour les triangles dégénérés (fin) dans l'aperçu de l'uploader" name="mesh_degenerate_fill_color"/>
</panel>
</tab_container>
<panel name="weights_and_warning_panel">
<button label="Calculer les poids et les frais" name="calculate_btn" tool_tip="Calculer les poids et les frais."/>
<button label="Annuler" name="cancel_btn"/>
<button label="Charger" name="ok_btn" tool_tip="Charger dans le simulateur"/>
<button label="Effacer les paramètres / réinitialiser" name="reset_btn"/>
<text name="upload_fee">
Frais de chargt : [FEE] L$
</text>
<text name="prim_weight">
Impact terrain : [EQ]
</text>
<text name="download_weight">
Chargement : [ST]
</text>
<text name="physics_weight">
Physique : [PH]
</text>
<text name="server_weight">
Serveur : [SIM]
</text>
<panel name="price_breakdown_panel">
<text name="price_breakdown_title">
Répartition des coûts
</text>
<text name="price_breakdown_labels">
Chargement :
Physique :
Instances :
Textures :
Modèle :
</text>
</panel>
<!--
<text name="streaming_breakdown_labels">
</text>
</panel>
<!--
<text name="streaming_breakdown_labels">
Streaming/Téléchargement :
Élevé :
Moyen :
Bas :
Le plus bas :
</text>
-->
<panel name="physics_costs_panel">
<text name="physics_breakdown_title">
Coûts du physique
</text>
-->
<panel name="physics_costs_panel">
<text name="physics_breakdown_title">
Coûts du physique
</text>
<text name="physics_breakdown_labels">
<text name="physics_breakdown_labels">
Enveloppe :
Maillage :
Analysé :
</text>
</panel>
<panel name="preview_controls_panel">
<panel name="preview_controls_inner_panel">
<text name="preview_controls_title">
Contrôles de l'aperçu
</text>
<combo_box name="preview_lod_combo" tool_tip="Dargestelltes LOD in der Vorschau">
<combo_item name="high">Élevé</combo_item>
<combo_item name="medium">Moyen</combo_item>
<combo_item name="low">Faible</combo_item>
<combo_item name="lowest">Le plus faible</combo_item>
</combo_box>
</panel>
<check_box label="Arêtes" name="show_edges"/>
<check_box label="Textures" name="show_textures"/>
<check_box label="Guide UV" name="show_uv_guide"/>
<check_box label="Physique" name="show_physics"/>
<text name="exploder_label" width="105">
Aperçu :
</text>
<slider name="physics_explode" width="75" />
<check_box label="Poids" name="show_skin_weight"/>
<check_box label="Positions articul." name="show_joint_positions"/>
<check_box label="Surcharge pos. articulations" name="show_joint_overrides"/>
</panel>
<text name="warning_title">
Remarque :
</text>
<text name="warning_message">
Vous n&apos;avez pas la permission de charger des modèles de maillage. [[VURL] Savoir comment] obtenir la permission.
</text>
<text name="status">
[STATUS]
</text>
</panel>
<panel name="preview_controls_panel">
<panel name="preview_controls_inner_panel">
<text name="preview_controls_title">
Contrôles de l'aperçu
</text>
<combo_box name="preview_lod_combo" tool_tip="Dargestelltes LOD in der Vorschau">
<combo_item name="high">Élevé</combo_item>
<combo_item name="medium">Moyen</combo_item>
<combo_item name="low">Faible</combo_item>
<combo_item name="lowest">Le plus faible</combo_item>
</combo_box>
</panel>
<check_box label="Arêtes" name="show_edges"/>
<check_box label="Textures" name="show_textures"/>
<check_box label="Guide UV" name="show_uv_guide"/>
<check_box label="Physique" name="show_physics"/>
<text name="exploder_label" width="105">
Aperçu :
</text>
<slider name="physics_explode" width="75" />
<check_box label="Poids" name="show_skin_weight"/>
<check_box label="Positions articul." name="show_joint_positions"/>
<check_box label="Surcharge pos. articulations" name="show_joint_overrides"/>
</panel>
<text name="warning_title">
Remarque :
</text>
<text name="warning_message">
Vous n&apos;avez pas la permission de charger des modèles de maillage. [[VURL] Savoir comment] obtenir la permission.
</text>
<text name="status">
[STATUS]
</text>
</panel>
<text name="lod_label">
Aperçu :
</text>
</panel>
<text name="lod_label">
Aperçu :
</text>
</floater>

View File

@ -5389,4 +5389,9 @@ Veuillez noter que "Utiliser l'environnement partagé" et "Basé sur le cycle jo
Remettre l'URL par défaut ?
<usetemplate name="okcancelbuttons" notext="Rappeler plus tard" yestext="Réinitialiser"/>
</notification>
<notification name="WarnScriptedCamera">
La réinitialisation de la caméra peut être empêchée par les objets suivants :
[SOURCES]
</notification>
</notifications>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_hide_beacon">
<button label="Cacher l'émetteur" name="hide_beacon_btn" tool_tip="Arrêter le suivi et cacher l'émetteur" />
</panel>

View File

@ -6817,14 +6817,6 @@ Votre position actuelle : [AVATAR_POS]
Détection de la directive compile-as-Mono outrepassant les préférences.
</string>
<!-- <FS:Zi> Notify user about preferences settings changes to skin defaults -->
<string name="skin_defaults_starlight_location">
L'affichage de votre position actuelle dans la barre de menu a été désactivé par défaut pour la série de skin Starlight.
</string>
<string name="skin_defaults_starlight_navbar">
L'affichage de la barre de navigation a été activé par défaut pour la série de skin Starlight.
</string>
<!-- Animation Explorer -->
<string name="animation_explorer_seconds_ago">
[SECONDS] plus tôt

View File

@ -47,12 +47,6 @@
<panel name="new_inventory_panel">
<button name="new_inv_btn" tool_tip="Apri nuova finestra inventario"/>
</panel>
<panel name="collapse_panel">
<button label="Comprimi" name="collapse_btn" tool_tip="Chiude tutte le cartelle" />
</panel>
<panel name="expand_panel">
<button label="Espandi" name="expand_btn" tool_tip="Apre tutte le cartelle" />
</panel>
<panel name="dummy_panel">
<text name="ItemcountText" tool_tip="[ITEMS] oggetti, [CATEGORIES] cartelle">
elementi

View File

@ -6283,12 +6283,6 @@ Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
<string name="fs_preprocessor_caching_err">
Errore nella prelettura del file incluso &apos;[FILENAME]&apos;
</string>
<string name="skin_defaults_starlight_location">
L&apos;indicazione del luogo attuale nella barra menu è disabilitata in modo predefinito nella serie di impostazioni Starlight.
</string>
<string name="skin_defaults_starlight_navbar">
L&apos;attivazione della barra di navigazione è predefinita nella serie di impostazioni Starlight.
</string>
<string name="animation_explorer_seconds_ago">
[SECONDS] secondi fa
</string>

View File

@ -51,12 +51,7 @@
<text name="mode_selection_text">
モード選択
</text>
<combo_box tool_tip="基本設定を適切に行うために、一番慣れているビューワのタイプを選択して下さい。" name="mode_combo">
<combo_box.item label="Firestorm" name="Firestorm"/>
<combo_box.item label="Phoenix" name="Phoenix"/>
<combo_box.item label="Hybrid" name="Hybrid"/>
<combo_box.item label="Latency" name="Latency"/>
</combo_box>
<combo_box tool_tip="基本設定を適切に行うために、一番慣れているビューワのタイプを選択して下さい。" name="mode_combo" />
</layout_panel>
</layout_stack>
</panel>

View File

@ -53,7 +53,6 @@
<combo_box.item label="Firestorm" name="Firestorm" />
<combo_box.item label="Phoenix" name="Phoenix" />
<combo_box.item label="ハイブリッド" name="Hybrid" />
<combo_box.item label="Latency" name="Latency" />
<combo_box.item label="テキスト" name="Text" />
</combo_box>
</layout_panel>

View File

@ -6437,11 +6437,7 @@ Secondlife.com のサポートセクションから
<!-- <FS:Cron> FIRE-9335 -->
<!-- <LSL Preprocessor -->
<!-- <FS:Zi> Notify user about preferences settings changes to skin defaults -->
<string name="skin_defaults_starlight_location">Starlight スキンの初期設定により、メニューバーには現在いる場所が表示されません。</string>
<string name="skin_defaults_starlight_navbar">Starlight スキンの初期設定により、ナビゲーションバーが表示されます。</string>
<!-- Animation Explorer -->
<string name="animation_explorer_seconds_ago">[SECONDS] 秒前</string>
<string name="animation_explorer_still_playing">実行中のアニメーション:</string>

View File

@ -21,4 +21,7 @@
<rows name="start_gesture">
<columns name="lst_action" value="Odtwórz gest" />
</rows>
<rows name="script_trigger_lbutton">
<columns name="lst_action" value="Interakcja (LMB)" />
</rows>
</contents>

View File

@ -29,9 +29,7 @@ Zespół programistów Firestorma:
Specjalne podziękowania dla naszego zespołu wsparcia, beta testerów, edytorów wiki, nauczycieli i tłumaczy:
</text>
<text name="fs_art_intro">
Firestorm zawiera Starlight, zmodyfikowany dla Firestorma. Jest on tworzony przez rezydentów dla rezydentów, z intencją dostarczenia alternatywnego, jaśniejszego i w założeniach łatwiejszego w użytkowaniu interfejsu. Więcej szczegółów pod &lt;nolink&gt;https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight&lt;/nolink&gt;.
Artyści i projektanci interfejsu:
Artyści i projektanci interfejsu:
</text>
</panel>
</scroll_container>

View File

@ -1,39 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="Model Preview" title="Przesyłanie modelu">
<string name="no_havok">przesyłanie meszy z fizyką</string>
<string name="status_parse_error">Błąd: Problem z parsowaniem Dae, zobacz log.</string>
<string name="status_bind_shape_orientation">Uwaga: Macierz powiązań kształtu nie jest w standardowej orientacji X-forward.</string>
<string name="status_material_mismatch">Błąd: Materiał nie jest podzbiorem modelu referencyjnego.</string>
<string name="status_lod_model_mismatch">Błąd: Model LOD nie ma rodzica.</string>
<string name="status_reading_file">Wczytywanie...</string>
<string name="status_generating_meshes">Generowanie meszy...</string>
<string name="status_vertex_number_overflow">Błąd: Ilość wierzchołków większa niż 65535, przerwano!</string>
<string name="bad_element">Błąd: element nieprawidłowy</string>
<string name="high">Wysokie</string>
<string name="medium">Średnie</string>
<string name="low">Niskie</string>
<string name="lowest">Najniższe</string>
<string name="mesh_status_good">Dostarcz!</string>
<string name="mesh_status_na">???</string>
<string name="mesh_status_none">Brak</string>
<string name="mesh_status_submesh_mismatch">Poziomy detali mają inną liczbę stron do teksturowania.</string>
<string name="mesh_status_mesh_mismatch">Poziomy detali mają inną liczbę instancji meszy.</string>
<string name="mesh_status_too_many_vertices">Poziomy detali mają za dużo wierzchołków.</string>
<string name="mesh_status_missing_lod">Brakuje poziomu detali.</string>
<string name="mesh_status_invalid_material_list">Materiały LOD nie są podzbiorem modelu referencyjnego.</string>
<string name="phys_status_vertex_limit_exceeded">Pewne fizyczne powłoki przekroczyły limit wierzchołków (256); Spróbuj 'analizy'.</string>
<string name="phys_status_hull_limit_exceeded">Pewne modele przekroczyły limit powłok (256); Spróbuj 'upraszczania'.</string>
<string name="phys_status_degenerate_triangles">Mesz fizyki zbyt gęsty; Usuń małe cienkie trójkąty (zobacz podgląd)</string>
<string name="phys_status_no_havok">Ta wersja nie zawiera wsparcia Havoka i nie jest zalecana dla przesyłania fizyki do Second Life. Wyniki mogą być nieprzewidywalne.</string>
<string name="phys_status_unknown_error">Wykryto nierozpoznany błąd.</string>
<string name="layer_all">Wszystko</string>
<string name="decomposing">Analizowanie...</string>
<string name="simplifying">Upraszczanie...</string>
<string name="TooManyJoint">Teksturowanie wyłączone, zbyt wiele stawów: [JOINTS], maksimum: [MAX]</string>
<string name="UnrecognizedJoint">Riggowane do nieznanej nazwy stawu [NAME]</string>
<string name="UnknownJoints">Teksturowanie wyłączone, zbyt wiele nieznanych stawów ([COUNT])</string>
<string name="ModelLoaded">Model [MODEL_NAME] załadowany</string>
<string name="IncompleteTC">Dane współrzędnych tekstury nie są kompletne.</string>
<string name="no_havok">przesyłanie meszy z fizyką</string>
<string name="status_parse_error">Błąd: Problem z parsowaniem Dae, zobacz log.</string>
<string name="status_bind_shape_orientation">Uwaga: Macierz powiązań kształtu nie jest w standardowej orientacji X-forward.</string>
<string name="status_material_mismatch">Błąd: Materiał nie jest podzbiorem modelu referencyjnego.</string>
<string name="status_lod_model_mismatch">Błąd: Model LOD nie ma rodzica.</string>
<string name="status_reading_file">Wczytywanie...</string>
<string name="status_generating_meshes">Generowanie meszy...</string>
<string name="status_vertex_number_overflow">Błąd: Ilość wierzchołków większa niż 65535, przerwano!</string>
<string name="bad_element">Błąd: element nieprawidłowy</string>
<string name="high">Wysokie</string>
<string name="medium">Średnie</string>
<string name="low">Niskie</string>
<string name="lowest">Najniższe</string>
<string name="mesh_status_good">Dostarcz!</string>
<string name="mesh_status_na">???</string>
<string name="mesh_status_none">Brak</string>
<string name="mesh_status_submesh_mismatch">Poziomy detali mają inną liczbę stron do teksturowania.</string>
<string name="mesh_status_mesh_mismatch">Poziomy detali mają inną liczbę instancji meszy.</string>
<string name="mesh_status_too_many_vertices">Poziomy detali mają za dużo wierzchołków.</string>
<string name="mesh_status_missing_lod">Brakuje poziomu detali.</string>
<string name="mesh_status_invalid_material_list">Materiały LOD nie są podzbiorem modelu referencyjnego.</string>
<string name="phys_status_vertex_limit_exceeded">Pewne fizyczne powłoki przekroczyły limit wierzchołków (256); Spróbuj 'analizy'.</string>
<string name="phys_status_hull_limit_exceeded">Pewne modele przekroczyły limit powłok (256); Spróbuj 'upraszczania'.</string>
<string name="phys_status_degenerate_triangles">Mesz fizyki zbyt gęsty; Usuń małe cienkie trójkąty (zobacz podgląd)</string>
<string name="phys_status_no_havok">Ta wersja nie zawiera wsparcia Havoka i nie jest zalecana dla przesyłania fizyki do Second Life. Wyniki mogą być nieprzewidywalne.</string>
<string name="phys_status_too_thin">Jeden z wymiarów ma mniej niż 0.5 m, tylko kształty fizyki oparte na kadłubie (po analizie) zadziałają poprawnie.</string>
<string name="phys_status_unknown_error">Wykryto nierozpoznany błąd.</string>
<string name="layer_all">Wszystko</string>
<string name="decomposing">Analizowanie...</string>
<string name="simplifying">Upraszczanie...</string>
<string name="TooManyJoint">Teksturowanie wyłączone, zbyt wiele stawów: [JOINTS], maksimum: [MAX]</string>
<string name="UnrecognizedJoint">Riggowane do nieznanej nazwy stawu [NAME]</string>
<string name="UnknownJoints">Teksturowanie wyłączone, zbyt wiele nieznanych stawów ([COUNT])</string>
<string name="ModelLoaded">Model [MODEL_NAME] załadowany</string>
<string name="IncompleteTC">Dane współrzędnych tekstury nie są kompletne.</string>
<panel name="left_panel">
<panel name="model_name_representation_panel">
<text name="name_label">

View File

@ -5160,6 +5160,13 @@ Wynik testu kompresji pliku dla gzip na poziomie 6 z [FILE] o rozmiarze [SIZE] K
Pakowanie: [PACK_TIME]s [PSIZE]KB
Rozpakowywanie: [UNPACK_TIME]s [USIZE]KB
</notification>
<notification name="PromptMFAToken">
[MESSAGE]
<form name="form">
<button name="continue" text="Kontynuuj" />
<button name="cancel" text="Anuluj" />
</form>
</notification>
<notification name="NoValidEnvSettingFound">
Nie wybrano prawidłowego ustawienia otoczenia.
@ -5185,4 +5192,9 @@ Pamiętaj, że nie można wybrać "otoczenia współdzielonego" i "bazowanego na
Zresetować adres URL do domyślnego?
<usetemplate name="okcancelbuttons" notext="Przypomnij mi potem" yestext="Resetuj" />
</notification>
<notification name="WarnScriptedCamera">
Resetowanie kamery może być zablokowane przez następujące obiekty:
[SOURCES]
</notification>
</notifications>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_hide_beacon">
<button label="Ukryj emiter" name="hide_beacon_btn" tool_tip="Zatrzymaj śledzenie i ukryj emiter" />
</panel>

View File

@ -49,14 +49,6 @@
<panel name="new_inventory_panel">
<button name="new_inv_btn" tool_tip="Otwórz dodatkowe okno Szafy"/>
</panel>
<!-- Used by StarLight skins -->
<panel name="collapse_panel">
<button label="Zwiń" name="collapse_btn" tool_tip="Zwiń wszystkie foldery" />
</panel>
<panel name="expand_panel">
<button label="Rozwiń" name="expand_btn" tool_tip="Rozwiń wszystkie foldery" />
</panel>
<!-- / Used by StarLight skins -->
<panel name="dummy_panel">
<text name="ItemcountText" tool_tip="[ITEMS] przedmiotów, [CATEGORIES] folderów">
Elementy

View File

@ -232,6 +232,7 @@ http://secondlife.com/viewer-access-faq
Upewnij się, że wpisano poprawnie:
* Login (np. bobsmith12 czy steller.sunshine)
* Hasło
* Token weryfikacji dwuetapowej (gdy włączona)
Sprawdź też, czy klawisz Caps Lock nie jest wciśnięty.
</string>
<string name="LoginFailedPasswordChanged">
@ -341,6 +342,10 @@ Spróbuj zalogować się ponownie za minutę.
<string name="LoginFailedLoggingOutSession">
System rozpoczął wylogowywanie Twojej ostatniej sesji.
Spróbuj zalogować się ponownie za minutę.
</string>
<string name="LoginFailedAuthenticationMFARequired">
Wprowadź nowy token z aplikacji do uwierzytelniania wieloskładnikowego.
Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
</string>
<string name="AgentLostConnection">
Ten region może mieć problemy. Sprawdź podłączenie do Internetu.
@ -6321,12 +6326,6 @@ Twoja aktualna pozycja: [AVATAR_POS]
<string name="fs_preprocessor_caching_err">
Błąd podczas buforowania pliku '[FILENAME]'
</string>
<string name="skin_defaults_starlight_location">
Pokazywanie Twojej obecnej lokalizacji w pasku menu zostało wyłączone, to domyślne zachowanie dla skórek linii StarLight.
</string>
<string name="skin_defaults_starlight_navbar">
Pokazywanie paska nawigacyjnego zostało włączone, to domyślne zachowanie dla skórek linii StarLight.
</string>
<string name="animation_explorer_seconds_ago">
[SECONDS] sekund temu
</string>

View File

@ -21,4 +21,7 @@
<rows name="start_gesture">
<columns name="lst_action" value="Начать Жест"/>
</rows>
<rows name="script_trigger_lbutton">
<columns name="lst_action" value="Взаимодействие (ЛКМ)"/>
</rows>
</contents>

View File

@ -21,10 +21,10 @@ Linden это:
и переводами от:
</text>
</panel>
<panel label="Firestorm" name="fs_credits_panel" height="860">
<panel label="Firestorm" name="fs_credits_panel" height="870">
<scroll_container name="fs_credits_scroll_container">
<panel name="fs_credits_scroll_container_content_panel">
<text name="firestorm_intro" height="120">
<text name="firestorm_intro" height="130">
Firestorm является проектом сообщества программистов, имеющих цели на улучшение качества основаных из опыта использования SecondLife (tm) Viewer. Мы объединяем в одно целое вклад разных программистов, которые представляют разные сообщества, в сочетании с кодом Linden Lab и нашим собственным, чтобы создавать хороший, функциональный клиент поддержку которого обеспечивает команда состоящая из волонтеров. Firestorm существует благодаря The Phoenix Firestorm Project, Inc., некомерческой организации.
Команда разработчиков Firestorm:
@ -36,9 +36,7 @@ Linden это:
Специальные благодарности для команды поддержки, издателей wiki, учителей и переводчиков:
</text>
<text name="fs_art_intro">
Firestorm использует Starlight, модифицированный для Firestorm. Он создан пользователями для пользователей, с целью предоставления альтернативного, более ясного и в более легкого в использовании интерфейса. Больше подробностей на &lt;nolink&gt;https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight&lt;/nolink&gt;.
Художники и дизайнеры интерфейса:
Художники и дизайнеры интерфейса:
</text>
</panel>
</scroll_container>

View File

@ -25,6 +25,7 @@
<string name="phys_status_hull_limit_exceeded">Некоторые модели превышают предел оболочек (256); попробуйте 'Упрощение'.</string>
<string name="phys_status_degenerate_triangles">Физика меша слишком плотная; удалить маленькие, тонкие треугольники (смотри просмотр).</string>
<string name="phys_status_no_havok">Эта версия не поддерживает Havok и не рекомендуется для загрузки физики в Second Life. Результаты могут быть непредсказуемыми.</string>
<string name="phys_status_too_thin">Один или несколько размеров меньше 0,5м, корректно будут работать только физические формы, основанные на корпусе (проанализированные).</string>
<string name="phys_status_unknown_error">Обнаружена нераспознанная ошибка.</string>
<string name="layer_all">Все</string>
<string name="decomposing">Анализ...</string>

View File

@ -5298,16 +5298,19 @@ https://wiki.firestormviewer.org/fs_voice
Диспетчер анимаций (AO): [AO_MESSAGE]
<usetemplate ignoretext="Предупредить меня, когда к функции Диспетчера анимаций (AO) обращается скриптовый объект" name="notifyignore"/>
</notification>
<notification name="AttachedRiggedObjectToHUD">
Предмет с названием "[NAME]" является ригованым мешем, но прикреплен на экран в "[HUD_POINT]". Это значит, что для вас он будет отображаться правильно, но все остальные вообще не смогут его увидеть. Возможно, вы захотите снять его и снова прикрепить к обычной точке крепления на теле.
<usetemplate ignoretext="Предупреждать меня когда ригованные вещи прикрепляются на экран пользователя." name="notifyignore"/>
</notification>
<notification name="WarnForceLoginURL">
URL-адрес заставки входа в систему переопределен в целях тестирования.
Сбросить URL по умолчанию?
<usetemplate name="okcancelbuttons" notext="Напомни мне в следующий раз" yestext="Сбросить"/>
</notification>
<notification name="WarnScriptedCamera">
Сброс камеры может быть заблокирован следующими объектами:
[SOURCES]
</notification>
</notifications>

View File

@ -42,7 +42,6 @@
<combo_box.item label="Phoenix" name="Phoenix"/>
<combo_box.item label="[VIEWER_GENERATION]" name="V3"/>
<combo_box.item label="Hybrid" name="Hybrid"/>
<combo_box.item label="Latency" name="Latency"/>
<combo_box.item label="Text" name="Text"/>
-->
</combo_box>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="panel_hide_beacon">
<button label="Скрыть маяк" name="hide_beacon_btn" tool_tip="Прекратить отслеживание и скрыть маяк"/>
</panel>

View File

@ -48,14 +48,6 @@
<panel name="new_inventory_panel">
<button name="new_inv_btn" tool_tip="Дополнительное окно инвентаря"/>
</panel>
<!-- Used by StarLight skins -->
<panel name="collapse_panel">
<button label="Свернуть" name="collapse_btn" tool_tip="Свернуть все папки" />
</panel>
<panel name="expand_panel">
<button label="Развернуть" name="expand_btn" tool_tip="Развернуть все папки" />
</panel>
<!-- / Used by StarLight skins -->
<panel name="dummy_panel">
<text name="ItemcountText">
Элементов

View File

@ -6618,12 +6618,6 @@ ID объекта: [INSPECTING_KEY]
<string name="fs_preprocessor_caching_err">
Ошибка кэширования подключенного файла '[FILENAME]'
</string>
<string name="skin_defaults_starlight_location">
Отображение вашего текущего местоположения в меню было отключено по умолчанию для серии тем Starlight.
</string>
<string name="skin_defaults_starlight_navbar">
Отображение панели навигации было включено по умолчанию для серии тем Starlight.
</string>
<string name="animation_explorer_seconds_ago">
[SECONDS] секунд назад
</string>

View File

@ -1,360 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<colors>
<color
name="ltgrey123"
value="0.33333 0.33333 0.33333 1.0" />
<color
name="drkgrey123"
value="0.24314 0.24314 0.24314 1.0" />
<color
name="btncolordisabled123"
value="0.00392 0.17647 0.31765 1.0" />
<color
name="btncolor123"
value="0.26667 0.17647 0.98039 1.0" />
<color
name="OldGray_63"
value="0.243 0.243 0.243 0.63" />
<!-- Default Opaque Floater Background Color -->
<color
name="DkGray"
value="0.242 0.242 0.242 1" />
<!-- Focused Text editors, scroll lists, notecards etc. -->
<color
name="UIControlBGLightFocused"
value="0.784 0.812 0.8 1.0" />
<!-- Scroll list stripes, always focused -->
<color
name="UIControlBGLightStripe"
value="0.723 0.75 0.734 1.0" />
<!-- Scroll list stripe hover, always focused -->
<color
name="UIControlBGLightHover"
value="0.746 0.766 0.766 1.0" />
<!-- UI control highlight, always focused -->
<color
name="UIControlBGSelected"
value="0.551 0.566 0.762 1.0" />
<!-- UI control highlight, always focused, compensates for in-code alpha -->
<color
name="UIControlBGSelectedCompensate"
value="0.45 0.46 0.745 1.0" />
<!-- Unfocused Text editors, scroll lists, notecards etc. -->
<color
name="UIControlBGLightUnfocused"
value="0.727 0.762 0.742 1.0" />
<color
name="BottomTrayAlphaColor"
reference="ltgrey123" />
<color
name="GridlineBGColor"
value="0.92 0.92 1 0.78" />
<!-- Text color for any type of input widget -->
<color
name="TextFgColor"
reference="Black" />
<color
name="TextFgDisabledColor"
reference="Black_25" />
<color
name="LabelTextColor"
value="0.576 0.663 0.835 1.0" />
<color
name="ChicletFlashColor"
value="SchemeLightest" />
<color
name="GroupNotifyBoxColor"
value="0.3344 0.5456 0.5159 1" />
<color
name="TextEmbeddedItemColor"
value="0.44 0.17 0 1" />
<color
name="ButtonFlashBgColor"
value="0.725 0.58 0.361 1.0" />
<!-- Color of the push button label -->
<color
name="ButtonLabelColor"
value="0.862 0.862 0.862 1.0" />
<!-- Color of the push button label when disabled -->
<color
name="ButtonLabelDisabledColor"
value="0.549 0.565 0.761 1.0" />
<color
name="ChatHistoryBgColor"
reference="drkgrey123" />
<color
name="GroupNotifyDialogBG"
reference="drkgrey123" />
<color
name="GroupNotifyTextBG"
reference="drkgrey123" />
<color
name="GroupNotifyTextColor"
reference="White" />
<color
name="ScriptDialog"
reference="drkgrey123" />
<color
name="ScriptDialogFg"
reference="White" />
<color
name="HighlightChildColor"
reference="Yellow" />
<color
name="HighlightInspectColor"
reference="Purple" />
<color
name="IMChatColor"
reference="LtGray" />
<color
name="MapAvatarColor"
reference="Green" />
<color
name="MapAvatarFriendColor"
reference="Yellow" />
<color
name="MenuBarBgColor"
reference="DkGray" />
<color
name="MenuDefaultBgColor"
reference="Black" />
<color
name="MultiSliderDisabledThumbColor"
reference="Unused?" />
<color
name="MultiSliderThumbCenterColor"
reference="Unused?" />
<color
name="MultiSliderThumbCenterSelectedColor"
reference="Unused?" />
<color
name="NetMapBackgroundColor"
value="0.0 0.0 0.0 0.6" />
<color
name="ObjectChatColor"
value="0.699 0.899 0.699 1" />
<color
name="SL-Background"
value="0.425 0.425 0.425 1" />
<color
name="SystemChatColor"
reference="LtGray" />
<color
name="ComboListBgColor"
value="0.9 0.9 0.9 1.0" />
<color
name="InspectorTipTextColor"
reference="TextFgColor" />
<!-- Avatar list color for agents within chat range -->
<color
name="AvatarListItemChatRange"
reference="Black" />
<!-- Avatar list color for agents within shout range -->
<color
name="AvatarListItemShoutRange"
reference="Black_50" />
<!-- Avatar list color for agents beyond shout range -->
<color
name="AvatarListItemBeyondShoutRange"
value="0.4 0.0 0.0 0.4" />
<!-- Normal scroll list item text color -->
<color
name="ScrollUnselectedColor"
reference="TextFgColor" />
<!-- Selected scroll list item text color -->
<color
name="ScrollSelectedFGColor"
reference="TextFgColor" />
<!-- The currently selected scroll list item's background color -->
<color
name="ScrollSelectedBGColor"
reference="UIControlBGSelected" />
<!-- A disabled line in the scroll list gets this text color -->
<color
name="ScrollDisabledColor"
reference="TextFgDisabledColor" />
<!-- The standard, unselected scroll list item background, also overall background -->
<color
name="ScrollBgWriteableColor"
reference="UIControlBGLightFocused" />
<!-- A disabled line in the scroll list gets this background color -->
<color
name="ScrollBgReadOnlyColor"
reference="UIControlBGLightFocused" />
<!-- Every other unselected line gets this color -->
<color
name="ScrollBGStripeColor"
reference="UIControlBGLightStripe" />
<!-- The currently hovered over scroll list item -->
<color
name="ScrollHoveredColor"
reference="EmphasisColor_13" />
<!-- Unknown use, some kind of debug border color used in llview.cpp -->
<color
name="ScrollHighlightedColor"
reference="Unused?" />
<color
name="ScrollbarThumbColor"
reference="White" />
<color
name="ScrollbarTrackColor"
value="0.6 0.6 0.6 1.0" />
<color
name="ToolTipTextColor"
reference="TextFgColor" />
<color
name="TextBgFocusColor"
reference="UIControlBGLightFocused" />
<!-- Compensate for 0.7 alpha being applied in code :( -->
<color
name="TextBgSelectedColor"
reference="UIControlBGSelectedCompensate" />
<!-- New color - Selection color for line editors, read-only and editable -->
<color
name="LineEditorBgSelectedColor"
reference="UIControlBGSelected" />
<color
name="TextBgWriteableColor"
value="0.729 0.765 0.745 1.0" />
<color
name="TextBgHighlightColor"
value="0.45 0.46 0.745 0.66" />
<color
name="TextBgReadOnlyColor"
reference="DkGray" />
<!-- Username matches the computed display name -->
<color
name="NameTagMatch"
reference="NameTagV1" />
<!-- Username does not match a computed display name (uses custom display name) -->
<color
name="NameTagMismatch"
reference="NameTagV1" />
<!-- Floater title bar color, mostly used for sidebar related floaters -->
<color
name="TitleBarFocusColor"
value="0.333 0.333 0.333 1.0" />
<!-- Colors for view borders, bevel boxes around elements -->
<color
name="DefaultHighlightLight"
value="0.451 0.518 0.608 1.0" />
<color
name="DefaultHighlightDark"
reference="DefaultHighlightLight" />
<color
name="DefaultShadowLight"
value="0.101 0.101 0.101 1.0" />
<color
name="DefaultShadowLight"
reference="Black" />
<!-- for legacy profiles -->
<color
name="StatusUserOnline"
reference="LabelTextColor" />
<!-- for legacy profiles -->
<color
name="StatusUserOffline"
reference="LabelDisabledColor" />
<color
name="ChatTimestampColor"
value="0.5 0.5 0.5 1.0" />
<!-- nearby media list items -->
<color
name="MediaListItemColor"
reference="ScrollUnselectedColor" />
<!-- Groups visible in profiles -->
<color
name="GroupVisibleInProfile"
reference="ScrollUnselectedColor" />
<color
name="GroupHiddenInProfile"
reference="OldGray_63" />
<!-- Balance at the top -->
<color
name="CurrencyColor"
reference="Green" />
<!-- Parcel info hovering and normal colors -->
<color
name="ParcelNormalColor"
reference="LabelTextColor" />
<color
name="ParcelHoverColor"
reference="White" />
<color
name="Phototools_Header"
reference="EmphasisColor" />
<color
name="UserChatColor"
value="0.65 0.65 0.65 1.0" />
<color
name="ChatNameColor"
value="0.6 0.6 1.0 1.0" />
<color
name="FriendsChatColor"
value="0.447 0.784 0.623 1.0" />
<color
name="NameTagFriend"
value="0.447 0.784 0.663 1.0" />
<color
name="LindenChatColor"
value="0.14 0.7 1 1.0" />
<color
name="NameTagLinden"
value="0.14 0.7 1 1.0" />
<color
name="ObjectChatColor"
value="0.7 0.9 0.7 1.0" />
<color
name="ObjectIMColor"
reference="ObjectChatColor" />
<color
name="llOwnerSayChatColor"
value="0.988 0.988 0.69 1.0" />
<color
name="SystemChatColor"
value="0.8 1.0 1.0 1.0" />
<color
name="ScriptErrorColor"
value="0.82 0.275 0.275 1.0" />
<color
name="HTMLLinkColor"
value="0.6 0.6 1.0 1.0" />
<color
name="NameTagMatch"
value="0.996 0.396 0.121 1.0" />
<color
name="NameTagMismatch"
value="0.996 0.396 0.121 1.0" />
<color
name="NameTagUsername"
value="0.996 0.396 0.121 1.0" />
<color
name="XUITooltipFileName"
value="0.4 0.4 .7 1" />
<color
name="ScriptSelectedColor"
reference="TextBgSelectedColor" />
<color
name="AvatarListItemIconDefaultColor"
reference="TextFgColor" />
<color
name="MoneyTrackerIncrease"
value="0.0 0.4 0.0 1" />
<color
name="MoneyTrackerDecrease"
value="0.4 0.0 0.0 1" />
<color
name="OutfitGalleryItemSelected"
reference="EmphasisColor" />
<color
name="OutfitGalleryItemWorn"
reference="EmphasisColor" />
<color
name="OutfitGalleryItemUnselected"
value="0.4 0.4 0.4 1" />
</colors>

View File

@ -1,15 +0,0 @@
<llsd>
<map>
<key>FSLegacyEdgeSnap</key>
<map>
<key>Comment</key>
<string>Use old method for adjusting edge snap regions.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
</map>
</llsd>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

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