Ansariel 2021-05-31 09:12:27 +02:00
commit 51cdac3054
116 changed files with 2402 additions and 623 deletions

View File

@ -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>

View File

@ -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;
}

View File

@ -45,6 +45,7 @@
#define FSZoneNC( name, color ) ZoneNamedNC( ___tracy_scoped_zone, name, color, FSTelemetry::active)
#define FSPlot( name, value ) TracyPlot( name, value)
#define FSFrameMark FrameMark
#define FSThreadName( name ) tracy::SetThreadName( name )
#define FSTelemetryIsConnected TracyIsConnected
#else // (no telemetry)
@ -58,6 +59,7 @@
#define FSZoneNC( name, color )
#define FSPlot( name, value )
#define FSFrameMark
#define FSThreadName( name )
#define FSTelemetryIsConnected
#endif // TRACY_ENABLE

View File

@ -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)

View File

@ -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;

View File

@ -35,6 +35,7 @@
#include "lltrace.h"
#include "lltracethreadrecorder.h"
#include "llexception.h"
#include "fstelemetry.h" // <FS:Beq> allow thread naming
#if LL_LINUX || LL_SOLARIS
#include <sched.h>
@ -140,7 +141,10 @@ void LLThread::threadRun()
// for now, hard code all LLThreads to report to single master thread recorder, which is known to be running on main thread
mRecorder = new LLTrace::ThreadRecorder(*LLTrace::get_master_thread_recorder());
// <FS:Beq> - Add threadnames to telemetry
LL_INFOS("THREAD") << "Started thread " << mName << LL_ENDL;
FSThreadName( mName.c_str() );
// </FS:Beq>
// Run the user supplied function
do
{

View File

@ -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")
{

View File

@ -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>

View File

@ -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();
protected:
void run() override;
private:
LLTimer mTimer;
};
// </FS:Ansariel>
#endif // _LLDISKCACHE

View File

@ -162,7 +162,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);
@ -197,14 +199,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>
@ -295,10 +301,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)
@ -306,21 +312,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);
}
}
}
@ -329,10 +337,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>

View File

