summaryrefslogtreecommitdiff
path: root/indra/newview/llviewertexlayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llviewertexlayer.cpp')
-rw-r--r--indra/newview/llviewertexlayer.cpp344
1 files changed, 172 insertions, 172 deletions
diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp
index 4c2fbcf837..e57fec45e6 100644
--- a/indra/newview/llviewertexlayer.cpp
+++ b/indra/newview/llviewertexlayer.cpp
@@ -1,25 +1,25 @@
-/**
+/**
* @file llviewertexlayer.cpp
* @brief Viewer texture layer. Used for avatars.
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
- *
+ *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
- *
+ *
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -48,205 +48,205 @@ extern std::string self_av_string();
// static
S32 LLViewerTexLayerSetBuffer::sGLByteCount = 0;
-LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner,
- S32 width, S32 height) :
- // ORDER_LAST => must render these after the hints are created.
- LLTexLayerSetBuffer(owner),
+LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner,
+ S32 width, S32 height) :
+ // ORDER_LAST => must render these after the hints are created.
+ LLTexLayerSetBuffer(owner),
LLViewerDynamicTexture(width, height, 4, LLViewerDynamicTexture::ORDER_LAST, FALSE),
- mNeedsUpdate(TRUE),
- mNumLowresUpdates(0)
+ mNeedsUpdate(TRUE),
+ mNumLowresUpdates(0)
{
- mGLTexturep->setNeedsAlphaAndPickMask(FALSE);
+ mGLTexturep->setNeedsAlphaAndPickMask(FALSE);
- LLViewerTexLayerSetBuffer::sGLByteCount += getSize();
- mNeedsUpdateTimer.start();
+ LLViewerTexLayerSetBuffer::sGLByteCount += getSize();
+ mNeedsUpdateTimer.start();
}
LLViewerTexLayerSetBuffer::~LLViewerTexLayerSetBuffer()
{
- LLViewerTexLayerSetBuffer::sGLByteCount -= getSize();
- destroyGLTexture();
- for( S32 order = 0; order < ORDER_COUNT; order++ )
- {
- LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case.
- }
+ LLViewerTexLayerSetBuffer::sGLByteCount -= getSize();
+ destroyGLTexture();
+ for( S32 order = 0; order < ORDER_COUNT; order++ )
+ {
+ LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case.
+ }
}
-//virtual
-S8 LLViewerTexLayerSetBuffer::getType() const
+//virtual
+S8 LLViewerTexLayerSetBuffer::getType() const
{
- return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ;
+ return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ;
}
-//virtual
-void LLViewerTexLayerSetBuffer::restoreGLTexture()
-{
- LLViewerDynamicTexture::restoreGLTexture() ;
+//virtual
+void LLViewerTexLayerSetBuffer::restoreGLTexture()
+{
+ LLViewerDynamicTexture::restoreGLTexture() ;
}
-//virtual
-void LLViewerTexLayerSetBuffer::destroyGLTexture()
+//virtual
+void LLViewerTexLayerSetBuffer::destroyGLTexture()
{
- LLViewerDynamicTexture::destroyGLTexture() ;
+ LLViewerDynamicTexture::destroyGLTexture() ;
}
// static
void LLViewerTexLayerSetBuffer::dumpTotalByteCount()
{
- LL_INFOS() << "Composite System GL Buffers: " << (LLViewerTexLayerSetBuffer::sGLByteCount/1024) << "KB" << LL_ENDL;
+ LL_INFOS() << "Composite System GL Buffers: " << (LLViewerTexLayerSetBuffer::sGLByteCount/1024) << "KB" << LL_ENDL;
}
void LLViewerTexLayerSetBuffer::requestUpdate()
{
- restartUpdateTimer();
- mNeedsUpdate = TRUE;
- mNumLowresUpdates = 0;
+ restartUpdateTimer();
+ mNeedsUpdate = TRUE;
+ mNumLowresUpdates = 0;
}
void LLViewerTexLayerSetBuffer::restartUpdateTimer()
{
- mNeedsUpdateTimer.reset();
- mNeedsUpdateTimer.start();
+ mNeedsUpdateTimer.reset();
+ mNeedsUpdateTimer.start();
}
// virtual
BOOL LLViewerTexLayerSetBuffer::needsRender()
{
- llassert(mTexLayerSet->getAvatarAppearance() == gAgentAvatarp);
- if (!isAgentAvatarValid()) return FALSE;
-
- const BOOL update_now = mNeedsUpdate && isReadyToUpdate();
-
- // Don't render if we don't want to (or aren't ready to) update.
- if (!update_now)
- {
- return FALSE;
- }
-
- // Don't render if we're animating our appearance.
- if (gAgentAvatarp->getIsAppearanceAnimating())
- {
- return FALSE;
- }
-
- // 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))
- {
- return FALSE;
- }
-
- // Render if we have at least minimal level of detail for each local texture.
- return getViewerTexLayerSet()->isLocalTextureDataAvailable();
+ llassert(mTexLayerSet->getAvatarAppearance() == gAgentAvatarp);
+ if (!isAgentAvatarValid()) return FALSE;
+
+ const BOOL update_now = mNeedsUpdate && isReadyToUpdate();
+
+ // Don't render if we don't want to (or aren't ready to) update.
+ if (!update_now)
+ {
+ return FALSE;
+ }
+
+ // Don't render if we're animating our appearance.
+ if (gAgentAvatarp->getIsAppearanceAnimating())
+ {
+ return FALSE;
+ }
+
+ // 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))
+ {
+ return FALSE;
+ }
+
+ // Render if we have at least minimal level of detail for each local texture.
+ return getViewerTexLayerSet()->isLocalTextureDataAvailable();
}
// virtual
void LLViewerTexLayerSetBuffer::preRenderTexLayerSet()
{
- LLTexLayerSetBuffer::preRenderTexLayerSet();
-
- // keep depth buffer, we don't need to clear it
- LLViewerDynamicTexture::preRender(FALSE);
+ LLTexLayerSetBuffer::preRenderTexLayerSet();
+
+ // keep depth buffer, we don't need to clear it
+ LLViewerDynamicTexture::preRender(FALSE);
}
// virtual
void LLViewerTexLayerSetBuffer::postRenderTexLayerSet(BOOL success)
{
- LLTexLayerSetBuffer::postRenderTexLayerSet(success);
- LLViewerDynamicTexture::postRender(success);
+ LLTexLayerSetBuffer::postRenderTexLayerSet(success);
+ LLViewerDynamicTexture::postRender(success);
}
// virtual
void LLViewerTexLayerSetBuffer::midRenderTexLayerSet(BOOL success)
{
- const BOOL update_now = mNeedsUpdate && isReadyToUpdate();
- if (update_now)
- {
- doUpdate();
- }
-
- // *TODO: Old logic does not check success before setGLTextureCreated
- // we have valid texture data now
- mGLTexturep->setGLTextureCreated(true);
+ const BOOL update_now = mNeedsUpdate && isReadyToUpdate();
+ if (update_now)
+ {
+ doUpdate();
+ }
+
+ // *TODO: Old logic does not check success before setGLTextureCreated
+ // we have valid texture data now
+ mGLTexturep->setGLTextureCreated(true);
}
BOOL LLViewerTexLayerSetBuffer::isInitialized(void) const
{
- return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated();
+ return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated();
}
BOOL LLViewerTexLayerSetBuffer::isReadyToUpdate() const
{
- // If we requested an update and have the final LOD ready, then update.
- if (getViewerTexLayerSet()->isLocalTextureDataFinal()) return TRUE;
-
- // If we haven't done an update yet, then just do one now regardless of state of textures.
- if (mNumLowresUpdates == 0) return TRUE;
-
- // Update if we've hit a timeout. Unlike for uploads, we can make this timeout fairly small
- // since render unnecessarily doesn't cost much.
- const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedLocalTextureUpdateTimeout");
- if (texture_timeout != 0)
- {
- // If we hit our timeout and have textures available at even lower resolution, then update.
- const BOOL is_update_textures_timeout = mNeedsUpdateTimer.getElapsedTimeF32() >= texture_timeout;
- const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable();
- if (has_lower_lod && is_update_textures_timeout) return TRUE;
- }
-
- return FALSE;
+ // If we requested an update and have the final LOD ready, then update.
+ if (getViewerTexLayerSet()->isLocalTextureDataFinal()) return TRUE;
+
+ // If we haven't done an update yet, then just do one now regardless of state of textures.
+ if (mNumLowresUpdates == 0) return TRUE;
+
+ // Update if we've hit a timeout. Unlike for uploads, we can make this timeout fairly small
+ // since render unnecessarily doesn't cost much.
+ const U32 TEXTURE_TIMEOUT = 10;
+ if (TEXTURE_TIMEOUT != 0)
+ {
+ // If we hit our timeout and have textures available at even lower resolution, then update.
+ const BOOL is_update_textures_timeout = mNeedsUpdateTimer.getElapsedTimeF32() >= TEXTURE_TIMEOUT;
+ const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable();
+ if (has_lower_lod && is_update_textures_timeout) return TRUE;
+ }
+
+ return FALSE;
}
BOOL LLViewerTexLayerSetBuffer::requestUpdateImmediate()
{
- mNeedsUpdate = TRUE;
- BOOL result = FALSE;
+ mNeedsUpdate = TRUE;
+ BOOL result = FALSE;
- if (needsRender())
- {
- preRender(FALSE);
- result = render();
- postRender(result);
- }
+ if (needsRender())
+ {
+ preRender(FALSE);
+ result = render();
+ postRender(result);
+ }
- return result;
+ return result;
}
// Mostly bookkeeping; don't need to actually "do" anything since
// render() will actually do the update.
void LLViewerTexLayerSetBuffer::doUpdate()
{
- LLViewerTexLayerSet* layer_set = getViewerTexLayerSet();
- const BOOL highest_lod = layer_set->isLocalTextureDataFinal();
- if (highest_lod)
- {
- mNeedsUpdate = FALSE;
- }
- else
- {
- mNumLowresUpdates++;
- }
-
- restartUpdateTimer();
-
- // need to switch to using this layerset if this is the first update
- // after getting the lowest LOD
- layer_set->getAvatar()->updateMeshTextures();
-
- // Print out notification that we updated this texture.
- if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
- {
- const BOOL highest_lod = layer_set->isLocalTextureDataFinal();
- 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)mNeedsUpdateTimer.getElapsedTimeF32());
- args["BODYREGION"] = layer_set->getBodyRegionName();
- args["RESOLUTION"] = lod_str;
- LLNotificationsUtil::add("AvatarRezSelfBakedTextureUpdateNotification",args);
- LL_DEBUGS("Avatar") << self_av_string() << "Locally updating [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << LL_ENDL;
- }
+ LLViewerTexLayerSet* layer_set = getViewerTexLayerSet();
+ const BOOL highest_lod = layer_set->isLocalTextureDataFinal();
+ if (highest_lod)
+ {
+ mNeedsUpdate = FALSE;
+ }
+ else
+ {
+ mNumLowresUpdates++;
+ }
+
+ restartUpdateTimer();
+
+ // need to switch to using this layerset if this is the first update
+ // after getting the lowest LOD
+ layer_set->getAvatar()->updateMeshTextures();
+
+ // Print out notification that we updated this texture.
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
+ {
+ const BOOL highest_lod = layer_set->isLocalTextureDataFinal();
+ 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)mNeedsUpdateTimer.getElapsedTimeF32());
+ args["BODYREGION"] = layer_set->getBodyRegionName();
+ args["RESOLUTION"] = lod_str;
+ LLNotificationsUtil::add("AvatarRezSelfBakedTextureUpdateNotification",args);
+ LL_DEBUGS("Avatar") << self_av_string() << "Locally updating [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << LL_ENDL;
+ }
}
//-----------------------------------------------------------------------------
@@ -255,8 +255,8 @@ void LLViewerTexLayerSetBuffer::doUpdate()
//-----------------------------------------------------------------------------
LLViewerTexLayerSet::LLViewerTexLayerSet(LLAvatarAppearance* const appearance) :
- LLTexLayerSet(appearance),
- mUpdatesEnabled( FALSE )
+ LLTexLayerSet(appearance),
+ mUpdatesEnabled( FALSE )
{
}
@@ -268,86 +268,86 @@ LLViewerTexLayerSet::~LLViewerTexLayerSet()
// Returns TRUE if at least one packet of data has been received for each of the textures that this layerset depends on.
BOOL LLViewerTexLayerSet::isLocalTextureDataAvailable() const
{
- if (!mAvatarAppearance->isSelf()) return FALSE;
- return getAvatar()->isLocalTextureDataAvailable(this);
+ if (!mAvatarAppearance->isSelf()) return FALSE;
+ return getAvatar()->isLocalTextureDataAvailable(this);
}
// Returns TRUE if all of the data for the textures that this layerset depends on have arrived.
BOOL LLViewerTexLayerSet::isLocalTextureDataFinal() const
{
- if (!mAvatarAppearance->isSelf()) return FALSE;
- return getAvatar()->isLocalTextureDataFinal(this);
+ if (!mAvatarAppearance->isSelf()) return FALSE;
+ return getAvatar()->isLocalTextureDataFinal(this);
}
// virtual
void LLViewerTexLayerSet::requestUpdate()
{
- if( mUpdatesEnabled )
- {
- createComposite();
- getViewerComposite()->requestUpdate();
- }
+ if( mUpdatesEnabled )
+ {
+ createComposite();
+ getViewerComposite()->requestUpdate();
+ }
}
void LLViewerTexLayerSet::updateComposite()
{
- createComposite();
- getViewerComposite()->requestUpdateImmediate();
+ createComposite();
+ getViewerComposite()->requestUpdateImmediate();
}
// virtual
void LLViewerTexLayerSet::createComposite()
{
- if(!mComposite)
- {
- S32 width = mInfo->getWidth();
- S32 height = mInfo->getHeight();
- // Composite other avatars at reduced resolution
- if( !mAvatarAppearance->isSelf() )
- {
- LL_ERRS() << "composites should not be created for non-self avatars!" << LL_ENDL;
- }
- mComposite = new LLViewerTexLayerSetBuffer( this, width, height );
- }
+ if(!mComposite)
+ {
+ S32 width = mInfo->getWidth();
+ S32 height = mInfo->getHeight();
+ // Composite other avatars at reduced resolution
+ if( !mAvatarAppearance->isSelf() )
+ {
+ LL_ERRS() << "composites should not be created for non-self avatars!" << LL_ENDL;
+ }
+ mComposite = new LLViewerTexLayerSetBuffer( this, width, height );
+ }
}
void LLViewerTexLayerSet::setUpdatesEnabled( BOOL b )
{
- mUpdatesEnabled = b;
+ mUpdatesEnabled = b;
}
LLVOAvatarSelf* LLViewerTexLayerSet::getAvatar()
{
- return dynamic_cast<LLVOAvatarSelf*> (mAvatarAppearance);
+ return dynamic_cast<LLVOAvatarSelf*> (mAvatarAppearance);
}
const LLVOAvatarSelf* LLViewerTexLayerSet::getAvatar() const
{
- return dynamic_cast<const LLVOAvatarSelf*> (mAvatarAppearance);
+ return dynamic_cast<const LLVOAvatarSelf*> (mAvatarAppearance);
}
LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite()
{
- return dynamic_cast<LLViewerTexLayerSetBuffer*> (getComposite());
+ return dynamic_cast<LLViewerTexLayerSetBuffer*> (getComposite());
}
const LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite() const
{
- return dynamic_cast<const LLViewerTexLayerSetBuffer*> (getComposite());
+ return dynamic_cast<const LLViewerTexLayerSetBuffer*> (getComposite());
}
const std::string LLViewerTexLayerSetBuffer::dumpTextureInfo() const
{
- if (!isAgentAvatarValid()) return "";
+ if (!isAgentAvatarValid()) return "";
- const BOOL is_high_res = TRUE;
- const U32 num_low_res = 0;
- const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(getViewerTexLayerSet());
+ const BOOL is_high_res = TRUE;
+ const U32 num_low_res = 0;
+ const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(getViewerTexLayerSet());
- std::string text = llformat("[HiRes:%d LoRes:%d] %s",
- is_high_res, num_low_res,
- local_texture_info.c_str());
- return text;
+ std::string text = llformat("[HiRes:%d LoRes:%d] %s",
+ is_high_res, num_low_res,
+ local_texture_info.c_str());
+ return text;
}