Merge branch 'DRTVWR-559' of ssh://bitbucket.org/lindenlab/viewer into DRTVWR-559
commit
09f3d6eaee
|
|
@ -482,9 +482,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>2653c3627fd8687ff9e003425fd14834</string>
|
||||
<string>439d92ec73f0500ba1671faad2bd8090</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90199/821852/dullahan-1.12.3.202111032211_91.1.21_g9dd45fe_chromium-91.0.4472.114-darwin64-565428.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104637/916643/dullahan-1.12.4.202209142017_91.1.21_g9dd45fe_chromium-91.0.4472.114-darwin64-575005.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -494,9 +494,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>b4003772562a5dd40bc112eec7cba5f5</string>
|
||||
<string>2a7c01da15de77bc1fd1863327174d5e</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90201/821871/dullahan-1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows-565428.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104638/916654/dullahan-1.12.4.202209142021_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows-575005.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -506,16 +506,16 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d9030d7a7390b3bda7de2adcc27e535a</string>
|
||||
<string>d06bee9b2517fbb09ba1a65e6d675361</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/90200/821876/dullahan-1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows64-565428.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104639/916659/dullahan-1.12.4.202209142021_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows64-575005.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>1.12.3.202111032221_91.1.21_g9dd45fe_chromium-91.0.4472.114</string>
|
||||
<string>1.12.4.202209142021_91.1.21_g9dd45fe_chromium-91.0.4472.114</string>
|
||||
</map>
|
||||
<key>expat</key>
|
||||
<map>
|
||||
|
|
@ -2401,9 +2401,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>6ce3cbaed968a69fb7a2cca80220874d</string>
|
||||
<string>b583668b28fde0490e6953f10e93e4ab</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80380/758537/slvoice-4.10.0000.32327.5fc3fe7c.558436-darwin64-558436.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/98681/871545/slvoice-4.10.0000.32327.5fc3fe7c.571099-darwin64-571099.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -2425,9 +2425,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>2eb38c5eff4d0f18fbb89d0c30c4f0a4</string>
|
||||
<string>6e0ed41653955afe8eeb8945776cf07b</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80382/758550/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows-558436.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/98683/871560/slvoice-4.10.0000.32327.5fc3fe7c.571099-windows-571099.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -2437,16 +2437,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>9ee8f3cbc5369c598a998c61961ed16d</string>
|
||||
<string>c39735851fd05c194d0be09b8f9e8cb7</string>
|
||||
<key>url</key>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80381/758551/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows64-558436.tar.bz2</string>
|
||||
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/98682/871552/slvoice-4.10.0000.32327.5fc3fe7c.571099-windows64-571099.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>4.10.0000.32327.5fc3fe7c.558436</string>
|
||||
<string>4.10.0000.32327.5fc3fe7c.571099</string>
|
||||
</map>
|
||||
<key>threejs</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -276,7 +276,7 @@ void LLAudioEngine::idle(F32 max_decode_time)
|
|||
{
|
||||
// The source is done playing, clean it up.
|
||||
delete sourcep;
|
||||
mAllSources.erase(iter++);
|
||||
iter = mAllSources.erase(iter);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -827,7 +827,8 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i
|
|||
addAudioSource(asp);
|
||||
if (pos_global.isExactlyZero())
|
||||
{
|
||||
asp->setAmbient(true);
|
||||
// For sound preview and UI
|
||||
asp->setForcedPriority(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1273,7 +1274,7 @@ LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32
|
|||
mPriority(0.f),
|
||||
mGain(gain),
|
||||
mSourceMuted(false),
|
||||
mAmbient(false),
|
||||
mForcedPriority(false),
|
||||
mLoop(false),
|
||||
mSyncMaster(false),
|
||||
mSyncSlave(false),
|
||||
|
|
@ -1339,7 +1340,7 @@ void LLAudioSource::update()
|
|||
|
||||
void LLAudioSource::updatePriority()
|
||||
{
|
||||
if (isAmbient())
|
||||
if (isForcedPriority())
|
||||
{
|
||||
mPriority = 1.f;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -266,8 +266,8 @@ public:
|
|||
|
||||
void addAudioData(LLAudioData *adp, bool set_current = TRUE);
|
||||
|
||||
void setAmbient(const bool ambient) { mAmbient = ambient; }
|
||||
bool isAmbient() const { return mAmbient; }
|
||||
void setForcedPriority(const bool ambient) { mForcedPriority = ambient; }
|
||||
bool isForcedPriority() const { return mForcedPriority; }
|
||||
|
||||
void setLoop(const bool loop) { mLoop = loop; }
|
||||
bool isLoop() const { return mLoop; }
|
||||
|
|
@ -326,7 +326,7 @@ protected:
|
|||
F32 mPriority;
|
||||
F32 mGain;
|
||||
bool mSourceMuted;
|
||||
bool mAmbient;
|
||||
bool mForcedPriority; // ignore mute, set high priority, researved for sound preview and UI
|
||||
bool mLoop;
|
||||
bool mSyncMaster;
|
||||
bool mSyncSlave;
|
||||
|
|
|
|||
|
|
@ -519,9 +519,9 @@ void LLAudioChannelFMODSTUDIO::update3DPosition()
|
|||
return;
|
||||
}
|
||||
|
||||
if (mCurrentSourcep->isAmbient())
|
||||
if (mCurrentSourcep->isForcedPriority())
|
||||
{
|
||||
// Ambient sound, don't need to do any positional updates.
|
||||
// Prioritized UI and preview sounds don't need to do any positional updates.
|
||||
set3DMode(false);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ void LLAudioChannelOpenAL::update3DPosition()
|
|||
{
|
||||
return;
|
||||
}
|
||||
if (mCurrentSourcep->isAmbient())
|
||||
if (mCurrentSourcep->isForcedPriority())
|
||||
{
|
||||
alSource3f(mALSource, AL_POSITION, 0.0, 0.0, 0.0);
|
||||
alSource3f(mALSource, AL_VELOCITY, 0.0, 0.0, 0.0);
|
||||
|
|
|
|||
|
|
@ -70,7 +70,11 @@ mRetryCount(0)
|
|||
// Must be larger than the usual Second Life frame stutter time.
|
||||
const U32 buffer_seconds = 10; //sec
|
||||
const U32 estimated_bitrate = 128; //kbit/sec
|
||||
mSystem->setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES);
|
||||
FMOD_RESULT result = mSystem->setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES);
|
||||
if (result != FMOD_OK)
|
||||
{
|
||||
LL_WARNS("FMOD") << "setStreamBufferSize error: " << FMOD_ErrorString(result) << LL_ENDL;
|
||||
}
|
||||
|
||||
// Here's where we set the size of the network buffer and some buffering
|
||||
// parameters. In this case we want a network buffer of 16k, we want it
|
||||
|
|
@ -134,7 +138,7 @@ void LLStreamingAudio_FMODSTUDIO::killDeadStreams()
|
|||
{
|
||||
LL_INFOS("FMOD") << "Closed dead stream" << LL_ENDL;
|
||||
delete streamp;
|
||||
mDeadStreams.erase(iter++);
|
||||
iter = mDeadStreams.erase(iter);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -404,7 +408,11 @@ FMOD::Channel *LLAudioStreamManagerFMODSTUDIO::startStream()
|
|||
if (mStreamChannel)
|
||||
return mStreamChannel; //Already have a channel for this stream.
|
||||
|
||||
mSystem->playSound(mInternetStream, NULL, true, &mStreamChannel);
|
||||
FMOD_RESULT result = mSystem->playSound(mInternetStream, NULL, true, &mStreamChannel);
|
||||
if (result != FMOD_OK)
|
||||
{
|
||||
LL_WARNS("FMOD") << FMOD_ErrorString(result) << LL_ENDL;
|
||||
}
|
||||
return mStreamChannel;
|
||||
}
|
||||
|
||||
|
|
@ -445,16 +453,29 @@ bool LLAudioStreamManagerFMODSTUDIO::stopStream()
|
|||
FMOD_OPENSTATE LLAudioStreamManagerFMODSTUDIO::getOpenState(unsigned int* percentbuffered, bool* starving, bool* diskbusy)
|
||||
{
|
||||
FMOD_OPENSTATE state;
|
||||
mInternetStream->getOpenState(&state, percentbuffered, starving, diskbusy);
|
||||
FMOD_RESULT result = mInternetStream->getOpenState(&state, percentbuffered, starving, diskbusy);
|
||||
if (result != FMOD_OK)
|
||||
{
|
||||
LL_WARNS("FMOD") << FMOD_ErrorString(result) << LL_ENDL;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
void LLStreamingAudio_FMODSTUDIO::setBufferSizes(U32 streambuffertime, U32 decodebuffertime)
|
||||
{
|
||||
mSystem->setStreamBufferSize(streambuffertime / 1000 * 128 * 128, FMOD_TIMEUNIT_RAWBYTES);
|
||||
FMOD_RESULT result = mSystem->setStreamBufferSize(streambuffertime / 1000 * 128 * 128, FMOD_TIMEUNIT_RAWBYTES);
|
||||
if (result != FMOD_OK)
|
||||
{
|
||||
LL_WARNS("FMOD") << "setStreamBufferSize error: " << FMOD_ErrorString(result) << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
FMOD_ADVANCEDSETTINGS settings;
|
||||
memset(&settings, 0, sizeof(settings));
|
||||
settings.cbSize = sizeof(settings);
|
||||
settings.defaultDecodeBufferSize = decodebuffertime;//ms
|
||||
mSystem->setAdvancedSettings(&settings);
|
||||
result = mSystem->setAdvancedSettings(&settings);
|
||||
if (result != FMOD_OK)
|
||||
{
|
||||
LL_WARNS("FMOD") << "setAdvancedSettings error: " << FMOD_ErrorString(result) << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,14 @@ using namespace std;
|
|||
|
||||
#define INCHES_TO_METERS 0.02540005f
|
||||
|
||||
/// The .bvh does not have a formal spec, and different readers interpret things in their own way.
|
||||
/// In OUR usage, frame 0 is used in optimization and is not considered to be part of the animation.
|
||||
const S32 NUMBER_OF_IGNORED_FRAMES_AT_START = 1;
|
||||
/// In our usage, the last frame is used only to indicate what the penultimate frame should be interpolated towards.
|
||||
/// I.e., the animation only plays up to the start of the last frame. There is no hold or exptrapolation past that point..
|
||||
/// Thus there are two frame of the total that do not contribute to the total running time of the animation.
|
||||
const S32 NUMBER_OF_UNPLAYED_FRAMES = NUMBER_OF_IGNORED_FRAMES_AT_START + 1;
|
||||
|
||||
const F32 POSITION_KEYFRAME_THRESHOLD_SQUARED = 0.03f * 0.03f;
|
||||
const F32 ROTATION_KEYFRAME_THRESHOLD = 0.01f;
|
||||
|
||||
|
|
@ -865,7 +873,10 @@ ELoadStatus LLBVHLoader::loadBVHFile(const char *buffer, char* error_text, S32 &
|
|||
return E_ST_NO_FRAME_TIME;
|
||||
}
|
||||
|
||||
mDuration = (F32)mNumFrames * mFrameTime;
|
||||
// If the user only supplies one animation frame (after the ignored reference frame 0), hold for mFrameTime.
|
||||
// If the user supples exactly one total frame, it isn't clear if that is a pose or reference frame, and the
|
||||
// behavior is not defined. In this case, retain historical undefined behavior.
|
||||
mDuration = llmax((F32)(mNumFrames - NUMBER_OF_UNPLAYED_FRAMES), 1.0f) * mFrameTime;
|
||||
if (!mLoop)
|
||||
{
|
||||
mLoopOutPoint = mDuration;
|
||||
|
|
@ -1355,12 +1366,13 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
|
|||
|
||||
LLQuaternion::Order order = bvhStringToOrder( joint->mOrder );
|
||||
S32 outcount = 0;
|
||||
S32 frame = 1;
|
||||
S32 frame = 0;
|
||||
for ( ki = joint->mKeys.begin();
|
||||
ki != joint->mKeys.end();
|
||||
++ki )
|
||||
{
|
||||
if ((frame == 1) && joint->mRelativeRotationKey)
|
||||
|
||||
if ((frame == 0) && joint->mRelativeRotationKey)
|
||||
{
|
||||
first_frame_rot = mayaQ( ki->mRot[0], ki->mRot[1], ki->mRot[2], order);
|
||||
|
||||
|
|
@ -1373,7 +1385,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
|
|||
continue;
|
||||
}
|
||||
|
||||
time = (F32)frame * mFrameTime;
|
||||
time = llmax((F32)(frame - NUMBER_OF_IGNORED_FRAMES_AT_START), 0.0f) * mFrameTime; // Time elapsed before this frame starts.
|
||||
|
||||
if (mergeParent)
|
||||
{
|
||||
|
|
@ -1433,12 +1445,12 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
|
|||
LLVector3 relPos = joint->mRelativePosition;
|
||||
LLVector3 relKey;
|
||||
|
||||
frame = 1;
|
||||
frame = 0;
|
||||
for ( ki = joint->mKeys.begin();
|
||||
ki != joint->mKeys.end();
|
||||
++ki )
|
||||
{
|
||||
if ((frame == 1) && joint->mRelativePositionKey)
|
||||
if ((frame == 0) && joint->mRelativePositionKey)
|
||||
{
|
||||
relKey.setVec(ki->mPos);
|
||||
}
|
||||
|
|
@ -1449,7 +1461,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
|
|||
continue;
|
||||
}
|
||||
|
||||
time = (F32)frame * mFrameTime;
|
||||
time = llmax((F32)(frame - NUMBER_OF_IGNORED_FRAMES_AT_START), 0.0f) * mFrameTime; // Time elapsed before this frame starts.
|
||||
|
||||
LLVector3 inPos = (LLVector3(ki->mPos) - relKey) * ~first_frame_rot;// * fixup_rot;
|
||||
LLVector3 outPos = inPos * frameRot * offsetRot;
|
||||
|
|
|
|||
|
|
@ -116,14 +116,20 @@ void LLAlignedArray<T, alignment>::resize(U32 size)
|
|||
template <class T, U32 alignment>
|
||||
T& LLAlignedArray<T, alignment>::operator[](int idx)
|
||||
{
|
||||
llassert(idx < mElementCount);
|
||||
if(idx >= mElementCount || idx < 0)
|
||||
{
|
||||
LL_ERRS() << "Out of bounds LLAlignedArray, requested: " << (S32)idx << " size: " << mElementCount << LL_ENDL;
|
||||
}
|
||||
return mArray[idx];
|
||||
}
|
||||
|
||||
template <class T, U32 alignment>
|
||||
const T& LLAlignedArray<T, alignment>::operator[](int idx) const
|
||||
{
|
||||
llassert(idx < mElementCount);
|
||||
if (idx >= mElementCount || idx < 0)
|
||||
{
|
||||
LL_ERRS() << "Out of bounds LLAlignedArray, requested: " << (S32)idx << " size: " << mElementCount << LL_ENDL;
|
||||
}
|
||||
return mArray[idx];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
// STL headers
|
||||
// std headers
|
||||
#include <atomic>
|
||||
#include <stdexcept>
|
||||
// external library headers
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/fiber/fiber.hpp>
|
||||
|
|
@ -214,6 +215,22 @@ std::string LLCoros::logname()
|
|||
return data.mName.empty()? data.getKey() : data.mName;
|
||||
}
|
||||
|
||||
void LLCoros::saveException(const std::string& name, std::exception_ptr exc)
|
||||
{
|
||||
mExceptionQueue.emplace(name, exc);
|
||||
}
|
||||
|
||||
void LLCoros::rethrow()
|
||||
{
|
||||
if (! mExceptionQueue.empty())
|
||||
{
|
||||
ExceptionData front = mExceptionQueue.front();
|
||||
mExceptionQueue.pop();
|
||||
LL_WARNS("LLCoros") << "Rethrowing exception from coroutine " << front.name << LL_ENDL;
|
||||
std::rethrow_exception(front.exception);
|
||||
}
|
||||
}
|
||||
|
||||
void LLCoros::setStackSize(S32 stacksize)
|
||||
{
|
||||
LL_DEBUGS("LLCoros") << "Setting coroutine stack size to " << stacksize << LL_ENDL;
|
||||
|
|
@ -302,11 +319,11 @@ U32 cpp_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop,
|
|||
}
|
||||
}
|
||||
|
||||
void LLCoros::winlevel(const std::string& name, const callable_t& callable)
|
||||
void LLCoros::sehHandle(const std::string& name, const LLCoros::callable_t& callable)
|
||||
{
|
||||
__try
|
||||
{
|
||||
toplevelTryWrapper(name, callable);
|
||||
LLCoros::toplevelTryWrapper(name, callable);
|
||||
}
|
||||
__except (cpp_exception_filter(GetExceptionCode(), GetExceptionInformation(), name))
|
||||
{
|
||||
|
|
@ -321,7 +338,6 @@ void LLCoros::winlevel(const std::string& name, const callable_t& callable)
|
|||
throw std::exception(integer_string);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& callable)
|
||||
|
|
@ -350,11 +366,19 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call
|
|||
}
|
||||
catch (...)
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
// Any OTHER kind of uncaught exception will cause the viewer to
|
||||
// crash, hopefully informatively.
|
||||
// crash, SEH handling should catch it and report to bugsplat.
|
||||
LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name));
|
||||
// to not modify callstack
|
||||
throw;
|
||||
#else
|
||||
// Stash any OTHER kind of uncaught exception in the rethrow() queue
|
||||
// to be rethrown by the main fiber.
|
||||
LL_WARNS("LLCoros") << "Capturing uncaught exception in coroutine "
|
||||
<< name << LL_ENDL;
|
||||
LLCoros::instance().saveException(name, std::current_exception());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -364,8 +388,9 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call
|
|||
void LLCoros::toplevel(std::string name, callable_t callable)
|
||||
{
|
||||
#if LL_WINDOWS
|
||||
// Can not use __try in functions that require unwinding, so use one more wrapper
|
||||
winlevel(name, callable);
|
||||
// Because SEH can's have unwinding, need to call a wrapper
|
||||
// 'try' is inside SEH handling to not catch LLContinue
|
||||
sehHandle(name, callable);
|
||||
#else
|
||||
toplevelTryWrapper(name, callable);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@
|
|||
#include "llinstancetracker.h"
|
||||
#include <boost/function.hpp>
|
||||
#include <string>
|
||||
#include <exception>
|
||||
#include <queue>
|
||||
|
||||
// e.g. #include LLCOROS_MUTEX_HEADER
|
||||
#define LLCOROS_MUTEX_HEADER <boost/fiber/mutex.hpp>
|
||||
|
|
@ -156,6 +158,19 @@ public:
|
|||
* LLCoros::launch()).
|
||||
*/
|
||||
static std::string getName();
|
||||
|
||||
/**
|
||||
* rethrow() is called by the thread's main fiber to propagate an
|
||||
* exception from any coroutine into the main fiber, where it can engage
|
||||
* the normal unhandled-exception machinery, up to and including crash
|
||||
* reporting.
|
||||
*
|
||||
* LLCoros maintains a queue of otherwise-uncaught exceptions from
|
||||
* terminated coroutines. Each call to rethrow() pops the first of those
|
||||
* and rethrows it. When the queue is empty (normal case), rethrow() is a
|
||||
* no-op.
|
||||
*/
|
||||
void rethrow();
|
||||
|
||||
/**
|
||||
* This variation returns a name suitable for log messages: the explicit
|
||||
|
|
@ -292,13 +307,27 @@ public:
|
|||
|
||||
private:
|
||||
std::string generateDistinctName(const std::string& prefix) const;
|
||||
#if LL_WINDOWS
|
||||
void winlevel(const std::string& name, const callable_t& callable);
|
||||
#endif
|
||||
void toplevelTryWrapper(const std::string& name, const callable_t& callable);
|
||||
void toplevel(std::string name, callable_t callable);
|
||||
#if LL_WINDOWS
|
||||
void sehHandle(const std::string& name, const callable_t& callable); // calls toplevelTryWrapper
|
||||
#endif
|
||||
void toplevel(std::string name, callable_t callable); // calls sehHandle or toplevelTryWrapper
|
||||
struct CoroData;
|
||||
static CoroData& get_CoroData(const std::string& caller);
|
||||
void saveException(const std::string& name, std::exception_ptr exc);
|
||||
|
||||
struct ExceptionData
|
||||
{
|
||||
ExceptionData(const std::string& nm, std::exception_ptr exc):
|
||||
name(nm),
|
||||
exception(exc)
|
||||
{}
|
||||
// name of coroutine that originally threw this exception
|
||||
std::string name;
|
||||
// the thrown exception
|
||||
std::exception_ptr exception;
|
||||
};
|
||||
std::queue<ExceptionData> mExceptionQueue;
|
||||
|
||||
S32 mStackSize;
|
||||
|
||||
|
|
|
|||
|
|
@ -118,7 +118,11 @@ namespace
|
|||
eMONTIOR_MWAIT=33,
|
||||
eCPLDebugStore=34,
|
||||
eThermalMonitor2=35,
|
||||
eAltivec=36
|
||||
eAltivec=36,
|
||||
eSSE3S_Features = 37,
|
||||
eSSE4_1_Features = 38,
|
||||
eSSE4_2_Features = 39,
|
||||
eSSE4a_Features = 40,
|
||||
};
|
||||
|
||||
const char* cpu_feature_names[] =
|
||||
|
|
@ -161,7 +165,11 @@ namespace
|
|||
"CPL Qualified Debug Store",
|
||||
"Thermal Monitor 2",
|
||||
|
||||
"Altivec"
|
||||
"Altivec",
|
||||
"SSE3S Instructions",
|
||||
"SSE4.1 Instructions",
|
||||
"SSE4.2 Instructions",
|
||||
"SSE4a Instructions",
|
||||
};
|
||||
|
||||
std::string intel_CPUFamilyName(int composed_family)
|
||||
|
|
@ -250,6 +258,31 @@ public:
|
|||
return hasExtension(cpu_feature_names[eSSE2_Ext]);
|
||||
}
|
||||
|
||||
bool hasSSE3() const
|
||||
{
|
||||
return hasExtension(cpu_feature_names[eSSE3_Features]);
|
||||
}
|
||||
|
||||
bool hasSSE3S() const
|
||||
{
|
||||
return hasExtension(cpu_feature_names[eSSE3S_Features]);
|
||||
}
|
||||
|
||||
bool hasSSE41() const
|
||||
{
|
||||
return hasExtension(cpu_feature_names[eSSE4_1_Features]);
|
||||
}
|
||||
|
||||
bool hasSSE42() const
|
||||
{
|
||||
return hasExtension(cpu_feature_names[eSSE4_2_Features]);
|
||||
}
|
||||
|
||||
bool hasSSE4a() const
|
||||
{
|
||||
return hasExtension(cpu_feature_names[eSSE4a_Features]);
|
||||
}
|
||||
|
||||
bool hasAltivec() const
|
||||
{
|
||||
return hasExtension("Altivec");
|
||||
|
|
@ -473,6 +506,12 @@ private:
|
|||
*((int*)(cpu_vendor+4)) = cpu_info[3];
|
||||
*((int*)(cpu_vendor+8)) = cpu_info[2];
|
||||
setInfo(eVendor, cpu_vendor);
|
||||
std::string cmp_vendor(cpu_vendor);
|
||||
bool is_amd = false;
|
||||
if (cmp_vendor == "AuthenticAMD")
|
||||
{
|
||||
is_amd = true;
|
||||
}
|
||||
|
||||
// Get the information associated with each valid Id
|
||||
for(unsigned int i=0; i<=ids; ++i)
|
||||
|
|
@ -504,6 +543,7 @@ private:
|
|||
|
||||
if(cpu_info[2] & 0x8)
|
||||
{
|
||||
// intel specific SSE3 suplements
|
||||
setExtension(cpu_feature_names[eMONTIOR_MWAIT]);
|
||||
}
|
||||
|
||||
|
|
@ -516,7 +556,22 @@ private:
|
|||
{
|
||||
setExtension(cpu_feature_names[eThermalMonitor2]);
|
||||
}
|
||||
|
||||
|
||||
if (cpu_info[2] & 0x200)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE3S_Features]);
|
||||
}
|
||||
|
||||
if (cpu_info[2] & 0x80000)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE4_1_Features]);
|
||||
}
|
||||
|
||||
if (cpu_info[2] & 0x100000)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE4_2_Features]);
|
||||
}
|
||||
|
||||
unsigned int feature_info = (unsigned int) cpu_info[3];
|
||||
for(unsigned int index = 0, bit = 1; index < eSSE3_Features; ++index, bit <<= 1)
|
||||
{
|
||||
|
|
@ -543,8 +598,17 @@ private:
|
|||
__cpuid(cpu_info, i);
|
||||
|
||||
// Interpret CPU brand string and cache information.
|
||||
if (i == 0x80000002)
|
||||
memcpy(cpu_brand_string, cpu_info, sizeof(cpu_info));
|
||||
if (i == 0x80000001)
|
||||
{
|
||||
if (is_amd)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE4a_Features]);
|
||||
}
|
||||
}
|
||||
else if (i == 0x80000002)
|
||||
{
|
||||
memcpy(cpu_brand_string, cpu_info, sizeof(cpu_info));
|
||||
}
|
||||
else if (i == 0x80000003)
|
||||
memcpy(cpu_brand_string + 16, cpu_info, sizeof(cpu_info));
|
||||
else if (i == 0x80000004)
|
||||
|
|
@ -690,6 +754,41 @@ private:
|
|||
uint64_t ext_feature_info = getSysctlInt64("machdep.cpu.extfeature_bits");
|
||||
S32 *ext_feature_infos = (S32*)(&ext_feature_info);
|
||||
setConfig(eExtFeatureBits, ext_feature_infos[0]);
|
||||
|
||||
|
||||
char cpu_features[1024];
|
||||
len = sizeof(cpu_features);
|
||||
memset(cpu_features, 0, len);
|
||||
sysctlbyname("machdep.cpu.features", (void*)cpu_features, &len, NULL, 0);
|
||||
|
||||
std::string cpu_features_str(cpu_features);
|
||||
cpu_features_str = " " + cpu_features_str + " ";
|
||||
|
||||
if (cpu_features_str.find(" SSE3 ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE3_Features]);
|
||||
}
|
||||
|
||||
if (cpu_features_str.find(" SSSE3 ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE3S_Features]);
|
||||
}
|
||||
|
||||
if (cpu_features_str.find(" SSE4.1 ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE4_1_Features]);
|
||||
}
|
||||
|
||||
if (cpu_features_str.find(" SSE4.2 ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE4_2_Features]);
|
||||
}
|
||||
|
||||
if (cpu_features_str.find(" SSE4A ") != std::string::npos)
|
||||
{
|
||||
// Not supposed to happen?
|
||||
setExtension(cpu_feature_names[eSSE4a_Features]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -800,6 +899,31 @@ private:
|
|||
{
|
||||
setExtension(cpu_feature_names[eSSE2_Ext]);
|
||||
}
|
||||
|
||||
if (flags.find(" pni ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE3_Features]);
|
||||
}
|
||||
|
||||
if (flags.find(" ssse3 ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE3S_Features]);
|
||||
}
|
||||
|
||||
if (flags.find(" sse4_1 ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE4_1_Features]);
|
||||
}
|
||||
|
||||
if (flags.find(" sse4_2 ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE4_2_Features]);
|
||||
}
|
||||
|
||||
if (flags.find(" sse4a ") != std::string::npos)
|
||||
{
|
||||
setExtension(cpu_feature_names[eSSE4a_Features]);
|
||||
}
|
||||
|
||||
# endif // LL_X86
|
||||
}
|
||||
|
|
@ -860,6 +984,11 @@ LLProcessorInfo::~LLProcessorInfo() {}
|
|||
F64MegahertzImplicit LLProcessorInfo::getCPUFrequency() const { return mImpl->getCPUFrequency(); }
|
||||
bool LLProcessorInfo::hasSSE() const { return mImpl->hasSSE(); }
|
||||
bool LLProcessorInfo::hasSSE2() const { return mImpl->hasSSE2(); }
|
||||
bool LLProcessorInfo::hasSSE3() const { return mImpl->hasSSE3(); }
|
||||
bool LLProcessorInfo::hasSSE3S() const { return mImpl->hasSSE3S(); }
|
||||
bool LLProcessorInfo::hasSSE41() const { return mImpl->hasSSE41(); }
|
||||
bool LLProcessorInfo::hasSSE42() const { return mImpl->hasSSE42(); }
|
||||
bool LLProcessorInfo::hasSSE4a() const { return mImpl->hasSSE4a(); }
|
||||
bool LLProcessorInfo::hasAltivec() const { return mImpl->hasAltivec(); }
|
||||
std::string LLProcessorInfo::getCPUFamilyName() const { return mImpl->getCPUFamilyName(); }
|
||||
std::string LLProcessorInfo::getCPUBrandName() const { return mImpl->getCPUBrandName(); }
|
||||
|
|
|
|||
|
|
@ -54,6 +54,11 @@ public:
|
|||
F64MegahertzImplicit getCPUFrequency() const;
|
||||
bool hasSSE() const;
|
||||
bool hasSSE2() const;
|
||||
bool hasSSE3() const;
|
||||
bool hasSSE3S() const;
|
||||
bool hasSSE41() const;
|
||||
bool hasSSE42() const;
|
||||
bool hasSSE4a() const;
|
||||
bool hasAltivec() const;
|
||||
std::string getCPUFamilyName() const;
|
||||
std::string getCPUBrandName() const;
|
||||
|
|
|
|||
|
|
@ -597,6 +597,11 @@ LLCPUInfo::LLCPUInfo()
|
|||
// proc.WriteInfoTextFile("procInfo.txt");
|
||||
mHasSSE = proc.hasSSE();
|
||||
mHasSSE2 = proc.hasSSE2();
|
||||
mHasSSE3 = proc.hasSSE3();
|
||||
mHasSSE3S = proc.hasSSE3S();
|
||||
mHasSSE41 = proc.hasSSE41();
|
||||
mHasSSE42 = proc.hasSSE42();
|
||||
mHasSSE4a = proc.hasSSE4a();
|
||||
mHasAltivec = proc.hasAltivec();
|
||||
mCPUMHz = (F64)proc.getCPUFrequency();
|
||||
mFamily = proc.getCPUFamilyName();
|
||||
|
|
@ -609,6 +614,35 @@ LLCPUInfo::LLCPUInfo()
|
|||
}
|
||||
mCPUString = out.str();
|
||||
LLStringUtil::trim(mCPUString);
|
||||
|
||||
if (mHasSSE)
|
||||
{
|
||||
mSSEVersions.append("1");
|
||||
}
|
||||
if (mHasSSE2)
|
||||
{
|
||||
mSSEVersions.append("2");
|
||||
}
|
||||
if (mHasSSE3)
|
||||
{
|
||||
mSSEVersions.append("3");
|
||||
}
|
||||
if (mHasSSE3S)
|
||||
{
|
||||
mSSEVersions.append("3S");
|
||||
}
|
||||
if (mHasSSE41)
|
||||
{
|
||||
mSSEVersions.append("4.1");
|
||||
}
|
||||
if (mHasSSE42)
|
||||
{
|
||||
mSSEVersions.append("4.2");
|
||||
}
|
||||
if (mHasSSE4a)
|
||||
{
|
||||
mSSEVersions.append("4a");
|
||||
}
|
||||
}
|
||||
|
||||
bool LLCPUInfo::hasAltivec() const
|
||||
|
|
@ -626,6 +660,31 @@ bool LLCPUInfo::hasSSE2() const
|
|||
return mHasSSE2;
|
||||
}
|
||||
|
||||
bool LLCPUInfo::hasSSE3() const
|
||||
{
|
||||
return mHasSSE3;
|
||||
}
|
||||
|
||||
bool LLCPUInfo::hasSSE3S() const
|
||||
{
|
||||
return mHasSSE3S;
|
||||
}
|
||||
|
||||
bool LLCPUInfo::hasSSE41() const
|
||||
{
|
||||
return mHasSSE41;
|
||||
}
|
||||
|
||||
bool LLCPUInfo::hasSSE42() const
|
||||
{
|
||||
return mHasSSE42;
|
||||
}
|
||||
|
||||
bool LLCPUInfo::hasSSE4a() const
|
||||
{
|
||||
return mHasSSE4a;
|
||||
}
|
||||
|
||||
F64 LLCPUInfo::getMHz() const
|
||||
{
|
||||
return mCPUMHz;
|
||||
|
|
@ -636,6 +695,11 @@ std::string LLCPUInfo::getCPUString() const
|
|||
return mCPUString;
|
||||
}
|
||||
|
||||
const LLSD& LLCPUInfo::getSSEVersions() const
|
||||
{
|
||||
return mSSEVersions;
|
||||
}
|
||||
|
||||
void LLCPUInfo::stream(std::ostream& s) const
|
||||
{
|
||||
// gather machine information.
|
||||
|
|
@ -645,6 +709,11 @@ void LLCPUInfo::stream(std::ostream& s) const
|
|||
// CPU's attributes regardless of platform
|
||||
s << "->mHasSSE: " << (U32)mHasSSE << std::endl;
|
||||
s << "->mHasSSE2: " << (U32)mHasSSE2 << std::endl;
|
||||
s << "->mHasSSE3: " << (U32)mHasSSE3 << std::endl;
|
||||
s << "->mHasSSE3S: " << (U32)mHasSSE3S << std::endl;
|
||||
s << "->mHasSSE41: " << (U32)mHasSSE41 << std::endl;
|
||||
s << "->mHasSSE42: " << (U32)mHasSSE42 << std::endl;
|
||||
s << "->mHasSSE4a: " << (U32)mHasSSE4a << std::endl;
|
||||
s << "->mHasAltivec: " << (U32)mHasAltivec << std::endl;
|
||||
s << "->mCPUMHz: " << mCPUMHz << std::endl;
|
||||
s << "->mCPUString: " << mCPUString << std::endl;
|
||||
|
|
|
|||
|
|
@ -80,10 +80,16 @@ public:
|
|||
void stream(std::ostream& s) const;
|
||||
|
||||
std::string getCPUString() const;
|
||||
const LLSD& getSSEVersions() const;
|
||||
|
||||
bool hasAltivec() const;
|
||||
bool hasSSE() const;
|
||||
bool hasSSE2() const;
|
||||
bool hasSSE3() const;
|
||||
bool hasSSE3S() const;
|
||||
bool hasSSE41() const;
|
||||
bool hasSSE42() const;
|
||||
bool hasSSE4a() const;
|
||||
F64 getMHz() const;
|
||||
|
||||
// Family is "AMD Duron" or "Intel Pentium Pro"
|
||||
|
|
@ -92,10 +98,16 @@ public:
|
|||
private:
|
||||
bool mHasSSE;
|
||||
bool mHasSSE2;
|
||||
bool mHasSSE3;
|
||||
bool mHasSSE3S;
|
||||
bool mHasSSE41;
|
||||
bool mHasSSE42;
|
||||
bool mHasSSE4a;
|
||||
bool mHasAltivec;
|
||||
F64 mCPUMHz;
|
||||
std::string mFamily;
|
||||
std::string mCPUString;
|
||||
LLSD mSSEVersions;
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
|
|
|
|||
|
|
@ -355,6 +355,38 @@ void LLDiskCache::clearCache()
|
|||
}
|
||||
}
|
||||
|
||||
void LLDiskCache::removeOldVFSFiles()
|
||||
{
|
||||
//VFS files won't be created, so consider removing this code later
|
||||
static const char CACHE_FORMAT[] = "inv.llsd";
|
||||
static const char DB_FORMAT[] = "db2.x";
|
||||
|
||||
boost::system::error_code ec;
|
||||
#if LL_WINDOWS
|
||||
std::wstring cache_path(utf8str_to_utf16str(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "")));
|
||||
#else
|
||||
std::string cache_path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""));
|
||||
#endif
|
||||
if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())
|
||||
{
|
||||
for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {}))
|
||||
{
|
||||
if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed())
|
||||
{
|
||||
if ((entry.path().string().find(CACHE_FORMAT) != std::string::npos) ||
|
||||
(entry.path().string().find(DB_FORMAT) != std::string::npos))
|
||||
{
|
||||
boost::filesystem::remove(entry, ec);
|
||||
if (ec.failed())
|
||||
{
|
||||
LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uintmax_t LLDiskCache::dirFileSize(const std::string dir)
|
||||
{
|
||||
uintmax_t total_file_size = 0;
|
||||
|
|
|
|||
|
|
@ -140,6 +140,8 @@ class LLDiskCache :
|
|||
*/
|
||||
const std::string getCacheInfo();
|
||||
|
||||
void removeOldVFSFiles();
|
||||
|
||||
private:
|
||||
/**
|
||||
* Utility function to gather the total size the files in a given
|
||||
|
|
|
|||
|
|
@ -234,6 +234,8 @@ void LLParcel::init(const LLUUID &owner_id,
|
|||
|
||||
setRegionAllowEnvironmentOverride(FALSE);
|
||||
setParcelEnvironmentVersion(INVALID_PARCEL_ENVIRONMENT_VERSION);
|
||||
|
||||
setObscureMOAP(false);
|
||||
}
|
||||
|
||||
void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
|
||||
|
|
@ -540,6 +542,7 @@ void LLParcel::packMessage(LLSD& msg)
|
|||
msg["see_avs"] = (LLSD::Boolean) getSeeAVs();
|
||||
msg["group_av_sounds"] = (LLSD::Boolean) getAllowGroupAVSounds();
|
||||
msg["any_av_sounds"] = (LLSD::Boolean) getAllowAnyAVSounds();
|
||||
msg["obscure_moap"] = (LLSD::Boolean) getObscureMOAP();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -306,6 +306,7 @@ public:
|
|||
void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }
|
||||
void setAllowGroupAVSounds(BOOL b) { mAllowGroupAVSounds = b; }
|
||||
void setAllowAnyAVSounds(BOOL b) { mAllowAnyAVSounds = b; }
|
||||
void setObscureMOAP(bool b) { mObscureMOAP = b; }
|
||||
|
||||
void setDrawDistance(F32 dist) { mDrawDistance = dist; }
|
||||
void setSalePrice(S32 price) { mSalePrice = price; }
|
||||
|
|
@ -517,6 +518,8 @@ public:
|
|||
|
||||
BOOL getAllowGroupAVSounds() const { return mAllowGroupAVSounds; }
|
||||
BOOL getAllowAnyAVSounds() const { return mAllowAnyAVSounds; }
|
||||
|
||||
bool getObscureMOAP() const { return mObscureMOAP; }
|
||||
|
||||
F32 getDrawDistance() const { return mDrawDistance; }
|
||||
S32 getSalePrice() const { return mSalePrice; }
|
||||
|
|
@ -670,6 +673,7 @@ protected:
|
|||
BOOL mRegionAllowEnvironmentOverride;
|
||||
BOOL mAllowGroupAVSounds;
|
||||
BOOL mAllowAnyAVSounds;
|
||||
bool mObscureMOAP;
|
||||
S32 mCurrentEnvironmentVersion;
|
||||
|
||||
bool mIsDefaultDayCycle;
|
||||
|
|
|
|||
|
|
@ -690,7 +690,7 @@ LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F3
|
|||
|
||||
Face *face = addFace(mTotalOut, mTotal-mTotalOut,0,LL_FACE_INNER_SIDE, flat);
|
||||
|
||||
static LLAlignedArray<LLVector4a,64> pt;
|
||||
static thread_local LLAlignedArray<LLVector4a,64> pt;
|
||||
pt.resize(mTotal) ;
|
||||
|
||||
for (S32 i=mTotalOut;i<mTotal;i++)
|
||||
|
|
@ -6703,13 +6703,19 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
|||
else
|
||||
{
|
||||
// Get s value for tex-coord.
|
||||
if (!flat)
|
||||
S32 index = mBeginS + s;
|
||||
if (index >= profile.size())
|
||||
{
|
||||
// edge?
|
||||
ss = flat ? 1.f - begin_stex : 1.f;
|
||||
}
|
||||
else if (!flat)
|
||||
{
|
||||
ss = profile[mBeginS + s][2];
|
||||
ss = profile[index][2];
|
||||
}
|
||||
else
|
||||
{
|
||||
ss = profile[mBeginS + s][2] - begin_stex;
|
||||
ss = profile[index][2] - begin_stex;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6895,7 +6901,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
|||
|
||||
LLVector4a* norm = mNormals;
|
||||
|
||||
static LLAlignedArray<LLVector4a, 64> triangle_normals;
|
||||
static thread_local LLAlignedArray<LLVector4a, 64> triangle_normals;
|
||||
try
|
||||
{
|
||||
triangle_normals.resize(count);
|
||||
|
|
|
|||
|
|
@ -194,6 +194,10 @@ void LLAvatarNameCache::requestAvatarNameCache_(std::string url, std::vector<LLU
|
|||
LLAvatarNameCache::getInstance()->handleAvNameCacheSuccess(results, httpResults);
|
||||
}
|
||||
}
|
||||
catch (const LLCoros::Stop&)
|
||||
{
|
||||
LL_DEBUGS("AvNameCache") << "Received a shutdown exception" << LL_ENDL;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << LLCoros::getName()
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@
|
|||
#include "llcoros.h"
|
||||
#include "llcorehttputil.h"
|
||||
#include "lluuid.h"
|
||||
#include <boost/smart_ptr/shared_ptr.hpp>
|
||||
|
||||
class LLCoprocedurePool;
|
||||
|
||||
|
|
@ -84,7 +83,7 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
typedef boost::shared_ptr<LLCoprocedurePool> poolPtr_t;
|
||||
typedef std::shared_ptr<LLCoprocedurePool> poolPtr_t;
|
||||
typedef std::map<std::string, poolPtr_t> poolMap_t;
|
||||
|
||||
poolMap_t mPoolMap;
|
||||
|
|
|
|||
|
|
@ -1386,6 +1386,7 @@ char const* const _PREHASH_RegionAllowAccessBlock = LLMessageStringTable::getIns
|
|||
char const* const _PREHASH_RegionAllowAccessOverride = LLMessageStringTable::getInstance()->getString("RegionAllowAccessOverride");
|
||||
char const* const _PREHASH_ParcelEnvironmentBlock = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentBlock");
|
||||
char const* const _PREHASH_ParcelEnvironmentVersion = LLMessageStringTable::getInstance()->getString("ParcelEnvironmentVersion");
|
||||
char const* const _PREHASH_ParcelExtendedFlags = LLMessageStringTable::getInstance()->getString("ParcelExtendedFlags");
|
||||
char const* const _PREHASH_RegionAllowEnvironmentOverride = LLMessageStringTable::getInstance()->getString("RegionAllowEnvironmentOverride");
|
||||
char const* const _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord");
|
||||
char const* const _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord");
|
||||
|
|
|
|||
|
|
@ -1386,6 +1386,7 @@ extern char const* const _PREHASH_RegionAllowAccessBlock;
|
|||
extern char const* const _PREHASH_RegionAllowAccessOverride;
|
||||
extern char const* const _PREHASH_ParcelEnvironmentBlock;
|
||||
extern char const* const _PREHASH_ParcelEnvironmentVersion;
|
||||
extern char const* const _PREHASH_ParcelExtendedFlags;
|
||||
extern char const* const _PREHASH_RegionAllowEnvironmentOverride;
|
||||
extern char const* const _PREHASH_UCoord;
|
||||
extern char const* const _PREHASH_VCoord;
|
||||
|
|
|
|||
|
|
@ -1549,6 +1549,7 @@ void LLPluginClassMedia::seek(float time)
|
|||
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek");
|
||||
|
||||
message.setValueReal("time", time);
|
||||
mCurrentTime = time; // assume that it worked and we will receive an update later
|
||||
|
||||
sendMessage(message);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -999,7 +999,7 @@ void LLPluginProcessParent::poll(F64 timeout)
|
|||
while (itClean != sInstances.end())
|
||||
{
|
||||
if ((*itClean).second->isDone())
|
||||
sInstances.erase(itClean++);
|
||||
itClean = sInstances.erase(itClean);
|
||||
else
|
||||
++itClean;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -886,7 +886,7 @@ LLSD LLModel::writeModel(
|
|||
{
|
||||
LLVector3 pos(face.mPositions[j].getF32ptr());
|
||||
|
||||
weight_list& weights = high->getJointInfluences(pos);
|
||||
weight_list& weights = model[idx]->getJointInfluences(pos);
|
||||
|
||||
S32 count = 0;
|
||||
for (weight_list::iterator iter = weights.begin(); iter != weights.end(); ++iter)
|
||||
|
|
@ -1596,6 +1596,25 @@ void LLMeshSkinInfo::updateHash()
|
|||
mHash = digest[0];
|
||||
}
|
||||
|
||||
U32 LLMeshSkinInfo::sizeBytes() const
|
||||
{
|
||||
U32 res = sizeof(LLUUID); // mMeshID
|
||||
|
||||
res += sizeof(std::vector<std::string>) + sizeof(std::string) * mJointNames.size();
|
||||
for (U32 i = 0; i < mJointNames.size(); ++i)
|
||||
{
|
||||
res += mJointNames[i].size(); // actual size, not capacity
|
||||
}
|
||||
|
||||
res += sizeof(std::vector<S32>) + sizeof(S32) * mJointNums.size();
|
||||
res += sizeof(std::vector<LLMatrix4>) + 16 * sizeof(float) * mInvBindMatrix.size();
|
||||
res += sizeof(std::vector<LLMatrix4>) + 16 * sizeof(float) * mAlternateBindMatrix.size();
|
||||
res += 16 * sizeof(float); //mBindShapeMatrix
|
||||
res += sizeof(float) + 3 * sizeof(bool);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
LLModel::Decomposition::Decomposition(LLSD& data)
|
||||
{
|
||||
fromLLSD(data);
|
||||
|
|
@ -1702,6 +1721,30 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp)
|
|||
}
|
||||
}
|
||||
|
||||
U32 LLModel::Decomposition::sizeBytes() const
|
||||
{
|
||||
U32 res = sizeof(LLUUID); // mMeshID
|
||||
|
||||
res += sizeof(LLModel::convex_hull_decomposition) + sizeof(std::vector<LLVector3>) * mHull.size();
|
||||
for (U32 i = 0; i < mHull.size(); ++i)
|
||||
{
|
||||
res += mHull[i].size() * sizeof(LLVector3);
|
||||
}
|
||||
|
||||
res += sizeof(LLModel::hull) + sizeof(LLVector3) * mBaseHull.size();
|
||||
|
||||
res += sizeof(std::vector<LLModel::PhysicsMesh>) + sizeof(std::vector<LLModel::PhysicsMesh>) * mMesh.size();
|
||||
for (U32 i = 0; i < mMesh.size(); ++i)
|
||||
{
|
||||
res += mMesh[i].sizeBytes();
|
||||
}
|
||||
|
||||
res += sizeof(std::vector<LLModel::PhysicsMesh>) * 2;
|
||||
res += mBaseHullMesh.sizeBytes() + mPhysicsShapeMesh.sizeBytes();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
bool LLModel::Decomposition::hasHullList() const
|
||||
{
|
||||
return !mHull.empty() ;
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ public:
|
|||
void fromLLSD(LLSD& data);
|
||||
LLSD asLLSD(bool include_joints, bool lock_scale_if_joint_position) const;
|
||||
void updateHash();
|
||||
U32 sizeBytes() const;
|
||||
|
||||
LLUUID mMeshID;
|
||||
std::vector<std::string> mJointNames;
|
||||
|
|
@ -112,6 +113,14 @@ public:
|
|||
{
|
||||
return mPositions.empty();
|
||||
}
|
||||
|
||||
U32 sizeBytes() const
|
||||
{
|
||||
U32 res = sizeof(std::vector<LLVector3>) * 2;
|
||||
res += sizeof(LLVector3) * mPositions.size();
|
||||
res += sizeof(LLVector3) * mNormals.size();
|
||||
return res;
|
||||
}
|
||||
};
|
||||
|
||||
class Decomposition
|
||||
|
|
@ -122,6 +131,7 @@ public:
|
|||
void fromLLSD(LLSD& data);
|
||||
LLSD asLLSD() const;
|
||||
bool hasHullList() const;
|
||||
U32 sizeBytes() const;
|
||||
|
||||
void merge(const Decomposition* rhs);
|
||||
|
||||
|
|
|
|||
|
|
@ -1284,7 +1284,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
|
|||
if (pixels != nullptr)
|
||||
{
|
||||
use_scratch = true;
|
||||
scratch = new U32[width * height];
|
||||
scratch = new(std::nothrow) U32[width * height];
|
||||
if (!scratch)
|
||||
{
|
||||
LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
|
||||
<< " bytes for a manual image W" << width << " H" << height << LL_ENDL;
|
||||
}
|
||||
|
||||
U32 pixel_count = (U32)(width * height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
|
|
@ -1304,7 +1309,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
|
|||
if (pixels != nullptr)
|
||||
{
|
||||
use_scratch = true;
|
||||
scratch = new U32[width * height];
|
||||
scratch = new(std::nothrow) U32[width * height];
|
||||
if (!scratch)
|
||||
{
|
||||
LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
|
||||
<< " bytes for a manual image W" << width << " H" << height << LL_ENDL;
|
||||
}
|
||||
|
||||
U32 pixel_count = (U32)(width * height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
|
|
@ -1327,7 +1337,12 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt
|
|||
if (pixels != nullptr)
|
||||
{
|
||||
use_scratch = true;
|
||||
scratch = new U32[width * height];
|
||||
scratch = new(std::nothrow) U32[width * height];
|
||||
if (!scratch)
|
||||
{
|
||||
LL_ERRS() << "Failed to allocate " << (U32)(width * height * sizeof(U32))
|
||||
<< " bytes for a manual image W" << width << " H" << height << LL_ENDL;
|
||||
}
|
||||
|
||||
U32 pixel_count = (U32)(width * height);
|
||||
for (U32 i = 0; i < pixel_count; i++)
|
||||
|
|
|
|||
|
|
@ -762,17 +762,13 @@ void LLFloater::closeFloater(bool app_quitting)
|
|||
for(handle_set_iter_t dependent_it = mDependents.begin();
|
||||
dependent_it != mDependents.end(); )
|
||||
{
|
||||
|
||||
LLFloater* floaterp = dependent_it->get();
|
||||
if (floaterp)
|
||||
{
|
||||
++dependent_it;
|
||||
floaterp->closeFloater(app_quitting);
|
||||
}
|
||||
else
|
||||
{
|
||||
mDependents.erase(dependent_it++);
|
||||
}
|
||||
dependent_it = mDependents.erase(dependent_it);
|
||||
if (floaterp)
|
||||
{
|
||||
floaterp->mDependeeHandle = LLHandle<LLFloater>();
|
||||
floaterp->closeFloater(app_quitting);
|
||||
}
|
||||
}
|
||||
|
||||
cleanupHandles();
|
||||
|
|
@ -1443,7 +1439,7 @@ void LLFloater::cleanupHandles()
|
|||
LLFloater* floaterp = dependent_it->get();
|
||||
if (!floaterp)
|
||||
{
|
||||
mDependents.erase(dependent_it++);
|
||||
dependent_it = mDependents.erase(dependent_it);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3960,8 +3960,8 @@ void LLTearOffMenu::draw()
|
|||
{
|
||||
// animate towards target height
|
||||
reshape(getRect().getWidth(), llceil(lerp((F32)getRect().getHeight(), (F32)mTargetHeight, LLSmoothInterpolation::getInterpolant(0.05f))));
|
||||
mMenu->needsArrange();
|
||||
}
|
||||
mMenu->needsArrange();
|
||||
LLFloater::draw();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -100,7 +100,10 @@ void LLModalDialog::onOpen(const LLSD& key)
|
|||
if (!sModalStack.empty())
|
||||
{
|
||||
LLModalDialog* front = sModalStack.front();
|
||||
front->setVisible(FALSE);
|
||||
if (front != this)
|
||||
{
|
||||
front->setVisible(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
// This is a modal dialog. It sucks up all mouse and keyboard operations.
|
||||
|
|
@ -108,7 +111,14 @@ void LLModalDialog::onOpen(const LLSD& key)
|
|||
LLUI::getInstance()->addPopup(this);
|
||||
setFocus(TRUE);
|
||||
|
||||
sModalStack.push_front( this );
|
||||
std::list<LLModalDialog*>::iterator iter = std::find(sModalStack.begin(), sModalStack.end(), this);
|
||||
if (iter != sModalStack.end())
|
||||
{
|
||||
// if already present, we want to move it to front.
|
||||
sModalStack.erase(iter);
|
||||
}
|
||||
|
||||
sModalStack.push_front(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1388,6 +1388,84 @@ BOOL LLScrollListCtrl::selectItemByPrefix(const LLWString& target, BOOL case_sen
|
|||
return found;
|
||||
}
|
||||
|
||||
U32 LLScrollListCtrl::searchItems(const std::string& substring, bool case_sensitive, bool focus)
|
||||
{
|
||||
return searchItems(utf8str_to_wstring(substring), case_sensitive, focus);
|
||||
}
|
||||
|
||||
U32 LLScrollListCtrl::searchItems(const LLWString& substring, bool case_sensitive, bool focus)
|
||||
{
|
||||
U32 found = 0;
|
||||
|
||||
LLWString substring_trimmed(substring);
|
||||
S32 len = substring_trimmed.size();
|
||||
|
||||
if (0 == len)
|
||||
{
|
||||
// at the moment search for empty element is not supported
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
deselectAllItems(TRUE);
|
||||
if (!case_sensitive)
|
||||
{
|
||||
// do comparisons in lower case
|
||||
LLWStringUtil::toLower(substring_trimmed);
|
||||
}
|
||||
|
||||
for (item_list::iterator iter = mItemList.begin(); iter != mItemList.end(); iter++)
|
||||
{
|
||||
LLScrollListItem* item = *iter;
|
||||
// Only select enabled items with matching names
|
||||
if (!item->getEnabled())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
LLScrollListCell* cellp = item->getColumn(getSearchColumn());
|
||||
if (!cellp)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
LLWString item_label = utf8str_to_wstring(cellp->getValue().asString());
|
||||
if (!case_sensitive)
|
||||
{
|
||||
LLWStringUtil::toLower(item_label);
|
||||
}
|
||||
// remove extraneous whitespace from searchable label
|
||||
LLWStringUtil::trim(item_label);
|
||||
|
||||
size_t found_iter = item_label.find(substring_trimmed);
|
||||
|
||||
if (found_iter != std::string::npos)
|
||||
{
|
||||
// find offset of matching text
|
||||
cellp->highlightText(found_iter, substring_trimmed.size());
|
||||
selectItem(item, -1, FALSE);
|
||||
|
||||
found++;
|
||||
|
||||
if (!mAllowMultipleSelection)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (focus && found != 0)
|
||||
{
|
||||
mNeedsScroll = true;
|
||||
}
|
||||
|
||||
if (mCommitOnSelectionChange)
|
||||
{
|
||||
commitIfChanged();
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
const std::string LLScrollListCtrl::getSelectedItemLabel(S32 column) const
|
||||
{
|
||||
LLScrollListItem* item;
|
||||
|
|
@ -1912,6 +1990,7 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
registrar.add("Url.SendIM", boost::bind(&LLScrollListCtrl::sendIM, id));
|
||||
registrar.add("Url.AddFriend", boost::bind(&LLScrollListCtrl::addFriend, id));
|
||||
registrar.add("Url.RemoveFriend", boost::bind(&LLScrollListCtrl::removeFriend, id));
|
||||
registrar.add("Url.ReportAbuse", boost::bind(&LLScrollListCtrl::reportAbuse, id, is_group));
|
||||
registrar.add("Url.Execute", boost::bind(&LLScrollListCtrl::showNameDetails, id, is_group));
|
||||
registrar.add("Url.CopyLabel", boost::bind(&LLScrollListCtrl::copyNameToClipboard, id, is_group));
|
||||
registrar.add("Url.CopyUrl", boost::bind(&LLScrollListCtrl::copySLURLToClipboard, id, is_group));
|
||||
|
|
@ -1975,6 +2054,15 @@ void LLScrollListCtrl::removeFriend(std::string id)
|
|||
LLUrlAction::removeFriend(slurl);
|
||||
}
|
||||
|
||||
void LLScrollListCtrl::reportAbuse(std::string id, bool is_group)
|
||||
{
|
||||
if (!is_group)
|
||||
{
|
||||
std::string slurl = "secondlife:///app/agent/" + id + "/about";
|
||||
LLUrlAction::reportAbuse(slurl);
|
||||
}
|
||||
}
|
||||
|
||||
void LLScrollListCtrl::showNameDetails(std::string id, bool is_group)
|
||||
{
|
||||
// open the resident's details or the group details
|
||||
|
|
|
|||
|
|
@ -267,6 +267,14 @@ public:
|
|||
const std::string getSelectedItemLabel(S32 column = 0) const;
|
||||
LLSD getSelectedValue();
|
||||
|
||||
// If multi select is on, select all element that include substring,
|
||||
// otherwise select first match only.
|
||||
// If focus is true will scroll to selection.
|
||||
// Returns number of results.
|
||||
// Note: at the moment search happens in one go and is expensive
|
||||
U32 searchItems(const std::string& substring, bool case_sensitive = false, bool focus = true);
|
||||
U32 searchItems(const LLWString& substring, bool case_sensitive = false, bool focus = true);
|
||||
|
||||
// DEPRECATED: Use LLSD versions of setCommentText() and getSelectedValue().
|
||||
// "StringUUID" interface: use this when you're creating a list that contains non-unique strings each of which
|
||||
// has an associated, unique UUID, and only one of which can be selected at a time.
|
||||
|
|
@ -325,6 +333,7 @@ public:
|
|||
// support right-click context menus for avatar/group lists
|
||||
enum ContextMenuType { MENU_NONE, MENU_AVATAR, MENU_GROUP };
|
||||
void setContextMenu(const ContextMenuType &menu) { mContextMenuType = menu; }
|
||||
ContextMenuType getContextMenuType() { return mContextMenuType; }
|
||||
|
||||
// Overridden from LLView
|
||||
/*virtual*/ void draw();
|
||||
|
|
@ -460,6 +469,7 @@ private:
|
|||
static void sendIM(std::string id);
|
||||
static void addFriend(std::string id);
|
||||
static void removeFriend(std::string id);
|
||||
static void reportAbuse(std::string id, bool is_group);
|
||||
static void showNameDetails(std::string id, bool is_group);
|
||||
static void copyNameToClipboard(std::string id, bool is_group);
|
||||
static void copySLURLToClipboard(std::string id, bool is_group);
|
||||
|
|
|
|||
|
|
@ -2049,6 +2049,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
|
|||
registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
|
||||
registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url));
|
||||
registrar.add("Url.RemoveFriend", boost::bind(&LLUrlAction::removeFriend, url));
|
||||
registrar.add("Url.ReportAbuse", boost::bind(&LLUrlAction::reportAbuse, url));
|
||||
registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url));
|
||||
registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
|
||||
registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
|
||||
|
|
|
|||
|
|
@ -196,6 +196,7 @@ public:
|
|||
const LLUUID& getSourceID() const { return mSourceID; }
|
||||
|
||||
const LLTextSegmentPtr getPreviousSegment() const;
|
||||
const LLTextSegmentPtr getLastSegment() const;
|
||||
void getSelectedSegments(segment_vec_t& segments) const;
|
||||
|
||||
void setShowContextMenu(bool show) { mShowContextMenu = show; }
|
||||
|
|
|
|||
|
|
@ -76,22 +76,6 @@ void LLTextUtil::textboxSetGreyedVal(LLTextBox *txtbox, const LLStyle::Params& n
|
|||
txtbox->appendText(text.substr(greyed_begin + greyed_len), false, normal_style);
|
||||
}
|
||||
|
||||
const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str)
|
||||
{
|
||||
static const std::string PHONE_SEPARATOR = LLUI::getInstance()->mSettingGroups["config"]->getString("AvalinePhoneSeparator");
|
||||
static const S32 PHONE_PART_LEN = 2;
|
||||
|
||||
static std::string formatted_phone_str;
|
||||
formatted_phone_str = phone_str;
|
||||
S32 separator_pos = (S32)(formatted_phone_str.size()) - PHONE_PART_LEN;
|
||||
for (; separator_pos >= PHONE_PART_LEN; separator_pos -= PHONE_PART_LEN)
|
||||
{
|
||||
formatted_phone_str.insert(separator_pos, PHONE_SEPARATOR);
|
||||
}
|
||||
|
||||
return formatted_phone_str;
|
||||
}
|
||||
|
||||
bool LLTextUtil::processUrlMatch(LLUrlMatch* match,LLTextBase* text_base, bool is_content_trusted)
|
||||
{
|
||||
if (match == 0 || text_base == 0)
|
||||
|
|
|
|||
|
|
@ -58,18 +58,6 @@ namespace LLTextUtil
|
|||
const std::string& text,
|
||||
const std::string& greyed);
|
||||
|
||||
/**
|
||||
* Formats passed phone number to be more human readable.
|
||||
*
|
||||
* It just divides the number on parts by two digits from right to left. The first left part
|
||||
* can have 2 or 3 digits, i.e. +44-33-33-44-55-66 or 12-34-56-78-90. Separator is set in
|
||||
* application settings (AvalinePhoneSeparator)
|
||||
*
|
||||
* @param[in] phone_str string with original phone number
|
||||
* @return reference to string with formatted phone number
|
||||
*/
|
||||
const std::string& formatPhoneNumber(const std::string& phone_str);
|
||||
|
||||
/**
|
||||
* Adds icon before url if need.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -222,6 +222,15 @@ void LLUrlAction::removeFriend(std::string url)
|
|||
}
|
||||
}
|
||||
|
||||
void LLUrlAction::reportAbuse(std::string url)
|
||||
{
|
||||
std::string id_str = getUserID(url);
|
||||
if (LLUUID::validate(id_str))
|
||||
{
|
||||
executeSLURL("secondlife:///app/agent/" + id_str + "/reportAbuse");
|
||||
}
|
||||
}
|
||||
|
||||
void LLUrlAction::blockObject(std::string url)
|
||||
{
|
||||
std::string object_id = getObjectId(url);
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ public:
|
|||
static void sendIM(std::string url);
|
||||
static void addFriend(std::string url);
|
||||
static void removeFriend(std::string url);
|
||||
static void reportAbuse(std::string url);
|
||||
static void blockObject(std::string url);
|
||||
static void unblockObject(std::string url);
|
||||
|
||||
|
|
|
|||
|
|
@ -148,6 +148,22 @@ void LLKeyboard::addKeyName(KEY key, const std::string& name)
|
|||
sNamesToKeys[nameuc] = key;
|
||||
}
|
||||
|
||||
void LLKeyboard::resetKeyDownAndHandle()
|
||||
{
|
||||
MASK mask = currentMask(FALSE);
|
||||
for (S32 i = 0; i < KEY_COUNT; i++)
|
||||
{
|
||||
if (mKeyLevel[i])
|
||||
{
|
||||
mKeyDown[i] = FALSE;
|
||||
mKeyLevel[i] = FALSE;
|
||||
mKeyUp[i] = TRUE;
|
||||
mCurTranslatedKey = (KEY)i;
|
||||
mCallbacks->handleTranslatedKeyUp(i, mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BUG this has to be called when an OS dialog is shown, otherwise modifier key state
|
||||
// is wrong because the keyup event is never received by the main window. JC
|
||||
void LLKeyboard::resetKeys()
|
||||
|
|
|
|||
|
|
@ -58,7 +58,8 @@ public:
|
|||
LLKeyboard();
|
||||
virtual ~LLKeyboard();
|
||||
|
||||
void resetKeys();
|
||||
void resetKeyDownAndHandle();
|
||||
void resetKeys();
|
||||
|
||||
|
||||
F32 getCurKeyElapsedTime() { return getKeyDown(mCurScanKey) ? getKeyElapsedTime( mCurScanKey ) : 0.f; }
|
||||
|
|
|
|||
|
|
@ -501,14 +501,14 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
// e.g. OS Window for upload something or Input Window...
|
||||
// mModifiers instance variable is for insertText: or insertText:replacementRange: (by Pell Smit)
|
||||
mModifiers = [theEvent modifierFlags];
|
||||
unichar ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
|
||||
bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, ch);
|
||||
|
||||
bool acceptsText = mHasMarkedText ? false : callKeyDown(&eventData, keycode, mModifiers, [[theEvent characters] characterAtIndex:0]);
|
||||
unichar ch;
|
||||
if (acceptsText &&
|
||||
!mMarkedTextAllowed &&
|
||||
!(mModifiers & (NSControlKeyMask | NSCommandKeyMask)) && // commands don't invoke InputWindow
|
||||
![(LLAppDelegate*)[NSApp delegate] romanScript] &&
|
||||
(ch = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]) > ' ' &&
|
||||
ch > ' ' &&
|
||||
ch != NSDeleteCharacter &&
|
||||
(ch < 0xF700 || ch > 0xF8FF)) // 0xF700-0xF8FF: reserved for function keys on the keyboard(from NSEvent.h)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -100,13 +100,13 @@ const unsigned short *copyFromPBoard()
|
|||
CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
|
||||
// extra retain on the NSCursor since we want it to live for the lifetime of the app.
|
||||
NSCursor *cursor =
|
||||
[[[NSCursor alloc]
|
||||
initWithImage:
|
||||
[[[NSImage alloc] initWithContentsOfFile:
|
||||
[NSString stringWithFormat:@"%s", fullpath]
|
||||
[NSString stringWithUTF8String:fullpath]
|
||||
]autorelease]
|
||||
hotSpot:NSMakePoint(hotspotX, hotspotY)
|
||||
]retain];
|
||||
|
|
|
|||
|
|
@ -1676,7 +1676,7 @@ void LLWindowMacOSX::hideCursor()
|
|||
|
||||
void LLWindowMacOSX::showCursor()
|
||||
{
|
||||
if(mCursorHidden)
|
||||
if(mCursorHidden || !isCGCursorVisible())
|
||||
{
|
||||
// LL_INFOS() << "showCursor: showing" << LL_ENDL;
|
||||
mCursorHidden = FALSE;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include "llplugininstance.h"
|
||||
#include "llpluginmessage.h"
|
||||
#include "llpluginmessageclasses.h"
|
||||
#include "llstring.h"
|
||||
#include "volume_catcher.h"
|
||||
#include "media_plugin_base.h"
|
||||
|
||||
|
|
@ -55,7 +56,7 @@ private:
|
|||
bool init();
|
||||
|
||||
void onPageChangedCallback(const unsigned char* pixels, int x, int y, const int width, const int height);
|
||||
void onCustomSchemeURLCallback(std::string url);
|
||||
void onCustomSchemeURLCallback(std::string url, bool user_gesture, bool is_redirect);
|
||||
void onConsoleMessageCallback(std::string message, std::string source, int line);
|
||||
void onStatusMessageCallback(std::string value);
|
||||
void onTitleChangeCallback(std::string title);
|
||||
|
|
@ -299,11 +300,18 @@ void MediaPluginCEF::onOpenPopupCallback(std::string url, std::string target)
|
|||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void MediaPluginCEF::onCustomSchemeURLCallback(std::string url)
|
||||
void MediaPluginCEF::onCustomSchemeURLCallback(std::string url, bool user_gesture, bool is_redirect)
|
||||
{
|
||||
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow");
|
||||
message.setValue("uri", url);
|
||||
message.setValue("nav_type", "clicked"); // TODO: differentiate between click and navigate to
|
||||
message.setValue("uri", url);
|
||||
|
||||
// indicate if this interaction was from a user click (okay on a SLAPP) or
|
||||
// via a navigation (e.g. a data URL - see SL-18151) (not okay on a SLAPP)
|
||||
const std::string nav_type = user_gesture ? "clicked" : "navigated";
|
||||
|
||||
message.setValue("nav_type", nav_type);
|
||||
message.setValueBoolean("is_redirect", is_redirect);
|
||||
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
|
|
@ -592,7 +600,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
|
|||
{
|
||||
// event callbacks from Dullahan
|
||||
mCEFLib->setOnPageChangedCallback(std::bind(&MediaPluginCEF::onPageChangedCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
|
||||
mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1));
|
||||
mCEFLib->setOnCustomSchemeURLCallback(std::bind(&MediaPluginCEF::onCustomSchemeURLCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||
mCEFLib->setOnConsoleMessageCallback(std::bind(&MediaPluginCEF::onConsoleMessageCallback, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
|
||||
mCEFLib->setOnStatusMessageCallback(std::bind(&MediaPluginCEF::onStatusMessageCallback, this, std::placeholders::_1));
|
||||
mCEFLib->setOnTitleChangeCallback(std::bind(&MediaPluginCEF::onTitleChangeCallback, this, std::placeholders::_1));
|
||||
|
|
@ -616,9 +624,9 @@ void MediaPluginCEF::receiveMessage(const char* message_string)
|
|||
// dir as the executable that loaded it (SLPlugin.exe). The code in
|
||||
// Dullahan that tried to figure out the location automatically uses
|
||||
// the location of the exe which isn't helpful so we tell it explicitly.
|
||||
char cur_dir_str[MAX_PATH];
|
||||
GetCurrentDirectoryA(MAX_PATH, cur_dir_str);
|
||||
settings.host_process_path = std::string(cur_dir_str);
|
||||
std::vector<wchar_t> buffer(MAX_PATH + 1);
|
||||
GetCurrentDirectoryW(MAX_PATH, &buffer[0]);
|
||||
settings.host_process_path = ll_convert_wide_to_string(&buffer[0]);
|
||||
#endif
|
||||
settings.accept_language_list = mHostLanguage;
|
||||
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ private:
|
|||
static void display(void* data, void* id);
|
||||
|
||||
/*virtual*/ void setDirty(int left, int top, int right, int bottom) /* override, but that is not supported in gcc 4.6 */;
|
||||
void setDurationDirty();
|
||||
|
||||
static void eventCallbacks(const libvlc_event_t* event, void* ptr);
|
||||
|
||||
|
|
@ -93,8 +94,8 @@ private:
|
|||
|
||||
bool mIsLooping;
|
||||
|
||||
float mCurTime;
|
||||
float mDuration;
|
||||
F64 mCurTime;
|
||||
F64 mDuration;
|
||||
EStatus mVlcStatus;
|
||||
};
|
||||
|
||||
|
|
@ -213,6 +214,19 @@ void MediaPluginLibVLC::setDirty(int left, int top, int right, int bottom)
|
|||
sendMessage(message);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// *virtual*
|
||||
void MediaPluginLibVLC::setDurationDirty()
|
||||
{
|
||||
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
|
||||
|
||||
message.setValueReal("current_time", mCurTime);
|
||||
message.setValueReal("duration", mDuration);
|
||||
message.setValueReal("current_rate", 1.0f);
|
||||
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
|
||||
|
|
@ -233,6 +247,7 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
|
|||
parent->mDuration = (float)(libvlc_media_get_duration(parent->mLibVLCMedia)) / 1000.0f;
|
||||
parent->mVlcStatus = STATUS_PLAYING;
|
||||
parent->setVolumeVLC();
|
||||
parent->setDurationDirty();
|
||||
break;
|
||||
|
||||
case libvlc_MediaPlayerPaused:
|
||||
|
|
@ -245,6 +260,8 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
|
|||
|
||||
case libvlc_MediaPlayerEndReached:
|
||||
parent->mVlcStatus = STATUS_DONE;
|
||||
parent->mCurTime = parent->mDuration;
|
||||
parent->setDurationDirty();
|
||||
break;
|
||||
|
||||
case libvlc_MediaPlayerEncounteredError:
|
||||
|
|
@ -253,6 +270,11 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
|
|||
|
||||
case libvlc_MediaPlayerTimeChanged:
|
||||
parent->mCurTime = (float)libvlc_media_player_get_time(parent->mLibVLCMediaPlayer) / 1000.0f;
|
||||
if (parent->mVlcStatus == STATUS_DONE && libvlc_media_player_is_playing(parent->mLibVLCMediaPlayer))
|
||||
{
|
||||
parent->mVlcStatus = STATUS_PLAYING;
|
||||
}
|
||||
parent->setDurationDirty();
|
||||
break;
|
||||
|
||||
case libvlc_MediaPlayerPositionChanged:
|
||||
|
|
@ -260,6 +282,7 @@ void MediaPluginLibVLC::eventCallbacks(const libvlc_event_t* event, void* ptr)
|
|||
|
||||
case libvlc_MediaPlayerLengthChanged:
|
||||
parent->mDuration = (float)libvlc_media_get_duration(parent->mLibVLCMedia) / 1000.0f;
|
||||
parent->setDurationDirty();
|
||||
break;
|
||||
|
||||
case libvlc_MediaPlayerTitleChanged:
|
||||
|
|
@ -562,7 +585,24 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
|
|||
mTextureWidth = texture_width;
|
||||
mTextureHeight = texture_height;
|
||||
|
||||
libvlc_time_t time = 1000.0 * mCurTime;
|
||||
|
||||
playMedia();
|
||||
|
||||
if (mLibVLCMediaPlayer)
|
||||
{
|
||||
libvlc_media_player_set_time(mLibVLCMediaPlayer, time);
|
||||
time = libvlc_media_player_get_time(mLibVLCMediaPlayer);
|
||||
if (time < 0)
|
||||
{
|
||||
// -1 if there is no media
|
||||
mCurTime = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mCurTime = (F64)time / 1000.0;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -594,6 +634,13 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
|
|||
{
|
||||
if (mLibVLCMediaPlayer)
|
||||
{
|
||||
if (mVlcStatus == STATUS_DONE && !libvlc_media_player_is_playing(mLibVLCMediaPlayer))
|
||||
{
|
||||
// stop or vlc will ignore 'play', it will just
|
||||
// make an MediaPlayerEndReached event even if
|
||||
// seek was used
|
||||
libvlc_media_player_stop(mLibVLCMediaPlayer);
|
||||
}
|
||||
libvlc_media_player_play(mLibVLCMediaPlayer);
|
||||
}
|
||||
}
|
||||
|
|
@ -606,15 +653,32 @@ void MediaPluginLibVLC::receiveMessage(const char* message_string)
|
|||
}
|
||||
else if (message_name == "seek")
|
||||
{
|
||||
if (mDuration > 0)
|
||||
{
|
||||
F64 normalized_offset = message_in.getValueReal("time") / mDuration;
|
||||
libvlc_media_player_set_position(mLibVLCMediaPlayer, normalized_offset);
|
||||
}
|
||||
if (mLibVLCMediaPlayer)
|
||||
{
|
||||
libvlc_time_t time = 1000.0 * message_in.getValueReal("time");
|
||||
libvlc_media_player_set_time(mLibVLCMediaPlayer, time);
|
||||
time = libvlc_media_player_get_time(mLibVLCMediaPlayer);
|
||||
if (time < 0)
|
||||
{
|
||||
// -1 if there is no media
|
||||
mCurTime = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mCurTime = (F64)time / 1000.0;
|
||||
}
|
||||
|
||||
if (!libvlc_media_player_is_playing(mLibVLCMediaPlayer))
|
||||
{
|
||||
// if paused, won't trigger update, update now
|
||||
setDurationDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (message_name == "set_loop")
|
||||
{
|
||||
mIsLooping = true;
|
||||
bool loop = message_in.getValueBoolean("loop");
|
||||
mIsLooping = loop;
|
||||
}
|
||||
else if (message_name == "set_volume")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -544,17 +544,6 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AvalinePhoneSeparator</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Separator of phone parts to have Avaline numbers human readable in Voice Control Panel</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>-</string>
|
||||
</map>
|
||||
<key>AvatarAxisDeadZone0</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -4792,7 +4781,7 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>https://search.[GRID]/viewer/[CATEGORY]/?q=[QUERY]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
<string>https://search.[GRID]/?query_term=[QUERY]&search_type=[TYPE][COLLECTION]&maturity=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
</map>
|
||||
<key>GuidebookURL</key>
|
||||
<map>
|
||||
|
|
@ -5840,6 +5829,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DiskCacheVersion</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Version number of disk cache</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LocalFileSystemBrowsingEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -15729,6 +15729,17 @@
|
|||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AllowSelectAvatar</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allows user to select and move avatars, move is viewer sided, does not propagate to server, also supresses avatar position updates while avatars are selected</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>WebProfileFloaterRect</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -716,6 +716,9 @@ void LLAgent::moveYaw(F32 mag, bool reset_view)
|
|||
U32 mask = AGENT_CONTROL_YAW_POS | AGENT_CONTROL_YAW_NEG;
|
||||
if ((getControlFlags() & mask) == mask)
|
||||
{
|
||||
// Rotation into both directions should cancel out
|
||||
// But keep sending controls to simulator,
|
||||
// it's needed for script based controls
|
||||
gAgentCamera.setYawKey(0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1449,6 +1449,8 @@ bool LLAppViewer::doFrame()
|
|||
LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df suspend" )
|
||||
// give listeners a chance to run
|
||||
llcoro::suspend();
|
||||
// if one of our coroutines threw an uncaught exception, rethrow it now
|
||||
LLCoros::instance().rethrow();
|
||||
}
|
||||
|
||||
if (!LLApp::isExiting())
|
||||
|
|
@ -3275,9 +3277,18 @@ LLSD LLAppViewer::getViewerInfo() const
|
|||
info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : "Undefined";
|
||||
if(LLVoiceClient::getInstance()->voiceEnabled())
|
||||
{
|
||||
LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
|
||||
LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
|
||||
const std::string build_version = version.mBuildVersion;
|
||||
std::ostringstream version_string;
|
||||
version_string << version.serverType << " " << version.serverVersion << std::endl;
|
||||
if (std::equal(build_version.begin(), build_version.begin() + version.serverVersion.size(),
|
||||
version.serverVersion.begin()))
|
||||
{ // Normal case: Show type and build version.
|
||||
version_string << version.serverType << " " << build_version << std::endl;
|
||||
}
|
||||
else
|
||||
{ // Mismatch: Show both versions.
|
||||
version_string << version.serverVersion << "/" << build_version << std::endl;
|
||||
}
|
||||
info["VOICE_VERSION"] = version_string.str();
|
||||
}
|
||||
else
|
||||
|
|
@ -4240,6 +4251,15 @@ U32 LLAppViewer::getTextureCacheVersion()
|
|||
return TEXTURE_CACHE_VERSION ;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLAppViewer::getDiskCacheVersion()
|
||||
{
|
||||
// Viewer disk cache version intorduced in Simple Cache Viewer, change if the cache format changes.
|
||||
const U32 DISK_CACHE_VERSION = 1;
|
||||
|
||||
return DISK_CACHE_VERSION ;
|
||||
}
|
||||
|
||||
//static
|
||||
U32 LLAppViewer::getObjectCacheVersion()
|
||||
{
|
||||
|
|
@ -4269,12 +4289,16 @@ bool LLAppViewer::initCache()
|
|||
const bool enable_cache_debug_info = gSavedSettings.getBOOL("EnableDiskCacheDebugInfo");
|
||||
|
||||
bool texture_cache_mismatch = false;
|
||||
bool remove_vfs_files = false;
|
||||
if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion())
|
||||
{
|
||||
texture_cache_mismatch = true;
|
||||
if(!read_only)
|
||||
{
|
||||
gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion());
|
||||
|
||||
//texture cache version was bumped up in Simple Cache Viewer, and at this point old vfs files are not needed
|
||||
remove_vfs_files = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4320,7 +4344,19 @@ bool LLAppViewer::initCache()
|
|||
|
||||
if (!read_only)
|
||||
{
|
||||
if (mPurgeCache)
|
||||
if (gSavedSettings.getS32("DiskCacheVersion") != LLAppViewer::getDiskCacheVersion())
|
||||
{
|
||||
LLDiskCache::getInstance()->clearCache();
|
||||
remove_vfs_files = true;
|
||||
gSavedSettings.setS32("DiskCacheVersion", LLAppViewer::getDiskCacheVersion());
|
||||
}
|
||||
|
||||
if (remove_vfs_files)
|
||||
{
|
||||
LLDiskCache::getInstance()->removeOldVFSFiles();
|
||||
}
|
||||
|
||||
if (mPurgeCache)
|
||||
{
|
||||
LLSplashScreen::update(LLTrans::getString("StartupClearingCache"));
|
||||
purgeCache();
|
||||
|
|
@ -5398,7 +5434,7 @@ void LLAppViewer::disconnectViewer()
|
|||
gFloaterView->restoreAll();
|
||||
}
|
||||
|
||||
if (LLSelectMgr::getInstance())
|
||||
if (LLSelectMgr::instanceExists())
|
||||
{
|
||||
LLSelectMgr::getInstance()->deselectAll();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -130,6 +130,7 @@ public:
|
|||
|
||||
static U32 getTextureCacheVersion() ;
|
||||
static U32 getObjectCacheVersion() ;
|
||||
static U32 getDiskCacheVersion() ;
|
||||
|
||||
const std::string& getSerialNumber() { return mSerialNumber; }
|
||||
|
||||
|
|
@ -153,16 +154,16 @@ public:
|
|||
void removeMarkerFiles();
|
||||
|
||||
void removeDumpDir();
|
||||
// LLAppViewer testing helpers.
|
||||
// *NOTE: These will potentially crash the viewer. Only for debugging.
|
||||
virtual void forceErrorLLError();
|
||||
virtual void forceErrorBreakpoint();
|
||||
virtual void forceErrorBadMemoryAccess();
|
||||
virtual void forceErrorInfiniteLoop();
|
||||
virtual void forceErrorSoftwareException();
|
||||
virtual void forceErrorDriverCrash();
|
||||
virtual void forceErrorCoroutineCrash();
|
||||
virtual void forceErrorThreadCrash();
|
||||
// LLAppViewer testing helpers.
|
||||
// *NOTE: These will potentially crash the viewer. Only for debugging.
|
||||
virtual void forceErrorLLError();
|
||||
virtual void forceErrorBreakpoint();
|
||||
virtual void forceErrorBadMemoryAccess();
|
||||
virtual void forceErrorInfiniteLoop();
|
||||
virtual void forceErrorSoftwareException();
|
||||
virtual void forceErrorDriverCrash();
|
||||
virtual void forceErrorCoroutineCrash();
|
||||
virtual void forceErrorThreadCrash();
|
||||
|
||||
// The list is found in app_settings/settings_files.xml
|
||||
// but since they are used explicitly in code,
|
||||
|
|
|
|||
|
|
@ -241,21 +241,6 @@ void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)
|
|||
}
|
||||
}
|
||||
|
||||
void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name)
|
||||
{
|
||||
LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL;
|
||||
LLAvalineListItem* item = new LLAvalineListItem(/*hide_number=*/false);
|
||||
item->setAvatarId(item_id, session_id, true, false);
|
||||
item->setName(item_name);
|
||||
item->showLastInteractionTime(mShowLastInteractionTime);
|
||||
item->showSpeakingIndicator(mShowSpeakingIndicator);
|
||||
item->setOnline(false);
|
||||
|
||||
addItem(item, item_id);
|
||||
mIDs.push_back(item_id);
|
||||
sort();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// PROTECTED SECTION
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -296,18 +281,10 @@ void LLAvatarList::refresh()
|
|||
{
|
||||
// *NOTE: If you change the UI to show a different string,
|
||||
// be sure to change the filter code below.
|
||||
if (LLRecentPeople::instance().isAvalineCaller(buddy_id))
|
||||
{
|
||||
const LLSD& call_data = LLRecentPeople::instance().getData(buddy_id);
|
||||
addAvalineItem(buddy_id, call_data["session_id"].asUUID(), call_data["call_number"].asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string display_name = getAvatarName(av_name);
|
||||
addNewItem(buddy_id,
|
||||
display_name.empty() ? waiting_str : display_name,
|
||||
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
}
|
||||
std::string display_name = getAvatarName(av_name);
|
||||
addNewItem(buddy_id,
|
||||
display_name.empty() ? waiting_str : display_name,
|
||||
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
|
||||
modified = true;
|
||||
nadded++;
|
||||
|
|
@ -463,7 +440,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
|
|||
BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
|
||||
if ( mContextMenu && !isAvalineItemSelected())
|
||||
if ( mContextMenu)
|
||||
{
|
||||
uuid_vec_t selected_uuids;
|
||||
getSelectedUUIDs(selected_uuids);
|
||||
|
|
@ -523,21 +500,6 @@ BOOL LLAvatarList::handleHover(S32 x, S32 y, MASK mask)
|
|||
return handled;
|
||||
}
|
||||
|
||||
bool LLAvatarList::isAvalineItemSelected()
|
||||
{
|
||||
std::vector<LLPanel*> selected_items;
|
||||
getSelectedItems(selected_items);
|
||||
std::vector<LLPanel*>::iterator it = selected_items.begin();
|
||||
|
||||
for(; it != selected_items.end(); ++it)
|
||||
{
|
||||
if (dynamic_cast<LLAvalineListItem*>(*it))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLAvatarList::setVisible(BOOL visible)
|
||||
{
|
||||
if ( visible == FALSE && mContextMenu )
|
||||
|
|
@ -626,63 +588,3 @@ bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_
|
|||
}
|
||||
return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2);
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* class LLAvalineListItem */
|
||||
/************************************************************************/
|
||||
LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarListItem(false)
|
||||
, mIsHideNumber(hide_number)
|
||||
{
|
||||
// should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called.
|
||||
buildFromFile( "panel_avatar_list_item.xml");
|
||||
}
|
||||
|
||||
BOOL LLAvalineListItem::postBuild()
|
||||
{
|
||||
BOOL rv = LLAvatarListItem::postBuild();
|
||||
|
||||
if (rv)
|
||||
{
|
||||
setOnline(true);
|
||||
showLastInteractionTime(false);
|
||||
setShowProfileBtn(false);
|
||||
setShowInfoBtn(false);
|
||||
mAvatarIcon->setValue("Avaline_Icon");
|
||||
mAvatarIcon->setToolTip(std::string(""));
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
// to work correctly this method should be called AFTER setAvatarId for avaline callers with hidden phone number
|
||||
void LLAvalineListItem::setName(const std::string& name)
|
||||
{
|
||||
if (mIsHideNumber)
|
||||
{
|
||||
static U32 order = 0;
|
||||
typedef std::map<LLUUID, U32> avaline_callers_nums_t;
|
||||
static avaline_callers_nums_t mAvalineCallersNums;
|
||||
|
||||
llassert(getAvatarId() != LLUUID::null);
|
||||
|
||||
const LLUUID &uuid = getAvatarId();
|
||||
|
||||
if (mAvalineCallersNums.find(uuid) == mAvalineCallersNums.end())
|
||||
{
|
||||
mAvalineCallersNums[uuid] = ++order;
|
||||
LL_DEBUGS("Avaline") << "Set name for new avaline caller: " << uuid << ", order: " << order << LL_ENDL;
|
||||
}
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[ORDER]"] = llformat("%u", mAvalineCallersNums[uuid]);
|
||||
std::string hidden_name = LLTrans::getString("AvalineCaller", args);
|
||||
|
||||
LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL;
|
||||
LLAvatarListItem::setAvatarName(hidden_name);
|
||||
LLAvatarListItem::setAvatarToolTip(hidden_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name);
|
||||
LLAvatarListItem::setAvatarName(formatted_phone);
|
||||
LLAvatarListItem::setAvatarToolTip(formatted_phone);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,7 +98,6 @@ public:
|
|||
|
||||
virtual S32 notifyParent(const LLSD& info);
|
||||
|
||||
void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);
|
||||
void handleDisplayNamesOptionChanged();
|
||||
|
||||
void setShowCompleteName(bool show) { mShowCompleteName = show;};
|
||||
|
|
@ -118,8 +117,6 @@ protected:
|
|||
|
||||
private:
|
||||
|
||||
bool isAvalineItemSelected();
|
||||
|
||||
bool mIgnoreOnlineStatus;
|
||||
bool mShowLastInteractionTime;
|
||||
bool mDirty;
|
||||
|
|
@ -189,27 +186,4 @@ protected:
|
|||
virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
|
||||
};
|
||||
|
||||
/**
|
||||
* Represents Avaline caller in Avatar list in Voice Control Panel and group chats.
|
||||
*/
|
||||
class LLAvalineListItem : public LLAvatarListItem
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param hide_number - flag indicating if number should be hidden.
|
||||
* In this case It will be shown as "Avaline Caller 1", "Avaline Caller 1", etc.
|
||||
*/
|
||||
LLAvalineListItem(bool hide_number = true);
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
/*virtual*/ void setName(const std::string& name);
|
||||
|
||||
private:
|
||||
bool mIsHideNumber;
|
||||
};
|
||||
|
||||
#endif // LL_LLAVATARLIST_H
|
||||
|
|
|
|||
|
|
@ -320,9 +320,16 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio
|
|||
// make sure we won't re-report, coro will update timer with correct time later
|
||||
regionp->getRenderInfoReportTimer().resetWithExpiry(SECS_BETWEEN_REGION_REPORTS);
|
||||
|
||||
std::string coroname =
|
||||
LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro",
|
||||
boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro, url, regionp->getHandle()));
|
||||
try
|
||||
{
|
||||
std::string coroname =
|
||||
LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro",
|
||||
boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro, url, regionp->getHandle()));
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LL_ERRS() << "LLCoros::launch() allocation failure" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -343,10 +350,17 @@ void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regi
|
|||
// make sure we won't re-request, coro will update timer with correct time later
|
||||
regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST);
|
||||
|
||||
// First send a request to get the latest data
|
||||
std::string coroname =
|
||||
LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro",
|
||||
boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro, url, regionp->getHandle()));
|
||||
try
|
||||
{
|
||||
// First send a request to get the latest data
|
||||
std::string coroname =
|
||||
LLCoros::instance().launch("LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro",
|
||||
boost::bind(&LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro, url, regionp->getHandle()));
|
||||
}
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LL_ERRS() << "LLCoros::launch() allocation failure" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
#include "llspeakers.h" //for LLIMSpeakerMgr
|
||||
#include "lltrans.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloaterreporter.h"
|
||||
#include "llfloatersidepanelcontainer.h"
|
||||
#include "llmutelist.h"
|
||||
#include "llstylemap.h"
|
||||
|
|
@ -118,6 +119,7 @@ public:
|
|||
mSourceType(CHAT_SOURCE_UNKNOWN),
|
||||
mFrom(),
|
||||
mSessionID(),
|
||||
mCreationTime(time_corrected()),
|
||||
mMinUserNameWidth(0),
|
||||
mUserNameFont(NULL),
|
||||
mUserNameTextBox(NULL),
|
||||
|
|
@ -403,6 +405,48 @@ public:
|
|||
{
|
||||
LLAvatarActions::pay(getAvatarId());
|
||||
}
|
||||
else if (level == "report_abuse")
|
||||
{
|
||||
std::string time_string;
|
||||
if (mTime > 0) // have frame time
|
||||
{
|
||||
time_t current_time = time_corrected();
|
||||
time_t message_time = current_time - LLFrameTimer::getElapsedSeconds() + mTime;
|
||||
|
||||
time_string = "[" + LLTrans::getString("TimeMonth") + "]/["
|
||||
+ LLTrans::getString("TimeDay") + "]/["
|
||||
+ LLTrans::getString("TimeYear") + "] ["
|
||||
+ LLTrans::getString("TimeHour") + "]:["
|
||||
+ LLTrans::getString("TimeMin") + "]";
|
||||
|
||||
LLSD substitution;
|
||||
|
||||
substitution["datetime"] = (S32)message_time;
|
||||
LLStringUtil::format(time_string, substitution);
|
||||
}
|
||||
else
|
||||
{
|
||||
// From history. This might be empty or not full.
|
||||
// See LLChatLogParser::parse
|
||||
time_string = getChild<LLTextBox>("time_box")->getValue().asString();
|
||||
|
||||
// Just add current date if not full.
|
||||
// Should be fine since both times are supposed to be stl
|
||||
if (!time_string.empty() && time_string.size() < 7)
|
||||
{
|
||||
time_string = "[" + LLTrans::getString("TimeMonth") + "]/["
|
||||
+ LLTrans::getString("TimeDay") + "]/["
|
||||
+ LLTrans::getString("TimeYear") + "] " + time_string;
|
||||
|
||||
LLSD substitution;
|
||||
// To avoid adding today's date to yesterday's timestamp,
|
||||
// use creation time instead of current time
|
||||
substitution["datetime"] = (S32)mCreationTime;
|
||||
LLStringUtil::format(time_string, substitution);
|
||||
}
|
||||
}
|
||||
LLFloaterReporter::showFromChat(mAvatarID, mFrom, time_string, mText);
|
||||
}
|
||||
else if(level == "block_unblock")
|
||||
{
|
||||
LLAvatarActions::toggleMute(getAvatarId(), LLMute::flagVoiceChat);
|
||||
|
|
@ -477,6 +521,10 @@ public:
|
|||
{
|
||||
return canModerate(userdata);
|
||||
}
|
||||
else if (level == "report_abuse")
|
||||
{
|
||||
return gAgentID != mAvatarID;
|
||||
}
|
||||
else if (level == "can_ban_member")
|
||||
{
|
||||
return canBanGroupMember(getAvatarId());
|
||||
|
|
@ -634,6 +682,12 @@ public:
|
|||
mSessionID = chat.mSessionID;
|
||||
mSourceType = chat.mSourceType;
|
||||
|
||||
// To be able to report a message, we need a copy of it's text
|
||||
// and it's easier to store text directly than trying to get
|
||||
// it from a lltextsegment or chat's mEditor
|
||||
mText = chat.mText;
|
||||
mTime = chat.mTime;
|
||||
|
||||
//*TODO overly defensive thing, source type should be maintained out there
|
||||
if((chat.mFromID.isNull() && chat.mFromName.empty()) || (chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()))
|
||||
{
|
||||
|
|
@ -983,6 +1037,9 @@ protected:
|
|||
EChatSourceType mSourceType;
|
||||
std::string mFrom;
|
||||
LLUUID mSessionID;
|
||||
std::string mText;
|
||||
F64 mTime; // IM's frame time
|
||||
time_t mCreationTime; // Views's time
|
||||
|
||||
S32 mMinUserNameWidth;
|
||||
const LLFontGL* mUserNameFont;
|
||||
|
|
|
|||
|
|
@ -391,7 +391,8 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
|
|||
"can_invite_to_group" == command_name ||
|
||||
"can_share" == command_name ||
|
||||
"can_block" == command_name ||
|
||||
"can_pay" == command_name)
|
||||
"can_pay" == command_name ||
|
||||
"report_abuse" == command_name)
|
||||
{
|
||||
return is_p2p;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -182,6 +182,7 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32
|
|||
items.push_back(std::string("map"));
|
||||
items.push_back(std::string("share"));
|
||||
items.push_back(std::string("pay"));
|
||||
items.push_back(std::string("report_abuse"));
|
||||
items.push_back(std::string("block_unblock"));
|
||||
items.push_back(std::string("MuteText"));
|
||||
|
||||
|
|
|
|||
|
|
@ -80,9 +80,14 @@ LLDoNotDisturbNotificationStorage::~LLDoNotDisturbNotificationStorage()
|
|||
{
|
||||
}
|
||||
|
||||
void LLDoNotDisturbNotificationStorage::reset()
|
||||
{
|
||||
setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"));
|
||||
}
|
||||
|
||||
void LLDoNotDisturbNotificationStorage::initialize()
|
||||
{
|
||||
setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"));
|
||||
reset();
|
||||
getCommunicationChannel()->connectFailedFilter(boost::bind(&LLDoNotDisturbNotificationStorage::onChannelChanged, this, _1));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ public:
|
|||
void loadNotifications();
|
||||
void updateNotifications();
|
||||
void removeNotification(const char * name, const LLUUID& id);
|
||||
void reset();
|
||||
|
||||
protected:
|
||||
|
||||
|
|
|
|||
|
|
@ -114,6 +114,11 @@ BOOL LLFloater360Capture::postBuild()
|
|||
// by default each time vs restoring the last value
|
||||
mQualityRadioGroup->setSelectedIndex(0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void LLFloater360Capture::onOpen(const LLSD& key)
|
||||
{
|
||||
// Construct a URL pointing to the first page to load. Although
|
||||
// we do not use this page for anything (after some significant
|
||||
// design changes), we retain the code to load the start page
|
||||
|
|
@ -154,8 +159,6 @@ BOOL LLFloater360Capture::postBuild()
|
|||
// We do an initial capture when the floater is opened, albeit at a 'preview'
|
||||
// quality level (really low resolution, but really fast)
|
||||
onCapture360ImagesBtn();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// called when the user choose a quality level using
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ class LLFloater360Capture:
|
|||
|
||||
~LLFloater360Capture();
|
||||
BOOL postBuild() override;
|
||||
void onOpen(const LLSD& key) override;
|
||||
void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override;
|
||||
|
||||
void changeInterestListMode(bool send_everything);
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ LLFloaterAvatarPicker::LLFloaterAvatarPicker(const LLSD& key)
|
|||
mNumResultsReturned(0),
|
||||
mNearMeListComplete(FALSE),
|
||||
mCloseOnSelect(FALSE),
|
||||
mExcludeAgentFromSearchResults(FALSE),
|
||||
mContextConeOpacity (0.f),
|
||||
mContextConeInAlpha(0.f),
|
||||
mContextConeOutAlpha(0.f),
|
||||
|
|
@ -295,7 +296,7 @@ void LLFloaterAvatarPicker::populateNearMe()
|
|||
for(U32 i=0; i<avatar_ids.size(); i++)
|
||||
{
|
||||
LLUUID& av = avatar_ids[i];
|
||||
if(av == gAgent.getID()) continue;
|
||||
if(mExcludeAgentFromSearchResults && (av == gAgent.getID())) continue;
|
||||
LLSD element;
|
||||
element["id"] = av; // value
|
||||
LLAvatarName av_name;
|
||||
|
|
|
|||
|
|
@ -1047,7 +1047,12 @@ LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLViewerDynamicT
|
|||
mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion(), LLViewerObject::CO_FLAG_UI_AVATAR);
|
||||
mDummyAvatar->mSpecialRenderMode = 1;
|
||||
mDummyAvatar->startMotion(ANIM_AGENT_STAND, BASE_ANIM_TIME_OFFSET);
|
||||
mDummyAvatar->hideSkirt();
|
||||
|
||||
// on idle overall apperance update will set skirt to visible, so either
|
||||
// call early or account for mSpecialRenderMode in updateMeshVisibility
|
||||
mDummyAvatar->updateOverallAppearance();
|
||||
mDummyAvatar->hideHair();
|
||||
mDummyAvatar->hideSkirt();
|
||||
|
||||
// stop extraneous animations
|
||||
mDummyAvatar->stopMotion( ANIM_AGENT_HEAD_ROT, TRUE );
|
||||
|
|
@ -1135,6 +1140,7 @@ BOOL LLPreviewAnimation::render()
|
|||
{
|
||||
LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)face->getPool();
|
||||
avatarp->dirtyMesh();
|
||||
gPipeline.enableLightsPreview();
|
||||
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
#include "llflashtimer.h"
|
||||
#include "llfloateravatarpicker.h"
|
||||
#include "llfloaterpreference.h"
|
||||
#include "llfloaterreporter.h"
|
||||
#include "llimview.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "lltoolbarview.h"
|
||||
|
|
@ -1242,6 +1243,18 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec
|
|||
{
|
||||
LLAvatarActions::pay(userID);
|
||||
}
|
||||
else if ("report_abuse" == command)
|
||||
{
|
||||
LLAvatarName av_name;
|
||||
if (LLAvatarNameCache::get(userID, &av_name))
|
||||
{
|
||||
LLFloaterReporter::showFromAvatar(userID, av_name.getCompleteName());
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterReporter::showFromAvatar(userID, "not avaliable");
|
||||
}
|
||||
}
|
||||
else if ("block_unblock" == command)
|
||||
{
|
||||
LLAvatarActions::toggleMute(userID, LLMute::flagVoiceChat);
|
||||
|
|
@ -1507,7 +1520,11 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
|
|||
}
|
||||
|
||||
// Handle all other options
|
||||
if (("can_invite" == item) || ("can_chat_history" == item) || ("can_share" == item) || ("can_pay" == item))
|
||||
if (("can_invite" == item)
|
||||
|| ("can_chat_history" == item)
|
||||
|| ("can_share" == item)
|
||||
|| ("can_pay" == item)
|
||||
|| ("report_abuse" == item))
|
||||
{
|
||||
// Those menu items are enable only if a single avatar is selected
|
||||
return is_single_select;
|
||||
|
|
|
|||
|
|
@ -579,7 +579,25 @@ void LLFloaterMarketplaceListings::updateView()
|
|||
|
||||
// Update the top message or flip to the tabs and folders view
|
||||
// *TODO : check those messages and create better appropriate ones in strings.xml
|
||||
if (mRootFolderId.notNull())
|
||||
if (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE)
|
||||
{
|
||||
std::string reason = LLMarketplaceData::instance().getSLMConnectionfailureReason();
|
||||
if (reason.empty())
|
||||
{
|
||||
text = LLTrans::getString("InventoryMarketplaceConnectionError");
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSD args;
|
||||
args["[REASON]"] = reason;
|
||||
text = LLTrans::getString("InventoryMarketplaceConnectionErrorReason", args);
|
||||
}
|
||||
|
||||
title = LLTrans::getString("InventoryOutboxErrorTitle");
|
||||
tooltip = LLTrans::getString("InventoryOutboxErrorTooltip");
|
||||
LL_WARNS() << "Marketplace status code: " << mkt_status << LL_ENDL;
|
||||
}
|
||||
else if (mRootFolderId.notNull())
|
||||
{
|
||||
// "Marketplace listings is empty!" message strings
|
||||
text = LLTrans::getString("InventoryMarketplaceListingsNoItems", subs);
|
||||
|
|
|
|||
|
|
@ -156,6 +156,18 @@ void LLFloaterMediaSettings::apply()
|
|||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void LLFloaterMediaSettings::onOpen(const LLSD& key)
|
||||
{
|
||||
if (mPanelMediaSettingsGeneral)
|
||||
{
|
||||
// media is expensive, so only load it when nessesary.
|
||||
// If we need to preload it, set volume to 0 and any pause
|
||||
// if applicable, then unpause here
|
||||
mPanelMediaSettingsGeneral->updateMediaPreview();
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void LLFloaterMediaSettings::onClose(bool app_quitting)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ public:
|
|||
~LLFloaterMediaSettings();
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
/*virtual*/ void onClose(bool app_quitting);
|
||||
|
||||
static LLFloaterMediaSettings* getInstance();
|
||||
|
|
|
|||
|
|
@ -507,6 +507,15 @@ void LLFloaterModelPreview::onClickCalculateBtn()
|
|||
|
||||
toggleCalculateButton(false);
|
||||
mUploadBtn->setEnabled(false);
|
||||
|
||||
//disable "simplification" UI
|
||||
LLPanel* simplification_panel = getChild<LLPanel>("physics simplification");
|
||||
LLView* child = simplification_panel->getFirstChild();
|
||||
while (child)
|
||||
{
|
||||
child->setEnabled(false);
|
||||
child = simplification_panel->findNextSibling(child);
|
||||
}
|
||||
}
|
||||
|
||||
// Modified cell_params, make sure to clear values if you have to reuse cell_params outside of this function
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ struct LLGiveMoneyInfo
|
|||
mFloater(floater), mAmount(amount){}
|
||||
};
|
||||
|
||||
typedef boost::shared_ptr<LLGiveMoneyInfo> give_money_ptr;
|
||||
typedef std::shared_ptr<LLGiveMoneyInfo> give_money_ptr;
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
/// Class LLFloaterPay
|
||||
|
|
|
|||
|
|
@ -2840,10 +2840,15 @@ void LLPanelPreferenceControls::cancel()
|
|||
if (mConflictHandler[i].hasUnsavedChanges())
|
||||
{
|
||||
mConflictHandler[i].clear();
|
||||
if (mEditingMode == i)
|
||||
{
|
||||
// cancel() can be called either when preferences floater closes
|
||||
// or when child floater closes (like advanced graphical settings)
|
||||
// in which case we need to clear and repopulate table
|
||||
regenerateControls();
|
||||
}
|
||||
}
|
||||
}
|
||||
pControlsTable->clearRows();
|
||||
pControlsTable->clearColumns();
|
||||
}
|
||||
|
||||
void LLPanelPreferenceControls::saveSettings()
|
||||
|
|
|
|||
|
|
@ -1322,6 +1322,7 @@ void LLPanelRegionDebugInfo::onClickDebugConsole(void* data)
|
|||
|
||||
BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
|
||||
{
|
||||
static const S32 MAX_TERRAIN_TEXTURE_SIZE = 1024;
|
||||
for(S32 i = 0; i < TERRAIN_TEXTURE_COUNT; ++i)
|
||||
{
|
||||
std::string buffer;
|
||||
|
|
@ -1343,17 +1344,19 @@ BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
|
|||
LLSD args;
|
||||
args["TEXTURE_NUM"] = i+1;
|
||||
args["TEXTURE_BIT_DEPTH"] = llformat("%d",components * 8);
|
||||
args["MAX_SIZE"] = MAX_TERRAIN_TEXTURE_SIZE;
|
||||
LLNotificationsUtil::add("InvalidTerrainBitDepth", args);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (width > 512 || height > 512)
|
||||
if (width > MAX_TERRAIN_TEXTURE_SIZE || height > MAX_TERRAIN_TEXTURE_SIZE)
|
||||
{
|
||||
|
||||
LLSD args;
|
||||
args["TEXTURE_NUM"] = i+1;
|
||||
args["TEXTURE_SIZE_X"] = width;
|
||||
args["TEXTURE_SIZE_Y"] = height;
|
||||
args["MAX_SIZE"] = MAX_TERRAIN_TEXTURE_SIZE;
|
||||
LLNotificationsUtil::add("InvalidTerrainSize", args);
|
||||
return FALSE;
|
||||
|
||||
|
|
@ -3683,7 +3686,7 @@ void LLPanelEstateAccess::searchAgent(LLNameListCtrl* listCtrl, const std::strin
|
|||
if (!search_string.empty())
|
||||
{
|
||||
listCtrl->setSearchColumn(0); // name column
|
||||
listCtrl->selectItemByPrefix(search_string, FALSE);
|
||||
listCtrl->searchItems(search_string, false, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@
|
|||
#include "llbutton.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "lltexturectrl.h"
|
||||
#include "lltexteditor.h"
|
||||
#include "llscrolllistctrl.h"
|
||||
#include "lldispatcher.h"
|
||||
#include "llviewerobject.h"
|
||||
|
|
@ -250,9 +251,6 @@ LLFloaterReporter::~LLFloaterReporter()
|
|||
|
||||
mPosition.setVec(0.0f, 0.0f, 0.0f);
|
||||
|
||||
std::for_each(mMCDList.begin(), mMCDList.end(), DeletePointer() );
|
||||
mMCDList.clear();
|
||||
|
||||
delete mResourceDatap;
|
||||
}
|
||||
|
||||
|
|
@ -661,6 +659,23 @@ void LLFloaterReporter::showFromAvatar(const LLUUID& avatar_id, const std::strin
|
|||
show(avatar_id, avatar_name);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFloaterReporter::showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description)
|
||||
{
|
||||
show(avatar_id, avatar_name);
|
||||
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[MSG_TIME]"] = time;
|
||||
args["[MSG_DESCRIPTION]"] = description;
|
||||
|
||||
LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
|
||||
if (self)
|
||||
{
|
||||
std::string description = self->getString("chat_report_format", args);
|
||||
self->getChild<LLUICtrl>("details_edit")->setValue(description);
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id)
|
||||
{
|
||||
getChild<LLUICtrl>("object_name")->setValue(object_name);
|
||||
|
|
@ -1028,37 +1043,3 @@ void LLFloaterReporter::onClose(bool app_quitting)
|
|||
mSnapshotTimer.stop();
|
||||
gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", app_quitting);
|
||||
}
|
||||
|
||||
|
||||
// void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd)
|
||||
// {
|
||||
// LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
|
||||
// if (self)
|
||||
// {
|
||||
// self->getChild<LLUICtrl>("details_edit")->setValue(description);
|
||||
|
||||
// for_each(self->mMCDList.begin(), self->mMCDList.end(), DeletePointer());
|
||||
// self->mMCDList.clear();
|
||||
// if (mcd)
|
||||
// {
|
||||
// self->mMCDList.push_back(new LLMeanCollisionData(mcd));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// void LLFloaterReporter::addDescription(const std::string& description, LLMeanCollisionData *mcd)
|
||||
// {
|
||||
// LLFloaterReporter *self = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
|
||||
// if (self)
|
||||
// {
|
||||
// LLTextEditor* text = self->getChild<LLTextEditor>("details_edit");
|
||||
// if (text)
|
||||
// {
|
||||
// text->insertText(description);
|
||||
// }
|
||||
// if (mcd)
|
||||
// {
|
||||
// self->mMCDList.push_back(new LLMeanCollisionData(mcd));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ public:
|
|||
|
||||
static void showFromObject(const LLUUID& object_id, const LLUUID& experience_id = LLUUID::null);
|
||||
static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name);
|
||||
static void showFromChat(const LLUUID& avatar_id, const std::string& avatar_name, const std::string& time, const std::string& description);
|
||||
static void showFromExperience(const LLUUID& experience_id);
|
||||
|
||||
static void onClickSend (void *userdata);
|
||||
|
|
@ -101,8 +102,6 @@ public:
|
|||
void onClickSelectAbuser ();
|
||||
static void closePickTool (void *userdata);
|
||||
static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status);
|
||||
static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
|
||||
static void setDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
|
||||
|
||||
void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
|
||||
|
||||
|
|
@ -114,10 +113,8 @@ private:
|
|||
static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null, const LLUUID& experience_id = LLUUID::null);
|
||||
|
||||
void takeScreenshot(bool use_prev_screenshot = false);
|
||||
void sendReportViaCaps(std::string url);
|
||||
void uploadImage();
|
||||
bool validateReport();
|
||||
void setReporterID();
|
||||
LLSD gatherReport();
|
||||
void sendReportViaLegacy(const LLSD & report);
|
||||
void sendReportViaCaps(std::string url, std::string sshot_url, const LLSD & report);
|
||||
|
|
@ -144,7 +141,6 @@ private:
|
|||
BOOL mPicking;
|
||||
LLVector3 mPosition;
|
||||
BOOL mCopyrightWarningSeen;
|
||||
std::list<LLMeanCollisionData*> mMCDList;
|
||||
std::string mDefaultSummary;
|
||||
LLResourceData* mResourceDatap;
|
||||
boost::signals2::connection mAvatarNameCacheConnection;
|
||||
|
|
|
|||
|
|
@ -57,10 +57,10 @@ public:
|
|||
const size_t parts = tokens.size();
|
||||
|
||||
// get the (optional) category for the search
|
||||
std::string category;
|
||||
std::string collection;
|
||||
if (parts > 0)
|
||||
{
|
||||
category = tokens[0].asString();
|
||||
collection = tokens[0].asString();
|
||||
}
|
||||
|
||||
// get the (optional) search string
|
||||
|
|
@ -72,7 +72,7 @@ public:
|
|||
|
||||
// create the LLSD arguments for the search floater
|
||||
LLFloaterSearch::Params p;
|
||||
p.search.category = category;
|
||||
p.search.collection = collection;
|
||||
p.search.query = LLURI::unescape(search_text);
|
||||
|
||||
// open the search floater and perform the requested search
|
||||
|
|
@ -83,8 +83,9 @@ public:
|
|||
LLSearchHandler gSearchHandler;
|
||||
|
||||
LLFloaterSearch::SearchQuery::SearchQuery()
|
||||
: category("category", ""),
|
||||
query("query")
|
||||
: category("category", ""),
|
||||
collection("collection", ""),
|
||||
query("query")
|
||||
{}
|
||||
|
||||
LLFloaterSearch::LLFloaterSearch(const Params& key) :
|
||||
|
|
@ -93,16 +94,16 @@ LLFloaterSearch::LLFloaterSearch(const Params& key) :
|
|||
{
|
||||
// declare a map that transforms a category name into
|
||||
// the URL suffix that is used to search that category
|
||||
mCategoryPaths = LLSD::emptyMap();
|
||||
mCategoryPaths["all"] = "search";
|
||||
mCategoryPaths["people"] = "search/people";
|
||||
mCategoryPaths["places"] = "search/places";
|
||||
mCategoryPaths["events"] = "search/events";
|
||||
mCategoryPaths["groups"] = "search/groups";
|
||||
mCategoryPaths["wiki"] = "search/wiki";
|
||||
mCategoryPaths["land"] = "land";
|
||||
mCategoryPaths["destinations"] = "destinations";
|
||||
mCategoryPaths["classifieds"] = "classifieds";
|
||||
|
||||
mSearchType.insert("standard");
|
||||
mSearchType.insert("land");
|
||||
mSearchType.insert("classified");
|
||||
|
||||
mCollectionType.insert("events");
|
||||
mCollectionType.insert("destinations");
|
||||
mCollectionType.insert("places");
|
||||
mCollectionType.insert("groups");
|
||||
mCollectionType.insert("people");
|
||||
}
|
||||
|
||||
BOOL LLFloaterSearch::postBuild()
|
||||
|
|
@ -157,31 +158,49 @@ void LLFloaterSearch::search(const SearchQuery &p)
|
|||
|
||||
// work out the subdir to use based on the requested category
|
||||
LLSD subs;
|
||||
if (mCategoryPaths.has(p.category))
|
||||
if (mSearchType.find(p.category) != mSearchType.end())
|
||||
{
|
||||
subs["CATEGORY"] = mCategoryPaths[p.category].asString();
|
||||
subs["TYPE"] = p.category;
|
||||
}
|
||||
else
|
||||
{
|
||||
subs["CATEGORY"] = mCategoryPaths["all"].asString();
|
||||
subs["TYPE"] = "standard";
|
||||
}
|
||||
|
||||
// add the search query string
|
||||
subs["QUERY"] = LLURI::escape(p.query);
|
||||
|
||||
subs["COLLECTION"] = "";
|
||||
if (subs["TYPE"] == "standard")
|
||||
{
|
||||
if (mCollectionType.find(p.collection) != mCollectionType.end())
|
||||
{
|
||||
subs["COLLECTION"] = "&collection_chosen=" + std::string(p.collection);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string collection_args("");
|
||||
for (std::set<std::string>::iterator it = mCollectionType.begin(); it != mCollectionType.end(); ++it)
|
||||
{
|
||||
collection_args += "&collection_chosen=" + std::string(*it);
|
||||
}
|
||||
subs["COLLECTION"] = collection_args;
|
||||
}
|
||||
}
|
||||
|
||||
// add the user's preferred maturity (can be changed via prefs)
|
||||
std::string maturity;
|
||||
if (gAgent.prefersAdult())
|
||||
{
|
||||
maturity = "42"; // PG,Mature,Adult
|
||||
maturity = "gma"; // PG,Mature,Adult
|
||||
}
|
||||
else if (gAgent.prefersMature())
|
||||
{
|
||||
maturity = "21"; // PG,Mature
|
||||
maturity = "gm"; // PG,Mature
|
||||
}
|
||||
else
|
||||
{
|
||||
maturity = "13"; // PG
|
||||
maturity = "g"; // PG
|
||||
}
|
||||
subs["MATURITY"] = maturity;
|
||||
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ public:
|
|||
struct SearchQuery : public LLInitParam::Block<SearchQuery>
|
||||
{
|
||||
Optional<std::string> category;
|
||||
Optional<std::string> collection;
|
||||
Optional<std::string> query;
|
||||
|
||||
SearchQuery();
|
||||
|
|
@ -84,7 +85,8 @@ public:
|
|||
private:
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
LLSD mCategoryPaths;
|
||||
std::set<std::string> mSearchType;
|
||||
std::set<std::string> mCollectionType;
|
||||
U8 mSearchGodLevel;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@
|
|||
#include "llfloaterreg.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "llmediaentry.h"
|
||||
#include "llmediactrl.h"
|
||||
#include "llmenugl.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llpanelcontents.h"
|
||||
|
|
@ -240,7 +239,6 @@ BOOL LLFloaterTools::postBuild()
|
|||
mRadioGroupMove = getChild<LLRadioGroup>("move_radio_group");
|
||||
mRadioGroupEdit = getChild<LLRadioGroup>("edit_radio_group");
|
||||
mBtnGridOptions = getChild<LLButton>("Options...");
|
||||
mTitleMedia = getChild<LLMediaCtrl>("title_media");
|
||||
mBtnLink = getChild<LLButton>("link_btn");
|
||||
mBtnUnlink = getChild<LLButton>("unlink_btn");
|
||||
|
||||
|
|
@ -329,7 +327,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
|
||||
mCheckSnapToGrid(NULL),
|
||||
mBtnGridOptions(NULL),
|
||||
mTitleMedia(NULL),
|
||||
mComboGridMode(NULL),
|
||||
mCheckStretchUniform(NULL),
|
||||
mCheckStretchTexture(NULL),
|
||||
|
|
@ -369,8 +366,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
mLandImpactsObserver(NULL),
|
||||
|
||||
mDirty(TRUE),
|
||||
mHasSelection(TRUE),
|
||||
mNeedMediaTitle(TRUE)
|
||||
mHasSelection(TRUE)
|
||||
{
|
||||
gFloaterTools = this;
|
||||
|
||||
|
|
@ -394,9 +390,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
|
|||
mCommitCallbackRegistrar.add("BuildTool.applyToSelection", boost::bind(&click_apply_to_selection, this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.commitRadioLand", boost::bind(&commit_radio_group_land,_1));
|
||||
mCommitCallbackRegistrar.add("BuildTool.LandBrushForce", boost::bind(&commit_slider_dozer_force,_1));
|
||||
mCommitCallbackRegistrar.add("BuildTool.AddMedia", boost::bind(&LLFloaterTools::onClickBtnAddMedia,this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.DeleteMedia", boost::bind(&LLFloaterTools::onClickBtnDeleteMedia,this));
|
||||
mCommitCallbackRegistrar.add("BuildTool.EditMedia", boost::bind(&LLFloaterTools::onClickBtnEditMedia,this));
|
||||
|
||||
mCommitCallbackRegistrar.add("BuildTool.LinkObjects", boost::bind(&LLSelectMgr::linkObjects, LLSelectMgr::getInstance()));
|
||||
mCommitCallbackRegistrar.add("BuildTool.UnlinkObjects", boost::bind(&LLSelectMgr::unlinkObjects, LLSelectMgr::getInstance()));
|
||||
|
|
@ -553,7 +546,7 @@ void LLFloaterTools::refresh()
|
|||
mPanelObject->refresh();
|
||||
mPanelVolume->refresh();
|
||||
mPanelFace->refresh();
|
||||
refreshMedia();
|
||||
mPanelFace->refreshMedia();
|
||||
mPanelContents->refresh();
|
||||
mPanelLandInfo->refresh();
|
||||
|
||||
|
|
@ -580,9 +573,6 @@ void LLFloaterTools::draw()
|
|||
mDirty = FALSE;
|
||||
}
|
||||
|
||||
// grab media name/title and update the UI widget
|
||||
updateMediaTitle();
|
||||
|
||||
// mCheckSelectIndividual->set(gSavedSettings.getBOOL("EditLinkedParts"));
|
||||
LLFloater::draw();
|
||||
}
|
||||
|
|
@ -906,8 +896,7 @@ void LLFloaterTools::onClose(bool app_quitting)
|
|||
LLViewerJoystick::getInstance()->moveAvatar(false);
|
||||
|
||||
// destroy media source used to grab media title
|
||||
if( mTitleMedia )
|
||||
mTitleMedia->unloadMediaSource();
|
||||
mPanelFace->unloadMedia();
|
||||
|
||||
// Different from handle_reset_view in that it doesn't actually
|
||||
// move the camera if EditCameraMovement is not set.
|
||||
|
|
@ -1160,51 +1149,6 @@ void LLFloaterTools::onFocusReceived()
|
|||
LLFloater::onFocusReceived();
|
||||
}
|
||||
|
||||
// Media stuff
|
||||
void LLFloaterTools::refreshMedia()
|
||||
{
|
||||
getMediaState();
|
||||
}
|
||||
|
||||
bool LLFloaterTools::selectedMediaEditable()
|
||||
{
|
||||
U32 owner_mask_on;
|
||||
U32 owner_mask_off;
|
||||
U32 valid_owner_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_OWNER,
|
||||
&owner_mask_on, &owner_mask_off );
|
||||
U32 group_mask_on;
|
||||
U32 group_mask_off;
|
||||
U32 valid_group_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_GROUP,
|
||||
&group_mask_on, &group_mask_off );
|
||||
U32 everyone_mask_on;
|
||||
U32 everyone_mask_off;
|
||||
S32 valid_everyone_perms = LLSelectMgr::getInstance()->selectGetPerm( PERM_EVERYONE,
|
||||
&everyone_mask_on, &everyone_mask_off );
|
||||
|
||||
bool selected_Media_editable = false;
|
||||
|
||||
// if perms we got back are valid
|
||||
if ( valid_owner_perms &&
|
||||
valid_group_perms &&
|
||||
valid_everyone_perms )
|
||||
{
|
||||
|
||||
if ( ( owner_mask_on & PERM_MODIFY ) ||
|
||||
( group_mask_on & PERM_MODIFY ) ||
|
||||
( group_mask_on & PERM_MODIFY ) )
|
||||
{
|
||||
selected_Media_editable = true;
|
||||
}
|
||||
else
|
||||
// user is NOT allowed to press the RESET button
|
||||
{
|
||||
selected_Media_editable = false;
|
||||
};
|
||||
};
|
||||
|
||||
return selected_Media_editable;
|
||||
}
|
||||
|
||||
void LLFloaterTools::updateLandImpacts()
|
||||
{
|
||||
LLParcel *parcel = mParcelSelection->getParcel();
|
||||
|
|
@ -1221,784 +1165,3 @@ void LLFloaterTools::updateLandImpacts()
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloaterTools::getMediaState()
|
||||
{
|
||||
LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
|
||||
LLViewerObject* first_object = selected_objects->getFirstObject();
|
||||
LLTextBox* media_info = getChild<LLTextBox>("media_info");
|
||||
|
||||
if( !(first_object
|
||||
&& first_object->getPCode() == LL_PCODE_VOLUME
|
||||
&&first_object->permModify()
|
||||
))
|
||||
{
|
||||
getChildView("add_media")->setEnabled(FALSE);
|
||||
media_info->clear();
|
||||
clearMediaSettings();
|
||||
return;
|
||||
}
|
||||
|
||||
std::string url = first_object->getRegion()->getCapability("ObjectMedia");
|
||||
bool has_media_capability = (!url.empty());
|
||||
|
||||
if(!has_media_capability)
|
||||
{
|
||||
getChildView("add_media")->setEnabled(FALSE);
|
||||
LL_WARNS("LLFloaterToolsMedia") << "Media not enabled (no capability) in this region!" << LL_ENDL;
|
||||
clearMediaSettings();
|
||||
return;
|
||||
}
|
||||
|
||||
BOOL is_nonpermanent_enforced = (LLSelectMgr::getInstance()->getSelection()->getFirstRootNode()
|
||||
&& LLSelectMgr::getInstance()->selectGetRootsNonPermanentEnforced())
|
||||
|| LLSelectMgr::getInstance()->selectGetNonPermanentEnforced();
|
||||
bool editable = is_nonpermanent_enforced && (first_object->permModify() || selectedMediaEditable());
|
||||
|
||||
// Check modify permissions and whether any selected objects are in
|
||||
// the process of being fetched. If they are, then we're not editable
|
||||
if (editable)
|
||||
{
|
||||
LLObjectSelection::iterator iter = selected_objects->begin();
|
||||
LLObjectSelection::iterator end = selected_objects->end();
|
||||
for ( ; iter != end; ++iter)
|
||||
{
|
||||
LLSelectNode* node = *iter;
|
||||
LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
|
||||
if (NULL != object)
|
||||
{
|
||||
if (!object->permModify())
|
||||
{
|
||||
LL_INFOS("LLFloaterToolsMedia")
|
||||
<< "Selection not editable due to lack of modify permissions on object id "
|
||||
<< object->getID() << LL_ENDL;
|
||||
|
||||
editable = false;
|
||||
break;
|
||||
}
|
||||
// XXX DISABLE this for now, because when the fetch finally
|
||||
// does come in, the state of this floater doesn't properly
|
||||
// update. Re-selecting fixes the problem, but there is
|
||||
// contention as to whether this is a sufficient solution.
|
||||
// if (object->isMediaDataBeingFetched())
|
||||
// {
|
||||
// LL_INFOS("LLFloaterToolsMedia")
|
||||
// << "Selection not editable due to media data being fetched for object id "
|
||||
// << object->getID() << LL_ENDL;
|
||||
//
|
||||
// editable = false;
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Media settings
|
||||
bool bool_has_media = false;
|
||||
struct media_functor : public LLSelectedTEGetFunctor<bool>
|
||||
{
|
||||
bool get(LLViewerObject* object, S32 face)
|
||||
{
|
||||
LLTextureEntry *te = object->getTE(face);
|
||||
if (te)
|
||||
{
|
||||
return te->hasMedia();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} func;
|
||||
|
||||
|
||||
// check if all faces have media(or, all dont have media)
|
||||
LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo = selected_objects->getSelectedTEValue( &func, bool_has_media );
|
||||
|
||||
const LLMediaEntry default_media_data;
|
||||
|
||||
struct functor_getter_media_data : public LLSelectedTEGetFunctor< LLMediaEntry>
|
||||
{
|
||||
functor_getter_media_data(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
LLMediaEntry get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return *(object->getTE(face)->getMediaData());
|
||||
return mMediaEntry;
|
||||
};
|
||||
|
||||
const LLMediaEntry& mMediaEntry;
|
||||
|
||||
} func_media_data(default_media_data);
|
||||
|
||||
LLMediaEntry media_data_get;
|
||||
LLFloaterMediaSettings::getInstance()->mMultipleMedia = !(selected_objects->getSelectedTEValue( &func_media_data, media_data_get ));
|
||||
|
||||
std::string multi_media_info_str = LLTrans::getString("Multiple Media");
|
||||
std::string media_title = "";
|
||||
// update UI depending on whether "object" (prim or face) has media
|
||||
// and whether or not you are allowed to edit it.
|
||||
|
||||
getChildView("add_media")->setEnabled(editable);
|
||||
// IF all the faces have media (or all dont have media)
|
||||
if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
|
||||
{
|
||||
// TODO: get media title and set it.
|
||||
media_info->clear();
|
||||
// if identical is set, all faces are same (whether all empty or has the same media)
|
||||
if(!(LLFloaterMediaSettings::getInstance()->mMultipleMedia) )
|
||||
{
|
||||
// Media data is valid
|
||||
if(media_data_get!=default_media_data)
|
||||
{
|
||||
// initial media title is the media URL (until we get the name)
|
||||
media_title = media_data_get.getHomeURL();
|
||||
}
|
||||
// else all faces might be empty.
|
||||
}
|
||||
else // there' re Different Medias' been set on on the faces.
|
||||
{
|
||||
media_title = multi_media_info_str;
|
||||
}
|
||||
|
||||
getChildView("delete_media")->setEnabled(bool_has_media && editable );
|
||||
// TODO: display a list of all media on the face - use 'identical' flag
|
||||
}
|
||||
else // not all face has media but at least one does.
|
||||
{
|
||||
// seleted faces have not identical value
|
||||
LLFloaterMediaSettings::getInstance()->mMultipleValidMedia = selected_objects->isMultipleTEValue(&func_media_data, default_media_data );
|
||||
|
||||
if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia)
|
||||
{
|
||||
media_title = multi_media_info_str;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Media data is valid
|
||||
if(media_data_get!=default_media_data)
|
||||
{
|
||||
// initial media title is the media URL (until we get the name)
|
||||
media_title = media_data_get.getHomeURL();
|
||||
}
|
||||
}
|
||||
|
||||
getChildView("delete_media")->setEnabled(TRUE);
|
||||
}
|
||||
|
||||
navigateToTitleMedia(media_title);
|
||||
media_info->setText(media_title);
|
||||
|
||||
// load values for media settings
|
||||
updateMediaSettings();
|
||||
|
||||
LLFloaterMediaSettings::initValues(mMediaSettings, editable );
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to add media to a prim or prim face
|
||||
void LLFloaterTools::onClickBtnAddMedia()
|
||||
{
|
||||
// check if multiple faces are selected
|
||||
if(LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
|
||||
{
|
||||
LLNotificationsUtil::add("MultipleFacesSelected", LLSD(), LLSD(), multipleFacesSelectedConfirm);
|
||||
}
|
||||
else
|
||||
{
|
||||
onClickBtnEditMedia();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
bool LLFloaterTools::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
switch( option )
|
||||
{
|
||||
case 0: // "Yes"
|
||||
gFloaterTools->onClickBtnEditMedia();
|
||||
break;
|
||||
case 1: // "No"
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to edit existing media settings on a prim or prim face
|
||||
// TODO: test if there is media on the item and only allow editing if present
|
||||
void LLFloaterTools::onClickBtnEditMedia()
|
||||
{
|
||||
refreshMedia();
|
||||
LLFloaterReg::showInstance("media_settings");
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// called when a user wants to delete media from a prim or prim face
|
||||
void LLFloaterTools::onClickBtnDeleteMedia()
|
||||
{
|
||||
LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
switch( option )
|
||||
{
|
||||
case 0: // "Yes"
|
||||
LLSelectMgr::getInstance()->selectionSetMedia( 0, LLSD() );
|
||||
if(LLFloaterReg::instanceVisible("media_settings"))
|
||||
{
|
||||
LLFloaterReg::hideInstance("media_settings");
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // "No"
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLFloaterTools::clearMediaSettings()
|
||||
{
|
||||
LLFloaterMediaSettings::clearValues(false);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLFloaterTools::navigateToTitleMedia( const std::string url )
|
||||
{
|
||||
std::string multi_media_info_str = LLTrans::getString("Multiple Media");
|
||||
if (url.empty() || multi_media_info_str == url)
|
||||
{
|
||||
// nothing to show
|
||||
mNeedMediaTitle = false;
|
||||
}
|
||||
else if (mTitleMedia)
|
||||
{
|
||||
LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
|
||||
|
||||
if ( media_plugin ) // Shouldn't this be after navigateTo creates plugin?
|
||||
{
|
||||
// if it's a movie, we don't want to hear it
|
||||
media_plugin->setVolume( 0 );
|
||||
};
|
||||
|
||||
// check if url changed or if we need a new media source
|
||||
if (mTitleMedia->getCurrentNavUrl() != url || media_plugin == NULL)
|
||||
{
|
||||
mTitleMedia->navigateTo( url );
|
||||
}
|
||||
|
||||
// flag that we need to update the title (even if no request were made)
|
||||
mNeedMediaTitle = true;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLFloaterTools::updateMediaTitle()
|
||||
{
|
||||
// only get the media name if we need it
|
||||
if ( ! mNeedMediaTitle )
|
||||
return;
|
||||
|
||||
// get plugin impl
|
||||
LLPluginClassMedia* media_plugin = mTitleMedia->getMediaPlugin();
|
||||
if ( media_plugin )
|
||||
{
|
||||
// get the media name (asynchronous - must call repeatedly)
|
||||
std::string media_title = media_plugin->getMediaName();
|
||||
|
||||
// only replace the title if what we get contains something
|
||||
if ( ! media_title.empty() )
|
||||
{
|
||||
// update the UI widget
|
||||
LLTextBox* media_title_field = getChild<LLTextBox>("media_info");
|
||||
if ( media_title_field )
|
||||
{
|
||||
media_title_field->setText( media_title );
|
||||
|
||||
// stop looking for a title when we get one
|
||||
// FIXME: check this is the right approach
|
||||
mNeedMediaTitle = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
void LLFloaterTools::updateMediaSettings()
|
||||
{
|
||||
bool identical( false );
|
||||
std::string base_key( "" );
|
||||
std::string value_str( "" );
|
||||
int value_int = 0;
|
||||
bool value_bool = false;
|
||||
LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
|
||||
// TODO: (CP) refactor this using something clever or boost or both !!
|
||||
|
||||
const LLMediaEntry default_media_data;
|
||||
|
||||
// controls
|
||||
U8 value_u8 = default_media_data.getControls();
|
||||
struct functor_getter_controls : public LLSelectedTEGetFunctor< U8 >
|
||||
{
|
||||
functor_getter_controls(const LLMediaEntry &entry) : mMediaEntry(entry) {}
|
||||
|
||||
U8 get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getControls();
|
||||
return mMediaEntry.getControls();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_controls(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 );
|
||||
base_key = std::string( LLMediaEntry::CONTROLS_KEY );
|
||||
mMediaSettings[ base_key ] = value_u8;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// First click (formerly left click)
|
||||
value_bool = default_media_data.getFirstClickInteract();
|
||||
struct functor_getter_first_click : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_first_click(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getFirstClickInteract();
|
||||
return mMediaEntry.getFirstClickInteract();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_first_click(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool );
|
||||
base_key = std::string( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Home URL
|
||||
value_str = default_media_data.getHomeURL();
|
||||
struct functor_getter_home_url : public LLSelectedTEGetFunctor< std::string >
|
||||
{
|
||||
functor_getter_home_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
std::string get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getHomeURL();
|
||||
return mMediaEntry.getHomeURL();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_home_url(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_home_url, value_str );
|
||||
base_key = std::string( LLMediaEntry::HOME_URL_KEY );
|
||||
mMediaSettings[ base_key ] = value_str;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Current URL
|
||||
value_str = default_media_data.getCurrentURL();
|
||||
struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
|
||||
{
|
||||
functor_getter_current_url(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
std::string get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getCurrentURL();
|
||||
return mMediaEntry.getCurrentURL();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_current_url(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_current_url, value_str );
|
||||
base_key = std::string( LLMediaEntry::CURRENT_URL_KEY );
|
||||
mMediaSettings[ base_key ] = value_str;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Auto zoom
|
||||
value_bool = default_media_data.getAutoZoom();
|
||||
struct functor_getter_auto_zoom : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
|
||||
functor_getter_auto_zoom(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAutoZoom();
|
||||
return mMediaEntry.getAutoZoom();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_zoom(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool );
|
||||
base_key = std::string( LLMediaEntry::AUTO_ZOOM_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Auto play
|
||||
//value_bool = default_media_data.getAutoPlay();
|
||||
// set default to auto play TRUE -- angela EXT-5172
|
||||
value_bool = true;
|
||||
struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAutoPlay();
|
||||
//return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela EXT-5172
|
||||
return true;
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_play(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool );
|
||||
base_key = std::string( LLMediaEntry::AUTO_PLAY_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
|
||||
// Auto scale
|
||||
// set default to auto scale TRUE -- angela EXT-5172
|
||||
//value_bool = default_media_data.getAutoScale();
|
||||
value_bool = true;
|
||||
struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAutoScale();
|
||||
// return mMediaEntry.getAutoScale(); set default to auto scale TRUE -- angela EXT-5172
|
||||
return true;
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_scale(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool );
|
||||
base_key = std::string( LLMediaEntry::AUTO_SCALE_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Auto loop
|
||||
value_bool = default_media_data.getAutoLoop();
|
||||
struct functor_getter_auto_loop : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_auto_loop(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAutoLoop();
|
||||
return mMediaEntry.getAutoLoop();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_auto_loop(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool );
|
||||
base_key = std::string( LLMediaEntry::AUTO_LOOP_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// width pixels (if not auto scaled)
|
||||
value_int = default_media_data.getWidthPixels();
|
||||
struct functor_getter_width_pixels : public LLSelectedTEGetFunctor< int >
|
||||
{
|
||||
functor_getter_width_pixels(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
int get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getWidthPixels();
|
||||
return mMediaEntry.getWidthPixels();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_width_pixels(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int );
|
||||
base_key = std::string( LLMediaEntry::WIDTH_PIXELS_KEY );
|
||||
mMediaSettings[ base_key ] = value_int;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// height pixels (if not auto scaled)
|
||||
value_int = default_media_data.getHeightPixels();
|
||||
struct functor_getter_height_pixels : public LLSelectedTEGetFunctor< int >
|
||||
{
|
||||
functor_getter_height_pixels(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
int get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getHeightPixels();
|
||||
return mMediaEntry.getHeightPixels();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_height_pixels(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int );
|
||||
base_key = std::string( LLMediaEntry::HEIGHT_PIXELS_KEY );
|
||||
mMediaSettings[ base_key ] = value_int;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Enable Alt image
|
||||
value_bool = default_media_data.getAltImageEnable();
|
||||
struct functor_getter_enable_alt_image : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_enable_alt_image(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getAltImageEnable();
|
||||
return mMediaEntry.getAltImageEnable();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_enable_alt_image(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool );
|
||||
base_key = std::string( LLMediaEntry::ALT_IMAGE_ENABLE_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - owner interact
|
||||
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_OWNER );
|
||||
struct functor_getter_perms_owner_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_owner_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_OWNER));
|
||||
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_owner_interact(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_OWNER_INTERACT_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - owner control
|
||||
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_OWNER );
|
||||
struct functor_getter_perms_owner_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_owner_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_OWNER));
|
||||
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_owner_control(default_media_data);
|
||||
identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_OWNER_CONTROL_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - group interact
|
||||
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_GROUP );
|
||||
struct functor_getter_perms_group_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_group_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_GROUP));
|
||||
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_group_interact(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_GROUP_INTERACT_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - group control
|
||||
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_GROUP );
|
||||
struct functor_getter_perms_group_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_group_control(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_GROUP));
|
||||
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_group_control(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_GROUP_CONTROL_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - anyone interact
|
||||
value_bool = 0 != ( default_media_data.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
|
||||
struct functor_getter_perms_anyone_interact : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_anyone_interact(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsInteract() & LLMediaEntry::PERM_ANYONE));
|
||||
return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_anyone_interact(default_media_data);
|
||||
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_ANYONE_INTERACT_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// Perms - anyone control
|
||||
value_bool = 0 != ( default_media_data.getPermsControl() & LLMediaEntry::PERM_ANYONE );
|
||||
struct functor_getter_perms_anyone_control : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_perms_anyone_control(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return (0 != (object->getTE(face)->getMediaData()->getPermsControl() & LLMediaEntry::PERM_ANYONE));
|
||||
return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE );
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_perms_anyone_control(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool );
|
||||
base_key = std::string( LLPanelContents::PERMS_ANYONE_CONTROL_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// security - whitelist enable
|
||||
value_bool = default_media_data.getWhiteListEnable();
|
||||
struct functor_getter_whitelist_enable : public LLSelectedTEGetFunctor< bool >
|
||||
{
|
||||
functor_getter_whitelist_enable(const LLMediaEntry& entry) : mMediaEntry(entry) {}
|
||||
|
||||
bool get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getWhiteListEnable();
|
||||
return mMediaEntry.getWhiteListEnable();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_whitelist_enable(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool );
|
||||
base_key = std::string( LLMediaEntry::WHITELIST_ENABLE_KEY );
|
||||
mMediaSettings[ base_key ] = value_bool;
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
|
||||
// security - whitelist URLs
|
||||
std::vector<std::string> value_vector_str = default_media_data.getWhiteList();
|
||||
struct functor_getter_whitelist_urls : public LLSelectedTEGetFunctor< std::vector<std::string> >
|
||||
{
|
||||
functor_getter_whitelist_urls(const LLMediaEntry& entry): mMediaEntry(entry) {}
|
||||
|
||||
std::vector<std::string> get( LLViewerObject* object, S32 face )
|
||||
{
|
||||
if ( object )
|
||||
if ( object->getTE(face) )
|
||||
if ( object->getTE(face)->getMediaData() )
|
||||
return object->getTE(face)->getMediaData()->getWhiteList();
|
||||
return mMediaEntry.getWhiteList();
|
||||
};
|
||||
|
||||
const LLMediaEntry &mMediaEntry;
|
||||
|
||||
} func_whitelist_urls(default_media_data);
|
||||
identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str );
|
||||
base_key = std::string( LLMediaEntry::WHITELIST_KEY );
|
||||
mMediaSettings[ base_key ].clear();
|
||||
std::vector< std::string >::iterator iter = value_vector_str.begin();
|
||||
while( iter != value_vector_str.end() )
|
||||
{
|
||||
std::string white_list_url = *iter;
|
||||
mMediaSettings[ base_key ].append( white_list_url );
|
||||
++iter;
|
||||
};
|
||||
|
||||
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@ class LLRadioGroup;
|
|||
class LLSlider;
|
||||
class LLTabContainer;
|
||||
class LLTextBox;
|
||||
class LLMediaCtrl;
|
||||
class LLTool;
|
||||
class LLParcelSelection;
|
||||
class LLObjectSelection;
|
||||
|
|
@ -98,11 +97,6 @@ public:
|
|||
static void setEditTool(void* data);
|
||||
void setTool(const LLSD& user_data);
|
||||
void saveLastTool();
|
||||
void onClickBtnDeleteMedia();
|
||||
void onClickBtnAddMedia();
|
||||
void onClickBtnEditMedia();
|
||||
void clearMediaSettings();
|
||||
bool selectedMediaEditable();
|
||||
void updateLandImpacts();
|
||||
|
||||
static void setGridMode(S32 mode);
|
||||
|
|
@ -111,13 +105,6 @@ public:
|
|||
|
||||
private:
|
||||
void refresh();
|
||||
void refreshMedia();
|
||||
void getMediaState();
|
||||
void updateMediaSettings();
|
||||
void navigateToTitleMedia( const std::string url ); // navigate if changed
|
||||
void updateMediaTitle();
|
||||
static bool deleteMediaConfirm(const LLSD& notification, const LLSD& response);
|
||||
static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
|
||||
static void setObjectType( LLPCode pcode );
|
||||
void onClickGridOptions();
|
||||
|
||||
|
|
@ -193,19 +180,12 @@ public:
|
|||
LLParcelSelectionHandle mParcelSelection;
|
||||
LLObjectSelectionHandle mObjectSelection;
|
||||
|
||||
LLMediaCtrl *mTitleMedia;
|
||||
bool mNeedMediaTitle;
|
||||
|
||||
private:
|
||||
BOOL mDirty;
|
||||
BOOL mHasSelection;
|
||||
|
||||
std::map<std::string, std::string> mStatusText;
|
||||
|
||||
|
||||
protected:
|
||||
LLSD mMediaSettings;
|
||||
|
||||
public:
|
||||
static bool sShowObjectCost;
|
||||
static bool sPreviousFocusOnAvatar;
|
||||
|
|
|
|||
|
|
@ -112,16 +112,6 @@ void LLFloaterURLEntry::headerFetchComplete(S32 status, const std::string& mime_
|
|||
panel_media->setMediaType(mime_type);
|
||||
panel_media->setMediaURL(mMediaURLEdit->getValue().asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
LLPanelFace* panel_face = dynamic_cast<LLPanelFace*>(mPanelLandMediaHandle.get());
|
||||
if(panel_face)
|
||||
{
|
||||
panel_face->setMediaType(mime_type);
|
||||
panel_face->setMediaURL(mMediaURLEdit->getValue().asString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
getChildView("loading_label")->setVisible( false);
|
||||
closeFloater();
|
||||
|
|
|
|||
|
|
@ -1008,7 +1008,7 @@ void LLFloaterWorldMap::clearAvatarSelection(BOOL clear_ui)
|
|||
{
|
||||
mTrackedStatus = LLTracker::TRACKING_NOTHING;
|
||||
LLCtrlListInterface *list = mListFriendCombo;
|
||||
if (list)
|
||||
if (list && list->getSelectedValue().asString() != "None")
|
||||
{
|
||||
list->selectByValue( "None" );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -327,22 +327,63 @@ void LLFriendCardsManager::syncFriendCardsFolders()
|
|||
/************************************************************************/
|
||||
/* Private Methods */
|
||||
/************************************************************************/
|
||||
const LLUUID& LLFriendCardsManager::findFirstCallingCardSubfolder(const LLUUID &parent_id) const
|
||||
{
|
||||
if (parent_id.isNull())
|
||||
{
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
LLInventoryModel::cat_array_t* cats;
|
||||
LLInventoryModel::item_array_t* items;
|
||||
gInventory.getDirectDescendentsOf(parent_id, cats, items);
|
||||
|
||||
if (!cats || !items || cats->size() == 0)
|
||||
{
|
||||
// call failed
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
if (cats->size() > 1)
|
||||
{
|
||||
const LLViewerInventoryCategory* friendFolder = gInventory.getCategory(parent_id);
|
||||
if (friendFolder)
|
||||
{
|
||||
LL_WARNS_ONCE() << friendFolder->getName() << " folder contains more than one folder" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
for (LLInventoryModel::cat_array_t::const_iterator iter = cats->begin();
|
||||
iter != cats->end();
|
||||
++iter)
|
||||
{
|
||||
const LLInventoryCategory* category = (*iter);
|
||||
if (category->getPreferredType() == LLFolderType::FT_CALLINGCARD)
|
||||
{
|
||||
return category->getUUID();
|
||||
}
|
||||
}
|
||||
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
// Inventorry ->
|
||||
// Calling Cards - >
|
||||
// Friends - > (the only expected folder)
|
||||
// All (the only expected folder)
|
||||
|
||||
const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const
|
||||
{
|
||||
const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
|
||||
const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
|
||||
|
||||
std::string friendFolderName = get_friend_folder_name();
|
||||
|
||||
return findChildFolderUUID(callingCardsFolderID, friendFolderName);
|
||||
return findFirstCallingCardSubfolder(callingCardsFolderID);
|
||||
}
|
||||
|
||||
const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const
|
||||
{
|
||||
LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
|
||||
LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
|
||||
|
||||
std::string friendAllSubfolderName = get_friend_all_subfolder_name();
|
||||
|
||||
return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName);
|
||||
return findFirstCallingCardSubfolder(friendFolderUUID);
|
||||
}
|
||||
|
||||
const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const
|
||||
|
|
|
|||
|
|
@ -116,6 +116,7 @@ private:
|
|||
}
|
||||
|
||||
const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const;
|
||||
const LLUUID& findFirstCallingCardSubfolder(const LLUUID &parent_id) const;
|
||||
const LLUUID& findFriendFolderUUIDImpl() const;
|
||||
const LLUUID& findFriendAllSubfolderUUIDImpl() const;
|
||||
const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ private:
|
|||
std::set<LLUUID> mLoadingAssets;
|
||||
|
||||
// LLEventHost interface
|
||||
boost::shared_ptr<LLGestureListener> mListener;
|
||||
std::shared_ptr<LLGestureListener> mListener;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ LLFetchLeaveGroupData* gFetchLeaveGroupData = NULL;
|
|||
// static
|
||||
void LLGroupActions::search()
|
||||
{
|
||||
LLFloaterReg::showInstance("search");
|
||||
LLFloaterReg::showInstance("search", LLSD().with("collection", "groups"));
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -330,7 +330,7 @@ void LLHUDText::updateVisibility()
|
|||
|
||||
if (!mSourceObject)
|
||||
{
|
||||
LL_WARNS() << "HUD text: mSourceObject is NULL, mOnHUDAttachment: " << mOnHUDAttachment << LL_ENDL;
|
||||
// Beacons
|
||||
mVisible = TRUE;
|
||||
if (mOnHUDAttachment)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -532,7 +532,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
|
|||
mSessionInitialized(false),
|
||||
mCallBackEnabled(true),
|
||||
mTextIMPossible(true),
|
||||
mOtherParticipantIsAvatar(true),
|
||||
mStartCallOnInitialize(false),
|
||||
mStartedAsIMCall(voice),
|
||||
mIsDNDsend(false),
|
||||
|
|
@ -544,13 +543,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
|
|||
if (IM_NOTHING_SPECIAL == mType || IM_SESSION_P2P_INVITE == mType)
|
||||
{
|
||||
mVoiceChannel = new LLVoiceChannelP2P(session_id, name, other_participant_id);
|
||||
mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
|
||||
|
||||
// check if it was AVALINE call
|
||||
if (!mOtherParticipantIsAvatar)
|
||||
{
|
||||
mSessionType = AVALINE_SESSION;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -651,9 +643,6 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
|
|||
|
||||
switch(mSessionType)
|
||||
{
|
||||
case AVALINE_SESSION:
|
||||
// no text notifications
|
||||
break;
|
||||
case P2P_SESSION:
|
||||
LLAvatarNameCache::get(mOtherParticipantID, &av_name);
|
||||
other_avatar_name = av_name.getUserName();
|
||||
|
|
@ -913,11 +902,6 @@ bool LLIMModel::LLIMSession::isGroupChat()
|
|||
return IM_SESSION_GROUP_START == mType || (IM_SESSION_INVITE == mType && gAgent.isInGroup(mSessionID, TRUE));
|
||||
}
|
||||
|
||||
bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
|
||||
{
|
||||
return !mOtherParticipantIsAvatar;
|
||||
}
|
||||
|
||||
LLUUID LLIMModel::LLIMSession::generateOutgoingAdHocHash() const
|
||||
{
|
||||
LLUUID hash = LLUUID::null;
|
||||
|
|
@ -1795,7 +1779,6 @@ LLIMMgr::onConfirmForceCloseError(
|
|||
|
||||
LLCallDialogManager::LLCallDialogManager():
|
||||
mPreviousSessionlName(""),
|
||||
mPreviousSessionType(LLIMModel::LLIMSession::P2P_SESSION),
|
||||
mCurrentSessionlName(""),
|
||||
mSession(NULL),
|
||||
mOldState(LLVoiceChannel::STATE_READY)
|
||||
|
|
@ -1826,12 +1809,6 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id)
|
|||
mCurrentSessionlName = ""; // Empty string results in "Nearby Voice Chat" after substitution
|
||||
return;
|
||||
}
|
||||
|
||||
if (mSession)
|
||||
{
|
||||
// store previous session type to process Avaline calls in dialogs
|
||||
mPreviousSessionType = mSession->mSessionType;
|
||||
}
|
||||
|
||||
mSession = session;
|
||||
|
||||
|
|
@ -1857,7 +1834,6 @@ void LLCallDialogManager::onVoiceChannelChangedInt(const LLUUID &session_id)
|
|||
mCallDialogPayload["session_name"] = mSession->mName;
|
||||
mCallDialogPayload["other_user_id"] = mSession->mOtherParticipantID;
|
||||
mCallDialogPayload["old_channel_name"] = mPreviousSessionlName;
|
||||
mCallDialogPayload["old_session_type"] = mPreviousSessionType;
|
||||
mCallDialogPayload["state"] = LLVoiceChannel::STATE_CALL_STARTED;
|
||||
mCallDialogPayload["disconnected_channel_name"] = mSession->mName;
|
||||
mCallDialogPayload["session_type"] = mSession->mSessionType;
|
||||
|
|
@ -1893,7 +1869,6 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES
|
|||
mCallDialogPayload["session_name"] = mSession->mName;
|
||||
mCallDialogPayload["other_user_id"] = mSession->mOtherParticipantID;
|
||||
mCallDialogPayload["old_channel_name"] = mPreviousSessionlName;
|
||||
mCallDialogPayload["old_session_type"] = mPreviousSessionType;
|
||||
mCallDialogPayload["state"] = new_state;
|
||||
mCallDialogPayload["disconnected_channel_name"] = mSession->mName;
|
||||
mCallDialogPayload["session_type"] = mSession->mSessionType;
|
||||
|
|
@ -1910,8 +1885,7 @@ void LLCallDialogManager::onVoiceChannelStateChangedInt(const LLVoiceChannel::ES
|
|||
break;
|
||||
|
||||
case LLVoiceChannel::STATE_HUNG_UP:
|
||||
// this state is coming before session is changed, so, put it into payload map
|
||||
mCallDialogPayload["old_session_type"] = mSession->mSessionType;
|
||||
// this state is coming before session is changed
|
||||
break;
|
||||
|
||||
case LLVoiceChannel::STATE_CONNECTED :
|
||||
|
|
@ -2031,7 +2005,6 @@ void LLCallDialog::onOpen(const LLSD& key)
|
|||
|
||||
void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
|
||||
{
|
||||
// *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them
|
||||
bool participant_is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
|
||||
bool is_group = participant_is_avatar && gAgent.isInGroup(session_id, TRUE);
|
||||
|
|
@ -2052,8 +2025,8 @@ void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
|
|||
}
|
||||
else
|
||||
{
|
||||
avatar_icon->setValue("Avaline_Icon");
|
||||
avatar_icon->setToolTip(std::string(""));
|
||||
LL_WARNS() << "Participant neither avatar nor group" << LL_ENDL;
|
||||
group_icon->setValue(session_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2097,13 +2070,7 @@ void LLOutgoingCallDialog::show(const LLSD& key)
|
|||
// tell the user which voice channel they are leaving
|
||||
if (!mPayload["old_channel_name"].asString().empty())
|
||||
{
|
||||
bool was_avaline_call = LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["old_session_type"].asInteger();
|
||||
|
||||
std::string old_caller_name = mPayload["old_channel_name"].asString();
|
||||
if (was_avaline_call)
|
||||
{
|
||||
old_caller_name = LLTextUtil::formatPhoneNumber(old_caller_name);
|
||||
}
|
||||
|
||||
getChild<LLUICtrl>("leaving")->setTextArg("[CURRENT_CHAT]", old_caller_name);
|
||||
show_oldchannel = true;
|
||||
|
|
@ -2116,10 +2083,6 @@ void LLOutgoingCallDialog::show(const LLSD& key)
|
|||
if (!mPayload["disconnected_channel_name"].asString().empty())
|
||||
{
|
||||
std::string channel_name = mPayload["disconnected_channel_name"].asString();
|
||||
if (LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["session_type"].asInteger())
|
||||
{
|
||||
channel_name = LLTextUtil::formatPhoneNumber(channel_name);
|
||||
}
|
||||
getChild<LLUICtrl>("nearby")->setTextArg("[VOICE_CHANNEL_NAME]", channel_name);
|
||||
|
||||
// skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice,
|
||||
|
|
@ -2135,16 +2098,11 @@ void LLOutgoingCallDialog::show(const LLSD& key)
|
|||
std::string callee_name = mPayload["session_name"].asString();
|
||||
|
||||
LLUUID session_id = mPayload["session_id"].asUUID();
|
||||
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
|
||||
if (callee_name == "anonymous")
|
||||
if (callee_name == "anonymous") // obsolete? Likely was part of avaline support
|
||||
{
|
||||
callee_name = getString("anonymous");
|
||||
}
|
||||
else if (!is_avatar)
|
||||
{
|
||||
callee_name = LLTextUtil::formatPhoneNumber(callee_name);
|
||||
}
|
||||
|
||||
LLSD callee_id = mPayload["other_user_id"];
|
||||
// Beautification: Since you know who you called, just show display name
|
||||
|
|
@ -2344,18 +2302,11 @@ BOOL LLIncomingCallDialog::postBuild()
|
|||
call_type = getString(notify_box_type);
|
||||
}
|
||||
|
||||
// check to see if this is an Avaline call
|
||||
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
if (caller_name == "anonymous")
|
||||
if (caller_name == "anonymous") // obsolete? Likely was part of avaline support
|
||||
{
|
||||
caller_name = getString("anonymous");
|
||||
setCallerName(caller_name, caller_name, call_type);
|
||||
}
|
||||
else if (!is_avatar)
|
||||
{
|
||||
caller_name = LLTextUtil::formatPhoneNumber(caller_name);
|
||||
setCallerName(caller_name, caller_name, call_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get the full name information
|
||||
|
|
@ -2375,7 +2326,7 @@ BOOL LLIncomingCallDialog::postBuild()
|
|||
|
||||
if(notify_box_type != "VoiceInviteGroup" && notify_box_type != "VoiceInviteAdHoc")
|
||||
{
|
||||
// starting notification's timer for P2P and AVALINE invitations
|
||||
// starting notification's timer for P2P invitations
|
||||
mLifetimeTimer.start();
|
||||
}
|
||||
else
|
||||
|
|
@ -2384,7 +2335,7 @@ BOOL LLIncomingCallDialog::postBuild()
|
|||
}
|
||||
|
||||
//it's not possible to connect to existing Ad-Hoc/Group chat through incoming ad-hoc call
|
||||
//and no IM for avaline
|
||||
bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
|
||||
getChildView("Start IM")->setVisible( is_avatar && notify_box_type != "VoiceInviteAdHoc" && notify_box_type != "VoiceInviteGroup");
|
||||
|
||||
setCanDrag(FALSE);
|
||||
|
|
|
|||
|
|
@ -72,7 +72,6 @@ public:
|
|||
P2P_SESSION,
|
||||
GROUP_SESSION,
|
||||
ADHOC_SESSION,
|
||||
AVALINE_SESSION,
|
||||
NONE_SESSION,
|
||||
} SType;
|
||||
|
||||
|
|
@ -92,12 +91,10 @@ public:
|
|||
bool isAdHoc();
|
||||
bool isP2P();
|
||||
bool isGroupChat();
|
||||
bool isOtherParticipantAvaline();
|
||||
|
||||
bool isP2PSessionType() const { return mSessionType == P2P_SESSION;}
|
||||
bool isAdHocSessionType() const { return mSessionType == ADHOC_SESSION;}
|
||||
bool isGroupSessionType() const { return mSessionType == GROUP_SESSION;}
|
||||
bool isAvalineSessionType() const { return mSessionType == AVALINE_SESSION;}
|
||||
|
||||
LLUUID generateOutgoingAdHocHash() const;
|
||||
|
||||
|
|
@ -136,7 +133,6 @@ public:
|
|||
bool mCallBackEnabled;
|
||||
|
||||
bool mTextIMPossible;
|
||||
bool mOtherParticipantIsAvatar;
|
||||
bool mStartCallOnInitialize;
|
||||
|
||||
//if IM session is created for a voice call
|
||||
|
|
@ -516,7 +512,6 @@ private:
|
|||
|
||||
protected:
|
||||
std::string mPreviousSessionlName;
|
||||
LLIMModel::LLIMSession::SType mPreviousSessionType;
|
||||
std::string mCurrentSessionlName;
|
||||
LLIMModel::LLIMSession* mSession;
|
||||
LLVoiceChannel::EState mOldState;
|
||||
|
|
|
|||
|
|
@ -1121,7 +1121,10 @@ void LLInvFVBridge::addMarketplaceContextMenuOptions(U32 flags,
|
|||
LLInventoryModel::cat_array_t categories;
|
||||
LLInventoryModel::item_array_t items;
|
||||
gInventory.collectDescendents(local_version_folder_id, categories, items, FALSE);
|
||||
if (categories.size() >= gSavedSettings.getU32("InventoryOutboxMaxFolderCount"))
|
||||
LLCachedControl<U32> max_depth(gSavedSettings, "InventoryOutboxMaxFolderDepth", 4);
|
||||
LLCachedControl<U32> max_count(gSavedSettings, "InventoryOutboxMaxFolderCount", 20);
|
||||
if (categories.size() >= max_count
|
||||
|| depth > (max_depth + 1))
|
||||
{
|
||||
disabled_items.push_back(std::string("New Folder"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -135,15 +135,7 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
|
|||
///----------------------------------------------------------------------------
|
||||
/// Class LLInventoryValidationInfo
|
||||
///----------------------------------------------------------------------------
|
||||
LLInventoryValidationInfo::LLInventoryValidationInfo():
|
||||
mFatalErrorCount(0),
|
||||
mWarningCount(0),
|
||||
mLoopCount(0),
|
||||
mOrphanedCount(0),
|
||||
mInitialized(false),
|
||||
mFatalNoRootFolder(false),
|
||||
mFatalNoLibraryRootFolder(false),
|
||||
mFatalQADebugMode(false)
|
||||
LLInventoryValidationInfo::LLInventoryValidationInfo()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -165,7 +157,6 @@ std::ostream& operator<<(std::ostream& os, const LLInventoryValidationInfo& v)
|
|||
void LLInventoryValidationInfo::asLLSD(LLSD& sd) const
|
||||
{
|
||||
sd["fatal_error_count"] = mFatalErrorCount;
|
||||
sd["warning_count"] = mWarningCount;
|
||||
sd["loop_count"] = mLoopCount;
|
||||
sd["orphaned_count"] = mOrphanedCount;
|
||||
sd["initialized"] = mInitialized;
|
||||
|
|
@ -173,6 +164,20 @@ void LLInventoryValidationInfo::asLLSD(LLSD& sd) const
|
|||
sd["fatal_no_root_folder"] = mFatalNoRootFolder;
|
||||
sd["fatal_no_library_root_folder"] = mFatalNoLibraryRootFolder;
|
||||
sd["fatal_qa_debug_mode"] = mFatalQADebugMode;
|
||||
|
||||
sd["warning_count"] = mWarningCount;
|
||||
if (mWarningCount>0)
|
||||
{
|
||||
sd["warnings"] = LLSD::emptyArray();
|
||||
for (auto const& it : mWarnings)
|
||||
{
|
||||
S32 val =LLSD::Integer(it.second);
|
||||
if (val>0)
|
||||
{
|
||||
sd["warnings"][it.first] = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mMissingRequiredSystemFolders.size()>0)
|
||||
{
|
||||
sd["missing_system_folders"] = LLSD::emptyArray();
|
||||
|
|
@ -342,13 +347,13 @@ const LLViewerInventoryCategory* LLInventoryModel::getFirstDescendantOf(const LL
|
|||
return NULL;
|
||||
}
|
||||
|
||||
LLInventoryModel::EAnscestorResult LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const
|
||||
LLInventoryModel::EAncestorResult LLInventoryModel::getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const
|
||||
{
|
||||
LLInventoryObject *object = getObject(object_id);
|
||||
if (!object)
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Unable to trace topmost ancestor, initial object " << object_id << " does not exist" << LL_ENDL;
|
||||
return ANSCESTOR_MISSING;
|
||||
return ANCESTOR_MISSING;
|
||||
}
|
||||
|
||||
std::set<LLUUID> object_ids{ object_id }; // loop protection
|
||||
|
|
@ -358,19 +363,19 @@ LLInventoryModel::EAnscestorResult LLInventoryModel::getObjectTopmostAncestor(co
|
|||
if (object_ids.find(parent_id) != object_ids.end())
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "Detected a loop on an object " << parent_id << " when searching for ancestor of " << object_id << LL_ENDL;
|
||||
return ANSCESTOR_LOOP;
|
||||
return ANCESTOR_LOOP;
|
||||
}
|
||||
object_ids.insert(parent_id);
|
||||
LLInventoryObject *parent_object = getObject(parent_id);
|
||||
if (!parent_object)
|
||||
{
|
||||
LL_WARNS(LOG_INV) << "unable to trace topmost ancestor of " << object_id << ", missing item for uuid " << parent_id << LL_ENDL;
|
||||
return ANSCESTOR_MISSING;
|
||||
return ANCESTOR_MISSING;
|
||||
}
|
||||
object = parent_object;
|
||||
}
|
||||
result = object->getUUID();
|
||||
return ANSCESTOR_OK;
|
||||
return ANCESTOR_OK;
|
||||
}
|
||||
|
||||
// Get the object by id. Returns NULL if not found.
|
||||
|
|
@ -539,9 +544,18 @@ void LLInventoryModel::consolidateForType(const LLUUID& main_id, LLFolderType::E
|
|||
LLViewerInventoryCategory* cat = getCategory(*it);
|
||||
changeCategoryParent(cat, main_id, TRUE);
|
||||
}
|
||||
|
||||
|
||||
// Purge the emptied folder
|
||||
removeCategory(folder_id);
|
||||
// Note that this might be a system folder, don't validate removability
|
||||
LLViewerInventoryCategory* cat = getCategory(folder_id);
|
||||
if (cat)
|
||||
{
|
||||
const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);
|
||||
if (trash_id.notNull())
|
||||
{
|
||||
changeCategoryParent(cat, trash_id, TRUE);
|
||||
}
|
||||
}
|
||||
remove_inventory_category(folder_id, NULL);
|
||||
}
|
||||
}
|
||||
|
|
@ -3901,9 +3915,9 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LLPointer<LLInventoryValidationInfo> validation_info = new LLInventoryValidationInfo;
|
||||
S32 fatal_errs = 0;
|
||||
S32 warnings = 0;
|
||||
S32 loops = 0;
|
||||
S32 orphaned = 0;
|
||||
S32 warning_count= 0;
|
||||
S32 loop_count = 0;
|
||||
S32 orphaned_count = 0;
|
||||
|
||||
if (getRootFolderID().isNull())
|
||||
{
|
||||
|
|
@ -3924,7 +3938,9 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
// ParentChild should be one larger because of the special entry for null uuid.
|
||||
LL_INFOS("Inventory") << "unexpected sizes: cat map size " << mCategoryMap.size()
|
||||
<< " parent/child " << mParentChildCategoryTree.size() << LL_ENDL;
|
||||
warnings++;
|
||||
|
||||
validation_info->mWarnings["category_map_size"]++;
|
||||
warning_count++;
|
||||
}
|
||||
S32 cat_lock = 0;
|
||||
S32 item_lock = 0;
|
||||
|
|
@ -3943,32 +3959,35 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
if (!cat)
|
||||
{
|
||||
LL_WARNS("Inventory") << "null cat" << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["null_cat"]++;
|
||||
warning_count++;
|
||||
continue;
|
||||
}
|
||||
LLUUID topmost_ancestor_id;
|
||||
// Will leave as null uuid on failure
|
||||
EAnscestorResult res = getObjectTopmostAncestor(cat_id, topmost_ancestor_id);
|
||||
EAncestorResult res = getObjectTopmostAncestor(cat_id, topmost_ancestor_id);
|
||||
switch (res)
|
||||
{
|
||||
case ANSCESTOR_MISSING:
|
||||
orphaned++;
|
||||
case ANCESTOR_MISSING:
|
||||
orphaned_count++;
|
||||
break;
|
||||
case ANSCESTOR_LOOP:
|
||||
loops++;
|
||||
case ANCESTOR_LOOP:
|
||||
loop_count++;
|
||||
break;
|
||||
case ANSCESTOR_OK:
|
||||
case ANCESTOR_OK:
|
||||
break;
|
||||
default:
|
||||
LL_WARNS("Inventory") << "Unknown ancestor error for " << cat_id << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["unknown_ancestor_status"]++;
|
||||
warning_count++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (cat_id != cat->getUUID())
|
||||
{
|
||||
LL_WARNS("Inventory") << "cat id/index mismatch " << cat_id << " " << cat->getUUID() << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["cat_id_index_mismatch"]++;
|
||||
warning_count++;
|
||||
}
|
||||
|
||||
if (cat->getParentUUID().isNull())
|
||||
|
|
@ -3978,7 +3997,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
LL_WARNS("Inventory") << "cat " << cat_id << " has no parent, but is not root ("
|
||||
<< getRootFolderID() << ") or library root ("
|
||||
<< getLibraryRootFolderID() << ")" << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["null_parent"]++;
|
||||
warning_count++;
|
||||
}
|
||||
}
|
||||
cat_array_t* cats;
|
||||
|
|
@ -3987,7 +4007,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
if (!cats || !items)
|
||||
{
|
||||
LL_WARNS("Inventory") << "invalid direct descendents for " << cat_id << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["direct_descendents"]++;
|
||||
warning_count++;
|
||||
continue;
|
||||
}
|
||||
if (cat->getDescendentCount() == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN)
|
||||
|
|
@ -4005,7 +4026,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
<< " cached " << cat->getDescendentCount()
|
||||
<< " expected " << cats->size() << "+" << items->size()
|
||||
<< "=" << cats->size() +items->size() << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["invalid_descendent_count"]++;
|
||||
warning_count++;
|
||||
}
|
||||
}
|
||||
if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
|
||||
|
|
@ -4029,7 +4051,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
if (!item)
|
||||
{
|
||||
LL_WARNS("Inventory") << "null item at index " << i << " for cat " << cat_id << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["null_item_at_index"]++;
|
||||
warning_count++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -4040,7 +4063,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
LL_WARNS("Inventory") << "wrong parent for " << item_id << " found "
|
||||
<< item->getParentUUID() << " expected " << cat_id
|
||||
<< LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["wrong_parent_for_item"]++;
|
||||
warning_count++;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -4050,7 +4074,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "item " << item_id << " found as child of "
|
||||
<< cat_id << " but not in top level mItemMap" << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["item_not_in_top_map"]++;
|
||||
warning_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4064,11 +4089,12 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
|
||||
// Topmost ancestor should be root or library.
|
||||
LLUUID topmost_ancestor_id;
|
||||
EAnscestorResult found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
|
||||
if (found != ANSCESTOR_OK)
|
||||
EAncestorResult found = getObjectTopmostAncestor(item_id, topmost_ancestor_id);
|
||||
if (found != ANCESTOR_OK)
|
||||
{
|
||||
LL_WARNS("Inventory") << "unable to find topmost ancestor for " << item_id << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["topmost_ancestor_not_found"]++;
|
||||
warning_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4079,7 +4105,8 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
<< " got " << topmost_ancestor_id
|
||||
<< " expected " << getRootFolderID()
|
||||
<< " or " << getLibraryRootFolderID() << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["topmost_ancestor_not_recognized"]++;
|
||||
warning_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4095,7 +4122,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()
|
||||
<< "] orphaned - no child cat array for alleged parent " << parent_id << LL_ENDL;
|
||||
orphaned++;
|
||||
orphaned_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4113,7 +4140,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "cat " << cat_id << " name [" << cat->getName()
|
||||
<< "] orphaned - not found in child cat array of alleged parent " << parent_id << LL_ENDL;
|
||||
orphaned++;
|
||||
orphaned_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4122,7 +4149,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
LLFolderType::EType folder_type = cat->getPreferredType();
|
||||
bool cat_is_in_library = false;
|
||||
LLUUID topmost_id;
|
||||
if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) == ANSCESTOR_OK && topmost_id == getLibraryRootFolderID())
|
||||
if (getObjectTopmostAncestor(cat->getUUID(),topmost_id) == ANCESTOR_OK && topmost_id == getLibraryRootFolderID())
|
||||
{
|
||||
cat_is_in_library = true;
|
||||
}
|
||||
|
|
@ -4155,14 +4182,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
if (item->getUUID() != item_id)
|
||||
{
|
||||
LL_WARNS("Inventory") << "item_id " << item_id << " does not match " << item->getUUID() << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["item_id_mismatch"]++;
|
||||
warning_count++;
|
||||
}
|
||||
|
||||
const LLUUID& parent_id = item->getParentUUID();
|
||||
if (parent_id.isNull())
|
||||
{
|
||||
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName() << "] has null parent id!" << LL_ENDL;
|
||||
orphaned++;
|
||||
orphaned_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4173,7 +4201,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()
|
||||
<< "] orphaned - alleged parent has no child items list " << parent_id << LL_ENDL;
|
||||
orphaned++;
|
||||
orphaned_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4190,7 +4218,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
LL_WARNS("Inventory") << "item " << item_id << " name [" << item->getName()
|
||||
<< "] orphaned - not found as child of alleged parent " << parent_id << LL_ENDL;
|
||||
orphaned++;
|
||||
orphaned_count++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4208,18 +4236,18 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
LL_WARNS("Inventory") << "link " << item->getUUID() << " type " << item->getActualType()
|
||||
<< " missing backlink info at target_id " << target_id
|
||||
<< LL_ENDL;
|
||||
orphaned++;
|
||||
orphaned_count++;
|
||||
}
|
||||
// Links should have referents.
|
||||
if (item->getActualType() == LLAssetType::AT_LINK && !target_item)
|
||||
{
|
||||
LL_WARNS("Inventory") << "broken item link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
|
||||
orphaned++;
|
||||
orphaned_count++;
|
||||
}
|
||||
else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER && !target_cat)
|
||||
{
|
||||
LL_WARNS("Inventory") << "broken folder link " << item->getName() << " id " << item->getUUID() << LL_ENDL;
|
||||
orphaned++;
|
||||
orphaned_count++;
|
||||
}
|
||||
if (target_item && target_item->getIsLinkType())
|
||||
{
|
||||
|
|
@ -4291,13 +4319,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
if (is_automatic)
|
||||
{
|
||||
LL_WARNS("Inventory") << "Fatal inventory corruption: cannot create system folder of type " << ft << LL_ENDL;
|
||||
fatal_errs++;
|
||||
validation_info->mMissingRequiredSystemFolders.insert(folder_type);
|
||||
fatal_errs++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Can create, and will when needed.
|
||||
warnings++;
|
||||
// (Not sure this is really a warning, but worth logging)
|
||||
validation_info->mWarnings["missing_system_folder_can_create"]++;
|
||||
warning_count++;
|
||||
}
|
||||
}
|
||||
else if (count_under_root > 1)
|
||||
|
|
@ -4308,6 +4338,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
{
|
||||
// It is a fatal problem or can lead to fatal problems for COF,
|
||||
// outfits, trash and other non-automatic folders.
|
||||
validation_info->mFatalSystemDuplicate++;
|
||||
fatal_errs++;
|
||||
}
|
||||
else
|
||||
|
|
@ -4315,13 +4346,15 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
// For automatic folders it's not a fatal issue and shouldn't
|
||||
// break inventory or other functionality further
|
||||
// Exception: FT_SETTINGS is not automatic, but only deserves a warning.
|
||||
warnings++;
|
||||
validation_info->mWarnings["non_fatal_system_duplicate_under_root"]++;
|
||||
warning_count++;
|
||||
}
|
||||
}
|
||||
if (count_elsewhere > 0)
|
||||
{
|
||||
LL_WARNS("Inventory") << "Found " << count_elsewhere << " extra folders of type " << ft << " outside of root" << LL_ENDL;
|
||||
warnings++;
|
||||
validation_info->mWarnings["non_fatal_system_duplicate_elsewhere"]++;
|
||||
warning_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -4343,12 +4376,12 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
|
|||
|
||||
// FIXME need to fail login and tell user to retry, contact support if problem persists.
|
||||
bool valid = (fatal_errs == 0);
|
||||
LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatal_errs << ", warnings: " << warnings << ", valid: " << valid << LL_ENDL;
|
||||
LL_INFOS("Inventory") << "Validate done, fatal errors: " << fatal_errs << ", warnings: " << warning_count << ", valid: " << valid << LL_ENDL;
|
||||
|
||||
validation_info->mFatalErrorCount = fatal_errs;
|
||||
validation_info->mWarningCount = warnings;
|
||||
validation_info->mLoopCount = loops;
|
||||
validation_info->mOrphanedCount = orphaned;
|
||||
validation_info->mWarningCount = warning_count;
|
||||
validation_info->mLoopCount = loop_count;
|
||||
validation_info->mOrphanedCount = orphaned_count;
|
||||
|
||||
return validation_info;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,15 +65,19 @@ public:
|
|||
void toOstream(std::ostream& os) const;
|
||||
void asLLSD(LLSD& sd) const;
|
||||
|
||||
bool mInitialized{false};
|
||||
S32 mWarningCount{0};
|
||||
std::map<std::string,U32> mWarnings;
|
||||
|
||||
S32 mLoopCount{0}; // Presence of folders whose ancestors loop onto themselves
|
||||
S32 mOrphanedCount{0}; // Missing or orphaned items, links and folders
|
||||
|
||||
S32 mFatalErrorCount{0};
|
||||
bool mFatalNoRootFolder{false};
|
||||
S32 mFatalSystemDuplicate{0};
|
||||
bool mFatalNoLibraryRootFolder{false};
|
||||
bool mFatalQADebugMode{false};
|
||||
|
||||
S32 mFatalErrorCount;
|
||||
S32 mWarningCount;
|
||||
S32 mLoopCount; // Presence of folders whose ansestors loop onto themselves
|
||||
S32 mOrphanedCount; // Missing or orphaned items, links and folders
|
||||
bool mInitialized;
|
||||
bool mFatalNoRootFolder;
|
||||
bool mFatalNoLibraryRootFolder;
|
||||
bool mFatalQADebugMode;
|
||||
std::set<LLFolderType::EType> mMissingRequiredSystemFolders;
|
||||
std::set<LLFolderType::EType> mDuplicateRequiredSystemFolders;
|
||||
};
|
||||
|
|
@ -286,13 +290,13 @@ public:
|
|||
// Check if one object has a parent chain up to the category specified by UUID.
|
||||
BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const;
|
||||
|
||||
enum EAnscestorResult{
|
||||
ANSCESTOR_OK = 0,
|
||||
ANSCESTOR_MISSING = 1,
|
||||
ANSCESTOR_LOOP = 2,
|
||||
enum EAncestorResult{
|
||||
ANCESTOR_OK = 0,
|
||||
ANCESTOR_MISSING = 1,
|
||||
ANCESTOR_LOOP = 2,
|
||||
};
|
||||
// Follow parent chain to the top.
|
||||
EAnscestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
|
||||
EAncestorResult getObjectTopmostAncestor(const LLUUID& object_id, LLUUID& result) const;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Find
|
||||
|
|
|
|||
|
|
@ -109,6 +109,8 @@ public:
|
|||
LLLineEditor* getTextEntry() const { return mTextEntry; }
|
||||
void handleLoginComplete();
|
||||
|
||||
bool isNavMeshDirty() { return mIsNavMeshDirty; }
|
||||
|
||||
private:
|
||||
|
||||
enum EParcelIcon
|
||||
|
|
|
|||
|
|
@ -758,7 +758,14 @@ void LLMarketplaceData::initializeSLM(const status_updated_signal_t::slot_type&
|
|||
if (mMarketPlaceStatus != MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED)
|
||||
{
|
||||
// If already initialized, just confirm the status so the callback gets called
|
||||
setSLMStatus(mMarketPlaceStatus);
|
||||
if (mMarketPlaceFailureReason.empty())
|
||||
{
|
||||
setSLMStatus(mMarketPlaceStatus);
|
||||
}
|
||||
else
|
||||
{
|
||||
setSLMConnectionFailure(mMarketPlaceFailureReason);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -799,28 +806,27 @@ void LLMarketplaceData::getMerchantStatusCoro()
|
|||
if (httpCode == HTTP_NOT_FOUND)
|
||||
{
|
||||
log_SLM_infos("Get /merchant", httpCode, std::string("User is not a merchant"));
|
||||
setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT);
|
||||
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MERCHANT);
|
||||
}
|
||||
else if (httpCode == HTTP_SERVICE_UNAVAILABLE)
|
||||
{
|
||||
log_SLM_infos("Get /merchant", httpCode, std::string("Merchant is not migrated"));
|
||||
setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
|
||||
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_MIGRATED_MERCHANT);
|
||||
}
|
||||
else if (httpCode == HTTP_INTERNAL_ERROR)
|
||||
else
|
||||
{
|
||||
// 499 includes timeout and ssl error - marketplace is down or having issues, we do not show it in this request according to MAINT-5938
|
||||
LL_WARNS("SLM") << "SLM Merchant Request failed with status: " << httpCode
|
||||
<< ", reason : " << status.toString()
|
||||
<< ", code : " << result["error_code"].asString()
|
||||
<< ", description : " << result["error_description"].asString() << LL_ENDL;
|
||||
LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string err_code = result["error_code"].asString();
|
||||
//std::string err_description = result["error_description"].asString();
|
||||
log_SLM_warning("Get /merchant", httpCode, status.toString(), err_code, result["error_description"]);
|
||||
setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE);
|
||||
std::string reason = status.toString();
|
||||
if (reason.empty())
|
||||
{
|
||||
reason = result["error_code"].asString();
|
||||
}
|
||||
// Since user might not even have a marketplace, there is no reason to report the error
|
||||
// to the user, instead write it down into listings' floater
|
||||
LLMarketplaceData::instance().setSLMConnectionFailure(reason);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
@ -1298,6 +1304,17 @@ std::string LLMarketplaceData::getSLMConnectURL(const std::string& route)
|
|||
void LLMarketplaceData::setSLMStatus(U32 status)
|
||||
{
|
||||
mMarketPlaceStatus = status;
|
||||
mMarketPlaceFailureReason.clear();
|
||||
if (mStatusUpdatedSignal)
|
||||
{
|
||||
(*mStatusUpdatedSignal)();
|
||||
}
|
||||
}
|
||||
|
||||
void LLMarketplaceData::setSLMConnectionFailure(const std::string& reason)
|
||||
{
|
||||
mMarketPlaceStatus = MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE;
|
||||
mMarketPlaceFailureReason = reason;
|
||||
if (mStatusUpdatedSignal)
|
||||
{
|
||||
(*mStatusUpdatedSignal)();
|
||||
|
|
|
|||
|
|
@ -198,7 +198,9 @@ public:
|
|||
typedef boost::signals2::signal<void ()> status_updated_signal_t;
|
||||
void initializeSLM(const status_updated_signal_t::slot_type& cb);
|
||||
U32 getSLMStatus() const { return mMarketPlaceStatus; }
|
||||
std::string getSLMConnectionfailureReason() { return mMarketPlaceFailureReason; }
|
||||
void setSLMStatus(U32 status);
|
||||
void setSLMConnectionFailure(const std::string& reason);
|
||||
void getSLMListings();
|
||||
bool isEmpty() { return (mMarketplaceItems.size() == 0); }
|
||||
void setDataFetchedSignal(const status_updated_signal_t::slot_type& cb);
|
||||
|
|
@ -272,6 +274,7 @@ private:
|
|||
|
||||
// Handling Marketplace connection and inventory connection
|
||||
U32 mMarketPlaceStatus;
|
||||
std::string mMarketPlaceFailureReason;
|
||||
status_updated_signal_t* mStatusUpdatedSignal;
|
||||
LLInventoryObserver* mInventoryObserver;
|
||||
bool mDirtyCount; // If true, stock count value need to be updated at the next check
|
||||
|
|
|
|||
|
|
@ -154,8 +154,7 @@ void mark_dead_and_remove_if(T &c, const PredicateMatchRequest &matchPred)
|
|||
if (matchPred(*it))
|
||||
{
|
||||
(*it)->markDead();
|
||||
// *TDOO: When C++11 is in change the following line to: it = c.erase(it);
|
||||
c.erase(it++);
|
||||
it = c.erase(it);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -383,6 +383,9 @@ U32 LLMeshRepository::sLODPending = 0;
|
|||
|
||||
U32 LLMeshRepository::sCacheBytesRead = 0;
|
||||
U32 LLMeshRepository::sCacheBytesWritten = 0;
|
||||
U32 LLMeshRepository::sCacheBytesHeaders = 0;
|
||||
U32 LLMeshRepository::sCacheBytesSkins = 0;
|
||||
U32 LLMeshRepository::sCacheBytesDecomps = 0;
|
||||
U32 LLMeshRepository::sCacheReads = 0;
|
||||
U32 LLMeshRepository::sCacheWrites = 0;
|
||||
U32 LLMeshRepository::sMaxLockHoldoffs = 0;
|
||||
|
|
@ -1874,6 +1877,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes
|
|||
LLMutexLock lock(mHeaderMutex);
|
||||
mMeshHeaderSize[mesh_id] = header_size;
|
||||
mMeshHeader[mesh_id] = header;
|
||||
LLMeshRepository::sCacheBytesHeaders += header_size;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -3013,27 +3017,6 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
|
|||
return -1;
|
||||
}
|
||||
|
||||
void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
|
||||
{
|
||||
mThread->mMeshHeader[data.mUUID] = header;
|
||||
|
||||
// we cache the mesh for default parameters
|
||||
LLVolumeParams volume_params;
|
||||
volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
|
||||
volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH);
|
||||
|
||||
for (U32 i = 0; i < 4; i++)
|
||||
{
|
||||
if (data.mModel[i].notNull())
|
||||
{
|
||||
LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
|
||||
volume->copyVolumeFaces(data.mModel[i]);
|
||||
volume->setMeshAssetLoaded(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Handle failed or successful requests for mesh assets.
|
||||
//
|
||||
// Support for 200 responses was added for several reasons. One,
|
||||
|
|
@ -3951,6 +3934,8 @@ void LLMeshRepository::notifyLoadedMeshes()
|
|||
void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
|
||||
{
|
||||
mSkinMap[info.mMeshID] = info;
|
||||
// Alternative: We can get skin size from header
|
||||
sCacheBytesSkins += info.sizeBytes();
|
||||
|
||||
skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID);
|
||||
if (iter != mLoadingSkins.end())
|
||||
|
|
@ -3974,10 +3959,14 @@ void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decom
|
|||
{ //just insert decomp into map
|
||||
mDecompositionMap[decomp->mMeshID] = decomp;
|
||||
mLoadingDecompositions.erase(decomp->mMeshID);
|
||||
sCacheBytesDecomps += decomp->sizeBytes();
|
||||
}
|
||||
else
|
||||
{ //merge decomp with existing entry
|
||||
sCacheBytesDecomps -= iter->second->sizeBytes();
|
||||
iter->second->merge(decomp);
|
||||
sCacheBytesDecomps += iter->second->sizeBytes();
|
||||
|
||||
mLoadingDecompositions.erase(decomp->mMeshID);
|
||||
delete decomp;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -552,6 +552,9 @@ public:
|
|||
static U32 sLODProcessing;
|
||||
static U32 sCacheBytesRead;
|
||||
static U32 sCacheBytesWritten;
|
||||
static U32 sCacheBytesHeaders;
|
||||
static U32 sCacheBytesSkins;
|
||||
static U32 sCacheBytesDecomps;
|
||||
static U32 sCacheReads;
|
||||
static U32 sCacheWrites;
|
||||
static U32 sMaxLockHoldoffs; // Maximum sequential locking failures
|
||||
|
|
@ -641,8 +644,6 @@ public:
|
|||
std::queue<LLUUID> mPendingPhysicsShapeRequests;
|
||||
|
||||
U32 mMeshThreadCount;
|
||||
|
||||
void cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header);
|
||||
|
||||
LLMeshRepoThread* mThread;
|
||||
std::vector<LLMeshUploadThread*> mUploads;
|
||||
|
|
|
|||
|
|
@ -2755,7 +2755,6 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
|
|||
continue;
|
||||
}
|
||||
|
||||
LLModel* base_mdl = *base_iter;
|
||||
base_iter++;
|
||||
|
||||
S32 num_faces = mdl->getNumVolumeFaces();
|
||||
|
|
@ -2830,7 +2829,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
|
|||
//find closest weight to vf.mVertices[i].mPosition
|
||||
LLVector3 pos(vf.mPositions[i].getF32ptr());
|
||||
|
||||
const LLModel::weight_list& weight_list = base_mdl->getJointInfluences(pos);
|
||||
const LLModel::weight_list& weight_list = mdl->getJointInfluences(pos);
|
||||
llassert(weight_list.size()>0 && weight_list.size() <= 4); // LLModel::loadModel() should guarantee this
|
||||
|
||||
LLVector4 w(0, 0, 0, 0);
|
||||
|
|
@ -2957,6 +2956,20 @@ void LLModelPreview::loadedCallback(
|
|||
{
|
||||
pPreview->lookupLODModelFiles(lod);
|
||||
}
|
||||
|
||||
const LLVOAvatar* avatarp = pPreview->getPreviewAvatar();
|
||||
if (avatarp) { // set up ground plane for possible rendering
|
||||
const LLVector3 root_pos = avatarp->mRoot->getPosition();
|
||||
const LLVector4a* ext = avatarp->mDrawable->getSpatialExtents();
|
||||
const LLVector4a min = ext[0], max = ext[1];
|
||||
const F32 center = (max[2] - min[2]) * 0.5f;
|
||||
const F32 ground = root_pos[2] - center;
|
||||
auto plane = pPreview->mGroundPlane;
|
||||
plane[0] = {min[0], min[1], ground};
|
||||
plane[1] = {max[0], min[1], ground};
|
||||
plane[2] = {max[0], max[1], ground};
|
||||
plane[3] = {min[0], max[1], ground};
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -3164,6 +3177,9 @@ BOOL LLModelPreview::render()
|
|||
// (note: all these UI updates need to be somewhere that is not render)
|
||||
fmp->childSetValue("upload_skin", true);
|
||||
mFirstSkinUpdate = false;
|
||||
upload_skin = true;
|
||||
skin_weight = true;
|
||||
mViewOption["show_skin_weight"] = true;
|
||||
}
|
||||
|
||||
fmp->enableViewOption("show_skin_weight");
|
||||
|
|
@ -3768,6 +3784,7 @@ BOOL LLModelPreview::render()
|
|||
{
|
||||
getPreviewAvatar()->renderBones();
|
||||
}
|
||||
renderGroundPlane(mPelvisZOffset);
|
||||
if (shader)
|
||||
{
|
||||
shader->bind();
|
||||
|
|
@ -3789,6 +3806,28 @@ BOOL LLModelPreview::render()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void LLModelPreview::renderGroundPlane(float z_offset)
|
||||
{ // Not necesarilly general - beware - but it seems to meet the needs of LLModelPreview::render
|
||||
|
||||
gGL.diffuseColor3f( 1.0f, 0.0f, 1.0f );
|
||||
|
||||
gGL.begin(LLRender::LINES);
|
||||
gGL.vertex3fv(mGroundPlane[0].mV);
|
||||
gGL.vertex3fv(mGroundPlane[1].mV);
|
||||
|
||||
gGL.vertex3fv(mGroundPlane[1].mV);
|
||||
gGL.vertex3fv(mGroundPlane[2].mV);
|
||||
|
||||
gGL.vertex3fv(mGroundPlane[2].mV);
|
||||
gGL.vertex3fv(mGroundPlane[3].mV);
|
||||
|
||||
gGL.vertex3fv(mGroundPlane[3].mV);
|
||||
gGL.vertex3fv(mGroundPlane[0].mV);
|
||||
|
||||
gGL.end();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// refresh()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -224,6 +224,8 @@ private:
|
|||
LLVOAvatar* getPreviewAvatar(void) { return mPreviewAvatar; }
|
||||
// Count amount of original models, excluding sub-models
|
||||
static U32 countRootModels(LLModelLoader::model_list models);
|
||||
LLVector3 mGroundPlane[4];
|
||||
void renderGroundPlane(float z_offset = 0.0f);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
|
|
|||
|
|
@ -352,7 +352,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
|
|||
|
||||
void LLMuteList::updateAdd(const LLMute& mute)
|
||||
{
|
||||
// External mutes (e.g. Avaline callers) are local only, don't send them to the server.
|
||||
// External mutes are local only, don't send them to the server.
|
||||
if (mute.mType == LLMute::EXTERNAL)
|
||||
{
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -271,6 +271,25 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
|
|||
return handled;
|
||||
}
|
||||
|
||||
// virtual
|
||||
BOOL LLNameListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLNameListItem* hit_item = dynamic_cast<LLNameListItem*>(hitItem(x, y));
|
||||
LLFloater* floater = gFloaterView->getParentFloater(this);
|
||||
if (floater && floater->isFrontmost() && hit_item)
|
||||
{
|
||||
if(hit_item->isGroup())
|
||||
{
|
||||
ContextMenuType prev_menu = getContextMenuType();
|
||||
setContextMenu(MENU_GROUP);
|
||||
BOOL handled = LLScrollListCtrl::handleRightMouseDown(x, y, mask);
|
||||
setContextMenu(prev_menu);
|
||||
return handled;
|
||||
}
|
||||
}
|
||||
return LLScrollListCtrl::handleRightMouseDown(x, y, mask);
|
||||
}
|
||||
|
||||
// public
|
||||
void LLNameListCtrl::addGroupNameItem(const LLUUID& group_id, EAddPosition pos,
|
||||
BOOL enabled)
|
||||
|
|
|
|||
|
|
@ -170,6 +170,7 @@ public:
|
|||
/*virtual*/ void updateColumns(bool force_update);
|
||||
|
||||
/*virtual*/ void mouseOverHighlightNthItem( S32 index );
|
||||
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
|
||||
private:
|
||||
void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false);
|
||||
void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item);
|
||||
|
|
|
|||
|
|
@ -713,7 +713,7 @@ void LLNavigationBar::resizeLayoutPanel()
|
|||
}
|
||||
void LLNavigationBar::invokeSearch(std::string search_text)
|
||||
{
|
||||
LLFloaterReg::showInstance("search", LLSD().with("category", "all").with("query", LLSD(search_text)));
|
||||
LLFloaterReg::showInstance("search", LLSD().with("category", "standard").with("query", LLSD(search_text)));
|
||||
}
|
||||
|
||||
void LLNavigationBar::clearHistoryCache()
|
||||
|
|
@ -733,3 +733,8 @@ int LLNavigationBar::getDefFavBarHeight()
|
|||
{
|
||||
return mDefaultFpRect.getHeight();
|
||||
}
|
||||
|
||||
bool LLNavigationBar::isRebakeNavMeshAvailable()
|
||||
{
|
||||
return mCmbLocation->isNavMeshDirty();
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue