Pulled LLAvatarJointMesh out of LLViewerJointMesh.
This commit is contained in:
@@ -30,7 +30,7 @@ include_directories(
|
|||||||
set(llappearance_SOURCE_FILES
|
set(llappearance_SOURCE_FILES
|
||||||
#llavatarappearance.cpp
|
#llavatarappearance.cpp
|
||||||
llavatarjoint.cpp
|
llavatarjoint.cpp
|
||||||
#llavatarjointmesh.cpp
|
llavatarjointmesh.cpp
|
||||||
#lldriverparam.cpp
|
#lldriverparam.cpp
|
||||||
#lllocaltextureobject.cpp
|
#lllocaltextureobject.cpp
|
||||||
llpolyskeletaldistortion.cpp
|
llpolyskeletaldistortion.cpp
|
||||||
@@ -52,7 +52,7 @@ set(llappearance_HEADER_FILES
|
|||||||
|
|
||||||
llavatarappearance.h
|
llavatarappearance.h
|
||||||
llavatarjoint.h
|
llavatarjoint.h
|
||||||
#llavatarjointmesh.h
|
llavatarjointmesh.h
|
||||||
#lldriverparam.h
|
#lldriverparam.h
|
||||||
lljointpickname.h
|
lljointpickname.h
|
||||||
#lllocaltextureobject.h
|
#lllocaltextureobject.h
|
||||||
|
|||||||
375
indra/llappearance/llavatarjointmesh.cpp
Normal file
375
indra/llappearance/llavatarjointmesh.cpp
Normal file
@@ -0,0 +1,375 @@
|
|||||||
|
/**
|
||||||
|
* @file LLAvatarJointMesh.cpp
|
||||||
|
* @brief Implementation of LLAvatarJointMesh class
|
||||||
|
*
|
||||||
|
* $LicenseInfo:firstyear=2001&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$
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Header Files
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
#include "linden_common.h"
|
||||||
|
#include "imageids.h"
|
||||||
|
#include "llfasttimer.h"
|
||||||
|
#include "llrender.h"
|
||||||
|
|
||||||
|
#include "llavatarjointmesh.h"
|
||||||
|
#include "llavatarappearance.h"
|
||||||
|
//#include "llapr.h"
|
||||||
|
//#include "llbox.h"
|
||||||
|
//#include "lldrawable.h"
|
||||||
|
//#include "lldrawpoolavatar.h"
|
||||||
|
//#include "lldrawpoolbump.h"
|
||||||
|
//#include "lldynamictexture.h"
|
||||||
|
//#include "llface.h"
|
||||||
|
//#include "llgldbg.h"
|
||||||
|
//#include "llglheaders.h"
|
||||||
|
#include "lltexlayer.h"
|
||||||
|
//#include "llviewercamera.h"
|
||||||
|
//#include "llviewercontrol.h"
|
||||||
|
//#include "llviewertexturelist.h"
|
||||||
|
//#include "llsky.h"
|
||||||
|
//#include "pipeline.h"
|
||||||
|
//#include "llviewershadermgr.h"
|
||||||
|
#include "llmath.h"
|
||||||
|
#include "v4math.h"
|
||||||
|
#include "m3math.h"
|
||||||
|
#include "m4math.h"
|
||||||
|
#include "llmatrix4a.h"
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::LLSkinJoint
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// LLSkinJoint
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
LLSkinJoint::LLSkinJoint()
|
||||||
|
{
|
||||||
|
mJoint = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// ~LLSkinJoint
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
LLSkinJoint::~LLSkinJoint()
|
||||||
|
{
|
||||||
|
mJoint = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// LLSkinJoint::setupSkinJoint()
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
BOOL LLSkinJoint::setupSkinJoint( LLAvatarJoint *joint)
|
||||||
|
{
|
||||||
|
// find the named joint
|
||||||
|
mJoint = joint;
|
||||||
|
if ( !mJoint )
|
||||||
|
{
|
||||||
|
llinfos << "Can't find joint" << llendl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute the inverse root skin matrix
|
||||||
|
mRootToJointSkinOffset.clearVec();
|
||||||
|
|
||||||
|
LLVector3 rootSkinOffset;
|
||||||
|
while (joint)
|
||||||
|
{
|
||||||
|
rootSkinOffset += joint->getSkinOffset();
|
||||||
|
joint = (LLAvatarJoint*)joint->getParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
mRootToJointSkinOffset = -rootSkinOffset;
|
||||||
|
mRootToParentJointSkinOffset = mRootToJointSkinOffset;
|
||||||
|
mRootToParentJointSkinOffset += mJoint->getSkinOffset();
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
BOOL LLAvatarJointMesh::sPipelineRender = FALSE;
|
||||||
|
EAvatarRenderPass LLAvatarJointMesh::sRenderPass = AVATAR_RENDER_PASS_SINGLE;
|
||||||
|
U32 LLAvatarJointMesh::sClothingMaskImageName = 0;
|
||||||
|
LLColor4 LLAvatarJointMesh::sClothingInnerColor;
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh()
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
LLAvatarJointMesh::LLAvatarJointMesh()
|
||||||
|
:
|
||||||
|
mTexture( NULL ),
|
||||||
|
mLayerSet( NULL ),
|
||||||
|
mTestImageName( 0 ),
|
||||||
|
mFaceIndexCount(0)
|
||||||
|
{
|
||||||
|
|
||||||
|
mColor[0] = 1.0f;
|
||||||
|
mColor[1] = 1.0f;
|
||||||
|
mColor[2] = 1.0f;
|
||||||
|
mColor[3] = 1.0f;
|
||||||
|
mShiny = 0.0f;
|
||||||
|
mCullBackFaces = TRUE;
|
||||||
|
|
||||||
|
mMesh = NULL;
|
||||||
|
|
||||||
|
mNumSkinJoints = 0;
|
||||||
|
mSkinJoints = NULL;
|
||||||
|
|
||||||
|
mFace = NULL;
|
||||||
|
|
||||||
|
mMeshID = 0;
|
||||||
|
mUpdateXform = FALSE;
|
||||||
|
|
||||||
|
mValid = FALSE;
|
||||||
|
|
||||||
|
mIsTransparent = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// ~LLAvatarJointMesh()
|
||||||
|
// Class Destructor
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
LLAvatarJointMesh::~LLAvatarJointMesh()
|
||||||
|
{
|
||||||
|
mMesh = NULL;
|
||||||
|
mTexture = NULL;
|
||||||
|
freeSkinData();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::allocateSkinData()
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
BOOL LLAvatarJointMesh::allocateSkinData( U32 numSkinJoints )
|
||||||
|
{
|
||||||
|
mSkinJoints = new LLSkinJoint[ numSkinJoints ];
|
||||||
|
mNumSkinJoints = numSkinJoints;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::freeSkinData()
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void LLAvatarJointMesh::freeSkinData()
|
||||||
|
{
|
||||||
|
mNumSkinJoints = 0;
|
||||||
|
delete [] mSkinJoints;
|
||||||
|
mSkinJoints = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::getColor()
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void LLAvatarJointMesh::getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha )
|
||||||
|
{
|
||||||
|
*red = mColor[0];
|
||||||
|
*green = mColor[1];
|
||||||
|
*blue = mColor[2];
|
||||||
|
*alpha = mColor[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::setColor()
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void LLAvatarJointMesh::setColor( F32 red, F32 green, F32 blue, F32 alpha )
|
||||||
|
{
|
||||||
|
mColor[0] = red;
|
||||||
|
mColor[1] = green;
|
||||||
|
mColor[2] = blue;
|
||||||
|
mColor[3] = alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LLAvatarJointMesh::setColor( const LLColor4& color )
|
||||||
|
{
|
||||||
|
mColor = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::getTexture()
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
//LLViewerTexture *LLAvatarJointMesh::getTexture()
|
||||||
|
//{
|
||||||
|
// return mTexture;
|
||||||
|
//}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::setTexture()
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void LLAvatarJointMesh::setTexture( LLGLTexture *texture )
|
||||||
|
{
|
||||||
|
mTexture = texture;
|
||||||
|
|
||||||
|
// texture and dynamic_texture are mutually exclusive
|
||||||
|
if( texture )
|
||||||
|
{
|
||||||
|
mLayerSet = NULL;
|
||||||
|
//texture->bindTexture(0);
|
||||||
|
//texture->setClamp(TRUE, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BOOL LLAvatarJointMesh::hasGLTexture() const
|
||||||
|
{
|
||||||
|
return mTexture.notNull() && mTexture->hasGLTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::setLayerSet()
|
||||||
|
// Sets the shape texture (takes precedence over normal texture)
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void LLAvatarJointMesh::setLayerSet( LLTexLayerSet* layer_set )
|
||||||
|
{
|
||||||
|
mLayerSet = layer_set;
|
||||||
|
|
||||||
|
// texture and dynamic_texture are mutually exclusive
|
||||||
|
if( layer_set )
|
||||||
|
{
|
||||||
|
mTexture = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*BOOL LLAvatarJointMesh::hasComposite() const
|
||||||
|
{
|
||||||
|
return (mLayerSet && mLayerSet->hasComposite());
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::getMesh()
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
LLPolyMesh *LLAvatarJointMesh::getMesh()
|
||||||
|
{
|
||||||
|
return mMesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// LLAvatarJointMesh::setMesh()
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void LLAvatarJointMesh::setMesh( LLPolyMesh *mesh )
|
||||||
|
{
|
||||||
|
// set the mesh pointer
|
||||||
|
mMesh = mesh;
|
||||||
|
|
||||||
|
// release any existing skin joints
|
||||||
|
freeSkinData();
|
||||||
|
|
||||||
|
if ( mMesh == NULL )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// acquire the transform from the mesh object
|
||||||
|
setPosition( mMesh->getPosition() );
|
||||||
|
setRotation( mMesh->getRotation() );
|
||||||
|
setScale( mMesh->getScale() );
|
||||||
|
|
||||||
|
// create skin joints if necessary
|
||||||
|
if ( mMesh->hasWeights() && !mMesh->isLOD())
|
||||||
|
{
|
||||||
|
U32 numJointNames = mMesh->getNumJointNames();
|
||||||
|
|
||||||
|
allocateSkinData( numJointNames );
|
||||||
|
std::string *jointNames = mMesh->getJointNames();
|
||||||
|
|
||||||
|
U32 jn;
|
||||||
|
for (jn = 0; jn < numJointNames; jn++)
|
||||||
|
{
|
||||||
|
//llinfos << "Setting up joint " << jointNames[jn] << llendl;
|
||||||
|
LLAvatarJoint* joint = (LLAvatarJoint*)(getRoot()->findJoint(jointNames[jn]) );
|
||||||
|
mSkinJoints[jn].setupSkinJoint( joint );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup joint array
|
||||||
|
if (!mMesh->isLOD())
|
||||||
|
{
|
||||||
|
setupJoint((LLAvatarJoint*)getRoot());
|
||||||
|
}
|
||||||
|
|
||||||
|
// llinfos << "joint render entries: " << mMesh->mJointRenderData.count() << llendl;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// setupJoint()
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void LLAvatarJointMesh::setupJoint(LLAvatarJoint* current_joint)
|
||||||
|
{
|
||||||
|
// llinfos << "Mesh: " << getName() << llendl;
|
||||||
|
|
||||||
|
// S32 joint_count = 0;
|
||||||
|
U32 sj;
|
||||||
|
for (sj=0; sj<mNumSkinJoints; sj++)
|
||||||
|
{
|
||||||
|
LLSkinJoint &js = mSkinJoints[sj];
|
||||||
|
|
||||||
|
if (js.mJoint != current_joint)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we've found a skinjoint for this joint..
|
||||||
|
|
||||||
|
// is the last joint in the array our parent?
|
||||||
|
if(mMesh->mJointRenderData.count() && mMesh->mJointRenderData[mMesh->mJointRenderData.count() - 1]->mWorldMatrix == ¤t_joint->getParent()->getWorldMatrix())
|
||||||
|
{
|
||||||
|
// ...then just add ourselves
|
||||||
|
LLAvatarJoint* jointp = js.mJoint;
|
||||||
|
mMesh->mJointRenderData.put(new LLJointRenderData(&jointp->getWorldMatrix(), &js));
|
||||||
|
// llinfos << "joint " << joint_count << js.mJoint->getName() << llendl;
|
||||||
|
// joint_count++;
|
||||||
|
}
|
||||||
|
// otherwise add our parent and ourselves
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mMesh->mJointRenderData.put(new LLJointRenderData(¤t_joint->getParent()->getWorldMatrix(), NULL));
|
||||||
|
// llinfos << "joint " << joint_count << current_joint->getParent()->getName() << llendl;
|
||||||
|
// joint_count++;
|
||||||
|
mMesh->mJointRenderData.put(new LLJointRenderData(¤t_joint->getWorldMatrix(), &js));
|
||||||
|
// llinfos << "joint " << joint_count << current_joint->getName() << llendl;
|
||||||
|
// joint_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// depth-first traversal
|
||||||
|
for (LLJoint::child_list_t::iterator iter = current_joint->mChildren.begin();
|
||||||
|
iter != current_joint->mChildren.end(); ++iter)
|
||||||
|
{
|
||||||
|
LLAvatarJoint* child_joint = (LLAvatarJoint*)(*iter);
|
||||||
|
setupJoint(child_joint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// End
|
||||||
142
indra/llappearance/llavatarjointmesh.h
Normal file
142
indra/llappearance/llavatarjointmesh.h
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
/**
|
||||||
|
* @file llavatarjointmesh.h
|
||||||
|
* @brief Declaration of LLAvatarJointMesh class
|
||||||
|
*
|
||||||
|
* $LicenseInfo:firstyear=2001&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_LLAVATARJOINTMESH_H
|
||||||
|
#define LL_LLAVATARJOINTMESH_H
|
||||||
|
|
||||||
|
#include "llavatarjoint.h"
|
||||||
|
#include "llgltexture.h"
|
||||||
|
#include "llpolymesh.h"
|
||||||
|
#include "v4color.h"
|
||||||
|
|
||||||
|
class LLDrawable;
|
||||||
|
class LLFace;
|
||||||
|
class LLCharacter;
|
||||||
|
class LLTexLayerSet;
|
||||||
|
|
||||||
|
typedef enum e_avatar_render_pass
|
||||||
|
{
|
||||||
|
AVATAR_RENDER_PASS_SINGLE,
|
||||||
|
AVATAR_RENDER_PASS_CLOTHING_INNER,
|
||||||
|
AVATAR_RENDER_PASS_CLOTHING_OUTER
|
||||||
|
} EAvatarRenderPass;
|
||||||
|
|
||||||
|
class LLSkinJoint
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LLSkinJoint();
|
||||||
|
~LLSkinJoint();
|
||||||
|
BOOL setupSkinJoint( LLAvatarJoint *joint);
|
||||||
|
|
||||||
|
LLAvatarJoint *mJoint;
|
||||||
|
LLVector3 mRootToJointSkinOffset;
|
||||||
|
LLVector3 mRootToParentJointSkinOffset;
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// class LLViewerJointMesh
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
class LLAvatarJointMesh : public virtual LLAvatarJoint
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
LLColor4 mColor; // color value
|
||||||
|
// LLColor4 mSpecular; // specular color (always white for now)
|
||||||
|
F32 mShiny; // shiny value
|
||||||
|
LLPointer<LLGLTexture> mTexture; // ptr to a global texture
|
||||||
|
LLTexLayerSet* mLayerSet; // ptr to a layer set owned by the avatar
|
||||||
|
U32 mTestImageName; // handle to a temporary texture for previewing uploads
|
||||||
|
LLPolyMesh* mMesh; // ptr to a global polymesh
|
||||||
|
BOOL mCullBackFaces; // true by default
|
||||||
|
LLFace* mFace; // ptr to a face w/ AGP copy of mesh
|
||||||
|
|
||||||
|
U32 mFaceIndexCount;
|
||||||
|
|
||||||
|
U32 mNumSkinJoints;
|
||||||
|
LLSkinJoint* mSkinJoints;
|
||||||
|
S32 mMeshID;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static BOOL sPipelineRender;
|
||||||
|
//RN: this is here for testing purposes
|
||||||
|
static U32 sClothingMaskImageName;
|
||||||
|
static EAvatarRenderPass sRenderPass;
|
||||||
|
static LLColor4 sClothingInnerColor;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Constructor
|
||||||
|
LLAvatarJointMesh();
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
virtual ~LLAvatarJointMesh();
|
||||||
|
|
||||||
|
// Gets the shape color
|
||||||
|
void getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha );
|
||||||
|
|
||||||
|
// Sets the shape color
|
||||||
|
void setColor( F32 red, F32 green, F32 blue, F32 alpha );
|
||||||
|
void setColor( const LLColor4& color );
|
||||||
|
|
||||||
|
// Sets the shininess
|
||||||
|
void setSpecular( const LLColor4& color, F32 shiny ) { /*mSpecular = color;*/ mShiny = shiny; };
|
||||||
|
|
||||||
|
// Sets the shape texture
|
||||||
|
void setTexture( LLGLTexture *texture );
|
||||||
|
|
||||||
|
BOOL hasGLTexture() const;
|
||||||
|
|
||||||
|
void setTestTexture( U32 name ) { mTestImageName = name; }
|
||||||
|
|
||||||
|
// Sets layer set responsible for a dynamic shape texture (takes precedence over normal texture)
|
||||||
|
void setLayerSet( LLTexLayerSet* layer_set );
|
||||||
|
|
||||||
|
virtual BOOL hasComposite() const = 0;
|
||||||
|
|
||||||
|
// Gets the poly mesh
|
||||||
|
LLPolyMesh *getMesh();
|
||||||
|
|
||||||
|
// Sets the poly mesh
|
||||||
|
void setMesh( LLPolyMesh *mesh );
|
||||||
|
|
||||||
|
// Sets up joint matrix data for rendering
|
||||||
|
void setupJoint(LLAvatarJoint* current_joint);
|
||||||
|
|
||||||
|
// Sets ID for picking
|
||||||
|
void setMeshID( S32 id ) {mMeshID = id;}
|
||||||
|
|
||||||
|
// Gets ID for picking
|
||||||
|
S32 getMeshID() { return mMeshID; }
|
||||||
|
|
||||||
|
void setIsTransparent(BOOL is_transparent) { mIsTransparent = is_transparent; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Allocate skin data
|
||||||
|
BOOL allocateSkinData( U32 numSkinJoints );
|
||||||
|
|
||||||
|
// Free skin data
|
||||||
|
void freeSkinData();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // LL_LLAVATARJOINTMESH_H
|
||||||
@@ -67,101 +67,20 @@ static const U32 sRenderMask = LLVertexBuffer::MAP_VERTEX |
|
|||||||
LLVertexBuffer::MAP_NORMAL |
|
LLVertexBuffer::MAP_NORMAL |
|
||||||
LLVertexBuffer::MAP_TEXCOORD0;
|
LLVertexBuffer::MAP_TEXCOORD0;
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::LLSkinJoint
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// LLSkinJoint
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
LLSkinJoint::LLSkinJoint()
|
|
||||||
{
|
|
||||||
mJoint = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// ~LLSkinJoint
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
LLSkinJoint::~LLSkinJoint()
|
|
||||||
{
|
|
||||||
mJoint = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// LLSkinJoint::setupSkinJoint()
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
BOOL LLSkinJoint::setupSkinJoint( LLViewerJoint *joint)
|
|
||||||
{
|
|
||||||
// find the named joint
|
|
||||||
mJoint = joint;
|
|
||||||
if ( !mJoint )
|
|
||||||
{
|
|
||||||
llinfos << "Can't find joint" << llendl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// compute the inverse root skin matrix
|
|
||||||
mRootToJointSkinOffset.clearVec();
|
|
||||||
|
|
||||||
LLVector3 rootSkinOffset;
|
|
||||||
while (joint)
|
|
||||||
{
|
|
||||||
rootSkinOffset += joint->getSkinOffset();
|
|
||||||
joint = dynamic_cast<LLViewerJoint*>(joint->getParent());
|
|
||||||
}
|
|
||||||
|
|
||||||
mRootToJointSkinOffset = -rootSkinOffset;
|
|
||||||
mRootToParentJointSkinOffset = mRootToJointSkinOffset;
|
|
||||||
mRootToParentJointSkinOffset += mJoint->getSkinOffset();
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// LLViewerJointMesh
|
// LLViewerJointMesh
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
BOOL LLViewerJointMesh::sPipelineRender = FALSE;
|
|
||||||
EAvatarRenderPass LLViewerJointMesh::sRenderPass = AVATAR_RENDER_PASS_SINGLE;
|
|
||||||
U32 LLViewerJointMesh::sClothingMaskImageName = 0;
|
|
||||||
LLColor4 LLViewerJointMesh::sClothingInnerColor;
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// LLViewerJointMesh()
|
// LLViewerJointMesh()
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
LLViewerJointMesh::LLViewerJointMesh()
|
LLViewerJointMesh::LLViewerJointMesh()
|
||||||
:
|
:
|
||||||
mTexture( NULL ),
|
LLAvatarJointMesh()
|
||||||
mLayerSet( NULL ),
|
|
||||||
mTestImageName( 0 ),
|
|
||||||
mFaceIndexCount(0),
|
|
||||||
mIsTransparent(FALSE)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
mColor[0] = 1.0f;
|
|
||||||
mColor[1] = 1.0f;
|
|
||||||
mColor[2] = 1.0f;
|
|
||||||
mColor[3] = 1.0f;
|
|
||||||
mShiny = 0.0f;
|
|
||||||
mCullBackFaces = TRUE;
|
|
||||||
|
|
||||||
mMesh = NULL;
|
|
||||||
|
|
||||||
mNumSkinJoints = 0;
|
|
||||||
mSkinJoints = NULL;
|
|
||||||
|
|
||||||
mFace = NULL;
|
|
||||||
|
|
||||||
mMeshID = 0;
|
|
||||||
mUpdateXform = FALSE;
|
|
||||||
|
|
||||||
mValid = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -171,199 +90,6 @@ LLViewerJointMesh::LLViewerJointMesh()
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
LLViewerJointMesh::~LLViewerJointMesh()
|
LLViewerJointMesh::~LLViewerJointMesh()
|
||||||
{
|
{
|
||||||
mMesh = NULL;
|
|
||||||
mTexture = NULL;
|
|
||||||
freeSkinData();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::allocateSkinData()
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
BOOL LLViewerJointMesh::allocateSkinData( U32 numSkinJoints )
|
|
||||||
{
|
|
||||||
mSkinJoints = new LLSkinJoint[ numSkinJoints ];
|
|
||||||
mNumSkinJoints = numSkinJoints;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::freeSkinData()
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
void LLViewerJointMesh::freeSkinData()
|
|
||||||
{
|
|
||||||
mNumSkinJoints = 0;
|
|
||||||
delete [] mSkinJoints;
|
|
||||||
mSkinJoints = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::getColor()
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
void LLViewerJointMesh::getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha )
|
|
||||||
{
|
|
||||||
*red = mColor[0];
|
|
||||||
*green = mColor[1];
|
|
||||||
*blue = mColor[2];
|
|
||||||
*alpha = mColor[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::setColor()
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
void LLViewerJointMesh::setColor( F32 red, F32 green, F32 blue, F32 alpha )
|
|
||||||
{
|
|
||||||
mColor[0] = red;
|
|
||||||
mColor[1] = green;
|
|
||||||
mColor[2] = blue;
|
|
||||||
mColor[3] = alpha;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::getTexture()
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
//LLViewerTexture *LLViewerJointMesh::getTexture()
|
|
||||||
//{
|
|
||||||
// return mTexture;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::setTexture()
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
void LLViewerJointMesh::setTexture( LLViewerTexture *texture )
|
|
||||||
{
|
|
||||||
mTexture = texture;
|
|
||||||
|
|
||||||
// texture and dynamic_texture are mutually exclusive
|
|
||||||
if( texture )
|
|
||||||
{
|
|
||||||
mLayerSet = NULL;
|
|
||||||
//texture->bindTexture(0);
|
|
||||||
//texture->setClamp(TRUE, TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::setLayerSet()
|
|
||||||
// Sets the shape texture (takes precedence over normal texture)
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
void LLViewerJointMesh::setLayerSet( LLTexLayerSet* layer_set )
|
|
||||||
{
|
|
||||||
mLayerSet = layer_set;
|
|
||||||
|
|
||||||
// texture and dynamic_texture are mutually exclusive
|
|
||||||
if( layer_set )
|
|
||||||
{
|
|
||||||
mTexture = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::getMesh()
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
LLPolyMesh *LLViewerJointMesh::getMesh()
|
|
||||||
{
|
|
||||||
return mMesh;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::setMesh()
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
void LLViewerJointMesh::setMesh( LLPolyMesh *mesh )
|
|
||||||
{
|
|
||||||
// set the mesh pointer
|
|
||||||
mMesh = mesh;
|
|
||||||
|
|
||||||
// release any existing skin joints
|
|
||||||
freeSkinData();
|
|
||||||
|
|
||||||
if ( mMesh == NULL )
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// acquire the transform from the mesh object
|
|
||||||
setPosition( mMesh->getPosition() );
|
|
||||||
setRotation( mMesh->getRotation() );
|
|
||||||
setScale( mMesh->getScale() );
|
|
||||||
|
|
||||||
// create skin joints if necessary
|
|
||||||
if ( mMesh->hasWeights() && !mMesh->isLOD())
|
|
||||||
{
|
|
||||||
U32 numJointNames = mMesh->getNumJointNames();
|
|
||||||
|
|
||||||
allocateSkinData( numJointNames );
|
|
||||||
std::string *jointNames = mMesh->getJointNames();
|
|
||||||
|
|
||||||
U32 jn;
|
|
||||||
for (jn = 0; jn < numJointNames; jn++)
|
|
||||||
{
|
|
||||||
//llinfos << "Setting up joint " << jointNames[jn] << llendl;
|
|
||||||
LLViewerJoint* joint = dynamic_cast<LLViewerJoint*>(getRoot()->findJoint(jointNames[jn]) );
|
|
||||||
mSkinJoints[jn].setupSkinJoint( joint );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// setup joint array
|
|
||||||
if (!mMesh->isLOD())
|
|
||||||
{
|
|
||||||
setupJoint(dynamic_cast<LLViewerJoint*>(getRoot()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// llinfos << "joint render entries: " << mMesh->mJointRenderData.count() << llendl;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// setupJoint()
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
void LLViewerJointMesh::setupJoint(LLViewerJoint* current_joint)
|
|
||||||
{
|
|
||||||
// llinfos << "Mesh: " << getName() << llendl;
|
|
||||||
|
|
||||||
// S32 joint_count = 0;
|
|
||||||
U32 sj;
|
|
||||||
for (sj=0; sj<mNumSkinJoints; sj++)
|
|
||||||
{
|
|
||||||
LLSkinJoint &js = mSkinJoints[sj];
|
|
||||||
|
|
||||||
if (js.mJoint != current_joint)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// we've found a skinjoint for this joint..
|
|
||||||
|
|
||||||
// is the last joint in the array our parent?
|
|
||||||
if(mMesh->mJointRenderData.count() && mMesh->mJointRenderData[mMesh->mJointRenderData.count() - 1]->mWorldMatrix == ¤t_joint->getParent()->getWorldMatrix())
|
|
||||||
{
|
|
||||||
// ...then just add ourselves
|
|
||||||
LLViewerJoint* jointp = js.mJoint;
|
|
||||||
mMesh->mJointRenderData.put(new LLJointRenderData(&jointp->getWorldMatrix(), &js));
|
|
||||||
// llinfos << "joint " << joint_count << js.mJoint->getName() << llendl;
|
|
||||||
// joint_count++;
|
|
||||||
}
|
|
||||||
// otherwise add our parent and ourselves
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mMesh->mJointRenderData.put(new LLJointRenderData(¤t_joint->getParent()->getWorldMatrix(), NULL));
|
|
||||||
// llinfos << "joint " << joint_count << current_joint->getParent()->getName() << llendl;
|
|
||||||
// joint_count++;
|
|
||||||
mMesh->mJointRenderData.put(new LLJointRenderData(¤t_joint->getWorldMatrix(), &js));
|
|
||||||
// llinfos << "joint " << joint_count << current_joint->getName() << llendl;
|
|
||||||
// joint_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// depth-first traversal
|
|
||||||
for (LLJoint::child_list_t::iterator iter = current_joint->mChildren.begin();
|
|
||||||
iter != current_joint->mChildren.end(); ++iter)
|
|
||||||
{
|
|
||||||
LLViewerJoint* child_joint = dynamic_cast<LLViewerJoint*>(*iter);
|
|
||||||
setupJoint(child_joint);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const S32 NUM_AXES = 3;
|
const S32 NUM_AXES = 3;
|
||||||
@@ -474,21 +200,6 @@ void LLViewerJointMesh::uploadJointMatrices()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::drawBone()
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
void LLViewerJointMesh::drawBone()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
// LLViewerJointMesh::isTransparent()
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
BOOL LLViewerJointMesh::isTransparent()
|
|
||||||
{
|
|
||||||
return mIsTransparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// DrawElementsBLEND and utility code
|
// DrawElementsBLEND and utility code
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
@@ -544,6 +255,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
|
|||||||
llassert( !(mTexture.notNull() && mLayerSet) ); // mutually exclusive
|
llassert( !(mTexture.notNull() && mLayerSet) ); // mutually exclusive
|
||||||
|
|
||||||
LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP;
|
LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP;
|
||||||
|
LLTexLayerSet *layerset = mLayerSet;
|
||||||
if (mTestImageName)
|
if (mTestImageName)
|
||||||
{
|
{
|
||||||
gGL.getTexUnit(diffuse_channel)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
|
gGL.getTexUnit(diffuse_channel)->bindManual(LLTexUnit::TT_TEXTURE, mTestImageName);
|
||||||
@@ -558,11 +270,11 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
|
|||||||
gGL.getTexUnit(diffuse_channel)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
|
gGL.getTexUnit(diffuse_channel)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( !is_dummy && mLayerSet )
|
else if( !is_dummy && layerset )
|
||||||
{
|
{
|
||||||
if( mLayerSet->hasComposite() )
|
if( layerset->hasComposite() )
|
||||||
{
|
{
|
||||||
gGL.getTexUnit(diffuse_channel)->bind(mLayerSet->getComposite());
|
gGL.getTexUnit(diffuse_channel)->bind(layerset->getComposite());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -851,4 +563,9 @@ void LLViewerJointMesh::dump()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL LLViewerJointMesh::hasComposite() const
|
||||||
|
{
|
||||||
|
return (mLayerSet && mLayerSet->hasComposite());
|
||||||
|
}
|
||||||
|
|
||||||
// End
|
// End
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include "llviewerjoint.h"
|
#include "llviewerjoint.h"
|
||||||
#include "llviewertexture.h"
|
#include "llviewertexture.h"
|
||||||
|
#include "llavatarjointmesh.h"
|
||||||
#include "llpolymesh.h"
|
#include "llpolymesh.h"
|
||||||
#include "v4color.h"
|
#include "v4color.h"
|
||||||
|
|
||||||
@@ -37,56 +38,11 @@ class LLFace;
|
|||||||
class LLCharacter;
|
class LLCharacter;
|
||||||
class LLTexLayerSet;
|
class LLTexLayerSet;
|
||||||
|
|
||||||
typedef enum e_avatar_render_pass
|
|
||||||
{
|
|
||||||
AVATAR_RENDER_PASS_SINGLE,
|
|
||||||
AVATAR_RENDER_PASS_CLOTHING_INNER,
|
|
||||||
AVATAR_RENDER_PASS_CLOTHING_OUTER
|
|
||||||
} EAvatarRenderPass;
|
|
||||||
|
|
||||||
class LLSkinJoint
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
LLSkinJoint();
|
|
||||||
~LLSkinJoint();
|
|
||||||
BOOL setupSkinJoint( LLViewerJoint *joint);
|
|
||||||
|
|
||||||
LLViewerJoint *mJoint;
|
|
||||||
LLVector3 mRootToJointSkinOffset;
|
|
||||||
LLVector3 mRootToParentJointSkinOffset;
|
|
||||||
};
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// class LLViewerJointMesh
|
// class LLViewerJointMesh
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
class LLViewerJointMesh : public LLViewerJoint
|
class LLViewerJointMesh : public LLAvatarJointMesh, public LLViewerJoint
|
||||||
{
|
{
|
||||||
friend class LLVOAvatar;
|
|
||||||
protected:
|
|
||||||
LLColor4 mColor; // color value
|
|
||||||
// LLColor4 mSpecular; // specular color (always white for now)
|
|
||||||
F32 mShiny; // shiny value
|
|
||||||
LLPointer<LLViewerTexture> mTexture; // ptr to a global texture
|
|
||||||
LLTexLayerSet* mLayerSet; // ptr to a layer set owned by the avatar
|
|
||||||
U32 mTestImageName; // handle to a temporary texture for previewing uploads
|
|
||||||
LLPolyMesh* mMesh; // ptr to a global polymesh
|
|
||||||
BOOL mCullBackFaces; // true by default
|
|
||||||
LLFace* mFace; // ptr to a face w/ AGP copy of mesh
|
|
||||||
|
|
||||||
U32 mFaceIndexCount;
|
|
||||||
BOOL mIsTransparent;
|
|
||||||
|
|
||||||
U32 mNumSkinJoints;
|
|
||||||
LLSkinJoint* mSkinJoints;
|
|
||||||
S32 mMeshID;
|
|
||||||
|
|
||||||
public:
|
|
||||||
static BOOL sPipelineRender;
|
|
||||||
//RN: this is here for testing purposes
|
|
||||||
static U32 sClothingMaskImageName;
|
|
||||||
static EAvatarRenderPass sRenderPass;
|
|
||||||
static LLColor4 sClothingInnerColor;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Constructor
|
// Constructor
|
||||||
LLViewerJointMesh();
|
LLViewerJointMesh();
|
||||||
@@ -94,67 +50,30 @@ public:
|
|||||||
// Destructor
|
// Destructor
|
||||||
virtual ~LLViewerJointMesh();
|
virtual ~LLViewerJointMesh();
|
||||||
|
|
||||||
// Gets the shape color
|
|
||||||
void getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha );
|
|
||||||
|
|
||||||
// Sets the shape color
|
|
||||||
void setColor( F32 red, F32 green, F32 blue, F32 alpha );
|
|
||||||
|
|
||||||
// Sets the shininess
|
|
||||||
void setSpecular( const LLColor4& color, F32 shiny ) { /*mSpecular = color;*/ mShiny = shiny; };
|
|
||||||
|
|
||||||
// Sets the shape texture
|
|
||||||
void setTexture( LLViewerTexture *texture );
|
|
||||||
|
|
||||||
void setTestTexture( U32 name ) { mTestImageName = name; }
|
|
||||||
|
|
||||||
// Sets layer set responsible for a dynamic shape texture (takes precedence over normal texture)
|
|
||||||
void setLayerSet( LLTexLayerSet* layer_set );
|
|
||||||
|
|
||||||
// Gets the poly mesh
|
|
||||||
LLPolyMesh *getMesh();
|
|
||||||
|
|
||||||
// Sets the poly mesh
|
|
||||||
void setMesh( LLPolyMesh *mesh );
|
|
||||||
|
|
||||||
// Sets up joint matrix data for rendering
|
|
||||||
void setupJoint(LLViewerJoint* current_joint);
|
|
||||||
|
|
||||||
// Render time method to upload batches of joint matrices
|
// Render time method to upload batches of joint matrices
|
||||||
void uploadJointMatrices();
|
void uploadJointMatrices();
|
||||||
|
|
||||||
// Sets ID for picking
|
|
||||||
void setMeshID( S32 id ) {mMeshID = id;}
|
|
||||||
|
|
||||||
// Gets ID for picking
|
|
||||||
S32 getMeshID() { return mMeshID; }
|
|
||||||
|
|
||||||
// overloaded from base class
|
// overloaded from base class
|
||||||
/*virtual*/ void drawBone();
|
|
||||||
/*virtual*/ BOOL isTransparent();
|
|
||||||
/*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy );
|
/*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy );
|
||||||
|
|
||||||
|
// necessary because MS's compiler warns on function inheritance via dominance in the diamond inheritance here.
|
||||||
|
// warns even though LLViewerJoint holds the only non virtual implementation.
|
||||||
|
/*virtual*/ U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ) { return LLViewerJoint::render(pixelArea,first_pass,is_dummy);}
|
||||||
|
|
||||||
/*virtual*/ void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area);
|
/*virtual*/ void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area);
|
||||||
/*virtual*/ void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE, bool terse_update = false);
|
/*virtual*/ void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE, bool terse_update = false);
|
||||||
/*virtual*/ BOOL updateLOD(F32 pixel_area, BOOL activate);
|
/*virtual*/ BOOL updateLOD(F32 pixel_area, BOOL activate);
|
||||||
/*virtual*/ void updateJointGeometry();
|
/*virtual*/ void updateJointGeometry();
|
||||||
/*virtual*/ void dump();
|
/*virtual*/ void dump();
|
||||||
|
|
||||||
void setIsTransparent(BOOL is_transparent) { mIsTransparent = is_transparent; }
|
|
||||||
|
|
||||||
/*virtual*/ BOOL isAnimatable() const { return FALSE; }
|
/*virtual*/ BOOL isAnimatable() const { return FALSE; }
|
||||||
|
|
||||||
|
/*virtual*/ BOOL hasComposite() const; //TO-DO: remove when texlayer is migrated to llappearance
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
//copy mesh into given face's vertex buffer, applying current animation pose
|
//copy mesh into given face's vertex buffer, applying current animation pose
|
||||||
static void updateGeometry(LLFace* face, LLPolyMesh* mesh);
|
static void updateGeometry(LLFace* face, LLPolyMesh* mesh);
|
||||||
|
|
||||||
private:
|
|
||||||
// Allocate skin data
|
|
||||||
BOOL allocateSkinData( U32 numSkinJoints );
|
|
||||||
|
|
||||||
// Free skin data
|
|
||||||
void freeSkinData();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // LL_LLVIEWERJOINTMESH_H
|
#endif // LL_LLVIEWERJOINTMESH_H
|
||||||
|
|||||||
@@ -1280,11 +1280,11 @@ BOOL LLVOAvatar::isFullyTextured() const
|
|||||||
{
|
{
|
||||||
continue; // nonexistent mesh OK
|
continue; // nonexistent mesh OK
|
||||||
}
|
}
|
||||||
if (mesh->mTexture.notNull() && mesh->mTexture->hasGLTexture())
|
if (mesh->hasGLTexture())
|
||||||
{
|
{
|
||||||
continue; // Mesh exists and has a baked texture.
|
continue; // Mesh exists and has a baked texture.
|
||||||
}
|
}
|
||||||
if (mesh->mLayerSet && mesh->mLayerSet->hasComposite())
|
if (mesh->hasComposite())
|
||||||
{
|
{
|
||||||
continue; // Mesh exists and has a composite texture.
|
continue; // Mesh exists and has a composite texture.
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user