Fixing race conditions in the SceneObjectPart properties

0.6.8-post-fixes
John Hurliman 2009-11-02 11:40:57 -08:00
parent 67ac9881fa
commit 0e8b5c7ffa
1 changed files with 53 additions and 56 deletions

View File

@ -507,20 +507,17 @@ namespace OpenSim.Region.Framework.Scenes
get get
{ {
// If this is a linkset, we don't want the physics engine mucking up our group position here. // If this is a linkset, we don't want the physics engine mucking up our group position here.
if (PhysActor != null && _parentID == 0) PhysicsActor actor = PhysActor;
if (actor != null && _parentID == 0)
{ {
m_groupPosition.X = PhysActor.Position.X; m_groupPosition = actor.Position;
m_groupPosition.Y = PhysActor.Position.Y;
m_groupPosition.Z = PhysActor.Position.Z;
} }
if (IsAttachment) if (IsAttachment)
{ {
ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar); ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar);
if (sp != null) if (sp != null)
{
return sp.AbsolutePosition; return sp.AbsolutePosition;
}
} }
return m_groupPosition; return m_groupPosition;
@ -531,26 +528,25 @@ namespace OpenSim.Region.Framework.Scenes
m_groupPosition = value; m_groupPosition = value;
if (PhysActor != null) PhysicsActor actor = PhysActor;
if (actor != null)
{ {
try try
{ {
// Root prim actually goes at Position // Root prim actually goes at Position
if (_parentID == 0) if (_parentID == 0)
{ {
PhysActor.Position = value; actor.Position = value;
} }
else else
{ {
// To move the child prim in respect to the group position and rotation we have to calculate // To move the child prim in respect to the group position and rotation we have to calculate
Vector3 resultingposition = GetWorldPosition(); actor.Position = GetWorldPosition();
PhysActor.Position = resultingposition; actor.Orientation = GetWorldRotation();
Quaternion resultingrot = GetWorldRotation();
PhysActor.Orientation = resultingrot;
} }
// Tell the physics engines that this prim changed. // Tell the physics engines that this prim changed.
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
} }
catch (Exception e) catch (Exception e)
{ {
@ -583,15 +579,14 @@ namespace OpenSim.Region.Framework.Scenes
if (ParentGroup != null && !ParentGroup.IsDeleted) if (ParentGroup != null && !ParentGroup.IsDeleted)
{ {
if (_parentID != 0 && PhysActor != null) PhysicsActor actor = PhysActor;
if (_parentID != 0 && actor != null)
{ {
Vector3 resultingposition = GetWorldPosition(); actor.Position = GetWorldPosition();
PhysActor.Position = resultingposition; actor.Orientation = GetWorldRotation();
Quaternion resultingrot = GetWorldRotation();
PhysActor.Orientation = resultingrot;
// Tell the physics engines that this prim changed. // Tell the physics engines that this prim changed.
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
} }
} }
} }
@ -602,12 +597,13 @@ namespace OpenSim.Region.Framework.Scenes
get get
{ {
// We don't want the physics engine mucking up the rotations in a linkset // We don't want the physics engine mucking up the rotations in a linkset
if ((_parentID == 0) && (Shape.PCode != 9 || Shape.State == 0) && (PhysActor != null)) PhysicsActor actor = PhysActor;
if (_parentID == 0 && (Shape.PCode != 9 || Shape.State == 0) && actor != null)
{ {
if (PhysActor.Orientation.X != 0 || PhysActor.Orientation.Y != 0 if (actor.Orientation.X != 0f || actor.Orientation.Y != 0f
|| PhysActor.Orientation.Z != 0 || PhysActor.Orientation.W != 0) || actor.Orientation.Z != 0f || actor.Orientation.W != 0f)
{ {
m_rotationOffset = PhysActor.Orientation; m_rotationOffset = actor.Orientation;
} }
} }
@ -619,24 +615,25 @@ namespace OpenSim.Region.Framework.Scenes
StoreUndoState(); StoreUndoState();
m_rotationOffset = value; m_rotationOffset = value;
if (PhysActor != null) PhysicsActor actor = PhysActor;
if (actor != null)
{ {
try try
{ {
// Root prim gets value directly // Root prim gets value directly
if (_parentID == 0) if (_parentID == 0)
{ {
PhysActor.Orientation = value; actor.Orientation = value;
//m_log.Info("[PART]: RO1:" + PhysActor.Orientation.ToString()); //m_log.Info("[PART]: RO1:" + actor.Orientation.ToString());
} }
else else
{ {
// Child prim we have to calculate it's world rotationwel // Child prim we have to calculate it's world rotationwel
Quaternion resultingrotation = GetWorldRotation(); Quaternion resultingrotation = GetWorldRotation();
PhysActor.Orientation = resultingrotation; actor.Orientation = resultingrotation;
//m_log.Info("[PART]: RO2:" + PhysActor.Orientation.ToString()); //m_log.Info("[PART]: RO2:" + actor.Orientation.ToString());
} }
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
//} //}
} }
catch (Exception ex) catch (Exception ex)
@ -653,16 +650,12 @@ namespace OpenSim.Region.Framework.Scenes
{ {
get get
{ {
//if (PhysActor.Velocity.X != 0 || PhysActor.Velocity.Y != 0 PhysicsActor actor = PhysActor;
//|| PhysActor.Velocity.Z != 0) if (actor != null)
//{
if (PhysActor != null)
{ {
if (PhysActor.IsPhysical) if (actor.IsPhysical)
{ {
m_velocity.X = PhysActor.Velocity.X; m_velocity = actor.Velocity;
m_velocity.Y = PhysActor.Velocity.Y;
m_velocity.Z = PhysActor.Velocity.Z;
} }
} }
@ -672,12 +665,14 @@ namespace OpenSim.Region.Framework.Scenes
set set
{ {
m_velocity = value; m_velocity = value;
if (PhysActor != null)
PhysicsActor actor = PhysActor;
if (actor != null)
{ {
if (PhysActor.IsPhysical) if (actor.IsPhysical)
{ {
PhysActor.Velocity = value; actor.Velocity = value;
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
} }
} }
} }
@ -688,9 +683,10 @@ namespace OpenSim.Region.Framework.Scenes
{ {
get get
{ {
if ((PhysActor != null) && PhysActor.IsPhysical) PhysicsActor actor = PhysActor;
if ((actor != null) && actor.IsPhysical)
{ {
m_angularVelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(), 0); m_angularVelocity = actor.RotationalVelocity;
} }
return m_angularVelocity; return m_angularVelocity;
} }
@ -710,9 +706,10 @@ namespace OpenSim.Region.Framework.Scenes
set set
{ {
m_description = value; m_description = value;
if (PhysActor != null) PhysicsActor actor = PhysActor;
if (actor != null)
{ {
PhysActor.SOPDescription = value; actor.SOPDescription = value;
} }
} }
} }
@ -803,21 +800,23 @@ namespace OpenSim.Region.Framework.Scenes
set set
{ {
StoreUndoState(); StoreUndoState();
if (m_shape != null) { if (m_shape != null)
m_shape.Scale = value;
if (PhysActor != null && m_parentGroup != null)
{ {
if (m_parentGroup.Scene != null) m_shape.Scale = value;
PhysicsActor actor = PhysActor;
if (actor != null && m_parentGroup != null)
{ {
if (m_parentGroup.Scene.PhysicsScene != null) if (m_parentGroup.Scene != null)
{ {
PhysActor.Size = m_shape.Scale; if (m_parentGroup.Scene.PhysicsScene != null)
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); {
actor.Size = m_shape.Scale;
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
}
} }
} }
} }
}
TriggerScriptChangedEvent(Changed.SCALE); TriggerScriptChangedEvent(Changed.SCALE);
} }
} }
@ -1051,8 +1050,6 @@ if (m_shape != null) {
#endregion Public Properties with only Get #endregion Public Properties with only Get
#region Private Methods #region Private Methods
private uint ApplyMask(uint val, bool set, uint mask) private uint ApplyMask(uint val, bool set, uint mask)