Merge remote-tracking branch 'Liru/master'
This commit is contained in:
@@ -182,9 +182,6 @@ LLAvatarAppearance::LLAvatarAppearance(LLWearableData* wearable_data) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
mIsBuilt = FALSE;
|
mIsBuilt = FALSE;
|
||||||
|
|
||||||
mNumCollisionVolumes = 0;
|
|
||||||
mCollisionVolumes = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// virtual
|
// virtual
|
||||||
@@ -294,7 +291,7 @@ LLAvatarAppearance::~LLAvatarAppearance()
|
|||||||
mJointMap.clear();
|
mJointMap.clear();
|
||||||
|
|
||||||
clearSkeleton();
|
clearSkeleton();
|
||||||
deleteAndClearArray(mCollisionVolumes);
|
clearCollisionVolumes();
|
||||||
|
|
||||||
std::for_each(mPolyMeshes.begin(), mPolyMeshes.end(), DeletePairedPointer());
|
std::for_each(mPolyMeshes.begin(), mPolyMeshes.end(), DeletePairedPointer());
|
||||||
mPolyMeshes.clear();
|
mPolyMeshes.clear();
|
||||||
@@ -575,12 +572,12 @@ BOOL LLAvatarAppearance::setupBone(const LLAvatarBoneInfo* info, LLJoint* parent
|
|||||||
}
|
}
|
||||||
else // collision volume
|
else // collision volume
|
||||||
{
|
{
|
||||||
if (volume_num >= (S32)mNumCollisionVolumes)
|
if (volume_num >= (S32)mCollisionVolumes.size())
|
||||||
{
|
{
|
||||||
llwarns << "Too many bones" << llendl;
|
llwarns << "Too many bones" << llendl;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
joint = (&mCollisionVolumes[volume_num]);
|
joint = (mCollisionVolumes[volume_num]);
|
||||||
joint->setName( info->mName );
|
joint->setName( info->mName );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1250,12 +1247,12 @@ LLVector3 LLAvatarAppearance::getVolumePos(S32 joint_index, LLVector3& volume_of
|
|||||||
return LLVector3::zero;
|
return LLVector3::zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (joint_index > mNumCollisionVolumes)
|
if (joint_index > (S32)mCollisionVolumes.size())
|
||||||
{
|
{
|
||||||
return LLVector3::zero;
|
return LLVector3::zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mCollisionVolumes[joint_index].getVolumePos(volume_offset);
|
return mCollisionVolumes[joint_index]->getVolumePos(volume_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1266,12 +1263,12 @@ LLJoint* LLAvatarAppearance::findCollisionVolume(U32 volume_id)
|
|||||||
//SNOW-488: As mNumCollisionVolumes is a S32 and we are casting from a U32 to a S32
|
//SNOW-488: As mNumCollisionVolumes is a S32 and we are casting from a U32 to a S32
|
||||||
//to compare we also need to be sure of the wrap around case producing (S32) <0
|
//to compare we also need to be sure of the wrap around case producing (S32) <0
|
||||||
//or in terms of the U32 an out of bounds index in the array.
|
//or in terms of the U32 an out of bounds index in the array.
|
||||||
if ((S32)volume_id > mNumCollisionVolumes || (S32)volume_id<0)
|
if ((S32)volume_id > (S32)mCollisionVolumes.size() || (S32)volume_id<0)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return &mCollisionVolumes[volume_id];
|
return mCollisionVolumes[volume_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1279,9 +1276,9 @@ LLJoint* LLAvatarAppearance::findCollisionVolume(U32 volume_id)
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
S32 LLAvatarAppearance::getCollisionVolumeID(std::string &name)
|
S32 LLAvatarAppearance::getCollisionVolumeID(std::string &name)
|
||||||
{
|
{
|
||||||
for (S32 i = 0; i < mNumCollisionVolumes; i++)
|
for (S32 i = 0; i < (S32)mCollisionVolumes.size(); i++)
|
||||||
{
|
{
|
||||||
if (mCollisionVolumes[i].getName() == name)
|
if (mCollisionVolumes[i]->getName() == name)
|
||||||
{
|
{
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@@ -1530,21 +1527,34 @@ LLTexLayerSet* LLAvatarAppearance::getAvatarLayerSet(EBakedTextureIndex baked_in
|
|||||||
return mBakedTextureDatas[baked_index].mTexLayerSet;
|
return mBakedTextureDatas[baked_index].mTexLayerSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LLAvatarAppearance::clearCollisionVolumes()
|
||||||
|
{
|
||||||
|
std::for_each(mCollisionVolumes.begin(), mCollisionVolumes.end(),
|
||||||
|
DeletePointer());
|
||||||
|
mCollisionVolumes.clear();
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// allocateCollisionVolumes()
|
// allocateCollisionVolumes()
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
BOOL LLAvatarAppearance::allocateCollisionVolumes( U32 num )
|
BOOL LLAvatarAppearance::allocateCollisionVolumes( U32 num )
|
||||||
{
|
{
|
||||||
deleteAndClearArray(mCollisionVolumes);
|
mCollisionVolumes.reserve(num);
|
||||||
mNumCollisionVolumes = 0;
|
|
||||||
|
|
||||||
mCollisionVolumes = new LLAvatarJointCollisionVolume[num];
|
LLAvatarJointCollisionVolume* cv;
|
||||||
if (!mCollisionVolumes)
|
for (U32 i = 0; i < num; ++i)
|
||||||
{
|
{
|
||||||
return FALSE;
|
cv = new LLAvatarJointCollisionVolume();
|
||||||
|
if (cv)
|
||||||
|
{
|
||||||
|
mCollisionVolumes.push_back(cv);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
clearCollisionVolumes();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mNumCollisionVolumes = num;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -337,9 +337,9 @@ protected:
|
|||||||
// Collision volumes
|
// Collision volumes
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
public:
|
public:
|
||||||
S32 mNumCollisionVolumes;
|
std::vector<LLAvatarJointCollisionVolume*> mCollisionVolumes;
|
||||||
LLAvatarJointCollisionVolume* mCollisionVolumes;
|
|
||||||
protected:
|
protected:
|
||||||
|
void clearCollisionVolumes();
|
||||||
BOOL allocateCollisionVolumes(U32 num);
|
BOOL allocateCollisionVolumes(U32 num);
|
||||||
|
|
||||||
/** Physics
|
/** Physics
|
||||||
|
|||||||
@@ -647,11 +647,11 @@ BOOL LLPolyMorphTarget::setInfo(LLPolyMorphTargetInfo* info)
|
|||||||
for (iter = getInfo()->mVolumeInfoList.begin(); iter != getInfo()->mVolumeInfoList.end(); iter++)
|
for (iter = getInfo()->mVolumeInfoList.begin(); iter != getInfo()->mVolumeInfoList.end(); iter++)
|
||||||
{
|
{
|
||||||
LLPolyVolumeMorphInfo *volume_info = &(*iter);
|
LLPolyVolumeMorphInfo *volume_info = &(*iter);
|
||||||
for (S32 i = 0; i < avatarp->mNumCollisionVolumes; i++)
|
for (S32 i = 0; i < (S32)avatarp->mCollisionVolumes.size(); i++)
|
||||||
{
|
{
|
||||||
if (avatarp->mCollisionVolumes[i].getName() == volume_info->mName)
|
if (avatarp->mCollisionVolumes[i]->getName() == volume_info->mName)
|
||||||
{
|
{
|
||||||
mVolumeMorphs.push_back(LLPolyVolumeMorph(&avatarp->mCollisionVolumes[i],
|
mVolumeMorphs.push_back(LLPolyVolumeMorph(avatarp->mCollisionVolumes[i],
|
||||||
volume_info->mScale,
|
volume_info->mScale,
|
||||||
volume_info->mPos));
|
volume_info->mPos));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ namespace
|
|||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LL_LINUX
|
||||||
std::string compute_CPUFamilyName(const char* cpu_vendor, int composed_family)
|
std::string compute_CPUFamilyName(const char* cpu_vendor, int composed_family)
|
||||||
{
|
{
|
||||||
const char* intel_string = "GenuineIntel";
|
const char* intel_string = "GenuineIntel";
|
||||||
@@ -221,6 +222,7 @@ namespace
|
|||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
std::string compute_CPUFamilyName(const char* cpu_vendor, int family, int ext_family)
|
std::string compute_CPUFamilyName(const char* cpu_vendor, int family, int ext_family)
|
||||||
{
|
{
|
||||||
const char* intel_string = "GenuineIntel";
|
const char* intel_string = "GenuineIntel";
|
||||||
@@ -239,6 +241,7 @@ namespace
|
|||||||
}
|
}
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // end unnamed namespace
|
} // end unnamed namespace
|
||||||
|
|
||||||
|
|||||||
@@ -905,7 +905,6 @@ AIHTTPTimeoutPolicy const* AIHTTPTimeoutPolicy::getTimeoutPolicyByName(std::stri
|
|||||||
#define P2(n, b) AIHTTPTimeoutPolicy n##_timeout(#n, b)
|
#define P2(n, b) AIHTTPTimeoutPolicy n##_timeout(#n, b)
|
||||||
|
|
||||||
// Policy name Policy
|
// Policy name Policy
|
||||||
P(assetUploadResponder);
|
|
||||||
P(assetReportHandler);
|
P(assetReportHandler);
|
||||||
P(avatarPickerResponder);
|
P(avatarPickerResponder);
|
||||||
P(authHandler);
|
P(authHandler);
|
||||||
@@ -952,7 +951,6 @@ P2(meshPhysicsShapeResponder, connect_30s);
|
|||||||
P2(meshSkinInfoResponder, connect_30s);
|
P2(meshSkinInfoResponder, connect_30s);
|
||||||
P(mimeDiscoveryResponder);
|
P(mimeDiscoveryResponder);
|
||||||
P(moderationResponder);
|
P(moderationResponder);
|
||||||
P(newAgentInventoryVariablePriceResponder);
|
|
||||||
P(objectCostResponder);
|
P(objectCostResponder);
|
||||||
P(physicsFlagsResponder);
|
P(physicsFlagsResponder);
|
||||||
P(productInfoRequestResponder);
|
P(productInfoRequestResponder);
|
||||||
|
|||||||
@@ -7735,6 +7735,17 @@ This should be as low as possible, but too low may break functionality</string>
|
|||||||
<key>Value</key>
|
<key>Value</key>
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</map>
|
</map>
|
||||||
|
<key>RadarAlertShowDist</key>
|
||||||
|
<map>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string>Show distance in radar announcements.</string>
|
||||||
|
<key>Persist</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>Boolean</string>
|
||||||
|
<key>Value</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</map>
|
||||||
<key>RadarAlertSim</key>
|
<key>RadarAlertSim</key>
|
||||||
<map>
|
<map>
|
||||||
<key>Comment</key>
|
<key>Comment</key>
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "llagent.h"
|
#include "llagent.h"
|
||||||
#include "llcompilequeue.h"
|
#include "llcompilequeue.h"
|
||||||
#include "llfloaterbuycurrency.h"
|
#include "llfloaterbuycurrency.h"
|
||||||
|
#include "statemachine/aifilepicker.h"
|
||||||
#include "llinventorydefines.h"
|
#include "llinventorydefines.h"
|
||||||
#include "llinventoryobserver.h"
|
#include "llinventoryobserver.h"
|
||||||
#include "llinventorypanel.h"
|
#include "llinventorypanel.h"
|
||||||
@@ -66,8 +67,6 @@
|
|||||||
#include "llsdutil.h"
|
#include "llsdutil.h"
|
||||||
#include "llvfs.h"
|
#include "llvfs.h"
|
||||||
|
|
||||||
#include "statemachine/aifilepicker.h"
|
|
||||||
|
|
||||||
// When uploading multiple files, don't display any of them when uploading more than this number.
|
// When uploading multiple files, don't display any of them when uploading more than this number.
|
||||||
static const S32 FILE_COUNT_DISPLAY_THRESHOLD = 5;
|
static const S32 FILE_COUNT_DISPLAY_THRESHOLD = 5;
|
||||||
|
|
||||||
@@ -190,7 +189,8 @@ void on_new_single_inventory_upload_complete(
|
|||||||
LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
|
LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data,
|
||||||
const LLUUID& vfile_id,
|
const LLUUID& vfile_id,
|
||||||
LLAssetType::EType asset_type)
|
LLAssetType::EType asset_type)
|
||||||
: mPostData(post_data),
|
:
|
||||||
|
mPostData(post_data),
|
||||||
mVFileID(vfile_id),
|
mVFileID(vfile_id),
|
||||||
mAssetType(asset_type)
|
mAssetType(asset_type)
|
||||||
{
|
{
|
||||||
@@ -207,7 +207,8 @@ LLAssetUploadResponder::LLAssetUploadResponder(
|
|||||||
const LLSD &post_data,
|
const LLSD &post_data,
|
||||||
const std::string& file_name,
|
const std::string& file_name,
|
||||||
LLAssetType::EType asset_type)
|
LLAssetType::EType asset_type)
|
||||||
: mPostData(post_data),
|
:
|
||||||
|
mPostData(post_data),
|
||||||
mFileName(file_name),
|
mFileName(file_name),
|
||||||
mAssetType(asset_type)
|
mAssetType(asset_type)
|
||||||
{
|
{
|
||||||
@@ -223,7 +224,7 @@ LLAssetUploadResponder::~LLAssetUploadResponder()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// virtual
|
// virtual
|
||||||
void LLAssetUploadResponder::httpFailure(void)
|
void LLAssetUploadResponder::httpFailure()
|
||||||
{
|
{
|
||||||
llinfos << "LLAssetUploadResponder::error " << mStatus
|
llinfos << "LLAssetUploadResponder::error " << mStatus
|
||||||
<< " reason: " << mReason << llendl;
|
<< " reason: " << mReason << llendl;
|
||||||
@@ -248,15 +249,21 @@ void LLAssetUploadResponder::httpFailure(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//virtual
|
//virtual
|
||||||
void LLAssetUploadResponder::httpSuccess(void)
|
void LLAssetUploadResponder::httpSuccess()
|
||||||
{
|
{
|
||||||
|
const LLSD& content = getContent();
|
||||||
|
if (!content.isMap())
|
||||||
|
{
|
||||||
|
failureResult(HTTP_INTERNAL_ERROR_OTHER, "Malformed response contents", content);
|
||||||
|
return;
|
||||||
|
}
|
||||||
lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl;
|
lldebugs << "LLAssetUploadResponder::result from capabilities" << llendl;
|
||||||
|
|
||||||
std::string state = mContent["state"];
|
const std::string& state = content["state"].asString();
|
||||||
|
|
||||||
if (state == "upload")
|
if (state == "upload")
|
||||||
{
|
{
|
||||||
uploadUpload(mContent);
|
uploadUpload(content);
|
||||||
}
|
}
|
||||||
else if (state == "complete")
|
else if (state == "complete")
|
||||||
{
|
{
|
||||||
@@ -264,20 +271,20 @@ void LLAssetUploadResponder::httpSuccess(void)
|
|||||||
if (mFileName.empty())
|
if (mFileName.empty())
|
||||||
{
|
{
|
||||||
// rename the file in the VFS to the actual asset id
|
// rename the file in the VFS to the actual asset id
|
||||||
// llinfos << "Changing uploaded asset UUID to " << mContent["new_asset"].asUUID() << llendl;
|
// LL_INFOS() << "Changing uploaded asset UUID to " << content["new_asset"].asUUID() << LL_ENDL;
|
||||||
gVFS->renameFile(mVFileID, mAssetType, mContent["new_asset"].asUUID(), mAssetType);
|
gVFS->renameFile(mVFileID, mAssetType, content["new_asset"].asUUID(), mAssetType);
|
||||||
}
|
}
|
||||||
uploadComplete(mContent);
|
uploadComplete(content);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uploadFailure(mContent);
|
uploadFailure(content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLAssetUploadResponder::uploadUpload(const LLSD& content)
|
void LLAssetUploadResponder::uploadUpload(const LLSD& content)
|
||||||
{
|
{
|
||||||
std::string uploader = content["uploader"];
|
const std::string& uploader = content["uploader"].asString();
|
||||||
if (mFileName.empty())
|
if (mFileName.empty())
|
||||||
{
|
{
|
||||||
LLHTTPClient::postFile(uploader, mVFileID, mAssetType, this);
|
LLHTTPClient::postFile(uploader, mVFileID, mAssetType, this);
|
||||||
@@ -293,7 +300,7 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)
|
|||||||
// remove the "Uploading..." message
|
// remove the "Uploading..." message
|
||||||
LLUploadDialog::modalUploadFinished();
|
LLUploadDialog::modalUploadFinished();
|
||||||
|
|
||||||
std::string reason = content["state"];
|
const std::string& reason = content["state"].asString();
|
||||||
// deal with L$ errors
|
// deal with L$ errors
|
||||||
if (reason == "insufficient funds")
|
if (reason == "insufficient funds")
|
||||||
{
|
{
|
||||||
@@ -316,10 +323,8 @@ void LLAssetUploadResponder::uploadComplete(const LLSD& content)
|
|||||||
LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
|
LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
|
||||||
const LLSD& post_data,
|
const LLSD& post_data,
|
||||||
const LLUUID& vfile_id,
|
const LLUUID& vfile_id,
|
||||||
LLAssetType::EType asset_type,
|
LLAssetType::EType asset_type)
|
||||||
void (*callback)(bool, void*),
|
: LLAssetUploadResponder(post_data, vfile_id, asset_type)
|
||||||
void* user_data)
|
|
||||||
: LLAssetUploadResponder(post_data, vfile_id, asset_type), mCallBack(callback), mUserData(user_data)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,17 +332,13 @@ LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(
|
|||||||
const LLSD& post_data,
|
const LLSD& post_data,
|
||||||
const std::string& file_name,
|
const std::string& file_name,
|
||||||
LLAssetType::EType asset_type)
|
LLAssetType::EType asset_type)
|
||||||
: LLAssetUploadResponder(post_data, file_name, asset_type), mCallBack(NULL), mUserData(NULL)
|
: LLAssetUploadResponder(post_data, file_name, asset_type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
// virtual
|
// virtual
|
||||||
void LLNewAgentInventoryResponder::httpFailure(void)
|
void LLNewAgentInventoryResponder::httpFailure()
|
||||||
{
|
{
|
||||||
if (mCallBack)
|
|
||||||
{
|
|
||||||
(*mCallBack)(false, mUserData);
|
|
||||||
}
|
|
||||||
LLAssetUploadResponder::httpFailure();
|
LLAssetUploadResponder::httpFailure();
|
||||||
//LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE);
|
//LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, LLUUID(), FALSE);
|
||||||
}
|
}
|
||||||
@@ -346,10 +347,6 @@ void LLNewAgentInventoryResponder::httpFailure(void)
|
|||||||
//virtual
|
//virtual
|
||||||
void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content)
|
void LLNewAgentInventoryResponder::uploadFailure(const LLSD& content)
|
||||||
{
|
{
|
||||||
if (mCallBack)
|
|
||||||
{
|
|
||||||
(*mCallBack)(false, mUserData);
|
|
||||||
}
|
|
||||||
LLAssetUploadResponder::uploadFailure(content);
|
LLAssetUploadResponder::uploadFailure(content);
|
||||||
|
|
||||||
//LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE);
|
//LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], FALSE);
|
||||||
@@ -360,14 +357,9 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
|
|||||||
{
|
{
|
||||||
lldebugs << "LLNewAgentInventoryResponder::result from capabilities" << llendl;
|
lldebugs << "LLNewAgentInventoryResponder::result from capabilities" << llendl;
|
||||||
|
|
||||||
if (mCallBack)
|
|
||||||
{
|
|
||||||
(*mCallBack)(true, mUserData);
|
|
||||||
}
|
|
||||||
|
|
||||||
//std::ostringstream llsdxml;
|
//std::ostringstream llsdxml;
|
||||||
//LLSDSerialize::toXML(content, llsdxml);
|
//LLSDSerialize::toXML(content, llsdxml);
|
||||||
//llinfos << "upload complete content:\n " << llsdxml.str() << llendl;
|
//LL_INFOS() << "upload complete content:\n " << llsdxml.str() << LL_ENDL;
|
||||||
|
|
||||||
LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString());
|
LLAssetType::EType asset_type = LLAssetType::lookup(mPostData["asset_type"].asString());
|
||||||
LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString());
|
LLInventoryType::EType inventory_type = LLInventoryType::lookup(mPostData["inventory_type"].asString());
|
||||||
@@ -456,57 +448,6 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data,
|
|
||||||
const LLUUID& vfile_id,
|
|
||||||
LLAssetType::EType asset_type,
|
|
||||||
LLBakedUploadData * baked_upload_data) :
|
|
||||||
LLAssetUploadResponder(post_data, vfile_id, asset_type),
|
|
||||||
mBakedUploadData(baked_upload_data)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
LLSendTexLayerResponder::~LLSendTexLayerResponder()
|
|
||||||
{
|
|
||||||
// mBakedUploadData is normally deleted by calls to LLViewerTexLayerSetBuffer::onTextureUploadComplete() below
|
|
||||||
if (mBakedUploadData)
|
|
||||||
{ // ...but delete it in the case where uploadComplete() is never called
|
|
||||||
delete mBakedUploadData;
|
|
||||||
mBakedUploadData = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Baked texture upload completed
|
|
||||||
void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
|
|
||||||
{
|
|
||||||
LLUUID item_id = mPostData["item_id"];
|
|
||||||
|
|
||||||
std::string result = content["state"];
|
|
||||||
LLUUID new_id = content["new_asset"];
|
|
||||||
|
|
||||||
llinfos << "result: " << result << " new_id: " << new_id << llendl;
|
|
||||||
if (result == "complete"
|
|
||||||
&& mBakedUploadData != NULL)
|
|
||||||
{ // Invoke
|
|
||||||
LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, 0, LL_EXSTAT_NONE);
|
|
||||||
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ // Invoke the original callback with an error result
|
|
||||||
LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
|
|
||||||
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void LLSendTexLayerResponder::httpFailure(void)
|
|
||||||
{
|
|
||||||
llinfos << "status: " << mStatus << " reason: " << mReason << llendl;
|
|
||||||
|
|
||||||
// Invoke the original callback with an error result
|
|
||||||
LLViewerTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
|
|
||||||
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
|
|
||||||
}
|
|
||||||
|
|
||||||
LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
|
LLUpdateAgentInventoryResponder::LLUpdateAgentInventoryResponder(
|
||||||
const LLSD& post_data,
|
const LLSD& post_data,
|
||||||
const LLUUID& vfile_id,
|
const LLUUID& vfile_id,
|
||||||
@@ -533,7 +474,7 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
|
|||||||
if(!item)
|
if(!item)
|
||||||
{
|
{
|
||||||
llwarns << "Inventory item for " << mVFileID
|
llwarns << "Inventory item for " << mVFileID
|
||||||
<< " is no longer in agent inventory." << llendl;
|
<< " is no longer in agent inventory." << LL_ENDL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -544,7 +485,7 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
|
|||||||
gInventory.notifyObservers();
|
gInventory.notifyObservers();
|
||||||
|
|
||||||
llinfos << "Inventory item " << item->getName() << " saved into "
|
llinfos << "Inventory item " << item->getName() << " saved into "
|
||||||
<< content["new_asset"].asString() << llendl;
|
<< content["new_asset"].asString() << LL_ENDL;
|
||||||
|
|
||||||
LLInventoryType::EType inventory_type = new_item->getInventoryType();
|
LLInventoryType::EType inventory_type = new_item->getInventoryType();
|
||||||
switch(inventory_type)
|
switch(inventory_type)
|
||||||
@@ -605,6 +546,7 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
|
|||||||
{
|
{
|
||||||
previewp->onUpdateSucceeded();
|
previewp->onUpdateSucceeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LLInventoryType::IT_WEARABLE:
|
case LLInventoryType::IT_WEARABLE:
|
||||||
@@ -650,8 +592,7 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
|
|||||||
case LLAssetType::AT_NOTECARD:
|
case LLAssetType::AT_NOTECARD:
|
||||||
{
|
{
|
||||||
// Update the UI with the new asset.
|
// Update the UI with the new asset.
|
||||||
LLPreviewNotecard* nc;
|
LLPreviewNotecard* nc = (LLPreviewNotecard*)LLPreview::find(item_id);
|
||||||
nc = (LLPreviewNotecard*)LLPreview::find(item_id);
|
|
||||||
if (nc)
|
if (nc)
|
||||||
{
|
{
|
||||||
// *HACK: we have to delete the asset in the VFS so
|
// *HACK: we have to delete the asset in the VFS so
|
||||||
@@ -674,8 +615,7 @@ void LLUpdateTaskInventoryResponder::uploadComplete(const LLSD& content)
|
|||||||
{
|
{
|
||||||
if (mQueueId.notNull())
|
if (mQueueId.notNull())
|
||||||
{
|
{
|
||||||
LLFloaterCompileQueue* queue =
|
LLFloaterCompileQueue* queue = (LLFloaterCompileQueue*) LLFloaterScriptQueue::findInstance(mQueueId);
|
||||||
(LLFloaterCompileQueue*) LLFloaterScriptQueue::findInstance(mQueueId);
|
|
||||||
if (NULL != queue)
|
if (NULL != queue)
|
||||||
{
|
{
|
||||||
queue->removeItemByItemID(item_id);
|
queue->removeItemByItemID(item_id);
|
||||||
@@ -724,7 +664,7 @@ public:
|
|||||||
{
|
{
|
||||||
llwarns
|
llwarns
|
||||||
<< "LLAssetUploadResponder called with nonexistant "
|
<< "LLAssetUploadResponder called with nonexistant "
|
||||||
<< "vfile_id " << vfile_id << llendl;
|
<< "vfile_id " << vfile_id << LL_ENDL;
|
||||||
mVFileID.setNull();
|
mVFileID.setNull();
|
||||||
mAssetType = LLAssetType::AT_NONE;
|
mAssetType = LLAssetType::AT_NONE;
|
||||||
}
|
}
|
||||||
@@ -1020,17 +960,15 @@ LLNewAgentInventoryVariablePriceResponder::~LLNewAgentInventoryVariablePriceResp
|
|||||||
delete mImpl;
|
delete mImpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLNewAgentInventoryVariablePriceResponder::httpFailure(void)
|
void LLNewAgentInventoryVariablePriceResponder::httpFailure()
|
||||||
{
|
{
|
||||||
lldebugs
|
const LLSD& content = getContent();
|
||||||
<< "LLNewAgentInventoryVariablePrice::error " << mStatus
|
LL_WARNS("Upload") << dumpResponse() << LL_ENDL;
|
||||||
<< " reason: " << mReason << llendl;
|
|
||||||
|
|
||||||
if ( mContent.has("error") )
|
|
||||||
{
|
|
||||||
static const std::string _ERROR = "error";
|
static const std::string _ERROR = "error";
|
||||||
|
if ( content.has(_ERROR) )
|
||||||
mImpl->onTransportError(mContent[_ERROR]);
|
{
|
||||||
|
mImpl->onTransportError(content[_ERROR]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1038,8 +976,14 @@ void LLNewAgentInventoryVariablePriceResponder::httpFailure(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
|
void LLNewAgentInventoryVariablePriceResponder::httpSuccess()
|
||||||
{
|
{
|
||||||
|
const LLSD& content = getContent();
|
||||||
|
if (!content.isMap())
|
||||||
|
{
|
||||||
|
failureResult(HTTP_INTERNAL_ERROR_OTHER, "Malformed response contents", content);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Parse out application level errors and the appropriate
|
// Parse out application level errors and the appropriate
|
||||||
// responses for them
|
// responses for them
|
||||||
static const std::string _ERROR = "error";
|
static const std::string _ERROR = "error";
|
||||||
@@ -1053,13 +997,14 @@ void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
|
|||||||
static const std::string _RSVP = "rsvp";
|
static const std::string _RSVP = "rsvp";
|
||||||
|
|
||||||
// Check for application level errors
|
// Check for application level errors
|
||||||
if (mContent.has(_ERROR))
|
if ( content.has(_ERROR) )
|
||||||
{
|
{
|
||||||
onApplicationLevelError(mContent[_ERROR]);
|
LL_WARNS("Upload") << dumpResponse() << LL_ENDL;
|
||||||
|
onApplicationLevelError(content[_ERROR]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string state = mContent[_STATE];
|
std::string state = content[_STATE];
|
||||||
LLAssetType::EType asset_type = mImpl->getAssetType();
|
LLAssetType::EType asset_type = mImpl->getAssetType();
|
||||||
|
|
||||||
if (_COMPLETE == state)
|
if (_COMPLETE == state)
|
||||||
@@ -1068,11 +1013,11 @@ void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
|
|||||||
if (mImpl->getFilename().empty())
|
if (mImpl->getFilename().empty())
|
||||||
{
|
{
|
||||||
// rename the file in the VFS to the actual asset id
|
// rename the file in the VFS to the actual asset id
|
||||||
// llinfos << "Changing uploaded asset UUID to " << mContent["new_asset"].asUUID() << llendl;
|
// LL_INFOS() << "Changing uploaded asset UUID to " << content["new_asset"].asUUID() << LL_ENDL;
|
||||||
gVFS->renameFile(
|
gVFS->renameFile(
|
||||||
mImpl->getVFileID(),
|
mImpl->getVFileID(),
|
||||||
asset_type,
|
asset_type,
|
||||||
mContent["new_asset"].asUUID(),
|
content["new_asset"].asUUID(),
|
||||||
asset_type);
|
asset_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1083,8 +1028,8 @@ void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
|
|||||||
mImpl->getFolderID(),
|
mImpl->getFolderID(),
|
||||||
mImpl->getItemName(),
|
mImpl->getItemName(),
|
||||||
mImpl->getItemDescription(),
|
mImpl->getItemDescription(),
|
||||||
mContent,
|
content,
|
||||||
mContent[_UPLOAD_PRICE].asInteger());
|
content[_UPLOAD_PRICE].asInteger());
|
||||||
|
|
||||||
// TODO* Add bulk (serial) uploading or add
|
// TODO* Add bulk (serial) uploading or add
|
||||||
// a super class of this that does so
|
// a super class of this that does so
|
||||||
@@ -1092,12 +1037,13 @@ void LLNewAgentInventoryVariablePriceResponder::httpSuccess(void)
|
|||||||
else if ( _CONFIRM_UPLOAD == state )
|
else if ( _CONFIRM_UPLOAD == state )
|
||||||
{
|
{
|
||||||
showConfirmationDialog(
|
showConfirmationDialog(
|
||||||
mContent[_UPLOAD_PRICE].asInteger(),
|
content[_UPLOAD_PRICE].asInteger(),
|
||||||
mContent[_RESOURCE_COST].asInteger(),
|
content[_RESOURCE_COST].asInteger(),
|
||||||
mContent[_RSVP].asString());
|
content[_RSVP].asString());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
LL_WARNS("Upload") << dumpResponse() << LL_ENDL;
|
||||||
onApplicationLevelError("");
|
onApplicationLevelError("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1170,3 +1116,4 @@ void LLNewAgentInventoryVariablePriceResponder::showConfirmationDialog(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,10 +36,6 @@
|
|||||||
#include "llhttpclient.h"
|
#include "llhttpclient.h"
|
||||||
#include "llinventory.h"
|
#include "llinventory.h"
|
||||||
|
|
||||||
class AIHTTPTimeoutPolicy;
|
|
||||||
extern AIHTTPTimeoutPolicy assetUploadResponder_timeout;
|
|
||||||
extern AIHTTPTimeoutPolicy newAgentInventoryVariablePriceResponder_timeout;
|
|
||||||
|
|
||||||
void on_new_single_inventory_upload_complete(LLAssetType::EType asset_type,
|
void on_new_single_inventory_upload_complete(LLAssetType::EType asset_type,
|
||||||
LLInventoryType::EType inventory_type,
|
LLInventoryType::EType inventory_type,
|
||||||
const std::string inventory_type_string,
|
const std::string inventory_type_string,
|
||||||
@@ -53,6 +49,8 @@ void on_new_single_inventory_upload_complete(LLAssetType::EType asset_type,
|
|||||||
// via capabilities
|
// via capabilities
|
||||||
class LLAssetUploadResponder : public LLHTTPClient::ResponderWithResult
|
class LLAssetUploadResponder : public LLHTTPClient::ResponderWithResult
|
||||||
{
|
{
|
||||||
|
protected:
|
||||||
|
LOG_CLASS(LLAssetUploadResponder);
|
||||||
public:
|
public:
|
||||||
LLAssetUploadResponder(const LLSD& post_data,
|
LLAssetUploadResponder(const LLSD& post_data,
|
||||||
const LLUUID& vfile_id,
|
const LLUUID& vfile_id,
|
||||||
@@ -61,10 +59,12 @@ public:
|
|||||||
const std::string& file_name,
|
const std::string& file_name,
|
||||||
LLAssetType::EType asset_type);
|
LLAssetType::EType asset_type);
|
||||||
~LLAssetUploadResponder();
|
~LLAssetUploadResponder();
|
||||||
/*virtual*/ void httpFailure(void);
|
|
||||||
/*virtual*/ void httpSuccess(void);
|
|
||||||
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return assetUploadResponder_timeout; }
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void httpFailure();
|
||||||
|
virtual void httpSuccess();
|
||||||
|
|
||||||
|
public:
|
||||||
virtual void uploadUpload(const LLSD& content);
|
virtual void uploadUpload(const LLSD& content);
|
||||||
virtual void uploadComplete(const LLSD& content);
|
virtual void uploadComplete(const LLSD& content);
|
||||||
virtual void uploadFailure(const LLSD& content);
|
virtual void uploadFailure(const LLSD& content);
|
||||||
@@ -76,25 +76,24 @@ protected:
|
|||||||
std::string mFileName;
|
std::string mFileName;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TODO*: Remove this once deprecated
|
||||||
class LLNewAgentInventoryResponder : public LLAssetUploadResponder
|
class LLNewAgentInventoryResponder : public LLAssetUploadResponder
|
||||||
{
|
{
|
||||||
void (*mCallBack)(bool, void*);
|
LOG_CLASS(LLNewAgentInventoryResponder);
|
||||||
void* mUserData;
|
|
||||||
public:
|
public:
|
||||||
LLNewAgentInventoryResponder(
|
LLNewAgentInventoryResponder(
|
||||||
const LLSD& post_data,
|
const LLSD& post_data,
|
||||||
const LLUUID& vfile_id,
|
const LLUUID& vfile_id,
|
||||||
LLAssetType::EType asset_type,
|
LLAssetType::EType asset_type);
|
||||||
void (*callback)(bool, void*) = NULL,
|
|
||||||
void* user_data = NULL);
|
|
||||||
LLNewAgentInventoryResponder(
|
LLNewAgentInventoryResponder(
|
||||||
const LLSD& post_data,
|
const LLSD& post_data,
|
||||||
const std::string& file_name,
|
const std::string& file_name,
|
||||||
LLAssetType::EType asset_type);
|
LLAssetType::EType asset_type);
|
||||||
/*virtual*/ void httpFailure(void);
|
|
||||||
virtual void uploadComplete(const LLSD& content);
|
virtual void uploadComplete(const LLSD& content);
|
||||||
virtual void uploadFailure(const LLSD& content);
|
virtual void uploadFailure(const LLSD& content);
|
||||||
/*virtual*/ char const* getName(void) const { return "LLNewAgentInventoryResponder"; }
|
/*virtual*/ char const* getName() const { return "LLNewAgentInventoryResponder"; }
|
||||||
|
protected:
|
||||||
|
virtual void httpFailure();
|
||||||
};
|
};
|
||||||
|
|
||||||
// A base class which goes through and performs some default
|
// A base class which goes through and performs some default
|
||||||
@@ -104,6 +103,7 @@ public:
|
|||||||
class LLNewAgentInventoryVariablePriceResponder :
|
class LLNewAgentInventoryVariablePriceResponder :
|
||||||
public LLHTTPClient::ResponderWithResult
|
public LLHTTPClient::ResponderWithResult
|
||||||
{
|
{
|
||||||
|
LOG_CLASS(LLNewAgentInventoryVariablePriceResponder);
|
||||||
public:
|
public:
|
||||||
LLNewAgentInventoryVariablePriceResponder(
|
LLNewAgentInventoryVariablePriceResponder(
|
||||||
const LLUUID& vfile_id,
|
const LLUUID& vfile_id,
|
||||||
@@ -116,10 +116,11 @@ public:
|
|||||||
const LLSD& inventory_info);
|
const LLSD& inventory_info);
|
||||||
virtual ~LLNewAgentInventoryVariablePriceResponder();
|
virtual ~LLNewAgentInventoryVariablePriceResponder();
|
||||||
|
|
||||||
/*virtual*/ void httpFailure(void);
|
private:
|
||||||
/*virtual*/ void httpSuccess(void);
|
/* virtual */ void httpFailure();
|
||||||
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return newAgentInventoryVariablePriceResponder_timeout; }
|
/* virtual */ void httpSuccess();
|
||||||
|
|
||||||
|
public:
|
||||||
virtual void onApplicationLevelError(
|
virtual void onApplicationLevelError(
|
||||||
const LLSD& error);
|
const LLSD& error);
|
||||||
virtual void showConfirmationDialog(
|
virtual void showConfirmationDialog(
|
||||||
@@ -132,25 +133,6 @@ private:
|
|||||||
Impl* mImpl;
|
Impl* mImpl;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LLBakedUploadData;
|
|
||||||
class LLSendTexLayerResponder : public LLAssetUploadResponder
|
|
||||||
{
|
|
||||||
LOG_CLASS(LLSendTexLayerResponder);
|
|
||||||
public:
|
|
||||||
LLSendTexLayerResponder(const LLSD& post_data,
|
|
||||||
const LLUUID& vfile_id,
|
|
||||||
LLAssetType::EType asset_type,
|
|
||||||
LLBakedUploadData * baked_upload_data);
|
|
||||||
|
|
||||||
~LLSendTexLayerResponder();
|
|
||||||
|
|
||||||
/*virtual*/ void uploadComplete(const LLSD& content);
|
|
||||||
/*virtual*/ void httpFailure(void);
|
|
||||||
/*virtual*/ char const* getName(void) const { return "LLSendTexLayerResponder"; }
|
|
||||||
|
|
||||||
LLBakedUploadData * mBakedUploadData;
|
|
||||||
};
|
|
||||||
|
|
||||||
class LLUpdateAgentInventoryResponder : public LLAssetUploadResponder
|
class LLUpdateAgentInventoryResponder : public LLAssetUploadResponder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -161,7 +143,7 @@ public:
|
|||||||
const std::string& file_name,
|
const std::string& file_name,
|
||||||
LLAssetType::EType asset_type);
|
LLAssetType::EType asset_type);
|
||||||
virtual void uploadComplete(const LLSD& content);
|
virtual void uploadComplete(const LLSD& content);
|
||||||
/*virtual*/ char const* getName(void) const { return "LLUpdateAgentInventoryResponder"; }
|
/*virtual*/ char const* getName() const { return "LLUpdateAgentInventoryResponder"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class LLUpdateTaskInventoryResponder : public LLAssetUploadResponder
|
class LLUpdateTaskInventoryResponder : public LLAssetUploadResponder
|
||||||
@@ -179,7 +161,7 @@ public:
|
|||||||
LLAssetType::EType asset_type);
|
LLAssetType::EType asset_type);
|
||||||
|
|
||||||
virtual void uploadComplete(const LLSD& content);
|
virtual void uploadComplete(const LLSD& content);
|
||||||
/*virtual*/ char const* getName(void) const { return "LLUpdateTaskInventoryResponder"; }
|
/*virtual*/ char const* getName() const { return "LLUpdateTaskInventoryResponder"; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LLUUID mQueueId;
|
LLUUID mQueueId;
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ extern U32 gFrameCount;
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
void chat_avatar_status(const std::string& name, const LLUUID& key, ERadarStatType type, bool entering)
|
void chat_avatar_status(const std::string& name, const LLUUID& key, ERadarStatType type, bool entering, const F32& dist)
|
||||||
{
|
{
|
||||||
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) return; // RLVa:LF Don't announce people are around when blind, that cheats the system.
|
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) return; // RLVa:LF Don't announce people are around when blind, that cheats the system.
|
||||||
static LLCachedControl<bool> radar_chat_alerts(gSavedSettings, "RadarChatAlerts");
|
static LLCachedControl<bool> radar_chat_alerts(gSavedSettings, "RadarChatAlerts");
|
||||||
@@ -96,6 +96,11 @@ namespace
|
|||||||
if (args.find("[RANGE]") != args.end())
|
if (args.find("[RANGE]") != args.end())
|
||||||
chat.mText = self->getString("template", args);
|
chat.mText = self->getString("template", args);
|
||||||
else if (chat.mText.empty()) return;
|
else if (chat.mText.empty()) return;
|
||||||
|
if (entering) // Note: If we decide to make this for leaving as well, change this check to dist != F32_MIN
|
||||||
|
{
|
||||||
|
static const LLCachedControl<bool> radar_show_dist("RadarAlertShowDist");
|
||||||
|
if (radar_show_dist) chat.mText += llformat(" (%.2fm)", dist);
|
||||||
|
}
|
||||||
chat.mFromName = name;
|
chat.mFromName = name;
|
||||||
chat.mURL = llformat("secondlife:///app/agent/%s/about",key.asString().c_str());
|
chat.mURL = llformat("secondlife:///app/agent/%s/about",key.asString().c_str());
|
||||||
chat.mSourceType = CHAT_SOURCE_SYSTEM;
|
chat.mSourceType = CHAT_SOURCE_SYSTEM;
|
||||||
@@ -160,7 +165,7 @@ void LLAvatarListEntry::processProperties(void* data, EAvatarProcessorType type)
|
|||||||
static const LLCachedControl<U32> sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays");
|
static const LLCachedControl<U32> sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays");
|
||||||
if ((U32)mAge < sAvatarAgeAlertDays)
|
if ((U32)mAge < sAvatarAgeAlertDays)
|
||||||
{
|
{
|
||||||
chat_avatar_status(mName, mID, STAT_TYPE_AGE, mStats[STAT_TYPE_AGE] = true);
|
chat_avatar_status(mName, mID, STAT_TYPE_AGE, mStats[STAT_TYPE_AGE] = true, (mPosition - gAgent.getPositionGlobal()).magVec());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If one wanted more information that gets displayed on profiles to be displayed, here would be the place to do it.
|
// If one wanted more information that gets displayed on profiles to be displayed, here would be the place to do it.
|
||||||
@@ -168,14 +173,18 @@ void LLAvatarListEntry::processProperties(void* data, EAvatarProcessorType type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLAvatarListEntry::setPosition(const LLVector3d& position, bool this_sim, bool drawn, bool chatrange, bool shoutrange)
|
void LLAvatarListEntry::setPosition(const LLVector3d& position, const F32& dist, bool drawn)
|
||||||
{
|
{
|
||||||
mPosition = position;
|
mPosition = position;
|
||||||
mFrame = gFrameCount;
|
mFrame = gFrameCount;
|
||||||
if (this_sim != mStats[STAT_TYPE_SIM]) chat_avatar_status(mName, mID, STAT_TYPE_SIM, mStats[STAT_TYPE_SIM] = this_sim);
|
bool here(dist != F32_MIN); // F32_MIN only if dead
|
||||||
if (drawn != mStats[STAT_TYPE_DRAW]) chat_avatar_status(mName, mID, STAT_TYPE_DRAW, mStats[STAT_TYPE_DRAW] = drawn);
|
bool this_sim(here && (gAgent.getRegion()->pointInRegionGlobal(position) || !(LLWorld::getInstance()->positionRegionValidGlobal(position))));
|
||||||
if (shoutrange != mStats[STAT_TYPE_SHOUTRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_SHOUTRANGE, mStats[STAT_TYPE_SHOUTRANGE] = shoutrange);
|
if (this_sim != mStats[STAT_TYPE_SIM]) chat_avatar_status(mName, mID, STAT_TYPE_SIM, mStats[STAT_TYPE_SIM] = this_sim, dist);
|
||||||
if (chatrange != mStats[STAT_TYPE_CHATRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_CHATRANGE, mStats[STAT_TYPE_CHATRANGE] = chatrange);
|
if (drawn != mStats[STAT_TYPE_DRAW]) chat_avatar_status(mName, mID, STAT_TYPE_DRAW, mStats[STAT_TYPE_DRAW] = drawn, dist);
|
||||||
|
bool shoutrange(here && dist < LFSimFeatureHandler::getInstance()->shoutRange());
|
||||||
|
if (shoutrange != mStats[STAT_TYPE_SHOUTRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_SHOUTRANGE, mStats[STAT_TYPE_SHOUTRANGE] = shoutrange, dist);
|
||||||
|
bool chatrange(here && dist < LFSimFeatureHandler::getInstance()->sayRange());
|
||||||
|
if (chatrange != mStats[STAT_TYPE_CHATRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_CHATRANGE, mStats[STAT_TYPE_CHATRANGE] = chatrange, dist);
|
||||||
mUpdateTimer.start();
|
mUpdateTimer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -553,8 +562,7 @@ void LLFloaterAvatarList::updateAvatarList()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Announce position
|
// Announce position
|
||||||
F32 dist((position - mypos).magVec());
|
entry->setPosition(position, (position - mypos).magVec(), avatarp);
|
||||||
entry->setPosition(position, gAgent.getRegion()->pointInRegionGlobal(position) || !(LLWorld::getInstance()->positionRegionValidGlobal(position)), avatarp, dist < LFSimFeatureHandler::getInstance()->sayRange(), dist < LFSimFeatureHandler::getInstance()->shoutRange());
|
|
||||||
|
|
||||||
// Mark as typing if they are typing
|
// Mark as typing if they are typing
|
||||||
if (avatarp && avatarp->isTyping()) entry->setActivity(LLAvatarListEntry::ACTIVITY_TYPING);
|
if (avatarp && avatarp->isTyping()) entry->setActivity(LLAvatarListEntry::ACTIVITY_TYPING);
|
||||||
@@ -621,7 +629,7 @@ void LLFloaterAvatarList::expireAvatarList()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
entry->setPosition(entry->getPosition(), false, false, false, false); // Dead and gone
|
entry->setPosition(entry->getPosition(), F32_MIN, false); // Dead and gone
|
||||||
it = mAvatars.erase(it);
|
it = mAvatars.erase(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -700,6 +708,9 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
LLScrollListItem::Params element;
|
LLScrollListItem::Params element;
|
||||||
element.value = av_id;
|
element.value = av_id;
|
||||||
|
|
||||||
|
static const LLCachedControl<bool> hide_mark("RadarColumnMarkHidden");
|
||||||
|
if (!hide_mark)
|
||||||
|
{
|
||||||
LLScrollListCell::Params mark;
|
LLScrollListCell::Params mark;
|
||||||
mark.column = "marked";
|
mark.column = "marked";
|
||||||
mark.type = "text";
|
mark.type = "text";
|
||||||
@@ -709,7 +720,17 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
mark.color = LLColor4::blue;
|
mark.color = LLColor4::blue;
|
||||||
mark.font_style = "BOLD";
|
mark.font_style = "BOLD";
|
||||||
}
|
}
|
||||||
|
element.columns.add(mark);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const LLCachedControl<LLColor4> unselected_color(gColors, "ScrollUnselectedColor", LLColor4(0.f, 0.f, 0.f, 0.8f));
|
||||||
|
|
||||||
|
static const LLCachedControl<LLColor4> sDefaultListText(gColors, "DefaultListText");
|
||||||
|
static const LLCachedControl<LLColor4> ascent_muted_color("AscentMutedColor", LLColor4(0.7f,0.7f,0.7f,1.f));
|
||||||
|
LLColor4 color = sDefaultListText;
|
||||||
|
|
||||||
|
// Name never hidden
|
||||||
|
{
|
||||||
LLScrollListCell::Params name;
|
LLScrollListCell::Params name;
|
||||||
name.column = "avatar_name";
|
name.column = "avatar_name";
|
||||||
name.type = "text";
|
name.type = "text";
|
||||||
@@ -722,22 +743,10 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
//<edit> custom colors for certain types of avatars!
|
//<edit> custom colors for certain types of avatars!
|
||||||
//Changed a bit so people can modify them in settings. And since they're colors, again it's possibly account-based. Starting to think I need a function just to determine that. - HgB
|
//Changed a bit so people can modify them in settings. And since they're colors, again it's possibly account-based. Starting to think I need a function just to determine that. - HgB
|
||||||
//name.color = gColors.getColor( "MapAvatar" );
|
//name.color = gColors.getColor( "MapAvatar" );
|
||||||
LLViewerRegion* parent_estate = LLWorld::getInstance()->getRegionFromPosGlobal(entry->getPosition());
|
|
||||||
LLUUID estate_owner = LLUUID::null;
|
LLUUID estate_owner = LLUUID::null;
|
||||||
if (parent_estate && parent_estate->isAlive())
|
if (LLViewerRegion* parent_estate = LLWorld::getInstance()->getRegionFromPosGlobal(entry->getPosition()))
|
||||||
{
|
if (parent_estate->isAlive())
|
||||||
estate_owner = parent_estate->getOwner();
|
estate_owner = parent_estate->getOwner();
|
||||||
}
|
|
||||||
|
|
||||||
static const LLCachedControl<LLColor4> unselected_color(gColors, "ScrollUnselectedColor", LLColor4(0.f, 0.f, 0.f, 0.8f));
|
|
||||||
|
|
||||||
static LLCachedControl<LLColor4> sDefaultListText(gColors, "DefaultListText");
|
|
||||||
static LLCachedControl<LLColor4> sRadarTextChatRange(gColors, "RadarTextChatRange");
|
|
||||||
static LLCachedControl<LLColor4> sRadarTextShoutRange(gColors, "RadarTextShoutRange");
|
|
||||||
static LLCachedControl<LLColor4> sRadarTextDrawDist(gColors, "RadarTextDrawDist");
|
|
||||||
static LLCachedControl<LLColor4> sRadarTextYoung(gColors, "RadarTextYoung");
|
|
||||||
static const LLCachedControl<LLColor4> ascent_muted_color("AscentMutedColor", LLColor4(0.7f,0.7f,0.7f,1.f));
|
|
||||||
LLColor4 color = sDefaultListText;
|
|
||||||
|
|
||||||
//Lindens are always more Linden than your friend, make that take precedence
|
//Lindens are always more Linden than your friend, make that take precedence
|
||||||
if (mm_getMarkerColor(av_id, color)) {}
|
if (mm_getMarkerColor(av_id, color)) {}
|
||||||
@@ -764,12 +773,17 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
color = ascent_muted_color;
|
color = ascent_muted_color;
|
||||||
}
|
}
|
||||||
name.color = color*0.5f + unselected_color*0.5f;
|
name.color = color*0.5f + unselected_color*0.5f;
|
||||||
|
element.columns.add(name);
|
||||||
|
}
|
||||||
|
|
||||||
char temp[32];
|
char temp[32];
|
||||||
|
// Distance never hidden
|
||||||
|
{
|
||||||
color = sDefaultListText;
|
color = sDefaultListText;
|
||||||
LLScrollListCell::Params dist;
|
LLScrollListCell::Params dist;
|
||||||
dist.column = "distance";
|
dist.column = "distance";
|
||||||
dist.type = "text";
|
dist.type = "text";
|
||||||
|
static const LLCachedControl<LLColor4> sRadarTextDrawDist(gColors, "RadarTextDrawDist");
|
||||||
if (UnknownAltitude)
|
if (UnknownAltitude)
|
||||||
{
|
{
|
||||||
strcpy(temp, "?");
|
strcpy(temp, "?");
|
||||||
@@ -782,6 +796,8 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
{
|
{
|
||||||
if (distance <= LFSimFeatureHandler::getInstance()->shoutRange())
|
if (distance <= LFSimFeatureHandler::getInstance()->shoutRange())
|
||||||
{
|
{
|
||||||
|
static const LLCachedControl<LLColor4> sRadarTextChatRange(gColors, "RadarTextChatRange");
|
||||||
|
static const LLCachedControl<LLColor4> sRadarTextShoutRange(gColors, "RadarTextShoutRange");
|
||||||
snprintf(temp, sizeof(temp), "%.1f", distance);
|
snprintf(temp, sizeof(temp), "%.1f", distance);
|
||||||
color = (distance > LFSimFeatureHandler::getInstance()->sayRange()) ? sRadarTextShoutRange : sRadarTextChatRange;
|
color = (distance > LFSimFeatureHandler::getInstance()->sayRange()) ? sRadarTextShoutRange : sRadarTextChatRange;
|
||||||
}
|
}
|
||||||
@@ -794,7 +810,12 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
dist.value = temp;
|
dist.value = temp;
|
||||||
dist.color = color * 0.7f + unselected_color * 0.3f; // Liru: Blend testing!
|
dist.color = color * 0.7f + unselected_color * 0.3f; // Liru: Blend testing!
|
||||||
//dist.color = color;
|
//dist.color = color;
|
||||||
|
element.columns.add(dist);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const LLCachedControl<bool> hide_pos("RadarColumnPositionHidden");
|
||||||
|
if (!hide_pos)
|
||||||
|
{
|
||||||
LLScrollListCell::Params pos;
|
LLScrollListCell::Params pos;
|
||||||
position -= simpos;
|
position -= simpos;
|
||||||
|
|
||||||
@@ -827,7 +848,12 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
pos.column = "position";
|
pos.column = "position";
|
||||||
pos.type = "text";
|
pos.type = "text";
|
||||||
pos.value = temp;
|
pos.value = temp;
|
||||||
|
element.columns.add(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const LLCachedControl<bool> hide_alt("RadarColumnAltitudeHidden");
|
||||||
|
if (!hide_alt)
|
||||||
|
{
|
||||||
LLScrollListCell::Params alt;
|
LLScrollListCell::Params alt;
|
||||||
alt.column = "altitude";
|
alt.column = "altitude";
|
||||||
alt.type = "text";
|
alt.type = "text";
|
||||||
@@ -840,11 +866,13 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
snprintf(temp, sizeof(temp), "%d", (S32)position.mdV[VZ]);
|
snprintf(temp, sizeof(temp), "%d", (S32)position.mdV[VZ]);
|
||||||
}
|
}
|
||||||
alt.value = temp;
|
alt.value = temp;
|
||||||
|
element.columns.add(alt);
|
||||||
|
}
|
||||||
|
|
||||||
LLScrollListCell::Params act;
|
|
||||||
static const LLCachedControl<bool> hide_act("RadarColumnActivityHidden");
|
static const LLCachedControl<bool> hide_act("RadarColumnActivityHidden");
|
||||||
if (!hide_act)
|
if (!hide_act)
|
||||||
{
|
{
|
||||||
|
LLScrollListCell::Params act;
|
||||||
act.column = "activity";
|
act.column = "activity";
|
||||||
act.type = "icon";
|
act.type = "icon";
|
||||||
switch(entry->getActivity())
|
switch(entry->getActivity())
|
||||||
@@ -880,12 +908,13 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
element.columns.add(act);
|
||||||
}
|
}
|
||||||
|
|
||||||
LLScrollListCell::Params voice;
|
|
||||||
static const LLCachedControl<bool> hide_voice("RadarColumnVoiceHidden");
|
static const LLCachedControl<bool> hide_voice("RadarColumnVoiceHidden");
|
||||||
if (!hide_voice)
|
if (!hide_voice)
|
||||||
{
|
{
|
||||||
|
LLScrollListCell::Params voice;
|
||||||
voice.column("voice");
|
voice.column("voice");
|
||||||
voice.type("icon");
|
voice.type("icon");
|
||||||
// transplant from llparticipantlist.cpp, update accordingly.
|
// transplant from llparticipantlist.cpp, update accordingly.
|
||||||
@@ -914,8 +943,12 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
voice.color(speakerp->mStatus > LLSpeaker::STATUS_VOICE_ACTIVE ? LLColor4::transparent : speakerp->mDotColor);
|
voice.color(speakerp->mStatus > LLSpeaker::STATUS_VOICE_ACTIVE ? LLColor4::transparent : speakerp->mDotColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
element.columns.add(voice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const LLCachedControl<bool> hide_age("RadarColumnAgeHidden");
|
||||||
|
if (!hide_age)
|
||||||
|
{
|
||||||
LLScrollListCell::Params agep;
|
LLScrollListCell::Params agep;
|
||||||
agep.column = "age";
|
agep.column = "age";
|
||||||
agep.type = "text";
|
agep.type = "text";
|
||||||
@@ -925,15 +958,23 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
{
|
{
|
||||||
static const LLCachedControl<U32> sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays");
|
static const LLCachedControl<U32> sAvatarAgeAlertDays(gSavedSettings, "AvatarAgeAlertDays");
|
||||||
if ((U32)entry->mAge < sAvatarAgeAlertDays)
|
if ((U32)entry->mAge < sAvatarAgeAlertDays)
|
||||||
|
{
|
||||||
|
static const LLCachedControl<LLColor4> sRadarTextYoung(gColors, "RadarTextYoung");
|
||||||
color = sRadarTextYoung;
|
color = sRadarTextYoung;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
age = "?";
|
age = "?";
|
||||||
}
|
}
|
||||||
agep.value = age;
|
agep.value = age;
|
||||||
agep.color = color;
|
agep.color = color;
|
||||||
|
element.columns.add(agep);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const LLCachedControl<bool> hide_time("RadarColumnTimeHidden");
|
||||||
|
if (!hide_time)
|
||||||
|
{
|
||||||
int dur = difftime(time(NULL), entry->getTime());
|
int dur = difftime(time(NULL), entry->getTime());
|
||||||
int hours = dur / 3600;
|
int hours = dur / 3600;
|
||||||
int mins = (dur % 3600) / 60;
|
int mins = (dur % 3600) / 60;
|
||||||
@@ -943,7 +984,12 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
time.column = "time";
|
time.column = "time";
|
||||||
time.type = "text";
|
time.type = "text";
|
||||||
time.value = llformat("%d:%02d:%02d", hours, mins, secs);
|
time.value = llformat("%d:%02d:%02d", hours, mins, secs);
|
||||||
|
element.columns.add(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const LLCachedControl<bool> hide_client("RadarColumnClientHidden");
|
||||||
|
if (!hide_client)
|
||||||
|
{
|
||||||
LLScrollListCell::Params viewer;
|
LLScrollListCell::Params viewer;
|
||||||
viewer.column = "client";
|
viewer.column = "client";
|
||||||
viewer.type = "text";
|
viewer.type = "text";
|
||||||
@@ -967,18 +1013,8 @@ void LLFloaterAvatarList::refreshAvatarList()
|
|||||||
}
|
}
|
||||||
//Blend to make the color show up better
|
//Blend to make the color show up better
|
||||||
viewer.color = color *.5f + unselected_color * .5f;
|
viewer.color = color *.5f + unselected_color * .5f;
|
||||||
|
|
||||||
// Add individual column cell params to the item param
|
|
||||||
element.columns.add(mark);
|
|
||||||
element.columns.add(name);
|
|
||||||
element.columns.add(dist);
|
|
||||||
element.columns.add(pos);
|
|
||||||
element.columns.add(alt);
|
|
||||||
if (!hide_act) element.columns.add(act);
|
|
||||||
if (!hide_voice) element.columns.add(voice);
|
|
||||||
element.columns.add(agep);
|
|
||||||
element.columns.add(time);
|
|
||||||
element.columns.add(viewer);
|
element.columns.add(viewer);
|
||||||
|
}
|
||||||
|
|
||||||
// Add to list
|
// Add to list
|
||||||
mAvatarList->addRow(element);
|
mAvatarList->addRow(element);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ enum ACTIVITY_TYPE
|
|||||||
* Update world position.
|
* Update world position.
|
||||||
* Affects age.
|
* Affects age.
|
||||||
*/
|
*/
|
||||||
void setPosition(const LLVector3d& position, bool this_sim, bool drawn, bool chatrange, bool shoutrange);
|
void setPosition(const LLVector3d& position, const F32& dist, bool drawn);
|
||||||
|
|
||||||
const LLVector3d& getPosition() const { return mPosition; }
|
const LLVector3d& getPosition() const { return mPosition; }
|
||||||
|
|
||||||
|
|||||||
@@ -1426,7 +1426,7 @@ void LLSnapshotLivePreview::saveTexture()
|
|||||||
LLAssetStorage::LLStoreAssetCallback callback = &LLSnapshotLivePreview::saveTextureDone;
|
LLAssetStorage::LLStoreAssetCallback callback = &LLSnapshotLivePreview::saveTextureDone;
|
||||||
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
|
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
|
||||||
saveTextureUserData* user_data = new saveTextureUserData(this, sSnapshotIndex, gSavedSettings.getBOOL("TemporaryUpload"));
|
saveTextureUserData* user_data = new saveTextureUserData(this, sSnapshotIndex, gSavedSettings.getBOOL("TemporaryUpload"));
|
||||||
if (!upload_new_resource(tid, // tid
|
if (upload_new_resource(tid, // tid
|
||||||
LLAssetType::AT_TEXTURE,
|
LLAssetType::AT_TEXTURE,
|
||||||
"Snapshot : " + pos_string,
|
"Snapshot : " + pos_string,
|
||||||
"Taken by " + who_took_it + " at " + pos_string,
|
"Taken by " + who_took_it + " at " + pos_string,
|
||||||
@@ -1437,7 +1437,11 @@ void LLSnapshotLivePreview::saveTexture()
|
|||||||
LLFloaterPerms::getGroupPerms("Uploads"), // that is more permissive than other uploads
|
LLFloaterPerms::getGroupPerms("Uploads"), // that is more permissive than other uploads
|
||||||
LLFloaterPerms::getEveryonePerms("Uploads"),
|
LLFloaterPerms::getEveryonePerms("Uploads"),
|
||||||
"Snapshot : " + pos_string,
|
"Snapshot : " + pos_string,
|
||||||
callback, expected_upload_cost, user_data, &LLSnapshotLivePreview::saveTextureDone2))
|
callback, expected_upload_cost, user_data))
|
||||||
|
{
|
||||||
|
saveTextureDone2(true, user_data);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
// Something went wrong.
|
// Something went wrong.
|
||||||
delete user_data;
|
delete user_data;
|
||||||
|
|||||||
@@ -101,7 +101,6 @@ void LLMediaFilter::filterAudioUrl(const std::string& url)
|
|||||||
{
|
{
|
||||||
if (url.empty())
|
if (url.empty())
|
||||||
{
|
{
|
||||||
gAudiop->startInternetStream(url);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (url == mCurrentAudioURL) return;
|
if (url == mCurrentAudioURL) return;
|
||||||
|
|||||||
@@ -5201,7 +5201,9 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
|
|||||||
{
|
{
|
||||||
if (node->mInventorySerial != inv_serial)
|
if (node->mInventorySerial != inv_serial)
|
||||||
{
|
{
|
||||||
node->getObject()->dirtyInventory();
|
if (LLViewerObject* object = node->getObject())
|
||||||
|
if (object->getInventorySerial() != inv_serial) // Singu Note: the serial number in the object may be correct.
|
||||||
|
object->dirtyInventory();
|
||||||
}
|
}
|
||||||
|
|
||||||
// save texture data as soon as we get texture perms first time
|
// save texture data as soon as we get texture perms first time
|
||||||
|
|||||||
@@ -1177,8 +1177,7 @@ bool upload_new_resource(
|
|||||||
const std::string& display_name,
|
const std::string& display_name,
|
||||||
LLAssetStorage::LLStoreAssetCallback callback,
|
LLAssetStorage::LLStoreAssetCallback callback,
|
||||||
S32 expected_upload_cost,
|
S32 expected_upload_cost,
|
||||||
void *userdata,
|
void *userdata)
|
||||||
void (*callback2)(bool, void*))
|
|
||||||
{
|
{
|
||||||
if(gDisconnected)
|
if(gDisconnected)
|
||||||
{
|
{
|
||||||
@@ -1230,9 +1229,7 @@ bool upload_new_resource(
|
|||||||
new LLNewAgentInventoryResponder(
|
new LLNewAgentInventoryResponder(
|
||||||
body,
|
body,
|
||||||
uuid,
|
uuid,
|
||||||
asset_type,
|
asset_type));
|
||||||
callback2,
|
|
||||||
userdata));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1294,17 +1291,16 @@ bool upload_new_resource(
|
|||||||
|
|
||||||
LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
|
LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
|
||||||
{
|
{
|
||||||
LLAssetID uuid;
|
|
||||||
|
|
||||||
if (gDisconnected)
|
if (gDisconnected)
|
||||||
{
|
{
|
||||||
uuid.setNull();
|
LLAssetID rv;
|
||||||
}
|
|
||||||
else
|
rv.setNull();
|
||||||
{
|
return rv;
|
||||||
uuid = tid.makeAssetID(gAgent.getSecureSessionID());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLAssetID uuid = tid.makeAssetID(gAgent.getSecureSessionID());
|
||||||
|
|
||||||
return uuid;
|
return uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,8 +78,7 @@ bool upload_new_resource(const LLTransactionID &tid,
|
|||||||
const std::string& display_name,
|
const std::string& display_name,
|
||||||
LLAssetStorage::LLStoreAssetCallback callback,
|
LLAssetStorage::LLStoreAssetCallback callback,
|
||||||
S32 expected_upload_cost,
|
S32 expected_upload_cost,
|
||||||
void *userdata,
|
void *userdata);
|
||||||
void (*callback2)(bool, void*) = NULL);
|
|
||||||
|
|
||||||
// The default callback functions, called when 'callback' == NULL (for normal and temporary uploads).
|
// The default callback functions, called when 'callback' == NULL (for normal and temporary uploads).
|
||||||
// user_data must be a LLResourceData allocated with new (or NULL).
|
// user_data must be a LLResourceData allocated with new (or NULL).
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -30,10 +30,22 @@
|
|||||||
#ifndef LL_LLVIEWEROBJECTBACKUP_H
|
#ifndef LL_LLVIEWEROBJECTBACKUP_H
|
||||||
#define LL_LLVIEWEROBJECTBACKUP_H
|
#define LL_LLVIEWEROBJECTBACKUP_H
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "boost/unordered_map.hpp"
|
#include "boost/unordered_map.hpp"
|
||||||
#include "boost/unordered_set.hpp"
|
#include "boost/unordered_set.hpp"
|
||||||
|
|
||||||
|
#include "llfloater.h"
|
||||||
|
#include "statemachine/aifilepicker.h"
|
||||||
|
#include "lluuid.h"
|
||||||
|
|
||||||
#include "llviewerinventory.h"
|
#include "llviewerinventory.h"
|
||||||
|
#include "llviewerobject.h"
|
||||||
|
|
||||||
|
class LLSelectNode;
|
||||||
|
class LLViewerObject;
|
||||||
|
|
||||||
enum export_states {
|
enum export_states {
|
||||||
EXPORT_INIT,
|
EXPORT_INIT,
|
||||||
@@ -43,24 +55,27 @@ enum export_states {
|
|||||||
EXPORT_TEXTURES,
|
EXPORT_TEXTURES,
|
||||||
EXPORT_LLSD,
|
EXPORT_LLSD,
|
||||||
EXPORT_DONE,
|
EXPORT_DONE,
|
||||||
EXPORT_FAILED
|
EXPORT_FAILED,
|
||||||
|
EXPORT_ABORTED
|
||||||
};
|
};
|
||||||
|
|
||||||
class LLObjectBackup : public LLFloater
|
class LLObjectBackup : public LLFloater,
|
||||||
|
public LLFloaterSingleton<LLObjectBackup>
|
||||||
{
|
{
|
||||||
|
friend class LLUISingleton<LLObjectBackup, VisibilityPolicy<LLFloater> >;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
LOG_CLASS(LLObjectBackup);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~LLObjectBackup();
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// LLFloater interface
|
||||||
|
|
||||||
// Floater stuff
|
/*virtual*/ ~LLObjectBackup();
|
||||||
virtual void show(bool exporting);
|
/*virtual*/ void onClose(bool app_quitting);
|
||||||
virtual void onClose(bool app_quitting);
|
|
||||||
|
|
||||||
// Static accessor
|
///////////////////////////////////////////////////////////////////////////
|
||||||
static LLObjectBackup* getInstance();
|
// Public interface for invoking the object backup feature
|
||||||
static bool instanceExists() { return sInstance != NULL; }
|
|
||||||
|
|
||||||
// Export idle callback
|
|
||||||
static void exportWorker(void *userdata);
|
|
||||||
|
|
||||||
// Import entry point
|
// Import entry point
|
||||||
void importObject(bool upload = false);
|
void importObject(bool upload = false);
|
||||||
@@ -70,47 +85,44 @@ public:
|
|||||||
void exportObject();
|
void exportObject();
|
||||||
void exportObject_continued(AIFilePicker* filepicker);
|
void exportObject_continued(AIFilePicker* filepicker);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
// Public methods used in callbacks, workers and responders
|
||||||
|
|
||||||
// Update map from texture worker
|
// Update map from texture worker
|
||||||
void updateMap(LLUUID uploaded_asset);
|
void updateMap(LLUUID uploaded_asset);
|
||||||
|
|
||||||
// Move to next texture upload
|
// Move to next texture upload, called by the agent inventory responder
|
||||||
void uploadNextAsset();
|
void uploadNextAsset();
|
||||||
|
|
||||||
// Folder public geter
|
// Export idle callback
|
||||||
std::string getfolder() { return mFolder; }
|
static void exportWorker(void *userdata);
|
||||||
|
|
||||||
// Prim updated callback
|
// Prim updated callback, called in llviewerobjectlist.cpp
|
||||||
void primUpdate(LLViewerObject* object);
|
static void primUpdate(LLViewerObject* object);
|
||||||
|
|
||||||
// New prim call back
|
// New prim call back, called in llviewerobjectlist.cpp
|
||||||
bool newPrim(LLViewerObject* pobject);
|
static void newPrim(LLViewerObject* object);
|
||||||
|
|
||||||
static const U32 TEXTURE_OK = 0x00;
|
// Folder public getter, used by the texture cache responder
|
||||||
static const U32 TEXTURE_BAD_PERM = 0x01;
|
std::string getFolder() { return mFolder; }
|
||||||
static const U32 TEXTURE_MISSING = 0x02;
|
|
||||||
static const U32 TEXTURE_BAD_ENCODING = 0x04;
|
|
||||||
static const U32 TEXTURE_IS_NULL = 0x08;
|
|
||||||
static const U32 TEXTURE_SAVED_FAILED = 0x10;
|
|
||||||
|
|
||||||
// Set when the region supports the extra physics flags
|
|
||||||
bool mGotExtraPhysics;
|
|
||||||
|
|
||||||
// Are we ready to check for next texture?
|
|
||||||
bool mCheckNextTexture;
|
|
||||||
|
|
||||||
// Export state machine
|
|
||||||
enum export_states mExportState;
|
|
||||||
|
|
||||||
// Export result flags for textures.
|
|
||||||
U32 mNonExportedTextures;
|
|
||||||
|
|
||||||
static void setDefaultTextures();
|
static void setDefaultTextures();
|
||||||
|
|
||||||
// Is exporting these objects allowed
|
// Permissions checking
|
||||||
bool validatePerms(const LLPermissions* item_permissions);
|
static bool validatePerms(const LLPermissions* item_permissions);
|
||||||
|
static bool validateTexturePerms(const LLUUID& asset_id);
|
||||||
|
static bool validateNode(LLSelectNode* node);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LLObjectBackup();
|
// Open only via the importObject() and exportObject() methods defined
|
||||||
|
// above.
|
||||||
|
LLObjectBackup(const LLSD&);
|
||||||
|
|
||||||
|
void showFloater(bool exporting);
|
||||||
|
|
||||||
|
static bool confirmCloseCallback(const LLSD& notification,
|
||||||
|
const LLSD& response);
|
||||||
|
|
||||||
// Update the floater with status numbers
|
// Update the floater with status numbers
|
||||||
void updateImportNumbers();
|
void updateImportNumbers();
|
||||||
@@ -133,7 +145,7 @@ private:
|
|||||||
void exportNextTexture();
|
void exportNextTexture();
|
||||||
|
|
||||||
// Apply LLSD to object
|
// Apply LLSD to object
|
||||||
void xmlToPrim(LLSD prim_llsd, LLViewerObject* pobject);
|
void xmlToPrim(LLSD prim_llsd, LLViewerObject* object);
|
||||||
|
|
||||||
// Rez a prim at a given position
|
// Rez a prim at a given position
|
||||||
void rezAgentOffset(LLVector3 offset);
|
void rezAgentOffset(LLVector3 offset);
|
||||||
@@ -141,9 +153,28 @@ private:
|
|||||||
// Get an offset from the agent based on rotation and current pos
|
// Get an offset from the agent based on rotation and current pos
|
||||||
LLVector3 offsetAgent(LLVector3 offset);
|
LLVector3 offsetAgent(LLVector3 offset);
|
||||||
|
|
||||||
private:
|
public:
|
||||||
static LLObjectBackup* sInstance;
|
// Public static constants, used in callbacks, workers and responders
|
||||||
|
static const U32 TEXTURE_OK = 0x00;
|
||||||
|
static const U32 TEXTURE_BAD_PERM = 0x01;
|
||||||
|
static const U32 TEXTURE_MISSING = 0x02;
|
||||||
|
static const U32 TEXTURE_BAD_ENCODING = 0x04;
|
||||||
|
static const U32 TEXTURE_IS_NULL = 0x08;
|
||||||
|
static const U32 TEXTURE_SAVED_FAILED = 0x10;
|
||||||
|
|
||||||
|
// Export state machine
|
||||||
|
enum export_states mExportState;
|
||||||
|
|
||||||
|
// Export result flags for textures.
|
||||||
|
U32 mNonExportedTextures;
|
||||||
|
|
||||||
|
// Set when the region supports the extra physics flags
|
||||||
|
bool mGotExtraPhysics;
|
||||||
|
|
||||||
|
// Are we ready to check for next texture?
|
||||||
|
bool mCheckNextTexture;
|
||||||
|
|
||||||
|
private:
|
||||||
// Are we active flag
|
// Are we active flag
|
||||||
bool mRunning;
|
bool mRunning;
|
||||||
|
|
||||||
@@ -156,7 +187,7 @@ private:
|
|||||||
U32 mPrims;
|
U32 mPrims;
|
||||||
U32 mCurPrim;
|
U32 mCurPrim;
|
||||||
|
|
||||||
// No prims rezed
|
// Number of rezzed prims
|
||||||
U32 mRezCount;
|
U32 mRezCount;
|
||||||
|
|
||||||
// Root pos and rotation and central root pos for link set
|
// Root pos and rotation and central root pos for link set
|
||||||
@@ -168,31 +199,39 @@ private:
|
|||||||
// Agent inital pos and rot when starting import
|
// Agent inital pos and rot when starting import
|
||||||
LLVector3 mAgentPos;
|
LLVector3 mAgentPos;
|
||||||
LLQuaternion mAgentRot;
|
LLQuaternion mAgentRot;
|
||||||
// Rebase map
|
|
||||||
boost::unordered_map<LLUUID, LLUUID> mAssetMap;
|
LLUUID mCurrentAsset;
|
||||||
|
LLUUID mExpectingUpdate;
|
||||||
|
|
||||||
|
// Working llsd iterators for objects and linksets
|
||||||
|
LLSD::map_const_iterator mPrimImportIter;
|
||||||
|
LLSD::array_const_iterator mGroupPrimImportIter;
|
||||||
|
|
||||||
|
// File and folder name control
|
||||||
|
std::string mFileName;
|
||||||
|
std::string mFolder;
|
||||||
|
|
||||||
// Export texture list
|
// Export texture list
|
||||||
typedef boost::unordered_set<LLUUID> textures_set_t;
|
typedef boost::unordered_set<LLUUID> textures_set_t;
|
||||||
textures_set_t mTexturesList;
|
textures_set_t mTexturesList;
|
||||||
textures_set_t mBadPermsTexturesList;
|
textures_set_t mBadPermsTexturesList;
|
||||||
|
|
||||||
|
// Rebase map
|
||||||
|
boost::unordered_map<LLUUID, LLUUID> mAssetMap;
|
||||||
|
|
||||||
// Import object tracking
|
// Import object tracking
|
||||||
std::vector<LLViewerObject*> mToSelect;
|
std::vector<LLViewerObject*> mToSelect;
|
||||||
std::vector<LLViewerObject*>::iterator mProcessIter;
|
std::vector<LLViewerObject*>::iterator mProcessIter;
|
||||||
|
|
||||||
// File and folder name control
|
|
||||||
std::string mFileName;
|
|
||||||
std::string mFolder;
|
|
||||||
|
|
||||||
// Working LLSD holders
|
// Working LLSD holders
|
||||||
LLUUID mCurrentAsset;
|
|
||||||
LLUUID mExpectingUpdate;
|
|
||||||
LLSD mLLSD;
|
LLSD mLLSD;
|
||||||
LLSD mThisGroup;
|
LLSD mThisGroup;
|
||||||
|
|
||||||
// Working llsd itterators for objects and linksets
|
|
||||||
LLSD::map_const_iterator mPrimImportIter;
|
|
||||||
LLSD::array_const_iterator mGroupPrimImportIter;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
extern LLUUID LL_TEXTURE_PLYWOOD;
|
||||||
|
extern LLUUID LL_TEXTURE_BLANK;
|
||||||
|
extern LLUUID LL_TEXTURE_INVISIBLE;
|
||||||
|
extern LLUUID LL_TEXTURE_TRANSPARENT;
|
||||||
|
extern LLUUID LL_TEXTURE_MEDIA;
|
||||||
|
|
||||||
|
#endif // LL_LLVIEWEROBJECTBACKUP_H
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LLObjectBackup::getInstance()->primUpdate(objectp);
|
LLObjectBackup::primUpdate(objectp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -310,7 +310,7 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
|
|||||||
gViewerWindow->getWindow()->decBusyCount();
|
gViewerWindow->getWindow()->decBusyCount();
|
||||||
gViewerWindow->getWindow()->setCursor( UI_CURSOR_ARROW );
|
gViewerWindow->getWindow()->setCursor( UI_CURSOR_ARROW );
|
||||||
|
|
||||||
LLObjectBackup::getInstance()->newPrim(objectp);
|
LLObjectBackup::newPrim(objectp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1216,6 +1216,17 @@ void LLViewerObjectList::fetchPhysicsFlags()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LLViewerObjectList::gotObjectPhysicsFlags(LLViewerObject* objectp)
|
||||||
|
{
|
||||||
|
// This will insert objectp in mStalePhysicsFlags if needed:
|
||||||
|
objectp->getPhysicsShapeType();
|
||||||
|
// Data has been retrieved if the object is not in either of the
|
||||||
|
// two lists:
|
||||||
|
const LLUUID& id = objectp->getID();
|
||||||
|
return mPendingPhysicsFlags.count(id) == 0 &&
|
||||||
|
mStalePhysicsFlags.count(id) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
void LLViewerObjectList::clearDebugText()
|
void LLViewerObjectList::clearDebugText()
|
||||||
{
|
{
|
||||||
for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
|
for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
|
||||||
|
|||||||
@@ -99,6 +99,8 @@ public:
|
|||||||
void fetchObjectCosts();
|
void fetchObjectCosts();
|
||||||
void fetchPhysicsFlags();
|
void fetchPhysicsFlags();
|
||||||
|
|
||||||
|
bool gotObjectPhysicsFlags(LLViewerObject* objectp);
|
||||||
|
|
||||||
void updateObjectCost(LLViewerObject* object);
|
void updateObjectCost(LLViewerObject* object);
|
||||||
void updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost);
|
void updateObjectCost(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost);
|
||||||
void onObjectCostFetchFailure(const LLUUID& object_id);
|
void onObjectCostFetchFailure(const LLUUID& object_id);
|
||||||
|
|||||||
@@ -361,6 +361,51 @@ BOOL LLViewerTexLayerSetBuffer::requestUpdateImmediate()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LLSendTexLayerResponder : public LLAssetUploadResponder
|
||||||
|
{
|
||||||
|
LOG_CLASS(LLSendTexLayerResponder);
|
||||||
|
public:
|
||||||
|
LLSendTexLayerResponder(const LLSD& post_data, const LLUUID& vfile_id, LLAssetType::EType asset_type, LLBakedUploadData * baked_upload_data)
|
||||||
|
: LLAssetUploadResponder(post_data, vfile_id, asset_type)
|
||||||
|
, mBakedUploadData(baked_upload_data)
|
||||||
|
{}
|
||||||
|
|
||||||
|
~LLSendTexLayerResponder()
|
||||||
|
{
|
||||||
|
// mBakedUploadData is normally deleted by calls to LLViewerTexLayerSetBuffer::onTextureUploadComplete() below
|
||||||
|
if (mBakedUploadData)
|
||||||
|
{ // ...but delete it in the case where uploadComplete() is never called
|
||||||
|
delete mBakedUploadData;
|
||||||
|
mBakedUploadData = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Baked texture upload completed
|
||||||
|
/*virtual*/ void uploadComplete(const LLSD& content)
|
||||||
|
{
|
||||||
|
const std::string& result = content["state"];
|
||||||
|
const LLUUID& new_id = content["new_asset"];
|
||||||
|
|
||||||
|
llinfos << "result: " << result << " new_id: " << new_id << llendl;
|
||||||
|
LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, (result == "complete" && mBakedUploadData) ? 0 : -1, LL_EXSTAT_NONE);
|
||||||
|
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
|
||||||
|
}
|
||||||
|
|
||||||
|
/*virtual*/ void httpFailure()
|
||||||
|
{
|
||||||
|
llinfos << dumpResponse() << llendl;
|
||||||
|
|
||||||
|
// Invoke the original callback with an error result
|
||||||
|
LLViewerTexLayerSetBuffer::onTextureUploadComplete(LLUUID::null, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
|
||||||
|
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
|
||||||
|
}
|
||||||
|
|
||||||
|
/*virtual*/ char const* getName() const { return "LLSendTexLayerResponder"; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
LLBakedUploadData* mBakedUploadData;
|
||||||
|
};
|
||||||
|
|
||||||
// Create the baked texture, send it out to the server, then wait for it to come
|
// Create the baked texture, send it out to the server, then wait for it to come
|
||||||
// back so we can switch to using it.
|
// back so we can switch to using it.
|
||||||
void LLViewerTexLayerSetBuffer::doUpload()
|
void LLViewerTexLayerSetBuffer::doUpload()
|
||||||
|
|||||||
@@ -1799,10 +1799,10 @@ void LLVOAvatar::renderCollisionVolumes()
|
|||||||
{
|
{
|
||||||
std::ostringstream ostr;
|
std::ostringstream ostr;
|
||||||
LLGLDepthTest gls_depth(GL_FALSE);
|
LLGLDepthTest gls_depth(GL_FALSE);
|
||||||
for (S32 i = 0; i < mNumCollisionVolumes; i++)
|
for (S32 i = 0; i < (S32)mCollisionVolumes.size(); i++)
|
||||||
{
|
{
|
||||||
mCollisionVolumes[i].renderCollision();
|
mCollisionVolumes[i]->renderCollision();
|
||||||
ostr << mCollisionVolumes[i].getName() << ", ";
|
ostr << mCollisionVolumes[i]->getName() << ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mNameText.notNull())
|
if (mNameText.notNull())
|
||||||
@@ -1920,11 +1920,11 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&
|
|||||||
|
|
||||||
if (lineSegmentBoundingBox(start, end))
|
if (lineSegmentBoundingBox(start, end))
|
||||||
{
|
{
|
||||||
for (S32 i = 0; i < mNumCollisionVolumes; ++i)
|
for (S32 i = 0; i < (S32)mCollisionVolumes.size(); ++i)
|
||||||
{
|
{
|
||||||
mCollisionVolumes[i].updateWorldMatrix();
|
mCollisionVolumes[i]->updateWorldMatrix();
|
||||||
|
|
||||||
const LLMatrix4a& mat = mCollisionVolumes[i].getXform()->getWorldMatrix();
|
const LLMatrix4a& mat = mCollisionVolumes[i]->getXform()->getWorldMatrix();
|
||||||
LLMatrix4a inverse = mat;
|
LLMatrix4a inverse = mat;
|
||||||
inverse.invert();
|
inverse.invert();
|
||||||
LLMatrix4a norm_mat = inverse;
|
LLMatrix4a norm_mat = inverse;
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||||
<floater can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="false"
|
<floater name="Object Backup" title="Progress" rect_control="FloaterObjectBackuptRect"
|
||||||
rect_control="FloaterObjectBackuptRect"
|
can_close="true" can_drag_on_left="false" can_minimize="true" can_resize="false"
|
||||||
height="80" width="200" name="Import" title="Import progress" mouse_opaque="true">
|
height="80" width="200" mouse_opaque="true">
|
||||||
<text height="30" left="10" name="name_label" top="-20"> Progress </text>
|
<text height="30" left="10" name="name_label" top="-20">
|
||||||
|
Progress
|
||||||
|
</text>
|
||||||
|
<string name="export">
|
||||||
|
Object export
|
||||||
|
</string>
|
||||||
|
<string name="import">
|
||||||
|
Object import
|
||||||
|
</string>
|
||||||
</floater>
|
</floater>
|
||||||
|
|||||||
@@ -119,6 +119,10 @@
|
|||||||
<on_check control="RadarAlertAge"/>
|
<on_check control="RadarAlertAge"/>
|
||||||
</menu_item_check>
|
</menu_item_check>
|
||||||
<menu_item_separator/>
|
<menu_item_separator/>
|
||||||
|
<menu_item_check label="Include distance in alerts" name="Include distance in alerts">
|
||||||
|
<on_click function="ToggleControl" userdata="RadarAlertShowDist"/>
|
||||||
|
<on_check control="RadarAlertShowDist"/>
|
||||||
|
</menu_item_check>
|
||||||
<menu_item_check label="Announce even when closed" name="Announce even when closed">
|
<menu_item_check label="Announce even when closed" name="Announce even when closed">
|
||||||
<on_click function="ToggleControl" userdata="RadarKeepOpen"/>
|
<on_click function="ToggleControl" userdata="RadarKeepOpen"/>
|
||||||
<on_check control="RadarKeepOpen"/>
|
<on_check control="RadarKeepOpen"/>
|
||||||
|
|||||||
@@ -5938,11 +5938,25 @@ A login URI is required to retrieve the grid info.
|
|||||||
Builds with extended hollow or extended hole size do not render properly on other viewers. Please keep this option checked, if you want your builds looking properly in other viewers.
|
Builds with extended hollow or extended hole size do not render properly on other viewers. Please keep this option checked, if you want your builds looking properly in other viewers.
|
||||||
</notification>
|
</notification>
|
||||||
|
|
||||||
|
<notification
|
||||||
|
icon="alertmodal.tga"
|
||||||
|
name="ImportFailed"
|
||||||
|
type="alertmodal">
|
||||||
|
Bad XML file. Import aborted.
|
||||||
|
</notification>
|
||||||
|
|
||||||
|
<notification
|
||||||
|
icon="notifytip.tga"
|
||||||
|
name="ExportAborted"
|
||||||
|
type="notifytip">
|
||||||
|
The Object was deselected before the export could occur. Export aborted.
|
||||||
|
</notification>
|
||||||
|
|
||||||
<notification
|
<notification
|
||||||
icon="alertmodal.tga"
|
icon="alertmodal.tga"
|
||||||
name="ExportFailed"
|
name="ExportFailed"
|
||||||
type="alertmodal">
|
type="alertmodal">
|
||||||
None of the selected objects are exportable. Export aborted.
|
Bad permissions for the exported object. Export aborted.
|
||||||
</notification>
|
</notification>
|
||||||
|
|
||||||
<notification
|
<notification
|
||||||
@@ -5959,6 +5973,23 @@ Object exported. Some textures could not be saved due to: [REASON]
|
|||||||
Export successful.
|
Export successful.
|
||||||
</notification>
|
</notification>
|
||||||
|
|
||||||
|
<notification
|
||||||
|
icon="alertmodal.tga"
|
||||||
|
name="ConfirmAbortBackup"
|
||||||
|
type="alertmodal">
|
||||||
|
Are you sure you want to abort the current object backup operation?
|
||||||
|
<form name="form">
|
||||||
|
<button
|
||||||
|
index="0"
|
||||||
|
name="Yes"
|
||||||
|
text="Yes"/>
|
||||||
|
<button
|
||||||
|
index="1"
|
||||||
|
name="No"
|
||||||
|
text="No"/>
|
||||||
|
</form>
|
||||||
|
</notification>
|
||||||
|
|
||||||
<notification
|
<notification
|
||||||
icon="notifytip.tga"
|
icon="notifytip.tga"
|
||||||
name="SystemMessageTip"
|
name="SystemMessageTip"
|
||||||
|
|||||||
Reference in New Issue
Block a user