On shift-copy of an object, set up a new physics actor (as appropriate) for every copied prim, not just the root

This addresses http://opensimulator.org/mantis/view.php?id=4295
prebuild-update
Justin Clark-Casey (justincc) 2010-08-10 20:15:44 +01:00
parent 0a81038dd5
commit 2a1c11fda9
4 changed files with 48 additions and 23 deletions

View File

@ -4599,6 +4599,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
// m_log.DebugFormat(
// "[LLCLIENTVIEW]: Constructing client update for part {0} {1} with flags {2}, localId {3}",
// data.Name, update.FullID, flags, update.ID);
update.UpdateFlags = (uint)flags;
#endregion PrimFlags

View File

@ -1563,23 +1563,6 @@ namespace OpenSim.Region.Framework.Scenes
if (userExposed)
dupe.m_rootPart.TrimPermissions();
/// may need to create a new Physics actor.
if (dupe.RootPart.PhysActor != null && userExposed)
{
PrimitiveBaseShape pbs = dupe.RootPart.Shape;
dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape(
dupe.RootPart.Name,
pbs,
dupe.RootPart.AbsolutePosition,
dupe.RootPart.Scale,
dupe.RootPart.RotationOffset,
dupe.RootPart.PhysActor.IsPhysical);
dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
}
List<SceneObjectPart> partList;
lock (m_parts)
@ -1598,11 +1581,28 @@ namespace OpenSim.Region.Framework.Scenes
if (part.UUID != m_rootPart.UUID)
{
SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
newPart.LinkNum = part.LinkNum;
}
}
// Need to duplicate the physics actor as well
if (part.PhysActor != null && userExposed)
{
PrimitiveBaseShape pbs = part.Shape;
part.PhysActor
= m_scene.PhysicsScene.AddPrimShape(
part.Name,
pbs,
part.AbsolutePosition,
part.Scale,
part.RotationOffset,
part.PhysActor.IsPhysical);
part.PhysActor.LocalID = part.LocalId;
part.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true);
}
}
if (userExposed)
{
dupe.UpdateParentIDs();

View File

@ -150,8 +150,17 @@ namespace OpenSim.Region.Framework.Scenes
// TODO: This needs to be persisted in next XML version update!
[XmlIgnore]
public readonly int[] PayPrice = {-2,-2,-2,-2,-2};
[XmlIgnore]
public PhysicsActor PhysActor;
public PhysicsActor PhysActor
{
get { return m_physActor; }
set
{
// m_log.DebugFormat("[SOP]: PhysActor set to {0} for {1} {2}", value, Name, UUID);
m_physActor = value;
}
}
//Xantor 20080528 Sound stuff:
// Note: This isn't persisted in the database right now, as the fields for that aren't just there yet.
@ -297,6 +306,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary>
private byte m_updateFlag;
private PhysicsActor m_physActor;
protected Vector3 m_acceleration;
protected Vector3 m_angularVelocity;
@ -1006,7 +1016,11 @@ namespace OpenSim.Region.Framework.Scenes
public bool CreateSelected
{
get { return m_createSelected; }
set { m_createSelected = value; }
set
{
// m_log.DebugFormat("[SOP]: Setting CreateSelected to {0} for {1} {2}", value, Name, UUID);
m_createSelected = value;
}
}
#endregion
@ -1531,7 +1545,7 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
m_log.DebugFormat("[SPEW]: physics actor is null for {0} with parent {1}", UUID, this.ParentGroup.UUID);
m_log.DebugFormat("[SOP]: physics actor is null for {0} with parent {1}", UUID, this.ParentGroup.UUID);
}
}
}
@ -1801,7 +1815,7 @@ namespace OpenSim.Region.Framework.Scenes
/// that's not wholesome. Had to make Scene public
//PhysActor = null;
if ((ObjectFlags & (uint)PrimFlags.Phantom) == 0)
if ((Flags & PrimFlags.Phantom) == 0)
{
if (UsePhysics)
{

View File

@ -77,6 +77,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests
Assert.That(dupePart1.Flags, Is.EqualTo(part1.Flags));
Assert.That(dupePart2.Flags, Is.EqualTo(part2.Flags));
/*
Assert.That(part1.PhysActor, Is.Not.Null);
Assert.That(part2.PhysActor, Is.Not.Null);
Assert.That(dupePart1.PhysActor, Is.Not.Null);
Assert.That(dupePart2.PhysActor, Is.Not.Null);
*/
}
}
}