diff options
6 files changed, 124 insertions, 15 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 2c7cd40..ea6174a 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -701,22 +701,31 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
701 | sp.RemoveAttachment(so); | 701 | sp.RemoveAttachment(so); |
702 | so.FromItemID = UUID.Zero; | 702 | so.FromItemID = UUID.Zero; |
703 | 703 | ||
704 | so.AttachedAvatar = UUID.Zero; | ||
705 | so.ClearPartAttachmentData(); | ||
706 | |||
704 | SceneObjectPart rootPart = so.RootPart; | 707 | SceneObjectPart rootPart = so.RootPart; |
708 | |||
709 | rootPart.SetParentLocalId(0); | ||
705 | so.AbsolutePosition = absolutePos; | 710 | so.AbsolutePosition = absolutePos; |
706 | if (absoluteRot != Quaternion.Identity) | 711 | if (absoluteRot != Quaternion.Identity) |
707 | { | 712 | { |
708 | so.UpdateGroupRotationR(absoluteRot); | 713 | so.UpdateGroupRotationR(absoluteRot); |
709 | } | 714 | } |
710 | so.AttachedAvatar = UUID.Zero; | 715 | |
711 | rootPart.SetParentLocalId(0); | 716 | // rootPart.RemFlag(PrimFlags.TemporaryOnRez); |
712 | so.ClearPartAttachmentData(); | 717 | // rootPart.AddFlag(PrimFlags.Phantom); |
713 | rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive,false); | 718 | |
719 | // rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive,false); | ||
720 | |||
721 | // not physical, not temporary, phaton, not volume detector | ||
722 | so.UpdatePrimFlags(rootPart.LocalId,false,false,true,rootPart.VolumeDetectActive); | ||
723 | |||
714 | so.HasGroupChanged = true; | 724 | so.HasGroupChanged = true; |
715 | rootPart.Rezzed = DateTime.Now; | 725 | rootPart.Rezzed = DateTime.Now; |
716 | rootPart.RemFlag(PrimFlags.TemporaryOnRez); | ||
717 | so.AttachToBackup(); | 726 | so.AttachToBackup(); |
718 | m_scene.EventManager.TriggerParcelPrimCountTainted(); | 727 | m_scene.EventManager.TriggerParcelPrimCountTainted(); |
719 | rootPart.ScheduleFullUpdate(); | 728 | |
720 | rootPart.ClearUndoState(); | 729 | rootPart.ClearUndoState(); |
721 | 730 | ||
722 | List<UUID> uuids = new List<UUID>(); | 731 | List<UUID> uuids = new List<UUID>(); |
@@ -729,6 +738,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
729 | 738 | ||
730 | // Attach (NULL) stops scripts. We don't want that. Resume them. | 739 | // Attach (NULL) stops scripts. We don't want that. Resume them. |
731 | so.ResumeScripts(); | 740 | so.ResumeScripts(); |
741 | so.ScheduleGroupForTerseUpdate(); | ||
742 | so.RootPart.ScheduleFullUpdate(); | ||
732 | } | 743 | } |
733 | 744 | ||
734 | public void DetachSingleAttachmentToInv(IScenePresence sp, SceneObjectGroup so) | 745 | public void DetachSingleAttachmentToInv(IScenePresence sp, SceneObjectGroup so) |
@@ -907,8 +918,31 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
907 | 918 | ||
908 | so.AttachedAvatar = sp.UUID; | 919 | so.AttachedAvatar = sp.UUID; |
909 | 920 | ||
910 | if (so.RootPart.PhysActor != null) | 921 | // if (so.RootPart.PhysActor != null) |
911 | so.RootPart.RemoveFromPhysics(); | 922 | // so.RootPart.RemoveFromPhysics(); |
923 | |||
924 | foreach (SceneObjectPart part in so.Parts) | ||
925 | { | ||
926 | if (part.KeyframeMotion != null) | ||
927 | { | ||
928 | part.KeyframeMotion.Delete(); | ||
929 | part.KeyframeMotion = null; | ||
930 | } | ||
931 | |||
932 | // if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0)) | ||
933 | // { | ||
934 | // PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? | ||
935 | // } | ||
936 | // else | ||
937 | if (part.PhysActor != null) | ||
938 | { | ||
939 | if(part.PhysActor.IsPhysical) | ||
940 | so.Scene.RemovePhysicalPrim(1); | ||
941 | part.RemoveFromPhysics(); | ||
942 | } | ||
943 | } | ||
944 | |||
945 | so.RootPart.Flags &= ~PrimFlags.Physics; | ||
912 | 946 | ||
913 | so.AbsolutePosition = attachOffset; | 947 | so.AbsolutePosition = attachOffset; |
914 | so.RootPart.AttachedPos = attachOffset; | 948 | so.RootPart.AttachedPos = attachOffset; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 8634a3a..e003a59 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -2705,12 +2705,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
2705 | return; | 2705 | return; |
2706 | } | 2706 | } |
2707 | 2707 | ||
2708 | bool oldUsePhysics = (root.Flags & PrimFlags.Physics) != 0; | ||
2708 | m_sceneGraph.LinkObjects(root, children); | 2709 | m_sceneGraph.LinkObjects(root, children); |
2709 | 2710 | ||
2710 | ScenePresence sp; | 2711 | ScenePresence sp; |
2711 | if (TryGetScenePresence(agentId, out sp)) | 2712 | if (TryGetScenePresence(agentId, out sp)) |
2712 | { | 2713 | { |
2713 | root.SendPropertiesToClient(sp.ControllingClient); | 2714 | root.SendPropertiesToClient(sp.ControllingClient); |
2715 | if (oldUsePhysics && (root.Flags & PrimFlags.Physics) == 0) | ||
2716 | { | ||
2717 | sp.ControllingClient.SendAlertMessage("Object physics canceled"); | ||
2718 | } | ||
2714 | } | 2719 | } |
2715 | } | 2720 | } |
2716 | 2721 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index aa81000..323b588 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -204,6 +204,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
204 | /// </summary> | 204 | /// </summary> |
205 | public int m_linksetCapacity = 0; | 205 | public int m_linksetCapacity = 0; |
206 | 206 | ||
207 | /// <summary> | ||
208 | /// Max prims an Physical object will hold | ||
209 | /// </summary> | ||
210 | /// | ||
211 | public int m_linksetPhysCapacity = 5; | ||
212 | |||
207 | public bool m_clampPrimSize; | 213 | public bool m_clampPrimSize; |
208 | public bool m_trustBinaries; | 214 | public bool m_trustBinaries; |
209 | public bool m_allowScriptCrossings; | 215 | public bool m_allowScriptCrossings; |
@@ -901,6 +907,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
901 | m_linksetCapacity = RegionInfo.LinksetCapacity; | 907 | m_linksetCapacity = RegionInfo.LinksetCapacity; |
902 | } | 908 | } |
903 | 909 | ||
910 | m_linksetPhysCapacity = startupConfig.GetInt("LinksetPhysPrims", m_linksetPhysCapacity); | ||
911 | |||
912 | |||
904 | SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest"); | 913 | SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest"); |
905 | TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false); | 914 | TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false); |
906 | 915 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index b0f8991..973891b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -1547,6 +1547,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1547 | // VolumeDetect can't be set via UI and will always be off when a change is made there | 1547 | // VolumeDetect can't be set via UI and will always be off when a change is made there |
1548 | // now only change volume dtc if phantom off | 1548 | // now only change volume dtc if phantom off |
1549 | 1549 | ||
1550 | bool wantedPhys = UsePhysics; | ||
1550 | if (PhysData.PhysShapeType == PhysShapeType.invalid) // check for extraPhysics data | 1551 | if (PhysData.PhysShapeType == PhysShapeType.invalid) // check for extraPhysics data |
1551 | { | 1552 | { |
1552 | bool vdtc; | 1553 | bool vdtc; |
@@ -1563,10 +1564,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1563 | if (part != null) | 1564 | if (part != null) |
1564 | { | 1565 | { |
1565 | part.UpdateExtraPhysics(PhysData); | 1566 | part.UpdateExtraPhysics(PhysData); |
1566 | if (part.UpdatePhysRequired) | 1567 | if (part.UpdatePhysRequired && remoteClient != null) |
1567 | remoteClient.SendPartPhysicsProprieties(part); | 1568 | remoteClient.SendPartPhysicsProprieties(part); |
1568 | } | 1569 | } |
1569 | } | 1570 | } |
1571 | |||
1572 | if (wantedPhys != group.UsesPhysics && remoteClient != null) | ||
1573 | { | ||
1574 | remoteClient.SendAlertMessage("Object physics canceled because exceeds the limit of " + | ||
1575 | m_parentScene.m_linksetPhysCapacity + " physical prims with shape type not set to None"); | ||
1576 | group.RootPart.ScheduleFullUpdate(); | ||
1577 | } | ||
1570 | } | 1578 | } |
1571 | } | 1579 | } |
1572 | } | 1580 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index d3dd5d7..15349e3 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -907,10 +907,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
907 | return; | 907 | return; |
908 | } | 908 | } |
909 | IsSelected = partSelect; | 909 | IsSelected = partSelect; |
910 | if (!IsAttachment) | 910 | // if (!IsAttachment) |
911 | { | 911 | // { |
912 | ScheduleGroupForFullUpdate(); | 912 | // ScheduleGroupForFullUpdate(); |
913 | } | 913 | // } |
914 | } | 914 | } |
915 | } | 915 | } |
916 | // PlaySoundMasterPrim no longer in use to remove | 916 | // PlaySoundMasterPrim no longer in use to remove |
@@ -1712,7 +1712,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1712 | m_rootPart.SetParentLocalId(0); | 1712 | m_rootPart.SetParentLocalId(0); |
1713 | AttachmentPoint = (byte)0; | 1713 | AttachmentPoint = (byte)0; |
1714 | // must check if buildind should be true or false here | 1714 | // must check if buildind should be true or false here |
1715 | m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive,false); | 1715 | // m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive,false); |
1716 | ApplyPhysics(); | ||
1717 | |||
1716 | HasGroupChanged = true; | 1718 | HasGroupChanged = true; |
1717 | RootPart.Rezzed = DateTime.Now; | 1719 | RootPart.Rezzed = DateTime.Now; |
1718 | RootPart.RemFlag(PrimFlags.TemporaryOnRez); | 1720 | RootPart.RemFlag(PrimFlags.TemporaryOnRez); |
@@ -2879,6 +2881,33 @@ namespace OpenSim.Region.Framework.Scenes | |||
2879 | return; | 2881 | return; |
2880 | } | 2882 | } |
2881 | 2883 | ||
2884 | // physical prims count limit | ||
2885 | // not very eficient :( | ||
2886 | |||
2887 | if (UsesPhysics && m_scene.m_linksetPhysCapacity > 0 && (PrimCount + objectGroup.PrimCount) > | ||
2888 | m_scene.m_linksetPhysCapacity) | ||
2889 | { | ||
2890 | int cntr = 0; | ||
2891 | foreach (SceneObjectPart part in Parts) | ||
2892 | { | ||
2893 | if (part.PhysicsShapeType != (byte)PhysicsShapeType.None) | ||
2894 | cntr++; | ||
2895 | } | ||
2896 | foreach (SceneObjectPart part in objectGroup.Parts) | ||
2897 | { | ||
2898 | if (part.PhysicsShapeType != (byte)PhysicsShapeType.None) | ||
2899 | cntr++; | ||
2900 | } | ||
2901 | |||
2902 | if (cntr > m_scene.m_linksetPhysCapacity) | ||
2903 | { | ||
2904 | // cancel physics | ||
2905 | RootPart.Flags &= ~PrimFlags.Physics; | ||
2906 | ApplyPhysics(); | ||
2907 | } | ||
2908 | } | ||
2909 | |||
2910 | |||
2882 | // 'linkPart' == the root of the group being linked into this group | 2911 | // 'linkPart' == the root of the group being linked into this group |
2883 | SceneObjectPart linkPart = objectGroup.m_rootPart; | 2912 | SceneObjectPart linkPart = objectGroup.m_rootPart; |
2884 | 2913 | ||
@@ -3477,8 +3506,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3477 | { | 3506 | { |
3478 | SceneObjectPart[] parts = m_parts.GetArray(); | 3507 | SceneObjectPart[] parts = m_parts.GetArray(); |
3479 | 3508 | ||
3480 | if (Scene != null) | 3509 | if (Scene != null && UsePhysics) |
3481 | { | 3510 | { |
3511 | int maxprims = m_scene.m_linksetPhysCapacity; | ||
3512 | bool checkShape = (maxprims > 0 && | ||
3513 | parts.Length > maxprims); | ||
3514 | |||
3482 | for (int i = 0; i < parts.Length; i++) | 3515 | for (int i = 0; i < parts.Length; i++) |
3483 | { | 3516 | { |
3484 | SceneObjectPart part = parts[i]; | 3517 | SceneObjectPart part = parts[i]; |
@@ -3489,6 +3522,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
3489 | UsePhysics = false; // Reset physics | 3522 | UsePhysics = false; // Reset physics |
3490 | break; | 3523 | break; |
3491 | } | 3524 | } |
3525 | |||
3526 | if (checkShape && part.PhysicsShapeType != (byte)PhysicsShapeType.None) | ||
3527 | { | ||
3528 | if (--maxprims < 0) | ||
3529 | { | ||
3530 | UsePhysics = false; | ||
3531 | break; | ||
3532 | } | ||
3533 | } | ||
3492 | } | 3534 | } |
3493 | } | 3535 | } |
3494 | 3536 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index f4809a7..1fb4c1b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -1400,6 +1400,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1400 | SceneObjectGroup group = m_host.ParentGroup; | 1400 | SceneObjectGroup group = m_host.ParentGroup; |
1401 | bool allow = true; | 1401 | bool allow = true; |
1402 | 1402 | ||
1403 | int maxprims = World.m_linksetPhysCapacity; | ||
1404 | bool checkShape = (maxprims > 0 && group.PrimCount > maxprims); | ||
1405 | |||
1403 | foreach (SceneObjectPart part in group.Parts) | 1406 | foreach (SceneObjectPart part in group.Parts) |
1404 | { | 1407 | { |
1405 | if (part.Scale.X > World.m_maxPhys || part.Scale.Y > World.m_maxPhys || part.Scale.Z > World.m_maxPhys) | 1408 | if (part.Scale.X > World.m_maxPhys || part.Scale.Y > World.m_maxPhys || part.Scale.Z > World.m_maxPhys) |
@@ -1407,6 +1410,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1407 | allow = false; | 1410 | allow = false; |
1408 | break; | 1411 | break; |
1409 | } | 1412 | } |
1413 | if (checkShape && part.PhysicsShapeType != (byte)PhysicsShapeType.None) | ||
1414 | { | ||
1415 | if (--maxprims < 0) | ||
1416 | { | ||
1417 | allow = false; | ||
1418 | break; | ||
1419 | } | ||
1420 | } | ||
1410 | } | 1421 | } |
1411 | 1422 | ||
1412 | if (!allow) | 1423 | if (!allow) |