PATH-842, VWR-29431: BUGFIX Correcting a regression introduced by the fix for PATH-542. The viewer calculated rotation resulting from an object's angular velocity was being incorrectly reset when the corresponding object update was received. With this bugfix, the rotation resulting from the angular velocity is accumulated separately and is re-appplied when the object update resets the object's rotation.
parent
7cc33ad6be
commit
ada5664c32
|
|
@ -239,6 +239,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
|
|||
mNumFaces(0),
|
||||
mTimeDilation(1.f),
|
||||
mRotTime(0.f),
|
||||
mAngularVelocityRot(),
|
||||
mJointInfo(NULL),
|
||||
mState(0),
|
||||
mMedia(NULL),
|
||||
|
|
@ -269,6 +270,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
|
|||
{
|
||||
mPositionAgent = mRegionp->getOriginAgent();
|
||||
}
|
||||
resetRot();
|
||||
|
||||
LLViewerObject::sNumObjects++;
|
||||
}
|
||||
|
|
@ -2112,14 +2114,14 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
|
|||
if (new_rot != getRotation()
|
||||
|| new_angv != old_angv)
|
||||
{
|
||||
if (new_rot != getRotation())
|
||||
if (new_angv != old_angv)
|
||||
{
|
||||
setRotation(new_rot);
|
||||
resetRot();
|
||||
}
|
||||
|
||||
|
||||
// Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
|
||||
setRotation(new_rot * mAngularVelocityRot);
|
||||
setChanged(ROTATED | SILHOUETTE);
|
||||
|
||||
resetRot();
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -5558,8 +5560,13 @@ void LLViewerObject::applyAngularVelocity(F32 dt)
|
|||
|
||||
ang_vel *= 1.f/omega;
|
||||
|
||||
// calculate the delta increment based on the object's angular velocity
|
||||
dQ.setQuat(angle, ang_vel);
|
||||
|
||||
// accumulate the angular velocity rotations to re-apply in the case of an object update
|
||||
mAngularVelocityRot *= dQ;
|
||||
|
||||
// Just apply the delta increment to the current rotation
|
||||
setRotation(getRotation()*dQ);
|
||||
setChanged(MOVED | SILHOUETTE);
|
||||
}
|
||||
|
|
@ -5568,6 +5575,9 @@ void LLViewerObject::applyAngularVelocity(F32 dt)
|
|||
void LLViewerObject::resetRot()
|
||||
{
|
||||
mRotTime = 0.0f;
|
||||
|
||||
// Reset the accumulated angular velocity rotation
|
||||
mAngularVelocityRot.loadIdentity();
|
||||
}
|
||||
|
||||
U32 LLViewerObject::getPartitionType() const
|
||||
|
|
|
|||
|
|
@ -730,6 +730,7 @@ protected:
|
|||
|
||||
F32 mTimeDilation; // Time dilation sent with the object.
|
||||
F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
|
||||
LLQuaternion mAngularVelocityRot; // accumulated rotation from the angular velocity computations
|
||||
|
||||
LLVOJointInfo* mJointInfo;
|
||||
U8 mState; // legacy
|
||||
|
|
|
|||
Loading…
Reference in New Issue