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=4295prebuild-update
parent
0a81038dd5
commit
2a1c11fda9
|
@ -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;
|
update.UpdateFlags = (uint)flags;
|
||||||
|
|
||||||
#endregion PrimFlags
|
#endregion PrimFlags
|
||||||
|
|
|
@ -1563,23 +1563,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (userExposed)
|
if (userExposed)
|
||||||
dupe.m_rootPart.TrimPermissions();
|
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;
|
List<SceneObjectPart> partList;
|
||||||
|
|
||||||
lock (m_parts)
|
lock (m_parts)
|
||||||
|
@ -1598,11 +1581,28 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (part.UUID != m_rootPart.UUID)
|
if (part.UUID != m_rootPart.UUID)
|
||||||
{
|
{
|
||||||
SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
|
SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
|
||||||
|
|
||||||
newPart.LinkNum = part.LinkNum;
|
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)
|
if (userExposed)
|
||||||
{
|
{
|
||||||
dupe.UpdateParentIDs();
|
dupe.UpdateParentIDs();
|
||||||
|
|
|
@ -150,8 +150,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// TODO: This needs to be persisted in next XML version update!
|
// TODO: This needs to be persisted in next XML version update!
|
||||||
[XmlIgnore]
|
[XmlIgnore]
|
||||||
public readonly int[] PayPrice = {-2,-2,-2,-2,-2};
|
public readonly int[] PayPrice = {-2,-2,-2,-2,-2};
|
||||||
|
|
||||||
[XmlIgnore]
|
[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:
|
//Xantor 20080528 Sound stuff:
|
||||||
// Note: This isn't persisted in the database right now, as the fields for that aren't just there yet.
|
// 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>
|
/// </summary>
|
||||||
private byte m_updateFlag;
|
private byte m_updateFlag;
|
||||||
|
|
||||||
|
private PhysicsActor m_physActor;
|
||||||
protected Vector3 m_acceleration;
|
protected Vector3 m_acceleration;
|
||||||
protected Vector3 m_angularVelocity;
|
protected Vector3 m_angularVelocity;
|
||||||
|
|
||||||
|
@ -1006,7 +1016,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public bool CreateSelected
|
public bool CreateSelected
|
||||||
{
|
{
|
||||||
get { return m_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
|
#endregion
|
||||||
|
@ -1531,7 +1545,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
else
|
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
|
/// that's not wholesome. Had to make Scene public
|
||||||
//PhysActor = null;
|
//PhysActor = null;
|
||||||
|
|
||||||
if ((ObjectFlags & (uint)PrimFlags.Phantom) == 0)
|
if ((Flags & PrimFlags.Phantom) == 0)
|
||||||
{
|
{
|
||||||
if (UsePhysics)
|
if (UsePhysics)
|
||||||
{
|
{
|
||||||
|
|
|
@ -77,6 +77,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||||
|
|
||||||
Assert.That(dupePart1.Flags, Is.EqualTo(part1.Flags));
|
Assert.That(dupePart1.Flags, Is.EqualTo(part1.Flags));
|
||||||
Assert.That(dupePart2.Flags, Is.EqualTo(part2.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);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue