Merge branch 'master' of https://vcs.firestormviewer.org/phoenix-firestorm
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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})
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.5.5
|
||||
6.5.6
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 "Resident" 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'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 > Sound/Media > 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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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 <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>.
|
||||
|
||||
UI-Künstler und Designer:
|
||||
</text>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>.
|
||||
|
||||
UI Artists and Designers:
|
||||
</text>
|
||||
<text
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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...
|
||||
|
|
|
|||
|
|
@ -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 <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>.
|
||||
|
||||
Artistas y Diseñadores de la interfaz:
|
||||
</text>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>
|
||||
Création de l'interface :
|
||||
</text>
|
||||
<text name="fs_art_intro">Création de l'interface :</text>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -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'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'est pas dans l'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'application de texture est associé aux niveaux de détail.
|
||||
</string>
|
||||
<string name="mesh_status_mesh_mismatch">
|
||||
Un nombre différent d'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'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'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'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'est pas dans l'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'application de texture est associé aux niveaux de détail.</string>
|
||||
<string name="mesh_status_mesh_mismatch">Un nombre différent d'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'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'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 d’erreur" name="Error Threshold" value="Seuil d'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 d’erreur" name="Error Threshold" value="Seuil d'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 d’erreur" name="Error Threshold" value="Seuil d'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 d’erreur" name="Error Threshold" value="Seuil d'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 d’erreur" name="Error Threshold" value="Seuil d'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 d’erreur" name="Error Threshold" value="Seuil d'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 d’erreur" name="Error Threshold" value="Seuil d'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 d’erreur" name="Error Threshold" value="Seuil d'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'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'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'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'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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -6283,12 +6283,6 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette.
|
|||
<string name="fs_preprocessor_caching_err">
|
||||
Errore nella prelettura del file incluso '[FILENAME]'
|
||||
</string>
|
||||
<string name="skin_defaults_starlight_location">
|
||||
L'indicazione del luogo attuale nella barra menu è disabilitata in modo predefinito nella serie di impostazioni Starlight.
|
||||
</string>
|
||||
<string name="skin_defaults_starlight_navbar">
|
||||
L'attivazione della barra di navigazione è predefinita nella serie di impostazioni Starlight.
|
||||
</string>
|
||||
<string name="animation_explorer_seconds_ago">
|
||||
[SECONDS] secondi fa
|
||||
</string>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>.
|
||||
|
||||
Artyści i projektanci interfejsu:
|
||||
Artyści i projektanci interfejsu:
|
||||
</text>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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. Он создан пользователями для пользователей, с целью предоставления альтернативного, более ясного и в более легкого в использовании интерфейса. Больше подробностей на <nolink>https://wiki.secondlife.com/wiki/Viewer_Skins/Starlight</nolink>.
|
||||
|
||||
Художники и дизайнеры интерфейса:
|
||||
Художники и дизайнеры интерфейса:
|
||||
</text>
|
||||
</panel>
|
||||
</scroll_container>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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">
|
||||
Элементов
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
Before Width: | Height: | Size: 269 B |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |