Merge branch 'master' of https://bitbucket.org/Ansariel/phoenix-firestorm
commit
2ea6f51200
|
|
@ -994,11 +994,11 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>4f9bf4566934e6e8611ef918186f20c5</string>
|
||||
<string>c96fbccf3db01230832d8795318ee627</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>md5</string>
|
||||
<key>url</key>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.01.08-darwin-210441530.tar.bz2</string>
|
||||
<string>file:///opt/firestorm/fmodstudio-2.01.09-darwin-211252249.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin</string>
|
||||
|
|
@ -2980,9 +2980,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>e235c5da10f29893e14b14c7a3184d91</string>
|
||||
<string>ba2034b4a372fd46c3e09f56bede38a7</string>
|
||||
<key>url</key>
|
||||
<string>http://3p.firestormviewer.org/openjpeg-2.3.1.202821233-windows-202821233.tar.bz2</string>
|
||||
<string>http://3p.firestormviewer.org/openjpeg-2.4.0.211361403-windows-211361403.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -2992,16 +2992,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d87183b9cab5910a4a0f15e8faebab06</string>
|
||||
<string>d7ac606703a9330a2d8a3f7276cb6894</string>
|
||||
<key>url</key>
|
||||
<string>http://3p.firestormviewer.org/openjpeg-2.3.1.202821246-windows64-202821246.tar.bz2</string>
|
||||
<string>http://3p.firestormviewer.org/openjpeg-2.4.0.211361407-windows64-211361407.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>2.3.1</string>
|
||||
<string>2.4.0</string>
|
||||
</map>
|
||||
<key>openssl</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -155,8 +155,20 @@ void LLStreamingAudio_FMODSTUDIO::update()
|
|||
bool diskbusy;
|
||||
FMOD_OPENSTATE open_state;
|
||||
|
||||
if (Check_FMOD_Error(mCurrentInternetStreamp->getOpenState(open_state, &progress, &starving, &diskbusy), "FMOD::Sound::getOpenState") || open_state == FMOD_OPENSTATE_ERROR)
|
||||
if (Check_FMOD_Error(mCurrentInternetStreamp->getOpenState(open_state, &progress, &starving, &diskbusy), "FMOD::Sound::getOpenState"))
|
||||
{
|
||||
LL_WARNS() << "Internet stream openstate error: open_state = " << open_state << " - progress = " << progress << " - starving = " << starving << " - diskbusy = " << diskbusy << LL_ENDL;
|
||||
stop();
|
||||
return;
|
||||
}
|
||||
else if (open_state == FMOD_OPENSTATE_ERROR)
|
||||
{
|
||||
// Actually we might not get into this case at all since according to the
|
||||
// FMOD API doc, one should check the result of getOpenState for further
|
||||
// details, which most likely means if open_state is FMOD_OPENSTATE_ERROR,
|
||||
// calling getOpenState will return anything but FMOD_OK and we end up in
|
||||
// the if-case above.
|
||||
LL_WARNS() << "Internet stream openstate error: progress = " << progress << " - starving = " << starving << " - diskbusy = " << diskbusy << LL_ENDL;
|
||||
stop();
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -442,7 +442,15 @@ S32 LLQueuedThread::processNextRequest()
|
|||
// safe to access req.
|
||||
if (req)
|
||||
{
|
||||
// process request
|
||||
// <FS:ND> Image thread pool from CoolVL
|
||||
if (req->getFlags() & FLAG_ASYNC)
|
||||
{
|
||||
req->processRequest();
|
||||
return getPending();
|
||||
}
|
||||
// </FS:ND>
|
||||
|
||||
// process request
|
||||
bool complete = req->processRequest();
|
||||
|
||||
if (complete)
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ public:
|
|||
FLAG_AUTO_COMPLETE = 1,
|
||||
FLAG_AUTO_DELETE = 2, // child-class dependent
|
||||
FLAG_ABORT = 4
|
||||
,FLAG_ASYNC = 8 // <FS:ND/> Image thread pool from CoolVL
|
||||
};
|
||||
|
||||
typedef U32 handle_t;
|
||||
|
|
|
|||
|
|
@ -360,7 +360,7 @@ static BOOL isDefault(const std::string& scheme, U16 port)
|
|||
|
||||
void LLURI::parseAuthorityAndPathUsingOpaque()
|
||||
{
|
||||
if (mScheme == "http" || mScheme == "https" || mScheme == "hop" || mScheme == "inworldz" || mScheme == "iw" ||
|
||||
if (mScheme == "http" || mScheme == "https" || mScheme == "hop" ||
|
||||
mScheme == "ftp" || mScheme == "secondlife" ||
|
||||
mScheme == "x-grid-location-info")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -43,7 +43,9 @@
|
|||
static const char* subdirs = "0123456789abcdef";
|
||||
|
||||
LLDiskCache::LLDiskCache(const std::string cache_dir,
|
||||
const int max_size_bytes,
|
||||
// <FS:Ansariel> Fix integer overflow
|
||||
//const int max_size_bytes,
|
||||
const uintmax_t max_size_bytes,
|
||||
const bool enable_cache_debug_info) :
|
||||
mCacheDir(cache_dir),
|
||||
mMaxSizeBytes(max_size_bytes),
|
||||
|
|
@ -64,7 +66,7 @@ LLDiskCache::LLDiskCache(const std::string cache_dir,
|
|||
|
||||
void LLDiskCache::purge()
|
||||
{
|
||||
if (mEnableCacheDebugInfo)
|
||||
//if (mEnableCacheDebugInfo)
|
||||
{
|
||||
LL_INFOS() << "Total dir size before purge is " << dirFileSize(mCacheDir) << LL_ENDL;
|
||||
}
|
||||
|
|
@ -144,7 +146,7 @@ void LLDiskCache::purge()
|
|||
}
|
||||
}
|
||||
|
||||
if (mEnableCacheDebugInfo)
|
||||
//if (mEnableCacheDebugInfo)
|
||||
{
|
||||
auto end_time = std::chrono::high_resolution_clock::now();
|
||||
auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
|
||||
|
|
@ -369,3 +371,27 @@ uintmax_t LLDiskCache::dirFileSize(const std::string dir)
|
|||
|
||||
return total_file_size;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Regular disk cache cleanup
|
||||
FSPurgeDiskCacheThread::FSPurgeDiskCacheThread() :
|
||||
LLThread("PurgeDiskCacheThread", nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
void FSPurgeDiskCacheThread::run()
|
||||
{
|
||||
constexpr F64 CHECK_INTERVAL = 60;
|
||||
mTimer.setTimerExpirySec(CHECK_INTERVAL);
|
||||
mTimer.start();
|
||||
|
||||
do
|
||||
{
|
||||
if (mTimer.checkExpirationAndReset(CHECK_INTERVAL))
|
||||
{
|
||||
LLDiskCache::instance().purge();
|
||||
}
|
||||
|
||||
ms_sleep(100);
|
||||
} while (!isQuitting());
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
|
|||
|
|
@ -86,7 +86,9 @@ class LLDiskCache :
|
|||
* The maximum size of the cache in bytes - Based on the
|
||||
* setting at 'CacheSize' and 'DiskCachePercentOfTotal'
|
||||
*/
|
||||
const int max_size_bytes,
|
||||
// <FS:Ansariel> Fix integer overflow
|
||||
//const int max_size_bytes,
|
||||
const uintmax_t max_size_bytes,
|
||||
/**
|
||||
* A flag that enables extra cache debugging so that
|
||||
* if there are bugs, we can ask uses to enable this
|
||||
|
|
@ -141,6 +143,9 @@ class LLDiskCache :
|
|||
*/
|
||||
const std::string getCacheInfo();
|
||||
|
||||
// <FS:Ansariel> Better asset cache size control
|
||||
void setMaxSizeBytes(uintmax_t size) { mMaxSizeBytes = size; }
|
||||
|
||||
private:
|
||||
/**
|
||||
* Utility function to gather the total size the files in a given
|
||||
|
|
@ -188,4 +193,17 @@ class LLDiskCache :
|
|||
bool mEnableCacheDebugInfo;
|
||||
};
|
||||
|
||||
// <FS:Ansariel> Regular disk cache cleanup
|
||||
class FSPurgeDiskCacheThread : public LLThread
|
||||
{
|
||||
public:
|
||||
FSPurgeDiskCacheThread::FSPurgeDiskCacheThread();
|
||||
|
||||
protected:
|
||||
void run() override;
|
||||
|
||||
private:
|
||||
LLTimer mTimer;
|
||||
};
|
||||
// </FS:Ansariel>
|
||||
#endif // _LLDISKCACHE
|
||||
|
|
|
|||
|
|
@ -153,7 +153,9 @@ S32 LLFileSystem::getFileSize(const LLUUID& file_id, const LLAssetType::EType fi
|
|||
BOOL LLFileSystem::read(U8* buffer, S32 bytes)
|
||||
{
|
||||
FSZoneC(tracy::Color::Gold); // <FS:Beq> measure cache performance
|
||||
BOOL success = TRUE;
|
||||
// <FS:Ansariel> Cache fixes
|
||||
//BOOL success = TRUE;
|
||||
BOOL success = FALSE;
|
||||
|
||||
std::string id;
|
||||
mFileID.toString(id);
|
||||
|
|
@ -188,14 +190,18 @@ BOOL LLFileSystem::read(U8* buffer, S32 bytes)
|
|||
LLFILE* file = LLFile::fopen(filename, "rb");
|
||||
if (file)
|
||||
{
|
||||
fseek(file, mPosition, SEEK_SET);
|
||||
mBytesRead = fread(buffer, 1, bytes, file);
|
||||
fclose(file);
|
||||
|
||||
mPosition += mBytesRead;
|
||||
if (!mBytesRead)
|
||||
if (fseek(file, mPosition, SEEK_SET) == 0)
|
||||
{
|
||||
success = FALSE;
|
||||
mBytesRead = fread(buffer, 1, bytes, file);
|
||||
fclose(file);
|
||||
|
||||
mPosition += mBytesRead;
|
||||
// It probably would be correct to check for mBytesRead == bytes,
|
||||
// but that will break avatar rezzing...
|
||||
if (mBytesRead)
|
||||
{
|
||||
success = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
@ -286,10 +292,10 @@ BOOL LLFileSystem::write(const U8* buffer, S32 bytes)
|
|||
LLFILE* ofs = LLFile::fopen(filename, "a+b");
|
||||
if (ofs)
|
||||
{
|
||||
fwrite(buffer, 1, bytes, ofs);
|
||||
S32 bytes_written = fwrite(buffer, 1, bytes, ofs);
|
||||
mPosition = ftell(ofs);
|
||||
fclose(ofs);
|
||||
success = TRUE;
|
||||
success = (bytes_written == bytes);
|
||||
}
|
||||
}
|
||||
else if (mMode == READ_WRITE)
|
||||
|
|
@ -297,21 +303,23 @@ BOOL LLFileSystem::write(const U8* buffer, S32 bytes)
|
|||
LLFILE* ofs = LLFile::fopen(filename, "r+b");
|
||||
if (ofs)
|
||||
{
|
||||
fseek(ofs, mPosition, SEEK_SET);
|
||||
fwrite(buffer, 1, bytes, ofs);
|
||||
mPosition = ftell(ofs);
|
||||
fclose(ofs);
|
||||
success = TRUE;
|
||||
if (fseek(ofs, mPosition, SEEK_SET) == 0)
|
||||
{
|
||||
S32 bytes_written = fwrite(buffer, 1, bytes, ofs);
|
||||
mPosition = ftell(ofs);
|
||||
fclose(ofs);
|
||||
success = (bytes_written == bytes);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ofs = LLFile::fopen(filename, "wb");
|
||||
if (ofs)
|
||||
{
|
||||
fwrite(buffer, 1, bytes, ofs);
|
||||
S32 bytes_written = fwrite(buffer, 1, bytes, ofs);
|
||||
mPosition = ftell(ofs);
|
||||
fclose(ofs);
|
||||
success = TRUE;
|
||||
success = (bytes_written == bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -320,10 +328,10 @@ BOOL LLFileSystem::write(const U8* buffer, S32 bytes)
|
|||
LLFILE* ofs = LLFile::fopen(filename, "wb");
|
||||
if (ofs)
|
||||
{
|
||||
fwrite(buffer, 1, bytes, ofs);
|
||||
S32 bytes_written = fwrite(buffer, 1, bytes, ofs);
|
||||
mPosition = ftell(ofs);
|
||||
fclose(ofs);
|
||||
success = TRUE;
|
||||
success = (bytes_written == bytes);
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
|
|||
|
|
@ -29,13 +29,100 @@
|
|||
#include "llimageworker.h"
|
||||
#include "llimagedxt.h"
|
||||
|
||||
// <FS:ND> Image thread pool from CoolVL
|
||||
#include "boost/thread.hpp"
|
||||
std::atomic< U32 > s_ChildThreads;
|
||||
|
||||
class PoolWorkerThread : public LLThread
|
||||
{
|
||||
public:
|
||||
PoolWorkerThread(std::string name) : LLThread(name),
|
||||
mCurrentRequest(NULL)
|
||||
{
|
||||
}
|
||||
virtual void run()
|
||||
{
|
||||
while (!isQuitting())
|
||||
{
|
||||
auto *pReq = mCurrentRequest.exchange(nullptr);
|
||||
|
||||
if (pReq)
|
||||
pReq->processRequestIntern();
|
||||
checkPause();
|
||||
}
|
||||
}
|
||||
bool isBusy()
|
||||
{
|
||||
auto *pReq = mCurrentRequest.load();
|
||||
if (!pReq)
|
||||
return false;
|
||||
|
||||
auto status = pReq->getStatus();
|
||||
|
||||
return status == LLQueuedThread::STATUS_QUEUED || status == LLQueuedThread::STATUS_INPROGRESS;
|
||||
}
|
||||
|
||||
bool runCondition()
|
||||
{
|
||||
return mCurrentRequest != NULL;
|
||||
}
|
||||
|
||||
bool setRequest(LLImageDecodeThread::ImageRequest* req)
|
||||
{
|
||||
LLImageDecodeThread::ImageRequest* pOld{ nullptr };
|
||||
bool bSuccess = mCurrentRequest.compare_exchange_strong(pOld, req);
|
||||
wake();
|
||||
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
private:
|
||||
std::atomic< LLImageDecodeThread::ImageRequest * > mCurrentRequest;
|
||||
};
|
||||
// </FS:ND>
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
// MAIN THREAD
|
||||
LLImageDecodeThread::LLImageDecodeThread(bool threaded)
|
||||
LLImageDecodeThread::LLImageDecodeThread(bool threaded, U32 aSubThreads)
|
||||
: LLQueuedThread("imagedecode", threaded)
|
||||
{
|
||||
mCreationMutex = new LLMutex();
|
||||
|
||||
// <FS:ND> Image thread pool from CoolVL
|
||||
if (aSubThreads == 0)
|
||||
{
|
||||
aSubThreads = boost::thread::hardware_concurrency();
|
||||
if (!aSubThreads)
|
||||
aSubThreads = 4U; // Use a sane default: 4 cores
|
||||
if (aSubThreads > 8U)
|
||||
{
|
||||
// Using number of (virtual) cores - 1 (for the main image worker
|
||||
// thread) - 1 (for the viewer main loop thread), further bound to
|
||||
// a maximum of 32 threads (more than that is totally useless, even
|
||||
// when flying over main land with 512m draw distance).
|
||||
aSubThreads = llmin(aSubThreads - 2U, 32U);
|
||||
}
|
||||
else if (aSubThreads > 2U)
|
||||
{
|
||||
// Using number of (virtual) cores - 1 (for the main image worker
|
||||
// thread).
|
||||
--aSubThreads;
|
||||
}
|
||||
}
|
||||
else if (aSubThreads == 1) // Disable if only 1
|
||||
aSubThreads = 0;
|
||||
|
||||
s_ChildThreads = aSubThreads;
|
||||
for (U32 i = 0; i < aSubThreads; ++i)
|
||||
{
|
||||
std::stringstream strm;
|
||||
strm << "imagedecodethread" << (i + 1);
|
||||
|
||||
mThreadPool.push_back(std::make_shared< PoolWorkerThread>(strm.str()));
|
||||
mThreadPool[i]->start();
|
||||
}
|
||||
// </FS:ND>
|
||||
}
|
||||
|
||||
//virtual
|
||||
|
|
@ -53,9 +140,12 @@ S32 LLImageDecodeThread::update(F32 max_time_ms)
|
|||
iter != mCreationList.end(); ++iter)
|
||||
{
|
||||
creation_info& info = *iter;
|
||||
// ImageRequest* req = new ImageRequest(info.handle, info.image,
|
||||
// info.priority, info.discard, info.needs_aux,
|
||||
// info.responder);
|
||||
ImageRequest* req = new ImageRequest(info.handle, info.image,
|
||||
info.priority, info.discard, info.needs_aux,
|
||||
info.responder);
|
||||
info.priority, info.discard, info.needs_aux,
|
||||
info.responder, this);
|
||||
|
||||
bool res = addRequest(req);
|
||||
if (!res)
|
||||
|
|
@ -95,15 +185,21 @@ LLImageDecodeThread::Responder::~Responder()
|
|||
|
||||
LLImageDecodeThread::ImageRequest::ImageRequest(handle_t handle, LLImageFormatted* image,
|
||||
U32 priority, S32 discard, BOOL needs_aux,
|
||||
LLImageDecodeThread::Responder* responder)
|
||||
LLImageDecodeThread::Responder* responder,
|
||||
LLImageDecodeThread *aQueue)
|
||||
: LLQueuedThread::QueuedRequest(handle, priority, FLAG_AUTO_COMPLETE),
|
||||
mFormattedImage(image),
|
||||
mDiscardLevel(discard),
|
||||
mNeedsAux(needs_aux),
|
||||
mDecodedRaw(FALSE),
|
||||
mDecodedAux(FALSE),
|
||||
mResponder(responder)
|
||||
mResponder(responder),
|
||||
mQueue( aQueue ) // <FS:ND/> Image thread pool from CoolVL
|
||||
{
|
||||
//<FS:ND> Image thread pool from CoolVL
|
||||
if (s_ChildThreads > 0)
|
||||
mFlags |= FLAG_ASYNC;
|
||||
// </FS:ND>
|
||||
}
|
||||
|
||||
LLImageDecodeThread::ImageRequest::~ImageRequest()
|
||||
|
|
@ -118,6 +214,21 @@ LLImageDecodeThread::ImageRequest::~ImageRequest()
|
|||
|
||||
// Returns true when done, whether or not decode was successful.
|
||||
bool LLImageDecodeThread::ImageRequest::processRequest()
|
||||
{
|
||||
// <FS:ND> Image thread pool from CoolVL
|
||||
|
||||
// If not async, decode using this thread
|
||||
if ((mFlags & FLAG_ASYNC) == 0)
|
||||
return processRequestIntern();
|
||||
|
||||
// Try to dispatch to a new thread, if this isn't possible decode on this thread
|
||||
if (!mQueue->enqueRequest(this))
|
||||
return processRequestIntern();
|
||||
return true;
|
||||
// </FS:ND>
|
||||
}
|
||||
|
||||
bool LLImageDecodeThread::ImageRequest::processRequestIntern()
|
||||
{
|
||||
const F32 decode_time_slice = .1f;
|
||||
bool done = true;
|
||||
|
|
@ -172,6 +283,15 @@ bool LLImageDecodeThread::ImageRequest::processRequest()
|
|||
mDecodedAux = done && mDecodedImageAux->getData();
|
||||
}
|
||||
|
||||
//<FS:ND> Image thread pool from CoolVL
|
||||
if (mFlags & FLAG_ASYNC)
|
||||
{
|
||||
setStatus(STATUS_COMPLETE);
|
||||
finishRequest(true);
|
||||
// always autocomplete
|
||||
mQueue->completeRequest(mHashKey);
|
||||
}
|
||||
// </FS:ND>
|
||||
return done;
|
||||
}
|
||||
|
||||
|
|
@ -191,3 +311,16 @@ bool LLImageDecodeThread::ImageRequest::tut_isOK()
|
|||
{
|
||||
return mResponder.notNull();
|
||||
}
|
||||
|
||||
bool LLImageDecodeThread::enqueRequest(ImageRequest * req)
|
||||
{
|
||||
for (auto &pThread : mThreadPool)
|
||||
{
|
||||
if (!pThread->isBusy())
|
||||
{
|
||||
if( pThread->setRequest(req) )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,9 @@
|
|||
#include "llpointer.h"
|
||||
#include "llworkerthread.h"
|
||||
|
||||
// <FS:ND/> Image thread pool
|
||||
class PoolWorkerThread;
|
||||
|
||||
class LLImageDecodeThread : public LLQueuedThread
|
||||
{
|
||||
public:
|
||||
|
|
@ -50,9 +53,10 @@ public:
|
|||
public:
|
||||
ImageRequest(handle_t handle, LLImageFormatted* image,
|
||||
U32 priority, S32 discard, BOOL needs_aux,
|
||||
LLImageDecodeThread::Responder* responder);
|
||||
LLImageDecodeThread::Responder* responder, LLImageDecodeThread *aQueue);
|
||||
|
||||
/*virtual*/ bool processRequest();
|
||||
bool processRequestIntern();
|
||||
/*virtual*/ void finishRequest(bool completed);
|
||||
|
||||
// Used by unit tests to check the consitency of the request instance
|
||||
|
|
@ -66,13 +70,18 @@ public:
|
|||
// output
|
||||
LLPointer<LLImageRaw> mDecodedImageRaw;
|
||||
LLPointer<LLImageRaw> mDecodedImageAux;
|
||||
LLImageDecodeThread * mQueue; // <FS:ND> Image thread pool from CoolVL
|
||||
BOOL mDecodedRaw;
|
||||
BOOL mDecodedAux;
|
||||
LLPointer<LLImageDecodeThread::Responder> mResponder;
|
||||
};
|
||||
|
||||
public:
|
||||
LLImageDecodeThread(bool threaded = true);
|
||||
// <FS:ND> Image thread pool from CoolVL
|
||||
//LLImageDecodeThread(bool threaded = true);
|
||||
LLImageDecodeThread(bool threaded = true, U32 aSubThreads = 0 );
|
||||
// </FS:ND>
|
||||
|
||||
virtual ~LLImageDecodeThread();
|
||||
|
||||
handle_t decodeImage(LLImageFormatted* image,
|
||||
|
|
@ -99,6 +108,11 @@ private:
|
|||
typedef std::list<creation_info> creation_list_t;
|
||||
creation_list_t mCreationList;
|
||||
LLMutex* mCreationMutex;
|
||||
|
||||
// <FS:ND> Image thread pool from CoolVL
|
||||
std::vector< std::shared_ptr< PoolWorkerThread > > mThreadPool;
|
||||
bool enqueRequest(ImageRequest*);
|
||||
// <FS:ND>
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -26,12 +26,14 @@
|
|||
|
||||
#include "linden_common.h"
|
||||
#include "llimagej2coj.h"
|
||||
#define OPENJPEG2
|
||||
|
||||
// this is defined so that we get static linking.
|
||||
#include "openjpeg.h"
|
||||
#ifndef OPENJPEG2
|
||||
#include "cio.h"
|
||||
#endif
|
||||
#include "event.h"
|
||||
#define OPENJPEG2
|
||||
|
||||
#include "lltimer.h"
|
||||
|
||||
|
|
@ -177,9 +179,13 @@ std::string LLImageJ2COJ::getEngineInfo() const
|
|||
+ opj_version();
|
||||
#elif defined OPJ_PACKAGE_VERSION
|
||||
return std::string("OpenJPEG: " OPJ_PACKAGE_VERSION ", Runtime: ") + opj_version();
|
||||
#else
|
||||
#ifdef OPENJPEG2
|
||||
return llformat("OpenJPEG: %i.%i.%i, Runtime: %s", OPJ_VERSION_MAJOR, OPJ_VERSION_MINOR, OPJ_VERSION_BUILD, opj_version());
|
||||
#else
|
||||
return std::string("OpenJPEG Runtime: ") + opj_version();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
// Return string from message, eliminating final \n if present
|
||||
|
|
|
|||
|
|
@ -39,6 +39,29 @@ inline U64 to_region_handle(const U32 x_origin, const U32 y_origin)
|
|||
return region_handle;
|
||||
}
|
||||
|
||||
// <FS:Beq> FIRE-30534 Overload that takes explicit region origin and width to improve Var Region identification.
|
||||
inline U64 to_region_handle(const LLVector3d& pos_global, const LLVector3d& agent_region_origin, const F32 width)
|
||||
{
|
||||
U32 global_x { static_cast<U32>( pos_global.mdV[VX] ) };
|
||||
U32 global_y { static_cast<U32>( pos_global.mdV[VY] ) };
|
||||
|
||||
U32 agent_region_origin_x { static_cast<U32>( agent_region_origin.mdV[VX] ) };
|
||||
U32 agent_region_origin_y { static_cast<U32>( agent_region_origin.mdV[VY] ) };
|
||||
|
||||
if( agent_region_origin_x < global_x && ( agent_region_origin_x + width ) > global_x &&
|
||||
agent_region_origin_y < global_y && ( agent_region_origin_y + width ) > global_y )
|
||||
{
|
||||
// target is local to current region we can make a more informed guess
|
||||
return to_region_handle( agent_region_origin_x, agent_region_origin_y );
|
||||
}
|
||||
// fallback to legacy 256m tile-based guess and let the region server / map work it out.
|
||||
global_x -= global_x % 256;
|
||||
global_y -= global_y % 256;
|
||||
|
||||
return to_region_handle( global_x, global_y );
|
||||
}
|
||||
// </FS:Beq>
|
||||
|
||||
inline U64 to_region_handle(const LLVector3d& pos_global)
|
||||
{
|
||||
U32 global_x = (U32)pos_global.mdV[VX];
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ public:
|
|||
ERROR_INVALID_PARAMETERS,
|
||||
ERROR_OUT_OF_RANGE,
|
||||
ERROR_FILE_VERSION_INVALID,
|
||||
ERROR_LOD_MODEL_MISMATCH, // <FS:Beq/> clean up and improve error reporting
|
||||
ERROR_MODEL // this error should always be last in this list, error code is passed as ERROR_MODEL+error_code
|
||||
} eLoadState;
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
|
||||
// <FS:AW> hop:// protocol>
|
||||
//#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"
|
||||
#define APP_HEADER_REGEX "(((hop|x-grid-location-info)://[-\\w\\.\\:\\@]+/app)|((hop|secondlife|inworldz|iw):///app))"
|
||||
#define APP_HEADER_REGEX "(((hop|x-grid-location-info)://[-\\w\\.\\:\\@]+/app)|((hop|secondlife):///app))"
|
||||
// </FS:AW>
|
||||
|
||||
// Utility functions
|
||||
|
|
@ -354,9 +354,8 @@ std::string LLUrlEntryHTTPNoProtocol::getTooltip(const std::string &url) const
|
|||
LLUrlEntryInvalidSLURL::LLUrlEntryInvalidSLURL()
|
||||
: LLUrlEntryBase()
|
||||
{
|
||||
// <FS:Ansariel> Inworldz special
|
||||
//mPattern = boost::regex("(http://(maps.secondlife.com|slurl.com)/secondlife/|secondlife://(/app/(worldmap|teleport)/)?)[^ /]+(/-?[0-9]+){1,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
|
||||
mPattern = boost::regex("(https?://(maps.secondlife.com|slurl.com)/secondlife/|(secondlife|inworldz|iw)://(/app/(worldmap|teleport)/)?)[^ /]+(/-?[0-9]+){1,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
|
||||
// <FS:Beq> remove legacy Inworldz URI support. restore previous with addition of https
|
||||
mPattern = boost::regex("(https?://(maps.secondlife.com|slurl.com)/secondlife/|secondlife://(/app/(worldmap|teleport)/)?)[^ /]+(/-?[0-9]+){1,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_http.xml";
|
||||
mTooltip = LLTrans::getString("TooltipHttpUrl");
|
||||
|
|
@ -1101,7 +1100,7 @@ LLUrlEntryObjectIM::LLUrlEntryObjectIM()
|
|||
{
|
||||
// <FS:AW> hop:// protocol; Ansa: Stop at first space so we can use it in notifications!
|
||||
//mPattern = boost::regex("secondlife:///app/objectim/[\\da-f-]+\?\\S*\\w",
|
||||
mPattern = boost::regex("(hop|secondlife|inworldz|iw):///app/objectim/[\\da-f-]+\?[^ \t\r\n\v\f]*",
|
||||
mPattern = boost::regex("(hop|secondlife):///app/objectim/[\\da-f-]+\?[^ \t\r\n\v\f]*",
|
||||
// </FS:AW>
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_objectim.xml";
|
||||
|
|
@ -1230,9 +1229,7 @@ void LLUrlEntryParcel::processParcelInfo(const LLParcelData& parcel_data)
|
|||
//
|
||||
LLUrlEntryPlace::LLUrlEntryPlace()
|
||||
{
|
||||
// <FS:Ansariel> Inworldz special
|
||||
//mPattern = boost::regex("((hop://[-\\w\\.\\:\\@]+/)|((x-grid-location-info://[-\\w\\.]+/region/)|(secondlife://)))\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?", // <AW: hop:// protocol>
|
||||
mPattern = boost::regex("((hop://[-\\w\\.\\:\\@]+/)|((x-grid-location-info://[-\\w\\.]+/region/)|((secondlife|inworldz|iw)://)))\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?", // <AW: hop:// protocol>
|
||||
mPattern = boost::regex("((hop://[-\\w\\.\\:\\@]+/)|((x-grid-location-info://[-\\w\\.]+/region/)|(secondlife://)))\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?", // <AW: hop:// protocol>
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_slurl.xml";
|
||||
mTooltip = LLTrans::getString("TooltipSLURL");
|
||||
|
|
@ -1415,7 +1412,7 @@ std::string LLUrlEntryTeleport::getLocation(const std::string &url) const
|
|||
///
|
||||
FSUrlEntryWear::FSUrlEntryWear()
|
||||
{
|
||||
mPattern = boost::regex("(hop|secondlife|inworldz|iw):///app/wear_folder/\\S+",
|
||||
mPattern = boost::regex("(hop|secondlife):///app/wear_folder/\\S+",
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_slapp.xml";
|
||||
mTooltip = LLTrans::getString("TooltipFSUrlEntryWear");
|
||||
|
|
@ -1433,7 +1430,7 @@ std::string FSUrlEntryWear::getLabel(const std::string &url, const LLUrlLabelCal
|
|||
//
|
||||
LLUrlEntrySL::LLUrlEntrySL()
|
||||
{
|
||||
mPattern = boost::regex("(hop|secondlife|inworldz|iw)://(\\w+)?(:\\d+)?/\\S+", // <AW: hop:// protocol>
|
||||
mPattern = boost::regex("(hop|secondlife)://(\\w+)?(:\\d+)?/\\S+", // <AW: hop:// protocol>
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_slapp.xml";
|
||||
mTooltip = LLTrans::getString("TooltipSLAPP");
|
||||
|
|
@ -1451,7 +1448,7 @@ std::string LLUrlEntrySL::getLabel(const std::string &url, const LLUrlLabelCallb
|
|||
///
|
||||
FSHelpDebugUrlEntrySL::FSHelpDebugUrlEntrySL()
|
||||
{
|
||||
mPattern = boost::regex("(hop|secondlife|inworldz|iw):///app/fshelp/showdebug/\\S+",
|
||||
mPattern = boost::regex("(hop|secondlife):///app/fshelp/showdebug/\\S+",
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_slapp.xml";
|
||||
mTooltip = LLTrans::getString("TooltipFSHelpDebugSLUrl");
|
||||
|
|
@ -1470,7 +1467,7 @@ std::string FSHelpDebugUrlEntrySL::getLabel(const std::string &url, const LLUrlL
|
|||
//
|
||||
LLUrlEntrySLLabel::LLUrlEntrySLLabel()
|
||||
{
|
||||
mPattern = boost::regex("\\[(hop|secondlife|inworldz|iw)://\\S+[ \t]+[^\\]]+\\]", // <AW: hop:// protocol>
|
||||
mPattern = boost::regex("\\[(hop|secondlife)://\\S+[ \t]+[^\\]]+\\]", // <AW: hop:// protocol>
|
||||
boost::regex::perl|boost::regex::icase);
|
||||
mMenuName = "menu_url_slapp.xml";
|
||||
mTooltip = LLTrans::getString("TooltipSLAPP");
|
||||
|
|
|
|||
|
|
@ -166,17 +166,6 @@
|
|||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>OpensimPrefsAddGrid</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Transient string for adding new grids in Preferences > Opensim</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string/>
|
||||
</map>
|
||||
<key>FSShowDummyAVsinRadar</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -2930,7 +2919,7 @@
|
|||
<key>Value</key>
|
||||
<integer>23</integer>
|
||||
</map>
|
||||
<key>EnableCacheDebugInfo</key>
|
||||
<key>EnableDiskCacheDebugInfo</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>When set, display additional cache debugging information</string>
|
||||
|
|
@ -2944,7 +2933,7 @@
|
|||
<key>DiskCachePercentOfTotal</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The percent of total cache size (defined by CacheSize) to use for the disk cache</string>
|
||||
<string>The percent of total cache size (defined by CacheSize) to use for the disk cache (UNUSED)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -2963,6 +2952,17 @@
|
|||
<key>Value</key>
|
||||
<string>cache</string>
|
||||
</map>
|
||||
<key>FSDiskCacheSize</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Controls amount of hard drive space reserved for local asset caching in MB</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>2048</integer>
|
||||
</map>
|
||||
<key>CacheLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -2999,7 +2999,7 @@
|
|||
<key>CacheSize</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Controls amount of hard drive space reserved for local file caching in MB</string>
|
||||
<string>Controls amount of hard drive space reserved for local texture caching in MB</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -9399,6 +9399,17 @@
|
|||
<key>Value</key>
|
||||
<string>salt_and_pepper.jpg</string>
|
||||
</map>
|
||||
<key>FSPhysicsPresetUser1</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>full system path to a user provided physics mesh (DAE).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>MigrateCacheDirectory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -25693,5 +25704,16 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSImageDecodeThreads</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Amount of threads to use for image decoding. 0 = autodetect, 1 = 0ff, >1 number of threads. Needs restart</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -938,8 +938,8 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
region_name = LLWeb::escapeURL(revised_text.substr(command.length() + 1));
|
||||
LLVector3d agentPos = gAgent.getPositionGlobal();
|
||||
agent_x = ll_round((F32)fmod(agentPos.mdV[VX], (F64)REGION_WIDTH_METERS));
|
||||
agent_y = ll_round((F32)fmod(agentPos.mdV[VY], (F64)REGION_WIDTH_METERS));
|
||||
agent_x = ll_round((F32)agentPos.mdV[VX]);
|
||||
agent_y = ll_round((F32)agentPos.mdV[VY]);
|
||||
agent_z = ll_round((F32)agentPos.mdV[VZ]);
|
||||
if (!sFSCmdLineMapToKeepPos)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,74 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<COLLADA version="1.4.1" xmlns="http://www.collada.org/2005/11/COLLADASchema">
|
||||
<asset>
|
||||
<contributor>
|
||||
<author>Avastar User</author>
|
||||
<authoring_tool>Avastar 2-0-10 on Blender 2.78 (sub 0)</authoring_tool>
|
||||
</contributor>
|
||||
<created>2017-02-03T17:31:59</created>
|
||||
<modified>2017-02-03T17:31:59</modified>
|
||||
<unit meter="1" name="meter" />
|
||||
<up_axis>Z_UP</up_axis>
|
||||
</asset>
|
||||
<library_cameras />
|
||||
<library_lights />
|
||||
<library_effects />
|
||||
<library_materials />
|
||||
<library_geometries>
|
||||
<geometry id="Cube_023-mesh" name="Cube.023">
|
||||
<mesh>
|
||||
<source id="Cube_023-mesh-positions">
|
||||
<float_array count="24" id="Cube_023-mesh-positions-array">-0.4 -0.4 -0.4 -0.4 -0.4 0.4 -0.4 0.4 -0.4 -0.4 0.4 0.4 0.4 -0.4 -0.4 0.4 -0.4 0.4 0.4 0.4 -0.4 0.4 0.4 0.4 </float_array>
|
||||
<technique_common>
|
||||
<accessor count="8" source="#Cube_023-mesh-positions-array" stride="3">
|
||||
<param name="X" type="float" />
|
||||
<param name="Y" type="float" />
|
||||
<param name="Z" type="float" />
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="Cube_023-mesh-normals">
|
||||
<float_array count="18" id="Cube_023-mesh-normals-array">-1 -0 0 0 1 0 1 -0 0 0 -1 0 0 0 -1 0 -0 1 </float_array>
|
||||
<technique_common>
|
||||
<accessor count="6" source="#Cube_023-mesh-normals-array" stride="3">
|
||||
<param name="X" type="float" />
|
||||
<param name="Y" type="float" />
|
||||
<param name="Z" type="float" />
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<vertices id="Cube_023-mesh-vertices">
|
||||
<input semantic="POSITION" source="#Cube_023-mesh-positions" />
|
||||
</vertices>
|
||||
<polylist count="12">
|
||||
<input offset="0" semantic="VERTEX" source="#Cube_023-mesh-vertices" />
|
||||
<input offset="1" semantic="NORMAL" source="#Cube_023-mesh-normals" />
|
||||
<vcount>4 4 4 4 4 4</vcount>
|
||||
<p>0 0 1 0 3 0 2 0 2 1 3 1 7 1 6 1 6 2 7 2 5 2 4 2 4 3 5 3 1 3 0 3 2 4 6 4 4 4 0 4 7 5 3 5 1 5 5 5 </p>
|
||||
</polylist>
|
||||
</mesh>
|
||||
<extra>
|
||||
<technique profile="MAYA">
|
||||
<double_sided>1</double_sided>
|
||||
</technique>
|
||||
</extra>
|
||||
</geometry>
|
||||
</library_geometries>
|
||||
<library_controllers />
|
||||
<library_visual_scenes>
|
||||
<visual_scene id="Scene" name="Scene">
|
||||
<node id="Cube_023" name="Cube_023" type="NODE">
|
||||
<translate sid="location">5.93563 6.77334 -14.9673</translate>
|
||||
<rotate sid="rotationZ">0 0 1 0</rotate>
|
||||
<rotate sid="rotationY">0 1 0 0</rotate>
|
||||
<rotate sid="rotationX">1 0 0 0</rotate>
|
||||
<scale sid="scale">1 1 1</scale>
|
||||
<instance_geometry url="#Cube_023-mesh" />
|
||||
</node>
|
||||
</visual_scene>
|
||||
</library_visual_scenes>
|
||||
<scene>
|
||||
<instance_visual_scene url="#Scene" />
|
||||
</scene>
|
||||
</COLLADA>
|
||||
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<asset>
|
||||
<contributor>
|
||||
<author>Blender User</author>
|
||||
<authoring_tool>Blender 2.80.43 commit date:2019-01-29, commit time:22:41, hash:a1ae04d15a9f</authoring_tool>
|
||||
</contributor>
|
||||
<created>2019-02-05T14:28:24</created>
|
||||
<modified>2019-02-05T14:28:24</modified>
|
||||
<unit name="meter" meter="1"/>
|
||||
<up_axis>Z_UP</up_axis>
|
||||
</asset>
|
||||
<library_images/>
|
||||
<library_geometries>
|
||||
<geometry id="Cylinder-mesh" name="Cylinder">
|
||||
<mesh>
|
||||
<source id="Cylinder-mesh-positions">
|
||||
<float_array id="Cylinder-mesh-positions-array" count="36">0 1 -1 0 1 1 0.8660255 0.5 -1 0.8660255 0.5 1 0.8660254 -0.5000001 -1 0.8660254 -0.5000001 1 0 -1 -1 0 -1 1 -0.8660255 -0.4999999 -1 -0.8660255 -0.4999999 1 -0.8660255 0.4999999 -1 -0.8660255 0.4999999 1</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#Cylinder-mesh-positions-array" count="12" stride="3">
|
||||
<param name="X" type="float"/>
|
||||
<param name="Y" type="float"/>
|
||||
<param name="Z" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="Cylinder-mesh-normals">
|
||||
<float_array id="Cylinder-mesh-normals-array" count="48">0.5 0.8660255 0 1 0 0 0.5 -0.8660255 0 -0.5000001 -0.8660253 0 0 0 1 -1 0 0 -0.5000001 0.8660255 0 0 0 -1 1 -1.19209e-7 0 0.5 -0.8660255 0 -0.5000001 -0.8660254 0 0 0 1 1.37651e-7 0 1 0 0 1 1.37651e-7 0 -1 1.37651e-7 0 -1</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#Cylinder-mesh-normals-array" count="16" stride="3">
|
||||
<param name="X" type="float"/>
|
||||
<param name="Y" type="float"/>
|
||||
<param name="Z" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="Cylinder-mesh-map">
|
||||
<float_array id="Cylinder-mesh-map-array" count="120">1 1 0.8333333 0.5 1 0.5 0.8333333 1 0.6666666 0.5 0.8333333 0.5 0.6666666 1 0.5 0.5 0.6666666 0.5 0.5 1 0.3333333 0.5 0.5 0.5 0.25 0.49 0.04215389 0.13 0.4578461 0.1299999 0.3333333 1 0.1666666 0.5 0.3333333 0.5 0.1666666 1 0 0.5 0.1666666 0.5 0.5421539 0.13 0.5421539 0.37 0.9578461 0.37 1 1 0.8333333 1 0.8333333 0.5 0.8333333 1 0.6666666 1 0.6666666 0.5 0.6666666 1 0.5 1 0.5 0.5 0.5 1 0.3333333 1 0.3333333 0.5 0.4578461 0.1299999 0.4578461 0.37 0.25 0.49 0.25 0.49 0.04215389 0.37 0.04215389 0.13 0.04215389 0.13 0.25 0.00999999 0.4578461 0.1299999 0.3333333 1 0.1666666 1 0.1666666 0.5 0.1666666 1 0 1 0 0.5 0.5421539 0.37 0.75 0.49 0.9578461 0.37 0.9578461 0.37 0.9578461 0.1299999 0.75 0.00999999 0.75 0.00999999 0.5421539 0.13 0.9578461 0.37</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#Cylinder-mesh-map-array" count="60" stride="2">
|
||||
<param name="S" type="float"/>
|
||||
<param name="T" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<vertices id="Cylinder-mesh-vertices">
|
||||
<input semantic="POSITION" source="#Cylinder-mesh-positions"/>
|
||||
</vertices>
|
||||
<polylist count="20">
|
||||
<input semantic="VERTEX" source="#Cylinder-mesh-vertices" offset="0"/>
|
||||
<input semantic="NORMAL" source="#Cylinder-mesh-normals" offset="1"/>
|
||||
<input semantic="TEXCOORD" source="#Cylinder-mesh-map" offset="2" set="0"/>
|
||||
<vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
|
||||
<p>1 0 0 2 0 1 0 0 2 3 1 3 4 1 4 2 1 5 5 2 6 6 2 7 4 2 8 7 3 9 8 3 10 6 3 11 1 4 12 9 4 13 5 4 14 9 5 15 10 5 16 8 5 17 11 6 18 0 6 19 10 6 20 8 7 21 10 7 22 2 7 23 1 0 24 3 0 25 2 0 26 3 8 27 5 8 28 4 8 29 5 9 30 7 9 31 6 9 32 7 10 33 9 10 34 8 10 35 5 11 36 3 11 37 1 11 38 1 12 39 11 12 40 9 12 41 9 13 42 7 13 43 5 13 44 9 5 45 11 5 46 10 5 47 11 6 48 1 6 49 0 6 50 10 14 51 0 14 52 2 14 53 2 15 54 4 15 55 6 15 56 6 7 57 8 7 58 2 7 59</p>
|
||||
</polylist>
|
||||
</mesh>
|
||||
</geometry>
|
||||
</library_geometries>
|
||||
<library_visual_scenes>
|
||||
<visual_scene id="Scene" name="Scene">
|
||||
<node id="Cylinder" name="Cylinder" type="NODE">
|
||||
<matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
|
||||
<instance_geometry url="#Cylinder-mesh" name="Cylinder"/>
|
||||
</node>
|
||||
</visual_scene>
|
||||
</library_visual_scenes>
|
||||
<scene>
|
||||
<instance_visual_scene url="#Scene"/>
|
||||
</scene>
|
||||
</COLLADA>
|
||||
|
|
@ -72,6 +72,7 @@ FSFloaterContacts::FSFloaterContacts(const LLSD& seed)
|
|||
mFriendsList(NULL),
|
||||
mGroupList(NULL),
|
||||
mFriendFilter(NULL),
|
||||
mGroupFilter(NULL),
|
||||
mFriendFilterSubString(LLStringUtil::null),
|
||||
mFriendFilterSubStringOrig(LLStringUtil::null),
|
||||
mAllowRightsChange(true),
|
||||
|
|
@ -153,7 +154,10 @@ BOOL FSFloaterContacts::postBuild()
|
|||
mGroupsTab->childSetAction("titles_btn", boost::bind(&FSFloaterContacts::onGroupTitlesButtonClicked, this));
|
||||
mGroupsTab->childSetAction("invite_btn", boost::bind(&FSFloaterContacts::onGroupInviteButtonClicked, this));
|
||||
mGroupsTab->setDefaultBtn("chat_btn");
|
||||
|
||||
|
||||
mGroupFilter = mGroupsTab->getChild<LLFilterEditor>("group_filter_input");
|
||||
mGroupFilter->setCommitCallback(boost::bind(&FSFloaterContacts::onGroupFilterEdit, this, _2));
|
||||
|
||||
mRlvBehaviorCallbackConnection = gRlvHandler.setBehaviourCallback(boost::bind(&FSFloaterContacts::updateRlvRestrictions, this, _1));
|
||||
|
||||
gSavedSettings.getControl("FSFriendListFullNameFormat")->getSignal()->connect(boost::bind(&FSFloaterContacts::onDisplayNameChanged, this));
|
||||
|
|
@ -195,10 +199,18 @@ BOOL FSFloaterContacts::tick()
|
|||
|
||||
BOOL FSFloaterContacts::handleKeyHere(KEY key, MASK mask)
|
||||
{
|
||||
if (FSCommon::isFilterEditorKeyCombo(key, mask) && getActiveTabName() == FRIENDS_TAB_NAME && gSavedSettings.getBOOL("FSContactListShowSearch"))
|
||||
if (FSCommon::isFilterEditorKeyCombo(key, mask))
|
||||
{
|
||||
mFriendFilter->setFocus(TRUE);
|
||||
return TRUE;
|
||||
if (getActiveTabName() == FRIENDS_TAB_NAME && gSavedSettings.getBOOL("FSContactListShowSearch"))
|
||||
{
|
||||
mFriendFilter->setFocus(TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
else if (getActiveTabName() == GROUP_TAB_NAME)
|
||||
{
|
||||
mGroupFilter->setFocus(TRUE);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (mask == MASK_CONTROL && key == 'W' && getHost())
|
||||
|
|
@ -1357,4 +1369,9 @@ void FSFloaterContacts::resetFriendFilter()
|
|||
mFriendFilter->setText(LLStringUtil::null);
|
||||
onFriendFilterEdit("");
|
||||
}
|
||||
|
||||
void FSFloaterContacts::onGroupFilterEdit(const std::string& search_string)
|
||||
{
|
||||
mGroupList->setNameFilter(search_string);
|
||||
}
|
||||
// EOF
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ private:
|
|||
EAcceptance* accept,
|
||||
std::string& tooltip_msg);
|
||||
void onFriendFilterEdit(const std::string& search_string);
|
||||
void onGroupFilterEdit(const std::string& search_string);
|
||||
|
||||
// friend buttons
|
||||
void onViewProfileButtonClicked();
|
||||
|
|
@ -128,7 +129,6 @@ private:
|
|||
void onPayButtonClicked();
|
||||
void onDeleteFriendButtonClicked();
|
||||
void onAddFriendWizButtonClicked(LLUICtrl* ctrl);
|
||||
void onContactSetsButtonClicked();
|
||||
void onMapButtonClicked();
|
||||
|
||||
// group buttons
|
||||
|
|
@ -144,6 +144,7 @@ private:
|
|||
|
||||
LLTabContainer* mTabContainer;
|
||||
LLFilterEditor* mFriendFilter;
|
||||
LLFilterEditor* mGroupFilter;
|
||||
LLPanel* mFriendsTab;
|
||||
FSScrollListCtrl* mFriendsList;
|
||||
LLPanel* mGroupsTab;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "fsfloatergrouptitles.h"
|
||||
#include "fscommon.h"
|
||||
#include "llfiltereditor.h"
|
||||
#include "llgroupactions.h"
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "lltrans.h"
|
||||
|
|
@ -34,7 +36,7 @@
|
|||
/////////////////////////////////////////////////////
|
||||
// FSGroupTitlesObserver class
|
||||
//
|
||||
FSGroupTitlesObserver::FSGroupTitlesObserver(const LLGroupData& group_data, FSFloaterGroupTitles* parent) :
|
||||
FSGroupTitlesObserver::FSGroupTitlesObserver(const LLGroupData& group_data, LLHandle<FSFloaterGroupTitles> parent) :
|
||||
LLGroupMgrObserver(group_data.mID),
|
||||
mGroupData(group_data),
|
||||
mParent(parent)
|
||||
|
|
@ -49,9 +51,9 @@ FSGroupTitlesObserver::~FSGroupTitlesObserver()
|
|||
|
||||
void FSGroupTitlesObserver::changed(LLGroupChange gc)
|
||||
{
|
||||
if (mParent)
|
||||
if (!mParent.isDead())
|
||||
{
|
||||
mParent->processGroupTitleResults(mGroupData);
|
||||
mParent.get()->processGroupTitleResults(mGroupData);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -60,7 +62,9 @@ void FSGroupTitlesObserver::changed(LLGroupChange gc)
|
|||
// FSGroupTitles class
|
||||
//
|
||||
FSFloaterGroupTitles::FSFloaterGroupTitles(const LLSD& key) :
|
||||
LLFloater(key)
|
||||
LLFloater(key),
|
||||
mFilterSubString(LLStringUtil::null),
|
||||
mFilterSubStringOrig(LLStringUtil::null)
|
||||
{
|
||||
// Register observer and event listener
|
||||
LLGroupMgr::getInstance()->addObserver(this);
|
||||
|
|
@ -85,20 +89,41 @@ BOOL FSFloaterGroupTitles::postBuild()
|
|||
mRefreshButton = getChild<LLButton>("btnRefresh");
|
||||
mInfoButton = getChild<LLButton>("btnInfo");
|
||||
mTitleList = getChild<LLScrollListCtrl>("title_list");
|
||||
mFilterEditor = getChild<LLFilterEditor>("filter_input");
|
||||
|
||||
mActivateButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this));
|
||||
mRefreshButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::refreshGroupTitles, this));
|
||||
mInfoButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::openGroupInfo, this));
|
||||
mTitleList->setDoubleClickCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this));
|
||||
mTitleList->setCommitCallback(boost::bind(&FSFloaterGroupTitles::selectedTitleChanged, this));
|
||||
mFilterEditor->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onFilterEdit, this, _2));
|
||||
|
||||
mTitleList->sortByColumn("title_sort_column", TRUE);
|
||||
mTitleList->setFilterColumn(0);
|
||||
|
||||
refreshGroupTitles();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void FSFloaterGroupTitles::onOpen(const LLSD& key)
|
||||
{
|
||||
LLFloater::onOpen(key);
|
||||
|
||||
mTitleList->setFocus(TRUE);
|
||||
}
|
||||
|
||||
BOOL FSFloaterGroupTitles::handleKeyHere(KEY key, MASK mask)
|
||||
{
|
||||
if (FSCommon::isFilterEditorKeyCombo(key, mask))
|
||||
{
|
||||
mFilterEditor->setFocus(TRUE);
|
||||
return true;
|
||||
}
|
||||
|
||||
return LLFloater::handleKeyHere(key, mask);
|
||||
}
|
||||
|
||||
void FSFloaterGroupTitles::changed(LLGroupChange gc)
|
||||
{
|
||||
switch (gc)
|
||||
|
|
@ -231,7 +256,7 @@ void FSFloaterGroupTitles::refreshGroupTitles()
|
|||
for (std::vector<LLGroupData>::iterator it = gAgent.mGroups.begin(); it != gAgent.mGroups.end(); ++it)
|
||||
{
|
||||
LLGroupData& group_data = *it;
|
||||
FSGroupTitlesObserver* roleObserver = new FSGroupTitlesObserver(group_data, this);
|
||||
FSGroupTitlesObserver* roleObserver = new FSGroupTitlesObserver(group_data, getDerivedHandle<FSFloaterGroupTitles>());
|
||||
mGroupTitleObserverMap[group_data.mID] = roleObserver;
|
||||
LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_data.mID);
|
||||
}
|
||||
|
|
@ -256,3 +281,22 @@ void FSFloaterGroupTitles::openGroupInfo()
|
|||
LLGroupActions::show(group_id);
|
||||
}
|
||||
}
|
||||
|
||||
void FSFloaterGroupTitles::onFilterEdit(const std::string& search_string)
|
||||
{
|
||||
mFilterSubStringOrig = search_string;
|
||||
LLStringUtil::trimHead(mFilterSubStringOrig);
|
||||
// Searches are case-insensitive
|
||||
std::string search_upper = mFilterSubStringOrig;
|
||||
LLStringUtil::toUpper(search_upper);
|
||||
|
||||
if (mFilterSubString == search_upper)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mFilterSubString = search_upper;
|
||||
|
||||
// Apply new filter.
|
||||
mTitleList->setFilterString(mFilterSubStringOrig);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,20 +33,21 @@
|
|||
#include "llgroupmgr.h"
|
||||
|
||||
class FSFloaterGroupTitles;
|
||||
class LLFilterEditor;
|
||||
class LLScrollListCtrl;
|
||||
|
||||
class FSGroupTitlesObserver : LLGroupMgrObserver
|
||||
{
|
||||
|
||||
public:
|
||||
FSGroupTitlesObserver(const LLGroupData& group_data, FSFloaterGroupTitles* parent);
|
||||
FSGroupTitlesObserver(const LLGroupData& group_data, LLHandle<FSFloaterGroupTitles> parent);
|
||||
virtual ~FSGroupTitlesObserver();
|
||||
|
||||
virtual void changed(LLGroupChange gc);
|
||||
|
||||
protected:
|
||||
FSFloaterGroupTitles* mParent;
|
||||
LLGroupData mGroupData;
|
||||
LLHandle<FSFloaterGroupTitles> mParent;
|
||||
LLGroupData mGroupData;
|
||||
};
|
||||
|
||||
class FSFloaterGroupTitles : public LLFloater, public LLGroupMgrObserver, public LLOldEvents::LLSimpleListener
|
||||
|
|
@ -57,6 +58,9 @@ public:
|
|||
virtual ~FSFloaterGroupTitles();
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
|
||||
/*virtual*/ bool hasAccelerators() const { return true; }
|
||||
|
||||
virtual void changed(LLGroupChange gc);
|
||||
bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); // called on agent group list changes
|
||||
|
|
@ -73,11 +77,16 @@ private:
|
|||
void activateGroupTitle();
|
||||
void selectedTitleChanged();
|
||||
void openGroupInfo();
|
||||
void onFilterEdit(const std::string& search_string);
|
||||
|
||||
LLButton* mActivateButton;
|
||||
LLButton* mRefreshButton;
|
||||
LLButton* mInfoButton;
|
||||
LLScrollListCtrl* mTitleList;
|
||||
LLFilterEditor* mFilterEditor;
|
||||
|
||||
std::string mFilterSubString;
|
||||
std::string mFilterSubStringOrig;
|
||||
|
||||
typedef std::map<LLUUID, FSGroupTitlesObserver*> observer_map_t;
|
||||
observer_map_t mGroupTitleObserverMap;
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@
|
|||
#include "llpanelplaceprofile.h"
|
||||
#include "llpanellandmarkinfo.h"
|
||||
#include "llparcel.h"
|
||||
#include "llregionhandle.h" // <FS:Beq/> Var region support
|
||||
#include "llteleporthistorystorage.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewermessage.h"
|
||||
|
|
@ -355,7 +356,15 @@ void FSFloaterPlaceDetails::onOpen(const LLSD& key)
|
|||
key["z"].asReal());
|
||||
|
||||
mPanelPlaceInfo->setParcelDetailLoadedCallback(boost::bind(&FSFloaterPlaceDetails::processParcelDetails, this, _1));
|
||||
mPanelPlaceInfo->displayParcelInfo(LLUUID(), mGlobalPos);
|
||||
if(key.has("ox"))
|
||||
{
|
||||
auto region_handle = to_region_handle(key["ox"].asInteger(), key["oy"].asInteger());
|
||||
mPanelPlaceInfo->displayParcelInfo(LLUUID(), region_handle, mGlobalPos);
|
||||
}
|
||||
else
|
||||
{
|
||||
mPanelPlaceInfo->displayParcelInfo(LLUUID(), mGlobalPos);
|
||||
}
|
||||
}
|
||||
|
||||
updateVerbs();
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llcommandhandler.h"
|
||||
#include "lllogininstance.h" // to check if logged in yet
|
||||
#include "llnotifications.h"
|
||||
#include "llnotificationsutil.h"
|
||||
|
|
@ -36,6 +37,7 @@
|
|||
#include "llviewercontrol.h"
|
||||
#include "llsdserialize.h"
|
||||
#include "llsecapi.h"
|
||||
#include "llstartup.h"
|
||||
|
||||
#include "lltrans.h"
|
||||
#include "llweb.h"
|
||||
|
|
@ -48,6 +50,7 @@
|
|||
#include "llstartup.h"
|
||||
|
||||
#include "fscorehttputil.h"
|
||||
#include "fspanellogin.h"
|
||||
#include "lfsimfeaturehandler.h" // <COLOSI opensim multi-currency support />
|
||||
|
||||
void gridDownloadError( LLSD const &aData, LLGridManager* mOwner, GridEntry* mData, LLGridManager::AddState mState )
|
||||
|
|
@ -819,7 +822,6 @@ void LLGridManager::addGrid(GridEntry* grid_entry, AddState state)
|
|||
if (list_changed)
|
||||
{
|
||||
mGridListChangedSignal(true);
|
||||
mGridListChangedSignal.disconnect_all_slots();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -841,7 +843,6 @@ void LLGridManager::addGrid(GridEntry* grid_entry, AddState state)
|
|||
if (FAIL == state)
|
||||
{
|
||||
mGridListChangedSignal(false);
|
||||
mGridListChangedSignal.disconnect_all_slots();
|
||||
}
|
||||
|
||||
if (grid_entry)
|
||||
|
|
@ -1384,10 +1385,6 @@ std::string LLGridManager::getAppSLURLBase(const std::string& grid)
|
|||
{
|
||||
ret = mGridList[grid][GRID_APP_SLURL_BASE].asString();
|
||||
}
|
||||
else if (grid == INWORLDZ_URI)
|
||||
{
|
||||
ret = "inworldz:///app";
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string app_base;
|
||||
|
|
@ -1422,3 +1419,61 @@ std::string LLGridManager::getAppSLURLBase(const std::string& grid)
|
|||
LL_DEBUGS("GridManager") << "App slurl base: " << ret << " - grid = " << grid << LL_ENDL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
class FSGridManagerCommandHandler : public LLCommandHandler
|
||||
{
|
||||
public:
|
||||
// not allowed from outside the app
|
||||
FSGridManagerCommandHandler() : LLCommandHandler("gridmanager", UNTRUSTED_THROTTLE),
|
||||
mDownloadConnection()
|
||||
{ }
|
||||
|
||||
~FSGridManagerCommandHandler()
|
||||
{
|
||||
if (mDownloadConnection.connected())
|
||||
{
|
||||
mDownloadConnection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (params.size() < 2)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (params[0].asString() == "addgrid")
|
||||
{
|
||||
std::string login_uri = LLURI::unescape(params[1].asString());
|
||||
mDownloadConnection = LLGridManager::instance().addGridListChangedCallback(boost::bind(&FSGridManagerCommandHandler::handleGridDownloadComplete, this, _1));
|
||||
LLGridManager::instance().addGrid(login_uri);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
boost::signals2::connection mDownloadConnection;
|
||||
|
||||
void handleGridDownloadComplete(bool success)
|
||||
{
|
||||
if (mDownloadConnection.connected())
|
||||
{
|
||||
mDownloadConnection.disconnect();
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
LLGridManager::getInstance()->saveGridList();
|
||||
if (LLStartUp::getStartupState() <= STATE_LOGIN_WAIT)
|
||||
{
|
||||
FSPanelLogin::updateServer();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Creating the object registers with the dispatcher.
|
||||
FSGridManagerCommandHandler gFSGridManagerCommandHandler;
|
||||
|
|
|
|||
|
|
@ -184,7 +184,8 @@ FSPanelLogin::FSPanelLogin(const LLRect &rect,
|
|||
mPasswordLength(0),
|
||||
mLocationLength(0),
|
||||
mShowFavorites(false),
|
||||
mInitialized(false)
|
||||
mInitialized(false),
|
||||
mGridListChangedCallbackConnection()
|
||||
{
|
||||
setBackgroundVisible(FALSE);
|
||||
setBackgroundOpaque(TRUE);
|
||||
|
|
@ -387,6 +388,11 @@ void FSPanelLogin::addFavoritesToStartLocation()
|
|||
|
||||
FSPanelLogin::~FSPanelLogin()
|
||||
{
|
||||
if (mGridListChangedCallbackConnection.connected())
|
||||
{
|
||||
mGridListChangedCallbackConnection.disconnect();
|
||||
}
|
||||
|
||||
FSPanelLogin::sInstance = NULL;
|
||||
|
||||
// Controls having keyboard focus by default
|
||||
|
|
@ -1113,14 +1119,18 @@ void FSPanelLogin::onSelectServer()
|
|||
LLComboBox* server_combo = getChild<LLComboBox>("server_combo");
|
||||
LLSD server_combo_val = server_combo->getSelectedValue();
|
||||
#if OPENSIM && !SINGLEGRID
|
||||
LL_INFOS("AppInit") << "grid "<<(!server_combo_val.isUndefined()?server_combo_val.asString():server_combo->getValue().asString())<< LL_ENDL;
|
||||
LL_INFOS("AppInit") << "grid " << (!server_combo_val.isUndefined() ? server_combo_val.asString() : server_combo->getValue().asString()) << LL_ENDL;
|
||||
if (server_combo_val.isUndefined() && sPendingNewGridURI.empty())
|
||||
{
|
||||
sPendingNewGridURI = server_combo->getValue().asString();
|
||||
LLStringUtil::trim(sPendingNewGridURI);
|
||||
LL_INFOS("AppInit") << "requesting unknown grid "<< sPendingNewGridURI << LL_ENDL;
|
||||
LL_INFOS("AppInit") << "requesting unknown grid " << sPendingNewGridURI << LL_ENDL;
|
||||
// Previously unknown gridname was entered
|
||||
LLGridManager::getInstance()->addGridListChangedCallback(boost::bind(&FSPanelLogin::gridListChanged, this, _1));
|
||||
if (mGridListChangedCallbackConnection.connected())
|
||||
{
|
||||
mGridListChangedCallbackConnection.disconnect();
|
||||
}
|
||||
mGridListChangedCallbackConnection = LLGridManager::getInstance()->addGridListChangedCallback(boost::bind(&FSPanelLogin::gridListChanged, this, _1));
|
||||
LLGridManager::getInstance()->addGrid(sPendingNewGridURI);
|
||||
}
|
||||
else
|
||||
|
|
@ -1452,6 +1462,11 @@ std::string FSPanelLogin::credentialName()
|
|||
|
||||
void FSPanelLogin::gridListChanged(bool success)
|
||||
{
|
||||
if (mGridListChangedCallbackConnection.connected())
|
||||
{
|
||||
mGridListChangedCallbackConnection.disconnect();
|
||||
}
|
||||
|
||||
updateServer();
|
||||
sPendingNewGridURI.clear(); // success or fail we clear the pending URI as we will not get another callback.
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,6 +114,8 @@ private:
|
|||
static std::string credentialName();
|
||||
|
||||
private:
|
||||
boost::signals2::connection mGridListChangedCallbackConnection;
|
||||
|
||||
void updateLoginButtons();
|
||||
|
||||
void (*mCallback)(S32 option, void *userdata);
|
||||
|
|
|
|||
|
|
@ -59,11 +59,6 @@ const char* LLSLURL::SLURL_REGION_PATH = "region";
|
|||
const char* LLSLURL::SIM_LOCATION_HOME = "home";
|
||||
const char* LLSLURL::SIM_LOCATION_LAST = "last";
|
||||
|
||||
// Inworldz special
|
||||
const char* LLSLURL::SLURL_INWORLDZ_SCHEME = "inworldz";
|
||||
const char* LLSLURL::SLURL_IW_SCHEME = "iw";
|
||||
const char* LLSLURL::PLACES_INWORLDZ_COM = "places.inworldz.com";
|
||||
|
||||
// resolve a simstring from a slurl
|
||||
LLSLURL::LLSLURL(const std::string& slurl)
|
||||
: mHypergrid(false)
|
||||
|
|
@ -244,55 +239,6 @@ LLSLURL::LLSLURL(const std::string& slurl)
|
|||
path_array.insert(0, slurl_uri.hostNameAndPort());
|
||||
}
|
||||
}
|
||||
else if (slurl_uri.scheme() == LLSLURL::SLURL_INWORLDZ_SCHEME ||
|
||||
slurl_uri.scheme() == LLSLURL::SLURL_IW_SCHEME)
|
||||
{
|
||||
LL_DEBUGS("SLURL") << "inworldz scheme" << LL_ENDL;
|
||||
|
||||
mGrid = INWORLDZ_URI;
|
||||
|
||||
if (path_array[0].asString() == LLSLURL::SLURL_APP_PATH)
|
||||
{
|
||||
// it's in the form iw://<grid>/(app)
|
||||
// so parse the grid name to derive the grid ID
|
||||
if (!slurl_uri.hostNameAndPort().empty())
|
||||
{
|
||||
LL_DEBUGS("SLURL") << "(inworldz|iw)://<grid>/app" << LL_ENDL;
|
||||
|
||||
mGrid = LLGridManager::getInstance()->getGridByProbing(slurl_uri.hostNameAndPort());
|
||||
if (mGrid.empty())
|
||||
{
|
||||
mGrid = LLGridManager::getInstance()->getGridByProbing(slurl_uri.hostName());
|
||||
}
|
||||
}
|
||||
else if (path_array[0].asString() == LLSLURL::SLURL_APP_PATH)
|
||||
{
|
||||
LL_DEBUGS("SLURL") << "(inworldz|iw):///app" << LL_ENDL;
|
||||
|
||||
// for app style slurls, where no grid name is specified, assume the currently
|
||||
// selected or logged in grid.
|
||||
mGrid = LLGridManager::getInstance()->getGridId();
|
||||
}
|
||||
|
||||
if (mGrid.empty() && LLStartUp::getStartupState() == STATE_STARTED)
|
||||
{
|
||||
// we couldn't find the grid in the grid manager, so bail
|
||||
LL_WARNS("SLURL")<<"unable to find grid"<<LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
mType = APP;
|
||||
path_array.erase(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// it wasn't a /inworldz/<region> or /app/<params>, so it must be iw://<region>
|
||||
// therefore the hostname will be the region name, and it's a location type
|
||||
mType = LOCATION;
|
||||
// 'normalize' it so the region name is in fact the head of the path_array
|
||||
path_array.insert(0, slurl_uri.hostName());
|
||||
}
|
||||
}
|
||||
else if((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME)
|
||||
|| (slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME)
|
||||
|| (slurl_uri.scheme() == LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME)
|
||||
|
|
@ -309,13 +255,6 @@ LLSLURL::LLSLURL(const std::string& slurl)
|
|||
else
|
||||
mGrid = default_grid;
|
||||
}
|
||||
// places.inworldz.com isn't your regular everyday slurl
|
||||
else if (slurl_uri.hostName() == LLSLURL::PLACES_INWORLDZ_COM)
|
||||
{
|
||||
// likewise, places.inworldz.com implies inworldz and a location
|
||||
mGrid = INWORLDZ_URI;
|
||||
mType = LOCATION;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("SLURL") << "slurl style Standalone" << LL_ENDL;
|
||||
|
|
@ -402,7 +341,7 @@ LLSLURL::LLSLURL(const std::string& slurl)
|
|||
LL_DEBUGS("SLURL") << "It's a location hop" << LL_ENDL;
|
||||
mType = LOCATION;
|
||||
}
|
||||
else if (slurl_uri.hostName() != LLSLURL::PLACES_INWORLDZ_COM)
|
||||
else
|
||||
{
|
||||
LL_DEBUGS("SLURL") << "Not a valid https/http/x-grid-location-info slurl " << slurl << LL_ENDL;
|
||||
// not a valid https/http/x-grid-location-info slurl, so it'll likely just be a URL
|
||||
|
|
@ -530,29 +469,46 @@ LLSLURL::LLSLURL(const std::string& region, const LLVector3& position, bool hype
|
|||
*this = LLSLURL(LLGridManager::getInstance()->getGrid(), region, position);
|
||||
}
|
||||
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
// create a slurl from a global position
|
||||
LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
{
|
||||
//LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position, bool hypergrid)
|
||||
//: mHypergrid(hypergrid)
|
||||
//{
|
||||
// <FS:CR> Aurora-sim var region teleports
|
||||
//*this = LLSLURL(grid,
|
||||
// region, LLVector3(global_position.mdV[VX],
|
||||
// global_position.mdV[VY],
|
||||
// global_position.mdV[VZ]));
|
||||
S32 x = ll_round( (F32)fmod( (F32)global_position.mdV[VX], (F32)REGION_WIDTH_METERS ) );
|
||||
S32 y = ll_round( (F32)fmod( (F32)global_position.mdV[VY], (F32)REGION_WIDTH_METERS ) );
|
||||
S32 z = ll_round( (F32)global_position.mdV[VZ] );
|
||||
// S32 x = ll_round( (F32)fmod( (F32)global_position.mdV[VX], (F32)REGION_WIDTH_METERS ) );
|
||||
// S32 y = ll_round( (F32)fmod( (F32)global_position.mdV[VY], (F32)REGION_WIDTH_METERS ) );
|
||||
// S32 z = ll_round( (F32)global_position.mdV[VZ] );
|
||||
|
||||
*this = LLSLURL(grid, region, LLVector3(x, y, z));
|
||||
// *this = LLSLURL(grid, region, LLVector3(x, y, z));
|
||||
// </FS:CR>
|
||||
//}
|
||||
//
|
||||
// create a slurl from a global position
|
||||
//LLSLURL::LLSLURL(const std::string& region, const LLVector3d& global_position, bool hypergrid)
|
||||
//: mHypergrid(hypergrid)
|
||||
//{
|
||||
// *this = LLSLURL(LLGridManager::getInstance()->getGrid(), region, global_position);
|
||||
//}
|
||||
|
||||
// create a slurl from a global position
|
||||
LLSLURL::LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& region_origin, const LLVector3d& global_position, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
{
|
||||
LLVector3 local_position = LLVector3(global_position - region_origin);
|
||||
*this = LLSLURL(grid, region, local_position);
|
||||
}
|
||||
|
||||
// create a slurl from a global position
|
||||
LLSLURL::LLSLURL(const std::string& region, const LLVector3d& global_position, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
LLSLURL::LLSLURL(const std::string& region, const LLVector3d& region_origin, const LLVector3d& global_position, bool hypergrid)
|
||||
: mHypergrid(hypergrid)
|
||||
{
|
||||
*this = LLSLURL(LLGridManager::getInstance()->getGrid(), region, global_position);
|
||||
*this = LLSLURL(LLGridManager::getInstance()->getGrid(), region, region_origin, global_position);
|
||||
}
|
||||
// </FS:Beq pp Oren>
|
||||
|
||||
LLSLURL::LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb)
|
||||
: mHypergrid(false)
|
||||
|
|
|
|||
|
|
@ -52,11 +52,6 @@ public:
|
|||
static const char* SIM_LOCATION_LAST;
|
||||
static const char* SLURL_APP_PATH;
|
||||
static const char* SLURL_REGION_PATH;
|
||||
|
||||
// Inworldz special
|
||||
static const char* SLURL_INWORLDZ_SCHEME;
|
||||
static const char* SLURL_IW_SCHEME;
|
||||
static const char* PLACES_INWORLDZ_COM;
|
||||
|
||||
enum SLURL_TYPE
|
||||
{
|
||||
|
|
@ -73,8 +68,12 @@ public:
|
|||
LLSLURL(const std::string& grid, const std::string& region, bool hypergrid = false);
|
||||
LLSLURL(const std::string& region, const LLVector3& position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3& position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& region, const LLVector3d& global_position, bool hypergrid = false);
|
||||
// <FS:Beq> FIRE-30768: SLURL's don't work in VarRegions (patch from Oren)
|
||||
// LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& region_origin, const LLVector3d& global_position, bool hypergrid = false);
|
||||
LLSLURL(const std::string& region, const LLVector3d& region_origin, const LLVector3d& global_position, bool hypergrid = false);
|
||||
// </FS:Beq>
|
||||
LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb);
|
||||
LLSLURL(const LLSD& path_array, bool from_app);
|
||||
|
||||
|
|
|
|||
|
|
@ -4606,7 +4606,19 @@ bool LLAgent::teleportBridgeLocal(LLVector3& pos_local)
|
|||
|
||||
bool LLAgent::teleportBridgeGlobal(const LLVector3d& pos_global)
|
||||
{
|
||||
U64 region_handle = to_region_handle(pos_global);
|
||||
// <FS:Beq> FIRE-30534 VarRegion fixes
|
||||
// U64 region_handle = to_region_handle(pos_global);
|
||||
U64 region_handle{};
|
||||
auto regionp = getRegion();
|
||||
if(regionp)
|
||||
{
|
||||
region_handle = to_region_handle(pos_global, regionp->getOriginGlobal(), regionp->getWidth());
|
||||
}
|
||||
else
|
||||
{
|
||||
region_handle = to_region_handle(pos_global);
|
||||
}
|
||||
// </FS:Beq>
|
||||
LLVector3 pos_local = (LLVector3)(pos_global - from_region_handle(region_handle));
|
||||
|
||||
return teleportBridgeLocal(pos_local);
|
||||
|
|
@ -5084,23 +5096,83 @@ void LLAgent::doTeleportViaLocation(const LLVector3d& pos_global)
|
|||
{
|
||||
return;
|
||||
}
|
||||
// <FS:Beq> FIRE-30534 Var Region tp / map locaton fixes
|
||||
// U64 handle = to_region_handle(pos_global);
|
||||
// bool isLocal = (regionp->getHandle() == to_region_handle_global((F32)pos_global.mdV[VX], (F32)pos_global.mdV[VY]));
|
||||
// LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
|
||||
// if(regionp && info)
|
||||
// {
|
||||
// LLVector3d region_origin = info->getGlobalOrigin();
|
||||
// LLVector3 pos_local(
|
||||
// (F32)(pos_global.mdV[VX] - region_origin.mdV[VX]),
|
||||
// (F32)(pos_global.mdV[VY] - region_origin.mdV[VY]),
|
||||
// (F32)(pos_global.mdV[VZ]));
|
||||
// // <FS:CR> Aurora-sim var region teleports
|
||||
// //teleportRequest(handle, pos_local);
|
||||
// teleportRequest(info->getHandle(), pos_local);
|
||||
// // </FS:CR>
|
||||
// }
|
||||
// else if(regionp && teleportCore(isLocal))
|
||||
// {
|
||||
// // send the message
|
||||
// LLMessageSystem* msg = gMessageSystem;
|
||||
// msg->newMessageFast(_PREHASH_TeleportLocationRequest);
|
||||
// msg->nextBlockFast(_PREHASH_AgentData);
|
||||
// msg->addUUIDFast(_PREHASH_AgentID, getID());
|
||||
// msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
|
||||
|
||||
U64 handle = to_region_handle(pos_global);
|
||||
bool isLocal = (regionp->getHandle() == to_region_handle_global((F32)pos_global.mdV[VX], (F32)pos_global.mdV[VY]));
|
||||
LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
|
||||
if(regionp && info)
|
||||
// msg->nextBlockFast(_PREHASH_Info);
|
||||
// // <FS:Ansariel> FIRE-17262: Wrong local teleports on a large opensim region (apparently need to divide by grid unit size)
|
||||
// F32 width = REGION_WIDTH_METERS;// regionp->getWidth();
|
||||
// LLVector3 pos(fmod((F32)pos_global.mdV[VX], width),
|
||||
// fmod((F32)pos_global.mdV[VY], width),
|
||||
// (F32)pos_global.mdV[VZ]);
|
||||
// F32 region_x = (F32)(pos_global.mdV[VX]);
|
||||
// F32 region_y = (F32)(pos_global.mdV[VY]);
|
||||
// U64 region_handle = to_region_handle_global(region_x, region_y);
|
||||
// msg->addU64Fast(_PREHASH_RegionHandle, region_handle);
|
||||
// msg->addVector3Fast(_PREHASH_Position, pos);
|
||||
// pos.mV[VX] += 1;
|
||||
// msg->addVector3Fast(_PREHASH_LookAt, pos);
|
||||
|
||||
// LL_WARNS("Teleport") << "Sending deprecated(?) TeleportLocationRequest."
|
||||
// << " pos_global " << pos_global
|
||||
// << " region_x " << region_x
|
||||
// << " region_y " << region_y
|
||||
// << " region_handle " << region_handle
|
||||
// << LL_ENDL;
|
||||
|
||||
// sendReliableMessage();
|
||||
auto region_origin { regionp->getOriginGlobal() };
|
||||
LLVector3 pos_local{};
|
||||
U64 handle { to_region_handle(pos_global, region_origin, regionp->getWidth()) };
|
||||
bool is_local { regionp->getHandle() == handle };
|
||||
if(is_local)
|
||||
{
|
||||
LLVector3d region_origin = info->getGlobalOrigin();
|
||||
LLVector3 pos_local(
|
||||
pos_local.set(
|
||||
(F32)(pos_global.mdV[VX] - region_origin.mdV[VX]),
|
||||
(F32)(pos_global.mdV[VY] - region_origin.mdV[VY]),
|
||||
(F32)(pos_global.mdV[VZ]));
|
||||
// <FS:CR> Aurora-sim var region teleports
|
||||
//teleportRequest(handle, pos_local);
|
||||
teleportRequest(info->getHandle(), pos_local);
|
||||
// </FS:CR>
|
||||
LL_INFOS("Teleport") << "Local in-region TP:"
|
||||
<< " pos_global " << pos_global
|
||||
<< " region " << region_origin
|
||||
<< " local " << pos_local
|
||||
<< " region_handle " << handle
|
||||
<< LL_ENDL;
|
||||
}
|
||||
else if(regionp && teleportCore(isLocal))
|
||||
else
|
||||
{
|
||||
// determine non-local region location as best we can using global coords
|
||||
// In SL we have uniform region size. This is normal.
|
||||
// In opensim the handle will resolve to a 256m quantised world tile which the server maps back to a region
|
||||
// it "should" also compensate for the local coords. Handle has been "correctly" determined already so we use global % 256
|
||||
static const auto width{LLWorld::getInstance()->getRegionWidthInMeters()};
|
||||
pos_local.set( fmod((F32)pos_global.mdV[VX], width),
|
||||
fmod((F32)pos_global.mdV[VY], width),
|
||||
(F32)pos_global.mdV[VZ] );
|
||||
}
|
||||
|
||||
if(teleportCore(is_local)) // Rather a pointless if as teleportCore currently always returns true
|
||||
{
|
||||
// send the message
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
|
@ -5110,30 +5182,23 @@ void LLAgent::doTeleportViaLocation(const LLVector3d& pos_global)
|
|||
msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
|
||||
|
||||
msg->nextBlockFast(_PREHASH_Info);
|
||||
// <FS:Ansariel> FIRE-17262: Wrong local teleports on a large opensim region (apparently need to divide by grid unit size)
|
||||
F32 width = REGION_WIDTH_METERS;// regionp->getWidth();
|
||||
LLVector3 pos(fmod((F32)pos_global.mdV[VX], width),
|
||||
fmod((F32)pos_global.mdV[VY], width),
|
||||
(F32)pos_global.mdV[VZ]);
|
||||
F32 region_x = (F32)(pos_global.mdV[VX]);
|
||||
F32 region_y = (F32)(pos_global.mdV[VY]);
|
||||
U64 region_handle = to_region_handle_global(region_x, region_y);
|
||||
msg->addU64Fast(_PREHASH_RegionHandle, region_handle);
|
||||
msg->addVector3Fast(_PREHASH_Position, pos);
|
||||
pos.mV[VX] += 1;
|
||||
msg->addVector3Fast(_PREHASH_LookAt, pos);
|
||||
|
||||
LL_WARNS("Teleport") << "Sending deprecated(?) TeleportLocationRequest."
|
||||
<< " pos_global " << pos_global
|
||||
<< " region_x " << region_x
|
||||
<< " region_y " << region_y
|
||||
<< " region_handle " << region_handle
|
||||
<< LL_ENDL;
|
||||
msg->addU64Fast(_PREHASH_RegionHandle, handle);
|
||||
msg->addVector3Fast(_PREHASH_Position, pos_local);
|
||||
pos_local.mV[VX] += 1;
|
||||
msg->addVector3Fast(_PREHASH_LookAt, pos_local);
|
||||
|
||||
sendReliableMessage();
|
||||
LL_INFOS("Teleport") << "Sending deprecated TeleportLocationRequest."
|
||||
<< " pos_global " << pos_global
|
||||
<< " region coord (" << (pos_global.mdV[VX] - pos_local.mV[VX])
|
||||
<< "," << (pos_global.mdV[VY] - pos_local.mV[VY])
|
||||
<< " pos_local " << pos_local
|
||||
<< ") region_handle " << handle
|
||||
<< LL_ENDL;
|
||||
// </FS:Beq>
|
||||
}
|
||||
// <FS:TT> Client LSL Bridge
|
||||
if (FSLSLBridge::instance().canUseBridge() && isLocal)
|
||||
if (FSLSLBridge::instance().canUseBridge() && is_local)
|
||||
{
|
||||
teleportBridgeGlobal(pos_global);
|
||||
}
|
||||
|
|
@ -5174,6 +5239,37 @@ void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global, const LLVe
|
|||
//}
|
||||
|
||||
// [RLVa:KB] - Checked: RLVa-2.0.0
|
||||
// <FS:Beq> FIRE-30534 VarRegion TP fixes
|
||||
// void LLAgent::doTeleportViaLocationLookAt(const LLVector3d& pos_global, const LLVector3& look_at)
|
||||
// {
|
||||
// mbTeleportKeepsLookAt = look_at.isExactlyZero();
|
||||
|
||||
// if(!gAgentCamera.isfollowCamLocked())
|
||||
// {
|
||||
// gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction
|
||||
// }
|
||||
|
||||
// U64 region_handle = to_region_handle(pos_global);
|
||||
// // <FS:CR> Aurora-sim var region teleports
|
||||
// LLSimInfo* simInfo = LLWorldMap::instance().simInfoFromHandle(region_handle);
|
||||
// if (simInfo)
|
||||
// {
|
||||
// region_handle = simInfo->getHandle();
|
||||
// }
|
||||
// // </FS:CR>
|
||||
// LLVector3 pos_local = (LLVector3)(pos_global - from_region_handle(region_handle));
|
||||
// teleportRequest(region_handle, pos_local, look_at);
|
||||
|
||||
// // <FS:TT> Client LSL Bridge
|
||||
// if (FSLSLBridge::instance().canUseBridge())
|
||||
// {
|
||||
// if (region_handle == to_region_handle(getPositionGlobal()))
|
||||
// {
|
||||
// teleportBridgeLocal(pos_local);
|
||||
// }
|
||||
// }
|
||||
// // </FS:TT>
|
||||
// }
|
||||
void LLAgent::doTeleportViaLocationLookAt(const LLVector3d& pos_global, const LLVector3& look_at)
|
||||
{
|
||||
mbTeleportKeepsLookAt = look_at.isExactlyZero();
|
||||
|
|
@ -5183,28 +5279,34 @@ void LLAgent::doTeleportViaLocationLookAt(const LLVector3d& pos_global, const LL
|
|||
gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction
|
||||
}
|
||||
|
||||
U64 region_handle = to_region_handle(pos_global);
|
||||
// <FS:CR> Aurora-sim var region teleports
|
||||
LLSimInfo* simInfo = LLWorldMap::instance().simInfoFromHandle(region_handle);
|
||||
if (simInfo)
|
||||
U64 region_handle{};
|
||||
auto regionp = getRegion();
|
||||
if(regionp)
|
||||
{
|
||||
region_handle = simInfo->getHandle();
|
||||
region_handle = to_region_handle(pos_global, regionp->getOriginGlobal(), regionp->getWidth());
|
||||
}
|
||||
// </FS:CR>
|
||||
LLVector3 pos_local = (LLVector3)(pos_global - from_region_handle(region_handle));
|
||||
teleportRequest(region_handle, pos_local, look_at);
|
||||
else
|
||||
{
|
||||
region_handle = to_region_handle(pos_global);
|
||||
}
|
||||
// Beq Note: if region_handle was obtained to the nearest 256m tile map lookup might give us a better result.
|
||||
|
||||
LLVector3 pos_within_target_region = (LLVector3)(pos_global - from_region_handle(region_handle));
|
||||
teleportRequest(region_handle, pos_within_target_region, look_at);
|
||||
|
||||
// <FS:TT> Client LSL Bridge
|
||||
if (FSLSLBridge::instance().canUseBridge())
|
||||
if ( FSLSLBridge::instance().canUseBridge() )
|
||||
{
|
||||
if (region_handle == to_region_handle(getPositionGlobal()))
|
||||
// refresh regionp
|
||||
regionp = getRegion();
|
||||
if( regionp && ( region_handle == regionp->getHandle() ) )
|
||||
{
|
||||
teleportBridgeLocal(pos_local);
|
||||
teleportBridgeLocal(pos_within_target_region);
|
||||
}
|
||||
}
|
||||
// </FS:TT>
|
||||
}
|
||||
|
||||
// </FS:Beq>
|
||||
LLAgent::ETeleportState LLAgent::getTeleportState() const
|
||||
{
|
||||
return (mTeleportRequest && (mTeleportRequest->getStatus() == LLTeleportRequest::kFailed)) ?
|
||||
|
|
|
|||
|
|
@ -72,7 +72,10 @@ void LLAgentUI::buildSLURL(LLSLURL& slurl, const bool escaped /*= true*/)
|
|||
else
|
||||
#endif
|
||||
// </FS:CR>
|
||||
return_slurl = LLSLURL(regionp->getName(), gAgent.getPositionGlobal());
|
||||
// <FS:Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
//return_slurl = LLSLURL(regionp->getName(), gAgent.getPositionGlobal());
|
||||
return_slurl = LLSLURL(regionp->getName(), regionp->getOriginGlobal(), gAgent.getPositionGlobal());
|
||||
// </FS:Oren>
|
||||
}
|
||||
slurl = return_slurl;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -735,6 +735,7 @@ LLAppViewer* LLAppViewer::sInstance = NULL;
|
|||
LLTextureCache* LLAppViewer::sTextureCache = NULL;
|
||||
LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;
|
||||
LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
|
||||
FSPurgeDiskCacheThread* LLAppViewer::sPurgeDiskCacheThread = NULL; // <FS:Ansariel> Regular disk cache cleanup
|
||||
|
||||
std::string getRuntime()
|
||||
{
|
||||
|
|
@ -2442,6 +2443,7 @@ bool LLAppViewer::cleanup()
|
|||
sTextureFetch->shutdown();
|
||||
sTextureCache->shutdown();
|
||||
sImageDecodeThread->shutdown();
|
||||
sPurgeDiskCacheThread->shutdown(); // <FS:Ansariel> Regular disk cache cleanup
|
||||
|
||||
sTextureFetch->shutDownTextureCacheThread() ;
|
||||
sTextureFetch->shutDownImageDecodeThread() ;
|
||||
|
|
@ -2464,6 +2466,10 @@ bool LLAppViewer::cleanup()
|
|||
sImageDecodeThread = NULL;
|
||||
delete mFastTimerLogThread;
|
||||
mFastTimerLogThread = NULL;
|
||||
// <FS:Ansariel> Regular disk cache cleanup
|
||||
delete sPurgeDiskCacheThread;
|
||||
sPurgeDiskCacheThread = NULL;
|
||||
// </FS:Ansariel>
|
||||
|
||||
if (LLFastTimerView::sAnalyzePerformance)
|
||||
{
|
||||
|
|
@ -2577,13 +2583,18 @@ bool LLAppViewer::initThreads()
|
|||
|
||||
LLLFSThread::initClass(enable_threads && false);
|
||||
|
||||
//<FS:ND> Image thread pool from CoolVL
|
||||
U32 imageThreads = gSavedSettings.getU32("FSImageDecodeThreads");
|
||||
// </FS:ND>
|
||||
|
||||
// Image decoding
|
||||
LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true);
|
||||
LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true, imageThreads);
|
||||
LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
|
||||
LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(),
|
||||
sImageDecodeThread,
|
||||
enable_threads && true,
|
||||
app_metrics_qa_mode);
|
||||
LLAppViewer::sPurgeDiskCacheThread = new FSPurgeDiskCacheThread(); // <FS:Ansariel> Regular disk cache cleanup
|
||||
|
||||
if (LLTrace::BlockTimer::sLog || LLTrace::BlockTimer::sMetricLog)
|
||||
{
|
||||
|
|
@ -4959,11 +4970,16 @@ bool LLAppViewer::initCache()
|
|||
|
||||
// note that the maximum size of this cache is defined as a percentage of the
|
||||
// total cache size - the 'CacheSize' pref - for all caches.
|
||||
const unsigned int cache_total_size_mb = gSavedSettings.getU32("CacheSize");
|
||||
const double disk_cache_percent = gSavedSettings.getF32("DiskCachePercentOfTotal");
|
||||
const unsigned int disk_cache_mb = cache_total_size_mb * disk_cache_percent / 100;
|
||||
const unsigned int disk_cache_bytes = disk_cache_mb * 1024 * 1024;
|
||||
const bool enable_cache_debug_info = gSavedSettings.getBOOL("EnableCacheDebugInfo");
|
||||
// <FS:Ansariel> Better asset cache size control
|
||||
//const unsigned int cache_total_size_mb = gSavedSettings.getU32("CacheSize");
|
||||
//const double disk_cache_percent = gSavedSettings.getF32("DiskCachePercentOfTotal");
|
||||
//const unsigned int disk_cache_mb = cache_total_size_mb * disk_cache_percent / 100;
|
||||
const unsigned int disk_cache_mb = gSavedSettings.getU32("FSDiskCacheSize");
|
||||
// </FS:Ansariel>
|
||||
// <FS:Ansariel> Fix integer overflow
|
||||
//const unsigned int disk_cache_bytes = disk_cache_mb * 1024 * 1024;
|
||||
const uintmax_t disk_cache_bytes = disk_cache_mb * 1024 * 1024;
|
||||
const bool enable_cache_debug_info = gSavedSettings.getBOOL("EnableDiskCacheDebugInfo");
|
||||
|
||||
bool texture_cache_mismatch = false;
|
||||
if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion())
|
||||
|
|
@ -5053,6 +5069,8 @@ bool LLAppViewer::initCache()
|
|||
LLDiskCache::getInstance()->purge();
|
||||
}
|
||||
}
|
||||
// <FS:Ansariel> Regular disk cache cleanup
|
||||
LLAppViewer::getPurgeDiskCacheThread()->start();
|
||||
|
||||
// <FS:Ansariel> FIRE-13066
|
||||
if (mPurgeTextures && !read_only)
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ class LLTextureFetch;
|
|||
class LLWatchdogTimeout;
|
||||
class LLViewerJoystick;
|
||||
class LLViewerRegion;
|
||||
class FSPurgeDiskCacheThread; // <FS:Ansariel> Regular disk cache cleanup
|
||||
|
||||
extern LLTrace::BlockTimerStatHandle FTM_FRAME;
|
||||
|
||||
|
|
@ -118,6 +119,7 @@ public:
|
|||
static LLTextureCache* getTextureCache() { return sTextureCache; }
|
||||
static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; }
|
||||
static LLTextureFetch* getTextureFetch() { return sTextureFetch; }
|
||||
static FSPurgeDiskCacheThread* getPurgeDiskCacheThread() { return sPurgeDiskCacheThread; } // <FS:Ansariel> Regular disk cache cleanup
|
||||
|
||||
static U32 getTextureCacheVersion() ;
|
||||
static U32 getObjectCacheVersion() ;
|
||||
|
|
@ -306,6 +308,7 @@ private:
|
|||
static LLTextureCache* sTextureCache;
|
||||
static LLImageDecodeThread* sImageDecodeThread;
|
||||
static LLTextureFetch* sTextureFetch;
|
||||
static FSPurgeDiskCacheThread* sPurgeDiskCacheThread; // <FS:Ansariel> Regular disk cache cleanup
|
||||
|
||||
S32 mNumSessions;
|
||||
|
||||
|
|
|
|||
|
|
@ -693,7 +693,10 @@ void LLFloaterExperienceProfile::onClickLocation()
|
|||
if(region)
|
||||
{
|
||||
LLTextBox* child = getChild<LLTextBox>(EDIT TF_SLURL);
|
||||
mLocationSLURL = LLSLURL(region->getName(), gAgent.getPositionGlobal()).getSLURLString();
|
||||
// <FS:Beq> FIRE-30768: SLURL's don't work in VarRegions (Patch from Oren)
|
||||
//mLocationSLURL = LLSLURL(region->getName(), gAgent.getPositionGlobal()).getSLURLString();
|
||||
mLocationSLURL = LLSLURL(region->getName(), region->getOriginGlobal(), gAgent.getPositionGlobal()).getSLURLString();
|
||||
// </FS:Beq>
|
||||
child->setText(mLocationSLURL);
|
||||
onFieldChanged();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,6 +45,11 @@
|
|||
#include "llcheckboxctrl.h"
|
||||
#include "llcombobox.h"
|
||||
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
#include "llspinctrl.h"
|
||||
#include "lliconctrl.h"
|
||||
// </FS:Zi>
|
||||
|
||||
#if LL_WINDOWS && !LL_MESA_HEADLESS
|
||||
// Require DirectInput version 8
|
||||
#define DIRECTINPUT_VERSION 0x0800
|
||||
|
|
@ -52,18 +57,20 @@
|
|||
#include <dinput.h>
|
||||
#endif
|
||||
|
||||
// <FS:Zi> FIRE-14344 - show joystick buttons
|
||||
const std::string JOYSTICK_BUTTON_ON ( "\xE2\xAC\xA4" ); // U+2B24 BLACK LARGE CIRCLE
|
||||
const std::string JOYSTICK_BUTTON_OFF( "\xE2\x97\xAF" ); // U+25EF WHITE LARGE CIRCLE
|
||||
// </FS:Zi>
|
||||
|
||||
static LLTrace::SampleStatHandle<> sJoystickAxis0("Joystick axis 0"),
|
||||
sJoystickAxis1("Joystick axis 1"),
|
||||
sJoystickAxis2("Joystick axis 2"),
|
||||
sJoystickAxis3("Joystick axis 3"),
|
||||
sJoystickAxis4("Joystick axis 4"),
|
||||
sJoystickAxis5("Joystick axis 5");
|
||||
static LLTrace::SampleStatHandle<>* sJoystickAxes[6] =
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// sJoystickAxis5("Joystick axis 5");
|
||||
// static LLTrace::SampleStatHandle<>* sJoystickAxes[6] =
|
||||
sJoystickAxis5("Joystick axis 5"),
|
||||
sJoystickAxis6("Joystick axis 6"),
|
||||
sJoystickAxis7("Joystick axis 7");
|
||||
|
||||
static LLTrace::SampleStatHandle<>* sJoystickAxes[MAX_JOYSTICK_AXES] =
|
||||
// </FS:Zi>
|
||||
{
|
||||
&sJoystickAxis0,
|
||||
&sJoystickAxis1,
|
||||
|
|
@ -71,6 +78,11 @@ static LLTrace::SampleStatHandle<>* sJoystickAxes[6] =
|
|||
&sJoystickAxis3,
|
||||
&sJoystickAxis4,
|
||||
&sJoystickAxis5
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
,
|
||||
&sJoystickAxis6,
|
||||
&sJoystickAxis7
|
||||
// </FS_Zi>
|
||||
};
|
||||
|
||||
#if LL_WINDOWS && !LL_MESA_HEADLESS
|
||||
|
|
@ -100,6 +112,12 @@ LLFloaterJoystick::LLFloaterJoystick(const LLSD& data)
|
|||
: LLFloater(data),
|
||||
mHasDeviceList(false)
|
||||
{
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
mAxisStatsBar = new LLStatBar*[MAX_JOYSTICK_AXES];
|
||||
mAxisViews = new LLStatView*[MAX_JOYSTICK_AXES];
|
||||
mButtonsLights = new LLIconCtrl*[MAX_JOYSTICK_BUTTONS];
|
||||
// </FS:Zi>
|
||||
|
||||
if (!LLViewerJoystick::getInstance()->isJoystickInitialized())
|
||||
{
|
||||
LLViewerJoystick::getInstance()->init(false);
|
||||
|
|
@ -125,7 +143,9 @@ void LLFloaterJoystick::draw()
|
|||
}
|
||||
// </FS:Zi>
|
||||
|
||||
for (U32 i = 0; i < 6; i++)
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// for (U32 i = 0; i < 6; i++)
|
||||
for (U32 i = 0; i < joystick->getNumOfJoystickAxes(); i++)
|
||||
{
|
||||
F32 value = joystick->getJoystickAxis(i);
|
||||
// <FS:Zi> FIRE-14344 - using the frame interval seems to break the graphs
|
||||
|
|
@ -143,21 +163,19 @@ void LLFloaterJoystick::draw()
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:Zi> FIRE-14344 - show joystick buttons
|
||||
std::string buttons;
|
||||
for (U32 i = 0; i < 16; i++)
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
if (mJoystickEnabled)
|
||||
{
|
||||
U32 value = joystick->getJoystickButton(i);
|
||||
if (value == 0)
|
||||
// dim = button present but not pushed, white = button currently pushed
|
||||
const LLColor4& bright = LLUIColorTable::instance().getColor("White").get();
|
||||
const LLColor4& dim = LLUIColorTable::instance().getColor("Gray").get();
|
||||
|
||||
for (U32 i = 0; i < joystick->getNumOfJoystickButtons(); i++)
|
||||
{
|
||||
buttons += JOYSTICK_BUTTON_OFF;
|
||||
}
|
||||
else
|
||||
{
|
||||
buttons += JOYSTICK_BUTTON_ON;
|
||||
U32 value = joystick->getJoystickButton(i);
|
||||
mButtonsLights[i]->setColor(value ? bright : dim);
|
||||
}
|
||||
}
|
||||
mJoystickButtons->setText(buttons);
|
||||
// </FS:Zi>
|
||||
|
||||
LLFloater::draw();
|
||||
|
|
@ -168,12 +186,14 @@ BOOL LLFloaterJoystick::postBuild()
|
|||
center();
|
||||
// <FS:CR> Micro Save on calls to gSavedSettings
|
||||
//F32 range = gSavedSettings.getBOOL("Cursor3D") ? 128.f : 2.f;
|
||||
// <FS:Zi> FIRE-14344 - use 1.f for the graph ranges instead of 128.f : 2.f to get better resolution -
|
||||
// <FS:Zi> FIRE-14344 - use 0.5f for the graph ranges instead of 128.f : 2.f to get better autoscaling -
|
||||
// needs testing with an actual absolute pointer device if the range scales in a useful way when
|
||||
// not starting at 128.f
|
||||
F32 range = 1.f;
|
||||
F32 range = 0.5f;
|
||||
|
||||
for (U32 i = 0; i < 6; i++)
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// for (U32 i = 0; i < 6; i++)
|
||||
for (U32 i = 0; i < MAX_JOYSTICK_AXES; i++)
|
||||
{
|
||||
std::string stat_name(llformat("Joystick axis %d", i));
|
||||
std::string axisname = llformat("axis%d", i);
|
||||
|
|
@ -183,8 +203,23 @@ BOOL LLFloaterJoystick::postBuild()
|
|||
mAxisStatsBar[i]->setStat(stat_name);
|
||||
mAxisStatsBar[i]->setRange(-range, range);
|
||||
}
|
||||
// <FS:Zi> FIRE-14344 - cache axis view widgets for faster lookup later
|
||||
mAxisViews[i] = getChild<LLStatView>(llformat("axis_view_%d", i));
|
||||
|
||||
// set number of axes on spinners
|
||||
LLSpinCtrl* spin;
|
||||
spin = getChild<LLSpinCtrl>(llformat("JoystickAxis%d", i));
|
||||
spin->setMaxValue(MAX_JOYSTICK_AXES - 1);
|
||||
// </FS:Zi>
|
||||
}
|
||||
|
||||
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
for (U32 i = 0; i < MAX_JOYSTICK_BUTTONS; i++)
|
||||
{
|
||||
mButtonsLights[i] = getChild<LLIconCtrl>(llformat("button_light_%d", i));
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
||||
mJoysticksCombo = getChild<LLComboBox>("joystick_combo");
|
||||
childSetCommitCallback("joystick_combo",onCommitJoystickEnabled,this);
|
||||
mCheckFlycamEnabled = getChild<LLCheckBoxCtrl>("JoystickFlycamEnabled");
|
||||
|
|
@ -194,17 +229,20 @@ BOOL LLFloaterJoystick::postBuild()
|
|||
childSetAction("cancel_btn", onClickCancel, this);
|
||||
childSetAction("ok_btn", onClickOK, this);
|
||||
|
||||
// <FS:Zi> FIRE-14344 - show joystick buttons
|
||||
mJoystickButtons = getChild<LLTextBase>("joystick_buttons");
|
||||
|
||||
refresh();
|
||||
refreshListOfDevices();
|
||||
updateAxesAndButtons(); // <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LLFloaterJoystick::~LLFloaterJoystick()
|
||||
{
|
||||
// Children all cleaned up by default view destructor.
|
||||
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
delete[] mAxisStatsBar;
|
||||
delete[] mButtonsLights;
|
||||
delete[] mAxisViews;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -462,6 +500,11 @@ void LLFloaterJoystick::onCommitJoystickEnabled(LLUICtrl*, void *joy_panel)
|
|||
LL_DEBUGS("Joystick") << "Selected " << device_id << " as joystick." << LL_ENDL;
|
||||
|
||||
self->refreshListOfDevices();
|
||||
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
self->mJoystickEnabled = joystick_enabled;
|
||||
self->updateAxesAndButtons();
|
||||
// </FS:Zi>
|
||||
}
|
||||
|
||||
void LLFloaterJoystick::onClickRestoreSNDefaults(void *joy_panel)
|
||||
|
|
@ -514,3 +557,32 @@ void LLFloaterJoystick::onClose(bool app_quitting)
|
|||
cancel();
|
||||
}
|
||||
}
|
||||
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
void LLFloaterJoystick::updateAxesAndButtons()
|
||||
{
|
||||
U8 axes = 0;
|
||||
U8 buttons = 0;
|
||||
|
||||
if(mJoystickEnabled)
|
||||
{
|
||||
axes = LLViewerJoystick::getInstance()->getNumOfJoystickAxes();
|
||||
buttons = LLViewerJoystick::getInstance()->getNumOfJoystickButtons();
|
||||
}
|
||||
|
||||
for(U8 i = 0; i < MAX_JOYSTICK_AXES; i++)
|
||||
{
|
||||
mAxisViews[i]->setDisplayChildren(i < axes);
|
||||
mAxisViews[i]->reshape(0, 0, false);
|
||||
}
|
||||
|
||||
// dim = button present but not pushed, dark = button not present on this joystick
|
||||
static const LLColor4& dark = LLUIColorTable::instance().getColor("DkGray").get();
|
||||
static const LLColor4& dim = LLUIColorTable::instance().getColor("Gray").get();
|
||||
|
||||
for(U8 i = 0; i < MAX_JOYSTICK_BUTTONS; i++)
|
||||
{
|
||||
mButtonsLights[i]->setColor(i < buttons ? dim : dark);
|
||||
}
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,10 @@
|
|||
|
||||
class LLCheckBoxCtrl;
|
||||
class LLComboBox;
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
class LLIconCtrl;
|
||||
class LLStatView;
|
||||
// </FS:Zi>
|
||||
|
||||
class LLFloaterJoystick : public LLFloater
|
||||
{
|
||||
|
|
@ -54,6 +58,8 @@ protected:
|
|||
void onClose(bool app_quitting);
|
||||
void onClickCloseBtn(bool app_quitting);
|
||||
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
void updateAxesAndButtons();
|
||||
private:
|
||||
|
||||
LLFloaterJoystick(const LLSD& data);
|
||||
|
|
@ -96,10 +102,12 @@ private:
|
|||
bool mHasDeviceList;
|
||||
|
||||
// stats view
|
||||
LLStatBar* mAxisStatsBar[6];
|
||||
|
||||
// <FS:Zi> FIRE-14344 - show joystick buttons
|
||||
LLTextBase* mJoystickButtons;
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// LLStatBar* mAxisStatsBar[6];
|
||||
LLStatBar** mAxisStatsBar;
|
||||
LLIconCtrl** mButtonsLights;
|
||||
LLStatView** mAxisViews;
|
||||
// </FS:Zi>
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -866,7 +866,9 @@ void LLFloaterModelPreview::draw()
|
|||
{
|
||||
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS )
|
||||
{
|
||||
childSetTextArg("status", "[STATUS]", getString("status_material_mismatch"));
|
||||
// <FS:Beq> cleanup/improve errors - this error is effectively duplicated, the unused one was actually better
|
||||
// childSetTextArg("status", "[STATUS]", getString("status_material_mismatch"));
|
||||
childSetTextArg("status", "[STATUS]", getString("mesh_status_invalid_material_list"));
|
||||
}
|
||||
else
|
||||
if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_MODEL )
|
||||
|
|
@ -879,6 +881,13 @@ void LLFloaterModelPreview::draw()
|
|||
childSetTextArg("status", "[STATUS]", getString("status_parse_error"));
|
||||
toggleCalculateButton(false);
|
||||
}
|
||||
// <FS:Beq> improve error reporting
|
||||
else
|
||||
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_LOD_MODEL_MISMATCH )
|
||||
{
|
||||
childSetTextArg("status", "[STATUS]", getString("status_lod_model_mismatch"));
|
||||
toggleCalculateButton(false);
|
||||
}
|
||||
else
|
||||
if (mModelPreview->getLoadState() == LLModelLoader::WARNING_BIND_SHAPE_ORIENTATION)
|
||||
{
|
||||
|
|
@ -1130,8 +1139,21 @@ void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)
|
|||
S32 file_mode = iface->getItemCount() - 1;
|
||||
if (which_mode < file_mode)
|
||||
{
|
||||
S32 which_lod = num_lods - which_mode;
|
||||
sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
|
||||
// <FS:Beq> FIRE-30963 Support pre-defined physics shapes (initially cube)
|
||||
// S32 which_lod = num_lods - which_mode;
|
||||
// sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
|
||||
if(which_mode >= num_lods)
|
||||
{
|
||||
// which_mode is between the last LOD entry and file selection
|
||||
// so it is a preset
|
||||
sInstance->mModelPreview->setPhysicsFromPreset(which_mode-num_lods);
|
||||
}
|
||||
else
|
||||
{
|
||||
S32 which_lod = num_lods - which_mode;
|
||||
sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
|
||||
}
|
||||
// </FS:Beq>
|
||||
}
|
||||
|
||||
LLModelPreview *model_preview = sInstance->mModelPreview;
|
||||
|
|
@ -1738,7 +1760,7 @@ void LLFloaterModelPreview::setCtrlLoadFromFile(S32 lod)
|
|||
LLComboBox* lod_combo = findChild<LLComboBox>("physics_lod_combo");
|
||||
if (lod_combo)
|
||||
{
|
||||
lod_combo->setCurrentByIndex(5);
|
||||
lod_combo->setCurrentByIndex(lod_combo->getItemCount() - 1); // <FS:Beq/> FIRE-30963 - better physics defaults
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -6377,7 +6377,9 @@ static LLPanelInjector<LLPanelPreferenceOpensim> t_pref_opensim("panel_preferenc
|
|||
|
||||
#ifdef OPENSIM
|
||||
LLPanelPreferenceOpensim::LLPanelPreferenceOpensim() : LLPanelPreference(),
|
||||
mGridListControl(NULL)
|
||||
mGridListControl(NULL),
|
||||
mGridListChangedCallbackConnection(),
|
||||
mGridAddedCallbackConnection()
|
||||
{
|
||||
mCommitCallbackRegistrar.add("Pref.ClearDebugSearchURL", boost::bind(&LLPanelPreferenceOpensim::onClickClearDebugSearchURL, this));
|
||||
mCommitCallbackRegistrar.add("Pref.PickDebugSearchURL", boost::bind(&LLPanelPreferenceOpensim::onClickPickDebugSearchURL, this));
|
||||
|
|
@ -6385,7 +6387,21 @@ LLPanelPreferenceOpensim::LLPanelPreferenceOpensim() : LLPanelPreference(),
|
|||
mCommitCallbackRegistrar.add("Pref.ClearGrid", boost::bind(&LLPanelPreferenceOpensim::onClickClearGrid, this));
|
||||
mCommitCallbackRegistrar.add("Pref.RefreshGrid", boost::bind( &LLPanelPreferenceOpensim::onClickRefreshGrid, this));
|
||||
mCommitCallbackRegistrar.add("Pref.RemoveGrid", boost::bind( &LLPanelPreferenceOpensim::onClickRemoveGrid, this));
|
||||
mCommitCallbackRegistrar.add("Pref.SaveGrid", boost::bind(&LLPanelPreferenceOpensim::onClickSaveGrid, this));
|
||||
}
|
||||
|
||||
LLPanelPreferenceOpensim::~LLPanelPreferenceOpensim()
|
||||
{
|
||||
#ifdef OPENSIM
|
||||
if (mGridListChangedCallbackConnection.connected())
|
||||
{
|
||||
mGridListChangedCallbackConnection.disconnect();
|
||||
}
|
||||
|
||||
if (mGridAddedCallbackConnection.connected())
|
||||
{
|
||||
mGridAddedCallbackConnection.disconnect();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
BOOL LLPanelPreferenceOpensim::postBuild()
|
||||
|
|
@ -6402,17 +6418,34 @@ BOOL LLPanelPreferenceOpensim::postBuild()
|
|||
mEditorGridMessage = findChild<LLLineEditor>("message_edit");
|
||||
mGridListControl = getChild<LLScrollListCtrl>("grid_list");
|
||||
mGridListControl->setCommitCallback(boost::bind(&LLPanelPreferenceOpensim::onSelectGrid, this));
|
||||
mGridListChangedCallbackConnection = LLGridManager::getInstance()->addGridListChangedCallback(boost::bind(&LLPanelPreferenceOpensim::refreshGridList, this, _1));
|
||||
refreshGridList();
|
||||
|
||||
return LLPanelPreference::postBuild();
|
||||
}
|
||||
|
||||
void LLPanelPreferenceOpensim::onOpen(const LLSD& key)
|
||||
{
|
||||
mCurrentGrid = LLGridManager::getInstance()->getGrid();
|
||||
|
||||
mEditorGridName->clear();
|
||||
mEditorGridURI->clear();
|
||||
mEditorLoginPage->clear();
|
||||
mEditorHelperURI->clear();
|
||||
mEditorWebsite->clear();
|
||||
mEditorSupport->clear();
|
||||
mEditorRegister->clear();
|
||||
mEditorPassword->clear();
|
||||
mEditorSearch->clear();
|
||||
mEditorGridMessage->clear();
|
||||
}
|
||||
|
||||
void LLPanelPreferenceOpensim::onSelectGrid()
|
||||
{
|
||||
LLSD grid_info;
|
||||
LLSD grid_info;
|
||||
std::string grid = mGridListControl->getSelectedValue();
|
||||
LLGridManager::getInstance()->getGridData(grid, grid_info);
|
||||
|
||||
|
||||
mEditorGridName->setText(grid_info[GRID_LABEL_VALUE].asString());
|
||||
mEditorGridURI->setText(grid_info[GRID_LOGIN_URI_VALUE][0].asString());
|
||||
mEditorLoginPage->setText(grid_info[GRID_LOGIN_PAGE_VALUE].asString());
|
||||
|
|
@ -6434,17 +6467,21 @@ void LLPanelPreferenceOpensim::apply()
|
|||
void LLPanelPreferenceOpensim::cancel()
|
||||
{
|
||||
LLGridManager::getInstance()->resetGrids();
|
||||
LLGridManager::getInstance()->setGridChoice(mCurrentGrid);
|
||||
FSPanelLogin::updateServer();
|
||||
}
|
||||
|
||||
void LLPanelPreferenceOpensim::onClickAddGrid()
|
||||
{
|
||||
|
||||
std::string new_grid = gSavedSettings.getString("OpensimPrefsAddGrid");
|
||||
std::string new_grid = getChild<LLLineEditor>("add_grid")->getText();
|
||||
|
||||
if (!new_grid.empty())
|
||||
{
|
||||
getChild<LLUICtrl>("grid_management_panel")->setEnabled(FALSE);
|
||||
if (mGridAddedCallbackConnection.connected())
|
||||
{
|
||||
mGridAddedCallbackConnection.disconnect();
|
||||
}
|
||||
LLGridManager::getInstance()->addGridListChangedCallback(boost::bind(&LLPanelPreferenceOpensim::addedGrid, this, _1));
|
||||
LLGridManager::getInstance()->addGrid(new_grid);
|
||||
}
|
||||
|
|
@ -6452,52 +6489,40 @@ void LLPanelPreferenceOpensim::onClickAddGrid()
|
|||
|
||||
void LLPanelPreferenceOpensim::addedGrid(bool success)
|
||||
{
|
||||
if (mGridAddedCallbackConnection.connected())
|
||||
{
|
||||
mGridAddedCallbackConnection.disconnect();
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
const std::string& new_grid = getChild<LLLineEditor>("add_grid")->getText();
|
||||
|
||||
for (auto row : mGridListControl->getAllData())
|
||||
{
|
||||
if (new_grid.find(row->getColumn(1)->getValue().asString()) != std::string::npos)
|
||||
{
|
||||
row->setSelected(TRUE);
|
||||
mGridListControl->scrollToShowSelected();
|
||||
onSelectGrid();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onClickClearGrid();
|
||||
}
|
||||
refreshGridList(success);
|
||||
}
|
||||
|
||||
// TODO: Save changes to grid entries
|
||||
void LLPanelPreferenceOpensim::onClickSaveGrid()
|
||||
{
|
||||
LLSD grid_info;
|
||||
grid_info[GRID_VALUE] = mGridListControl->getSelectedValue();
|
||||
grid_info[GRID_LABEL_VALUE] = mEditorGridName->getValue();
|
||||
grid_info[GRID_LOGIN_URI_VALUE][0] = mEditorGridURI->getValue();
|
||||
grid_info[GRID_LOGIN_PAGE_VALUE] = mEditorLoginPage->getValue();
|
||||
grid_info[GRID_HELPER_URI_VALUE] = mEditorHelperURI->getValue();
|
||||
grid_info["about"] = mEditorWebsite->getValue();
|
||||
grid_info["help"] = mEditorSupport->getValue();
|
||||
grid_info[GRID_REGISTER_NEW_ACCOUNT] = mEditorRegister->getValue();
|
||||
grid_info[GRID_FORGOT_PASSWORD] = mEditorPassword->getValue();
|
||||
grid_info["search"] = mEditorSearch->getValue();
|
||||
grid_info["message"] = mEditorGridMessage->getValue();
|
||||
|
||||
// GridEntry* grid_entry = new GridEntry;
|
||||
// grid_entry->grid = grid_info;
|
||||
// grid_entry->set_current = false;
|
||||
|
||||
//getChild<LLUICtrl>("grid_management_panel")->setEnabled(FALSE);
|
||||
//LLGridManager::getInstance()->addGridListChangedCallback(boost::bind(&LLPanelPreferenceOpensim::addedGrid, this, _1));
|
||||
//LLGridManager::getInstance()->addGrid(grid_entry, LLGridManager::MANUAL);
|
||||
}
|
||||
|
||||
void LLPanelPreferenceOpensim::onClickClearGrid()
|
||||
{
|
||||
gSavedSettings.setString("OpensimPrefsAddGrid", std::string());
|
||||
getChild<LLLineEditor>("add_grid")->clear();
|
||||
}
|
||||
|
||||
void LLPanelPreferenceOpensim::onClickRefreshGrid()
|
||||
{
|
||||
std::string grid = mGridListControl->getSelectedValue();
|
||||
getChild<LLUICtrl>("grid_management_panel")->setEnabled(FALSE);
|
||||
LLGridManager::getInstance()->addGridListChangedCallback(boost::bind(&LLPanelPreferenceOpensim::refreshGridList, this, _1));
|
||||
// <FS:Beq> FIRE-13223 grid info refresh does not update properly when applied to currently active grid
|
||||
// LLGridManager::getInstance()->reFetchGrid(grid);
|
||||
LLGridManager::getInstance()->reFetchGrid(grid, (grid == LLGridManager::getInstance()->getGrid()) );
|
||||
// </FS:Beq>
|
||||
}
|
||||
|
||||
void LLPanelPreferenceOpensim::onClickRemoveGrid()
|
||||
|
|
@ -6525,8 +6550,18 @@ bool LLPanelPreferenceOpensim::removeGridCB(const LLSD& notification, const LLSD
|
|||
{
|
||||
std::string grid = notification["payload"].asString();
|
||||
getChild<LLUICtrl>("grid_management_panel")->setEnabled(FALSE);
|
||||
/*mGridListChanged =*/ LLGridManager::getInstance()->addGridListChangedCallback(boost::bind(&LLPanelPreferenceOpensim::refreshGridList, this, _1));
|
||||
mEditorGridName->clear();
|
||||
mEditorGridURI->clear();
|
||||
mEditorLoginPage->clear();
|
||||
mEditorHelperURI->clear();
|
||||
mEditorWebsite->clear();
|
||||
mEditorSupport->clear();
|
||||
mEditorRegister->clear();
|
||||
mEditorPassword->clear();
|
||||
mEditorSearch->clear();
|
||||
mEditorGridMessage->clear();
|
||||
LLGridManager::getInstance()->removeGrid(grid);
|
||||
FSPanelLogin::updateServer();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -6601,7 +6636,6 @@ LLPanelPreferenceOpensim::LLPanelPreferenceOpensim() : LLPanelPreference()
|
|||
mCommitCallbackRegistrar.add("Pref.ClearGrid", boost::bind(&no_cb));
|
||||
mCommitCallbackRegistrar.add("Pref.RefreshGrid", boost::bind(&no_cb));
|
||||
mCommitCallbackRegistrar.add("Pref.RemoveGrid", boost::bind(&no_cb));
|
||||
mCommitCallbackRegistrar.add("Pref.SaveGrid", boost::bind(&no_cb));
|
||||
}
|
||||
#endif
|
||||
// <FS:AW optional opensim support>
|
||||
|
|
|
|||
|
|
@ -589,33 +589,36 @@ private:
|
|||
// <FS:AW opensim preferences>
|
||||
class LLPanelPreferenceOpensim : public LLPanelPreference
|
||||
{
|
||||
LOG_CLASS(LLPanelPreferenceOpensim);
|
||||
|
||||
public:
|
||||
LLPanelPreferenceOpensim();
|
||||
~LLPanelPreferenceOpensim();
|
||||
|
||||
#ifdef OPENSIM
|
||||
// <FS:AW grid management>
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void apply();
|
||||
/*virtual*/ void cancel();
|
||||
|
||||
protected:
|
||||
boost::signals2::connection mGridListChangedCallbackConnection;
|
||||
boost::signals2::connection mGridAddedCallbackConnection;
|
||||
|
||||
void onOpen(const LLSD& key);
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
void onClickAddGrid();
|
||||
void addedGrid(bool success);
|
||||
void onClickClearGrid();
|
||||
void onClickRefreshGrid();
|
||||
void onClickSaveGrid();
|
||||
void onClickRemoveGrid();
|
||||
void onSelectGrid();
|
||||
bool removeGridCB(const LLSD& notification, const LLSD& response);
|
||||
// </FS:AW grid management>
|
||||
// <FS:AW opensim search support>
|
||||
void onClickClearDebugSearchURL();
|
||||
void onClickPickDebugSearchURL();
|
||||
// </FS:AW opensim search support>
|
||||
|
||||
void refreshGridList(bool success = true);
|
||||
LLScrollListCtrl* mGridListControl;
|
||||
|
||||
private:
|
||||
LLLineEditor* mEditorGridName;
|
||||
LLLineEditor* mEditorGridURI;
|
||||
|
|
@ -627,9 +630,9 @@ private:
|
|||
LLLineEditor* mEditorPassword;
|
||||
LLLineEditor* mEditorSearch;
|
||||
LLLineEditor* mEditorGridMessage;
|
||||
#endif
|
||||
|
||||
LOG_CLASS(LLPanelPreferenceOpensim);
|
||||
std::string mCurrentGrid;
|
||||
#endif
|
||||
};
|
||||
// </FS:AW opensim preferences>
|
||||
|
||||
|
|
|
|||
|
|
@ -713,10 +713,16 @@ void LLFloaterWorldMap::requestParcelInfo(const LLVector3d& pos_global)
|
|||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LLVector3 pos_region((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
|
||||
(F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
|
||||
(F32)pos_global.mdV[VZ]);
|
||||
// <FS:Beq> VarRegion slurl shenanigans
|
||||
// agent_x = ll_round(region_pos.mV[VX]);
|
||||
// agent_y = ll_round(region_pos.mV[VY]);
|
||||
// agent_z = ll_round(region_pos.mV[VZ]);
|
||||
// LLVector3 pos_region((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
|
||||
// (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
|
||||
// (F32)pos_global.mdV[VZ]);
|
||||
auto region_origin = region->getOriginGlobal();
|
||||
auto pos_region = LLVector3(pos_global - region_origin);
|
||||
// </FS:Beq>
|
||||
|
||||
LLSD body;
|
||||
std::string url = region->getCapability("RemoteParcelRequest");
|
||||
|
|
@ -1022,7 +1028,12 @@ void LLFloaterWorldMap::updateLocation()
|
|||
return; // invalid location
|
||||
}
|
||||
std::string sim_name;
|
||||
gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal( pos_global, sim_name );
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
//gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal( pos_global, sim_name );
|
||||
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
|
||||
if (sim_info)
|
||||
sim_name = sim_info->getName();
|
||||
// </FS:Beq pp Oren>
|
||||
if ((status != LLTracker::TRACKING_NOTHING) &&
|
||||
(status != mTrackedStatus || pos_global != mTrackedLocation || sim_name != mTrackedSimName))
|
||||
{
|
||||
|
|
@ -1055,12 +1066,16 @@ void LLFloaterWorldMap::updateLocation()
|
|||
|
||||
childSetValue("location", RlvStrings::getString(RlvStringKeys::Hidden::Region));
|
||||
}
|
||||
else if (gotSimName)
|
||||
// <FS:Beq pp Oren> FORE-30768 Slurls in Var regions are b0rked
|
||||
// else if (gotSimName)
|
||||
else if (sim_info)
|
||||
// [/RLVa:KB]
|
||||
// if ( gotSimName )
|
||||
{
|
||||
mSLURL = LLSLURL(sim_name, pos_global);
|
||||
// mSLURL = LLSLURL(sim_name, pos_global);
|
||||
mSLURL = LLSLURL(sim_info->getName(), sim_info->getGlobalOrigin(), pos_global);
|
||||
}
|
||||
// </FS:Beq pp Oren>
|
||||
else
|
||||
{ // Empty SLURL will disable the "Copy SLURL to clipboard" button
|
||||
mSLURL = LLSLURL();
|
||||
|
|
|
|||
|
|
@ -286,22 +286,78 @@ void LLLandmarkActions::createLandmarkHere()
|
|||
|
||||
createLandmarkHere(landmark_name, landmark_desc, folder_id);
|
||||
}
|
||||
|
||||
void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slurl_callback_t cb, bool escaped /* = true */)
|
||||
// <FS:Beq> FIRE-30534 - changes related to var regions in opensim
|
||||
void LLLandmarkActions::getSLURLfromPosGlobalAndLocal(const LLVector3d& global_pos, const LLVector3& region_pos, slurl_callback_t cb, bool escaped /* = true */)
|
||||
{
|
||||
std::string sim_name;
|
||||
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
|
||||
LLVector3d tmp_global_pos{global_pos};
|
||||
tmp_global_pos.mdV[VX] -= region_pos.mV[VX];
|
||||
tmp_global_pos.mdV[VY] -= region_pos.mV[VY];
|
||||
tmp_global_pos.mdV[VZ] -= region_pos.mV[VZ];
|
||||
|
||||
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(tmp_global_pos, sim_name);
|
||||
if (gotSimName)
|
||||
{
|
||||
std::string slurl = LLSLURL(sim_name, global_pos).getSLURLString();
|
||||
std::string slurl = LLSLURL(sim_name, region_pos).getSLURLString();
|
||||
cb(slurl);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto regionp = gAgent.getRegion();
|
||||
U64 new_region_handle{};
|
||||
if(regionp)
|
||||
{
|
||||
new_region_handle = to_region_handle( tmp_global_pos, regionp->getOriginGlobal(), regionp->getWidth() );
|
||||
}
|
||||
else
|
||||
{
|
||||
new_region_handle = to_region_handle( tmp_global_pos );
|
||||
}
|
||||
|
||||
LLWorldMapMessage::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseSLURL,
|
||||
cb,
|
||||
global_pos,
|
||||
escaped,
|
||||
_2);
|
||||
|
||||
LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle, url_cb, std::string("unused"), false);
|
||||
}
|
||||
}
|
||||
// </FS:Beq>
|
||||
void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slurl_callback_t cb, bool escaped /* = true */)
|
||||
{
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
//std::string sim_name;
|
||||
//bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
|
||||
//if (gotSimName)
|
||||
//{
|
||||
// std::string slurl = LLSLURL(sim_name, global_pos).getSLURLString();
|
||||
|
||||
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(global_pos);
|
||||
if (sim_info)
|
||||
{
|
||||
std::string slurl = LLSLURL(sim_info->getName(), sim_info->getGlobalOrigin(), global_pos).getSLURLString();
|
||||
// </FS:Beq pp Oren>
|
||||
cb(slurl);
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
U64 new_region_handle = to_region_handle(global_pos);
|
||||
|
||||
// <FS:Beq> FIRE-30534 - changes related to var regions in opensim
|
||||
// U64 new_region_handle = to_region_handle(global_pos);
|
||||
auto regionp = gAgent.getRegion();
|
||||
U64 new_region_handle{};
|
||||
if(regionp)
|
||||
{
|
||||
new_region_handle = to_region_handle( global_pos, regionp->getOriginGlobal(), regionp->getWidth() );
|
||||
}
|
||||
else
|
||||
{
|
||||
new_region_handle = to_region_handle( global_pos );
|
||||
}
|
||||
// </FS:Beq>
|
||||
LLWorldMapMessage::url_callback_t url_cb = boost::bind(&LLLandmarkActions::onRegionResponseSLURL,
|
||||
cb,
|
||||
global_pos,
|
||||
|
|
@ -340,19 +396,34 @@ void LLLandmarkActions::onRegionResponseSLURL(slurl_callback_t cb,
|
|||
bool escaped,
|
||||
const std::string& url)
|
||||
{
|
||||
std::string sim_name;
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
// std::string sim_name;
|
||||
// std::string slurl;
|
||||
// bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
|
||||
// if (gotSimName)
|
||||
// {
|
||||
// // <FS:Ansariel> Debug...
|
||||
// if (sim_name.empty())
|
||||
// {
|
||||
// LL_WARNS() << "Requested sim name is empty!" << LL_ENDL;
|
||||
// }
|
||||
// // </FS:Ansariel>
|
||||
// slurl = LLSLURL(sim_name, global_pos).getSLURLString();
|
||||
// }
|
||||
|
||||
std::string slurl;
|
||||
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
|
||||
if (gotSimName)
|
||||
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(global_pos);
|
||||
if (sim_info)
|
||||
{
|
||||
// <FS:Ansariel> Debug...
|
||||
if (sim_name.empty())
|
||||
if (sim_info->getName().empty())
|
||||
{
|
||||
LL_WARNS() << "Requested sim name is empty!" << LL_ENDL;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
slurl = LLSLURL(sim_name, global_pos).getSLURLString();
|
||||
slurl = LLSLURL(sim_info->getName(), sim_info->getGlobalOrigin(), global_pos).getSLURLString();
|
||||
}
|
||||
// </FS:Beq pp Oren>
|
||||
else
|
||||
{
|
||||
slurl = "";
|
||||
|
|
@ -413,7 +484,12 @@ void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItem
|
|||
{
|
||||
LLVector3d global_pos;
|
||||
landmark->getGlobalPos(global_pos);
|
||||
LLLandmarkActions::getSLURLfromPosGlobal(global_pos,©_slurl_to_clipboard_callback,true);
|
||||
// <FS:Beq> FIRE-30534 - changes related to var regions in opensim
|
||||
// LLLandmarkActions::getSLURLfromPosGlobal(global_pos,©_slurl_to_clipboard_callback,true);
|
||||
LLVector3 region_pos;
|
||||
region_pos = landmark->getRegionPos();
|
||||
LLLandmarkActions::getSLURLfromPosGlobalAndLocal(global_pos, region_pos, ©_slurl_to_clipboard_callback,true);
|
||||
// </FS:Beq>
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ public:
|
|||
* @brief Creates SLURL for given global position.
|
||||
*/
|
||||
static void getSLURLfromPosGlobal(const LLVector3d& global_pos, slurl_callback_t cb, bool escaped = true);
|
||||
static void getSLURLfromPosGlobalAndLocal(const LLVector3d& global_pos, const LLVector3& region_pos, slurl_callback_t cb, bool escaped = true);// <FS:Beq> FIRE-30534 - changes related to var regions in opensim
|
||||
|
||||
static void getRegionNameAndCoordsFromPosGlobal(const LLVector3d& global_pos, region_name_and_coords_callback_t cb);
|
||||
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@
|
|||
#include "lllandmarkactions.h"
|
||||
#include "lllandmarklist.h"
|
||||
#include "llpathfindingmanager.h"
|
||||
#include "llworld.h" // <FS:Beq pp Oren/> FIRE-30768: SLURL's don't work in VarRegions
|
||||
#include "llpathfindingnavmesh.h"
|
||||
#include "llpathfindingnavmeshstatus.h"
|
||||
#include "llteleporthistory.h"
|
||||
|
|
@ -775,13 +776,24 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
|
|||
//mFullTitile format - region_name[, parcel_name] (local_x,local_y, local_z)
|
||||
if (new_item_titles.insert(result->mFullTitle).second)
|
||||
{
|
||||
LLSD value;
|
||||
value["item_type"] = TELEPORT_HISTORY;
|
||||
value["global_pos"] = result->mGlobalPos.getValue();
|
||||
std::string region_name = result->mTitle.substr(0, result->mTitle.find(','));
|
||||
//TODO*: add Surl to teleportitem or parse region name from title
|
||||
value["tooltip"] = LLSLURL(region_name, result->mGlobalPos).getSLURLString();
|
||||
add(result->getTitle(), value);
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(result->mRegionID);
|
||||
if (regionp)
|
||||
{
|
||||
LLSD value;
|
||||
value["item_type"] = TELEPORT_HISTORY;
|
||||
value["global_pos"] = result->mGlobalPos.getValue();
|
||||
std::string region_name = result->mTitle.substr(0, result->mTitle.find(','));
|
||||
//TODO*: add Surl to teleportitem or parse region name from title
|
||||
//value["tooltip"] = LLSLURL(region_name, result->mGlobalPos).getSLURLString();
|
||||
value["tooltip"] = LLSLURL(region_name, regionp->getOriginGlobal(), result->mGlobalPos).getSLURLString();
|
||||
add(result->getTitle(), value);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("LocationInputCtrl") << "unable to resolve region " << result->mRegionID << LL_ENDL;
|
||||
}
|
||||
// </FS:Beq pp Oren>
|
||||
}
|
||||
result = std::find_if(result + 1, th_items.end(), boost::bind(
|
||||
&LLLocationInputCtrl::findTeleportItemsByTitle, this,
|
||||
|
|
|
|||
|
|
@ -644,14 +644,15 @@ void LLModelPreview::rebuildUploadData()
|
|||
}
|
||||
if (!found_model && mModel[lod][model_ind] && !mModel[lod][model_ind]->mSubmodelID)
|
||||
{
|
||||
if (mImporterDebug)
|
||||
// <FS:Beq> this is not debug, this is an important/useful error advisory
|
||||
// if (mImporterDebug)
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Model " << mModel[lod][model_ind]->mLabel << " was not used - mismatching lod models.";
|
||||
LL_INFOS() << out.str() << LL_ENDL;
|
||||
LLFloaterModelPreview::addStringToLog(out, true);
|
||||
}
|
||||
load_state = LLModelLoader::ERROR_MATERIALS;
|
||||
load_state = LLModelLoader::ERROR_LOD_MODEL_MISMATCH;
|
||||
mFMP->childDisable("calculate_btn");
|
||||
}
|
||||
}
|
||||
|
|
@ -922,7 +923,38 @@ void LLModelPreview::setPhysicsFromLOD(S32 lod)
|
|||
updateStatusMessages();
|
||||
}
|
||||
}
|
||||
// <FS:Beq> FIRE-30963 - better physics defaults
|
||||
void LLModelPreview::setPhysicsFromPreset(S32 preset)
|
||||
{
|
||||
assert_main_thread();
|
||||
|
||||
mPhysicsSearchLOD = -1;
|
||||
mLODFile[LLModel::LOD_PHYSICS].clear();
|
||||
mFMP->childSetValue("physics_file", mLODFile[LLModel::LOD_PHYSICS]);
|
||||
mVertexBuffer[LLModel::LOD_PHYSICS].clear();
|
||||
if(preset == 1)
|
||||
{
|
||||
mPhysicsSearchLOD = LLModel::LOD_PHYSICS;
|
||||
loadModel( gDirUtilp->getExpandedFilename(LL_PATH_FS_RESOURCES, "cube_phys.dae"), LLModel::LOD_PHYSICS);
|
||||
}
|
||||
else if(preset == 2)
|
||||
{
|
||||
mPhysicsSearchLOD = LLModel::LOD_PHYSICS;
|
||||
loadModel( gDirUtilp->getExpandedFilename(LL_PATH_FS_RESOURCES, "hex_phys.dae"), LLModel::LOD_PHYSICS);
|
||||
}
|
||||
else if(preset == 3)
|
||||
{
|
||||
auto ud_physics = gSavedSettings.getString("FSPhysicsPresetUser1");
|
||||
LL_INFOS() << "Loading User defined Physics Preset [" << ud_physics << "]" << LL_ENDL;
|
||||
if (ud_physics != "" && gDirUtilp->fileExists(ud_physics))
|
||||
{
|
||||
// loading physics from file
|
||||
mPhysicsSearchLOD = LLModel::LOD_PHYSICS;
|
||||
loadModel( gDirUtilp->getExpandedFilename(LL_PATH_NONE, gDirUtilp->getDirName(ud_physics), gDirUtilp->getBaseFileName(ud_physics, false)), LLModel::LOD_PHYSICS);
|
||||
}
|
||||
}
|
||||
}
|
||||
// </FS:Beq>
|
||||
void LLModelPreview::clearIncompatible(S32 lod)
|
||||
{
|
||||
//Don't discard models if specified model is the physic rep
|
||||
|
|
@ -2365,10 +2397,7 @@ void LLModelPreview::updateStatusMessages()
|
|||
|
||||
//fmp->childSetEnabled("physics_optimize", !use_hull);
|
||||
|
||||
// <FS:Ansariel> Enable mesh analysis in SL only for now
|
||||
//bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty();
|
||||
bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty() && LLGridManager::instance().isInSecondLife();
|
||||
// </FS:Ansariel>
|
||||
bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty();
|
||||
//enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean();
|
||||
|
||||
//enable/disable "analysis" UI
|
||||
|
|
@ -2402,13 +2431,10 @@ void LLModelPreview::updateStatusMessages()
|
|||
fmp->childEnable("Simplify");
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Enable mesh analysis in SL only for now
|
||||
//if (phys_tris || phys_hulls > 0)
|
||||
//{
|
||||
// fmp->childEnable("Decompose");
|
||||
//}
|
||||
fmp->childSetEnabled("Decompose", (phys_tris || phys_hulls > 0) && LLGridManager::instance().isInSecondLife());
|
||||
// </FS:Ansariel>
|
||||
if (phys_tris || phys_hulls > 0)
|
||||
{
|
||||
fmp->childEnable("Decompose");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ public:
|
|||
void setTexture(U32 name) { mTextureName = name; }
|
||||
|
||||
void setPhysicsFromLOD(S32 lod);
|
||||
void setPhysicsFromPreset(S32 preset);// <FS:Beq/> FIRE-30963 - better physics defaults
|
||||
BOOL render();
|
||||
void update();
|
||||
void genBuffers(S32 lod, bool skinned);
|
||||
|
|
|
|||
|
|
@ -672,8 +672,11 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
|
|||
*/
|
||||
LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_NO_MATURITY,
|
||||
gAgent.getPosAgentFromGlobal(global_agent_pos));
|
||||
std::string tooltip (LLSLURL(gAgent.getRegion()->getName(), global_agent_pos).getSLURLString());
|
||||
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
//std::string tooltip (LLSLURL(gAgent.getRegion()->getName(), global_agent_pos).getSLURLString());
|
||||
std::string tooltip (LLSLURL(gAgent.getRegion()->getName(), gAgent.getRegion()->getOriginGlobal(), global_agent_pos).getSLURLString());
|
||||
// </FS:Beq pp Oren>
|
||||
|
||||
LLLocationHistoryItem item (location,
|
||||
global_agent_pos, tooltip,TYPED_REGION_SLURL);// we can add into history only TYPED location
|
||||
//Touch it, if it is at list already, add new location otherwise
|
||||
|
|
@ -760,7 +763,10 @@ void LLNavigationBar::onRegionNameResponse(
|
|||
LLVector3d region_pos = from_region_handle(region_handle);
|
||||
LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
|
||||
|
||||
LL_INFOS() << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << LL_ENDL;
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
//LL_INFOS() << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << LL_ENDL;
|
||||
LL_INFOS() << "Teleporting to: " << LLSLURL(region_name, region_pos, global_pos).getSLURLString() << LL_ENDL;
|
||||
// </FS:Beq pp Oren>
|
||||
gAgent.teleportViaLocation(global_pos);
|
||||
}
|
||||
else if (gSavedSettings.getBOOL("SearchFromAddressBar"))
|
||||
|
|
|
|||
|
|
@ -173,7 +173,7 @@ void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
|
|||
mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
|
||||
(F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
|
||||
(F32)pos_global.mdV[VZ]);
|
||||
|
||||
|
||||
LLSD body;
|
||||
std::string url = region->getCapability("RemoteParcelRequest");
|
||||
if (!url.empty())
|
||||
|
|
@ -186,6 +186,29 @@ void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
|
|||
mDescEditor->setText(getString("server_update_text"));
|
||||
}
|
||||
}
|
||||
// <FS:Beq> FIRE-30768, FIRE-30534 more OS Var region fixups
|
||||
void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
|
||||
const U64 region_handle,
|
||||
const LLVector3d& pos_global)
|
||||
{
|
||||
auto region_origin = from_region_handle(region_handle);
|
||||
mPosRegion.setVec(LLVector3(pos_global - region_origin));
|
||||
LLViewerRegion* region = gAgent.getRegion();
|
||||
if (!region)
|
||||
return;
|
||||
LLSD body;
|
||||
std::string url = region->getCapability("RemoteParcelRequest");
|
||||
if (!url.empty())
|
||||
{
|
||||
LLRemoteParcelInfoProcessor::getInstance()->requestRegionParcelInfo(url,
|
||||
region_id, mPosRegion, pos_global, getObserverHandle());
|
||||
}
|
||||
else
|
||||
{
|
||||
mDescEditor->setText(getString("server_update_text"));
|
||||
}
|
||||
}
|
||||
// </FS:Beq>
|
||||
|
||||
// virtual
|
||||
void LLPanelPlaceInfo::setErrorStatus(S32 status, const std::string& reason)
|
||||
|
|
|
|||
|
|
@ -85,6 +85,11 @@ public:
|
|||
// Sends a request to the server.
|
||||
void displayParcelInfo(const LLUUID& region_id,
|
||||
const LLVector3d& pos_global);
|
||||
// <FS:Beq> FIRE-30768, FIRE-30534 more OS Var region fixups
|
||||
void displayParcelInfo(const LLUUID& region_id,
|
||||
const U64 region_handle,
|
||||
const LLVector3d& pos_global);
|
||||
// </FS:Beq>
|
||||
|
||||
/*virtual*/ void setErrorStatus(S32 status, const std::string& reason);
|
||||
|
||||
|
|
|
|||
|
|
@ -410,9 +410,14 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
|
|||
parcel_data.name = parcel->getName();
|
||||
parcel_data.sim_name = region->getName();
|
||||
parcel_data.snapshot_id = parcel->getSnapshotID();
|
||||
mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
|
||||
(F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
|
||||
(F32)pos_global.mdV[VZ]);
|
||||
// <FS:Beq> FIRE-30768, FIRE-30534 more OS Var region fixups
|
||||
// mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
|
||||
// (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
|
||||
// (F32)pos_global.mdV[VZ]);
|
||||
auto region_origin = region->getOriginGlobal();
|
||||
mPosRegion.setVec(LLVector3(pos_global - region_origin));
|
||||
LL_DEBUGS("SLURL") << "LM INFO: global " << pos_global << " region_orig " << region_origin << " pos_region " << mPosRegion << LL_ENDL;
|
||||
// </FS:Beq>
|
||||
parcel_data.global_x = pos_global.mdV[VX];
|
||||
parcel_data.global_y = pos_global.mdV[VY];
|
||||
parcel_data.global_z = pos_global.mdV[VZ];
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include "llinventory.h"
|
||||
#include "lllandmark.h"
|
||||
#include "llparcel.h"
|
||||
#include "llregionhandle.h" // <FS:Beq/> Var region support
|
||||
|
||||
#include "llcombobox.h"
|
||||
#include "llfiltereditor.h"
|
||||
|
|
@ -486,6 +487,14 @@ void LLPanelPlaces::onOpen(const LLSD& key)
|
|||
mPosGlobal = LLVector3d(key["x"].asReal(),
|
||||
key["y"].asReal(),
|
||||
key["z"].asReal());
|
||||
// <FS:Beq> Var region support
|
||||
if(key.has("ox"))
|
||||
{
|
||||
auto region_handle = to_region_handle(key["ox"].asInteger(), key["oy"].asInteger());
|
||||
mPlaceProfile->displayParcelInfo(LLUUID(), region_handle, mPosGlobal);
|
||||
}
|
||||
else
|
||||
// </FS:Beq>
|
||||
mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -60,14 +60,20 @@ void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos,
|
|||
const LLUUID& snapshot_id,
|
||||
bool teleport)
|
||||
{
|
||||
std::string sim_name;
|
||||
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal( landmark_global_pos, sim_name );
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
//std::string sim_name;
|
||||
//bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal( landmark_global_pos, sim_name );
|
||||
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(landmark_global_pos);
|
||||
|
||||
std::string sl_url;
|
||||
if ( gotSimName )
|
||||
//if ( gotSimName )
|
||||
if (sim_info)
|
||||
{
|
||||
sl_url = LLSLURL(sim_name, landmark_global_pos).getSLURLString();
|
||||
//sl_url = LLSLURL(sim_name, landmark_global_pos).getSLURLString();
|
||||
sl_url = LLSLURL(sim_info->getName(), sim_info->getGlobalOrigin(), landmark_global_pos).getSLURLString();
|
||||
}
|
||||
// </FS:Beq pp Oren>
|
||||
|
||||
else
|
||||
{
|
||||
sl_url = "";
|
||||
|
|
|
|||
|
|
@ -464,9 +464,9 @@ void LLProgressView::initLogos()
|
|||
const S32 default_pad = 15;
|
||||
|
||||
S32 icon_width;
|
||||
#if defined(LL_FMODSTUDIO) || defined(LL_HAVOK)
|
||||
//#if defined(LL_FMODSTUDIO) || defined(LL_HAVOK) // <FS> FIRE-30937: Always needed
|
||||
S32 icon_height;
|
||||
#endif // defined(LL_FMODSTUDIO) || defined(LL_HAVOK)
|
||||
//#endif // defined(LL_FMODSTUDIO) || defined(LL_HAVOK) // <FS> FIRE-30937: Always needed
|
||||
|
||||
// We don't know final screen rect yet, so we can't precalculate position fully
|
||||
LLTextBox *logos_label = getChild<LLTextBox>("logos_lbl");
|
||||
|
|
|
|||
|
|
@ -189,6 +189,7 @@ void LLRemoteParcelInfoProcessor::regionParcelInfoCoro(std::string url,
|
|||
|
||||
LLSD bodyData;
|
||||
|
||||
LL_DEBUGS("ParcelRequest") << "Remote Parcel Request for " << regionId << "local: " << posRegion << "remote: " << posGlobal << LL_ENDL;// <FS:Beq> FIRE-30534 - changes related to var regions in opensim
|
||||
bodyData["location"] = ll_sd_from_vector3(posRegion);
|
||||
if (!regionId.isNull())
|
||||
{
|
||||
|
|
@ -196,6 +197,7 @@ void LLRemoteParcelInfoProcessor::regionParcelInfoCoro(std::string url,
|
|||
}
|
||||
if (!posGlobal.isExactlyZero())
|
||||
{
|
||||
// <FS:Beq> Note: leave this to_region_handle at 256 grid cell resolution, let OpenSim Server resolve
|
||||
U64 regionHandle = to_region_handle(posGlobal);
|
||||
bodyData["region_handle"] = ll_sd_from_U64(regionHandle);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -353,6 +353,7 @@ LLSLURL::LLSLURL(const std::string& region,
|
|||
// create a slurl from a global position
|
||||
LLSLURL::LLSLURL(const std::string& grid,
|
||||
const std::string& region,
|
||||
const LLVector3d& , // <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions *unused param in SL builds*
|
||||
const LLVector3d& global_position)
|
||||
{
|
||||
*this = LLSLURL(LLGridManager::getInstance()->getGridId(grid),
|
||||
|
|
@ -363,10 +364,17 @@ LLSLURL::LLSLURL(const std::string& grid,
|
|||
|
||||
// create a slurl from a global position
|
||||
LLSLURL::LLSLURL(const std::string& region,
|
||||
const LLVector3d& region_origin, // <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
const LLVector3d& global_position)
|
||||
{
|
||||
*this = LLSLURL(LLGridManager::getInstance()->getGridId(),
|
||||
region, global_position);
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
// *this = LLSLURL(LLGridManager::getInstance()->getGridId(),
|
||||
// region, global_position);
|
||||
*this = LLSLURL(LLGridManager::getInstance()->getGridId(),
|
||||
region,
|
||||
region_origin,
|
||||
global_position);
|
||||
// </FS:Beq pp Oren>
|
||||
}
|
||||
|
||||
LLSLURL::LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb)
|
||||
|
|
|
|||
|
|
@ -71,8 +71,12 @@ public:
|
|||
LLSLURL(const std::string& grid, const std::string& region);
|
||||
LLSLURL(const std::string& region, const LLVector3& position);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3& position);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position);
|
||||
LLSLURL(const std::string& region, const LLVector3d& global_position);
|
||||
// <FS:Beq pp Oren> FIRE-30768: SLURL's don't work in VarRegions
|
||||
// LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position);
|
||||
// LLSLURL(const std::string& region, const LLVector3d& global_position);
|
||||
LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& region_origin, const LLVector3d& global_position);
|
||||
LLSLURL(const std::string& region, const LLVector3d& region_origin, const LLVector3d& global_position);
|
||||
// </FS:Beq pp Oren>
|
||||
LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb);
|
||||
|
||||
SLURL_TYPE getType() const { return mType; }
|
||||
|
|
|
|||
|
|
@ -3876,6 +3876,16 @@ void LLStartUp::setStartSLURL(const LLSLURL& slurl)
|
|||
gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_LAST);
|
||||
break;
|
||||
}
|
||||
// <FS:Ansariel> Support adding grids via SLURL
|
||||
#if OPENSIM && !SINGLEGRID
|
||||
case LLSLURL::APP:
|
||||
if (slurl.getAppCmd() == "gridmanager")
|
||||
{
|
||||
LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(), "clicked", NULL, false);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
// </FS:Ansariel>
|
||||
default:
|
||||
LLGridManager::getInstance()->setGridChoice(slurl.getGrid());
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -283,9 +283,12 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&
|
|||
#endif // OPENSIM
|
||||
// </FS:AW optional opensim support>
|
||||
|
||||
LLVector3d global_pos = from_region_handle(region_handle);
|
||||
global_pos += LLVector3d(slurl.getPosition());
|
||||
|
||||
// <FS:Beq> make Var Regions work
|
||||
// LLVector3d global_pos = from_region_handle(region_handle);
|
||||
// global_pos += LLVector3d(slurl.getPosition());
|
||||
LLVector3d origin_pos = from_region_handle(region_handle);
|
||||
LLVector3d global_pos{origin_pos + LLVector3d(slurl.getPosition())};
|
||||
// </FS:Beq>
|
||||
if (teleport)
|
||||
{
|
||||
gAgent.teleportViaLocation(global_pos);
|
||||
|
|
@ -302,6 +305,10 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&
|
|||
key["x"] = global_pos.mdV[VX];
|
||||
key["y"] = global_pos.mdV[VY];
|
||||
key["z"] = global_pos.mdV[VZ];
|
||||
// <FS:Beq> support Var regions
|
||||
key["ox"] = origin_pos.mdV[VX];
|
||||
key["oy"] = origin_pos.mdV[VY];
|
||||
// </FS:Beq>
|
||||
|
||||
// <FS:Ansariel> FIRE-817: Separate place details floater
|
||||
//LLFloaterSidePanelContainer::showPanel("places", key);
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@
|
|||
#include "fslslbridge.h"
|
||||
#include "fsradar.h"
|
||||
#include "llavataractions.h"
|
||||
#include "lldiskcache.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloatersidepanelcontainer.h"
|
||||
#include "llhudtext.h"
|
||||
|
|
@ -1062,6 +1063,15 @@ void handlePlayBentoIdleAnimationChanged(const LLSD& newValue)
|
|||
}
|
||||
// </FS:Zi>
|
||||
|
||||
// <FS:Ansariel> Better asset cache size control
|
||||
void handleDiskCacheSizeChanged(const LLSD& newValue)
|
||||
{
|
||||
const unsigned int disk_cache_mb = gSavedSettings.getU32("FSDiskCacheSize");
|
||||
const U64 disk_cache_bytes = disk_cache_mb * 1024 * 1024;
|
||||
LLDiskCache::getInstance()->setMaxSizeBytes(disk_cache_bytes);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void settings_setup_listeners()
|
||||
|
|
@ -1316,6 +1326,9 @@ void settings_setup_listeners()
|
|||
|
||||
// <FS:Zi> Run Prio 0 default bento pose in the background to fix splayed hands, open mouths, etc.
|
||||
gSavedSettings.getControl("FSPlayDefaultBentoAnimation")->getSignal()->connect(boost::bind(&handlePlayBentoIdleAnimationChanged, _2));
|
||||
|
||||
// <FS:Ansariel> Better asset cache size control
|
||||
gSavedSettings.getControl("FSDiskCacheSize")->getSignal()->connect(boost::bind(&handleDiskCacheSizeChanged, _2));
|
||||
}
|
||||
|
||||
#if TEST_CACHED_CONTROL
|
||||
|
|
|
|||
|
|
@ -555,12 +555,16 @@ void LLViewerJoystick::updateStatus()
|
|||
|
||||
ndof_update(mNdofDev);
|
||||
|
||||
for (int i=0; i<6; i++)
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// for (int i=0; i<6; i++)
|
||||
for (int i = 0; i < MAX_JOYSTICK_AXES; i++)
|
||||
{
|
||||
mAxes[i] = (F32) mNdofDev->axes[i] / mNdofDev->axes_max;
|
||||
}
|
||||
|
||||
for (int i=0; i<16; i++)
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// for (int i=0; i<16; i++)
|
||||
for (int i = 0; i < MAX_JOYSTICK_BUTTONS; i++)
|
||||
{
|
||||
mBtn[i] = mNdofDev->buttons[i];
|
||||
}
|
||||
|
|
@ -571,7 +575,9 @@ void LLViewerJoystick::updateStatus()
|
|||
// -----------------------------------------------------------------------------
|
||||
F32 LLViewerJoystick::getJoystickAxis(U32 axis) const
|
||||
{
|
||||
if (axis < 6)
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// if (axis < 6)
|
||||
if (axis < MAX_JOYSTICK_AXES)
|
||||
{
|
||||
return mAxes[axis];
|
||||
}
|
||||
|
|
@ -581,7 +587,9 @@ F32 LLViewerJoystick::getJoystickAxis(U32 axis) const
|
|||
// -----------------------------------------------------------------------------
|
||||
U32 LLViewerJoystick::getJoystickButton(U32 button) const
|
||||
{
|
||||
if (button < 16)
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// if (button < 16)
|
||||
if (button < MAX_JOYSTICK_BUTTONS)
|
||||
{
|
||||
return mBtn[button];
|
||||
}
|
||||
|
|
@ -1510,3 +1518,25 @@ void LLViewerJoystick::setSNDefaults()
|
|||
gSavedSettings.setF32("BuildFeathering", 12.f);
|
||||
gSavedSettings.setF32("FlycamFeathering", 5.f);
|
||||
}
|
||||
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
U32 LLViewerJoystick::getNumOfJoystickAxes() const
|
||||
{
|
||||
#if LIB_NDOF
|
||||
// return number of axes or the maximum supported number of axes, whichever is smaller
|
||||
return llmin((U32) mNdofDev->axes_count, (U32) MAX_JOYSTICK_AXES);
|
||||
#else
|
||||
return MAX_JOYSTICK_AXES;
|
||||
#endif
|
||||
}
|
||||
|
||||
U32 LLViewerJoystick::getNumOfJoystickButtons() const
|
||||
{
|
||||
#if LIB_NDOF
|
||||
// return number of buttons or the maximum supported number of buttons, whichever is smaller
|
||||
return llmin((U32) mNdofDev->btn_count, (U32) MAX_JOYSTICK_BUTTONS);
|
||||
#else
|
||||
return MAX_JOYSTICK_BUTTONS;
|
||||
#endif
|
||||
}
|
||||
// </FS:Zi>
|
||||
|
|
|
|||
|
|
@ -36,6 +36,14 @@
|
|||
#define NDOF_HotPlugResult S32
|
||||
#endif
|
||||
|
||||
// <FS:Zi> FIRE-14344 - Using the same numbers all over the place is a bad idea, so let's
|
||||
// define them here in case we need to change them at some point. Better
|
||||
// would be to have it all figured out at runtime, but a lot of the code
|
||||
// expects a fixed size of options, so that needs bigger changes :/
|
||||
#define MAX_JOYSTICK_AXES 8
|
||||
#define MAX_JOYSTICK_BUTTONS 16
|
||||
// </FS:Zi>
|
||||
|
||||
typedef enum e_joystick_driver_state
|
||||
{
|
||||
JDS_UNINITIALIZED,
|
||||
|
|
@ -93,8 +101,12 @@ protected:
|
|||
#endif
|
||||
|
||||
private:
|
||||
F32 mAxes[6];
|
||||
long mBtn[16];
|
||||
// <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
// F32 mAxes[6];
|
||||
// long mBtn[16];
|
||||
F32 mAxes[MAX_JOYSTICK_AXES];
|
||||
long mBtn[MAX_JOYSTICK_BUTTONS];
|
||||
// </FS:Zi>
|
||||
EJoystickDriverState mDriverState;
|
||||
NDOF_Device *mNdofDev;
|
||||
bool mResetFlag;
|
||||
|
|
@ -106,6 +118,12 @@ private:
|
|||
|
||||
static F32 sLastDelta[7];
|
||||
static F32 sDelta[7];
|
||||
|
||||
// FIRE-14344 - Add button preview and allow for more than 6 axes
|
||||
public:
|
||||
U32 getNumOfJoystickAxes() const;
|
||||
U32 getNumOfJoystickButtons() const;
|
||||
// </FS.Zi>
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -380,6 +380,7 @@ LLSimInfo* LLWorldMap::simInfoFromHandle(const U64 handle)
|
|||
if(x >= checkRegionX && x < (checkRegionX + info->mSizeX) &&
|
||||
y >= checkRegionY && y < (checkRegionY + info->mSizeY))
|
||||
{
|
||||
LL_DEBUGS("WorldMap") << "VarRegion match for map tile (" << x << "," << y << ") in " << info->mSizeX << "x" << info->mSizeY << " region at (" << checkRegionX << "," << checkRegionY << ")" << LL_ENDL;// <FS:Beq/> FIRE-30534 - changes related to var regions in opensim
|
||||
return info;
|
||||
}
|
||||
// </FS:CR> Aurora Sim
|
||||
|
|
@ -466,7 +467,7 @@ bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, U16 x_size, U16 y_size,
|
|||
else
|
||||
{
|
||||
U64 handle = to_region_handle(x_world, y_world);
|
||||
//LL_INFOS("WorldMap") << "Map sim : " << name << ", ID : " << image_id.getString() << LL_ENDL;
|
||||
LL_DEBUGS("WorldMap") << "Map sim : " << name << ", ID : " << image_id.getString() << ", HANDLE : " << handle << LL_ENDL;// <FS:Beq> FIRE-30534 - changes related to var regions in opensim
|
||||
// Insert the region in the region map of the world map
|
||||
// Loading the LLSimInfo object with what we got and insert it in the map
|
||||
LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle);
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@
|
|||
</layout_panel>
|
||||
</layout_stack>
|
||||
<button
|
||||
top="1"
|
||||
top="2"
|
||||
follows="top|right"
|
||||
layout="topleft"
|
||||
height="22"
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="imcontacts" title="Kontakte">
|
||||
<string name="no_friends" value="keine Freunde"/>
|
||||
<string name="no_filtered_groups_msg" value="Nicht gefunden wonach du gesucht hast? Versuche [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
|
||||
<string name="no_groups_msg" value="Du suchst nach Gruppen zum Beitreten? Versuche [secondlife:///app/search/groups Search]."/>
|
||||
<string name="no_filtered_groups_msg" value="Keine Gruppe „[SEARCH_TERM]“ gefunden."/>
|
||||
<string name="no_groups_msg" value="Du suchst nach Gruppen zum Beitreten? Versuche die [secondlife:///app/search/groups Suche]."/>
|
||||
<tab_container name="friends_and_groups">
|
||||
<panel label="Freunde" name="friends_panel"/>
|
||||
<panel label="Gruppen" name="groups_panel"/>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="group_titles" title="Gruppentitel">
|
||||
<floater.string name="NoGroupTitle" value="<Kein Titel>"/>
|
||||
<filter_editor label="Nach Gruppentiteln filtern" name="filter_input"/>
|
||||
<scroll_list name="title_list">
|
||||
<column name="grouptitle" label="Titel"/>
|
||||
<column name="groupname" label="Gruppe"/>
|
||||
|
|
|
|||
|
|
@ -22,6 +22,53 @@
|
|||
<check_box label="Avatar" name="JoystickAvatarEnabled"/>
|
||||
<check_box label="Bauen" name="JoystickBuildEnabled"/>
|
||||
<check_box label="Flycam" name="JoystickFlycamEnabled"/>
|
||||
<text name="joystick_monitor_label">
|
||||
Joystick-Monitor
|
||||
</text>
|
||||
<icon name="button_light_0" tool_tip="Joystick-Button 0"/>
|
||||
<icon name="button_light_1" tool_tip="Joystick-Button 1"/>
|
||||
<icon name="button_light_2" tool_tip="Joystick-Button 2"/>
|
||||
<icon name="button_light_3" tool_tip="Joystick-Button 3"/>
|
||||
<icon name="button_light_4" tool_tip="Joystick-Button 4"/>
|
||||
<icon name="button_light_5" tool_tip="Joystick-Button 5"/>
|
||||
<icon name="button_light_6" tool_tip="Joystick-Button 6"/>
|
||||
<icon name="button_light_7" tool_tip="Joystick-Button 7"/>
|
||||
<icon name="button_light_8" tool_tip="Joystick-Button 8"/>
|
||||
<icon name="button_light_9" tool_tip="Joystick-Button 9"/>
|
||||
<icon name="button_light_10" tool_tip="Joystick-Button 10"/>
|
||||
<icon name="button_light_11" tool_tip="Joystick-Button 11"/>
|
||||
<icon name="button_light_12" tool_tip="Joystick-Button 12"/>
|
||||
<icon name="button_light_13" tool_tip="Joystick-Button 13"/>
|
||||
<icon name="button_light_14" tool_tip="Joystick-Button 14"/>
|
||||
<icon name="button_light_15" tool_tip="Joystick-Button 15"/>
|
||||
<scroll_container name="joystick_monitor_axes_scroller">
|
||||
<container_view name="joystick_monitor_axes_container">
|
||||
<stat_view name="axis_view_0">
|
||||
<stat_bar label="Achse 0" name="axis0"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_1">
|
||||
<stat_bar label="Achse 1" name="axis1"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_2">
|
||||
<stat_bar label="Achse 2" name="axis2"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_3">
|
||||
<stat_bar label="Achse 3" name="axis3"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_4">
|
||||
<stat_bar label="Achse 4" name="axis4"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_5">
|
||||
<stat_bar label="Achse 5" name="axis5"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_6">
|
||||
<stat_bar label="Achse 6" name="axis6"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_7">
|
||||
<stat_bar label="Achse 7" name="axis7"/>
|
||||
</stat_view>
|
||||
</container_view>
|
||||
</scroll_container>
|
||||
<text name="XScale">
|
||||
X-Skala
|
||||
</text>
|
||||
|
|
@ -70,12 +117,4 @@
|
|||
<button label="SpaceNavigator-Standards" name="SpaceNavigatorDefaults"/>
|
||||
<button label="OK" label_selected="OK" name="ok_btn"/>
|
||||
<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
|
||||
<stat_view label="Joystick-Monitor" name="axis_view">
|
||||
<stat_bar label="Achse 0" name="axis0"/>
|
||||
<stat_bar label="Achse 1" name="axis1"/>
|
||||
<stat_bar label="Achse 2" name="axis2"/>
|
||||
<stat_bar label="Achse 3" name="axis3"/>
|
||||
<stat_bar label="Achse 4" name="axis4"/>
|
||||
<stat_bar label="Achse 5" name="axis5"/>
|
||||
</stat_view>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@
|
|||
<string name="status_material_mismatch">
|
||||
Fehler: Das Material des Modells ist keine Teilmenge des Referenzmodells.
|
||||
</string>
|
||||
<string name="status_lod_model_mismatch">
|
||||
Fehler: LOD-Model hat keinen Vorgänger.
|
||||
</string>
|
||||
<string name="status_reading_file">
|
||||
Laden...
|
||||
</string>
|
||||
|
|
@ -239,6 +242,15 @@
|
|||
<combo_item name="physics_lowest">
|
||||
Niedrigste
|
||||
</combo_item>
|
||||
<combo_item name="physics_cube">
|
||||
Würfel
|
||||
</combo_item>
|
||||
<combo_item name="physics_hex">
|
||||
Hexagon
|
||||
</combo_item>
|
||||
<combo_item name="physics_ud">
|
||||
Benutzerdefiniert
|
||||
</combo_item>
|
||||
<combo_item name="load_from_file">
|
||||
Aus Datei
|
||||
</combo_item>
|
||||
|
|
@ -369,6 +381,10 @@
|
|||
</text>
|
||||
<check_box label="Gewichte automatisch aktivieren" tool_tip="Automatisch die Gewichte für Netze mit Rigging-Informationen aktivieren" name="mesh_preview_auto_weights"/>
|
||||
<check_box label="Automatische Vorschau für Gewichte" tool_tip="Zeigt automatisch die Gewichte für Netze mit Rigging-Informationen in der Vorschau" name="mesh_preview_auto_show_weights"/>
|
||||
<text name="mesh_preview_ud_preset_label" width="220">
|
||||
Benutzerdefinierte Physik-Einstellungen:
|
||||
</text>
|
||||
<line_editor name="ud_physics" tool_tip="Dateipfad zu einer einfachen Collada Mesh-Definition, die für Physik verwendet wird." />
|
||||
<text name="mesh_preview_colors_label">
|
||||
Farben für Modell-Upload:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<panel
|
||||
name="groups">
|
||||
<panel name="groups">
|
||||
<filter_editor label="Gruppen filtern" name="group_filter_input" right="-91"/>
|
||||
<view_border
|
||||
width="257"
|
||||
name="info_border" />
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@
|
|||
<slider label="Zusätzliche Textur-Speicherbuffer-Reserve (%):" name="FSDynamicTextureMemoryCacheReserve" tool_tip="Prozentsatz des gesamten Videospeichers, der zum Zwischenspeichern von geladenen Texturen verwendet wird, die aktuell nicht dargestellt werden."/>
|
||||
<slider label="Physische Videospeicher-Reserve (%):" name="FSDynamicTextureMemoryGPUReserve" tool_tip="Prozentsatz des gesamten Videospeichers, der für andere Zwecke reserviert wird."/>
|
||||
<spinner label="Nebeldistanzverhältnis:" name="fog"/>
|
||||
<spinner label="Parallelität Textur-Dekodierung:" name="image_decode_threads" tool_tip="Die Anzahl an Threads, für zur Dekodierung von Texturen verwendet wird. 0 = Automatisch ermitteln, 1 = Synchron, 2+ = Benutzerdefiniert. (Empfohlen: 0 oder 1)"/>
|
||||
</panel>
|
||||
|
||||
<panel label="Darstellung" name="Rendering">
|
||||
|
|
|
|||
|
|
@ -47,7 +47,10 @@
|
|||
</panel>
|
||||
<panel label="Verzeichnisse" name="tab-dir">
|
||||
<text name="cache_size_label_l">
|
||||
Cache-Größe ([http://wiki.firestormviewer.org/cache Empfehlungen anzeigen?]):
|
||||
Textur-Cache-Größe ([http://wiki.firestormviewer.org/cache Empfehlungen anzeigen?]):
|
||||
</text>
|
||||
<text name="asset_cache_size_label_l">
|
||||
Asset-Cache-Größe :
|
||||
</text>
|
||||
<button label="Inventar-Cache löschen" width="137" name="ClearInventoryCache"/>
|
||||
<text name="Cache location">
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
value="No friends" />
|
||||
<string
|
||||
name="no_filtered_groups_msg"
|
||||
value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />
|
||||
value="No groups containing "[SEARCH_TERM]" found." />
|
||||
<string
|
||||
name="no_groups_msg"
|
||||
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
|
||||
|
|
|
|||
|
|
@ -16,14 +16,25 @@
|
|||
|
||||
<floater.string name="NoGroupTitle" value="<No group title>"/>
|
||||
|
||||
<filter_editor
|
||||
follows="left|top|right"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
left="5"
|
||||
label="Filter Group Titles"
|
||||
max_length_bytes="20"
|
||||
name="filter_input"
|
||||
top="5"
|
||||
right="-5" />
|
||||
|
||||
<scroll_list
|
||||
name="title_list"
|
||||
follows="all"
|
||||
draw_heading="true"
|
||||
layout="topleft"
|
||||
width="240"
|
||||
right="-5"
|
||||
left="5"
|
||||
height="265">
|
||||
height="238">
|
||||
<column
|
||||
name="grouptitle"
|
||||
sort_column="title_sort_column"
|
||||
|
|
|
|||
|
|
@ -219,6 +219,7 @@
|
|||
parse_urls="true"
|
||||
enabled="false"
|
||||
max_length="1000"
|
||||
trusted_content="false"
|
||||
value="You unlock this door with the key of imagination. Beyond it is another dimension: a dimension of sound, a dimension of sight, a dimension of mind. You're moving into a land of both shadow and substance, of things and ideas; you've just crossed over into the Twilight Zone. What you are about to see is real; the litigants on the screen are not actors. They are genuine citizens who, having filed their claims in a real small claims court, have been persuaded to drop their suits there and have them settled here, in this forum... the People's Court."/>
|
||||
<button
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -201,80 +201,186 @@
|
|||
left="289"
|
||||
name="JoystickFlycamEnabled"
|
||||
width="60" />
|
||||
<stat_view
|
||||
height="270"
|
||||
label="Joystick Monitor"
|
||||
layout="topleft"
|
||||
left="359"
|
||||
name="axis_view"
|
||||
show_label="true"
|
||||
top="143"
|
||||
width="200">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 0"
|
||||
label_spacing="1"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis0"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 1"
|
||||
label_spacing="1"
|
||||
layout="topleft"
|
||||
name="axis1"
|
||||
tick_spacing="0.5" />
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 2"
|
||||
label_spacing="1"
|
||||
layout="topleft"
|
||||
name="axis2"
|
||||
tick_spacing="0.5" />
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 3"
|
||||
label_spacing="1"
|
||||
layout="topleft"
|
||||
name="axis3"
|
||||
tick_spacing="0.5" />
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 4"
|
||||
label_spacing="1"
|
||||
layout="topleft"
|
||||
name="axis4"
|
||||
tick_spacing="0.5" />
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
label="Axis 5"
|
||||
show_bar="true"
|
||||
label_spacing="1"
|
||||
layout="topleft"
|
||||
name="axis5"
|
||||
tick_spacing="0.5" />
|
||||
</stat_view>
|
||||
|
||||
<!-- <FS:Zi> FIRE-14344 - Add button preview and allow for more than 6 axes -->
|
||||
<text
|
||||
type="string"
|
||||
halign="center"
|
||||
length="16"
|
||||
name="joystick_buttons"
|
||||
text_color="White"
|
||||
top_pad="1" />
|
||||
follows="all"
|
||||
halign="center"
|
||||
height="16"
|
||||
layout="topleft"
|
||||
left="350"
|
||||
name="joystick_monitor_label"
|
||||
top="116"
|
||||
width="210">
|
||||
Joystick Monitor
|
||||
</text>
|
||||
|
||||
<icon image_name="lag_status_good.tga" height="10" left_delta="10" name="button_light_0" width="10" tool_tip="Joystick Button 0" top_pad="2" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_1" width="10" tool_tip="Joystick Button 1" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_2" width="10" tool_tip="Joystick Button 2" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_3" width="10" tool_tip="Joystick Button 3" />
|
||||
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="4" name="button_light_4" width="10" tool_tip="Joystick Button 4" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_5" width="10" tool_tip="Joystick Button 5" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_6" width="10" tool_tip="Joystick Button 6" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_7" width="10" tool_tip="Joystick Button 7" />
|
||||
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="4" name="button_light_8" width="10" tool_tip="Joystick Button 8" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_9" width="10" tool_tip="Joystick Button 9" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_10" width="10" tool_tip="Joystick Button 10" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_11" width="10" tool_tip="Joystick Button 11" />
|
||||
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="4" name="button_light_12" width="10" tool_tip="Joystick Button 12" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_13" width="10" tool_tip="Joystick Button 13" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_14" width="10" tool_tip="Joystick Button 14" />
|
||||
<icon image_name="lag_status_good.tga" height="10" left_pad="1" name="button_light_15" width="10" tool_tip="Joystick Button 15" />
|
||||
|
||||
<scroll_container
|
||||
height="270"
|
||||
name="joystick_monitor_axes_scroller"
|
||||
top_pad="3"
|
||||
left="350"
|
||||
width="211">
|
||||
|
||||
<container_view
|
||||
background_visible="false"
|
||||
follows="all"
|
||||
name="joystick_monitor_axes_container"
|
||||
width="196">
|
||||
|
||||
<!-- Zi: One stat_view for each axis so we can hide them individually -->
|
||||
<stat_view
|
||||
name="axis_view_0"
|
||||
show_label="false">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 0"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis0"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
</stat_view>
|
||||
|
||||
<stat_view
|
||||
name="axis_view_1"
|
||||
show_label="false">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 1"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis1"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
</stat_view>
|
||||
|
||||
<stat_view
|
||||
name="axis_view_2"
|
||||
show_label="false">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 2"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis2"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
</stat_view>
|
||||
|
||||
<stat_view
|
||||
name="axis_view_3"
|
||||
show_label="false">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 3"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis3"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
</stat_view>
|
||||
|
||||
<stat_view
|
||||
name="axis_view_4"
|
||||
show_label="false">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 4"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis4"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
</stat_view>
|
||||
|
||||
<stat_view
|
||||
name="axis_view_5"
|
||||
show_label="false">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 5"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis5"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
</stat_view>
|
||||
|
||||
<stat_view
|
||||
name="axis_view_6"
|
||||
show_label="false">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 6"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis6"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
</stat_view>
|
||||
|
||||
<stat_view
|
||||
name="axis_view_7"
|
||||
show_label="false">
|
||||
<stat_bar
|
||||
bar_max="2"
|
||||
bar_min="-2"
|
||||
show_bar="true"
|
||||
label="Axis 7"
|
||||
layout="topleft"
|
||||
left="0"
|
||||
name="axis7"
|
||||
tick_spacing="0.5"
|
||||
top="20"
|
||||
width="0" />
|
||||
</stat_view>
|
||||
|
||||
</container_view>
|
||||
</scroll_container>
|
||||
<!-- </FS:Zi> -->
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
<string name="status_parse_error">Error: Dae parsing issue - see log for details.</string>
|
||||
<string name="status_bind_shape_orientation">Warning: bind shape matrix is not in standard X-forward orientation.</string>
|
||||
<string name="status_material_mismatch">Error: Material of model is not a subset of reference model.</string>
|
||||
<string name="status_lod_model_mismatch">Error: LOD Model has no parent.</string>
|
||||
<string name="status_reading_file">Loading...</string>
|
||||
<string name="status_generating_meshes">Generating Meshes...</string>
|
||||
<string name="status_vertex_number_overflow">Error: Vertex number is more than 65535, aborted!</string>
|
||||
|
|
@ -787,6 +788,9 @@
|
|||
<combo_item name="physics_medium"> Medium </combo_item>
|
||||
<combo_item name="physics_low"> Low </combo_item>
|
||||
<combo_item name="physics_lowest"> Lowest </combo_item>
|
||||
<combo_item name="physics_cube"> Cube </combo_item>
|
||||
<combo_item name="physics_hex"> Hexagon </combo_item>
|
||||
<combo_item name="physics_ud"> User Defined </combo_item>
|
||||
<combo_item name="load_from_file"> From file </combo_item>
|
||||
</combo_box>
|
||||
<line_editor
|
||||
|
|
@ -956,15 +960,15 @@
|
|||
left_pad="40"
|
||||
name="pass_method_header"
|
||||
height="15"
|
||||
width="41">
|
||||
width="79">
|
||||
Passes:
|
||||
</text>
|
||||
<text
|
||||
follows="top|left"
|
||||
left_pad="40"
|
||||
left_pad="2"
|
||||
name="Detail Scale label"
|
||||
height="15"
|
||||
width="80">
|
||||
width="100">
|
||||
Detail scale:
|
||||
</text>
|
||||
<text
|
||||
|
|
@ -1414,12 +1418,35 @@
|
|||
<check_box
|
||||
control_name="FSMeshUploadAutoShowWeightsWhenEnabled"
|
||||
follows="top|left"
|
||||
top_pad="8"
|
||||
left="24"
|
||||
left_pad="5"
|
||||
width="300"
|
||||
label="Auto-preview weights"
|
||||
tool_tip="Automatically show weights in preview for meshes with rigging info"
|
||||
name="mesh_preview_auto_show_weights"/>
|
||||
<text
|
||||
follows="left|top"
|
||||
layout="topleft"
|
||||
left="24"
|
||||
height="12"
|
||||
name="mesh_preview_ud_preset_label"
|
||||
top_pad="10"
|
||||
width="200">
|
||||
Physics User Defined Preset:
|
||||
</text>
|
||||
<line_editor
|
||||
control_name="FSPhysicsPresetUser1"
|
||||
border_style="line"
|
||||
border_thickness="1"
|
||||
follows="left|top"
|
||||
font="SansSerif"
|
||||
height="23"
|
||||
top_delta="-7"
|
||||
layout="topleft"
|
||||
left_pad="5"
|
||||
max_length_chars="4096"
|
||||
name="ud_physics"
|
||||
tool_tip="Full system path to a simple Collada mesh definition to be used for physics."
|
||||
width="270" />
|
||||
<text
|
||||
follows="left|top"
|
||||
layout="topleft"
|
||||
|
|
@ -1882,7 +1909,7 @@ Analysed:
|
|||
name="show_joint_positions"
|
||||
word_wrap="down"
|
||||
left_pad="0"
|
||||
width="65"/>
|
||||
width="70"/>
|
||||
<check_box
|
||||
follows="top|left"
|
||||
label="Joint Pos. Overrides"
|
||||
|
|
@ -1890,7 +1917,7 @@ Analysed:
|
|||
layout="topleft"
|
||||
name="show_joint_overrides"
|
||||
left_pad="5"
|
||||
width="100">
|
||||
width="110">
|
||||
</check_box>
|
||||
</panel>
|
||||
<!-- ========== NOTE MESSAGE ========== -->
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ https://accounts.secondlife.com/change_email/
|
|||
width="28">
|
||||
<button.commit_callback
|
||||
function="Pref.CopySearchAsSLURL" />
|
||||
</button>
|
||||
</button>
|
||||
</panel>
|
||||
|
||||
<tab_container
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@
|
|||
word_wrap="true"
|
||||
top_pad="4"
|
||||
use_ellipses="true"
|
||||
trusted_content="false"
|
||||
width="220">This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot
|
||||
</text>
|
||||
<slider
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@
|
|||
</layout_panel>
|
||||
</layout_stack>
|
||||
<button
|
||||
top="1"
|
||||
top="2"
|
||||
follows="top|right"
|
||||
layout="topleft"
|
||||
height="22"
|
||||
|
|
|
|||
|
|
@ -6,22 +6,35 @@
|
|||
mouse_opaque="true"
|
||||
name="groups"
|
||||
width="355">
|
||||
<filter_editor
|
||||
follows="left|top|right"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
left="6"
|
||||
label="Filter Groups"
|
||||
max_length_bytes="35"
|
||||
name="group_filter_input"
|
||||
top="3"
|
||||
right="-86" />
|
||||
<view_border
|
||||
top="-1"
|
||||
top_pad="3"
|
||||
bottom="25"
|
||||
left="6"
|
||||
width="262"
|
||||
follows="left|top|right|bottom"
|
||||
height="245"
|
||||
layout="topleft"
|
||||
follows="all"
|
||||
bevel_style="in"
|
||||
name="info_border" />
|
||||
<group_list
|
||||
allow_select="true"
|
||||
bottom="26"
|
||||
follows="left|top|right|bottom"
|
||||
follows="all"
|
||||
left="7"
|
||||
height="245"
|
||||
layout="topleft"
|
||||
name="group_list"
|
||||
color="ScrollBgWriteableColor"
|
||||
top="-1"
|
||||
top_delta="0"
|
||||
width="260" />
|
||||
<text
|
||||
type="string"
|
||||
|
|
@ -34,61 +47,69 @@
|
|||
name="groupcount">
|
||||
</text>
|
||||
<button
|
||||
top="-1"
|
||||
top="2"
|
||||
follows="top|right"
|
||||
height="22"
|
||||
label="IM/Call"
|
||||
left_delta="267"
|
||||
layout="topleft"
|
||||
right="-1"
|
||||
name="chat_btn"
|
||||
tool_tip="Open Instant Message session"
|
||||
width="80" />
|
||||
<button
|
||||
bottom_delta="-25"
|
||||
top_delta="25"
|
||||
follows="top|right"
|
||||
height="22"
|
||||
label="Profile"
|
||||
layout="topleft"
|
||||
name="info_btn"
|
||||
width="80" />
|
||||
<button
|
||||
bottom_delta="-25"
|
||||
top_delta="25"
|
||||
follows="top|right"
|
||||
height="22"
|
||||
label="Group Titles"
|
||||
layout="topleft"
|
||||
name="titles_btn"
|
||||
width="80" />
|
||||
<button
|
||||
bottom_delta="-25"
|
||||
top_delta="25"
|
||||
follows="top|right"
|
||||
height="22"
|
||||
label="Activate"
|
||||
layout="topleft"
|
||||
name="activate_btn"
|
||||
width="80" />
|
||||
<button
|
||||
bottom_delta="-25"
|
||||
top_delta="25"
|
||||
follows="top|right"
|
||||
height="22"
|
||||
label="Leave"
|
||||
layout="topleft"
|
||||
name="leave_btn"
|
||||
width="80" />
|
||||
<button
|
||||
bottom_delta="-35"
|
||||
top_delta="35"
|
||||
follows="top|right"
|
||||
height="22"
|
||||
label="Create..."
|
||||
layout="topleft"
|
||||
name="create_btn"
|
||||
width="80" />
|
||||
<button
|
||||
bottom_delta="-25"
|
||||
top_delta="25"
|
||||
follows="top|right"
|
||||
height="22"
|
||||
label="Search..."
|
||||
layout="topleft"
|
||||
name="search_btn"
|
||||
width="80" />
|
||||
<button
|
||||
bottom_delta="-25"
|
||||
top_delta="25"
|
||||
follows="top|right"
|
||||
height="22"
|
||||
label="Invite..."
|
||||
layout="topleft"
|
||||
name="invite_btn"
|
||||
width="80" />
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -1085,6 +1085,22 @@
|
|||
name="fog"
|
||||
top_pad="7"
|
||||
width="262" />
|
||||
<spinner
|
||||
control_name="FSImageDecodeThreads"
|
||||
decimal_digits="0"
|
||||
increment="1"
|
||||
follows="left|top"
|
||||
height="22"
|
||||
label="Image decode concurrency:"
|
||||
label_width="198"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
max_val="64"
|
||||
min_val="0"
|
||||
name="image_decode_threads"
|
||||
tool_tip="The number of threads to use for decoding images. 0 = Auto, 1 = Synchronous, 2+ = user specified. (0 or 1 are recommended)"
|
||||
top_pad="7"
|
||||
width="262" />
|
||||
</panel>
|
||||
|
||||
<!--Rendering-->
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@
|
|||
Add new grid
|
||||
</text>
|
||||
<line_editor
|
||||
control_name="OpensimPrefsAddGrid"
|
||||
border_style="line"
|
||||
border_thickness="1"
|
||||
follows="left|top"
|
||||
|
|
@ -222,20 +221,6 @@
|
|||
name="login_page_edit"
|
||||
top_delta="0"
|
||||
width="300" />
|
||||
<button
|
||||
visible="false"
|
||||
enabled_control="FSEditGrid"
|
||||
follows="left|top"
|
||||
height="16"
|
||||
label="Save"
|
||||
layout="topleft"
|
||||
left_pad="2"
|
||||
name="save_grid"
|
||||
top_delta="0"
|
||||
width="45">
|
||||
<button.commit_callback
|
||||
function="Pref.SaveGrid" />
|
||||
</button>
|
||||
<text
|
||||
top_pad="2"
|
||||
follows="left|top"
|
||||
|
|
|
|||
|
|
@ -409,7 +409,7 @@
|
|||
name="cache_size_label_l"
|
||||
top_pad="15"
|
||||
width="500">
|
||||
Cache size ([http://wiki.firestormviewer.org/cache need a suggestion?]):
|
||||
Texture Cache Size ([http://wiki.firestormviewer.org/cache need a suggestion?]):
|
||||
</text>
|
||||
<slider
|
||||
can_edit_text="true"
|
||||
|
|
@ -438,6 +438,46 @@
|
|||
width="40">
|
||||
MB
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="10"
|
||||
layout="topleft"
|
||||
left="15"
|
||||
mouse_opaque="false"
|
||||
name="asset_cache_size_label_l"
|
||||
top_pad="15"
|
||||
width="500">
|
||||
Asset Cache Size:
|
||||
</text>
|
||||
<slider
|
||||
can_edit_text="true"
|
||||
control_name="FSDiskCacheSize"
|
||||
decimal_digits="0"
|
||||
follows="left|top"
|
||||
height="15"
|
||||
increment="64"
|
||||
initial_value="1024"
|
||||
layout="topleft"
|
||||
max_val="9984"
|
||||
min_val="256"
|
||||
top_pad="10"
|
||||
name="asset_cache_size"
|
||||
width="279" />
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="10"
|
||||
layout="topleft"
|
||||
left_pad="6"
|
||||
top_delta="1"
|
||||
mouse_opaque="false"
|
||||
name="asset_text_box5"
|
||||
width="40">
|
||||
MB
|
||||
</text>
|
||||
<button
|
||||
enabled="false"
|
||||
follows="left|top"
|
||||
|
|
@ -459,7 +499,7 @@
|
|||
layout="topleft"
|
||||
left="15"
|
||||
name="Cache location"
|
||||
top_delta="20"
|
||||
top_delta="25"
|
||||
width="300">
|
||||
Cache location:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -173,6 +173,15 @@
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@
|
|||
<slider label="Réserve supplémentaire de mémoire tampon (%):" name="FSDynamicTextureMemoryCacheReserve" tool_tip="Le pourcentage de mémoire vidéo physique réservé aux textures chargées en cache qui ne sont actuellement pas affichées."/>
|
||||
<slider label="Réserve de mémoire vidéo physique (%):" name="FSDynamicTextureMemoryGPUReserve" tool_tip="Le pourcentage de mémoire vidéo physique réservé à un autre usage."/>
|
||||
<spinner label="Ratio de distance du brouillard :" name="fog"/>
|
||||
<spinner label="Décodage des images :" name="image_decode_threads" tool_tip="Le nombre de threads à utiliser pour le décodage des images. 0 = Auto, 1 = Synchrone, 2+ = spécifié par l'utilisateur. (0 ou 1 sont recommandés)"/>
|
||||
</panel>
|
||||
<panel label="Rendu" name="Rendering">
|
||||
<text name="World Updating">Actualisation de l'univers :</text>
|
||||
|
|
|
|||
|
|
@ -19,14 +19,53 @@
|
|||
<check_box label="Awatara" name="JoystickAvatarEnabled"/>
|
||||
<check_box label="Budow." name="JoystickBuildEnabled"/>
|
||||
<check_box label="Kamerę latając" name="JoystickFlycamEnabled"/>
|
||||
<stat_view label="Monitor Joysticka" name="axis_view">
|
||||
<stat_bar label="Oś 0" name="axis0"/>
|
||||
<stat_bar label="Oś 1" name="axis1"/>
|
||||
<stat_bar label="Oś 2" name="axis2"/>
|
||||
<stat_bar label="Oś 3" name="axis3"/>
|
||||
<stat_bar label="Oś 4" name="axis4"/>
|
||||
<stat_bar label="Oś 5" name="axis5"/>
|
||||
</stat_view>
|
||||
<text name="joystick_monitor_label">
|
||||
Monitor joysticka
|
||||
</text>
|
||||
<icon name="button_light_0" tool_tip="Przycisk joysticka 0" />
|
||||
<icon name="button_light_1" tool_tip="Przycisk joysticka 1" />
|
||||
<icon name="button_light_2" tool_tip="Przycisk joysticka 2" />
|
||||
<icon name="button_light_3" tool_tip="Przycisk joysticka 3" />
|
||||
<icon name="button_light_4" tool_tip="Przycisk joysticka 4" />
|
||||
<icon name="button_light_5" tool_tip="Przycisk joysticka 5" />
|
||||
<icon name="button_light_6" tool_tip="Przycisk joysticka 6" />
|
||||
<icon name="button_light_7" tool_tip="Przycisk joysticka 7" />
|
||||
<icon name="button_light_8" tool_tip="Przycisk joysticka 8" />
|
||||
<icon name="button_light_9" tool_tip="Przycisk joysticka 9" />
|
||||
<icon name="button_light_10" tool_tip="Przycisk joysticka 10" />
|
||||
<icon name="button_light_11" tool_tip="Przycisk joysticka 11" />
|
||||
<icon name="button_light_12" tool_tip="Przycisk joysticka 12" />
|
||||
<icon name="button_light_13" tool_tip="Przycisk joysticka 13" />
|
||||
<icon name="button_light_14" tool_tip="Przycisk joysticka 14" />
|
||||
<icon name="button_light_15" tool_tip="Przycisk joysticka 15" />
|
||||
<scroll_container name="joystick_monitor_axes_scroller">
|
||||
<container_view name="joystick_monitor_axes_container">
|
||||
<stat_view name="axis_view_0">
|
||||
<stat_bar label="Oś 0" name="axis0" />
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_1">
|
||||
<stat_bar label="Oś 1" name="axis1" />
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_2">
|
||||
<stat_bar label="Oś 2" name="axis2" />
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_3">
|
||||
<stat_bar label="Oś 3" name="axis3" />
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_4">
|
||||
<stat_bar label="Oś 4" name="axis4" />
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_5">
|
||||
<stat_bar label="Oś 5" name="axis5" />
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_6">
|
||||
<stat_bar label="Oś 6" name="axis6" />
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_7">
|
||||
<stat_bar label="Oś 7" name="axis7" />
|
||||
</stat_view>
|
||||
</container_view>
|
||||
</scroll_container>
|
||||
<text name="XScale">
|
||||
Skala X
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
<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>
|
||||
|
|
@ -101,6 +102,9 @@
|
|||
<combo_item name="physics_medium">Średnie</combo_item>
|
||||
<combo_item name="physics_low">Niskie</combo_item>
|
||||
<combo_item name="physics_lowest">Najniższe</combo_item>
|
||||
<combo_item name="physics_cube"> Sześcian </combo_item>
|
||||
<combo_item name="physics_hex"> Heksagon </combo_item>
|
||||
<combo_item name="physics_ud"> Użytkownika </combo_item>
|
||||
<combo_item name="load_from_file">Z pliku</combo_item>
|
||||
</combo_box>
|
||||
<button name="physics_browse" label="Przeglądaj"/>
|
||||
|
|
@ -197,6 +201,10 @@
|
|||
</text>
|
||||
<check_box label="Auto-włączanie wag" tool_tip="Automatycznie włącz wagi dla meszy z informacjami o riggowaniu" name="mesh_preview_auto_weights" />
|
||||
<check_box label="Auto-podgląd wag" tool_tip="Automatycznie wyświetlaj wagi w podglądzie dla meszy z informacjami o riggowaniu" name="mesh_preview_auto_show_weights" />
|
||||
<text name="mesh_preview_ud_preset_label">
|
||||
Fizyka użytkownika:
|
||||
</text>
|
||||
<line_editor name="ud_physics" tool_tip="Pełna ścieżka systemowa do prostej definicji meszu Collada dla wykorzystania w fizyce." />
|
||||
<text name="mesh_preview_colors_label">
|
||||
Kolory podglądu przesyłania:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ https://accounts.secondlife.com/change_email/
|
|||
<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
|
||||
<panel name="search_panel">
|
||||
<search_editor label="Szukaj w ustawieniach" name="search_prefs_edit" tool_tip="Wprowadź w tym miejscu interesującą Cię frazę. Wyniki będą wyświetlane dla pasujących fragmentów nazw lub komentarzy przypisanych do ustawień." />
|
||||
<button name="copy_search_slurl_btn" tool_tip="Skopiuj wyszukiwane hasło jako SLURL" />
|
||||
</panel>
|
||||
<tab_container name="pref core">
|
||||
<panel label="Ogólne" name="general"/>
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@
|
|||
<combo_box.item label="Siatka: Lokalna" name="Local"/>
|
||||
<combo_box.item label="Siatka: Względna" name="Reference"/>
|
||||
</combo_box>
|
||||
<check_box label="Rozciągaj obie strony" name="checkbox uniform"/>
|
||||
<check_box label="Rozciągaj obie strony" name="checkbox uniform" width="145" />
|
||||
<check_box label="Rozciągaj tekstury" name="checkbox stretch textures"/>
|
||||
<check_box label="Przyciągaj do siatki" name="checkbox snap to grid"/>
|
||||
<check_box label="Edytuj oś jak gł. obiekt" name="checkbox actual root"/>
|
||||
|
|
|
|||
|
|
@ -618,7 +618,9 @@ Obiekt może znajdować się zbyt daleko albo został usunięty.
|
|||
</notification>
|
||||
<notification name="UnsupportedHardware">
|
||||
Niestety Twój komputer nie spełnia minimalnych wymogów sprzętowych dla poprawnego działania [APP_NAME]. Możesz odczuwać bardzo niską wydajność operacyjną. Niestety, portal pomocy [SUPPORT_SITE] nie jest w stanie zapewnić wsparcia technicznego dla Twojego systemu.
|
||||
|
||||
[MINSPECS]
|
||||
|
||||
Odwiedzić [_URL], aby uzyskać więcej informacji?
|
||||
<usetemplate ignoretext="Sprzęt w moim komputerze nie jest wspierany" name="okcancelignore" notext="Nie" yestext="Tak"/>
|
||||
</notification>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<strings>
|
||||
<string name="SUPPORT_SITE">
|
||||
Portal Pomocy Firestorm
|
||||
Portal Pomocy Firestorma
|
||||
</string>
|
||||
<string name="StartupDetectingHardware">
|
||||
Detekcja konfiguracji sprzętowej...
|
||||
|
|
|
|||
|
|
@ -1,17 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="Joystick" title="Конфигурация джойстика">
|
||||
<floater.string name="JoystickDisabled">
|
||||
никто
|
||||
Нет
|
||||
</floater.string>
|
||||
<text name="joystick_lbl" width="60">
|
||||
Джойстик:
|
||||
</text>
|
||||
<spinner label="Ось X" name="JoystickAxis1"/>
|
||||
<spinner label="Ось Y" name="JoystickAxis2"/>
|
||||
<spinner label="Ось Z" name="JoystickAxis0"/>
|
||||
<spinner label="Наклон" name="JoystickAxis4"/>
|
||||
<spinner label="Рыскание" name="JoystickAxis5"/>
|
||||
<spinner label="Вращение" name="JoystickAxis3"/>
|
||||
<spinner label="Масштаб" name="JoystickAxis6"/>
|
||||
<spinner label="Ось Наклона" name="JoystickAxis4"/>
|
||||
<spinner label="Ось Рыскания" name="JoystickAxis5"/>
|
||||
<spinner label="Ось Вращения" name="JoystickAxis3"/>
|
||||
<spinner label="Ось Масштаба" name="JoystickAxis6"/>
|
||||
<check_box label="Масштабирование" name="ZoomDirect"/>
|
||||
<check_box label="3D курсор" name="Cursor3D"/>
|
||||
<check_box label="3D курсор" name="Cursor3D" left="320" />
|
||||
<check_box label="Автоуровень" name="AutoLeveling"/>
|
||||
<text name="Control Modes:">
|
||||
Режимы управления:
|
||||
|
|
@ -19,60 +22,99 @@
|
|||
<check_box label="Аватар" name="JoystickAvatarEnabled"/>
|
||||
<check_box label="Стройка" name="JoystickBuildEnabled"/>
|
||||
<check_box label="Камера" name="JoystickFlycamEnabled"/>
|
||||
<stat_view label="Монитор джойстика" name="axis_view">
|
||||
<stat_bar label="Ось 0" name="axis0"/>
|
||||
<stat_bar label="Ось 1" name="axis1"/>
|
||||
<stat_bar label="Ось 2" name="axis2"/>
|
||||
<stat_bar label="Ось 3" name="axis3"/>
|
||||
<stat_bar label="Ось 4" name="axis4"/>
|
||||
<stat_bar label="Ось 5" name="axis5"/>
|
||||
</stat_view>
|
||||
<text name="joystick_monitor_label">
|
||||
Монитор джойстика
|
||||
</text>
|
||||
<icon name="button_light_0" tool_tip="Кнопка 0"/>
|
||||
<icon name="button_light_1" tool_tip="Кнопка 1"/>
|
||||
<icon name="button_light_2" tool_tip="Кнопка 2"/>
|
||||
<icon name="button_light_3" tool_tip="Кнопка 3"/>
|
||||
<icon name="button_light_4" tool_tip="Кнопка 4"/>
|
||||
<icon name="button_light_5" tool_tip="Кнопка 5"/>
|
||||
<icon name="button_light_6" tool_tip="Кнопка 6"/>
|
||||
<icon name="button_light_7" tool_tip="Кнопка 7"/>
|
||||
<icon name="button_light_8" tool_tip="Кнопка 8"/>
|
||||
<icon name="button_light_9" tool_tip="Кнопка 9"/>
|
||||
<icon name="button_light_10" tool_tip="Кнопка 10"/>
|
||||
<icon name="button_light_11" tool_tip="Кнопка 11"/>
|
||||
<icon name="button_light_12" tool_tip="Кнопка 12"/>
|
||||
<icon name="button_light_13" tool_tip="Кнопка 13"/>
|
||||
<icon name="button_light_14" tool_tip="Кнопка 14"/>
|
||||
<icon name="button_light_15" tool_tip="Кнопка 15"/>
|
||||
<scroll_container name="joystick_monitor_axes_scroller">
|
||||
<container_view name="joystick_monitor_axes_container">
|
||||
<stat_view name="axis_view_0">
|
||||
<stat_bar label="Ось 0" name="axis0"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_1">
|
||||
<stat_bar label="Ось 1" name="axis1"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_2">
|
||||
<stat_bar label="Ось 2" name="axis2"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_3">
|
||||
<stat_bar label="Ось 3" name="axis3"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_4">
|
||||
<stat_bar label="Ось 4" name="axis4"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_5">
|
||||
<stat_bar label="Ось 5" name="axis5"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_6">
|
||||
<stat_bar label="Ось 6" name="axis6"/>
|
||||
</stat_view>
|
||||
<stat_view name="axis_view_7">
|
||||
<stat_bar label="Ось 7" name="axis7"/>
|
||||
</stat_view>
|
||||
</container_view>
|
||||
</scroll_container>
|
||||
<text name="XScale">
|
||||
Масштаб по X
|
||||
Шкала X
|
||||
</text>
|
||||
<text name="YScale">
|
||||
Масштаб по Y
|
||||
Шкала Y
|
||||
</text>
|
||||
<text name="ZScale">
|
||||
Масштаб по Z
|
||||
Шкала Z
|
||||
</text>
|
||||
<text name="PitchScale">
|
||||
Масштаб наклона
|
||||
Шкала наклона
|
||||
</text>
|
||||
<text name="YawScale">
|
||||
Масштаб рыскания
|
||||
Шкала рыскания
|
||||
</text>
|
||||
<text name="RollScale">
|
||||
Масштаб вращения
|
||||
Шкала вращения
|
||||
</text>
|
||||
<text name="XDeadZone">
|
||||
Невидимая зона по X
|
||||
Своб.зона X
|
||||
</text>
|
||||
<text name="YDeadZone">
|
||||
Невидимая зона по Y
|
||||
Своб.зона Y
|
||||
</text>
|
||||
<text name="ZDeadZone">
|
||||
Невидимая зона по Z
|
||||
Своб.зона Z
|
||||
</text>
|
||||
<text name="PitchDeadZone">
|
||||
Невид. зона наклона
|
||||
Своб.зона Наклона
|
||||
</text>
|
||||
<text name="YawDeadZone">
|
||||
Невид. зона рыскания
|
||||
Своб.зона Рыскания
|
||||
</text>
|
||||
<text name="RollDeadZone">
|
||||
Невид. зона вращения
|
||||
Своб.зона Вращения
|
||||
</text>
|
||||
<text name="Feathering">
|
||||
Размывка краев
|
||||
Сглаживание
|
||||
</text>
|
||||
<text name="ZoomScale2">
|
||||
Масштаб
|
||||
Шкала Масштаба
|
||||
</text>
|
||||
<text name="ZoomDeadZone">
|
||||
Невид. зона масшт.
|
||||
Своб.зона Масштаба
|
||||
</text>
|
||||
<button label="Стандартные значения SpaceNavigator" name="SpaceNavigatorDefaults"/>
|
||||
<button label="OK" label_selected="OK" name="ok_btn"/>
|
||||
<button label="Стандарт для SpaceNavigator" name="SpaceNavigatorDefaults"/>
|
||||
<button label="Да" label_selected="Да" name="ok_btn"/>
|
||||
<button label="Отмена" label_selected="Отмена" name="cancel_btn"/>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
<string name="status_parse_error">Ошибка: Проблема при анализе файла DAE – см. подробности в журнале.</string>
|
||||
<string name="status_bind_shape_orientation">Предупреждение: форма матрицы стандартно не ориентирована по координате X.</string>
|
||||
<string name="status_material_mismatch">Ошибка: Материал модели не входит в эталонную модель.</string>
|
||||
<string name="status_lod_model_mismatch">Ошибка: Уровень детализации модели не имеет родителя.</string>
|
||||
<string name="status_reading_file">Загрузка...</string>
|
||||
<string name="status_generating_meshes">Создаются меши...</string>
|
||||
<string name="status_vertex_number_overflow">Ошибка: Число вершин превышает 65535, Прервано!</string>
|
||||
|
|
@ -103,6 +104,9 @@
|
|||
<combo_item name="physics_medium">Средний</combo_item>
|
||||
<combo_item name="physics_low">Низкий</combo_item>
|
||||
<combo_item name="physics_lowest">Низший</combo_item>
|
||||
<combo_item name="physics_cube">Куб</combo_item>
|
||||
<combo_item name="physics_hex">Шестиугольник</combo_item>
|
||||
<combo_item name="physics_ud">Определенные</combo_item>
|
||||
<combo_item name="load_from_file">Из файла</combo_item>
|
||||
</combo_box>
|
||||
<button label="Обзор..." name="physics_browse"/>
|
||||
|
|
@ -167,6 +171,10 @@
|
|||
<check_box label="Автоматический просмотр весов"
|
||||
tool_tip="Автоматически показывать веса в предпросмотре для ригованых мешей"
|
||||
name="mesh_preview_auto_show_weights"/>
|
||||
<text name="mesh_preview_ud_preset_label">
|
||||
Предустановки физики:
|
||||
</text>
|
||||
<line_editor name="ud_physics" tool_tip="Полный системный путь к простому определению сетки Collada для использования в физике."/>
|
||||
<text name="mesh_preview_colors_label">
|
||||
Цвета предварительного просмотра:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
<button label="Отменить" label_selected="Отменить" name="Cancel"/>
|
||||
<panel name="search_panel">
|
||||
<search_editor label="Поиск настроек" name="search_prefs_edit" tool_tip="Введите интересующий вас термин для поиска здесь. Результаты будут отображены для частичного совпадения полного текста в названии параметра или комментариях."/>
|
||||
<button name="copy_search_slurl_btn" tool_tip="Копировать поисковый запрос как SLURL"/>
|
||||
</panel>
|
||||
<tab_container name="pref core">
|
||||
<panel label="Общие" name="general"/>
|
||||
|
|
|
|||
|
|
@ -636,6 +636,8 @@
|
|||
<notification name="UnsupportedHardware">
|
||||
К вашему сведению: ваш компьютер не соответствует минимальным системным требованиям [APP_NAME]. Это может привести к снижению производительности. К сожалению, [SUPPORT_SITE] не оказывает техническую поддержку для неподдерживаемых конфигураций систем.
|
||||
|
||||
[MINSPECS]
|
||||
|
||||
Найти более подробную информацию на [_URL]?
|
||||
<url name="url">
|
||||
https://wiki.firestormviewer.org/fs_system_requirements
|
||||
|
|
@ -3940,6 +3942,9 @@ URL: [AUDIOURL]
|
|||
<global name="UnsupportedGPU">
|
||||
- Графическая карта вашего компьютера не удовлетворяет минимальным требованиям.
|
||||
</global>
|
||||
<global name="UnsupportedCPU">
|
||||
- Процессор вашего компьютера не удовлетворяет минимальным требованиям.
|
||||
</global>
|
||||
<global name="UnsupportedRAM">
|
||||
- Системная память вашего компьютера не удовлетворяет минимальным требованиям.
|
||||
</global>
|
||||
|
|
|
|||
|
|
@ -123,6 +123,7 @@
|
|||
<slider label="Дополнительный резерв памяти текстур (%):" name="FSDynamicTextureMemoryCacheReserve" tool_tip="Процент физической видеопамяти, зарезервированной для кэширования загруженных текстур, которые в данный момент не отображаются."/>
|
||||
<slider label="Резерв физической видеопамяти (%):" name="FSDynamicTextureMemoryGPUReserve" tool_tip="Процент физической видеопамяти, зарезервированной для другого использования."/>
|
||||
<spinner label="Коэффициент дистанции тумана:" name="fog"/>
|
||||
<spinner label="Декодирование изображений:" name="image_decode_threads" tool_tip="Количество потоков, используемых для декодирования изображений. 0 = Авто, 1 = Синхронно, 2+ = указано пользователем. (Рекомендуется 0 или 1)"/>
|
||||
</panel>
|
||||
<panel label="Прорисовка" name="Rendering">
|
||||
<text name="World Updating">
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
value="No friends" />
|
||||
<string
|
||||
name="no_filtered_groups_msg"
|
||||
value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />
|
||||
value="No groups containing "[SEARCH_TERM]" found." />
|
||||
<string
|
||||
name="no_groups_msg"
|
||||
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
|
||||
|
|
|
|||
|
|
@ -255,6 +255,7 @@
|
|||
border_visible="false"
|
||||
h_pad="0"
|
||||
max_length="1000"
|
||||
trusted_content="false"
|
||||
parse_urls="true"
|
||||
v_pad="0"
|
||||
word_wrap="true"
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ https://accounts.secondlife.com/change_email/
|
|||
width="28">
|
||||
<button.commit_callback
|
||||
function="Pref.CopySearchAsSLURL" />
|
||||
</button>
|
||||
</button>
|
||||
</panel>
|
||||
|
||||
<tab_container
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ https://accounts.secondlife.com/change_email/
|
|||
<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
|
||||
<panel name="search_panel">
|
||||
<search_editor label="Szukaj w ustawieniach" name="search_prefs_edit" tool_tip="Wprowadź w tym miejscu interesującą Cię frazę. Wyniki będą wyświetlane dla pasujących fragmentów nazw lub komentarzy przypisanych do ustawień." />
|
||||
<button name="copy_search_slurl_btn" tool_tip="Skopiuj wyszukiwane hasło jako SLURL" />
|
||||
</panel>
|
||||
<tab_container name="pref core">
|
||||
<panel label="Ogólne" name="general"/>
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
value="No friends" />
|
||||
<string
|
||||
name="no_filtered_groups_msg"
|
||||
value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />
|
||||
value="No groups containing "[SEARCH_TERM]" found." />
|
||||
<string
|
||||
name="no_groups_msg"
|
||||
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@ class ViewerManifest(LLManifest,FSViewerManifest):
|
|||
# <FS:AO> Include firestorm resources
|
||||
with self.prefix(src_dst="fs_resources"):
|
||||
self.path("*.lsltxt")
|
||||
self.path("*.dae") # <FS:Beq> FIRE-30963 - better physics defaults
|
||||
|
||||
# skins
|
||||
with self.prefix(src_dst="skins"):
|
||||
|
|
|
|||
Loading…
Reference in New Issue