SL-915, MAINT-8554 - cleanup/reorg, added encroachment fix info to DebugAnimatedObjects output
parent
abcddc97cf
commit
edf6795eda
|
|
@ -1293,7 +1293,7 @@ namespace LLError
|
|||
|
||||
#if LL_WINDOWS
|
||||
// VC80 was optimizing the error away.
|
||||
// #pragma optimize("", off)
|
||||
#pragma optimize("", off)
|
||||
#endif
|
||||
void crashAndLoop(const std::string& message)
|
||||
{
|
||||
|
|
@ -1311,7 +1311,7 @@ namespace LLError
|
|||
exit(EXIT_FAILURE);
|
||||
}
|
||||
#if LL_WINDOWS
|
||||
// #pragma optimize("", on)
|
||||
#pragma optimize("", on)
|
||||
#endif
|
||||
|
||||
std::string utcTime()
|
||||
|
|
|
|||
|
|
@ -27,10 +27,6 @@
|
|||
#include "llmath.h"
|
||||
#include "llrigginginfo.h"
|
||||
|
||||
//#if LL_WINDOWS
|
||||
//#pragma optimize("", off)
|
||||
//#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// LLJointRiggingInfo
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -6411,101 +6411,6 @@ void LLVolumeFace::fillFromLegacyData(std::vector<LLVolumeFace::VertexData>& v,
|
|||
}
|
||||
}
|
||||
|
||||
// AXON appendFace/appendFaces not used - referenced by corresponding functions in
|
||||
// LLModel but these are not called anywhere.
|
||||
void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMatrix4& norm_mat_in)
|
||||
{
|
||||
U16 offset = mNumVertices;
|
||||
|
||||
S32 new_count = face.mNumVertices + mNumVertices;
|
||||
|
||||
if (new_count > 65536)
|
||||
{
|
||||
LL_ERRS() << "Cannot append face -- 16-bit overflow will occur." << LL_ENDL;
|
||||
}
|
||||
|
||||
if (face.mNumVertices == 0)
|
||||
{
|
||||
LL_ERRS() << "Cannot append empty face." << LL_ENDL;
|
||||
}
|
||||
|
||||
U32 old_vsize = mNumVertices*16;
|
||||
U32 new_vsize = new_count * 16;
|
||||
U32 old_tcsize = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF;
|
||||
U32 new_tcsize = (new_count*sizeof(LLVector2)+0xF) & ~0xF;
|
||||
U32 new_size = new_vsize * 2 + new_tcsize;
|
||||
|
||||
//allocate new buffer space
|
||||
LLVector4a* old_buf = mPositions;
|
||||
mPositions = (LLVector4a*) ll_aligned_malloc<64>(new_size);
|
||||
mNormals = mPositions + new_count;
|
||||
mTexCoords = (LLVector2*) (mNormals+new_count);
|
||||
|
||||
mNumAllocatedVertices = new_count;
|
||||
|
||||
LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) old_buf, old_vsize);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) (old_buf+mNumVertices), old_vsize);
|
||||
LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) (old_buf+mNumVertices*2), old_tcsize);
|
||||
|
||||
mNumVertices = new_count;
|
||||
|
||||
//get destination address of appended face
|
||||
LLVector4a* dst_pos = mPositions+offset;
|
||||
LLVector2* dst_tc = mTexCoords+offset;
|
||||
LLVector4a* dst_norm = mNormals+offset;
|
||||
|
||||
//get source addresses of appended face
|
||||
const LLVector4a* src_pos = face.mPositions;
|
||||
const LLVector2* src_tc = face.mTexCoords;
|
||||
const LLVector4a* src_norm = face.mNormals;
|
||||
|
||||
//load aligned matrices
|
||||
LLMatrix4a mat, norm_mat;
|
||||
mat.loadu(mat_in);
|
||||
norm_mat.loadu(norm_mat_in);
|
||||
|
||||
for (U32 i = 0; i < face.mNumVertices; ++i)
|
||||
{
|
||||
//transform appended face position and store
|
||||
mat.affineTransform(src_pos[i], dst_pos[i]);
|
||||
|
||||
//transform appended face normal and store
|
||||
norm_mat.rotate(src_norm[i], dst_norm[i]);
|
||||
dst_norm[i].normalize3fast();
|
||||
|
||||
//copy appended face texture coordinate
|
||||
dst_tc[i] = src_tc[i];
|
||||
|
||||
if (offset == 0 && i == 0)
|
||||
{ //initialize bounding box
|
||||
// VFExtents change
|
||||
mExtents[0] = mExtents[1] = dst_pos[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
//stretch bounding box
|
||||
// VFExtents change
|
||||
update_min_max(mExtents[0], mExtents[1], dst_pos[i]);
|
||||
}
|
||||
}
|
||||
LL_DEBUGS("RiggedBox") << "appendFace got extents " << mExtents[0] << ", " << mExtents[1] << " from dst_pos " << LL_ENDL;
|
||||
|
||||
|
||||
new_count = mNumIndices + face.mNumIndices;
|
||||
|
||||
//allocate new index buffer
|
||||
mIndices = (U16*) ll_aligned_realloc_16(mIndices, (new_count*sizeof(U16)+0xF) & ~0xF, (mNumIndices*sizeof(U16)+0xF) & ~0xF);
|
||||
|
||||
//get destination address into new index buffer
|
||||
U16* dst_idx = mIndices+mNumIndices;
|
||||
mNumIndices = new_count;
|
||||
|
||||
for (U32 i = 0; i < face.mNumIndices; ++i)
|
||||
{ //copy indices, offsetting by old vertex count
|
||||
dst_idx[i] = face.mIndices[i]+offset;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
|
||||
{
|
||||
LL_CHECK_MEMORY
|
||||
|
|
|
|||
|
|
@ -872,8 +872,6 @@ public:
|
|||
BOOL create(LLVolume* volume, BOOL partial_build = FALSE);
|
||||
void createTangents();
|
||||
|
||||
void appendFace(const LLVolumeFace& face, LLMatrix4& transform, LLMatrix4& normal_tranform);
|
||||
|
||||
void resizeVertices(S32 num_verts);
|
||||
void allocateTangents(S32 num_verts);
|
||||
void allocateWeights(S32 num_verts);
|
||||
|
|
|
|||
|
|
@ -369,3 +369,39 @@ BOOL LLVector3::parseVector3(const std::string& buf, LLVector3* value)
|
|||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Displacement from query point to nearest neighbor point on bounding box.
|
||||
// Returns zero vector for points within or on the box.
|
||||
LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box)
|
||||
{
|
||||
LLVector3 offset;
|
||||
for (S32 k=0; k<3; k++)
|
||||
{
|
||||
offset[k] = 0;
|
||||
if (pos[k] < box[0][k])
|
||||
{
|
||||
offset[k] = pos[k] - box[0][k];
|
||||
}
|
||||
else if (pos[k] > box[1][k])
|
||||
{
|
||||
offset[k] = pos[k] - box[1][k];
|
||||
}
|
||||
}
|
||||
return offset;
|
||||
}
|
||||
|
||||
bool box_valid_and_non_zero(const LLVector3* box)
|
||||
{
|
||||
if (!box[0].isFinite() || !box[1].isFinite())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
LLVector3 zero_vec;
|
||||
zero_vec.clear();
|
||||
if ((box[0] != zero_vec) || (box[1] != zero_vec))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -163,6 +163,8 @@ LLVector3 inverse_projected_vec(const LLVector3 &a, const LLVector3 &b); // Retu
|
|||
LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
|
||||
LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
|
||||
LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
|
||||
LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box); // Displacement from query point to nearest point on bounding box.
|
||||
bool box_valid_and_non_zero(const LLVector3* box);
|
||||
|
||||
inline LLVector3::LLVector3(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -401,40 +401,6 @@ void LLModel::setVolumeFaceData(
|
|||
LLVector4a::memcpyNonAliased16((F32*) face.mIndices, (F32*) ind.get(), size);
|
||||
}
|
||||
|
||||
void LLModel::appendFaces(LLModel *model, LLMatrix4 &transform, LLMatrix4& norm_mat)
|
||||
{
|
||||
if (mVolumeFaces.empty())
|
||||
{
|
||||
setNumVolumeFaces(1);
|
||||
}
|
||||
|
||||
LLVolumeFace& face = mVolumeFaces[mVolumeFaces.size()-1];
|
||||
|
||||
|
||||
for (S32 i = 0; i < model->getNumFaces(); ++i)
|
||||
{
|
||||
face.appendFace(model->getVolumeFace(i), transform, norm_mat);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLModel::appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat)
|
||||
{
|
||||
S32 rindex = getNumVolumeFaces()-1;
|
||||
if (rindex == -1 ||
|
||||
mVolumeFaces[rindex].mNumVertices + src_face.mNumVertices >= 65536)
|
||||
{ //empty or overflow will occur, append new face
|
||||
LLVolumeFace cur_face;
|
||||
cur_face.appendFace(src_face, mat, norm_mat);
|
||||
addFace(cur_face);
|
||||
mMaterialList.push_back(src_material);
|
||||
}
|
||||
else
|
||||
{ //append to existing end face
|
||||
mVolumeFaces.rbegin()->appendFace(src_face, mat, norm_mat);
|
||||
}
|
||||
}
|
||||
|
||||
void LLModel::addFace(const LLVolumeFace& face)
|
||||
{
|
||||
if (face.mNumVertices == 0)
|
||||
|
|
|
|||
|
|
@ -158,9 +158,6 @@ public:
|
|||
EModelStatus getStatus() const {return mStatus;}
|
||||
static std::string getStatusString(U32 status) ;
|
||||
|
||||
void appendFaces(LLModel* model, LLMatrix4& transform, LLMatrix4& normal_transform);
|
||||
void appendFace(const LLVolumeFace& src_face, std::string src_material, LLMatrix4& mat, LLMatrix4& norm_mat);
|
||||
|
||||
void setNumVolumeFaces(S32 count);
|
||||
void setVolumeFaceData(
|
||||
S32 f,
|
||||
|
|
|
|||
|
|
@ -34,10 +34,6 @@
|
|||
#include "llmeshrepository.h"
|
||||
#include "llviewerregion.h"
|
||||
|
||||
#if LL_WINDOWS
|
||||
#pragma optimize("", off)
|
||||
#endif
|
||||
|
||||
LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp) :
|
||||
LLVOAvatar(id, pcode, regionp),
|
||||
mPlaying(false),
|
||||
|
|
@ -68,41 +64,6 @@ void LLControlAvatar::initInstance()
|
|||
hideSkirt();
|
||||
}
|
||||
|
||||
// AXON move to math
|
||||
bool box_valid_and_non_zero(const LLVector3* box)
|
||||
{
|
||||
if (!box[0].isFinite() || !box[1].isFinite())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
LLVector3 zero_vec;
|
||||
zero_vec.clear();
|
||||
if ((box[0] != zero_vec) || (box[1] != zero_vec))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// AXON move to math
|
||||
LLVector3 point_to_box_offset(LLVector3& pos, const LLVector3* box)
|
||||
{
|
||||
LLVector3 offset;
|
||||
for (S32 k=0; k<3; k++)
|
||||
{
|
||||
offset[k] = 0;
|
||||
if (pos[k] < box[0][k])
|
||||
{
|
||||
offset[k] = pos[k] - box[0][k];
|
||||
}
|
||||
else if (pos[k] > box[1][k])
|
||||
{
|
||||
offset[k] = pos[k] - box[1][k];
|
||||
}
|
||||
}
|
||||
return offset;
|
||||
}
|
||||
|
||||
void LLControlAvatar::matchVolumeTransform()
|
||||
{
|
||||
if (mRootVolp)
|
||||
|
|
@ -157,11 +118,11 @@ void LLControlAvatar::matchVolumeTransform()
|
|||
F32 target_dist = (offset_dist - MAX_LEGAL_OFFSET);
|
||||
pos_box_offset *= target_dist/offset_dist;
|
||||
}
|
||||
LL_DEBUGS("FixBox") << getFullname() << " fixup needed for offset "
|
||||
<< pos_box_offset[0] << "," << pos_box_offset[1] << "," << pos_box_offset[2]
|
||||
<< " current fixup "
|
||||
<< mPositionConstraintFixup[0] << "," << mPositionConstraintFixup[1] << "," << mPositionConstraintFixup[2]
|
||||
<< " dist " << offset_dist << LL_ENDL;
|
||||
//LL_DEBUGS("FixBox") << getFullname() << " fixup needed for offset "
|
||||
// << pos_box_offset[0] << "," << pos_box_offset[1] << "," << pos_box_offset[2]
|
||||
// << " current fixup "
|
||||
// << mPositionConstraintFixup[0] << "," << mPositionConstraintFixup[1] << "," << mPositionConstraintFixup[2]
|
||||
// << " dist " << offset_dist << LL_ENDL;
|
||||
}
|
||||
|
||||
mPositionConstraintFixup = pos_box_offset;
|
||||
|
|
@ -380,6 +341,12 @@ void LLControlAvatar::updateDebugText()
|
|||
addDebugText(llformat("flags %s", animated_object_flag_string.c_str()));
|
||||
addDebugText(llformat("tris %d (est %.1f, streaming %.1f), verts %d", total_tris, est_tris, est_streaming_tris, total_verts));
|
||||
addDebugText(llformat("pxarea %s rank %d", LLStringOps::getReadableNumber(getPixelArea()).c_str(), getVisibilityRank()));
|
||||
if (mPositionConstraintFixup.length() > 0.0f)
|
||||
{
|
||||
addDebugText(llformat("pos fix (%.1f %.1f %.1f)",
|
||||
mPositionConstraintFixup[0], mPositionConstraintFixup[1], mPositionConstraintFixup[2]));
|
||||
}
|
||||
|
||||
#if 0
|
||||
std::string region_name = "no region";
|
||||
if (mRootVolp->getRegion())
|
||||
|
|
|
|||
|
|
@ -652,7 +652,6 @@ public:
|
|||
|
||||
extern LLMeshRepository gMeshRepo;
|
||||
|
||||
// AXON make sure this is consistent with the final simulator-side values.
|
||||
const F32 ANIMATED_OBJECT_BASE_COST = 15.0f;
|
||||
const F32 ANIMATED_OBJECT_COST_PER_KTRI = 1.5f;
|
||||
|
||||
|
|
|
|||
|
|
@ -34,10 +34,6 @@
|
|||
#include "llvolume.h"
|
||||
#include "llrigginginfo.h"
|
||||
|
||||
//#if LL_WINDOWS
|
||||
//#pragma optimize("", off)
|
||||
//#endif
|
||||
|
||||
void LLSkinningUtil::initClass()
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1346,7 +1346,7 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
|
|||
attachment_iter != attachment->mAttachedObjects.end();
|
||||
++attachment_iter)
|
||||
{
|
||||
// AXON is this right? Don't we need to look at children of attached_object as well?
|
||||
// AXON Don't we need to look at children of attached_object as well?
|
||||
const LLViewerObject* attached_object = (*attachment_iter);
|
||||
if (attached_object && !attached_object->isHUDAttachment())
|
||||
{
|
||||
|
|
@ -1389,10 +1389,11 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
|
|||
{
|
||||
// AXON try to cache unless something has changed about attached rigged meshes.
|
||||
// Needs more logic based on volume states.
|
||||
|
||||
//if (mRiggingInfoTab.needsUpdate())
|
||||
{
|
||||
updateRiggingInfo();
|
||||
mJointRiggingInfoTab.setNeedsUpdate(false);
|
||||
//mJointRiggingInfoTab.setNeedsUpdate(false);
|
||||
}
|
||||
for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++)
|
||||
{
|
||||
|
|
@ -1403,12 +1404,6 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
|
|||
rig_info = &mJointRiggingInfoTab[joint_num];
|
||||
}
|
||||
|
||||
// FIXME TEMP HACK FOR TESTING
|
||||
//if (joint)
|
||||
//{
|
||||
// rig_info.setIsRiggedTo(true);
|
||||
//}
|
||||
|
||||
if (joint && rig_info && rig_info->isRiggedTo())
|
||||
{
|
||||
LLViewerJointAttachment *as_joint_attach = dynamic_cast<LLViewerJointAttachment*>(joint);
|
||||
|
|
@ -1574,7 +1569,7 @@ void LLVOAvatar::renderBones()
|
|||
}
|
||||
else
|
||||
{
|
||||
if (jointIsRiggedTo(jointp->getName()))
|
||||
if (jointIsRiggedTo(jointp))
|
||||
{
|
||||
occ_color = RIGGED_COLOR_OCCLUDED;
|
||||
visible_color = RIGGED_COLOR_VISIBLE;
|
||||
|
|
@ -2702,7 +2697,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
|
|||
{
|
||||
ext[0].load3(mLastAnimExtents[0].mV);
|
||||
ext[1].load3(mLastAnimExtents[1].mV);
|
||||
// AXON just do this once per frame
|
||||
// Expensive. Just call this once per frame, in updateSpatialExtents();
|
||||
//calculateSpatialExtents(ext[0], ext[1]);
|
||||
LLVector4a diff;
|
||||
diff.setSub(ext[1], mImpostorExtents[1]);
|
||||
|
|
@ -5827,73 +5822,17 @@ bool LLVOAvatar::getRiggedMeshID(LLViewerObject* pVO, LLUUID& mesh_id)
|
|||
return false;
|
||||
}
|
||||
|
||||
// AXON update to use LLRiggingInfo
|
||||
bool LLVOAvatar::jointIsRiggedTo(const std::string& joint_name)
|
||||
bool LLVOAvatar::jointIsRiggedTo(const LLJoint *joint) const
|
||||
{
|
||||
LLJoint *joint = getJoint(joint_name);
|
||||
if (joint)
|
||||
{
|
||||
LLJointRiggingInfoTab& tab = mJointRiggingInfoTab;
|
||||
const LLJointRiggingInfoTab& tab = mJointRiggingInfoTab;
|
||||
S32 joint_num = joint->getJointNum();
|
||||
if (joint_num < tab.size() && tab[joint_num].isRiggedTo())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
#if 0
|
||||
for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
|
||||
iter != mAttachmentPoints.end();
|
||||
++iter)
|
||||
{
|
||||
LLViewerJointAttachment* attachment = iter->second;
|
||||
for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
|
||||
attachment_iter != attachment->mAttachedObjects.end();
|
||||
++attachment_iter)
|
||||
{
|
||||
const LLViewerObject* attached_object = (*attachment_iter);
|
||||
if (attached_object && jointIsRiggedTo(joint_name, attached_object))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
// AXON update to use LLRiggingInfo
|
||||
bool LLVOAvatar::jointIsRiggedTo(const std::string& joint_name, const LLViewerObject *vo)
|
||||
{
|
||||
// Process all children
|
||||
LLViewerObject::const_child_list_t& children = vo->getChildren();
|
||||
for (LLViewerObject::const_child_list_t::const_iterator it = children.begin();
|
||||
it != children.end(); ++it)
|
||||
{
|
||||
LLViewerObject *childp = *it;
|
||||
if (jointIsRiggedTo(joint_name,childp))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
const LLVOVolume *vobj = dynamic_cast<const LLVOVolume*>(vo);
|
||||
if (!vobj)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const LLMeshSkinInfo* pSkinData = vobj->getSkinInfo();
|
||||
|
||||
if ( vobj && vobj->isAttachment() && vobj->isMesh() && pSkinData )
|
||||
{
|
||||
if (std::find(pSkinData->mJointNames.begin(), pSkinData->mJointNames.end(), joint_name) !=
|
||||
pSkinData->mJointNames.end())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -9554,10 +9493,9 @@ void showRigInfoTabExtents(LLVOAvatar *avatar, LLJointRiggingInfoTab& tab, S32&
|
|||
}
|
||||
}
|
||||
|
||||
// AXON move to member
|
||||
void getAssociatedVolumes(LLVOAvatar *av, std::vector<LLVOVolume*>& volumes)
|
||||
void LLVOAvatar::getAssociatedVolumes(std::vector<LLVOVolume*>& volumes)
|
||||
{
|
||||
for ( LLVOAvatar::attachment_map_t::iterator iter = av->mAttachmentPoints.begin(); iter != av->mAttachmentPoints.end(); ++iter )
|
||||
for ( LLVOAvatar::attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter )
|
||||
{
|
||||
LLViewerJointAttachment* attachment = iter->second;
|
||||
LLViewerJointAttachment::attachedobjs_vec_t::iterator attach_end = attachment->mAttachedObjects.end();
|
||||
|
|
@ -9584,7 +9522,7 @@ void getAssociatedVolumes(LLVOAvatar *av, std::vector<LLVOVolume*>& volumes)
|
|||
}
|
||||
}
|
||||
}
|
||||
LLControlAvatar *control_av = dynamic_cast<LLControlAvatar*>(av);
|
||||
LLControlAvatar *control_av = dynamic_cast<LLControlAvatar*>(this);
|
||||
if (control_av)
|
||||
{
|
||||
LLVOVolume *volp = control_av->mRootVolp;
|
||||
|
|
@ -9612,7 +9550,7 @@ void LLVOAvatar::updateRiggingInfo()
|
|||
LL_DEBUGS("RigSpammish") << getFullname() << " updating rig tab" << LL_ENDL;
|
||||
mJointRiggingInfoTab.clear();
|
||||
std::vector<LLVOVolume*> volumes;
|
||||
getAssociatedVolumes(this, volumes);
|
||||
getAssociatedVolumes(volumes);
|
||||
for (std::vector<LLVOVolume*>::iterator it = volumes.begin(); it != volumes.end(); ++it)
|
||||
{
|
||||
LLVOVolume *vol = *it;
|
||||
|
|
|
|||
|
|
@ -208,8 +208,7 @@ public:
|
|||
void addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LLUUID>* meshes_seen = NULL, bool recursive = true);
|
||||
void removeAttachmentOverridesForObject(const LLUUID& mesh_id);
|
||||
void removeAttachmentOverridesForObject(LLViewerObject *vo);
|
||||
bool jointIsRiggedTo(const std::string& joint_name);
|
||||
bool jointIsRiggedTo(const std::string& joint_name, const LLViewerObject *vo);
|
||||
bool jointIsRiggedTo(const LLJoint *joint) const;
|
||||
void clearAttachmentOverrides();
|
||||
void rebuildAttachmentOverrides();
|
||||
void updateAttachmentOverrides();
|
||||
|
|
@ -217,6 +216,8 @@ public:
|
|||
void getAttachmentOverrideNames(std::set<std::string>& pos_names,
|
||||
std::set<std::string>& scale_names) const;
|
||||
|
||||
void getAssociatedVolumes(std::vector<LLVOVolume*>& volumes);
|
||||
|
||||
// virtual
|
||||
void updateRiggingInfo();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue