Migrated LLTexLayerParams. Renamed LLTexLayerSet(Buffer) to LLViewerTexLayerSet(Buffer), and provided simple bases in llappearance/lltexlayer.h to mimic new usage. Reworked various bits to work with these changes, and performed some basic cleanup of LLVOAvatar(Self)
This commit is contained in:
@@ -37,8 +37,8 @@ set(llappearance_SOURCE_FILES
|
||||
llpolymesh.cpp
|
||||
llpolymorph.cpp
|
||||
#lltexglobalcolor.cpp
|
||||
#lltexlayer.cpp
|
||||
#lltexlayerparams.cpp
|
||||
lltexlayer.cpp
|
||||
lltexlayerparams.cpp
|
||||
lltexturemanagerbridge.cpp
|
||||
#llwearable.cpp
|
||||
#llwearabledata.cpp
|
||||
@@ -60,8 +60,8 @@ set(llappearance_HEADER_FILES
|
||||
llpolymesh.h
|
||||
llpolymorph.h
|
||||
#lltexglobalcolor.h
|
||||
#lltexlayer.h
|
||||
#lltexlayerparams.h
|
||||
lltexlayer.h
|
||||
lltexlayerparams.h
|
||||
lltexturemanagerbridge.h
|
||||
#llwearable.h
|
||||
#llwearabledata.h
|
||||
|
||||
@@ -29,11 +29,11 @@
|
||||
|
||||
#include "llcharacter.h"
|
||||
#include "llavatarappearancedefines.h"
|
||||
//#include "llavatarjointmesh.h"
|
||||
#include "llavatarjointmesh.h"
|
||||
//#include "lldriverparam.h"
|
||||
//#include "lltexlayer.h"
|
||||
//#include "llviewervisualparam.h"
|
||||
//#include "llxmltree.h"
|
||||
#include "lltexlayer.h"
|
||||
#include "llviewervisualparam.h"
|
||||
#include "llxmltree.h"
|
||||
|
||||
class LLTexLayerSet;
|
||||
class LLTexGlobalColor;
|
||||
@@ -43,6 +43,7 @@ class LLAvatarBoneInfo;
|
||||
class LLAvatarSkeletonInfo;
|
||||
class LLPolyMeshSharedData;
|
||||
class LLAvatarJointCollisionVolume;
|
||||
class LLTexLayerSet;
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLAvatarAppearance
|
||||
@@ -104,8 +105,10 @@ public:
|
||||
** STATE
|
||||
**/
|
||||
public:
|
||||
//virtual bool isSelf() const { return false; } // True if this avatar is for this viewer's agent
|
||||
//virtual BOOL isValid() const;
|
||||
virtual bool isSelf() const = 0;// True if this avatar is for this viewer's agent
|
||||
//virtual BOOL isValid() const = 0;
|
||||
virtual bool isAgent() const = 0;
|
||||
virtual bool isUsingBakedTextures() const {return false;}
|
||||
//virtual BOOL isUsingServerBakes() const = 0;
|
||||
//virtual BOOL isUsingLocalAppearance() const = 0;
|
||||
//virtual BOOL isEditingAppearance() const = 0;
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "lljointpickname.h"
|
||||
|
||||
class LLFace;
|
||||
class LLViewerJointMesh;
|
||||
class LLAvatarJointMesh;
|
||||
|
||||
extern const F32 DEFAULT_AVATAR_JOINT_LOD;
|
||||
|
||||
|
||||
@@ -260,10 +260,10 @@ void LLAvatarJointMesh::setLayerSet( LLTexLayerSet* layer_set )
|
||||
}
|
||||
}
|
||||
|
||||
/*BOOL LLAvatarJointMesh::hasComposite() const
|
||||
BOOL LLAvatarJointMesh::hasComposite() const
|
||||
{
|
||||
return (mLayerSet && mLayerSet->hasComposite());
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
@@ -112,7 +112,7 @@ public:
|
||||
// Sets layer set responsible for a dynamic shape texture (takes precedence over normal texture)
|
||||
void setLayerSet( LLTexLayerSet* layer_set );
|
||||
|
||||
virtual BOOL hasComposite() const = 0;
|
||||
BOOL hasComposite() const;
|
||||
|
||||
// Gets the poly mesh
|
||||
LLPolyMesh *getMesh();
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#ifndef LL_LLJOINTPICKNAME_H
|
||||
#define LL_LLJOINTPICKNAME_H
|
||||
|
||||
class LLViewerJointMesh;
|
||||
class LLAvatarJointMesh;
|
||||
|
||||
// Sets the OpenGL selection stack name that is pushed and popped
|
||||
// with this joint state. The default value indicates that no name
|
||||
@@ -44,6 +44,6 @@ enum LLJointPickName
|
||||
PN_5 = 5
|
||||
};
|
||||
|
||||
typedef std::vector<LLViewerJointMesh*> avatar_joint_mesh_list_t;
|
||||
typedef std::vector<LLAvatarJointMesh*> avatar_joint_mesh_list_t;
|
||||
|
||||
#endif // LL_LLJOINTPICKNAME_H
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
//#include "llwearable.h"
|
||||
#include "llxmltree.h"
|
||||
#include "llendianswizzle.h"
|
||||
//#include "llvoavatar.h"
|
||||
#include "llpolymesh.h"
|
||||
#include "v2math.h"
|
||||
|
||||
|
||||
200
indra/llappearance/lltexlayer.cpp
Normal file
200
indra/llappearance/lltexlayer.cpp
Normal file
@@ -0,0 +1,200 @@
|
||||
/**
|
||||
* @file lltexlayer.cpp
|
||||
* @brief A texture layer. Used for avatars.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&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$
|
||||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
|
||||
#include "lltexlayer.h"
|
||||
|
||||
#include "llavatarappearance.h"
|
||||
#include "llcrc.h"
|
||||
#include "imageids.h"
|
||||
#include "llimagej2c.h"
|
||||
#include "llimagetga.h"
|
||||
#include "lldir.h"
|
||||
#include "llvfile.h"
|
||||
#include "llvfs.h"
|
||||
#include "lltexlayerparams.h"
|
||||
#include "lltexturemanagerbridge.h"
|
||||
//#include "llrender2dutils.h"
|
||||
//#include "llwearable.h"
|
||||
//#include "llwearabledata.h"
|
||||
#include "llvertexbuffer.h"
|
||||
#include "llviewervisualparam.h"
|
||||
|
||||
//#include "../tools/imdebug/imdebug.h"
|
||||
|
||||
using namespace LLAvatarAppearanceDefines;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLTexLayerSet
|
||||
// An ordered set of texture layers that get composited into a single texture.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
BOOL LLTexLayerSet::sHasCaches = FALSE;
|
||||
|
||||
LLTexLayerSet::LLTexLayerSet(LLAvatarAppearance* const appearance) :
|
||||
mAvatarAppearance( appearance )
|
||||
{
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLTexLayerStaticImageList
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
LLTexLayerStaticImageList::LLTexLayerStaticImageList() :
|
||||
mGLBytes(0),
|
||||
mTGABytes(0),
|
||||
mImageNames(16384)
|
||||
{
|
||||
}
|
||||
|
||||
LLTexLayerStaticImageList::~LLTexLayerStaticImageList()
|
||||
{
|
||||
deleteCachedImages();
|
||||
}
|
||||
|
||||
void LLTexLayerStaticImageList::dumpByteCount() const
|
||||
{
|
||||
llinfos << "Avatar Static Textures " <<
|
||||
"KB GL:" << (mGLBytes / 1024) <<
|
||||
"KB TGA:" << (mTGABytes / 1024) << "KB" << llendl;
|
||||
}
|
||||
|
||||
void LLTexLayerStaticImageList::deleteCachedImages()
|
||||
{
|
||||
if( mGLBytes || mTGABytes )
|
||||
{
|
||||
llinfos << "Clearing Static Textures " <<
|
||||
"KB GL:" << (mGLBytes / 1024) <<
|
||||
"KB TGA:" << (mTGABytes / 1024) << "KB" << llendl;
|
||||
|
||||
//mStaticImageLists uses LLPointers, clear() will cause deletion
|
||||
|
||||
mStaticImageListTGA.clear();
|
||||
mStaticImageList.clear();
|
||||
|
||||
mGLBytes = 0;
|
||||
mTGABytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Note: in general, for a given image image we'll call either getImageTga() or getTexture().
|
||||
// We call getImageTga() if the image is used as an alpha gradient.
|
||||
// Otherwise, we call getTexture()
|
||||
|
||||
// Returns an LLImageTGA that contains the encoded data from a tga file named file_name.
|
||||
// Caches the result to speed identical subsequent requests.
|
||||
static LLFastTimer::DeclareTimer FTM_LOAD_STATIC_TGA("getImageTGA");
|
||||
LLImageTGA* LLTexLayerStaticImageList::getImageTGA(const std::string& file_name)
|
||||
{
|
||||
LLFastTimer t(FTM_LOAD_STATIC_TGA);
|
||||
const char *namekey = mImageNames.addString(file_name);
|
||||
image_tga_map_t::const_iterator iter = mStaticImageListTGA.find(namekey);
|
||||
if( iter != mStaticImageListTGA.end() )
|
||||
{
|
||||
return iter->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string path;
|
||||
path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name);
|
||||
LLPointer<LLImageTGA> image_tga = new LLImageTGA( path );
|
||||
if( image_tga->getDataSize() > 0 )
|
||||
{
|
||||
mStaticImageListTGA[ namekey ] = image_tga;
|
||||
mTGABytes += image_tga->getDataSize();
|
||||
return image_tga;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Returns a GL Image (without a backing ImageRaw) that contains the decoded data from a tga file named file_name.
|
||||
// Caches the result to speed identical subsequent requests.
|
||||
static LLFastTimer::DeclareTimer FTM_LOAD_STATIC_TEXTURE("getTexture");
|
||||
LLGLTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_name, BOOL is_mask)
|
||||
{
|
||||
LLFastTimer t(FTM_LOAD_STATIC_TEXTURE);
|
||||
LLPointer<LLGLTexture> tex;
|
||||
const char *namekey = mImageNames.addString(file_name);
|
||||
|
||||
texture_map_t::const_iterator iter = mStaticImageList.find(namekey);
|
||||
if( iter != mStaticImageList.end() )
|
||||
{
|
||||
tex = iter->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
llassert(gTextureManagerBridgep);
|
||||
tex = gTextureManagerBridgep->getLocalTexture( FALSE );
|
||||
LLPointer<LLImageRaw> image_raw = new LLImageRaw;
|
||||
if( loadImageRaw( file_name, image_raw ) )
|
||||
{
|
||||
if( (image_raw->getComponents() == 1) && is_mask )
|
||||
{
|
||||
// Note: these are static, unchanging images so it's ok to assume
|
||||
// that once an image is a mask it's always a mask.
|
||||
tex->setExplicitFormat( GL_ALPHA8, GL_ALPHA );
|
||||
}
|
||||
tex->createGLTexture(0, image_raw, 0, TRUE, LLGLTexture::LOCAL);
|
||||
|
||||
gGL.getTexUnit(0)->bind(tex);
|
||||
tex->setAddressMode(LLTexUnit::TAM_CLAMP);
|
||||
|
||||
mStaticImageList [ namekey ] = tex;
|
||||
mGLBytes += (S32)tex->getWidth() * tex->getHeight() * tex->getComponents();
|
||||
}
|
||||
else
|
||||
{
|
||||
tex = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return tex;
|
||||
}
|
||||
|
||||
// Reads a .tga file, decodes it, and puts the decoded data in image_raw.
|
||||
// Returns TRUE if successful.
|
||||
static LLFastTimer::DeclareTimer FTM_LOAD_IMAGE_RAW("loadImageRaw");
|
||||
BOOL LLTexLayerStaticImageList::loadImageRaw(const std::string& file_name, LLImageRaw* image_raw)
|
||||
{
|
||||
LLFastTimer t(FTM_LOAD_IMAGE_RAW);
|
||||
BOOL success = FALSE;
|
||||
std::string path;
|
||||
path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name);
|
||||
LLPointer<LLImageTGA> image_tga = new LLImageTGA( path );
|
||||
if( image_tga->getDataSize() > 0 )
|
||||
{
|
||||
// Copy data from tga to raw.
|
||||
success = image_tga->decode( image_raw );
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
136
indra/llappearance/lltexlayer.h
Normal file
136
indra/llappearance/lltexlayer.h
Normal file
@@ -0,0 +1,136 @@
|
||||
/**
|
||||
* @file lltexlayer.h
|
||||
* @brief Texture layer classes. Used for avatars.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&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$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLTEXLAYER_H
|
||||
#define LL_LLTEXLAYER_H
|
||||
|
||||
#include <deque>
|
||||
#include "llglslshader.h"
|
||||
#include "llgltexture.h"
|
||||
#include "llavatarappearancedefines.h"
|
||||
#include "lltexlayerparams.h"
|
||||
|
||||
class LLAvatarAppearance;
|
||||
class LLImageTGA;
|
||||
class LLImageRaw;
|
||||
class LLLocalTextureObject;
|
||||
class LLXmlTreeNode;
|
||||
class LLTexLayerSet;
|
||||
class LLTexLayerSetInfo;
|
||||
class LLTexLayerInfo;
|
||||
class LLTexLayerSetBuffer;
|
||||
class LLWearable;
|
||||
class LLViewerVisualParam;
|
||||
class LLLocalTextureObject;
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLTexLayerSet
|
||||
//
|
||||
// An ordered set of texture layers that gets composited into a single texture.
|
||||
// Only exists for llvoavatarself.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLTexLayerSet
|
||||
{
|
||||
friend class LLTexLayerSetBuffer;
|
||||
public:
|
||||
LLTexLayerSet(LLAvatarAppearance* const appearance);
|
||||
virtual ~LLTexLayerSet() {};
|
||||
|
||||
virtual LLTexLayerSetBuffer* getComposite() = 0;
|
||||
virtual const LLTexLayerSetBuffer* getComposite() const = 0;
|
||||
virtual void createComposite() = 0;
|
||||
virtual void destroyComposite() = 0;
|
||||
virtual void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height) = 0;
|
||||
|
||||
virtual const LLTexLayerSetInfo* getInfo() const = 0;
|
||||
virtual BOOL setInfo(const LLTexLayerSetInfo *info) = 0;
|
||||
|
||||
virtual BOOL render(S32 x, S32 y, S32 width, S32 height) = 0;
|
||||
virtual void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false) = 0;
|
||||
|
||||
virtual BOOL isBodyRegion(const std::string& region) const = 0;
|
||||
virtual void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components) = 0;
|
||||
virtual BOOL isMorphValid() const = 0;
|
||||
virtual void requestUpdate() = 0;
|
||||
virtual void invalidateMorphMasks() = 0;
|
||||
virtual void deleteCaches() = 0;
|
||||
virtual LLTexLayerInterface* findLayerByName(const std::string& name) = 0;
|
||||
virtual void cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearanceDefines::ETextureIndex tex_index, LLWearable* wearable) = 0;
|
||||
|
||||
LLAvatarAppearance* getAvatarAppearance() const { return mAvatarAppearance; }
|
||||
virtual const std::string getBodyRegionName() const = 0;
|
||||
virtual BOOL hasComposite() const = 0;
|
||||
virtual LLAvatarAppearanceDefines::EBakedTextureIndex getBakedTexIndex() const = 0;
|
||||
virtual void setBakedTexIndex(LLAvatarAppearanceDefines::EBakedTextureIndex index) = 0;
|
||||
virtual BOOL isVisible() const = 0;
|
||||
|
||||
static BOOL sHasCaches;
|
||||
|
||||
LLAvatarAppearance* const mAvatarAppearance; // note: backlink only; don't make this an LLPointer.
|
||||
};
|
||||
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLTexLayerSetBuffer
|
||||
//
|
||||
// The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLTexLayerSetBuffer : public virtual LLRefCount
|
||||
{
|
||||
LOG_CLASS(LLTexLayerSetBuffer);
|
||||
|
||||
public:
|
||||
LLTexLayerSetBuffer(LLTexLayerSet* const owner) : mTexLayerSet(owner) {};
|
||||
virtual ~LLTexLayerSetBuffer() {}
|
||||
LLTexLayerSet* const mTexLayerSet;
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLTexLayerStaticImageList
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList>
|
||||
{
|
||||
public:
|
||||
LLTexLayerStaticImageList();
|
||||
~LLTexLayerStaticImageList();
|
||||
LLGLTexture* getTexture(const std::string& file_name, BOOL is_mask);
|
||||
LLImageTGA* getImageTGA(const std::string& file_name);
|
||||
void deleteCachedImages();
|
||||
void dumpByteCount() const;
|
||||
protected:
|
||||
BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw);
|
||||
private:
|
||||
LLStringTable mImageNames;
|
||||
typedef std::map<const char*, LLPointer<LLGLTexture> > texture_map_t;
|
||||
texture_map_t mStaticImageList;
|
||||
typedef std::map<const char*, LLPointer<LLImageTGA> > image_tga_map_t;
|
||||
image_tga_map_t mStaticImageListTGA;
|
||||
S32 mGLBytes;
|
||||
S32 mTGABytes;
|
||||
};
|
||||
|
||||
#endif // LL_LLTEXLAYER_H
|
||||
@@ -24,27 +24,29 @@
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#include "linden_common.h"
|
||||
|
||||
#include "lltexlayerparams.h"
|
||||
|
||||
#include "llagentcamera.h"
|
||||
#include "llavatarappearance.h"
|
||||
#include "llimagetga.h"
|
||||
#include "llquantize.h"
|
||||
#include "lltexlayer.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "llwearable.h"
|
||||
#include "llui.h"
|
||||
#include "lltexturemanagerbridge.h"
|
||||
//#include "llui.h"
|
||||
//#include "llwearable.h"
|
||||
#include "llgltexture.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLTexLayerParam
|
||||
//-----------------------------------------------------------------------------
|
||||
LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :
|
||||
LLTexLayerParam::LLTexLayerParam(LLTexLayerInterfaceTMP *layer) :
|
||||
mTexLayer(layer),
|
||||
mAvatar(NULL)
|
||||
mAvatarAppearance(NULL)
|
||||
{
|
||||
if (mTexLayer != NULL)
|
||||
{
|
||||
mAvatar = mTexLayer->getTexLayerSet()->getAvatar();
|
||||
mAvatarAppearance = mTexLayer->getTexLayerSet()->getAvatarAppearance();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -52,20 +54,20 @@ LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :
|
||||
}
|
||||
}
|
||||
|
||||
LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) :
|
||||
mTexLayer(NULL)
|
||||
LLTexLayerParam::LLTexLayerParam(LLAvatarAppearance *appearance) :
|
||||
mTexLayer(NULL),
|
||||
mAvatarAppearance(appearance)
|
||||
{
|
||||
mAvatar = avatar;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar )
|
||||
{
|
||||
BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_appearance)
|
||||
{
|
||||
LLViewerVisualParam::setInfo(info);
|
||||
|
||||
if (add_to_avatar)
|
||||
if (add_to_appearance)
|
||||
{
|
||||
mAvatar->addVisualParam( this);
|
||||
mAvatarAppearance->addVisualParam( this);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@@ -96,7 +98,7 @@ void LLTexLayerParamAlpha::getCacheByteCount(S32* gl_bytes)
|
||||
iter != sInstances.end(); iter++)
|
||||
{
|
||||
LLTexLayerParamAlpha* instance = *iter;
|
||||
LLViewerTexture* tex = instance->mCachedProcessedTexture;
|
||||
LLGLTexture* tex = instance->mCachedProcessedTexture;
|
||||
if (tex)
|
||||
{
|
||||
S32 bytes = (S32)tex->getWidth() * tex->getHeight() * tex->getComponents();
|
||||
@@ -109,7 +111,7 @@ void LLTexLayerParamAlpha::getCacheByteCount(S32* gl_bytes)
|
||||
}
|
||||
}
|
||||
|
||||
LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterface* layer) :
|
||||
LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterfaceTMP* layer) :
|
||||
LLTexLayerParam(layer),
|
||||
mCachedProcessedTexture(NULL),
|
||||
mNeedsCreateTexture(FALSE),
|
||||
@@ -120,8 +122,8 @@ LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterface* layer) :
|
||||
sInstances.push_front(this);
|
||||
}
|
||||
|
||||
LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLVOAvatar* avatar) :
|
||||
LLTexLayerParam(avatar),
|
||||
LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLAvatarAppearance* appearance) :
|
||||
LLTexLayerParam(appearance),
|
||||
mCachedProcessedTexture(NULL),
|
||||
mNeedsCreateTexture(FALSE),
|
||||
mStaticImageInvalid(FALSE),
|
||||
@@ -173,13 +175,14 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)
|
||||
{
|
||||
mCurWeight = new_weight;
|
||||
|
||||
if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
|
||||
if ((mAvatarAppearance->getSex() & getSex()) &&
|
||||
(mAvatarAppearance->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
|
||||
{
|
||||
if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures())
|
||||
if (mAvatarAppearance->isAgent() && !mAvatarAppearance->isUsingBakedTextures())
|
||||
{
|
||||
upload_bake = FALSE;
|
||||
}
|
||||
mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
|
||||
mAvatarAppearance->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
|
||||
mTexLayer->invalidateMorphMasks();
|
||||
}
|
||||
}
|
||||
@@ -218,11 +221,11 @@ BOOL LLTexLayerParamAlpha::getSkip() const
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
const LLVOAvatar *avatar = mTexLayer->getTexLayerSet()->getAvatar();
|
||||
const LLAvatarAppearance *appearance = mTexLayer->getTexLayerSet()->getAvatarAppearance();
|
||||
|
||||
if (((LLTexLayerParamAlphaInfo *)getInfo())->mSkipIfZeroWeight)
|
||||
{
|
||||
F32 effective_weight = (avatar->getSex() & getSex()) ? mCurWeight : getDefaultWeight();
|
||||
F32 effective_weight = (appearance->getSex() & getSex()) ? mCurWeight : getDefaultWeight();
|
||||
if (is_approx_zero(effective_weight))
|
||||
{
|
||||
return TRUE;
|
||||
@@ -230,17 +233,20 @@ BOOL LLTexLayerParamAlpha::getSkip() const
|
||||
}
|
||||
|
||||
LLWearableType::EType type = (LLWearableType::EType)getWearableType();
|
||||
if ((type != LLWearableType::WT_INVALID) && !avatar->isWearingWearableType(type))
|
||||
if ((type != LLWearableType::WT_INVALID) && !appearance->isWearingWearableType(type))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
void gl_rect_2d_simple_tex( S32 width, S32 height );
|
||||
void gl_rect_2d_simple( S32 width, S32 height );
|
||||
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_TEX_LAYER_PARAM_ALPHA("alpha render");
|
||||
BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
|
||||
{
|
||||
LLFastTimer t(FTM_TEX_LAYER_PARAM_ALPHA);
|
||||
BOOL success = TRUE;
|
||||
|
||||
if (!mTexLayer)
|
||||
@@ -248,7 +254,7 @@ BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
|
||||
return success;
|
||||
}
|
||||
|
||||
F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatar()->getSex() & getSex()) ? mCurWeight : getDefaultWeight();
|
||||
F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatarAppearance()->getSex() & getSex()) ? mCurWeight : getDefaultWeight();
|
||||
BOOL weight_changed = effective_weight != mCachedEffectiveWeight;
|
||||
if (getSkip())
|
||||
{
|
||||
@@ -290,12 +296,12 @@ BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
|
||||
(mCachedProcessedTexture->getHeight() != image_tga_height) ||
|
||||
(weight_changed))
|
||||
{
|
||||
// llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl;
|
||||
mCachedEffectiveWeight = effective_weight;
|
||||
|
||||
if (!mCachedProcessedTexture)
|
||||
{
|
||||
mCachedProcessedTexture = LLViewerTextureManager::getLocalTexture(image_tga_width, image_tga_height, 1, FALSE);
|
||||
llassert(gTextureManagerBridgep);
|
||||
mCachedProcessedTexture = gTextureManagerBridgep->getLocalTexture(image_tga_width, image_tga_height, 1, FALSE);
|
||||
|
||||
// We now have something in one of our caches
|
||||
LLTexLayerSet::sHasCaches |= mCachedProcessedTexture ? TRUE : FALSE;
|
||||
@@ -308,6 +314,7 @@ BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
|
||||
mStaticImageRaw = new LLImageRaw;
|
||||
mStaticImageTGA->decodeAndProcess(mStaticImageRaw, info->mDomain, effective_weight);
|
||||
mNeedsCreateTexture = TRUE;
|
||||
lldebugs << "Built Cached Alpha: " << info->mStaticImageFileName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << "Domain: " << info->mDomain << " Weight: " << effective_weight << llendl;
|
||||
}
|
||||
|
||||
if (mCachedProcessedTexture)
|
||||
@@ -332,7 +339,7 @@ BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
|
||||
|
||||
// Don't keep the cache for other people's avatars
|
||||
// (It's not really a "cache" in that case, but the logic is the same)
|
||||
if (!mAvatar->isSelf())
|
||||
if (!mAvatarAppearance->isSelf())
|
||||
{
|
||||
mCachedProcessedTexture = NULL;
|
||||
}
|
||||
@@ -396,14 +403,14 @@ BOOL LLTexLayerParamAlphaInfo::parseXml(LLXmlTreeNode* node)
|
||||
|
||||
|
||||
|
||||
LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayerInterface* layer) :
|
||||
LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayerInterfaceTMP* layer) :
|
||||
LLTexLayerParam(layer),
|
||||
mAvgDistortionVec(1.f, 1.f, 1.f)
|
||||
{
|
||||
}
|
||||
|
||||
LLTexLayerParamColor::LLTexLayerParamColor(LLVOAvatar *avatar) :
|
||||
LLTexLayerParam(avatar),
|
||||
LLTexLayerParamColor::LLTexLayerParamColor(LLAvatarAppearance *appearance) :
|
||||
LLTexLayerParam(appearance),
|
||||
mAvgDistortionVec(1.f, 1.f, 1.f)
|
||||
{
|
||||
}
|
||||
@@ -425,7 +432,7 @@ LLColor4 LLTexLayerParamColor::getNetColor() const
|
||||
|
||||
llassert(info->mNumColors >= 1);
|
||||
|
||||
F32 effective_weight = (mAvatar && (mAvatar->getSex() & getSex())) ? mCurWeight : getDefaultWeight();
|
||||
F32 effective_weight = (mAvatarAppearance && (mAvatarAppearance->getSex() & getSex())) ? mCurWeight : getDefaultWeight();
|
||||
|
||||
S32 index_last = info->mNumColors - 1;
|
||||
F32 scaled_weight = effective_weight * index_last;
|
||||
@@ -470,12 +477,12 @@ void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
|
||||
if ((mAvatarAppearance->getSex() & getSex()) && (mAvatarAppearance->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
|
||||
{
|
||||
onGlobalColorChanged(upload_bake);
|
||||
if (mTexLayer)
|
||||
{
|
||||
mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
|
||||
mAvatarAppearance->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,16 +27,26 @@
|
||||
#ifndef LL_LLTEXLAYERPARAMS_H
|
||||
#define LL_LLTEXLAYERPARAMS_H
|
||||
|
||||
#include "llpointer.h"
|
||||
#include "v4color.h"
|
||||
#include "llviewervisualparam.h"
|
||||
|
||||
class LLAvatarAppearance;
|
||||
class LLImageRaw;
|
||||
class LLImageTGA;
|
||||
class LLTexLayer;
|
||||
class LLTexLayerInterface;
|
||||
class LLViewerTexture;
|
||||
class LLVOAvatar;
|
||||
class LLGLTexture;
|
||||
class LLWearable;
|
||||
class LLTexLayerSet;
|
||||
|
||||
class LLTexLayerInterfaceTMP
|
||||
{
|
||||
public:
|
||||
virtual const LLTexLayerSet* const getTexLayerSet() const = 0;
|
||||
virtual LLTexLayerSet* const getTexLayerSet() = 0;
|
||||
virtual void invalidateMorphMasks() = 0;
|
||||
};
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLTexLayerParam
|
||||
//
|
||||
@@ -44,14 +54,14 @@ class LLWearable;
|
||||
class LLTexLayerParam : public LLViewerVisualParam
|
||||
{
|
||||
public:
|
||||
LLTexLayerParam(LLTexLayerInterface *layer);
|
||||
LLTexLayerParam(LLVOAvatar *avatar);
|
||||
/*virtual*/ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar );
|
||||
LLTexLayerParam(LLTexLayerInterfaceTMP *layer);
|
||||
LLTexLayerParam(LLAvatarAppearance *appearance);
|
||||
/*virtual*/ BOOL setInfo(LLViewerVisualParamInfo *info, BOOL add_to_appearance);
|
||||
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const = 0;
|
||||
|
||||
protected:
|
||||
LLTexLayerInterface* mTexLayer;
|
||||
LLVOAvatar* mAvatar;
|
||||
LLTexLayerInterfaceTMP* mTexLayer;
|
||||
LLAvatarAppearance* mAvatarAppearance;
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -61,8 +71,8 @@ protected:
|
||||
class LLTexLayerParamAlpha : public LLTexLayerParam
|
||||
{
|
||||
public:
|
||||
LLTexLayerParamAlpha( LLTexLayerInterface* layer );
|
||||
LLTexLayerParamAlpha( LLVOAvatar* avatar );
|
||||
LLTexLayerParamAlpha( LLTexLayerInterfaceTMP* layer );
|
||||
LLTexLayerParamAlpha( LLAvatarAppearance* appearance );
|
||||
/*virtual*/ ~LLTexLayerParamAlpha();
|
||||
|
||||
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable = NULL) const;
|
||||
@@ -99,7 +109,7 @@ public:
|
||||
BOOL getMultiplyBlend() const;
|
||||
|
||||
private:
|
||||
LLPointer<LLViewerTexture> mCachedProcessedTexture;
|
||||
LLPointer<LLGLTexture> mCachedProcessedTexture;
|
||||
LLPointer<LLImageTGA> mStaticImageTGA;
|
||||
LLPointer<LLImageRaw> mStaticImageRaw;
|
||||
BOOL mNeedsCreateTexture;
|
||||
@@ -149,8 +159,8 @@ public:
|
||||
OP_COUNT = 3 // Number of operations
|
||||
};
|
||||
|
||||
LLTexLayerParamColor( LLTexLayerInterface* layer );
|
||||
LLTexLayerParamColor( LLVOAvatar* avatar );
|
||||
LLTexLayerParamColor( LLTexLayerInterfaceTMP* layer );
|
||||
LLTexLayerParamColor( LLAvatarAppearance* appearance );
|
||||
/* virtual */ ~LLTexLayerParamColor();
|
||||
|
||||
void* operator new(size_t size)
|
||||
@@ -24,6 +24,7 @@
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
#include "lltexturemanagerbridge.h"
|
||||
|
||||
// Define a null texture manager bridge. Applications must provide their own bridge implementaton.
|
||||
|
||||
@@ -27,11 +27,10 @@
|
||||
#ifndef LL_TEXTUREMANAGERBRIDGE_H
|
||||
#define LL_TEXTUREMANAGERBRIDGE_H
|
||||
|
||||
#include "linden_common.h"
|
||||
#include "llavatarappearancedefines.h"
|
||||
#include "llpointer.h"
|
||||
#include "llgltexture.h"
|
||||
|
||||
class LLGLTexture;
|
||||
// Abstract bridge interface
|
||||
class LLTextureManagerBridge
|
||||
{
|
||||
|
||||
@@ -292,7 +292,7 @@ void LLCharacter::removeAnimationData(std::string name)
|
||||
//-----------------------------------------------------------------------------
|
||||
// setVisualParamWeight()
|
||||
//-----------------------------------------------------------------------------
|
||||
BOOL LLCharacter::setVisualParamWeight(LLVisualParam* which_param, F32 weight, BOOL upload_bake)
|
||||
BOOL LLCharacter::setVisualParamWeight(const LLVisualParam* which_param, F32 weight, BOOL upload_bake)
|
||||
{
|
||||
S32 index = which_param->getID();
|
||||
visual_param_index_map_t::iterator index_iter = mVisualParamIndexMap.find(index);
|
||||
|
||||
@@ -203,7 +203,7 @@ public:
|
||||
void addVisualParam(LLVisualParam *param);
|
||||
void addSharedVisualParam(LLVisualParam *param);
|
||||
|
||||
virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
|
||||
virtual BOOL setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
|
||||
virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
|
||||
virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
|
||||
|
||||
|
||||
@@ -7,33 +7,26 @@
|
||||
* code, to define an interface for a multiple rendering API abstraction of the UI
|
||||
* rendering, and to abstract out direct rendering calls in a way that is cleaner and easier to maintain.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2010, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlife.com/developers/opensource/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlife.com/developers/opensource/flossexception
|
||||
* 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.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* 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.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* 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$
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LL_TEXTURE_H
|
||||
@@ -45,10 +38,9 @@ class LLTexUnit ;
|
||||
class LLFontGL ;
|
||||
|
||||
//
|
||||
//this is an abstract class as the parent for the class LLViewerTexture
|
||||
//through the following virtual functions, the class LLViewerTexture can be reached from /llrender.
|
||||
//this is an abstract class as the parent for the class LLGLTexture
|
||||
//
|
||||
class LLTexture : public LLRefCount
|
||||
class LLTexture : public virtual LLRefCount
|
||||
{
|
||||
friend class LLTexUnit ;
|
||||
friend class LLFontGL ;
|
||||
@@ -60,7 +52,7 @@ public:
|
||||
LLTexture(){}
|
||||
|
||||
//
|
||||
//interfaces to access LLViewerTexture
|
||||
//interfaces to access LLGLTexture
|
||||
//
|
||||
virtual S8 getType() const = 0 ;
|
||||
virtual void setKnownDrawSize(S32 width, S32 height) = 0 ;
|
||||
|
||||
@@ -423,8 +423,6 @@ set(viewer_SOURCE_FILES
|
||||
llsurface.cpp
|
||||
llsurfacepatch.cpp
|
||||
lltexglobalcolor.cpp
|
||||
lltexlayer.cpp
|
||||
lltexlayerparams.cpp
|
||||
lltexturecache.cpp
|
||||
lltexturectrl.cpp
|
||||
lltexturefetch.cpp
|
||||
@@ -505,6 +503,7 @@ set(viewer_SOURCE_FILES
|
||||
llviewershadermgr.cpp
|
||||
llviewerstats.cpp
|
||||
llviewerstatsrecorder.cpp
|
||||
llviewertexlayer.cpp
|
||||
llviewertexteditor.cpp
|
||||
llviewertexture.cpp
|
||||
llviewertextureanim.cpp
|
||||
@@ -927,8 +926,6 @@ set(viewer_HEADER_FILES
|
||||
llsurfacepatch.h
|
||||
lltable.h
|
||||
lltexglobalcolor.h
|
||||
lltexlayer.h
|
||||
lltexlayerparams.h
|
||||
lltexturecache.h
|
||||
lltexturectrl.h
|
||||
lltexturefetch.h
|
||||
@@ -1011,6 +1008,7 @@ set(viewer_HEADER_FILES
|
||||
llviewershadermgr.h
|
||||
llviewerstats.h
|
||||
llviewerstatsrecorder.h
|
||||
llviewertexlayer.h
|
||||
llviewertexteditor.h
|
||||
llviewertexture.h
|
||||
llviewertextureanim.h
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
//project includes
|
||||
#include "llcolorswatch.h"
|
||||
#include "llvoavatar.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "llagent.h"
|
||||
#include "llfloaterchat.h"
|
||||
|
||||
@@ -54,8 +54,8 @@
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewermenufile.h"
|
||||
#include "llviewertexlayer.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "lltexlayer.h"
|
||||
#include "lltrans.h"
|
||||
|
||||
// library includes
|
||||
@@ -446,7 +446,7 @@ LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data,
|
||||
|
||||
LLSendTexLayerResponder::~LLSendTexLayerResponder()
|
||||
{
|
||||
// mBakedUploadData is normally deleted by calls to LLTexLayerSetBuffer::onTextureUploadComplete() below
|
||||
// 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;
|
||||
@@ -467,12 +467,12 @@ void LLSendTexLayerResponder::uploadComplete(const LLSD& content)
|
||||
if (result == "complete"
|
||||
&& mBakedUploadData != NULL)
|
||||
{ // Invoke
|
||||
LLTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, 0, LL_EXSTAT_NONE);
|
||||
LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, 0, LL_EXSTAT_NONE);
|
||||
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
|
||||
}
|
||||
else
|
||||
{ // Invoke the original callback with an error result
|
||||
LLTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
|
||||
LLViewerTexLayerSetBuffer::onTextureUploadComplete(new_id, (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
|
||||
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
|
||||
}
|
||||
}
|
||||
@@ -482,7 +482,7 @@ void LLSendTexLayerResponder::error(U32 statusNum, const std::string& reason)
|
||||
llinfos << "status: " << statusNum << " reason: " << reason << llendl;
|
||||
|
||||
// Invoke the original callback with an error result
|
||||
LLTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
|
||||
LLViewerTexLayerSetBuffer::onTextureUploadComplete(LLUUID(), (void*) mBakedUploadData, -1, LL_EXSTAT_NONE);
|
||||
mBakedUploadData = NULL; // deleted in onTextureUploadComplete()
|
||||
}
|
||||
|
||||
|
||||
@@ -72,8 +72,8 @@ public:
|
||||
|
||||
/*virtual*/ S8 getType() const ;
|
||||
|
||||
S32 getOriginX() { return mOrigin.mX; }
|
||||
S32 getOriginY() { return mOrigin.mY; }
|
||||
S32 getOriginX() const { return mOrigin.mX; }
|
||||
S32 getOriginY() const { return mOrigin.mY; }
|
||||
|
||||
S32 getSize() { return mFullWidth * mFullHeight * mComponents; }
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "lllocaltextureobject.h"
|
||||
|
||||
#include "lltexlayer.h"
|
||||
#include "llviewertexlayer.h"
|
||||
#include "llviewertexture.h"
|
||||
#include "lltextureentry.h"
|
||||
#include "lluuid.h"
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llagent.h"
|
||||
#include "lltexlayer.h"
|
||||
#include "llviewertexlayer.h"
|
||||
#include "llvoavatar.h"
|
||||
#include "llwearable.h"
|
||||
#include "lltexglobalcolor.h"
|
||||
@@ -105,7 +105,7 @@ LLTexParamGlobalColor::LLTexParamGlobalColor(LLTexGlobalColor* tex_global_color)
|
||||
|
||||
void LLTexParamGlobalColor::onGlobalColorChanged(bool upload_bake)
|
||||
{
|
||||
mAvatar->onGlobalColorChanged(mTexGlobalColor, upload_bake);
|
||||
mAvatarAppearance->onGlobalColorChanged(mTexGlobalColor, upload_bake);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
#include "llappviewer.h"
|
||||
#include "llselectmgr.h"
|
||||
#include "lltexlayer.h"
|
||||
#include "llviewertexlayer.h"
|
||||
#include "lltexturecache.h"
|
||||
#include "lltexturefetch.h"
|
||||
#include "llviewercontrol.h"
|
||||
@@ -422,9 +422,9 @@ void LLAvatarTexBar::draw()
|
||||
++baked_iter)
|
||||
{
|
||||
const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first;
|
||||
const LLTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index);
|
||||
const LLViewerTexLayerSet *layerset = dynamic_cast<const LLViewerTexLayerSet*>(avatarp->debugGetLayerSet(baked_index));
|
||||
if (!layerset) continue;
|
||||
const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite();
|
||||
const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite();
|
||||
if (!layerset_buffer) continue;
|
||||
|
||||
LLColor4 text_color = LLColor4::white;
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
#include "llface.h"
|
||||
#include "llgldbg.h"
|
||||
#include "llglheaders.h"
|
||||
#include "lltexlayer.h"
|
||||
#include "llviewertexlayer.h"
|
||||
#include "llviewercamera.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewertexturelist.h"
|
||||
@@ -255,7 +255,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
|
||||
llassert( !(mTexture.notNull() && mLayerSet) ); // mutually exclusive
|
||||
|
||||
LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP;
|
||||
LLTexLayerSet *layerset = mLayerSet;
|
||||
LLViewerTexLayerSet *layerset = dynamic_cast<LLViewerTexLayerSet*>(mLayerSet);
|
||||
if (mTestImageName)
|
||||
{
|
||||
gGL.getTexUnit(diffuse_channel)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
|
||||
@@ -274,7 +274,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
|
||||
{
|
||||
if( layerset->hasComposite() )
|
||||
{
|
||||
gGL.getTexUnit(diffuse_channel)->bind(layerset->getComposite());
|
||||
gGL.getTexUnit(diffuse_channel)->bind(layerset->getViewerComposite());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -563,9 +563,4 @@ void LLViewerJointMesh::dump()
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLViewerJointMesh::hasComposite() const
|
||||
{
|
||||
return (mLayerSet && mLayerSet->hasComposite());
|
||||
}
|
||||
|
||||
// End
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
class LLDrawable;
|
||||
class LLFace;
|
||||
class LLCharacter;
|
||||
class LLTexLayerSet;
|
||||
class LLViewerTexLayerSet;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// class LLViewerJointMesh
|
||||
@@ -67,8 +67,6 @@ public:
|
||||
/*virtual*/ void dump();
|
||||
|
||||
/*virtual*/ BOOL isAnimatable() const { return FALSE; }
|
||||
|
||||
/*virtual*/ BOOL hasComposite() const; //TO-DO: remove when texlayer is migrated to llappearance
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
#include "llviewernetwork.h"
|
||||
#include "llmeshrepository.h" //for LLMeshRepository::sBytesReceived
|
||||
#include "sgmemstat.h"
|
||||
#include "llviewertexlayer.h"
|
||||
|
||||
class AIHTTPTimeoutPolicy;
|
||||
extern AIHTTPTimeoutPolicy viewerStatsResponder_timeout;
|
||||
@@ -525,7 +526,7 @@ void output_statistics(void*)
|
||||
llinfos << "Avatar Memory (partly overlaps with above stats):" << llendl;
|
||||
LLTexLayerStaticImageList::getInstance()->dumpByteCount();
|
||||
LLVOAvatarSelf::dumpScratchTextureByteCount();
|
||||
LLTexLayerSetBuffer::dumpTotalByteCount();
|
||||
LLViewerTexLayerSetBuffer::dumpTotalByteCount();
|
||||
LLVOAvatarSelf::dumpTotalLocalTextureByteCount();
|
||||
LLTexLayerParamAlpha::dumpCacheByteCount();
|
||||
LLVOAvatar::dumpBakedStatus();
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "lltexlayer.h"
|
||||
#include "llviewertexlayer.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llimagej2c.h"
|
||||
@@ -68,7 +69,7 @@ public:
|
||||
~LLTexLayerInfo();
|
||||
|
||||
BOOL parseXml(LLXmlTreeNode* node);
|
||||
BOOL createVisualParams(LLVOAvatar *avatar);
|
||||
BOOL createVisualParams(LLAvatarAppearance *appearance);
|
||||
BOOL isUserSettable() { return mLocalTexture != -1; }
|
||||
S32 getLocalTexture() const { return mLocalTexture; }
|
||||
BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; }
|
||||
@@ -99,7 +100,7 @@ private:
|
||||
// LLBakedUploadData()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar,
|
||||
LLTexLayerSet* layerset,
|
||||
LLViewerTexLayerSet* layerset,
|
||||
const LLUUID& id,
|
||||
bool highest_res) :
|
||||
mAvatar(avatar),
|
||||
@@ -111,33 +112,33 @@ LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar,
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLTexLayerSetBuffer
|
||||
// The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one.
|
||||
// LLViewerTexLayerSetBuffer
|
||||
// The composite image that a LLViewerTexLayerSet writes to. Each LLViewerTexLayerSet has one.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// static
|
||||
S32 LLTexLayerSetBuffer::sGLByteCount = 0;
|
||||
S32 LLViewerTexLayerSetBuffer::sGLByteCount = 0;
|
||||
|
||||
LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const 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, 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),
|
||||
mTexLayerSet(owner)
|
||||
mNumLowresUpdates(0)
|
||||
{
|
||||
LLTexLayerSetBuffer::sGLByteCount += getSize();
|
||||
LLViewerTexLayerSetBuffer::sGLByteCount += getSize();
|
||||
mNeedsUploadTimer.start();
|
||||
mNeedsUpdateTimer.start();
|
||||
}
|
||||
|
||||
LLTexLayerSetBuffer::~LLTexLayerSetBuffer()
|
||||
LLViewerTexLayerSetBuffer::~LLViewerTexLayerSetBuffer()
|
||||
{
|
||||
LLTexLayerSetBuffer::sGLByteCount -= getSize();
|
||||
LLViewerTexLayerSetBuffer::sGLByteCount -= getSize();
|
||||
destroyGLTexture();
|
||||
for( S32 order = 0; order < ORDER_COUNT; order++ )
|
||||
{
|
||||
@@ -146,30 +147,30 @@ LLTexLayerSetBuffer::~LLTexLayerSetBuffer()
|
||||
}
|
||||
|
||||
//virtual
|
||||
S8 LLTexLayerSetBuffer::getType() const
|
||||
S8 LLViewerTexLayerSetBuffer::getType() const
|
||||
{
|
||||
return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLTexLayerSetBuffer::restoreGLTexture()
|
||||
void LLViewerTexLayerSetBuffer::restoreGLTexture()
|
||||
{
|
||||
LLViewerDynamicTexture::restoreGLTexture() ;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLTexLayerSetBuffer::destroyGLTexture()
|
||||
void LLViewerTexLayerSetBuffer::destroyGLTexture()
|
||||
{
|
||||
LLViewerDynamicTexture::destroyGLTexture() ;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLTexLayerSetBuffer::dumpTotalByteCount()
|
||||
void LLViewerTexLayerSetBuffer::dumpTotalByteCount()
|
||||
{
|
||||
llinfos << "Composite System GL Buffers: " << (LLTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl;
|
||||
llinfos << "Composite System GL Buffers: " << (LLViewerTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl;
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::requestUpdate()
|
||||
void LLViewerTexLayerSetBuffer::requestUpdate()
|
||||
{
|
||||
restartUpdateTimer();
|
||||
mNeedsUpdate = TRUE;
|
||||
@@ -179,7 +180,7 @@ void LLTexLayerSetBuffer::requestUpdate()
|
||||
mUploadID.setNull();
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::requestUpload()
|
||||
void LLViewerTexLayerSetBuffer::requestUpload()
|
||||
{
|
||||
conditionalRestartUploadTimer();
|
||||
mNeedsUpload = TRUE;
|
||||
@@ -187,7 +188,7 @@ void LLTexLayerSetBuffer::requestUpload()
|
||||
mUploadPending = TRUE;
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::conditionalRestartUploadTimer()
|
||||
void LLViewerTexLayerSetBuffer::conditionalRestartUploadTimer()
|
||||
{
|
||||
// If we requested a new upload but haven't even uploaded
|
||||
// a low res version of our last upload request, then
|
||||
@@ -204,13 +205,13 @@ void LLTexLayerSetBuffer::conditionalRestartUploadTimer()
|
||||
}
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::restartUpdateTimer()
|
||||
void LLViewerTexLayerSetBuffer::restartUpdateTimer()
|
||||
{
|
||||
mNeedsUpdateTimer.reset();
|
||||
mNeedsUpdateTimer.start();
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::cancelUpload()
|
||||
void LLViewerTexLayerSetBuffer::cancelUpload()
|
||||
{
|
||||
mNeedsUpload = FALSE;
|
||||
mUploadPending = FALSE;
|
||||
@@ -218,7 +219,7 @@ void LLTexLayerSetBuffer::cancelUpload()
|
||||
mUploadRetryTimer.reset();
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::pushProjection() const
|
||||
void LLViewerTexLayerSetBuffer::pushProjection() const
|
||||
{
|
||||
gGL.matrixMode(LLRender::MM_PROJECTION);
|
||||
gGL.pushMatrix();
|
||||
@@ -230,7 +231,7 @@ void LLTexLayerSetBuffer::pushProjection() const
|
||||
gGL.loadIdentity();
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::popProjection() const
|
||||
void LLViewerTexLayerSetBuffer::popProjection() const
|
||||
{
|
||||
gGL.matrixMode(LLRender::MM_PROJECTION);
|
||||
gGL.popMatrix();
|
||||
@@ -239,9 +240,9 @@ void LLTexLayerSetBuffer::popProjection() const
|
||||
gGL.popMatrix();
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::needsRender()
|
||||
BOOL LLViewerTexLayerSetBuffer::needsRender()
|
||||
{
|
||||
llassert(mTexLayerSet->getAvatar() == gAgentAvatarp);
|
||||
llassert(mTexLayerSet->getAvatarAppearance() == gAgentAvatarp);
|
||||
if (!isAgentAvatarValid()) return FALSE;
|
||||
|
||||
const BOOL upload_now = mNeedsUpload && isReadyToUpload();
|
||||
@@ -260,7 +261,7 @@ BOOL LLTexLayerSetBuffer::needsRender()
|
||||
}
|
||||
|
||||
// Don't render if we are trying to create a shirt texture but aren't wearing a skirt.
|
||||
if (gAgentAvatarp->getBakedTE(mTexLayerSet) == LLAvatarAppearanceDefines::TEX_SKIRT_BAKED &&
|
||||
if (gAgentAvatarp->getBakedTE(getViewerTexLayerSet()) == LLAvatarAppearanceDefines::TEX_SKIRT_BAKED &&
|
||||
!gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT))
|
||||
{
|
||||
cancelUpload();
|
||||
@@ -268,10 +269,10 @@ BOOL LLTexLayerSetBuffer::needsRender()
|
||||
}
|
||||
|
||||
// Render if we have at least minimal level of detail for each local texture.
|
||||
return mTexLayerSet->isLocalTextureDataAvailable();
|
||||
return getViewerTexLayerSet()->isLocalTextureDataAvailable();
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::preRender(BOOL clear_depth)
|
||||
void LLViewerTexLayerSetBuffer::preRender(BOOL clear_depth)
|
||||
{
|
||||
// Set up an ortho projection
|
||||
pushProjection();
|
||||
@@ -280,14 +281,14 @@ void LLTexLayerSetBuffer::preRender(BOOL clear_depth)
|
||||
LLViewerDynamicTexture::preRender(FALSE);
|
||||
}
|
||||
|
||||
void LLTexLayerSetBuffer::postRender(BOOL success)
|
||||
void LLViewerTexLayerSetBuffer::postRender(BOOL success)
|
||||
{
|
||||
popProjection();
|
||||
|
||||
LLViewerDynamicTexture::postRender(success);
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::render()
|
||||
BOOL LLViewerTexLayerSetBuffer::render()
|
||||
{
|
||||
// Default color mask for tex layer render
|
||||
gGL.setColorMask(true, true);
|
||||
@@ -323,9 +324,10 @@ BOOL LLTexLayerSetBuffer::render()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mTexLayerSet->isVisible())
|
||||
LLViewerTexLayerSet* layer_set = getViewerTexLayerSet();
|
||||
if (layer_set->isVisible())
|
||||
{
|
||||
mTexLayerSet->getAvatar()->debugBakedTextureUpload(mTexLayerSet->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish.
|
||||
layer_set->getAvatar()->debugBakedTextureUpload(layer_set->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish.
|
||||
doUpload();
|
||||
}
|
||||
else
|
||||
@@ -333,7 +335,7 @@ BOOL LLTexLayerSetBuffer::render()
|
||||
mUploadPending = FALSE;
|
||||
mNeedsUpload = FALSE;
|
||||
mNeedsUploadTimer.pause();
|
||||
mTexLayerSet->getAvatar()->setNewBakedTexture(mTexLayerSet->getBakedTexIndex(),IMG_INVISIBLE);
|
||||
layer_set->getAvatar()->setNewBakedTexture(layer_set->getBakedTexIndex(),IMG_INVISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -360,33 +362,33 @@ BOOL LLTexLayerSetBuffer::render()
|
||||
return success;
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::isInitialized(void) const
|
||||
BOOL LLViewerTexLayerSetBuffer::isInitialized(void) const
|
||||
{
|
||||
return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated();
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::uploadPending() const
|
||||
BOOL LLViewerTexLayerSetBuffer::uploadPending() const
|
||||
{
|
||||
return mUploadPending;
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::uploadNeeded() const
|
||||
BOOL LLViewerTexLayerSetBuffer::uploadNeeded() const
|
||||
{
|
||||
return mNeedsUpload;
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::uploadInProgress() const
|
||||
BOOL LLViewerTexLayerSetBuffer::uploadInProgress() const
|
||||
{
|
||||
return !mUploadID.isNull();
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::isReadyToUpload() const
|
||||
BOOL LLViewerTexLayerSetBuffer::isReadyToUpload() const
|
||||
{
|
||||
if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries.
|
||||
if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) return FALSE; // Don't upload if avatar is using composites.
|
||||
|
||||
BOOL ready = FALSE;
|
||||
if (mTexLayerSet->isLocalTextureDataFinal())
|
||||
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)
|
||||
@@ -411,7 +413,7 @@ BOOL LLTexLayerSetBuffer::isReadyToUpload() const
|
||||
|
||||
// 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 = mTexLayerSet->isLocalTextureDataAvailable();
|
||||
const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable();
|
||||
ready = has_lower_lod && is_upload_textures_timeout;
|
||||
}
|
||||
}
|
||||
@@ -419,10 +421,10 @@ BOOL LLTexLayerSetBuffer::isReadyToUpload() const
|
||||
return ready;
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::isReadyToUpdate() const
|
||||
BOOL LLViewerTexLayerSetBuffer::isReadyToUpdate() const
|
||||
{
|
||||
// If we requested an update and have the final LOD ready, then update.
|
||||
if (mTexLayerSet->isLocalTextureDataFinal()) return TRUE;
|
||||
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;
|
||||
@@ -434,14 +436,14 @@ BOOL LLTexLayerSetBuffer::isReadyToUpdate() const
|
||||
{
|
||||
// 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 = mTexLayerSet->isLocalTextureDataAvailable();
|
||||
const BOOL has_lower_lod = getViewerTexLayerSet()->isLocalTextureDataAvailable();
|
||||
if (has_lower_lod && is_update_textures_timeout) return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSetBuffer::requestUpdateImmediate()
|
||||
BOOL LLViewerTexLayerSetBuffer::requestUpdateImmediate()
|
||||
{
|
||||
mNeedsUpdate = TRUE;
|
||||
BOOL result = FALSE;
|
||||
@@ -458,14 +460,15 @@ BOOL LLTexLayerSetBuffer::requestUpdateImmediate()
|
||||
|
||||
// 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 LLTexLayerSetBuffer::doUpload()
|
||||
void LLViewerTexLayerSetBuffer::doUpload()
|
||||
{
|
||||
llinfos << "Uploading baked " << mTexLayerSet->getBodyRegionName() << llendl;
|
||||
LLViewerTexLayerSet* layer_set = getViewerTexLayerSet();
|
||||
llinfos << "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.)
|
||||
mTexLayerSet->deleteCaches();
|
||||
layer_set->deleteCaches();
|
||||
|
||||
// Get the COLOR information from our texture
|
||||
U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ];
|
||||
@@ -476,7 +479,8 @@ void LLTexLayerSetBuffer::doUpload()
|
||||
LLGLSUIDefault gls_ui;
|
||||
LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 );
|
||||
U8* baked_mask_data = baked_mask_image->getData();
|
||||
mTexLayerSet->gatherMorphMaskAlpha(baked_mask_data, mFullWidth, mFullHeight);
|
||||
layer_set->gatherMorphMaskAlpha(baked_mask_data,
|
||||
mFullWidth, mFullHeight);
|
||||
|
||||
|
||||
// Create the baked image from our color and mask information
|
||||
@@ -498,7 +502,6 @@ void LLTexLayerSetBuffer::doUpload()
|
||||
}
|
||||
|
||||
LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C;
|
||||
//compressedImage->setRate(0.f);
|
||||
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))
|
||||
{
|
||||
@@ -524,10 +527,10 @@ void LLTexLayerSetBuffer::doUpload()
|
||||
|
||||
if (valid)
|
||||
{
|
||||
const bool highest_lod = mTexLayerSet->isLocalTextureDataFinal();
|
||||
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,
|
||||
this->mTexLayerSet,
|
||||
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.
|
||||
@@ -540,7 +543,7 @@ void LLTexLayerSetBuffer::doUpload()
|
||||
&& (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 LLTexLayerSetBuffer::onTextureUploadComplete()
|
||||
// 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;
|
||||
}
|
||||
@@ -548,7 +551,7 @@ void LLTexLayerSetBuffer::doUpload()
|
||||
{
|
||||
gAssetStorage->storeAssetData(tid,
|
||||
LLAssetType::AT_TEXTURE,
|
||||
LLTexLayerSetBuffer::onTextureUploadComplete,
|
||||
LLViewerTexLayerSetBuffer::onTextureUploadComplete,
|
||||
baked_upload_data,
|
||||
TRUE, // temp_file
|
||||
TRUE, // is_priority
|
||||
@@ -576,12 +579,12 @@ void LLTexLayerSetBuffer::doUpload()
|
||||
{
|
||||
const std::string lod_str = highest_lod ? "HighRes" : "LowRes";
|
||||
LLSD args;
|
||||
args["EXISTENCE"] = llformat("%d",(U32)mTexLayerSet->getAvatar()->debugGetExistenceTimeElapsedF32());
|
||||
args["EXISTENCE"] = llformat("%d",(U32)layer_set->getAvatar()->debugGetExistenceTimeElapsedF32());
|
||||
args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32());
|
||||
args["BODYREGION"] = mTexLayerSet->getBodyRegionName();
|
||||
args["BODYREGION"] = layer_set->getBodyRegionName();
|
||||
args["RESOLUTION"] = lod_str;
|
||||
LLNotificationsUtil::add("AvatarRezSelfBakedTextureUploadNotification",args);
|
||||
LL_DEBUGS("Avatar") << self_av_string() << "Uploading [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << LL_ENDL;
|
||||
LL_DEBUGS("Avatar") << self_av_string() << "Uploading [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -606,9 +609,10 @@ void LLTexLayerSetBuffer::doUpload()
|
||||
|
||||
// Mostly bookkeeping; don't need to actually "do" anything since
|
||||
// render() will actually do the update.
|
||||
void LLTexLayerSetBuffer::doUpdate()
|
||||
void LLViewerTexLayerSetBuffer::doUpdate()
|
||||
{
|
||||
const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal();
|
||||
LLViewerTexLayerSet* layer_set = getViewerTexLayerSet();
|
||||
const BOOL highest_lod = layer_set->isLocalTextureDataFinal();
|
||||
if (highest_lod)
|
||||
{
|
||||
mNeedsUpdate = FALSE;
|
||||
@@ -620,27 +624,27 @@ void LLTexLayerSetBuffer::doUpdate()
|
||||
|
||||
restartUpdateTimer();
|
||||
|
||||
// need to swtich to using this layerset if this is the first update
|
||||
// need to switch to using this layerset if this is the first update
|
||||
// after getting the lowest LOD
|
||||
mTexLayerSet->getAvatar()->updateMeshTextures();
|
||||
layer_set->getAvatar()->updateMeshTextures();
|
||||
|
||||
// Print out notification that we uploaded this texture.
|
||||
// Print out notification that we updated this texture.
|
||||
if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
|
||||
{
|
||||
const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal();
|
||||
const BOOL highest_lod = layer_set->isLocalTextureDataFinal();
|
||||
const std::string lod_str = highest_lod ? "HighRes" : "LowRes";
|
||||
LLSD args;
|
||||
args["EXISTENCE"] = llformat("%d",(U32)mTexLayerSet->getAvatar()->debugGetExistenceTimeElapsedF32());
|
||||
args["EXISTENCE"] = llformat("%d",(U32)layer_set->getAvatar()->debugGetExistenceTimeElapsedF32());
|
||||
args["TIME"] = llformat("%d",(U32)mNeedsUpdateTimer.getElapsedTimeF32());
|
||||
args["BODYREGION"] = mTexLayerSet->getBodyRegionName();
|
||||
args["BODYREGION"] = layer_set->getBodyRegionName();
|
||||
args["RESOLUTION"] = lod_str;
|
||||
LLNotificationsUtil::add("AvatarRezSelfBakedTextureUpdateNotification",args);
|
||||
LL_DEBUGS("Avatar") << self_av_string() << "Locally updating [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << LL_ENDL;
|
||||
LL_DEBUGS("Avatar") << self_av_string() << "Locally updating [ name: " << layer_set->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUpdateTimer.getElapsedTimeF32() << " ]" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
|
||||
void LLViewerTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
|
||||
void* userdata,
|
||||
S32 result,
|
||||
LLExtStat ext_status) // StoreAssetData callback (not fixed)
|
||||
@@ -652,7 +656,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
|
||||
(baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures.
|
||||
(baked_upload_data->mTexLayerSet->hasComposite()))
|
||||
{
|
||||
LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite();
|
||||
LLViewerTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getViewerComposite();
|
||||
S32 failures = layerset_buffer->mUploadFailCount;
|
||||
layerset_buffer->mUploadFailCount = 0;
|
||||
|
||||
@@ -676,7 +680,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
|
||||
if (result >= 0)
|
||||
{
|
||||
layerset_buffer->mUploadPending = FALSE; // Allows sending of AgentSetAppearance later
|
||||
LLAvatarAppearanceDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->mTexLayerSet);
|
||||
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;
|
||||
@@ -716,7 +720,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLTexLayerSet
|
||||
// LLViewerTexLayerSet
|
||||
// An ordered set of texture layers that get composited into a single texture.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -786,7 +790,7 @@ BOOL LLTexLayerSetInfo::parseXml(LLXmlTreeNode* node)
|
||||
}
|
||||
|
||||
// creates visual params without generating layersets or layers
|
||||
void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar)
|
||||
void LLTexLayerSetInfo::createVisualParams(LLAvatarAppearance *appearance)
|
||||
{
|
||||
//layer_info_list_t mLayerInfoList;
|
||||
for (layer_info_list_t::iterator layer_iter = mLayerInfoList.begin();
|
||||
@@ -794,7 +798,7 @@ void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar)
|
||||
layer_iter++)
|
||||
{
|
||||
LLTexLayerInfo *layer_info = *layer_iter;
|
||||
layer_info->createVisualParams(avatar);
|
||||
layer_info->createVisualParams(appearance);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -803,11 +807,9 @@ void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar)
|
||||
// An ordered set of texture layers that get composited into a single texture.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
BOOL LLTexLayerSet::sHasCaches = FALSE;
|
||||
|
||||
LLTexLayerSet::LLTexLayerSet(LLVOAvatarSelf* const avatar) :
|
||||
LLViewerTexLayerSet::LLViewerTexLayerSet(LLAvatarAppearance* const appearance) :
|
||||
LLTexLayerSet(appearance),
|
||||
mComposite( NULL ),
|
||||
mAvatar( avatar ),
|
||||
mUpdatesEnabled( FALSE ),
|
||||
mIsVisible( TRUE ),
|
||||
mBakedTexIndex(LLAvatarAppearanceDefines::BAKED_HEAD),
|
||||
@@ -815,7 +817,8 @@ LLTexLayerSet::LLTexLayerSet(LLVOAvatarSelf* const avatar) :
|
||||
{
|
||||
}
|
||||
|
||||
LLTexLayerSet::~LLTexLayerSet()
|
||||
// virtual
|
||||
LLViewerTexLayerSet::~LLViewerTexLayerSet()
|
||||
{
|
||||
deleteCaches();
|
||||
std::for_each(mLayerList.begin(), mLayerList.end(), DeletePointer());
|
||||
@@ -826,7 +829,7 @@ LLTexLayerSet::~LLTexLayerSet()
|
||||
// setInfo
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
BOOL LLTexLayerSet::setInfo(const LLTexLayerSetInfo *info)
|
||||
BOOL LLViewerTexLayerSet::setInfo(const LLTexLayerSetInfo *info)
|
||||
{
|
||||
llassert(mInfo == NULL);
|
||||
mInfo = info;
|
||||
@@ -892,7 +895,7 @@ BOOL LLTexLayerSet::parseData(LLXmlTreeNode* node)
|
||||
}
|
||||
#endif
|
||||
|
||||
void LLTexLayerSet::deleteCaches()
|
||||
void LLViewerTexLayerSet::deleteCaches()
|
||||
{
|
||||
for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
|
||||
{
|
||||
@@ -907,22 +910,22 @@ void LLTexLayerSet::deleteCaches()
|
||||
}
|
||||
|
||||
// Returns TRUE if at least one packet of data has been received for each of the textures that this layerset depends on.
|
||||
BOOL LLTexLayerSet::isLocalTextureDataAvailable() const
|
||||
BOOL LLViewerTexLayerSet::isLocalTextureDataAvailable() const
|
||||
{
|
||||
if (!mAvatar->isSelf()) return FALSE;
|
||||
return ((LLVOAvatarSelf *)mAvatar)->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 LLTexLayerSet::isLocalTextureDataFinal() const
|
||||
BOOL LLViewerTexLayerSet::isLocalTextureDataFinal() const
|
||||
{
|
||||
if (!mAvatar->isSelf()) return FALSE;
|
||||
return ((LLVOAvatarSelf *)mAvatar)->isLocalTextureDataFinal(this);
|
||||
if (!mAvatarAppearance->isSelf()) return FALSE;
|
||||
return getAvatar()->isLocalTextureDataFinal(this);
|
||||
}
|
||||
|
||||
|
||||
BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
|
||||
BOOL LLViewerTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
|
||||
{
|
||||
BOOL success = TRUE;
|
||||
mIsVisible = TRUE;
|
||||
@@ -1011,55 +1014,62 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
|
||||
}
|
||||
|
||||
|
||||
BOOL LLTexLayerSet::isBodyRegion(const std::string& region) const
|
||||
BOOL LLViewerTexLayerSet::isBodyRegion(const std::string& region) const
|
||||
{
|
||||
return mInfo->mBodyRegion == region;
|
||||
}
|
||||
|
||||
const std::string LLTexLayerSet::getBodyRegionName() const
|
||||
const std::string LLViewerTexLayerSet::getBodyRegionName() const
|
||||
{
|
||||
return mInfo->mBodyRegion;
|
||||
}
|
||||
|
||||
void LLTexLayerSet::requestUpdate()
|
||||
void LLViewerTexLayerSet::requestUpdate()
|
||||
{
|
||||
if( mUpdatesEnabled )
|
||||
{
|
||||
createComposite();
|
||||
mComposite->requestUpdate();
|
||||
getViewerComposite()->requestUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
void LLTexLayerSet::requestUpload()
|
||||
void LLViewerTexLayerSet::requestUpload()
|
||||
{
|
||||
createComposite();
|
||||
mComposite->requestUpload();
|
||||
getViewerComposite()->requestUpload();
|
||||
}
|
||||
|
||||
void LLTexLayerSet::cancelUpload()
|
||||
void LLViewerTexLayerSet::cancelUpload()
|
||||
{
|
||||
if(mComposite)
|
||||
{
|
||||
mComposite->cancelUpload();
|
||||
getViewerComposite()->cancelUpload();
|
||||
}
|
||||
}
|
||||
|
||||
void LLTexLayerSet::createComposite()
|
||||
void LLViewerTexLayerSet::updateComposite()
|
||||
{
|
||||
createComposite();
|
||||
getViewerComposite()->requestUpdateImmediate();
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLViewerTexLayerSet::createComposite()
|
||||
{
|
||||
if(!mComposite)
|
||||
{
|
||||
S32 width = mInfo->mWidth;
|
||||
S32 height = mInfo->mHeight;
|
||||
S32 width = mInfo->getWidth();
|
||||
S32 height = mInfo->getHeight();
|
||||
// Composite other avatars at reduced resolution
|
||||
if( !mAvatar->isSelf() )
|
||||
if( !mAvatarAppearance->isSelf() )
|
||||
{
|
||||
llerrs << "composites should not be created for non-self avatars!" << llendl;
|
||||
}
|
||||
mComposite = new LLTexLayerSetBuffer( this, width, height );
|
||||
mComposite = new LLViewerTexLayerSetBuffer( this, width, height );
|
||||
}
|
||||
}
|
||||
|
||||
void LLTexLayerSet::destroyComposite()
|
||||
void LLViewerTexLayerSet::destroyComposite()
|
||||
{
|
||||
if( mComposite )
|
||||
{
|
||||
@@ -1067,19 +1077,32 @@ void LLTexLayerSet::destroyComposite()
|
||||
}
|
||||
}
|
||||
|
||||
void LLTexLayerSet::setUpdatesEnabled( BOOL b )
|
||||
void LLViewerTexLayerSet::setUpdatesEnabled( BOOL b )
|
||||
{
|
||||
mUpdatesEnabled = b;
|
||||
}
|
||||
|
||||
|
||||
void LLTexLayerSet::updateComposite()
|
||||
LLVOAvatarSelf* LLViewerTexLayerSet::getAvatar()
|
||||
{
|
||||
createComposite();
|
||||
mComposite->requestUpdateImmediate();
|
||||
return dynamic_cast<LLVOAvatarSelf*> (mAvatarAppearance);
|
||||
}
|
||||
|
||||
LLTexLayerSetBuffer* LLTexLayerSet::getComposite()
|
||||
const LLVOAvatarSelf* LLViewerTexLayerSet::getAvatar() const
|
||||
{
|
||||
return dynamic_cast<const LLVOAvatarSelf*> (mAvatarAppearance);
|
||||
}
|
||||
|
||||
LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite()
|
||||
{
|
||||
return dynamic_cast<LLViewerTexLayerSetBuffer*> (getComposite());
|
||||
}
|
||||
|
||||
const LLViewerTexLayerSetBuffer* LLViewerTexLayerSet::getViewerComposite() const
|
||||
{
|
||||
return dynamic_cast<const LLViewerTexLayerSetBuffer*> (getComposite());
|
||||
}
|
||||
|
||||
LLTexLayerSetBuffer* LLViewerTexLayerSet::getComposite()
|
||||
{
|
||||
if (!mComposite)
|
||||
{
|
||||
@@ -1088,12 +1111,12 @@ LLTexLayerSetBuffer* LLTexLayerSet::getComposite()
|
||||
return mComposite;
|
||||
}
|
||||
|
||||
const LLTexLayerSetBuffer* LLTexLayerSet::getComposite() const
|
||||
const LLTexLayerSetBuffer* LLViewerTexLayerSet::getComposite() const
|
||||
{
|
||||
return mComposite;
|
||||
}
|
||||
|
||||
void LLTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height)
|
||||
void LLViewerTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height)
|
||||
{
|
||||
memset(data, 255, width * height);
|
||||
|
||||
@@ -1107,7 +1130,7 @@ void LLTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height)
|
||||
renderAlphaMaskTextures(mComposite->getOriginX(), mComposite->getOriginY(), width, height, true);
|
||||
}
|
||||
|
||||
void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear)
|
||||
void LLViewerTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear)
|
||||
{
|
||||
const LLTexLayerSetInfo *info = getInfo();
|
||||
|
||||
@@ -1121,7 +1144,7 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,
|
||||
{
|
||||
gGL.flush();
|
||||
{
|
||||
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE);
|
||||
LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE);
|
||||
if( tex )
|
||||
{
|
||||
LLGLSUIDefault gls_ui;
|
||||
@@ -1176,12 +1199,12 @@ void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height,
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
}
|
||||
|
||||
void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components)
|
||||
void LLViewerTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components)
|
||||
{
|
||||
mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex);
|
||||
mAvatarAppearance->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex);
|
||||
}
|
||||
|
||||
BOOL LLTexLayerSet::isMorphValid() const
|
||||
BOOL LLViewerTexLayerSet::isMorphValid() const
|
||||
{
|
||||
for(layer_list_t::const_iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
|
||||
{
|
||||
@@ -1194,7 +1217,7 @@ BOOL LLTexLayerSet::isMorphValid() const
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLTexLayerSet::invalidateMorphMasks()
|
||||
void LLViewerTexLayerSet::invalidateMorphMasks()
|
||||
{
|
||||
for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
|
||||
{
|
||||
@@ -1364,7 +1387,7 @@ BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
|
||||
BOOL LLTexLayerInfo::createVisualParams(LLAvatarAppearance *appearance)
|
||||
{
|
||||
BOOL success = TRUE;
|
||||
for (param_color_info_list_t::iterator color_info_iter = mParamColorInfoList.begin();
|
||||
@@ -1372,7 +1395,7 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
|
||||
color_info_iter++)
|
||||
{
|
||||
LLTexLayerParamColorInfo * color_info = *color_info_iter;
|
||||
LLTexLayerParamColor* param_color = new LLTexLayerParamColor(avatar);
|
||||
LLTexLayerParamColor* param_color = new LLTexLayerParamColor(appearance);
|
||||
if (!param_color->setInfo(color_info, TRUE))
|
||||
{
|
||||
llwarns << "NULL TexLayer Color Param could not be added to visual param list. Deleting." << llendl;
|
||||
@@ -1386,7 +1409,7 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
|
||||
alpha_info_iter++)
|
||||
{
|
||||
LLTexLayerParamAlphaInfo * alpha_info = *alpha_info_iter;
|
||||
LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha(avatar);
|
||||
LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha(appearance);
|
||||
if (!param_alpha->setInfo(alpha_info, TRUE))
|
||||
{
|
||||
llwarns << "NULL TexLayer Alpha Param could not be added to visual param list. Deleting." << llendl;
|
||||
@@ -1640,7 +1663,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
|
||||
LLColor4 net_color;
|
||||
BOOL color_specified = findNetColor(&net_color);
|
||||
|
||||
if (mTexLayerSet->getAvatar()->mIsDummy)
|
||||
if (dynamic_cast<LLViewerTexLayerSet*>(mTexLayerSet)->getAvatar()->mIsDummy)
|
||||
{
|
||||
color_specified = true;
|
||||
net_color = LLVOAvatar::getDummyColor();
|
||||
@@ -1750,7 +1773,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
|
||||
if( !getInfo()->mStaticImageFileName.empty() )
|
||||
{
|
||||
{
|
||||
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
|
||||
LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
|
||||
if( tex )
|
||||
{
|
||||
gGL.getTexUnit(0)->bind(tex, TRUE);
|
||||
@@ -1830,7 +1853,7 @@ BOOL LLTexLayer::findNetColor(LLColor4* net_color) const
|
||||
{
|
||||
if( !getGlobalColor().empty() )
|
||||
{
|
||||
net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getInfo()->mGlobalColor ) );
|
||||
net_color->setVec( mTexLayerSet->getAvatarAppearance()->getGlobalColor( getInfo()->mGlobalColor ) );
|
||||
}
|
||||
else if (getInfo()->mFixedColor.mV[VW])
|
||||
{
|
||||
@@ -1847,7 +1870,7 @@ BOOL LLTexLayer::findNetColor(LLColor4* net_color) const
|
||||
|
||||
if( !getGlobalColor().empty() )
|
||||
{
|
||||
net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getGlobalColor() ) );
|
||||
net_color->setVec( mTexLayerSet->getAvatarAppearance()->getGlobalColor( getGlobalColor() ) );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -1872,7 +1895,7 @@ BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
|
||||
|
||||
if( !getInfo()->mStaticImageFileName.empty() )
|
||||
{
|
||||
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
|
||||
LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
|
||||
if( tex )
|
||||
{
|
||||
LLGLSNoAlphaTest gls_no_alpha_test;
|
||||
@@ -1989,7 +2012,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
||||
|
||||
if( !getInfo()->mStaticImageFileName.empty() )
|
||||
{
|
||||
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
|
||||
LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
|
||||
if( tex )
|
||||
{
|
||||
if( (tex->getComponents() == 4) ||
|
||||
@@ -2040,7 +2063,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
||||
if (!alpha_data)
|
||||
{
|
||||
// clear out a slot if we have filled our cache
|
||||
S32 max_cache_entries = getTexLayerSet()->getAvatar()->isSelf() ? 4 : 1;
|
||||
S32 max_cache_entries = getTexLayerSet()->getAvatarAppearance()->isSelf() ? 4 : 1;
|
||||
while ((S32)mAlphaCache.size() >= max_cache_entries)
|
||||
{
|
||||
alpha_cache_t::iterator iter2 = mAlphaCache.begin(); // arbitrarily grab the first entry
|
||||
@@ -2053,10 +2076,10 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
||||
glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);
|
||||
}
|
||||
|
||||
getTexLayerSet()->getAvatar()->dirtyMesh();
|
||||
getTexLayerSet()->getAvatarAppearance()->dirtyMesh();
|
||||
|
||||
mMorphMasksValid = TRUE;
|
||||
getTexLayerSet()->applyMorphMask(alpha_data, width, height, 1);
|
||||
dynamic_cast<LLViewerTexLayerSet*>(getTexLayerSet())->applyMorphMask(alpha_data, width, height, 1);
|
||||
}
|
||||
|
||||
return success;
|
||||
@@ -2114,7 +2137,7 @@ LLUUID LLTexLayer::getUUID() const
|
||||
}
|
||||
if( !getInfo()->mStaticImageFileName.empty() )
|
||||
{
|
||||
LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
|
||||
LLGLTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
|
||||
if( tex )
|
||||
{
|
||||
uuid = tex->getID();
|
||||
@@ -2316,7 +2339,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) const
|
||||
//-----------------------------------------------------------------------------
|
||||
// finds a specific layer based on a passed in name
|
||||
//-----------------------------------------------------------------------------
|
||||
LLTexLayerInterface* LLTexLayerSet::findLayerByName(const std::string& name)
|
||||
LLTexLayerInterface* LLViewerTexLayerSet::findLayerByName(const std::string& name)
|
||||
{
|
||||
for (layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
|
||||
{
|
||||
@@ -2337,10 +2360,10 @@ LLTexLayerInterface* LLTexLayerSet::findLayerByName(const std::string& name)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearanceDefines::ETextureIndex tex_index, LLWearable *wearable)
|
||||
void LLViewerTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearanceDefines::ETextureIndex tex_index, LLWearable *wearable)
|
||||
{
|
||||
// initialize all texlayers with this texture type for this LTO
|
||||
for( LLTexLayerSet::layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
|
||||
for( LLViewerTexLayerSet::layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
|
||||
{
|
||||
LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter;
|
||||
if (layer->getInfo()->getLocalTexture() == (S32) tex_index)
|
||||
@@ -2348,7 +2371,7 @@ void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearance
|
||||
lto->addTexLayer(layer, wearable);
|
||||
}
|
||||
}
|
||||
for( LLTexLayerSet::layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ )
|
||||
for( LLViewerTexLayerSet::layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ )
|
||||
{
|
||||
LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter;
|
||||
if (layer->getInfo()->getLocalTexture() == (S32) tex_index)
|
||||
@@ -2357,145 +2380,14 @@ void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearance
|
||||
}
|
||||
}
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLTexLayerStaticImageList
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
LLTexLayerStaticImageList::LLTexLayerStaticImageList() :
|
||||
mGLBytes(0),
|
||||
mTGABytes(0),
|
||||
mImageNames(16384)
|
||||
{
|
||||
}
|
||||
|
||||
LLTexLayerStaticImageList::~LLTexLayerStaticImageList()
|
||||
{
|
||||
deleteCachedImages();
|
||||
}
|
||||
|
||||
void LLTexLayerStaticImageList::dumpByteCount() const
|
||||
{
|
||||
llinfos << "Avatar Static Textures " <<
|
||||
"KB GL:" << (mGLBytes / 1024) <<
|
||||
"KB TGA:" << (mTGABytes / 1024) << "KB" << llendl;
|
||||
}
|
||||
|
||||
void LLTexLayerStaticImageList::deleteCachedImages()
|
||||
{
|
||||
if( mGLBytes || mTGABytes )
|
||||
{
|
||||
llinfos << "Clearing Static Textures " <<
|
||||
"KB GL:" << (mGLBytes / 1024) <<
|
||||
"KB TGA:" << (mTGABytes / 1024) << "KB" << llendl;
|
||||
|
||||
//mStaticImageLists uses LLPointers, clear() will cause deletion
|
||||
|
||||
mStaticImageListTGA.clear();
|
||||
mStaticImageList.clear();
|
||||
|
||||
mGLBytes = 0;
|
||||
mTGABytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Note: in general, for a given image image we'll call either getImageTga() or getTexture().
|
||||
// We call getImageTga() if the image is used as an alpha gradient.
|
||||
// Otherwise, we call getTexture()
|
||||
|
||||
// Returns an LLImageTGA that contains the encoded data from a tga file named file_name.
|
||||
// Caches the result to speed identical subsequent requests.
|
||||
LLImageTGA* LLTexLayerStaticImageList::getImageTGA(const std::string& file_name)
|
||||
{
|
||||
const char *namekey = mImageNames.addString(file_name);
|
||||
image_tga_map_t::const_iterator iter = mStaticImageListTGA.find(namekey);
|
||||
if( iter != mStaticImageListTGA.end() )
|
||||
{
|
||||
return iter->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string path;
|
||||
path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name);
|
||||
LLPointer<LLImageTGA> image_tga = new LLImageTGA( path );
|
||||
if( image_tga->getDataSize() > 0 )
|
||||
{
|
||||
mStaticImageListTGA[ namekey ] = image_tga;
|
||||
mTGABytes += image_tga->getDataSize();
|
||||
return image_tga;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Returns a GL Image (without a backing ImageRaw) that contains the decoded data from a tga file named file_name.
|
||||
// Caches the result to speed identical subsequent requests.
|
||||
LLViewerTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_name, BOOL is_mask)
|
||||
{
|
||||
LLPointer<LLViewerTexture> tex;
|
||||
const char *namekey = mImageNames.addString(file_name);
|
||||
|
||||
texture_map_t::const_iterator iter = mStaticImageList.find(namekey);
|
||||
if( iter != mStaticImageList.end() )
|
||||
{
|
||||
tex = iter->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
tex = LLViewerTextureManager::getLocalTexture( FALSE );
|
||||
LLPointer<LLImageRaw> image_raw = new LLImageRaw;
|
||||
if( loadImageRaw( file_name, image_raw ) )
|
||||
{
|
||||
if( (image_raw->getComponents() == 1) && is_mask )
|
||||
{
|
||||
// Note: these are static, unchanging images so it's ok to assume
|
||||
// that once an image is a mask it's always a mask.
|
||||
tex->setExplicitFormat( GL_ALPHA8, GL_ALPHA );
|
||||
}
|
||||
tex->createGLTexture(0, image_raw, 0, TRUE, LLViewerTexture::LOCAL);
|
||||
|
||||
gGL.getTexUnit(0)->bind(tex);
|
||||
tex->setAddressMode(LLTexUnit::TAM_CLAMP);
|
||||
|
||||
mStaticImageList [ namekey ] = tex;
|
||||
mGLBytes += (S32)tex->getWidth() * tex->getHeight() * tex->getComponents();
|
||||
}
|
||||
else
|
||||
{
|
||||
tex = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return tex;
|
||||
}
|
||||
|
||||
// Reads a .tga file, decodes it, and puts the decoded data in image_raw.
|
||||
// Returns TRUE if successful.
|
||||
BOOL LLTexLayerStaticImageList::loadImageRaw(const std::string& file_name, LLImageRaw* image_raw)
|
||||
{
|
||||
BOOL success = FALSE;
|
||||
std::string path;
|
||||
path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name);
|
||||
LLPointer<LLImageTGA> image_tga = new LLImageTGA( path );
|
||||
if( image_tga->getDataSize() > 0 )
|
||||
{
|
||||
// Copy data from tga to raw.
|
||||
success = image_tga->decode( image_raw );
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
const std::string LLTexLayerSetBuffer::dumpTextureInfo() const
|
||||
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 std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(mTexLayerSet);
|
||||
const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(getViewerTexLayerSet());
|
||||
|
||||
std::string status = "CREATING ";
|
||||
if (!uploadNeeded()) status = "DONE ";
|
||||
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
* @file lltexlayer.h
|
||||
* @brief Texture layer classes. Used for avatars.
|
||||
* @file llviewertexlayer.h
|
||||
* @brief Viewer Texture layer classes. Used for avatars.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
|
||||
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
@@ -24,13 +24,14 @@
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLTEXLAYER_H
|
||||
#define LL_LLTEXLAYER_H
|
||||
#ifndef LL_VIEWER_TEXLAYER_H
|
||||
#define LL_VIEWER_TEXLAYER_H
|
||||
|
||||
#include <deque>
|
||||
#include "lldynamictexture.h"
|
||||
#include "llavatarappearancedefines.h"
|
||||
#include "lltexlayerparams.h"
|
||||
#include "lltexlayer.h"
|
||||
|
||||
class LLVOAvatar;
|
||||
class LLVOAvatarSelf;
|
||||
@@ -40,7 +41,7 @@ class LLXmlTreeNode;
|
||||
class LLTexLayerSet;
|
||||
class LLTexLayerSetInfo;
|
||||
class LLTexLayerInfo;
|
||||
class LLTexLayerSetBuffer;
|
||||
class LLViewerTexLayerSetBuffer;
|
||||
class LLWearable;
|
||||
class LLViewerVisualParam;
|
||||
class LLLocalTextureObject;
|
||||
@@ -51,7 +52,7 @@ class LLLocalTextureObject;
|
||||
// Interface class to generalize functionality shared by LLTexLayer
|
||||
// and LLTexLayerTemplate.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLTexLayerInterface
|
||||
class LLTexLayerInterface : public LLTexLayerInterfaceTMP
|
||||
{
|
||||
public:
|
||||
enum ERenderPass
|
||||
@@ -171,60 +172,61 @@ private:
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLTexLayerSet
|
||||
// LLViewerTexLayerSet
|
||||
//
|
||||
// An ordered set of texture layers that gets composited into a single texture.
|
||||
// Only exists for llvoavatarself.
|
||||
// Only exists for llavatarappearanceself.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLTexLayerSet
|
||||
class LLViewerTexLayerSet : public LLTexLayerSet
|
||||
{
|
||||
friend class LLTexLayerSetBuffer;
|
||||
friend class LLViewerTexLayerSetBuffer;
|
||||
public:
|
||||
LLTexLayerSet(LLVOAvatarSelf* const avatar);
|
||||
~LLTexLayerSet();
|
||||
LLViewerTexLayerSet(LLAvatarAppearance* const appearance);
|
||||
virtual ~LLViewerTexLayerSet();
|
||||
|
||||
/*virtual*/ const LLTexLayerSetInfo* getInfo() const { return mInfo; }
|
||||
/*virtual*/ BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions
|
||||
|
||||
const LLTexLayerSetInfo* getInfo() const { return mInfo; }
|
||||
BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions
|
||||
/*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height);
|
||||
/*virtual*/ void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false);
|
||||
|
||||
BOOL render(S32 x, S32 y, S32 width, S32 height);
|
||||
void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false);
|
||||
|
||||
BOOL isBodyRegion(const std::string& region) const;
|
||||
LLTexLayerSetBuffer* getComposite();
|
||||
const LLTexLayerSetBuffer* getComposite() const; // Do not create one if it doesn't exist.
|
||||
void requestUpdate();
|
||||
/*virtual*/ BOOL isBodyRegion(const std::string& region) const;
|
||||
/*virtual*/ LLTexLayerSetBuffer* getComposite();
|
||||
/*virtual*/ const LLTexLayerSetBuffer* getComposite() const; // Do not create one if it doesn't exist.
|
||||
/*virtual*/ void destroyComposite();
|
||||
/*virtual*/ void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height);
|
||||
/*virtual*/ void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
|
||||
/*virtual*/ BOOL isMorphValid() const;
|
||||
/*virtual*/ void invalidateMorphMasks();
|
||||
/*virtual*/ void deleteCaches();
|
||||
/*virtual*/ LLTexLayerInterface* findLayerByName(const std::string& name);
|
||||
/*virtual*/ void cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearanceDefines::ETextureIndex tex_index, LLWearable* wearable);
|
||||
/*virtual*/ const std::string getBodyRegionName() const;
|
||||
/*virtual*/ BOOL hasComposite() const { return (mComposite.notNull()); }
|
||||
/*virtual*/ LLAvatarAppearanceDefines::EBakedTextureIndex getBakedTexIndex() const { return mBakedTexIndex; }
|
||||
/*virtual*/ void setBakedTexIndex(LLAvatarAppearanceDefines::EBakedTextureIndex index) { mBakedTexIndex = index; }
|
||||
/*virtual*/ BOOL isVisible() const { return mIsVisible; }
|
||||
|
||||
/*virtual*/void requestUpdate();
|
||||
void requestUpload();
|
||||
void cancelUpload();
|
||||
void updateComposite();
|
||||
BOOL isLocalTextureDataAvailable() const;
|
||||
BOOL isLocalTextureDataFinal() const;
|
||||
void createComposite();
|
||||
void destroyComposite();
|
||||
void updateComposite();
|
||||
/*virtual*/void createComposite();
|
||||
void setUpdatesEnabled(BOOL b);
|
||||
BOOL getUpdatesEnabled() const { return mUpdatesEnabled; }
|
||||
void deleteCaches();
|
||||
void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height);
|
||||
void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
|
||||
BOOL isMorphValid() const;
|
||||
void invalidateMorphMasks();
|
||||
LLTexLayerInterface* findLayerByName(const std::string& name);
|
||||
void cloneTemplates(LLLocalTextureObject *lto, LLAvatarAppearanceDefines::ETextureIndex tex_index, LLWearable* wearable);
|
||||
|
||||
LLVOAvatarSelf* getAvatar() const { return mAvatar; }
|
||||
const std::string getBodyRegionName() const;
|
||||
BOOL hasComposite() const { return (mComposite.notNull()); }
|
||||
LLAvatarAppearanceDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; }
|
||||
void setBakedTexIndex(LLAvatarAppearanceDefines::EBakedTextureIndex index) { mBakedTexIndex = index; }
|
||||
BOOL isVisible() const { return mIsVisible; }
|
||||
|
||||
static BOOL sHasCaches;
|
||||
LLVOAvatarSelf* getAvatar();
|
||||
const LLVOAvatarSelf* getAvatar() const;
|
||||
LLViewerTexLayerSetBuffer* getViewerComposite();
|
||||
const LLViewerTexLayerSetBuffer* getViewerComposite() const;
|
||||
|
||||
private:
|
||||
typedef std::vector<LLTexLayerInterface *> layer_list_t;
|
||||
layer_list_t mLayerList;
|
||||
layer_list_t mMaskLayerList;
|
||||
LLPointer<LLTexLayerSetBuffer> mComposite;
|
||||
LLVOAvatarSelf* const mAvatar; // note: backlink only; don't make this an LLPointer.
|
||||
LLPointer<LLViewerTexLayerSetBuffer> mComposite;
|
||||
BOOL mUpdatesEnabled;
|
||||
BOOL mIsVisible;
|
||||
|
||||
@@ -239,12 +241,14 @@ private:
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLTexLayerSetInfo
|
||||
{
|
||||
friend class LLTexLayerSet;
|
||||
friend class LLViewerTexLayerSet;
|
||||
public:
|
||||
LLTexLayerSetInfo();
|
||||
~LLTexLayerSetInfo();
|
||||
BOOL parseXml(LLXmlTreeNode* node);
|
||||
void createVisualParams(LLVOAvatar *avatar);
|
||||
void createVisualParams(LLAvatarAppearance *appearance);
|
||||
S32 getWidth() const { return mWidth; }
|
||||
S32 getHeight() const { return mHeight; }
|
||||
private:
|
||||
std::string mBodyRegion;
|
||||
S32 mWidth;
|
||||
@@ -256,17 +260,17 @@ private:
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLTexLayerSetBuffer
|
||||
// LLViewerTexLayerSetBuffer
|
||||
//
|
||||
// The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLTexLayerSetBuffer : public LLViewerDynamicTexture
|
||||
class LLViewerTexLayerSetBuffer : public LLTexLayerSetBuffer, public LLViewerDynamicTexture
|
||||
{
|
||||
LOG_CLASS(LLTexLayerSetBuffer);
|
||||
LOG_CLASS(LLViewerTexLayerSetBuffer);
|
||||
|
||||
public:
|
||||
LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height);
|
||||
virtual ~LLTexLayerSetBuffer();
|
||||
LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height);
|
||||
virtual ~LLViewerTexLayerSetBuffer();
|
||||
|
||||
public:
|
||||
/*virtual*/ S8 getType() const;
|
||||
@@ -279,7 +283,10 @@ protected:
|
||||
void pushProjection() const;
|
||||
void popProjection() const;
|
||||
private:
|
||||
LLTexLayerSet* const mTexLayerSet;
|
||||
LLViewerTexLayerSet* getViewerTexLayerSet()
|
||||
{ return dynamic_cast<LLViewerTexLayerSet*> (mTexLayerSet); }
|
||||
const LLViewerTexLayerSet* getViewerTexLayerSet() const
|
||||
{ return dynamic_cast<const LLViewerTexLayerSet*> (mTexLayerSet); }
|
||||
static S32 sGLByteCount;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@@ -334,48 +341,24 @@ private:
|
||||
LLFrameTimer mNeedsUpdateTimer; // Tracks time since update was requested and performed.
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLTexLayerStaticImageList
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList>
|
||||
{
|
||||
public:
|
||||
LLTexLayerStaticImageList();
|
||||
~LLTexLayerStaticImageList();
|
||||
LLViewerTexture* getTexture(const std::string& file_name, BOOL is_mask);
|
||||
LLImageTGA* getImageTGA(const std::string& file_name);
|
||||
void deleteCachedImages();
|
||||
void dumpByteCount() const;
|
||||
protected:
|
||||
BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw);
|
||||
private:
|
||||
LLStringTable mImageNames;
|
||||
typedef std::map<const char*, LLPointer<LLViewerTexture> > texture_map_t;
|
||||
texture_map_t mStaticImageList;
|
||||
typedef std::map<const char*, LLPointer<LLImageTGA> > image_tga_map_t;
|
||||
image_tga_map_t mStaticImageListTGA;
|
||||
S32 mGLBytes;
|
||||
S32 mTGABytes;
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// LLBakedUploadData
|
||||
//
|
||||
// Used by LLTexLayerSetBuffer for a callback.
|
||||
// Used by LLViewerTexLayerSetBuffer for a callback.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
struct LLBakedUploadData
|
||||
{
|
||||
LLBakedUploadData(const LLVOAvatarSelf* avatar,
|
||||
LLTexLayerSet* layerset,
|
||||
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
|
||||
LLTexLayerSet* mTexLayerSet;
|
||||
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_LLTEXLAYER_H
|
||||
#endif // LL_VIEWER_TEXLAYER_H
|
||||
|
||||
@@ -994,6 +994,8 @@ EmeraldGlobalBoobConfig LLVOAvatar::sBoobConfig;
|
||||
static F32 calc_bouncy_animation(F32 x);
|
||||
static U32 calc_shame(LLVOVolume* volume, std::set<LLUUID> &textures);
|
||||
|
||||
bool LLVOAvatar::isAgent() const { return gAgentAvatarp == this && gAgentAvatarp && getRegion() != NULL && !gAgentAvatarp->isDead(); };
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLVOAvatar()
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -1069,7 +1071,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
||||
mBakedTextureDatas.resize(BAKED_NUM_INDICES);
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++ )
|
||||
{
|
||||
mBakedTextureDatas[i].mLastTextureIndex = IMG_DEFAULT_AVATAR;
|
||||
mBakedTextureDatas[i].mLastTextureID = IMG_DEFAULT_AVATAR;
|
||||
mBakedTextureDatas[i].mTexLayerSet = NULL;
|
||||
mBakedTextureDatas[i].mIsLoaded = false;
|
||||
mBakedTextureDatas[i].mIsUsed = false;
|
||||
@@ -1083,8 +1085,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
||||
|
||||
mIsBuilt = FALSE;
|
||||
|
||||
mNumJoints = 0;
|
||||
|
||||
mNumCollisionVolumes = 0;
|
||||
mCollisionVolumes = NULL;
|
||||
|
||||
@@ -1183,12 +1183,10 @@ LLVOAvatar::~LLVOAvatar()
|
||||
|
||||
deleteAndClearArray(mCollisionVolumes);
|
||||
|
||||
mNumJoints = 0;
|
||||
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
deleteAndClear(mBakedTextureDatas[i].mTexLayerSet);
|
||||
mBakedTextureDatas[i].mMeshes.clear();
|
||||
mBakedTextureDatas[i].mJointMeshes.clear();
|
||||
|
||||
for (morph_list_t::iterator iter2 = mBakedTextureDatas[i].mMaskedMorphs.begin();
|
||||
iter2 != mBakedTextureDatas[i].mMaskedMorphs.end(); iter2++)
|
||||
@@ -1533,7 +1531,7 @@ void LLVOAvatar::resetImpostors()
|
||||
// static
|
||||
void LLVOAvatar::deleteCachedImages(bool clearAll)
|
||||
{
|
||||
if (LLTexLayerSet::sHasCaches)
|
||||
if (LLViewerTexLayerSet::sHasCaches)
|
||||
{
|
||||
lldebugs << "Deleting layer set caches" << llendl;
|
||||
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
|
||||
@@ -1542,7 +1540,7 @@ void LLVOAvatar::deleteCachedImages(bool clearAll)
|
||||
LLVOAvatar* inst = (LLVOAvatar*) *iter;
|
||||
inst->deleteLayerSetCaches(clearAll);
|
||||
}
|
||||
LLTexLayerSet::sHasCaches = FALSE;
|
||||
LLViewerTexLayerSet::sHasCaches = FALSE;
|
||||
}
|
||||
LLVOAvatarSelf::deleteScratchTextures();
|
||||
LLTexLayerStaticImageList::getInstance()->deleteCachedImages();
|
||||
@@ -1738,7 +1736,7 @@ void LLVOAvatar::initInstance(void)
|
||||
++iter)
|
||||
{
|
||||
LLViewerJointMesh* mesh = (LLViewerJointMesh*) *iter;
|
||||
mBakedTextureDatas[(int)baked_texture_index].mMeshes.push_back(mesh);
|
||||
mBakedTextureDatas[(int)baked_texture_index].mJointMeshes.push_back(mesh);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2495,11 +2493,11 @@ void LLVOAvatar::releaseMeshData()
|
||||
//llinfos << "Releasing" << llendl;
|
||||
|
||||
// cleanup mesh data
|
||||
for (std::vector<LLViewerJoint*>::iterator iter = mMeshLOD.begin();
|
||||
for (avatar_joint_list_t::iterator iter = mMeshLOD.begin();
|
||||
iter != mMeshLOD.end();
|
||||
++iter)
|
||||
{
|
||||
LLViewerJoint* joint = (LLViewerJoint*) *iter;
|
||||
LLAvatarJoint* joint = (*iter);
|
||||
joint->setValid(FALSE, TRUE);
|
||||
}
|
||||
|
||||
@@ -2589,7 +2587,11 @@ void LLVOAvatar::updateMeshData()
|
||||
last_v_num = num_vertices ;
|
||||
last_i_num = num_indices ;
|
||||
|
||||
mMeshLOD[part_index++]->updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
|
||||
LLViewerJoint* part_mesh = getViewerJoint(part_index++);
|
||||
if (part_mesh)
|
||||
{
|
||||
part_mesh->updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
|
||||
}
|
||||
}
|
||||
if(num_vertices < 1)//skip empty meshes
|
||||
{
|
||||
@@ -2663,7 +2665,11 @@ void LLVOAvatar::updateMeshData()
|
||||
rigid = true;
|
||||
}
|
||||
|
||||
mMeshLOD[k]->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid);
|
||||
LLViewerJoint* mesh = getViewerJoint(k);
|
||||
if (mesh)
|
||||
{
|
||||
mesh->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid);
|
||||
}
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
@@ -4834,19 +4840,44 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
|
||||
if (mNeedsSkin)
|
||||
{
|
||||
//generate animated mesh
|
||||
mMeshLOD[MESH_ID_LOWER_BODY]->updateJointGeometry();
|
||||
mMeshLOD[MESH_ID_UPPER_BODY]->updateJointGeometry();
|
||||
LLViewerJoint* lower_mesh = getViewerJoint(MESH_ID_LOWER_BODY);
|
||||
LLViewerJoint* upper_mesh = getViewerJoint(MESH_ID_UPPER_BODY);
|
||||
LLViewerJoint* skirt_mesh = getViewerJoint(MESH_ID_SKIRT);
|
||||
LLViewerJoint* eyelash_mesh = getViewerJoint(MESH_ID_EYELASH);
|
||||
LLViewerJoint* head_mesh = getViewerJoint(MESH_ID_HEAD);
|
||||
LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR);
|
||||
|
||||
if(upper_mesh)
|
||||
{
|
||||
upper_mesh->updateJointGeometry();
|
||||
}
|
||||
if (lower_mesh)
|
||||
{
|
||||
lower_mesh->updateJointGeometry();
|
||||
}
|
||||
|
||||
if( isWearingWearableType( LLWearableType::WT_SKIRT ) )
|
||||
{
|
||||
mMeshLOD[MESH_ID_SKIRT]->updateJointGeometry();
|
||||
if(skirt_mesh)
|
||||
{
|
||||
skirt_mesh->updateJointGeometry();
|
||||
}
|
||||
}
|
||||
|
||||
if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender)
|
||||
{
|
||||
mMeshLOD[MESH_ID_EYELASH]->updateJointGeometry();
|
||||
mMeshLOD[MESH_ID_HEAD]->updateJointGeometry();
|
||||
mMeshLOD[MESH_ID_HAIR]->updateJointGeometry();
|
||||
if(eyelash_mesh)
|
||||
{
|
||||
eyelash_mesh->updateJointGeometry();
|
||||
}
|
||||
if(head_mesh)
|
||||
{
|
||||
head_mesh->updateJointGeometry();
|
||||
}
|
||||
if(hair_mesh)
|
||||
{
|
||||
hair_mesh->updateJointGeometry();
|
||||
}
|
||||
}
|
||||
mNeedsSkin = FALSE;
|
||||
mLastSkinTime = gFrameTimeSeconds;
|
||||
@@ -4963,19 +4994,31 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
|
||||
{
|
||||
if (isTextureVisible(TEX_HEAD_BAKED) || mIsDummy)
|
||||
{
|
||||
num_indices += mMeshLOD[MESH_ID_HEAD]->render(mAdjustedPixelArea, TRUE, mIsDummy || is_muted);
|
||||
LLViewerJoint* head_mesh = getViewerJoint(MESH_ID_HEAD);
|
||||
if (head_mesh)
|
||||
{
|
||||
num_indices += head_mesh->render(mAdjustedPixelArea, TRUE, mIsDummy);
|
||||
}
|
||||
first_pass = FALSE;
|
||||
}
|
||||
}
|
||||
if (isTextureVisible(TEX_UPPER_BAKED) || mIsDummy)
|
||||
{
|
||||
num_indices += mMeshLOD[MESH_ID_UPPER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy || is_muted);
|
||||
LLViewerJoint* upper_mesh = getViewerJoint(MESH_ID_UPPER_BODY);
|
||||
if (upper_mesh)
|
||||
{
|
||||
num_indices += upper_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);
|
||||
}
|
||||
first_pass = FALSE;
|
||||
}
|
||||
|
||||
if (isTextureVisible(TEX_LOWER_BAKED) || mIsDummy)
|
||||
{
|
||||
num_indices += mMeshLOD[MESH_ID_LOWER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy || is_muted);
|
||||
LLViewerJoint* lower_mesh = getViewerJoint(MESH_ID_LOWER_BODY);
|
||||
if (lower_mesh)
|
||||
{
|
||||
num_indices += lower_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);
|
||||
}
|
||||
first_pass = FALSE;
|
||||
}
|
||||
}
|
||||
@@ -5008,7 +5051,11 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)
|
||||
if( isWearingWearableType( LLWearableType::WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) )
|
||||
{
|
||||
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f);
|
||||
num_indices += mMeshLOD[MESH_ID_SKIRT]->render(mAdjustedPixelArea, FALSE);
|
||||
LLViewerJoint* skirt_mesh = getViewerJoint(MESH_ID_SKIRT);
|
||||
if (skirt_mesh)
|
||||
{
|
||||
num_indices += skirt_mesh->render(mAdjustedPixelArea, FALSE);
|
||||
}
|
||||
first_pass = FALSE;
|
||||
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
|
||||
}
|
||||
@@ -5022,14 +5069,23 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)
|
||||
|
||||
if (isTextureVisible(TEX_HEAD_BAKED))
|
||||
{
|
||||
num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass, mIsDummy);
|
||||
LLViewerJoint* eyelash_mesh = getViewerJoint(MESH_ID_EYELASH);
|
||||
if (eyelash_mesh)
|
||||
{
|
||||
num_indices += eyelash_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);
|
||||
}
|
||||
first_pass = FALSE;
|
||||
}
|
||||
// Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair)
|
||||
// TODO: 1.25 will be able to switch this logic back to calling isTextureVisible();
|
||||
if (getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)
|
||||
if ( getImage(TEX_HAIR_BAKED, 0) &&
|
||||
getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)
|
||||
{
|
||||
num_indices += mMeshLOD[MESH_ID_HAIR]->render(mAdjustedPixelArea, first_pass, mIsDummy);
|
||||
LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR);
|
||||
if (hair_mesh)
|
||||
{
|
||||
num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);
|
||||
}
|
||||
first_pass = FALSE;
|
||||
}
|
||||
if (LLPipeline::sImpostorRender)
|
||||
@@ -5071,10 +5127,18 @@ U32 LLVOAvatar::renderRigid()
|
||||
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
|
||||
}
|
||||
|
||||
if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy)
|
||||
if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy)
|
||||
{
|
||||
num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
|
||||
num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
|
||||
LLViewerJoint* eyeball_left = getViewerJoint(MESH_ID_EYEBALL_LEFT);
|
||||
LLViewerJoint* eyeball_right = getViewerJoint(MESH_ID_EYEBALL_RIGHT);
|
||||
if (eyeball_left)
|
||||
{
|
||||
num_indices += eyeball_left->render(mAdjustedPixelArea, TRUE, mIsDummy);
|
||||
}
|
||||
if(eyeball_right)
|
||||
{
|
||||
num_indices += eyeball_right->render(mAdjustedPixelArea, TRUE, mIsDummy);
|
||||
}
|
||||
}
|
||||
|
||||
if (should_alpha_mask && !LLGLSLShader::sNoFixedFunction)
|
||||
@@ -5381,7 +5445,7 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel
|
||||
mMinPixelArea = llmin(pixel_area, mMinPixelArea);
|
||||
imagep->addTextureStats(pixel_area / texel_area_ratio);
|
||||
imagep->setBoostLevel(boost_level);
|
||||
|
||||
|
||||
if(boost_level != LLGLTexture::BOOST_AVATAR_BAKED_SELF)
|
||||
{
|
||||
imagep->setAdditionalDecodePriority(ADDITIONAL_PRI) ;
|
||||
@@ -5943,16 +6007,17 @@ void LLVOAvatar::resetSpecificJointPosition( const std::string& name )
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLVOAvatar::resetJointPositionsToDefault( void )
|
||||
{
|
||||
|
||||
//Subsequent joints are relative to pelvis
|
||||
for( S32 i = 0; i < (S32)mNumJoints; ++i )
|
||||
avatar_joint_list_t::iterator iter = mSkeleton.begin();
|
||||
avatar_joint_list_t::iterator end = mSkeleton.end();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
LLJoint* pJoint = (LLJoint*)&mSkeleton[i];
|
||||
LLJoint* pJoint = (*iter);
|
||||
if ( pJoint->doesJointNeedToBeReset() )
|
||||
{
|
||||
|
||||
pJoint->setId( LLUUID::null );
|
||||
//restore joints to default positions, however skip over the pelvis
|
||||
// *TODO: How does this pointer check skip over pelvis?
|
||||
if ( pJoint )
|
||||
{
|
||||
pJoint->restoreOldXform();
|
||||
@@ -6092,7 +6157,6 @@ BOOL LLVOAvatar::allocateCharacterJoints( U32 num )
|
||||
{
|
||||
std::for_each(mSkeleton.begin(), mSkeleton.end(), DeletePointer());
|
||||
mSkeleton.clear();
|
||||
mNumJoints = 0;
|
||||
|
||||
for(S32 joint_num = 0; joint_num < (S32)num; joint_num++)
|
||||
{
|
||||
@@ -6105,7 +6169,6 @@ BOOL LLVOAvatar::allocateCharacterJoints( U32 num )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
mNumJoints = num;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -6133,12 +6196,12 @@ BOOL LLVOAvatar::allocateCollisionVolumes( U32 num )
|
||||
//-----------------------------------------------------------------------------
|
||||
LLJoint *LLVOAvatar::getCharacterJoint( U32 num )
|
||||
{
|
||||
if ((S32)num >= mNumJoints
|
||||
if ((S32)num >= mSkeleton.size()
|
||||
|| (S32)num < 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return (LLJoint*)&mSkeleton[num];
|
||||
return mSkeleton[num];
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -6767,6 +6830,15 @@ void LLVOAvatar::dirtyMesh(S32 priority)
|
||||
{
|
||||
mDirtyMesh = llmax(mDirtyMesh, priority);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// getViewerJoint()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLViewerJoint* LLVOAvatar::getViewerJoint(S32 idx)
|
||||
{
|
||||
return dynamic_cast<LLViewerJoint*>(mMeshLOD[idx]);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// hideSkirt()
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -7441,9 +7513,15 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL
|
||||
if (!isTextureDefined(mBakedTextureDatas[BAKED_HAIR].mTextureIndex))
|
||||
{
|
||||
LLColor4 color = mTexHairColor->getColor();
|
||||
for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++)
|
||||
avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.begin();
|
||||
avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.end();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
|
||||
LLAvatarJointMesh* mesh = (*iter);
|
||||
if (mesh)
|
||||
{
|
||||
mesh->setColor( color );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7628,7 +7706,9 @@ void LLVOAvatar::updateMeshTextures()
|
||||
const LLViewerTexture* te_image = getImage(i, 0);
|
||||
if(!te_image || te_image->getID().isNull() || (te_image->getID() == IMG_DEFAULT))
|
||||
{
|
||||
setImage(i, LLViewerTextureManager::getFetchedTexture(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR), 0); // IMG_DEFAULT_AVATAR = a special texture that's never rendered.
|
||||
// IMG_DEFAULT_AVATAR = a special texture that's never rendered.
|
||||
const LLUUID& image_id = (i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR);
|
||||
setImage(i, LLViewerTextureManager::getFetchedTexture(image_id), 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7651,30 +7731,32 @@ void LLVOAvatar::updateMeshTextures()
|
||||
for (U32 i=0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
is_layer_baked[i] = isTextureDefined(mBakedTextureDatas[i].mTextureIndex);
|
||||
|
||||
LLViewerTexLayerSet* layerset = NULL;
|
||||
bool layerset_invalid = false;
|
||||
if (!other_culled)
|
||||
{
|
||||
// When an avatar is changing clothes and not in Appearance mode,
|
||||
// use the last-known good baked texture until it finish the first
|
||||
// use the last-known good baked texture until it finishes the first
|
||||
// render of the new layerset.
|
||||
const BOOL layerset_invalid = mBakedTextureDatas[i].mTexLayerSet
|
||||
&& ( !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized()
|
||||
|| !mBakedTextureDatas[i].mTexLayerSet->isLocalTextureDataAvailable() );
|
||||
layerset = getTexLayerSet(i);
|
||||
layerset_invalid = layerset && ( !layerset->getViewerComposite()->isInitialized()
|
||||
|| !layerset->isLocalTextureDataAvailable() );
|
||||
use_lkg_baked_layer[i] = (!is_layer_baked[i]
|
||||
&& (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR)
|
||||
&& (mBakedTextureDatas[i].mLastTextureID != IMG_DEFAULT_AVATAR)
|
||||
&& layerset_invalid);
|
||||
if (use_lkg_baked_layer[i])
|
||||
{
|
||||
mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE);
|
||||
layerset->setUpdatesEnabled(TRUE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
use_lkg_baked_layer[i] = (!is_layer_baked[i]
|
||||
&& mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR);
|
||||
if (mBakedTextureDatas[i].mTexLayerSet)
|
||||
&& mBakedTextureDatas[i].mLastTextureID != IMG_DEFAULT_AVATAR);
|
||||
layerset = getTexLayerSet(i);
|
||||
if (layerset)
|
||||
{
|
||||
mBakedTextureDatas[i].mTexLayerSet->destroyComposite();
|
||||
layerset->destroyComposite();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7692,27 +7774,40 @@ void LLVOAvatar::updateMeshTextures()
|
||||
|
||||
for (U32 i=0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
LLViewerTexLayerSet* layerset = getTexLayerSet(i);
|
||||
if (use_lkg_baked_layer[i] && !self_customizing )
|
||||
{
|
||||
LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureIndex, target_host );
|
||||
LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureID, target_host );
|
||||
mBakedTextureDatas[i].mIsUsed = TRUE;
|
||||
for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++)
|
||||
|
||||
avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();
|
||||
avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
mBakedTextureDatas[i].mMeshes[k]->setTexture( baked_img );
|
||||
LLAvatarJointMesh* mesh = (*iter);
|
||||
if (mesh)
|
||||
{
|
||||
mesh->setTexture( baked_img );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!self_customizing && is_layer_baked[i])
|
||||
{
|
||||
LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
|
||||
if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureIndex )
|
||||
LLViewerFetchedTexture* baked_img =
|
||||
LLViewerTextureManager::staticCastToFetchedTexture(
|
||||
getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
|
||||
if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureID )
|
||||
{
|
||||
// Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing).
|
||||
// Even though the file may not be finished loading,
|
||||
// we'll consider it loaded and use it (rather than
|
||||
// doing compositing).
|
||||
useBakedTexture( baked_img->getID() );
|
||||
}
|
||||
else
|
||||
{
|
||||
mBakedTextureDatas[i].mIsLoaded = FALSE;
|
||||
if ( (baked_img->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )
|
||||
if ( (baked_img->getID() != IMG_INVISIBLE) &&
|
||||
((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )
|
||||
{
|
||||
baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ),
|
||||
src_callback_list, paused);
|
||||
@@ -7721,16 +7816,25 @@ void LLVOAvatar::updateMeshTextures()
|
||||
src_callback_list, paused );
|
||||
}
|
||||
}
|
||||
else if (mBakedTextureDatas[i].mTexLayerSet
|
||||
else if (layerset
|
||||
&& !other_culled)
|
||||
{
|
||||
mBakedTextureDatas[i].mTexLayerSet->createComposite();
|
||||
mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE );
|
||||
|
||||
layerset->createComposite();
|
||||
layerset->setUpdatesEnabled( TRUE );
|
||||
mBakedTextureDatas[i].mIsUsed = FALSE;
|
||||
for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++)
|
||||
|
||||
avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();
|
||||
avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
mBakedTextureDatas[i].mMeshes[k]->setLayerSet( mBakedTextureDatas[i].mTexLayerSet );
|
||||
LLAvatarJointMesh* mesh = (*iter);
|
||||
if (mesh)
|
||||
{
|
||||
mesh->setLayerSet( layerset );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7741,15 +7845,22 @@ void LLVOAvatar::updateMeshTextures()
|
||||
{
|
||||
const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1);
|
||||
LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 );
|
||||
for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++)
|
||||
avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.begin();
|
||||
avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[BAKED_HAIR].mJointMeshes.end();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
|
||||
mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setTexture( hair_img );
|
||||
LLAvatarJointMesh* mesh = (*iter);
|
||||
if (mesh)
|
||||
{
|
||||
mesh->setColor( color );
|
||||
mesh->setTexture( hair_img );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter = LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin();
|
||||
for (LLAvatarAppearanceDictionary::BakedTextures::const_iterator baked_iter =
|
||||
LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().begin();
|
||||
baked_iter != LLAvatarAppearanceDictionary::getInstance()->getBakedTextures().end();
|
||||
++baked_iter)
|
||||
{
|
||||
@@ -7855,7 +7966,7 @@ BOOL LLVOAvatar::morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIn
|
||||
{
|
||||
if (isSelf())
|
||||
{
|
||||
LLTexLayerSet *layer_set = mBakedTextureDatas[index].mTexLayerSet;
|
||||
LLViewerTexLayerSet *layer_set = getTexLayerSet(index);
|
||||
if (layer_set)
|
||||
{
|
||||
return !layer_set->isMorphValid();
|
||||
@@ -8216,7 +8327,7 @@ void LLVOAvatar::onFirstTEMessageReceived()
|
||||
if (layer_baked)
|
||||
{
|
||||
LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
|
||||
mBakedTextureDatas[i].mLastTextureIndex = image->getID();
|
||||
mBakedTextureDatas[i].mLastTextureID = image->getID();
|
||||
// If we have more than one texture for the other baked layers, we'll want to call this for them too.
|
||||
if ( (image->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )
|
||||
{
|
||||
@@ -8317,11 +8428,11 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
|
||||
for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)
|
||||
{
|
||||
if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex)
|
||||
&& mBakedTextureDatas[baked_index].mLastTextureIndex != IMG_DEFAULT
|
||||
&& mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT
|
||||
&& baked_index != BAKED_SKIRT)
|
||||
{
|
||||
setTEImage(mBakedTextureDatas[baked_index].mTextureIndex,
|
||||
LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
|
||||
LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8654,17 +8765,26 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
|
||||
{
|
||||
LL_DEBUGS("Avatar") << avString() << " i " << i << " id " << id << LL_ENDL;
|
||||
mBakedTextureDatas[i].mIsLoaded = true;
|
||||
mBakedTextureDatas[i].mLastTextureIndex = id;
|
||||
mBakedTextureDatas[i].mLastTextureID = id;
|
||||
mBakedTextureDatas[i].mIsUsed = true;
|
||||
for (U32 k = 0; k < mBakedTextureDatas[i].mMeshes.size(); k++)
|
||||
{
|
||||
mBakedTextureDatas[i].mMeshes[k]->setTexture( image_baked );
|
||||
avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();
|
||||
avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
LLAvatarJointMesh* mesh = (*iter);
|
||||
if (mesh)
|
||||
{
|
||||
mesh->setTexture( image_baked );
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mBakedTextureDatas[i].mTexLayerSet)
|
||||
{
|
||||
//mBakedTextureDatas[i].mTexLayerSet->destroyComposite();
|
||||
}
|
||||
const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
|
||||
const LLAvatarAppearanceDictionary::BakedEntry *baked_dict =
|
||||
LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
|
||||
for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
|
||||
local_tex_iter != baked_dict->mLocalTextures.end();
|
||||
++local_tex_iter)
|
||||
@@ -8677,9 +8797,15 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
|
||||
// This is paired with similar code in updateMeshTextures that sets hair mesh color.
|
||||
if (i == BAKED_HAIR)
|
||||
{
|
||||
for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++)
|
||||
avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin();
|
||||
avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end();
|
||||
for (; iter != end; ++iter)
|
||||
{
|
||||
mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( 1.f, 1.f, 1.f, 1.f );
|
||||
LLAvatarJointMesh* mesh = (*iter);
|
||||
if (mesh)
|
||||
{
|
||||
mesh->setColor( LLColor4::white );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +1,32 @@
|
||||
/**
|
||||
* @file llvoavatar.h
|
||||
* @brief Declaration of LLVOAvatar class which is a derivation fo
|
||||
* @brief Declaration of LLVOAvatar class which is a derivation of
|
||||
* LLViewerObject
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, Linden Research, Inc.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
* 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.
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
* 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.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* 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$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLVOAVATAR_H
|
||||
#define LL_LLVOAVATAR_H
|
||||
#ifndef LL_VOAVATAR_H
|
||||
#define LL_VOAVATAR_H
|
||||
|
||||
#include <map>
|
||||
#include <deque>
|
||||
@@ -42,6 +36,7 @@
|
||||
#include <boost/signals2.hpp>
|
||||
|
||||
#include "imageids.h" // IMG_INVISIBLE
|
||||
#include "llavatarappearance.h"
|
||||
#include "llchat.h"
|
||||
#include "lldrawpoolalpha.h"
|
||||
#include "llviewerobject.h"
|
||||
@@ -53,13 +48,12 @@
|
||||
#include "llavatarappearancedefines.h"
|
||||
#include "lltexglobalcolor.h"
|
||||
#include "lldriverparam.h"
|
||||
#include "llviewertexlayer.h"
|
||||
#include "material_codes.h" // LL_MCODE_END
|
||||
|
||||
#include "emeraldboobutils.h"
|
||||
#include "llavatarname.h"
|
||||
|
||||
#include "llavatarappearance.h"
|
||||
|
||||
extern const LLUUID ANIM_AGENT_BODY_NOISE;
|
||||
extern const LLUUID ANIM_AGENT_BREATHE_ROT;
|
||||
extern const LLUUID ANIM_AGENT_PHYSICS_MOTION;
|
||||
@@ -125,8 +119,8 @@ private:
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
class LLVOAvatar :
|
||||
public LLViewerObject,
|
||||
public LLAvatarAppearance,
|
||||
public LLViewerObject,
|
||||
public boost::signals2::trackable
|
||||
{
|
||||
LOG_CLASS(LLVOAvatar);
|
||||
@@ -168,6 +162,9 @@ protected:
|
||||
** **
|
||||
*******************************************************************************/
|
||||
|
||||
/*virtual*/ bool isAgent() const;
|
||||
|
||||
|
||||
/********************************************************************************
|
||||
** **
|
||||
** INHERITED
|
||||
@@ -401,7 +398,6 @@ public:
|
||||
private:
|
||||
typedef std::vector<LLViewerJoint*> avatar_joint_list_t;
|
||||
BOOL mIsBuilt; // state of deferred character building
|
||||
S32 mNumJoints;
|
||||
avatar_joint_list_t mSkeleton;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@@ -606,18 +602,19 @@ protected:
|
||||
static void onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
|
||||
virtual void removeMissingBakedTextures();
|
||||
void useBakedTexture(const LLUUID& id);
|
||||
LLViewerTexLayerSet* getTexLayerSet(const U32 index) const { return dynamic_cast<LLViewerTexLayerSet*>(mBakedTextureDatas[index].mTexLayerSet); }
|
||||
|
||||
typedef std::deque<LLMaskedMorph *> morph_list_t;
|
||||
struct BakedTextureData
|
||||
{
|
||||
LLUUID mLastTextureIndex;
|
||||
LLUUID mLastTextureID;
|
||||
LLTexLayerSet* mTexLayerSet; // Only exists for self
|
||||
bool mIsLoaded;
|
||||
bool mIsUsed;
|
||||
LLAvatarAppearanceDefines::ETextureIndex mTextureIndex;
|
||||
U32 mMaskTexName;
|
||||
// Stores pointers to the joint meshes that this baked texture deals with
|
||||
std::vector< LLViewerJointMesh * > mMeshes; // std::vector<LLViewerJointMesh> mJoints[i]->mMeshParts
|
||||
avatar_joint_mesh_list_t mJointMeshes; // std::vector<LLAvatarJointMesh> mJoints[i]->mMeshParts
|
||||
morph_list_t mMaskedMorphs;
|
||||
};
|
||||
typedef std::vector<BakedTextureData> bakedtexturedata_vec_t;
|
||||
@@ -701,6 +698,7 @@ protected:
|
||||
virtual void restoreMeshData();
|
||||
private:
|
||||
virtual void dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority
|
||||
LLViewerJoint* getViewerJoint(S32 idx);
|
||||
S32 mDirtyMesh; // 0 -- not dirty, 1 -- morphed, 2 -- LOD
|
||||
BOOL mMeshTexturesDirty;
|
||||
|
||||
@@ -1258,4 +1256,4 @@ extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL;
|
||||
|
||||
extern const U32 EMERALD_BOOB_SIZE_PARAM; //"Breast Size"
|
||||
extern const U32 EMERALD_BOOB_GRAVITY_PARAM; //"Breast_Gravity"
|
||||
#endif // LL_VO_AVATAR_H
|
||||
#endif // LL_VOAVATAR_H
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerstats.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewertexlayer.h"
|
||||
#include "llappearancemgr.h"
|
||||
#include "llmeshrepository.h"
|
||||
#include "llvovolume.h"
|
||||
@@ -497,7 +498,7 @@ BOOL LLVOAvatarSelf::loadLayersets()
|
||||
{
|
||||
// Construct a layerset for each one specified in avatar_lad.xml and initialize it as such.
|
||||
const LLTexLayerSetInfo *info = *iter;
|
||||
LLTexLayerSet* layer_set = new LLTexLayerSet( this );
|
||||
LLViewerTexLayerSet* layer_set = new LLViewerTexLayerSet( this );
|
||||
|
||||
if (!layer_set->setInfo(info))
|
||||
{
|
||||
@@ -591,7 +592,7 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
|
||||
return LLVOAvatar::getJoint(name);
|
||||
}
|
||||
// virtual
|
||||
BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )
|
||||
BOOL LLVOAvatarSelf::setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake )
|
||||
{
|
||||
if (!which_param)
|
||||
{
|
||||
@@ -619,7 +620,7 @@ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bak
|
||||
return setParamWeight(param,weight,upload_bake);
|
||||
}
|
||||
|
||||
BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake )
|
||||
BOOL LLVOAvatarSelf::setParamWeight(const LLViewerVisualParam *param, F32 weight, BOOL upload_bake )
|
||||
{
|
||||
if (!param)
|
||||
{
|
||||
@@ -783,8 +784,12 @@ void LLVOAvatarSelf::removeMissingBakedTextures()
|
||||
{
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE);
|
||||
invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, FALSE);
|
||||
LLViewerTexLayerSet *layerset = getTexLayerSet(i);
|
||||
if(layerset)
|
||||
{
|
||||
layerset->setUpdatesEnabled(TRUE);
|
||||
invalidateComposite(layerset, FALSE);
|
||||
}
|
||||
}
|
||||
updateMeshTextures();
|
||||
requestLayerSetUploads();
|
||||
@@ -1007,10 +1012,11 @@ void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_re
|
||||
const LLWearableType::EType comp_type = *type_iter;
|
||||
if (comp_type == type)
|
||||
{
|
||||
if (mBakedTextureDatas[index].mTexLayerSet)
|
||||
LLViewerTexLayerSet *layerset = dynamic_cast<LLViewerTexLayerSet*>(mBakedTextureDatas[index].mTexLayerSet);
|
||||
if (layerset)
|
||||
{
|
||||
mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled(true);
|
||||
invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result);
|
||||
layerset->setUpdatesEnabled(true);
|
||||
invalidateComposite(layerset, upload_result);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1393,7 +1399,7 @@ const LLUUID& LLVOAvatarSelf::getLocalTextureID(ETextureIndex type, U32 index) c
|
||||
// Returns true if at least the lowest quality discard level exists for every texture
|
||||
// in the layerset.
|
||||
//-----------------------------------------------------------------------------
|
||||
BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const
|
||||
BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLViewerTexLayerSet* layerset) const
|
||||
{
|
||||
/* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet)
|
||||
return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */
|
||||
@@ -1404,7 +1410,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
|
||||
const EBakedTextureIndex baked_index = baked_iter->first;
|
||||
if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet)
|
||||
{
|
||||
BOOL ret = true;
|
||||
bool ret = true;
|
||||
const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = baked_iter->second;
|
||||
for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
|
||||
local_tex_iter != baked_dict->mLocalTextures.end();
|
||||
@@ -1415,7 +1421,8 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
|
||||
const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
|
||||
for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
|
||||
{
|
||||
ret &= (getLocalDiscardLevel(tex_index, wearable_index) >= 0);
|
||||
bool tex_avail = (getLocalDiscardLevel(tex_index, wearable_index) >= 0);
|
||||
ret &= tex_avail;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@@ -1431,7 +1438,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
|
||||
// Returns true if the highest quality discard level exists for every texture
|
||||
// in the layerset.
|
||||
//-----------------------------------------------------------------------------
|
||||
BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const
|
||||
BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLViewerTexLayerSet* layerset) const
|
||||
{
|
||||
const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
|
||||
// const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels.
|
||||
@@ -1492,9 +1499,9 @@ BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const
|
||||
|
||||
BOOL LLVOAvatarSelf::isBakedTextureFinal(const LLAvatarAppearanceDefines::EBakedTextureIndex index) const
|
||||
{
|
||||
const LLTexLayerSet *layerset = mBakedTextureDatas[index].mTexLayerSet;
|
||||
const LLViewerTexLayerSet *layerset = getLayerSet(index);
|
||||
if (!layerset) return FALSE;
|
||||
const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite();
|
||||
const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite();
|
||||
if (!layerset_buffer) return FALSE;
|
||||
return !layerset_buffer->uploadNeeded();
|
||||
}
|
||||
@@ -1572,9 +1579,10 @@ void LLVOAvatarSelf::requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedText
|
||||
{
|
||||
ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
|
||||
const BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
|
||||
if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet)
|
||||
LLViewerTexLayerSet *layerset = getLayerSet(i);
|
||||
if (!layer_baked && layerset)
|
||||
{
|
||||
mBakedTextureDatas[i].mTexLayerSet->requestUpload();
|
||||
layerset->requestUpload();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1588,8 +1596,8 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const
|
||||
{
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
LLTexLayerSet* layerset = mBakedTextureDatas[i].mTexLayerSet;
|
||||
if (layerset && layerset->getComposite() && layerset->getComposite()->uploadPending())
|
||||
LLViewerTexLayerSet* layerset = getTexLayerSet(i);
|
||||
if (layerset && layerset->getViewerComposite() && layerset->getViewerComposite()->uploadPending())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -1599,22 +1607,23 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const
|
||||
|
||||
void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )
|
||||
{
|
||||
if( !layerset || !layerset->getUpdatesEnabled() )
|
||||
LLViewerTexLayerSet *layer_set = dynamic_cast<LLViewerTexLayerSet*>(layerset);
|
||||
if( !layer_set || !layer_set->getUpdatesEnabled() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
// llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << llendl;
|
||||
|
||||
layerset->requestUpdate();
|
||||
layerset->invalidateMorphMasks();
|
||||
layer_set->requestUpdate();
|
||||
layer_set->invalidateMorphMasks();
|
||||
|
||||
if( upload_result )
|
||||
{
|
||||
llassert(isSelf());
|
||||
|
||||
ETextureIndex baked_te = getBakedTE( layerset );
|
||||
ETextureIndex baked_te = getBakedTE( layer_set );
|
||||
setTEImage( baked_te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR) );
|
||||
layerset->requestUpload();
|
||||
layer_set->requestUpload();
|
||||
updateMeshTextures();
|
||||
}
|
||||
}
|
||||
@@ -1623,7 +1632,8 @@ void LLVOAvatarSelf::invalidateAll()
|
||||
{
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);
|
||||
LLViewerTexLayerSet *layerset = getTexLayerSet(i);
|
||||
invalidateComposite(layerset, TRUE);
|
||||
}
|
||||
//mDebugSelfLoadTimer.reset();
|
||||
}
|
||||
@@ -1641,17 +1651,19 @@ void LLVOAvatarSelf::setCompositeUpdatesEnabled( bool b )
|
||||
|
||||
void LLVOAvatarSelf::setCompositeUpdatesEnabled(U32 index, bool b)
|
||||
{
|
||||
if (mBakedTextureDatas[index].mTexLayerSet )
|
||||
LLViewerTexLayerSet *layerset = getTexLayerSet(index);
|
||||
if (layerset )
|
||||
{
|
||||
mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled( b );
|
||||
layerset->setUpdatesEnabled( b );
|
||||
}
|
||||
}
|
||||
|
||||
bool LLVOAvatarSelf::isCompositeUpdateEnabled(U32 index)
|
||||
{
|
||||
if (mBakedTextureDatas[index].mTexLayerSet)
|
||||
LLViewerTexLayerSet *layerset = getTexLayerSet(index);
|
||||
if (layerset)
|
||||
{
|
||||
return mBakedTextureDatas[index].mTexLayerSet->getUpdatesEnabled();
|
||||
return layerset->getUpdatesEnabled();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1662,9 +1674,10 @@ void LLVOAvatarSelf::setupComposites()
|
||||
{
|
||||
ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
|
||||
BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
|
||||
if (mBakedTextureDatas[i].mTexLayerSet)
|
||||
LLViewerTexLayerSet *layerset = getTexLayerSet(i);
|
||||
if (layerset)
|
||||
{
|
||||
mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(!layer_baked);
|
||||
layerset->setUpdatesEnabled(!layer_baked);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1673,10 +1686,11 @@ void LLVOAvatarSelf::updateComposites()
|
||||
{
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
if (mBakedTextureDatas[i].mTexLayerSet
|
||||
LLViewerTexLayerSet *layerset = getTexLayerSet(i);
|
||||
if (layerset
|
||||
&& ((i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT)))
|
||||
{
|
||||
mBakedTextureDatas[i].mTexLayerSet->updateComposite();
|
||||
layerset->updateComposite();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1689,11 +1703,12 @@ S32 LLVOAvatarSelf::getLocalDiscardLevel(ETextureIndex type, U32 wearable_index)
|
||||
const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, wearable_index);
|
||||
if (local_tex_obj)
|
||||
{
|
||||
const LLViewerFetchedTexture* image = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() );
|
||||
if (type >= 0
|
||||
&& local_tex_obj->getID() != IMG_DEFAULT_AVATAR
|
||||
&& !local_tex_obj->getImage()->isMissingAsset())
|
||||
&& !image->isMissingAsset())
|
||||
{
|
||||
return local_tex_obj->getImage()->getDiscardLevel();
|
||||
return image->getDiscardLevel();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1718,7 +1733,7 @@ void LLVOAvatarSelf::getLocalTextureByteCount(S32* gl_bytes) const
|
||||
const LLLocalTextureObject *local_tex_obj = getLocalTextureObject((ETextureIndex) type, num);
|
||||
if (local_tex_obj)
|
||||
{
|
||||
const LLViewerFetchedTexture* image_gl = local_tex_obj->getImage();
|
||||
const LLViewerFetchedTexture* image_gl = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() );
|
||||
if (image_gl)
|
||||
{
|
||||
S32 bytes = (S32)image_gl->getWidth() * image_gl->getHeight() * image_gl->getComponents();
|
||||
@@ -1767,7 +1782,7 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te
|
||||
return;
|
||||
}
|
||||
|
||||
LLTexLayerSet *layer_set = getLayerSet(type);
|
||||
LLViewerTexLayerSet *layer_set = getLayerSet(type);
|
||||
if (layer_set)
|
||||
{
|
||||
layer_set->cloneTemplates(local_tex_obj, type, gAgentWearables.getWearable(wearable_type,index));
|
||||
@@ -1864,7 +1879,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const
|
||||
}
|
||||
else
|
||||
{
|
||||
const LLViewerFetchedTexture* image = local_tex_obj->getImage();
|
||||
const LLViewerFetchedTexture* image = dynamic_cast<LLViewerFetchedTexture*>( local_tex_obj->getImage() );
|
||||
|
||||
llinfos << "LocTex " << name << ": "
|
||||
<< "Discard " << image->getDiscardLevel() << ", "
|
||||
@@ -1959,14 +1974,14 @@ BOOL LLVOAvatarSelf::getIsCloud() const
|
||||
|
||||
if (!mPreviousFullyLoaded)
|
||||
{
|
||||
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) &&
|
||||
if (!isLocalTextureDataAvailable(getLayerSet(BAKED_LOWER)) &&
|
||||
(!isTextureDefined(TEX_LOWER_BAKED, 0)))
|
||||
{
|
||||
lldebugs << "Lower textures not baked" << llendl;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) &&
|
||||
if (!isLocalTextureDataAvailable(getLayerSet(BAKED_UPPER)) &&
|
||||
(!isTextureDefined(TEX_UPPER_BAKED, 0)))
|
||||
{
|
||||
lldebugs << "Upper textures not baked" << llendl;
|
||||
@@ -2037,7 +2052,7 @@ void LLVOAvatarSelf::debugBakedTextureUpload(EBakedTextureIndex index, BOOL fini
|
||||
mDebugBakedTextureTimes[index][done] = mDebugSelfLoadTimer.getElapsedTimeF32();
|
||||
}
|
||||
|
||||
const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const
|
||||
const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const
|
||||
{
|
||||
std::string text="";
|
||||
|
||||
@@ -2240,7 +2255,7 @@ LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLAvatarAppearanceDe
|
||||
// getBakedTE()
|
||||
// Used by the LayerSet. (Layer sets don't in general know what textures depend on them.)
|
||||
//-----------------------------------------------------------------------------
|
||||
ETextureIndex LLVOAvatarSelf::getBakedTE( const LLTexLayerSet* layerset ) const
|
||||
ETextureIndex LLVOAvatarSelf::getBakedTE( const LLViewerTexLayerSet* layerset ) const
|
||||
{
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
@@ -2381,9 +2396,9 @@ void LLVOAvatarSelf::outputRezDiagnostics() const
|
||||
++baked_iter)
|
||||
{
|
||||
const LLAvatarAppearanceDefines::EBakedTextureIndex baked_index = baked_iter->first;
|
||||
const LLTexLayerSet *layerset = debugGetLayerSet(baked_index);
|
||||
const LLViewerTexLayerSet *layerset = debugGetLayerSet(baked_index);
|
||||
if (!layerset) continue;
|
||||
const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite();
|
||||
const LLViewerTexLayerSetBuffer *layerset_buffer = layerset->getViewerComposite();
|
||||
if (!layerset_buffer) continue;
|
||||
LL_DEBUGS("Avatar") << layerset_buffer->dumpTextureInfo() << llendl;
|
||||
}
|
||||
@@ -2416,7 +2431,8 @@ void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid
|
||||
mHeadLayerSet->cancelUpload(); */
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
if ( mBakedTextureDatas[i].mTextureIndex == te && mBakedTextureDatas[i].mTexLayerSet)
|
||||
LLViewerTexLayerSet *layerset = getTexLayerSet(i);
|
||||
if ( mBakedTextureDatas[i].mTextureIndex == te && layerset)
|
||||
{
|
||||
if (mInitialBakeIDs[i] != LLUUID::null)
|
||||
{
|
||||
@@ -2430,7 +2446,7 @@ void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid
|
||||
}
|
||||
mInitialBakeIDs[i] = LLUUID::null;
|
||||
}
|
||||
mBakedTextureDatas[i].mTexLayerSet->cancelUpload();
|
||||
layerset->cancelUpload();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2459,7 +2475,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
|
||||
{
|
||||
if (texture_id == gAgentAvatarp->getTEImage(index)->getID())
|
||||
{
|
||||
LLTexLayerSet* layer_set = gAgentAvatarp->getLayerSet(index);
|
||||
LLViewerTexLayerSet* layer_set = gAgentAvatarp->getLayerSet(index);
|
||||
if (layer_set)
|
||||
{
|
||||
llinfos << "TAT: rebake - matched entry " << (S32)index << llendl;
|
||||
@@ -2483,7 +2499,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLVOAvatarSelf::isUsingBakedTextures() const
|
||||
bool LLVOAvatarSelf::isUsingBakedTextures() const
|
||||
{
|
||||
// Composite textures are used during appearance mode.
|
||||
if (gAgentCamera.cameraCustomizeAvatar())
|
||||
@@ -2500,7 +2516,7 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)
|
||||
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
|
||||
{
|
||||
ETextureIndex baked_index = mBakedTextureDatas[i].mTextureIndex;
|
||||
LLTexLayerSet* layer_set = getLayerSet(baked_index);
|
||||
LLViewerTexLayerSet* layer_set = getLayerSet(baked_index);
|
||||
if (layer_set)
|
||||
{
|
||||
if (slam_for_debug)
|
||||
@@ -2542,22 +2558,22 @@ void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index )
|
||||
}
|
||||
}
|
||||
|
||||
LLTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const
|
||||
LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const
|
||||
{
|
||||
/* switch(index)
|
||||
case TEX_HEAD_BAKED:
|
||||
case TEX_HEAD_BODYPAINT:
|
||||
return mHeadLayerSet; */
|
||||
const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index);
|
||||
if (texture_dict->mIsUsedByBakedTexture)
|
||||
{
|
||||
const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
|
||||
return mBakedTextureDatas[baked_index].mTexLayerSet;
|
||||
}
|
||||
return NULL;
|
||||
/* switch(index)
|
||||
case TEX_HEAD_BAKED:
|
||||
case TEX_HEAD_BODYPAINT:
|
||||
return mHeadLayerSet; */
|
||||
const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index);
|
||||
if (texture_dict->mIsUsedByBakedTexture)
|
||||
{
|
||||
const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
|
||||
return getLayerSet(baked_index);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LLTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const
|
||||
LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const
|
||||
{
|
||||
/* switch(index)
|
||||
case TEX_HEAD_BAKED:
|
||||
@@ -2565,12 +2581,14 @@ LLTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const
|
||||
return mHeadLayerSet; */
|
||||
if (baked_index >= 0 && baked_index < BAKED_NUM_INDICES)
|
||||
{
|
||||
return mBakedTextureDatas[baked_index].mTexLayerSet;
|
||||
return getTexLayerSet(baked_index);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// static
|
||||
void LLVOAvatarSelf::onCustomizeStart()
|
||||
{
|
||||
|
||||
@@ -95,7 +95,7 @@ public:
|
||||
/*virtual*/ void requestStopMotion(LLMotion* motion);
|
||||
/*virtual*/ LLJoint* getJoint(const std::string &name);
|
||||
|
||||
/*virtual*/ BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
|
||||
/*virtual*/ BOOL setVisualParamWeight(const LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
|
||||
/*virtual*/ BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
|
||||
/*virtual*/ BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
|
||||
/*virtual*/ void updateVisualParams();
|
||||
@@ -109,7 +109,7 @@ public:
|
||||
|
||||
private:
|
||||
// helper function. Passed in param is assumed to be in avatar's parameter list.
|
||||
BOOL setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE );
|
||||
BOOL setParamWeight(const LLViewerVisualParam *param, F32 weight, BOOL upload_bake = FALSE );
|
||||
|
||||
|
||||
|
||||
@@ -195,8 +195,8 @@ public:
|
||||
/*virtual*/ bool hasPendingBakedUploads() const;
|
||||
S32 getLocalDiscardLevel(LLAvatarAppearanceDefines::ETextureIndex type, U32 index) const;
|
||||
bool areTexturesCurrent() const;
|
||||
BOOL isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const;
|
||||
BOOL isLocalTextureDataFinal(const LLTexLayerSet* layerset) 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;
|
||||
@@ -231,13 +231,13 @@ private:
|
||||
// Baked textures
|
||||
//--------------------------------------------------------------------
|
||||
public:
|
||||
LLAvatarAppearanceDefines::ETextureIndex getBakedTE(const LLTexLayerSet* layerset ) const;
|
||||
LLAvatarAppearanceDefines::ETextureIndex getBakedTE(const LLViewerTexLayerSet* layerset ) const;
|
||||
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**);
|
||||
BOOL isUsingBakedTextures() const; // e.g. false if in appearance edit mode
|
||||
virtual bool isUsingBakedTextures() const; // e.g. false if in appearance edit mode
|
||||
protected:
|
||||
/*virtual*/ void removeMissingBakedTextures();
|
||||
|
||||
@@ -248,8 +248,8 @@ public:
|
||||
void requestLayerSetUploads();
|
||||
void requestLayerSetUpload(LLAvatarAppearanceDefines::EBakedTextureIndex i);
|
||||
void requestLayerSetUpdate(LLAvatarAppearanceDefines::ETextureIndex i);
|
||||
LLTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::ETextureIndex index) const;
|
||||
LLTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const;
|
||||
LLViewerTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index) const;
|
||||
LLViewerTexLayerSet* getLayerSet(LLAvatarAppearanceDefines::ETextureIndex index) const;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// Composites
|
||||
@@ -389,8 +389,8 @@ public:
|
||||
|
||||
BOOL isAllLocalTextureDataFinal() const;
|
||||
|
||||
const LLTexLayerSet* debugGetLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex index) const { return mBakedTextureDatas[index].mTexLayerSet; }
|
||||
const std::string debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer
|
||||
const LLViewerTexLayerSet* debugGetLayerSet(LLAvatarAppearanceDefines::EBakedTextureIndex index) const { return (LLViewerTexLayerSet*)(mBakedTextureDatas[index].mTexLayerSet); }
|
||||
const std::string debugDumpLocalTextureDataInfo(const LLViewerTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer
|
||||
const std::string debugDumpAllLocalTextureDataInfo() const; // Lists out which baked textures are at highest LOD
|
||||
private:
|
||||
LLFrameTimer mDebugSelfLoadTimer;
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "llavatarappearancedefines.h"
|
||||
#include "llwearable.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewertexlayer.h"
|
||||
|
||||
using namespace LLAvatarAppearanceDefines;
|
||||
|
||||
@@ -1037,7 +1038,7 @@ BOOL LLWearable::isOnTop() const
|
||||
|
||||
void LLWearable::createLayers(S32 te)
|
||||
{
|
||||
LLTexLayerSet *layer_set = gAgentAvatarp->getLayerSet((ETextureIndex)te);
|
||||
LLViewerTexLayerSet *layer_set = dynamic_cast<LLViewerTexLayerSet*>(gAgentAvatarp->getLayerSet((ETextureIndex)te));
|
||||
if (layer_set)
|
||||
{
|
||||
layer_set->cloneTemplates(mTEMap[te], (ETextureIndex)te, this);
|
||||
|
||||
Reference in New Issue
Block a user