@ -25,17 +25,104 @@
*/
#include "linden_common.h"
#include "fstelemetry.h" // <FS:Beq> add telemetry support.
#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
@ -48,14 +135,22 @@ LLImageDecodeThread::~LLImageDecodeThread()
// virtual
S32 LLImageDecodeThread::update(F32 max_time_ms)
{
FSZoneC(tracy::Color::Blue); // <FS:Beq/> instrument image decodes
LLMutexLock lock(mCreationMutex);
// <FS:Beq> instrument image decodes
{
FSZoneC(tracy::Color::Blue1);
// </FS:Beq>
for (creation_list_t::iterator iter = mCreationList.begin();
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)
@ -65,16 +160,49 @@ S32 LLImageDecodeThread::update(F32 max_time_ms)
}
}
mCreationList.clear();
// <FS:Beq> instrument image decodes
}
{
FSZoneC(tracy::Color::Blue2);
// </FS:Beq>
S32 res = LLQueuedThread::update(max_time_ms);
// FSPlot("img_decode_pending", (int64_t)res); // <FS:Beq/> instrument image decodes
return res;
} // <FS:Beq/> instrument image decodes
}
LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* image,
U32 priority, S32 discard, BOOL needs_aux, Responder* responder)
{
LLMutexLock lock(mCreationMutex);
FSZoneC(tracy::Color::Orange); // <FS:Beq> instrument the image decode pipeline
// <FS:Beq> De-couple texture threading from mainloop
// LLMutexLock lock(mCreationMutex);
// handle_t handle = generateHandle();
// mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
handle_t handle = generateHandle();
mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
// If we have a thread pool dispatch this directly.
// Note: addRequest could cause the handling to take place on the fetch thread, this is unlikely to be an issue.
// if this is an actual problem we move the fallback to here and place the unfulfilled request into the legacy queue
if (s_ChildThreads > 0)
{
FSZoneNC("DecodeDecoupled", tracy::Color::Orange); // <FS:Beq> instrument the image decode pipeline
ImageRequest* req = new ImageRequest(handle, image,
priority, discard, needs_aux,
responder, this);
bool res = addRequest(req);
if (!res)
{
LL_WARNS() << "Decode request not added because we are exiting." << LL_ENDL;
return 0;
}
}
else
{
FSZoneNC("DecodeQueued", tracy::Color::Orange); // <FS:Beq> instrument the image decode pipeline
LLMutexLock lock(mCreationMutex);
mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
}
// </FS:Beq>
return handle;
}
@ -95,15 +223,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()
@ -119,10 +253,34 @@ LLImageDecodeThread::ImageRequest::~ImageRequest()
// Returns true when done, whether or not decode was successful.
bool LLImageDecodeThread::ImageRequest::processRequest()
{
const F32 decode_time_slice = .1f;
// <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()
{
// <FS:Beq> allow longer timeout for async and add instrumentation
// const F32 decode_time_slice = .1f;
FSZoneC(tracy::Color::DarkOrange);
F32 decode_time_slice = .1f;
if(mFlags & FLAG_ASYNC)
{
decode_time_slice = 10.0f;// long time out as this is not an issue with async
}
// </FS:Beq>
bool done = true;
if (!mDecodedRaw && mFormattedImage.notNull())
{
FSZoneC(tracy::Color::DarkOrange1); // <FS:Beq> instrument the image decode pipeline
// Decode primary channels
if (mDecodedImageRaw.isNull())
{
@ -161,6 +319,7 @@ bool LLImageDecodeThread::ImageRequest::processRequest()
}
if (done && mNeedsAux && !mDecodedAux && mFormattedImage.notNull())
{
FSZoneC(tracy::Color::DarkOrange2); // <FS:Beq> instrument the image decode pipeline
// Decode aux channel
if (!mDecodedImageAux)
{
@ -171,7 +330,21 @@ bool LLImageDecodeThread::ImageRequest::processRequest()
done = mFormattedImage->decodeChannels(mDecodedImageAux, decode_time_slice, 4, 4); // 1ms
mDecodedAux = done && mDecodedImageAux->getData();
}
// <FS:Beq> report timeout on async thread (which leads to worker abort errors)
if(!done)
{
LL_WARNS("ImageDecode") << "Image decoding failed to complete with time slice=" << decode_time_slice << LL_ENDL;
}
// </FS:Beq>
//<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 +364,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;
}

View File

@ -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

View File

@ -25,13 +25,16 @@
*/
#include "linden_common.h"
#include "fstelemetry.h" // <FS:Beq> instrument image decodes
#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 +180,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
@ -252,10 +259,11 @@ bool LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int block
bool LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
{
// <FS:Techwolf Lupindo> texture comment metadata reader
FSZone; // <FS:Beq> instrument image decodes
U8* c_data = base.getData();
S32 c_size = base.getDataSize();
S32 position = 0;
while (position < 1024 && position < (c_size - 7)) // the comment field should be in the first 1024 bytes.
{
if (c_data[position] == 0xff && c_data[position + 1] == 0x64)

View File

@ -32,7 +32,7 @@
#include "llpointer.h"
#include "llmath.h"
#include "llkdumem.h"
#include "fstelemetry.h" // <FS:Beq> instrument image decodes
#define kdu_xxxx "kdu_block_coding.h"
#include "include_kdu_xxxx.h"
@ -287,6 +287,7 @@ void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision);
// as well, when that still existed, with keep_codestream true and MODE_FAST.
void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECodeStreamMode mode)
{
FSZone; // <FS:Beq> instrument image decodes
S32 data_size = base.getDataSize();
S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size);
@ -436,6 +437,7 @@ bool LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int bloc
// decodeImpl() usage matters for production.
bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region)
{
FSZone; // <FS:Beq> instrument image decodes
base.resetLastError();
// *FIX: kdu calls our callback function if there's an error, and then bombs.
@ -519,6 +521,7 @@ bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
// Returns true to mean done, whether successful or not.
bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
{
FSZone; // <FS:Beq> instrument image decodes
ECodeStreamMode mode = MODE_FAST;
LLTimer decode_timer;

View File

@ -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];

View File

@ -1220,7 +1220,13 @@ bool LLModel::isMaterialListSubset( LLModel* ref )
{
int refCnt = ref->mMaterialList.size();
int modelCnt = mMaterialList.size();
// <FS:Beq> FIRE-30965 Cleanup braindead mesh parsing error handlers
if(modelCnt > refCnt)
{
// this model cannot be a strict subset if it has more materials than the reference
return FALSE;
}
// </FS:Beq>
for (U32 src = 0; src < modelCnt; ++src)
{
bool foundRef = false;
@ -1264,77 +1270,80 @@ bool LLModel::needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
return changed;
}
bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
{
//Is this a subset?
//LODs cannot currently add new materials, e.g.
//1. ref = a,b,c lod1 = d,e => This is not permitted
//2. ref = a,b,c lod1 = c => This would be permitted
// <FS:Beq> FIRE-30965 Improve mesh upload error handling
// function moved to llmodelpreview
// bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
// {
// //Is this a subset?
// //LODs cannot currently add new materials, e.g.
// //1. ref = a,b,c lod1 = d,e => This is not permitted
// //2. ref = a,b,c lod1 = c => This would be permitted
bool isASubset = isMaterialListSubset( ref );
if ( !isASubset )
{
LL_INFOS("MESHSKININFO")<<"Material of model is not a subset of reference."<<LL_ENDL;
return false;
}
// bool isASubset = isMaterialListSubset( ref );
// if ( !isASubset )
// {
// LL_INFOS("MESHSKININFO")<<"Material of model is not a subset of reference."<<LL_ENDL;
// return false;
// }
if (mMaterialList.size() > ref->mMaterialList.size())
{
LL_INFOS("MESHSKININFO") << "Material of model has more materials than a reference." << LL_ENDL;
// We passed isMaterialListSubset, so materials are a subset, but subset isn't supposed to be
// larger than original and if we keep going, reordering will cause a crash
return false;
}
// if (mMaterialList.size() > ref->mMaterialList.size())
// {
// LL_INFOS("MESHSKININFO") << "Material of model has more materials than a reference." << LL_ENDL;
// // We passed isMaterialListSubset, so materials are a subset, but subset isn't supposed to be
// // larger than original and if we keep going, reordering will cause a crash
// return false;
// }
std::map<std::string, U32> index_map;
// std::map<std::string, U32> index_map;
//build a map of material slot names to face indexes
bool reorder = false;
// //build a map of material slot names to face indexes
// bool reorder = false;
std::set<std::string> base_mat;
std::set<std::string> cur_mat;
// std::set<std::string> base_mat;
// std::set<std::string> cur_mat;
for (U32 i = 0; i < mMaterialList.size(); i++)
{
index_map[ref->mMaterialList[i]] = i;
//if any material name does not match reference, we need to reorder
reorder |= ref->mMaterialList[i] != mMaterialList[i];
base_mat.insert(ref->mMaterialList[i]);
cur_mat.insert(mMaterialList[i]);
}
// for (U32 i = 0; i < mMaterialList.size(); i++)
// {
// index_map[ref->mMaterialList[i]] = i;
// //if any material name does not match reference, we need to reorder
// reorder |= ref->mMaterialList[i] != mMaterialList[i];
// base_mat.insert(ref->mMaterialList[i]);
// cur_mat.insert(mMaterialList[i]);
// }
if (reorder && (base_mat == cur_mat)) //don't reorder if material name sets don't match
{
std::vector<LLVolumeFace> new_face_list;
new_face_list.resize(mMaterialList.size());
// if (reorder && (base_mat == cur_mat)) //don't reorder if material name sets don't match
// {
// std::vector<LLVolumeFace> new_face_list;
// new_face_list.resize(mMaterialList.size());
std::vector<std::string> new_material_list;
new_material_list.resize(mMaterialList.size());
// std::vector<std::string> new_material_list;
// new_material_list.resize(mMaterialList.size());
//rebuild face list so materials have the same order
//as the reference model
for (U32 i = 0; i < mMaterialList.size(); ++i)
{
U32 ref_idx = index_map[mMaterialList[i]];
// //rebuild face list so materials have the same order
// //as the reference model
// for (U32 i = 0; i < mMaterialList.size(); ++i)
// {
// U32 ref_idx = index_map[mMaterialList[i]];
if (i < mVolumeFaces.size())
{
new_face_list[ref_idx] = mVolumeFaces[i];
}
new_material_list[ref_idx] = mMaterialList[i];
}
// if (i < mVolumeFaces.size())
// {
// new_face_list[ref_idx] = mVolumeFaces[i];
// }
// new_material_list[ref_idx] = mMaterialList[i];
// }
llassert(new_material_list == ref->mMaterialList);
// llassert(new_material_list == ref->mMaterialList);
mVolumeFaces = new_face_list;
// mVolumeFaces = new_face_list;
//override material list with reference model ordering
mMaterialList = ref->mMaterialList;
}
// //override material list with reference model ordering
// mMaterialList = ref->mMaterialList;
// }
return true;
}
// return true;
// }
// </FS:Beq>
bool LLModel::loadSkinInfo(LLSD& header, std::istream &is)
{

View File

@ -187,7 +187,7 @@ public:
//reorder face list based on mMaterialList in this and reference so
//order matches that of reference (material ordering touchup)
bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
// bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); // <FS:Beq/> FIRE-30965 error handling improvements (function relocated)
bool isMaterialListSubset( LLModel* ref );
bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt );

View File

@ -87,7 +87,7 @@ public:
DONE,
WARNING_BIND_SHAPE_ORIENTATION,
ERROR_PARSING, //basically loading failed
ERROR_MATERIALS,
ERROR_MATERIALS_NOT_A_SUBSET, // <FS:Beq/> FIRE-30965 - better error differentiation
ERROR_PASSWORD_REQUIRED,
ERROR_NEED_MORE_MEMORY,
ERROR_INVALID_FILE,
@ -95,6 +95,8 @@ 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_HIGH_LOD_MODEL_MISSING, // <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;

View File

@ -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");
@ -1099,7 +1098,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";
@ -1228,9 +1227,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");
@ -1413,7 +1410,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");
@ -1431,7 +1428,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");
@ -1449,7 +1446,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");
@ -1468,7 +1465,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");

View File

@ -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>
@ -9410,6 +9410,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>
@ -25672,5 +25683,38 @@ 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>
<key>FSAutoUnmuteSounds</key>
<map>
<key>Comment</key>
<string>If Sound Effects are muted, unmute on TP. Default (false)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSAutoUnmuteAmbient</key>
<map>
<key>Comment</key>
<string>If Ambient sounds are muted, unmute on TP. Default (false)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -25,6 +25,7 @@
uniform mat3 normal_matrix;
uniform mat4 texture_matrix0;
uniform vec4 ambient_color; // <FS:Beq/> add ambient color to preview shader
uniform mat4 modelview_matrix;
uniform mat4 modelview_projection_matrix;
@ -87,7 +88,7 @@ void main()
vec3 norm = normalize(normal_matrix * normal);
vec4 col = vec4(0,0,0,1);
vec4 col = ambient_color; // <FS:Beq/> add ambient color to preview shader
// Collect normal lights (need to be divided by two, as we later multiply by 2)
col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);

View File

@ -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)
{

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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;

View File

@ -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"
@ -356,7 +357,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();

View File

@ -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;

View File

@ -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.
}

View File

@ -114,6 +114,8 @@ private:
static std::string credentialName();
private:
boost::signals2::connection mGridListChangedCallbackConnection;
void updateLoginButtons();
void (*mCallback)(S32 option, void *userdata);

View File

@ -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)

View File

@ -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);

View File

@ -4588,7 +4588,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);
@ -5120,23 +5132,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;
@ -5146,30 +5218,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);
}
@ -5210,6 +5275,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();
@ -5219,28 +5315,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)) ?

View File

@ -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;
}

View File

@ -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()
{
@ -1882,8 +1883,13 @@ bool LLAppViewer::doFrame()
S32 work_pending = 0;
S32 io_pending = 0;
F32 max_time = llmin(gFrameIntervalSeconds.value() *10.f, 1.f);
// <FS:Beq> instrument image decodes
{
FSZoneN("updateTextureThreads");
// FSPlot("max_time_ms",max_time);
// <FS:Beq/>
work_pending += updateTextureThreads(max_time);
} // <FS:Beq/> instrument image decodes
{
LL_RECORD_BLOCK_TIME(FTM_LFS);
@ -2442,6 +2448,7 @@ bool LLAppViewer::cleanup()
sTextureFetch->shutdown();
sTextureCache->shutdown();
sImageDecodeThread->shutdown();
sPurgeDiskCacheThread->shutdown(); // <FS:Ansariel> Regular disk cache cleanup
sTextureFetch->shutDownTextureCacheThread() ;
sTextureFetch->shutDownImageDecodeThread() ;
@ -2464,6 +2471,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 +2588,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)
{
@ -3818,6 +3834,7 @@ LLSD LLAppViewer::getViewerInfo() const
// CPU
info["CPU"] = gSysCPU.getCPUString();
info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().valueInUnits<LLUnits::Megabytes>());
info["CONCURRENCY"] = LLSD::Integer((S32)boost::thread::hardware_concurrency()); // <FS:Beq> Add hardware concurrency to info
// Moved hack adjustment to Windows memory size into llsys.cpp
info["OS_VERSION"] = LLOSInfo::instance().getOSString();
info["GRAPHICS_CARD_VENDOR"] = ll_safe_string((const char*)(glGetString(GL_VENDOR)));
@ -4959,11 +4976,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");
// <FS:Ansariel> Don't ignore cache path for asset cache; Moved further down until cache path has been set correctly
//const std::string cache_dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, cache_dir_name);
//LLDiskCache::initParamSingleton(cache_dir, disk_cache_bytes, enable_cache_debug_info);
@ -5059,6 +5081,8 @@ bool LLAppViewer::initCache()
LLDiskCache::getInstance()->purge();
}
}
// <FS:Ansariel> Regular disk cache cleanup
LLAppViewer::getPurgeDiskCacheThread()->start();
// <FS:Ansariel> FIRE-13066
if (mPurgeTextures && !read_only)

View File

@ -59,6 +59,7 @@ class LLTextureFetch;
class LLWatchdogTimeout;
class LLViewerJoystick;
class LLViewerRegion; // <FS:Beq/>
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() ;
@ -307,6 +309,7 @@ private:
static LLTextureCache* sTextureCache;
static LLImageDecodeThread* sImageDecodeThread;
static LLTextureFetch* sTextureFetch;
static FSPurgeDiskCacheThread* sPurgeDiskCacheThread; // <FS:Ansariel> Regular disk cache cleanup
S32 mNumSessions;

View File

@ -679,7 +679,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();
}

View File

@ -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>

View File

@ -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

View File

@ -864,9 +864,11 @@ void LLFloaterModelPreview::draw()
if (!mModelPreview->mLoading)
{
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS )
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS_NOT_A_SUBSET )// <FS:Beq/> Improve error reporting
{
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

View File

@ -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>

View File

@ -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>

View File

@ -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();

View File

@ -2234,6 +2234,22 @@ bool LLInventoryModel::loadSkeleton(
LLFile::remove(inventory_filename);
}
// also delete library cache if inventory cache is purged, so issues with EEP settings going missing
// and bridge objects not being found can be resolved
inventory_filename = getInvCacheAddres(ALEXANDRIA_LINDEN_ID);
if (LLFile::isfile(inventory_filename))
{
LL_INFOS("LLInventoryModel") << "Purging library cache file: " << inventory_filename << LL_ENDL;
LLFile::remove(inventory_filename);
}
inventory_filename.append(".gz");
if (LLFile::isfile(inventory_filename))
{
LL_INFOS("LLInventoryModel") << "Purging library cache file: " << inventory_filename << LL_ENDL;
LLFile::remove(inventory_filename);
}
LL_INFOS("LLInventoryModel") << "Clear inventory cache marker removed: " << delete_cache_marker << LL_ENDL;
LLFile::remove(delete_cache_marker);
}

View File

@ -264,22 +264,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,
@ -318,19 +374,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 = "";
@ -391,7 +462,12 @@ void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItem
{
LLVector3d global_pos;
landmark->getGlobalPos(global_pos);
LLLandmarkActions::getSLURLfromPosGlobal(global_pos,&copy_slurl_to_clipboard_callback,true);
// <FS:Beq> FIRE-30534 - changes related to var regions in opensim
// LLLandmarkActions::getSLURLfromPosGlobal(global_pos,&copy_slurl_to_clipboard_callback,true);
LLVector3 region_pos;
region_pos = landmark->getRegionPos();
LLLandmarkActions::getSLURLfromPosGlobalAndLocal(global_pos, region_pos, &copy_slurl_to_clipboard_callback,true);
// </FS:Beq>
}
}

View File

@ -88,6 +88,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);

View File

@ -50,6 +50,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"
@ -773,13 +774,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,

View File

@ -368,6 +368,118 @@ U32 LLModelPreview::calcResourceCost()
return (U32)streaming_cost;
}
// <FS:Beq> relocate from llmodel and rewrite so it does what it is meant to
// Material matching should work as the comment below states (subsets are allowed)
// prior to this a mess in multiple places meant that all LODs are forced to carry unwanted triangles for unused materials
bool LLModelPreview::matchMaterialOrder(LLModel* lod, LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
{
//Is this a subset?
//LODs cannot currently add new materials, e.g.
//1. ref = a,b,c lod1 = d,e => This is not permitted
//2. ref = a,b,c lod1 = c => This would be permitted
LL_INFOS("MESHSKININFO") << "In matchMaterialOrder." << LL_ENDL;
bool isASubset = lod->isMaterialListSubset( ref );
if ( !isASubset )
{
LL_INFOS("MESHSKININFO")<<"Material of model is not a subset of reference."<<LL_ENDL;
std::ostringstream out;
out << "LOD model " << lod->getName() << "'s materials are not a subset of the High LOD (reference) model " << ref->getName();
LL_INFOS() << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true);
return false;
}
LL_DEBUGS("MESHSKININFO") << "subset check passed." << LL_ENDL;
std::map<std::string, U32> index_map;
//build a map of material slot names to face indexes
bool reorder = false;
auto max_lod_mats = lod->mMaterialList.size();
for ( U32 i = 0; i < ref->mMaterialList.size(); i++ )
{
// create the reference map for later
index_map[ref->mMaterialList[i]] = i;
LL_DEBUGS("MESHSKININFO") << "setting reference material " << ref->mMaterialList[i] << " as index " << i << LL_ENDL;
if( i >= max_lod_mats || lod->mMaterialList[i] != ref->mMaterialList[i] )
{
// i is already out of range of the original material sets in this LOD OR is not matching.
LL_DEBUGS("MESHSKININFO") << "mismatch at " << i << " " << ref->mMaterialList[i]
<< " != " << ((i >= max_lod_mats)? "Out-of-range":lod->mMaterialList[i]) << LL_ENDL;
// we have a misalignment/ordering
// check that ref[i] is in cur and if not add a blank
U32 j{0};
for ( ; j < max_lod_mats; j++ )
{
if( i != j && lod->mMaterialList[j] == ref->mMaterialList[i] )
{
LL_DEBUGS("MESHSKININFO") << "material " << ref->mMaterialList[i]
<< " found at " << j << LL_ENDL;
// we found it but in the wrong place.
reorder = true;
break;
}
}
if( j >= max_lod_mats )
{
std::ostringstream out;
out << "material " << ref->mMaterialList[i]
<< " not found in lod adding placeholder";
LL_DEBUGS("MESHSKININFO") << out.str() << LL_ENDL;
if (mImporterDebug)
{
LLFloaterModelPreview::addStringToLog(out, false);
}
// The material is not in the submesh, add a placeholder.
// this is appended to the existing data so we'll need to reorder
// Note that this placeholder will be eliminated on the writeData (upload) and replaced with
// "NoGeometry" in the LLSD
reorder = true;
LLVolumeFace face;
face.resizeIndices(3);
face.resizeVertices(1);
face.mPositions->clear();
face.mNormals->clear();
face.mTexCoords->setZero();
memset(face.mIndices, 0, sizeof(U16)*3);
lod->addFace(face);
lod->mMaterialList.push_back( ref->mMaterialList[i] );
}
}
//if any material name does not match reference, we need to reorder
}
LL_DEBUGS("MESHSKININFO") << "finished parsing materials" << LL_ENDL;
for ( U32 i = 0; i < lod->mMaterialList.size(); i++ )
{
LL_DEBUGS("MESHSKININFO") << "lod material " << lod->mMaterialList[i] << " has index " << i << LL_ENDL;
}
// Sanity check. We have added placeholders for any mats in ref that are not in this.
// the mat count MUST be equal now.
if (lod->mMaterialList.size() != ref->mMaterialList.size())
{
std::ostringstream out;
out << "Material of LOD model " << lod->getName() << " has more materials than the reference " << ref->getName() << ".";
LL_INFOS("MESHSKININFO") << out.str() << LL_ENDL;
LLFloaterModelPreview::addStringToLog(out, true);
return false;
}
// <FS:Beq> Fix up material matching badness
// if (reorder && (base_mat == cur_mat)) //don't reorder if material name sets don't match
if ( reorder )
{
LL_INFOS("MESHSKININFO") << "re-ordering." << LL_ENDL;
lod->sortVolumeFacesByMaterialName();
lod->mMaterialList = ref->mMaterialList;
}
return true;
}
//</FS:Beq>
void LLModelPreview::rebuildUploadData()
{
assert_main_thread();
@ -582,7 +694,7 @@ void LLModelPreview::rebuildUploadData()
if (!high_lod_model)
{
LLFloaterModelPreview::addStringToLog("Model " + instance.mLabel + " has no High Lod (LOD3).", true);
load_state = LLModelLoader::ERROR_MATERIALS;
load_state = LLModelLoader::ERROR_HIGH_LOD_MODEL_MISSING; // <FS:Beq/> FIRE-30965 Cleanup braindead mesh parsing error handlers
mFMP->childDisable("calculate_btn");
}
else
@ -592,10 +704,13 @@ void LLModelPreview::rebuildUploadData()
int refFaceCnt = 0;
int modelFaceCnt = 0;
llassert(instance.mLOD[i]);
if (instance.mLOD[i] && !instance.mLOD[i]->matchMaterialOrder(high_lod_model, refFaceCnt, modelFaceCnt))
// <FS:Beq> Fix material matching algorithm to work as per design
// if (instance.mLOD[i] && !instance.mLOD[i]->matchMaterialOrder(high_lod_model, refFaceCnt, modelFaceCnt))
if (instance.mLOD[i] && !matchMaterialOrder(instance.mLOD[i],high_lod_model, refFaceCnt, modelFaceCnt))
// </FS:Beq>
{
LLFloaterModelPreview::addStringToLog("Model " + instance.mLabel + " has mismatching materials between lods." , true);
load_state = LLModelLoader::ERROR_MATERIALS;
load_state = LLModelLoader::ERROR_MATERIALS_NOT_A_SUBSET; // <FS:Beq/> more descriptive errors
mFMP->childDisable("calculate_btn");
}
}
@ -644,14 +759,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");
}
}
@ -663,7 +779,12 @@ void LLModelPreview::rebuildUploadData()
// encountered issues
setLoadState(load_state);
}
else if (getLoadState() == LLModelLoader::ERROR_MATERIALS
// <FS:Beq> FIRE-30965 Cleanup braindead mesh parsing error handlers
// else if (getLoadState() == LLModelLoader::ERROR_MATERIALS
else if (getLoadState() == LLModelLoader::ERROR_MATERIALS_NOT_A_SUBSET
|| getLoadState() == LLModelLoader::ERROR_HIGH_LOD_MODEL_MISSING
|| getLoadState() == LLModelLoader::ERROR_LOD_MODEL_MISMATCH
// </FS:Beq>
|| getLoadState() == LLModelLoader::WARNING_BIND_SHAPE_ORIENTATION)
{
// This is only valid for these two error types because they are
@ -922,7 +1043,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
@ -1841,7 +1993,7 @@ void LLModelPreview::updateStatusMessages()
LLModel* model_high_lod = instance.mLOD[LLModel::LOD_HIGH];
if (!model_high_lod)
{
setLoadState(LLModelLoader::ERROR_MATERIALS);
setLoadState(LLModelLoader::ERROR_HIGH_LOD_MODEL_MISSING); // <FS:Beq/> FIRE-30965 Cleanup braindead mesh parsing error handlers
mFMP->childDisable("calculate_btn");
continue;
}
@ -1851,7 +2003,7 @@ void LLModelPreview::updateStatusMessages()
LLModel* lod_model = instance.mLOD[i];
if (!lod_model)
{
setLoadState(LLModelLoader::ERROR_MATERIALS);
setLoadState(LLModelLoader::ERROR_LOD_MODEL_MISMATCH); // <FS:Beq/> FIRE-30965 Cleanup braindead mesh parsing error handlers
mFMP->childDisable("calculate_btn");
}
else
@ -2365,10 +2517,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 +2551,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
{
@ -3227,6 +3373,7 @@ BOOL LLModelPreview::render()
gGL.loadIdentity();
gPipeline.enableLightsPreview();
gObjectPreviewProgram.uniform4fv(LLShaderMgr::AMBIENT, 1, LLPipeline::PreviewAmbientColor.mV); // <FS:Beq> pass ambient setting to shader
LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) *
LLQuaternion(mCameraYaw, LLVector3::z_axis);

View File

@ -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);
@ -199,7 +200,7 @@ public:
bool mHasDegenerate;
protected:
bool matchMaterialOrder(LLModel* lod, LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); // <FS:Beq/> FIRE-30965 Cleanup mesh material parsing
static void loadedCallback(LLModelLoader::scene& scene, LLModelLoader::model_list& model_list, S32 lod, void* opaque);
static void stateChangedCallback(U32 state, void* opaque);

View File

@ -683,8 +683,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
@ -771,7 +774,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"))

View File

@ -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)

View File

@ -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);

View File

@ -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];

View File

@ -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"
@ -525,6 +526,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);
}

View File

@ -54,14 +54,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 = "";

View File

@ -235,4 +235,28 @@ void LLPreviewAnim::onClose(bool app_quitting)
// }
// }
//}
// virtual
void LLPreviewAnim::refreshFromItem()
{
LLPreview::refreshFromItem();
const LLInventoryItem* item = getItem();
if (item)
{
pMotion = gAgentAvatarp->createMotion(item->getAssetUUID()); // preload the animation
if (pMotion)
{
LLTextBox* stats_box_left = getChild<LLTextBox>("AdvancedStatsLeft");
LLTextBox* stats_box_right = getChild<LLTextBox>("AdvancedStatsRight");
stats_box_left->setTextArg("[PRIORITY]", llformat("%d", pMotion->getPriority()));
stats_box_left->setTextArg("[DURATION]", llformat("%.2f", pMotion->getDuration()));
stats_box_left->setTextArg("[IS_LOOP]", (pMotion->getLoop() ? LLTrans::getString("PermYes") : LLTrans::getString("PermNo")));
stats_box_right->setTextArg("[EASE_IN]", llformat("%.2f", pMotion->getEaseInDuration()));
stats_box_right->setTextArg("[EASE_OUT]", llformat("%.2f", pMotion->getEaseOutDuration()));
stats_box_right->setTextArg("[NUM_JOINTS]", llformat("%d", pMotion->getNumJointMotions()));
}
}
}
// </FS:Ansariel>

View File

@ -45,6 +45,7 @@ public:
void play(const LLSD& param);
// <FS:Ansariel> Improved animation preview
//void showAdvanced();
/*virtual*/ void refreshFromItem();
protected:

View File

@ -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");

View File

@ -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);
}

View File

@ -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)

View File

@ -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; }

View File

@ -3858,6 +3858,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;

View File

@ -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);

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -3954,6 +3954,13 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
gSavedPerAccountSettings.setBOOL("FSRenderFriendsOnly", FALSE);
}
// </FS:Beq>
// <FS:Beq pp Becca> FIRE-30947: Auto-Unmute
if (gSavedSettings.getBOOL("MuteSounds") && gSavedSettings.getBOOL("FSAutoUnmuteSounds"))
gSavedSettings.setBOOL("MuteSounds", FALSE);
if (gSavedSettings.getBOOL("MuteAmbient") && gSavedSettings.getBOOL("FSAutoUnmuteAmbient"))
gSavedSettings.setBOOL("MuteAmbient", FALSE);
// </FS:Beq pp Becca>
if (gAgent.getTeleportKeepsLookAt())
{
// *NOTE: the LookAt data we get from the sim here doesn't

View File

@ -3219,7 +3219,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
gObjectPreviewProgram.mName = "Simple Shader";
gObjectPreviewProgram.mName = "Preview Shader"; // <FS:Beq> update preview shader name
gObjectPreviewProgram.mFeatures.calculatesLighting = false;
gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false;
gObjectPreviewProgram.mFeatures.hasGamma = false;

View File

@ -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);

View File

@ -113,7 +113,7 @@
</layout_panel>
</layout_stack>
<button
top="1"
top="2"
follows="top|right"
layout="topleft"
height="22"

View File

@ -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"/>

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="group_titles" title="Gruppentitel">
<floater.string name="NoGroupTitle" value="&lt;Kein Titel&gt;"/>
<filter_editor label="Nach Gruppentiteln filtern" name="filter_input"/>
<scroll_list name="title_list">
<column name="grouptitle" label="Titel"/>
<column name="groupname" label="Gruppe"/>

View File

@ -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>

View File

@ -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>
@ -377,6 +393,7 @@
</text>
<color_swatch label="Hintergrund" tool_tip="Hintergrundfarbe für den Uploader" name="mesh_preview_canvas_color"/>
<color_swatch label="Modell-Kanten" tool_tip="Farbe für Kanten des Modells im Vorschau-Fenster" name="mesh_preview_edge_color"/>
<color_swatch label="Umgebungslicht" tool_tip="Umgebungslicht im Vorschau-Fenster (hat ebenfalls Auswirkung u.a. auf Vorschau für Animationsupload)" name="preview_ambient_color"/>
<text name="physics_settings_label">
Physik:
</text>

View File

@ -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" />

View File

@ -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">

View File

@ -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">

View File

@ -25,6 +25,11 @@
<check_box label="Aktiviert" name="enable_media"/>
<slider label="Voice-Chat" name="Voice Volume"/>
<check_box label="Aktiviert" name="enable_voice_check_volume"/>
<text name="auto_unmute_label">
Stummschaltung nach Teleport automatisch aufheben:
</text>
<check_box name="FSAutoUnmuteAmbient" label="Umgebung" tool_tip="Automatisch Stummschaltung für Umgebungsgeräusche nach Teleport aufheben, falls stummgeschaltet (Standard: Aus)"/>
<check_box name="FSAutoUnmuteSounds" label="Klänge" tool_tip="Automatisch Stummschaltung für Klänge nach Teleport aufheben, falls stummgeschaltet (Standard: Aus)"/>
<text name="friends_logon_sounds_label">
Klang abspielen wenn sich Freunde:
</text>

View File

@ -53,6 +53,7 @@ SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
<string name="AboutSystem">
CPU: [CPU]
Speicher: [MEMORY_MB] MB
Parallelität: [CONCURRENCY]
Betriebssystemversion: [OS_VERSION]
Grafikkartenhersteller: [GRAPHICS_CARD_VENDOR]
Grafikkarte: [GRAPHICS_CARD]

View File

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

View File

@ -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 &quot;[SEARCH_TERM]&quot; found." />
<string
name="no_groups_msg"
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />

View File

@ -16,14 +16,25 @@
<floater.string name="NoGroupTitle" value="&lt;No group title&gt;"/>
<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"

View File

@ -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"

View File

@ -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"

View File

@ -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"
@ -1465,6 +1492,16 @@
label="Model Edge"
tool_tip="Edge color for the model in preview window on the Mesh uploader"
name="mesh_preview_edge_color"/>
<color_swatch
control_name="PreviewAmbientColor"
follows="top|left"
left_pad="24"
height="64"
width="120"
can_apply_immediately="true"
label="Ambient Light"
tool_tip="Ambient light level in preview window (also affects animation preview etc)"
name="preview_ambient_color"/>
<text
type="string"
length="1"
@ -1882,7 +1919,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 +1927,7 @@ Analysed:
layout="topleft"
name="show_joint_overrides"
left_pad="5"
width="100">
width="110">
</check_box>
</panel>
<!-- ========== NOTE MESSAGE ========== -->

View File

@ -93,7 +93,7 @@ https://accounts.secondlife.com/change_email/
width="28">
<button.commit_callback
function="Pref.CopySearchAsSLURL" />
</button>
</button>
</panel>
<tab_container

View File

@ -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

View File

@ -113,7 +113,7 @@
</layout_panel>
</layout_stack>
<button
top="1"
top="2"
follows="top|right"
layout="topleft"
height="22"

View File

@ -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>

View File

@ -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-->

View File

@ -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"

View File

@ -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>

View File

@ -363,6 +363,38 @@
width="110"/>
<text
type="string"
length="1"
follows="top|left"
height="15"
layout="topleft"
left="26"
top_pad="15"
name="auto_unmute_label"
width="430">
Automatically unmute after teleport:
</text>
<check_box
control_name="FSAutoUnmuteAmbient"
name="FSAutoUnmuteAmbient"
label="Ambient"
tool_tip="Automatically unmute Ambient after teleporting, if muted (default: off)"
layout="topleft"
top_pad="5"
left_delta="5"
height="16"
width="85" />
<check_box
control_name="FSAutoUnmuteSounds"
name="FSAutoUnmuteSounds"
label="Sound Effects"
tool_tip="Automatically unmute Sound Effects after teleporting, if muted (default: off)"
layout="topleft"
left_pad="0"
height="18"
width="85" />
<text
type="string"
length="1"
follows="top|left"

View File

@ -51,6 +51,7 @@ You are in [REGION]
<string name="AboutSystem">
CPU: [CPU]
Memory: [MEMORY_MB] MB
Concurrency: [CONCURRENCY]
OS Version: [OS_VERSION]
Graphics Card Vendor: [GRAPHICS_CARD_VENDOR]
Graphics Card: [GRAPHICS_CARD]

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>
@ -205,6 +213,7 @@
</text>
<color_swatch label="Tło" tool_tip="Kolor tła przesyłania modelu" name="mesh_preview_canvas_color" />
<color_swatch label="Krawędź modelu" tool_tip="Kolor krawędzi modelu w oknie podglądu podczas przesyłania meszu" name="mesh_preview_edge_color" />
<color_swatch label="Światła otoczenia" tool_tip="Poziom oświetlenia otoczenia w oknie podglądu (wpływa również na podgląd animacji itp.)" name="preview_ambient_color" />
<text name="physics_settings_label">
Fizyka:
</text>

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