diff options
Diffstat (limited to 'OpenSim/Region')
4 files changed, 101 insertions, 51 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index df2690e..5473d23 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -4599,6 +4599,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4599 | } | 4599 | } |
4600 | } | 4600 | } |
4601 | 4601 | ||
4602 | // m_log.DebugFormat( | ||
4603 | // "[LLCLIENTVIEW]: Constructing client update for part {0} {1} with flags {2}, localId {3}", | ||
4604 | // data.Name, update.FullID, flags, update.ID); | ||
4605 | |||
4602 | update.UpdateFlags = (uint)flags; | 4606 | update.UpdateFlags = (uint)flags; |
4603 | 4607 | ||
4604 | #endregion PrimFlags | 4608 | #endregion PrimFlags |
@@ -4731,7 +4735,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4731 | AddLocalPacketHandler(PacketType.ObjectScale, HandleObjectScale); | 4735 | AddLocalPacketHandler(PacketType.ObjectScale, HandleObjectScale); |
4732 | AddLocalPacketHandler(PacketType.ObjectRotation, HandleObjectRotation); | 4736 | AddLocalPacketHandler(PacketType.ObjectRotation, HandleObjectRotation); |
4733 | AddLocalPacketHandler(PacketType.ObjectFlagUpdate, HandleObjectFlagUpdate); | 4737 | AddLocalPacketHandler(PacketType.ObjectFlagUpdate, HandleObjectFlagUpdate); |
4734 | AddLocalPacketHandler(PacketType.ObjectImage, HandleObjectImage); | 4738 | |
4739 | // Handle ObjectImage (TextureEntry) updates synchronously, since when updating multiple prim faces at once, | ||
4740 | // some clients will send out a separate ObjectImage packet for each face | ||
4741 | AddLocalPacketHandler(PacketType.ObjectImage, HandleObjectImage, false); | ||
4742 | |||
4735 | AddLocalPacketHandler(PacketType.ObjectGrab, HandleObjectGrab, false); | 4743 | AddLocalPacketHandler(PacketType.ObjectGrab, HandleObjectGrab, false); |
4736 | AddLocalPacketHandler(PacketType.ObjectGrabUpdate, HandleObjectGrabUpdate, false); | 4744 | AddLocalPacketHandler(PacketType.ObjectGrabUpdate, HandleObjectGrabUpdate, false); |
4737 | AddLocalPacketHandler(PacketType.ObjectDeGrab, HandleObjectDeGrab); | 4745 | AddLocalPacketHandler(PacketType.ObjectDeGrab, HandleObjectDeGrab); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index a2c3c07..6c1f3c2 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1563,23 +1563,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1563 | if (userExposed) | 1563 | if (userExposed) |
1564 | dupe.m_rootPart.TrimPermissions(); | 1564 | dupe.m_rootPart.TrimPermissions(); |
1565 | 1565 | ||
1566 | /// may need to create a new Physics actor. | ||
1567 | if (dupe.RootPart.PhysActor != null && userExposed) | ||
1568 | { | ||
1569 | PrimitiveBaseShape pbs = dupe.RootPart.Shape; | ||
1570 | |||
1571 | dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape( | ||
1572 | dupe.RootPart.Name, | ||
1573 | pbs, | ||
1574 | dupe.RootPart.AbsolutePosition, | ||
1575 | dupe.RootPart.Scale, | ||
1576 | dupe.RootPart.RotationOffset, | ||
1577 | dupe.RootPart.PhysActor.IsPhysical); | ||
1578 | |||
1579 | dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId; | ||
1580 | dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true); | ||
1581 | } | ||
1582 | |||
1583 | List<SceneObjectPart> partList; | 1566 | List<SceneObjectPart> partList; |
1584 | 1567 | ||
1585 | lock (m_parts) | 1568 | lock (m_parts) |
@@ -1598,11 +1581,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
1598 | if (part.UUID != m_rootPart.UUID) | 1581 | if (part.UUID != m_rootPart.UUID) |
1599 | { | 1582 | { |
1600 | SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed); | 1583 | SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed); |
1601 | |||
1602 | newPart.LinkNum = part.LinkNum; | 1584 | newPart.LinkNum = part.LinkNum; |
1603 | } | 1585 | } |
1604 | } | ||
1605 | 1586 | ||
1587 | // Need to duplicate the physics actor as well | ||
1588 | if (part.PhysActor != null && userExposed) | ||
1589 | { | ||
1590 | PrimitiveBaseShape pbs = part.Shape; | ||
1591 | |||
1592 | part.PhysActor | ||
1593 | = m_scene.PhysicsScene.AddPrimShape( | ||
1594 | part.Name, | ||
1595 | pbs, | ||
1596 | part.AbsolutePosition, | ||
1597 | part.Scale, | ||
1598 | part.RotationOffset, | ||
1599 | part.PhysActor.IsPhysical); | ||
1600 | |||
1601 | part.PhysActor.LocalID = part.LocalId; | ||
1602 | part.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true); | ||
1603 | } | ||
1604 | } | ||
1605 | |||
1606 | if (userExposed) | 1606 | if (userExposed) |
1607 | { | 1607 | { |
1608 | dupe.UpdateParentIDs(); | 1608 | dupe.UpdateParentIDs(); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0c35eec..cf718cb 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -150,8 +150,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
150 | // TODO: This needs to be persisted in next XML version update! | 150 | // TODO: This needs to be persisted in next XML version update! |
151 | [XmlIgnore] | 151 | [XmlIgnore] |
152 | public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; | 152 | public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; |
153 | |||
153 | [XmlIgnore] | 154 | [XmlIgnore] |
154 | public PhysicsActor PhysActor; | 155 | public PhysicsActor PhysActor |
156 | { | ||
157 | get { return m_physActor; } | ||
158 | set | ||
159 | { | ||
160 | // m_log.DebugFormat("[SOP]: PhysActor set to {0} for {1} {2}", value, Name, UUID); | ||
161 | m_physActor = value; | ||
162 | } | ||
163 | } | ||
155 | 164 | ||
156 | //Xantor 20080528 Sound stuff: | 165 | //Xantor 20080528 Sound stuff: |
157 | // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. | 166 | // 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 | |||
297 | /// </summary> | 306 | /// </summary> |
298 | private byte m_updateFlag; | 307 | private byte m_updateFlag; |
299 | 308 | ||
309 | private PhysicsActor m_physActor; | ||
300 | protected Vector3 m_acceleration; | 310 | protected Vector3 m_acceleration; |
301 | protected Vector3 m_angularVelocity; | 311 | protected Vector3 m_angularVelocity; |
302 | 312 | ||
@@ -396,7 +406,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
396 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from | 406 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from |
397 | // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log | 407 | // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log |
398 | 408 | ||
399 | _flags = 0; | 409 | Flags = 0; |
400 | CreateSelected = true; | 410 | CreateSelected = true; |
401 | 411 | ||
402 | TrimPermissions(); | 412 | TrimPermissions(); |
@@ -424,7 +434,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
424 | private uint _groupMask = (uint)PermissionMask.None; | 434 | private uint _groupMask = (uint)PermissionMask.None; |
425 | private uint _everyoneMask = (uint)PermissionMask.None; | 435 | private uint _everyoneMask = (uint)PermissionMask.None; |
426 | private uint _nextOwnerMask = (uint)PermissionMask.All; | 436 | private uint _nextOwnerMask = (uint)PermissionMask.All; |
427 | private PrimFlags _flags = 0; | 437 | private PrimFlags _flags = PrimFlags.None; |
428 | private DateTime m_expires; | 438 | private DateTime m_expires; |
429 | private DateTime m_rezzed; | 439 | private DateTime m_rezzed; |
430 | private bool m_createSelected = false; | 440 | private bool m_createSelected = false; |
@@ -471,10 +481,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
471 | set { m_inventory.Items = value; } | 481 | set { m_inventory.Items = value; } |
472 | } | 482 | } |
473 | 483 | ||
484 | /// <summary> | ||
485 | /// This is idential to the Flags property, except that the returned value is uint rather than PrimFlags | ||
486 | /// </summary> | ||
487 | [Obsolete("Use Flags property instead")] | ||
474 | public uint ObjectFlags | 488 | public uint ObjectFlags |
475 | { | 489 | { |
476 | get { return (uint)_flags; } | 490 | get { return (uint)Flags; } |
477 | set { _flags = (PrimFlags)value; } | 491 | set { Flags = (PrimFlags)value; } |
478 | } | 492 | } |
479 | 493 | ||
480 | public UUID UUID | 494 | public UUID UUID |
@@ -1002,7 +1016,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1002 | public bool CreateSelected | 1016 | public bool CreateSelected |
1003 | { | 1017 | { |
1004 | get { return m_createSelected; } | 1018 | get { return m_createSelected; } |
1005 | set { m_createSelected = value; } | 1019 | set |
1020 | { | ||
1021 | // m_log.DebugFormat("[SOP]: Setting CreateSelected to {0} for {1} {2}", value, Name, UUID); | ||
1022 | m_createSelected = value; | ||
1023 | } | ||
1006 | } | 1024 | } |
1007 | 1025 | ||
1008 | #endregion | 1026 | #endregion |
@@ -1169,7 +1187,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1169 | public PrimFlags Flags | 1187 | public PrimFlags Flags |
1170 | { | 1188 | { |
1171 | get { return _flags; } | 1189 | get { return _flags; } |
1172 | set { _flags = value; } | 1190 | set |
1191 | { | ||
1192 | // m_log.DebugFormat("[SOP]: Setting flags for {0} {1} to {2}", UUID, Name, value); | ||
1193 | _flags = value; | ||
1194 | } | ||
1173 | } | 1195 | } |
1174 | 1196 | ||
1175 | [XmlIgnore] | 1197 | [XmlIgnore] |
@@ -1305,7 +1327,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1305 | if ((ObjectFlags & (uint) flag) == 0) | 1327 | if ((ObjectFlags & (uint) flag) == 0) |
1306 | { | 1328 | { |
1307 | //m_log.Debug("Adding flag: " + ((PrimFlags) flag).ToString()); | 1329 | //m_log.Debug("Adding flag: " + ((PrimFlags) flag).ToString()); |
1308 | _flags |= flag; | 1330 | Flags |= flag; |
1309 | 1331 | ||
1310 | if (flag == PrimFlags.TemporaryOnRez) | 1332 | if (flag == PrimFlags.TemporaryOnRez) |
1311 | ResetExpire(); | 1333 | ResetExpire(); |
@@ -1523,7 +1545,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1523 | } | 1545 | } |
1524 | else | 1546 | else |
1525 | { | 1547 | { |
1526 | m_log.DebugFormat("[SPEW]: physics actor is null for {0} with parent {1}", UUID, this.ParentGroup.UUID); | 1548 | m_log.DebugFormat("[SOP]: physics actor is null for {0} with parent {1}", UUID, this.ParentGroup.UUID); |
1527 | } | 1549 | } |
1528 | } | 1550 | } |
1529 | } | 1551 | } |
@@ -1793,7 +1815,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1793 | /// that's not wholesome. Had to make Scene public | 1815 | /// that's not wholesome. Had to make Scene public |
1794 | //PhysActor = null; | 1816 | //PhysActor = null; |
1795 | 1817 | ||
1796 | if ((ObjectFlags & (uint)PrimFlags.Phantom) == 0) | 1818 | if ((Flags & PrimFlags.Phantom) == 0) |
1797 | { | 1819 | { |
1798 | if (UsePhysics) | 1820 | if (UsePhysics) |
1799 | { | 1821 | { |
@@ -1940,12 +1962,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1940 | } | 1962 | } |
1941 | 1963 | ||
1942 | public uint GetEffectiveObjectFlags() | 1964 | public uint GetEffectiveObjectFlags() |
1943 | { | 1965 | { |
1944 | PrimFlags f = _flags; | 1966 | // Commenting this section of code out since it doesn't actually do anything, as enums are handled by |
1945 | if (m_parentGroup == null || m_parentGroup.RootPart == this) | 1967 | // value rather than reference |
1946 | f &= ~(PrimFlags.Touch | PrimFlags.Money); | 1968 | // PrimFlags f = _flags; |
1969 | // if (m_parentGroup == null || m_parentGroup.RootPart == this) | ||
1970 | // f &= ~(PrimFlags.Touch | PrimFlags.Money); | ||
1947 | 1971 | ||
1948 | return (uint)_flags | (uint)LocalFlags; | 1972 | return (uint)Flags | (uint)LocalFlags; |
1949 | } | 1973 | } |
1950 | 1974 | ||
1951 | public Vector3 GetGeometricCenter() | 1975 | public Vector3 GetGeometricCenter() |
@@ -2696,10 +2720,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2696 | public void RemFlag(PrimFlags flag) | 2720 | public void RemFlag(PrimFlags flag) |
2697 | { | 2721 | { |
2698 | // PrimFlags prevflag = Flags; | 2722 | // PrimFlags prevflag = Flags; |
2699 | if ((ObjectFlags & (uint) flag) != 0) | 2723 | if ((Flags & flag) != 0) |
2700 | { | 2724 | { |
2701 | //m_log.Debug("Removing flag: " + ((PrimFlags)flag).ToString()); | 2725 | //m_log.Debug("Removing flag: " + ((PrimFlags)flag).ToString()); |
2702 | _flags &= ~flag; | 2726 | Flags &= ~flag; |
2703 | } | 2727 | } |
2704 | //m_log.Debug("prev: " + prevflag.ToString() + " curr: " + Flags.ToString()); | 2728 | //m_log.Debug("prev: " + prevflag.ToString() + " curr: " + Flags.ToString()); |
2705 | //ScheduleFullUpdate(); | 2729 | //ScheduleFullUpdate(); |
@@ -2990,10 +3014,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2990 | 3014 | ||
2991 | if (remoteClient.AgentId == _ownerID) | 3015 | if (remoteClient.AgentId == _ownerID) |
2992 | { | 3016 | { |
2993 | if ((uint) (_flags & PrimFlags.CreateSelected) != 0) | 3017 | if ((Flags & PrimFlags.CreateSelected) != 0) |
2994 | { | 3018 | { |
2995 | clientFlags |= (uint) PrimFlags.CreateSelected; | 3019 | clientFlags |= (uint) PrimFlags.CreateSelected; |
2996 | _flags &= ~PrimFlags.CreateSelected; | 3020 | Flags &= ~PrimFlags.CreateSelected; |
2997 | } | 3021 | } |
2998 | } | 3022 | } |
2999 | //bool isattachment = IsAttachment; | 3023 | //bool isattachment = IsAttachment; |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs index 8a103d7..c9662ef 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/SceneGraphTests.cs | |||
@@ -48,24 +48,42 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
48 | TestHelper.InMethod(); | 48 | TestHelper.InMethod(); |
49 | Scene scene = SceneSetupHelpers.SetupScene(); | 49 | Scene scene = SceneSetupHelpers.SetupScene(); |
50 | 50 | ||
51 | UUID ownerUuid = new UUID("00000000-0000-0000-0000-000000000010"); | 51 | UUID ownerId = new UUID("00000000-0000-0000-0000-000000000010"); |
52 | string objName = "obj1"; | 52 | string part1Name = "part1"; |
53 | UUID objUuid = new UUID("00000000-0000-0000-0000-000000000001"); | 53 | UUID part1Id = new UUID("00000000-0000-0000-0000-000000000001"); |
54 | string part2Name = "part2"; | ||
55 | UUID part2Id = new UUID("00000000-0000-0000-0000-000000000002"); | ||
54 | 56 | ||
55 | SceneObjectPart part | 57 | SceneObjectPart part1 |
56 | = new SceneObjectPart(ownerUuid, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) | 58 | = new SceneObjectPart(ownerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) |
57 | { Name = objName, UUID = objUuid }; | 59 | { Name = part1Name, UUID = part1Id }; |
60 | SceneObjectGroup so = new SceneObjectGroup(part1); | ||
61 | SceneObjectPart part2 | ||
62 | = new SceneObjectPart(ownerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero) | ||
63 | { Name = part2Name, UUID = part2Id }; | ||
64 | so.AddPart(part2); | ||
58 | 65 | ||
59 | scene.AddNewSceneObject(new SceneObjectGroup(part), false); | 66 | scene.AddNewSceneObject(so, false); |
60 | 67 | ||
61 | SceneObjectGroup duplicatedSo | 68 | SceneObjectGroup dupeSo |
62 | = scene.SceneGraph.DuplicateObject( | 69 | = scene.SceneGraph.DuplicateObject( |
63 | part.LocalId, new Vector3(10, 0, 0), 0, ownerUuid, UUID.Zero, Quaternion.Identity); | 70 | part1.LocalId, new Vector3(10, 0, 0), 0, ownerId, UUID.Zero, Quaternion.Identity); |
71 | Assert.That(dupeSo.Children.Count, Is.EqualTo(2)); | ||
64 | 72 | ||
65 | Assert.That(duplicatedSo.Children.Count, Is.EqualTo(1)); | 73 | SceneObjectPart dupePart1 = dupeSo.GetLinkNumPart(1); |
66 | Assert.That(duplicatedSo.RootPart.LocalId, Is.Not.EqualTo(part.LocalId)); | 74 | SceneObjectPart dupePart2 = dupeSo.GetLinkNumPart(2); |
75 | Assert.That(dupePart1.LocalId, Is.Not.EqualTo(part1.LocalId)); | ||
76 | Assert.That(dupePart2.LocalId, Is.Not.EqualTo(part2.LocalId)); | ||
67 | 77 | ||
68 | //SceneObjectPart retrievedPart = scene.GetSceneObjectPart(objUuid); | 78 | Assert.That(dupePart1.Flags, Is.EqualTo(part1.Flags)); |
79 | Assert.That(dupePart2.Flags, Is.EqualTo(part2.Flags)); | ||
80 | |||
81 | /* | ||
82 | Assert.That(part1.PhysActor, Is.Not.Null); | ||
83 | Assert.That(part2.PhysActor, Is.Not.Null); | ||
84 | Assert.That(dupePart1.PhysActor, Is.Not.Null); | ||
85 | Assert.That(dupePart2.PhysActor, Is.Not.Null); | ||
86 | */ | ||
69 | } | 87 | } |
70 | } | 88 | } |
71 | } \ No newline at end of file | 89 | } \ No newline at end of file |