Fix for problem with pelvis offset
parent
8bbbcd9c22
commit
fcde700447
|
|
@ -760,6 +760,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
|||
mRuthDebugTimer.reset();
|
||||
mDebugExistenceTimer.reset();
|
||||
mPelvisOffset = LLVector3(0.0f,0.0f,0.0f);
|
||||
mLastPelvisToFoot = 0.0f;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
|
@ -1331,7 +1332,20 @@ const LLVector3 LLVOAvatar::getRenderPosition() const
|
|||
}
|
||||
else if (isRoot())
|
||||
{
|
||||
return mDrawable->getPositionAgent();
|
||||
if ( mHasPelvisOffset )
|
||||
{
|
||||
LLVector3 returnVec( mDrawable->getPositionAgent() );
|
||||
//1. Move the pelvis down by the old amount
|
||||
returnVec[VZ] -= (mLastPelvisToFoot);
|
||||
//2. Now move the pelvis up by the new amount
|
||||
returnVec[VZ] += mPelvisToFoot;
|
||||
//3. Return the fixed up pelvis position
|
||||
return returnVec;
|
||||
}
|
||||
else
|
||||
{
|
||||
return mDrawable->getPositionAgent();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -3454,20 +3468,13 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
|
||||
if (isSelf())
|
||||
{
|
||||
if ( !mHasPelvisOffset )
|
||||
{
|
||||
gAgent.setPositionAgent(getRenderPosition());
|
||||
}
|
||||
else
|
||||
{
|
||||
gAgent.setPositionAgent( getRenderPosition() + mPelvisOffset );
|
||||
}
|
||||
gAgent.setPositionAgent(getRenderPosition());
|
||||
}
|
||||
|
||||
root_pos = gAgent.getPosGlobalFromAgent(getRenderPosition());
|
||||
|
||||
resolveHeightGlobal(root_pos, ground_under_pelvis, normal);
|
||||
F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]);
|
||||
F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]);
|
||||
BOOL in_air = ((!LLWorld::getInstance()->getRegionFromPosGlobal(ground_under_pelvis)) ||
|
||||
foot_to_ground > FOOT_GROUND_COLLISION_TOLERANCE);
|
||||
|
||||
|
|
@ -3479,22 +3486,21 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
|
||||
// correct for the fact that the pelvis is not necessarily the center
|
||||
// of the agent's physical representation
|
||||
root_pos.mdV[VZ] -= (0.5f * mBodySize.mV[VZ]) - mPelvisToFoot;
|
||||
|
||||
if ( !mHasPelvisOffset )
|
||||
{
|
||||
root_pos.mdV[VZ] -= (0.5f * mBodySize.mV[VZ]) - mPelvisToFoot;
|
||||
}
|
||||
else
|
||||
{
|
||||
root_pos.mdV[VZ] -= (0.65f * mBodySize.mV[VZ]) - mPelvisToFoot;
|
||||
}
|
||||
|
||||
LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos);
|
||||
|
||||
if (newPosition != mRoot.getXform()->getWorldPosition())
|
||||
{
|
||||
if ( !mHasPelvisOffset )
|
||||
{
|
||||
mRoot.touch();
|
||||
mRoot.setWorldPosition( newPosition ); // regular update
|
||||
}
|
||||
else
|
||||
{
|
||||
mRoot.touch();
|
||||
mRoot.setWorldPosition( newPosition + mPelvisOffset );
|
||||
}
|
||||
mRoot.touch();
|
||||
mRoot.setWorldPosition( newPosition ); // regular update
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -3770,7 +3776,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// updateHeadOffset()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -3803,6 +3808,7 @@ void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount
|
|||
mHasPelvisOffset = hasOffset;
|
||||
if ( mHasPelvisOffset )
|
||||
{
|
||||
mLastPelvisToFoot = mPelvisToFoot;
|
||||
mPelvisOffset = offsetAmount;
|
||||
}
|
||||
}
|
||||
|
|
@ -3810,9 +3816,10 @@ void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount
|
|||
// postPelvisSetRecalc
|
||||
//------------------------------------------------------------------------
|
||||
void LLVOAvatar::postPelvisSetRecalc( void )
|
||||
{
|
||||
{
|
||||
computeBodySize();
|
||||
mRoot.updateWorldMatrixChildren();
|
||||
mRoot.touch();
|
||||
mRoot.updateWorldMatrixChildren();
|
||||
dirtyMesh();
|
||||
updateHeadOffset();
|
||||
}
|
||||
|
|
@ -4543,7 +4550,6 @@ void LLVOAvatar::resolveRayCollisionAgent(const LLVector3d start_pt, const LLVec
|
|||
LLWorld::getInstance()->resolveStepHeightGlobal(this, start_pt, end_pt, out_pos, out_norm, &obj);
|
||||
}
|
||||
|
||||
|
||||
void LLVOAvatar::resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm)
|
||||
{
|
||||
LLVector3d zVec(0.0f, 0.0f, 0.5f);
|
||||
|
|
|
|||
|
|
@ -298,7 +298,7 @@ public:
|
|||
|
||||
bool mHasPelvisOffset;
|
||||
LLVector3 mPelvisOffset;
|
||||
|
||||
F32 mLastPelvisToFoot;
|
||||
|
||||
LLVector3 mHeadOffset; // current head position
|
||||
LLViewerJoint mRoot;
|
||||
|
|
@ -805,6 +805,7 @@ protected:
|
|||
//--------------------------------------------------------------------
|
||||
public:
|
||||
void resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm);
|
||||
bool distanceToGround( const LLVector3d &startPoint, LLVector3d &collisionPoint, F32 distToIntersectionAlongRay );
|
||||
void resolveHeightAgent(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm);
|
||||
void resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm);
|
||||
void slamPosition(); // Slam position to transmitted position (for teleport);
|
||||
|
|
|
|||
|
|
@ -3919,22 +3919,19 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
{
|
||||
pJoint->setId( currentId );
|
||||
const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation();
|
||||
//If joint is a pelvis then handle by setting avPos+offset
|
||||
//Set the joint position
|
||||
pJoint->storeCurrentXform( jointPos );
|
||||
//If joint is a pelvis then handle old/new pelvis to foot values
|
||||
if ( lookingForJoint == "mPelvis" )
|
||||
{
|
||||
//Apply av pos + offset
|
||||
pJoint->storeCurrentXform( jointPos );
|
||||
if ( !pAvatarVO->hasPelvisOffset() )
|
||||
{
|
||||
pAvatarVO->setPelvisOffset( true, jointPos );
|
||||
//Trigger to rebuild viewer AV
|
||||
pelvisGotSet = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Straight set for ALL joints except pelvis
|
||||
pJoint->storeCurrentXform( jointPos );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue