SH-3455 WIP - removing bake upload code
parent
d58e7cfbfc
commit
48bc05e93f
|
|
@ -4325,24 +4325,6 @@ void LLAgent::renderAutoPilotTarget()
|
|||
|
||||
/********************************************************************************/
|
||||
|
||||
LLAgentQueryManager gAgentQueryManager;
|
||||
|
||||
LLAgentQueryManager::LLAgentQueryManager() :
|
||||
mWearablesCacheQueryID(0),
|
||||
mNumPendingQueries(0),
|
||||
mUpdateSerialNum(0)
|
||||
{
|
||||
for (U32 i = 0; i < BAKED_NUM_INDICES; i++)
|
||||
{
|
||||
// SUNSHINE CLEANUP
|
||||
mActiveCacheQueries[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
LLAgentQueryManager::~LLAgentQueryManager()
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLTeleportRequest
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -885,24 +885,4 @@ inline bool operator==(const LLGroupData &a, const LLGroupData &b)
|
|||
return (a.mID == b.mID);
|
||||
}
|
||||
|
||||
class LLAgentQueryManager
|
||||
{
|
||||
friend class LLAgent;
|
||||
friend class LLAgentWearables;
|
||||
|
||||
public:
|
||||
LLAgentQueryManager();
|
||||
virtual ~LLAgentQueryManager();
|
||||
|
||||
BOOL hasNoPendingQueries() const { return getNumPendingQueries() == 0; }
|
||||
S32 getNumPendingQueries() const { return mNumPendingQueries; }
|
||||
private:
|
||||
S32 mNumPendingQueries;
|
||||
S32 mWearablesCacheQueryID;
|
||||
U32 mUpdateSerialNum;
|
||||
S32 mActiveCacheQueries[LLAvatarAppearanceDefines::BAKED_NUM_INDICES];
|
||||
};
|
||||
|
||||
extern LLAgentQueryManager gAgentQueryManager;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -807,7 +807,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
|
|||
|
||||
if (isAgentAvatarValid() && (agent_id == gAgentAvatarp->getID()))
|
||||
{
|
||||
gMessageSystem->getU32Fast(_PREHASH_AgentData, _PREHASH_SerialNum, gAgentQueryManager.mUpdateSerialNum);
|
||||
U32 unused_update_serial_num;
|
||||
gMessageSystem->getU32Fast(_PREHASH_AgentData, _PREHASH_SerialNum, unused_update_serial_num);
|
||||
|
||||
const S32 NUM_BODY_PARTS = 4;
|
||||
S32 num_wearables = gMessageSystem->getNumberOfBlocksFast(_PREHASH_WearableData);
|
||||
|
|
@ -1199,7 +1200,6 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo
|
|||
for (S32 i=max_entry; i>=0; i--)
|
||||
{
|
||||
LLViewerWearable* old_wearable = getViewerWearable(type,i);
|
||||
//queryWearableCache(); // moved below
|
||||
if (old_wearable)
|
||||
{
|
||||
popWearable(old_wearable);
|
||||
|
|
@ -1211,7 +1211,6 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo
|
|||
else
|
||||
{
|
||||
LLViewerWearable* old_wearable = getViewerWearable(type, index);
|
||||
//queryWearableCache(); // moved below
|
||||
|
||||
if (old_wearable)
|
||||
{
|
||||
|
|
@ -1220,8 +1219,6 @@ void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, boo
|
|||
}
|
||||
}
|
||||
|
||||
queryWearableCache();
|
||||
|
||||
// Update the server
|
||||
updateServer();
|
||||
gInventory.notifyObservers();
|
||||
|
|
@ -1357,7 +1354,6 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
|
|||
mWearablesLoaded = TRUE;
|
||||
checkWearablesLoaded();
|
||||
notifyLoadingFinished();
|
||||
queryWearableCache();
|
||||
updateServer();
|
||||
|
||||
gAgentAvatarp->dumpAvatarTEs("setWearableOutfit");
|
||||
|
|
@ -1481,71 +1477,11 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLViewerWeara
|
|||
}
|
||||
|
||||
//llinfos << "LLVOAvatar::setWearableItem()" << llendl;
|
||||
queryWearableCache();
|
||||
//new_wearable->writeToAvatar(TRUE);
|
||||
|
||||
updateServer();
|
||||
}
|
||||
|
||||
// SUNSHINE CLEANUP dead?
|
||||
void LLAgentWearables::queryWearableCache()
|
||||
{
|
||||
if (!areWearablesLoaded() || (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
gAgentAvatarp->setIsUsingServerBakes(false);
|
||||
|
||||
// Look up affected baked textures.
|
||||
// If they exist:
|
||||
// disallow updates for affected layersets (until dataserver responds with cache request.)
|
||||
// If cache miss, turn updates back on and invalidate composite.
|
||||
// If cache hit, modify baked texture entries.
|
||||
//
|
||||
// Cache requests contain list of hashes for each baked texture entry.
|
||||
// Response is list of valid baked texture assets. (same message)
|
||||
|
||||
gMessageSystem->newMessageFast(_PREHASH_AgentCachedTexture);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
gMessageSystem->addS32Fast(_PREHASH_SerialNum, gAgentQueryManager.mWearablesCacheQueryID);
|
||||
|
||||
S32 num_queries = 0;
|
||||
for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
|
||||
{
|
||||
LLUUID hash_id = computeBakedTextureHash((EBakedTextureIndex) baked_index);
|
||||
if (hash_id.notNull())
|
||||
{
|
||||
num_queries++;
|
||||
// *NOTE: make sure at least one request gets packed
|
||||
|
||||
ETextureIndex te_index = LLAvatarAppearanceDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index);
|
||||
|
||||
//llinfos << "Requesting texture for hash " << hash << " in baked texture slot " << baked_index << llendl;
|
||||
gMessageSystem->nextBlockFast(_PREHASH_WearableData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_ID, hash_id);
|
||||
gMessageSystem->addU8Fast(_PREHASH_TextureIndex, (U8)te_index);
|
||||
}
|
||||
|
||||
gAgentQueryManager.mActiveCacheQueries[baked_index] = gAgentQueryManager.mWearablesCacheQueryID;
|
||||
}
|
||||
//VWR-22113: gAgent.getRegion() can return null if invalid, seen here on logout
|
||||
if(gAgent.getRegion())
|
||||
{
|
||||
if (isAgentAvatarValid())
|
||||
{
|
||||
selfStartPhase("fetch_texture_cache_entries");
|
||||
gAgentAvatarp->outputRezTiming("Fetching textures from cache");
|
||||
}
|
||||
|
||||
LL_DEBUGS("Avatar") << gAgentAvatarp->avString() << "Requesting texture cache entry for " << num_queries << " baked textures" << LL_ENDL;
|
||||
gMessageSystem->sendReliable(gAgent.getRegion()->getHost());
|
||||
gAgentQueryManager.mNumPendingQueries++;
|
||||
gAgentQueryManager.mWearablesCacheQueryID++;
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLAgentWearables::invalidateBakedTextureHash(LLMD5& hash) const
|
||||
{
|
||||
|
|
|
|||
|
|
@ -166,7 +166,6 @@ protected:
|
|||
// SUNSHINE CLEANUP dead
|
||||
void sendAgentWearablesUpdate();
|
||||
void sendAgentWearablesRequest();
|
||||
void queryWearableCache();
|
||||
void updateServer();
|
||||
static void onInitialWearableAssetArrived(LLViewerWearable* wearable, void* userdata);
|
||||
|
||||
|
|
|
|||
|
|
@ -450,57 +450,6 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
|
|||
//LLImportColladaAssetCache::getInstance()->assetUploaded(mVFileID, content["new_asset"], TRUE);
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
llwarns << dumpResponse() << 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(
|
||||
const LLSD& post_data,
|
||||
const LLUUID& vfile_id,
|
||||
|
|
|
|||
|
|
@ -116,28 +116,6 @@ private:
|
|||
Impl* mImpl;
|
||||
};
|
||||
|
||||
// SUNSHINE CLEANUP no upload bakes, remove class.
|
||||
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);
|
||||
|
||||
protected:
|
||||
virtual void httpFailure();
|
||||
|
||||
private:
|
||||
LLBakedUploadData * mBakedUploadData;
|
||||
};
|
||||
|
||||
class LLUpdateAgentInventoryResponder : public LLAssetUploadResponder
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -431,15 +431,7 @@ void LLAvatarTexBar::draw()
|
|||
if (!layerset_buffer) continue;
|
||||
|
||||
LLColor4 text_color = LLColor4::white;
|
||||
|
||||
if (layerset_buffer->uploadNeeded())
|
||||
{
|
||||
text_color = LLColor4::red;
|
||||
}
|
||||
if (layerset_buffer->uploadInProgress())
|
||||
{
|
||||
text_color = LLColor4::magenta;
|
||||
}
|
||||
|
||||
std::string text = layerset_buffer->dumpTextureInfo();
|
||||
LLFontGL::getFontMonospace()->renderUTF8(text, 0, l_offset, v_offset + line_height*line_num,
|
||||
text_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
#include "llglslshader.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "pipeline.h"
|
||||
#include "llassetuploadresponders.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
static const S32 BAKE_UPLOAD_ATTEMPTS = 7;
|
||||
|
|
@ -46,22 +45,6 @@ static const F32 BAKE_UPLOAD_RETRY_DELAY = 2.f; // actual delay grows by power o
|
|||
// runway consolidate
|
||||
extern std::string self_av_string();
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLBakedUploadData()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar,
|
||||
LLViewerTexLayerSet* layerset,
|
||||
const LLUUID& id,
|
||||
bool highest_res) :
|
||||
mAvatar(avatar),
|
||||
mTexLayerSet(layerset),
|
||||
mID(id),
|
||||
mStartTime(LLFrameTimer::getTotalTime()), // Record starting time
|
||||
mIsHighestRes(highest_res)
|
||||
{
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLViewerTexLayerSetBuffer
|
||||
// The composite image that a LLViewerTexLayerSet writes to. Each LLViewerTexLayerSet has one.
|
||||
|
|
@ -75,15 +58,10 @@ LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner,
|
|||
// ORDER_LAST => must render these after the hints are created.
|
||||
LLTexLayerSetBuffer(owner),
|
||||
LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ),
|
||||
mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates
|
||||
mNeedsUpload(FALSE),
|
||||
mNumLowresUploads(0),
|
||||
mUploadFailCount(0),
|
||||
mNeedsUpdate(TRUE),
|
||||
mNumLowresUpdates(0)
|
||||
{
|
||||
LLViewerTexLayerSetBuffer::sGLByteCount += getSize();
|
||||
mNeedsUploadTimer.start();
|
||||
mNeedsUpdateTimer.start();
|
||||
}
|
||||
|
||||
|
|
@ -126,33 +104,6 @@ void LLViewerTexLayerSetBuffer::requestUpdate()
|
|||
restartUpdateTimer();
|
||||
mNeedsUpdate = TRUE;
|
||||
mNumLowresUpdates = 0;
|
||||
// If we're in the middle of uploading a baked texture, we don't care about it any more.
|
||||
// When it's downloaded, ignore it.
|
||||
mUploadID.setNull();
|
||||
}
|
||||
|
||||
void LLViewerTexLayerSetBuffer::requestUpload()
|
||||
{
|
||||
conditionalRestartUploadTimer();
|
||||
mNeedsUpload = TRUE;
|
||||
mNumLowresUploads = 0;
|
||||
mUploadPending = TRUE;
|
||||
}
|
||||
|
||||
void LLViewerTexLayerSetBuffer::conditionalRestartUploadTimer()
|
||||
{
|
||||
// If we requested a new upload but haven't even uploaded
|
||||
// a low res version of our last upload request, then
|
||||
// keep the timer ticking instead of resetting it.
|
||||
if (mNeedsUpload && (mNumLowresUploads == 0))
|
||||
{
|
||||
mNeedsUploadTimer.unpause();
|
||||
}
|
||||
else
|
||||
{
|
||||
mNeedsUploadTimer.reset();
|
||||
mNeedsUploadTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerTexLayerSetBuffer::restartUpdateTimer()
|
||||
|
|
@ -161,25 +112,16 @@ void LLViewerTexLayerSetBuffer::restartUpdateTimer()
|
|||
mNeedsUpdateTimer.start();
|
||||
}
|
||||
|
||||
void LLViewerTexLayerSetBuffer::cancelUpload()
|
||||
{
|
||||
mNeedsUpload = FALSE;
|
||||
mUploadPending = FALSE;
|
||||
mNeedsUploadTimer.pause();
|
||||
mUploadRetryTimer.reset();
|
||||
}
|
||||
|
||||
// virtual
|
||||
BOOL LLViewerTexLayerSetBuffer::needsRender()
|
||||
{
|
||||
llassert(mTexLayerSet->getAvatarAppearance() == gAgentAvatarp);
|
||||
if (!isAgentAvatarValid()) return FALSE;
|
||||
|
||||
const BOOL upload_now = mNeedsUpload && isReadyToUpload();
|
||||
const BOOL update_now = mNeedsUpdate && isReadyToUpdate();
|
||||
|
||||
// Don't render if we don't want to (or aren't ready to) upload or update.
|
||||
if (!(update_now || upload_now))
|
||||
// Don't render if we don't want to (or aren't ready to) update.
|
||||
if (!update_now)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -190,11 +132,10 @@ BOOL LLViewerTexLayerSetBuffer::needsRender()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
// Don't render if we are trying to create a shirt texture but aren't wearing a skirt.
|
||||
// Don't render if we are trying to create a skirt texture but aren't wearing a skirt.
|
||||
if (gAgentAvatarp->getBakedTE(getViewerTexLayerSet()) == LLAvatarAppearanceDefines::TEX_SKIRT_BAKED &&
|
||||
!gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT))
|
||||
{
|
||||
cancelUpload();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
@ -222,36 +163,7 @@ void LLViewerTexLayerSetBuffer::postRenderTexLayerSet(BOOL success)
|
|||
// virtual
|
||||
void LLViewerTexLayerSetBuffer::midRenderTexLayerSet(BOOL success)
|
||||
{
|
||||
// do we need to upload, and do we have sufficient data to create an uploadable composite?
|
||||
// TODO: When do we upload the texture if gAgent.mNumPendingQueries is non-zero?
|
||||
const BOOL upload_now = mNeedsUpload && isReadyToUpload();
|
||||
const BOOL update_now = mNeedsUpdate && isReadyToUpdate();
|
||||
|
||||
if(upload_now)
|
||||
{
|
||||
if (!success)
|
||||
{
|
||||
llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegionName() << llendl;
|
||||
mUploadPending = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLViewerTexLayerSet* layer_set = getViewerTexLayerSet();
|
||||
if (layer_set->isVisible())
|
||||
{
|
||||
layer_set->getAvatar()->debugBakedTextureUpload(layer_set->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish.
|
||||
doUpload();
|
||||
}
|
||||
else
|
||||
{
|
||||
mUploadPending = FALSE;
|
||||
mNeedsUpload = FALSE;
|
||||
mNeedsUploadTimer.pause();
|
||||
layer_set->getAvatar()->setNewBakedTexture(layer_set->getBakedTexIndex(),IMG_INVISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (update_now)
|
||||
{
|
||||
doUpdate();
|
||||
|
|
@ -267,61 +179,6 @@ BOOL LLViewerTexLayerSetBuffer::isInitialized(void) const
|
|||
return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated();
|
||||
}
|
||||
|
||||
BOOL LLViewerTexLayerSetBuffer::uploadPending() const
|
||||
{
|
||||
return mUploadPending;
|
||||
}
|
||||
|
||||
// SUNSHINE CLEANUP no upload
|
||||
BOOL LLViewerTexLayerSetBuffer::uploadNeeded() const
|
||||
{
|
||||
return mNeedsUpload;
|
||||
}
|
||||
|
||||
BOOL LLViewerTexLayerSetBuffer::uploadInProgress() const
|
||||
{
|
||||
return !mUploadID.isNull();
|
||||
}
|
||||
|
||||
BOOL LLViewerTexLayerSetBuffer::isReadyToUpload() const
|
||||
{
|
||||
if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries.
|
||||
if (isAgentAvatarValid() && gAgentAvatarp->isEditingAppearance()) return FALSE; // Don't upload if avatar is being edited.
|
||||
|
||||
BOOL ready = FALSE;
|
||||
if (getViewerTexLayerSet()->isLocalTextureDataFinal())
|
||||
{
|
||||
// If we requested an upload and have the final LOD ready, upload (or wait a while if this is a retry)
|
||||
if (mUploadFailCount == 0)
|
||||
{
|
||||
ready = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
ready = mUploadRetryTimer.getElapsedTimeF32() >= BAKE_UPLOAD_RETRY_DELAY * (1 << (mUploadFailCount - 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Upload if we've hit a timeout. Upload is a pretty expensive process so we need to make sure
|
||||
// we aren't doing uploads too frequently.
|
||||
const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureUploadTimeout");
|
||||
if (texture_timeout != 0)
|
||||
{
|
||||
// The timeout period increases exponentially between every lowres upload in order to prevent
|
||||
// spamming the server with frequent uploads.
|
||||
const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads);
|
||||
|
||||
// If we hit our timeout and have textures available at even lower resolution, then upload.
|
||||
const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold;
|
||||
const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable();
|
||||
ready = has_lower_lod && is_upload_textures_timeout;
|
||||
}
|
||||
}
|
||||
|
||||
return ready;
|
||||
}
|
||||
|
||||
BOOL LLViewerTexLayerSetBuffer::isReadyToUpdate() const
|
||||
{
|
||||
// If we requested an update and have the final LOD ready, then update.
|
||||
|
|
@ -359,159 +216,6 @@ BOOL LLViewerTexLayerSetBuffer::requestUpdateImmediate()
|
|||
return result;
|
||||
}
|
||||
|
||||
// Create the baked texture, send it out to the server, then wait for it to come
|
||||
// back so we can switch to using it.
|
||||
void LLViewerTexLayerSetBuffer::doUpload()
|
||||
{
|
||||
LLViewerTexLayerSet* layer_set = getViewerTexLayerSet();
|
||||
LL_DEBUGS("Avatar") << "Uploading baked " << layer_set->getBodyRegionName() << llendl;
|
||||
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES);
|
||||
|
||||
// Don't need caches since we're baked now. (note: we won't *really* be baked
|
||||
// until this image is sent to the server and the Avatar Appearance message is received.)
|
||||
layer_set->deleteCaches();
|
||||
|
||||
// Get the COLOR information from our texture
|
||||
U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ];
|
||||
glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data );
|
||||
stop_glerror();
|
||||
|
||||
// Get the MASK information from our texture
|
||||
LLGLSUIDefault gls_ui;
|
||||
LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 );
|
||||
U8* baked_mask_data = baked_mask_image->getData();
|
||||
layer_set->gatherMorphMaskAlpha(baked_mask_data,
|
||||
mOrigin.mX, mOrigin.mY,
|
||||
mFullWidth, mFullHeight);
|
||||
|
||||
|
||||
// Create the baked image from our color and mask information
|
||||
const S32 baked_image_components = 5; // red green blue [bump] clothing
|
||||
LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components );
|
||||
U8* baked_image_data = baked_image->getData();
|
||||
S32 i = 0;
|
||||
for (S32 u=0; u < mFullWidth; u++)
|
||||
{
|
||||
for (S32 v=0; v < mFullHeight; v++)
|
||||
{
|
||||
baked_image_data[5*i + 0] = baked_color_data[4*i + 0];
|
||||
baked_image_data[5*i + 1] = baked_color_data[4*i + 1];
|
||||
baked_image_data[5*i + 2] = baked_color_data[4*i + 2];
|
||||
baked_image_data[5*i + 3] = baked_color_data[4*i + 3]; // alpha should be correct for eyelashes.
|
||||
baked_image_data[5*i + 4] = baked_mask_data[i];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C;
|
||||
const char* comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // writes into baked_color_data. 5 channels (rgb, heightfield/alpha, mask)
|
||||
if (compressedImage->encode(baked_image, comment_text))
|
||||
{
|
||||
LLTransactionID tid;
|
||||
tid.generate();
|
||||
const LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
|
||||
if (LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(),
|
||||
gVFS, asset_id, LLAssetType::AT_TEXTURE))
|
||||
{
|
||||
// Read back the file and validate.
|
||||
BOOL valid = FALSE;
|
||||
LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
|
||||
S32 file_size = 0;
|
||||
LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE);
|
||||
file_size = file.getSize();
|
||||
U8* data = integrity_test->allocateData(file_size);
|
||||
file.read(data, file_size);
|
||||
if (data)
|
||||
{
|
||||
valid = integrity_test->validate(data, file_size); // integrity_test will delete 'data'
|
||||
}
|
||||
else
|
||||
{
|
||||
integrity_test->setLastError("Unable to read entire file");
|
||||
}
|
||||
|
||||
if (valid)
|
||||
{
|
||||
const bool highest_lod = layer_set->isLocalTextureDataFinal();
|
||||
// Baked_upload_data is owned by the responder and deleted after the request completes.
|
||||
LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp,
|
||||
layer_set,
|
||||
asset_id,
|
||||
highest_lod);
|
||||
// upload ID is used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit.
|
||||
mUploadID = asset_id;
|
||||
|
||||
// Upload the image
|
||||
const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture");
|
||||
if(!url.empty()
|
||||
&& !LLPipeline::sForceOldBakedUpload // toggle debug setting UploadBakedTexOld to change between the new caps method and old method
|
||||
&& (mUploadFailCount < (BAKE_UPLOAD_ATTEMPTS - 1))) // Try last ditch attempt via asset store if cap upload is failing.
|
||||
{
|
||||
LLSD body = LLSD::emptyMap();
|
||||
// The responder will call LLViewerTexLayerSetBuffer::onTextureUploadComplete()
|
||||
LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data));
|
||||
llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
gAssetStorage->storeAssetData(tid,
|
||||
LLAssetType::AT_TEXTURE,
|
||||
LLViewerTexLayerSetBuffer::onTextureUploadComplete,
|
||||
baked_upload_data,
|
||||
TRUE, // temp_file
|
||||
TRUE, // is_priority
|
||||
TRUE); // store_local
|
||||
llinfos << "Baked texture upload via Asset Store." << llendl;
|
||||
}
|
||||
|
||||
if (highest_lod)
|
||||
{
|
||||
// Sending the final LOD for the baked texture. All done, pause
|
||||
// the upload timer so we know how long it took.
|
||||
mNeedsUpload = FALSE;
|
||||
mNeedsUploadTimer.pause();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Sending a lower level LOD for the baked texture. Restart the upload timer.
|
||||
mNumLowresUploads++;
|
||||
mNeedsUploadTimer.unpause();
|
||||
mNeedsUploadTimer.reset();
|
||||
}
|
||||
|
||||
// Print out notification that we uploaded this texture.
|
||||
if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
|
||||
{
|
||||
const std::string lod_str = highest_lod ? "HighRes" : "LowRes";
|
||||
LLSD args;
|
||||
args["EXISTENCE"] = llformat("%d",(U32)layer_set->getAvatar()->debugGetExistenceTimeElapsedF32());
|
||||
args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32());
|
||||
args["BODYREGION"] = layer_set->getBodyRegionName();
|
||||
args["RESOLUTION"] = lod_str;
|
||||
LLNotificationsUtil::add("AvatarRezSelfBakedTextureUploadNotification",args);
|
||||
LL_DEBUGS("Avatar") << self_av_string() << "Uploading [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// The read back and validate operation failed. Remove the uploaded file.
|
||||
mUploadPending = FALSE;
|
||||
LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE);
|
||||
file.remove();
|
||||
llinfos << "Unable to create baked upload file (reason: corrupted)." << llendl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// The VFS write file operation failed.
|
||||
mUploadPending = FALSE;
|
||||
llinfos << "Unable to create baked upload file (reason: failed to write file)" << llendl;
|
||||
}
|
||||
|
||||
delete [] baked_color_data;
|
||||
}
|
||||
|
||||
// Mostly bookkeeping; don't need to actually "do" anything since
|
||||
// render() will actually do the update.
|
||||
void LLViewerTexLayerSetBuffer::doUpdate()
|
||||
|
|
@ -548,82 +252,6 @@ void LLViewerTexLayerSetBuffer::doUpdate()
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
|
||||
void* userdata,
|
||||
S32 result,
|
||||
LLExtStat ext_status) // StoreAssetData callback (not fixed)
|
||||
{
|
||||
LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata;
|
||||
|
||||
if (isAgentAvatarValid() &&
|
||||
!gAgentAvatarp->isDead() &&
|
||||
(baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures.
|
||||
(baked_upload_data->mTexLayerSet->hasComposite()))
|
||||
{
|
||||
LLViewerTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getViewerComposite();
|
||||
S32 failures = layerset_buffer->mUploadFailCount;
|
||||
layerset_buffer->mUploadFailCount = 0;
|
||||
|
||||
if (layerset_buffer->mUploadID.isNull())
|
||||
{
|
||||
// The upload got canceled, we should be in the
|
||||
// process of baking a new texture so request an
|
||||
// upload with the new data
|
||||
|
||||
// BAP: does this really belong in this callback, as
|
||||
// opposed to where the cancellation takes place?
|
||||
// suspect this does nothing.
|
||||
layerset_buffer->requestUpload();
|
||||
}
|
||||
else if (baked_upload_data->mID == layerset_buffer->mUploadID)
|
||||
{
|
||||
// This is the upload we're currently waiting for.
|
||||
layerset_buffer->mUploadID.setNull();
|
||||
const std::string name(baked_upload_data->mTexLayerSet->getBodyRegionName());
|
||||
const std::string resolution = baked_upload_data->mIsHighestRes ? " full res " : " low res ";
|
||||
if (result >= 0)
|
||||
{
|
||||
layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later
|
||||
LLAvatarAppearanceDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->getViewerTexLayerSet());
|
||||
// Update baked texture info with the new UUID
|
||||
U64 now = LLFrameTimer::getTotalTime(); // Record starting time
|
||||
llinfos << "Baked" << resolution << "texture upload for " << name << " took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
|
||||
gAgentAvatarp->setNewBakedTexture(baked_te, uuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
++failures;
|
||||
S32 max_attempts = baked_upload_data->mIsHighestRes ? BAKE_UPLOAD_ATTEMPTS : 1; // only retry final bakes
|
||||
llwarns << "Baked" << resolution << "texture upload for " << name << " failed (attempt " << failures << "/" << max_attempts << ")" << llendl;
|
||||
if (failures < max_attempts)
|
||||
{
|
||||
layerset_buffer->mUploadFailCount = failures;
|
||||
layerset_buffer->mUploadRetryTimer.start();
|
||||
layerset_buffer->requestUpload();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "Received baked texture out of date, ignored." << llendl;
|
||||
}
|
||||
|
||||
gAgentAvatarp->dirtyMesh();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Baked texture failed to upload (in which case since we
|
||||
// didn't set the new baked texture, it means that they'll try
|
||||
// and rebake it at some point in the future (after login?)),
|
||||
// or this response to upload is out of date, in which case a
|
||||
// current response should be on the way or already processed.
|
||||
llwarns << "Baked upload failed" << llendl;
|
||||
}
|
||||
|
||||
delete baked_upload_data;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLViewerTexLayerSet
|
||||
// An ordered set of texture layers that get composited into a single texture.
|
||||
|
|
@ -665,20 +293,6 @@ void LLViewerTexLayerSet::requestUpdate()
|
|||
}
|
||||
}
|
||||
|
||||
void LLViewerTexLayerSet::requestUpload()
|
||||
{
|
||||
createComposite();
|
||||
getViewerComposite()->requestUpload();
|
||||
}
|
||||
|
||||
void LLViewerTexLayerSet::cancelUpload()
|
||||
{
|
||||
if(mComposite)
|
||||
{
|
||||
getViewerComposite()->cancelUpload();
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerTexLayerSet::updateComposite()
|
||||
{
|
||||
createComposite();
|
||||
|
|
@ -727,18 +341,17 @@ const LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite() const
|
|||
}
|
||||
|
||||
|
||||
// SUNSHINE CLEANUP - this used to have a bunch of upload related stuff, doesn't really serve a purpose now.
|
||||
const std::string LLViewerTexLayerSetBuffer::dumpTextureInfo() const
|
||||
{
|
||||
if (!isAgentAvatarValid()) return "";
|
||||
|
||||
const BOOL is_high_res = !mNeedsUpload;
|
||||
const U32 num_low_res = mNumLowresUploads;
|
||||
const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32();
|
||||
const BOOL is_high_res = TRUE;
|
||||
const U32 num_low_res = 0;
|
||||
const U32 upload_time = 0;
|
||||
const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(getViewerTexLayerSet());
|
||||
|
||||
std::string status = "CREATING ";
|
||||
if (!uploadNeeded()) status = "DONE ";
|
||||
if (uploadInProgress()) status = "UPLOADING";
|
||||
std::string status = "DONE ";
|
||||
|
||||
std::string text = llformat("[%s] [HiRes:%d LoRes:%d] [Elapsed:%d] %s",
|
||||
status.c_str(),
|
||||
|
|
|
|||
|
|
@ -47,8 +47,6 @@ public:
|
|||
virtual ~LLViewerTexLayerSet();
|
||||
|
||||
/*virtual*/void requestUpdate();
|
||||
void requestUpload();
|
||||
void cancelUpload();
|
||||
BOOL isLocalTextureDataAvailable() const;
|
||||
BOOL isLocalTextureDataFinal() const;
|
||||
void updateComposite();
|
||||
|
|
@ -115,47 +113,6 @@ protected:
|
|||
virtual void postRender(BOOL success) { postRenderTexLayerSet(success); }
|
||||
virtual BOOL render() { return renderTexLayerSet(); }
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Uploads
|
||||
//--------------------------------------------------------------------
|
||||
public:
|
||||
// SUNSHINE CLEANUP no upload
|
||||
void requestUpload();
|
||||
// SUNSHINE CLEANUP no upload
|
||||
void cancelUpload();
|
||||
// SUNSHINE CLEANUP no upload
|
||||
BOOL uploadNeeded() const; // We need to upload a new texture
|
||||
// SUNSHINE CLEANUP no upload
|
||||
BOOL uploadInProgress() const; // We have started uploading a new texture and are awaiting the result
|
||||
// SUNSHINE CLEANUP no upload
|
||||
BOOL uploadPending() const; // We are expecting a new texture to be uploaded at some point
|
||||
// SUNSHINE CLEANUP no upload
|
||||
static void onTextureUploadComplete(const LLUUID& uuid,
|
||||
void* userdata,
|
||||
S32 result, LLExtStat ext_status);
|
||||
protected:
|
||||
// SUNSHINE CLEANUP no upload
|
||||
BOOL isReadyToUpload() const;
|
||||
// SUNSHINE CLEANUP no upload
|
||||
void doUpload(); // Does a read back and upload.
|
||||
// SUNSHINE CLEANUP no upload
|
||||
void conditionalRestartUploadTimer();
|
||||
private:
|
||||
// SUNSHINE CLEANUP no upload
|
||||
BOOL mNeedsUpload; // Whether we need to send our baked textures to the server
|
||||
// SUNSHINE CLEANUP no upload
|
||||
U32 mNumLowresUploads; // Number of times we've sent a lowres version of our baked textures to the server
|
||||
// SUNSHINE CLEANUP no upload
|
||||
BOOL mUploadPending; // Whether we have received back the new baked textures
|
||||
// SUNSHINE CLEANUP no upload
|
||||
LLUUID mUploadID; // The current upload process (null if none).
|
||||
// SUNSHINE CLEANUP no upload
|
||||
LLFrameTimer mNeedsUploadTimer; // Tracks time since upload was requested and performed.
|
||||
// SUNSHINE CLEANUP no upload
|
||||
S32 mUploadFailCount; // Number of consecutive upload failures
|
||||
// SUNSHINE CLEANUP no upload
|
||||
LLFrameTimer mUploadRetryTimer; // Tracks time since last upload failure.
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Updates
|
||||
//--------------------------------------------------------------------
|
||||
|
|
@ -172,26 +129,5 @@ private:
|
|||
LLFrameTimer mNeedsUpdateTimer; // Tracks time since update was requested and performed.
|
||||
};
|
||||
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLBakedUploadData
|
||||
//
|
||||
// Used by LLTexLayerSetBuffer for a callback.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// SUNSHINE CLEANUP no upload
|
||||
struct LLBakedUploadData
|
||||
{
|
||||
LLBakedUploadData(const LLVOAvatarSelf* avatar,
|
||||
LLViewerTexLayerSet* layerset,
|
||||
const LLUUID& id,
|
||||
bool highest_res);
|
||||
~LLBakedUploadData() {}
|
||||
const LLUUID mID;
|
||||
const LLVOAvatarSelf* mAvatar; // note: backlink only; don't LLPointer
|
||||
LLViewerTexLayerSet* mTexLayerSet;
|
||||
const U64 mStartTime; // for measuring baked texture upload time
|
||||
const bool mIsHighestRes; // whether this is a "final" bake, or intermediate low res
|
||||
};
|
||||
|
||||
#endif // LL_VIEWER_TEXLAYER_H
|
||||
|
||||
|
|
|
|||
|
|
@ -673,7 +673,6 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
|
|||
return LLVOAvatar::getJoint(name);
|
||||
}
|
||||
// virtual
|
||||
// SUNSHINE CLEANUP no upload_bake
|
||||
BOOL LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32 weight)
|
||||
{
|
||||
if (!which_param)
|
||||
|
|
@ -685,7 +684,6 @@ BOOL LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32
|
|||
}
|
||||
|
||||
// virtual
|
||||
// SUNSHINE CLEANUP no upload_bake
|
||||
BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight)
|
||||
{
|
||||
if (!param_name)
|
||||
|
|
@ -697,14 +695,12 @@ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight)
|
|||
}
|
||||
|
||||
// virtual
|
||||
// SUNSHINE CLEANUP no upload_bake
|
||||
BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight)
|
||||
{
|
||||
LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index);
|
||||
return setParamWeight(param,weight);
|
||||
}
|
||||
|
||||
// SUNSHINE CLEANUP no upload_bake
|
||||
BOOL LLVOAvatarSelf::setParamWeight(const LLViewerVisualParam *param, F32 weight)
|
||||
{
|
||||
if (!param)
|
||||
|
|
@ -893,10 +889,6 @@ void LLVOAvatarSelf::removeMissingBakedTextures()
|
|||
invalidateComposite(layerset);
|
||||
}
|
||||
updateMeshTextures();
|
||||
if (getRegion() && !getRegion()->getCentralBakeVersion())
|
||||
{
|
||||
requestLayerSetUploads();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1512,15 +1504,6 @@ BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLVOAvatarSelf::isBakedTextureFinal(const LLAvatarAppearanceDefines::EBakedTextureIndex index) const
|
||||
{
|
||||
const LLViewerTexLayerSet *layerset = getLayerSet(index);
|
||||
if (!layerset) return FALSE;
|
||||
const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite();
|
||||
if (!layerset_buffer) return FALSE;
|
||||
return !layerset_buffer->uploadNeeded();
|
||||
}
|
||||
|
||||
BOOL LLVOAvatarSelf::isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const
|
||||
{
|
||||
LLUUID id;
|
||||
|
|
@ -1578,49 +1561,11 @@ BOOL LLVOAvatarSelf::isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex t
|
|||
return isTextureVisible(type,index);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// requestLayerSetUploads()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLVOAvatarSelf::requestLayerSetUploads()
|
||||
{
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
requestLayerSetUpload((EBakedTextureIndex)i);
|
||||
}
|
||||
}
|
||||
|
||||
void LLVOAvatarSelf::requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedTextureIndex i)
|
||||
{
|
||||
ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
|
||||
const BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
|
||||
LLViewerTexLayerSet *layerset = getLayerSet(i);
|
||||
if (!layer_baked && layerset)
|
||||
{
|
||||
layerset->requestUpload();
|
||||
}
|
||||
}
|
||||
|
||||
bool LLVOAvatarSelf::areTexturesCurrent() const
|
||||
{
|
||||
return !hasPendingBakedUploads() && gAgentWearables.areWearablesLoaded();
|
||||
return gAgentWearables.areWearablesLoaded();
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool LLVOAvatarSelf::hasPendingBakedUploads() const
|
||||
{
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
LLViewerTexLayerSet* layerset = getTexLayerSet(i);
|
||||
if (layerset && layerset->getViewerComposite() && layerset->getViewerComposite()->uploadPending())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// SUNSHINE CLEANUP no upload_bake
|
||||
void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset)
|
||||
{
|
||||
LLViewerTexLayerSet *layer_set = dynamic_cast<LLViewerTexLayerSet*>(layerset);
|
||||
|
|
@ -2694,7 +2639,9 @@ void LLVOAvatarSelf::setNewBakedTexture(LLAvatarAppearanceDefines::EBakedTexture
|
|||
void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
|
||||
{
|
||||
// SUNSHINE CLEANUP
|
||||
// If we reinstate processUpdateMessage(), this needs to be updated for server-bake textures.
|
||||
llassert(false);
|
||||
|
||||
// Baked textures live on other sims.
|
||||
LLHost target_host = getObjectHost();
|
||||
setTEImage( te, LLViewerTextureManager::getFetchedTextureFromHost( uuid, FTT_HOST_BAKE, target_host ) );
|
||||
|
|
@ -2719,40 +2666,37 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
|
|||
|
||||
// dumpAvatarTEs( "setNewBakedTexture() send" );
|
||||
// RN: throttle uploads
|
||||
if (!hasPendingBakedUploads())
|
||||
if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
|
||||
{
|
||||
if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
|
||||
LLSD args;
|
||||
args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
|
||||
args["TIME"] = llformat("%d",(U32)mDebugSelfLoadTimer.getElapsedTimeF32());
|
||||
if (isAllLocalTextureDataFinal())
|
||||
{
|
||||
LLSD args;
|
||||
args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
|
||||
args["TIME"] = llformat("%d",(U32)mDebugSelfLoadTimer.getElapsedTimeF32());
|
||||
if (isAllLocalTextureDataFinal())
|
||||
{
|
||||
LLNotificationsUtil::add("AvatarRezSelfBakedDoneNotification",args);
|
||||
LL_DEBUGS("Avatar") << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32()
|
||||
<< "sec ]"
|
||||
<< avString()
|
||||
<< "RuthTimer " << (U32)mRuthDebugTimer.getElapsedTimeF32()
|
||||
<< " SelfLoadTimer " << (U32)mDebugSelfLoadTimer.getElapsedTimeF32()
|
||||
<< " Notification " << "AvatarRezSelfBakedDoneNotification"
|
||||
<< llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
args["STATUS"] = debugDumpAllLocalTextureDataInfo();
|
||||
LLNotificationsUtil::add("AvatarRezSelfBakedUpdateNotification",args);
|
||||
LL_DEBUGS("Avatar") << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32()
|
||||
<< "sec ]"
|
||||
<< avString()
|
||||
<< "RuthTimer " << (U32)mRuthDebugTimer.getElapsedTimeF32()
|
||||
<< " SelfLoadTimer " << (U32)mDebugSelfLoadTimer.getElapsedTimeF32()
|
||||
<< " Notification " << "AvatarRezSelfBakedUpdateNotification"
|
||||
<< llendl;
|
||||
}
|
||||
LLNotificationsUtil::add("AvatarRezSelfBakedDoneNotification",args);
|
||||
LL_DEBUGS("Avatar") << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32()
|
||||
<< "sec ]"
|
||||
<< avString()
|
||||
<< "RuthTimer " << (U32)mRuthDebugTimer.getElapsedTimeF32()
|
||||
<< " SelfLoadTimer " << (U32)mDebugSelfLoadTimer.getElapsedTimeF32()
|
||||
<< " Notification " << "AvatarRezSelfBakedDoneNotification"
|
||||
<< llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
args["STATUS"] = debugDumpAllLocalTextureDataInfo();
|
||||
LLNotificationsUtil::add("AvatarRezSelfBakedUpdateNotification",args);
|
||||
LL_DEBUGS("Avatar") << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32()
|
||||
<< "sec ]"
|
||||
<< avString()
|
||||
<< "RuthTimer " << (U32)mRuthDebugTimer.getElapsedTimeF32()
|
||||
<< " SelfLoadTimer " << (U32)mDebugSelfLoadTimer.getElapsedTimeF32()
|
||||
<< " Notification " << "AvatarRezSelfBakedUpdateNotification"
|
||||
<< llendl;
|
||||
}
|
||||
|
||||
outputRezDiagnostics();
|
||||
}
|
||||
|
||||
outputRezDiagnostics();
|
||||
}
|
||||
|
||||
// FIXME: This is not called consistently. Something may be broken.
|
||||
|
|
@ -2830,40 +2774,6 @@ void LLVOAvatarSelf::reportAvatarRezTime() const
|
|||
// TODO: report mDebugSelfLoadTimer.getElapsedTimeF32() somehow.
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// setCachedBakedTexture()
|
||||
// A baked texture id was received from a cache query, make it active
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid )
|
||||
{
|
||||
setTETexture( te, uuid );
|
||||
|
||||
/* switch(te)
|
||||
case TEX_HEAD_BAKED:
|
||||
if( mHeadLayerSet )
|
||||
mHeadLayerSet->cancelUpload(); */
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
LLViewerTexLayerSet *layerset = getTexLayerSet(i);
|
||||
if ( mBakedTextureDatas[i].mTextureIndex == te && layerset)
|
||||
{
|
||||
if (mInitialBakeIDs[i] != LLUUID::null)
|
||||
{
|
||||
if (mInitialBakeIDs[i] == uuid)
|
||||
{
|
||||
llinfos << "baked texture correctly loaded at login! " << i << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "baked texture does not match id loaded at login!" << i << llendl;
|
||||
}
|
||||
mInitialBakeIDs[i] = LLUUID::null;
|
||||
}
|
||||
layerset->cancelUpload();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
|
||||
{
|
||||
|
|
@ -2926,7 +2836,6 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)
|
|||
if (slam_for_debug)
|
||||
{
|
||||
layer_set->setUpdatesEnabled(TRUE);
|
||||
layer_set->cancelUpload();
|
||||
}
|
||||
|
||||
invalidateComposite(layer_set);
|
||||
|
|
|
|||
|
|
@ -197,12 +197,10 @@ public:
|
|||
//--------------------------------------------------------------------
|
||||
public:
|
||||
// SUNSHINE CLEANUP
|
||||
/*virtual*/ bool hasPendingBakedUploads() const;
|
||||
S32 getLocalDiscardLevel(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const;
|
||||
bool areTexturesCurrent() const;
|
||||
BOOL isLocalTextureDataAvailable(const LLViewerTexLayerSet* layerset) const;
|
||||
BOOL isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset) const;
|
||||
BOOL isBakedTextureFinal(const LLAvatarAppearanceDefines::EBakedTextureIndex index) const;
|
||||
// If you want to check all textures of a given type, pass gAgentWearables.getWearableCount() for index
|
||||
/*virtual*/ BOOL isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const;
|
||||
/*virtual*/ BOOL isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const;
|
||||
|
|
@ -237,9 +235,9 @@ private:
|
|||
//--------------------------------------------------------------------
|
||||
public:
|
||||
LLAvatarAppearanceDefines::ETextureIndex getBakedTE(const LLViewerTexLayerSet* layerset ) const;
|
||||
// SUNSHINE CLEANUP - dead?
|
||||
void setNewBakedTexture(LLAvatarAppearanceDefines::EBakedTextureIndex i, const LLUUID &uuid);
|
||||
void setNewBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i, const LLUUID& uuid);
|
||||
void setCachedBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i, const LLUUID& uuid);
|
||||
void forceBakeAllTextures(bool slam_for_debug = false);
|
||||
static void processRebakeAvatarTextures(LLMessageSystem* msg, void**);
|
||||
protected:
|
||||
|
|
@ -249,9 +247,6 @@ protected:
|
|||
// Layers
|
||||
//--------------------------------------------------------------------
|
||||
public:
|
||||
// SUNSHINE CLEANUP
|
||||
void requestLayerSetUploads();
|
||||
void requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedTextureIndex i);
|
||||
void requestLayerSetUpdate(LLAvatarAppearanceDefines::ETextureIndex i);
|
||||
LLViewerTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const;
|
||||
LLViewerTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::ETextureIndex index) const;
|
||||
|
|
|
|||
Loading…
Reference in New Issue