diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
4 files changed, 109 insertions, 26 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 36d46b8..cf68ff4 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -149,27 +149,47 @@ namespace OpenSim.Region.Framework.Scenes | |||
149 | /// <param name="remoteClient"></param> | 149 | /// <param name="remoteClient"></param> |
150 | public void SelectPrim(uint primLocalID, IClientAPI remoteClient) | 150 | public void SelectPrim(uint primLocalID, IClientAPI remoteClient) |
151 | { | 151 | { |
152 | /* | ||
153 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | ||
154 | |||
155 | if (null == part) | ||
156 | return; | ||
157 | |||
158 | if (part.IsRoot) | ||
159 | { | ||
160 | SceneObjectGroup sog = part.ParentGroup; | ||
161 | sog.SendPropertiesToClient(remoteClient); | ||
162 | |||
163 | // A prim is only tainted if it's allowed to be edited by the person clicking it. | ||
164 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) | ||
165 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) | ||
166 | { | ||
167 | sog.IsSelected = true; | ||
168 | EventManager.TriggerParcelPrimCountTainted(); | ||
169 | } | ||
170 | } | ||
171 | else | ||
172 | { | ||
173 | part.SendPropertiesToClient(remoteClient); | ||
174 | } | ||
175 | */ | ||
152 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | 176 | SceneObjectPart part = GetSceneObjectPart(primLocalID); |
153 | 177 | ||
154 | if (null == part) | 178 | if (null == part) |
155 | return; | 179 | return; |
156 | 180 | ||
157 | if (part.IsRoot) | 181 | SceneObjectGroup sog = part.ParentGroup; |
158 | { | 182 | if (sog == null) |
159 | SceneObjectGroup sog = part.ParentGroup; | 183 | return; |
160 | sog.SendPropertiesToClient(remoteClient); | ||
161 | 184 | ||
162 | // A prim is only tainted if it's allowed to be edited by the person clicking it. | 185 | part.SendPropertiesToClient(remoteClient); |
163 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) | 186 | |
164 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) | 187 | // A prim is only tainted if it's allowed to be edited by the person clicking it. |
165 | { | 188 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) |
166 | sog.IsSelected = true; | 189 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) |
167 | EventManager.TriggerParcelPrimCountTainted(); | ||
168 | } | ||
169 | } | ||
170 | else | ||
171 | { | 190 | { |
172 | part.SendPropertiesToClient(remoteClient); | 191 | part.IsSelected = true; |
192 | EventManager.TriggerParcelPrimCountTainted(); | ||
173 | } | 193 | } |
174 | } | 194 | } |
175 | 195 | ||
@@ -222,7 +242,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
222 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | 242 | SceneObjectPart part = GetSceneObjectPart(primLocalID); |
223 | if (part == null) | 243 | if (part == null) |
224 | return; | 244 | return; |
225 | 245 | /* | |
226 | // A deselect packet contains all the local prims being deselected. However, since selection is still | 246 | // A deselect packet contains all the local prims being deselected. However, since selection is still |
227 | // group based we only want the root prim to trigger a full update - otherwise on objects with many prims | 247 | // group based we only want the root prim to trigger a full update - otherwise on objects with many prims |
228 | // we end up sending many duplicate ObjectUpdates | 248 | // we end up sending many duplicate ObjectUpdates |
@@ -257,6 +277,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
257 | part.UUID, remoteClient.AgentId)) | 277 | part.UUID, remoteClient.AgentId)) |
258 | EventManager.TriggerParcelPrimCountTainted(); | 278 | EventManager.TriggerParcelPrimCountTainted(); |
259 | } | 279 | } |
280 | */ | ||
281 | |||
282 | bool oldgprSelect = part.ParentGroup.IsSelected; | ||
283 | |||
284 | // This is wrong, wrong, wrong. Selection should not be | ||
285 | // handled by group, but by prim. Legacy cruft. | ||
286 | // TODO: Make selection flagging per prim! | ||
287 | // | ||
288 | if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId) | ||
289 | || Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId)) | ||
290 | { | ||
291 | part.IsSelected = false; | ||
292 | if (!part.ParentGroup.IsAttachment && oldgprSelect != part.ParentGroup.IsSelected) | ||
293 | EventManager.TriggerParcelPrimCountTainted(); | ||
294 | } | ||
295 | |||
260 | } | 296 | } |
261 | 297 | ||
262 | public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount, | 298 | public virtual void ProcessMoneyTransferRequest(UUID source, UUID destination, int amount, |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 8717ed1..c47db97 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -726,6 +726,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
726 | m_isSelected = value; | 726 | m_isSelected = value; |
727 | // Tell physics engine that group is selected | 727 | // Tell physics engine that group is selected |
728 | 728 | ||
729 | // this is not right | ||
730 | // but ode engines should only really need to know about root part | ||
731 | // so they can put entire object simulation on hold and not colliding | ||
732 | // keep as was for now | ||
733 | |||
729 | PhysicsActor pa = m_rootPart.PhysActor; | 734 | PhysicsActor pa = m_rootPart.PhysActor; |
730 | if (pa != null) | 735 | if (pa != null) |
731 | { | 736 | { |
@@ -747,6 +752,40 @@ namespace OpenSim.Region.Framework.Scenes | |||
747 | } | 752 | } |
748 | } | 753 | } |
749 | 754 | ||
755 | public void PartSelectChanged(bool partSelect) | ||
756 | { | ||
757 | // any part selected makes group selected | ||
758 | if (m_isSelected == partSelect) | ||
759 | return; | ||
760 | |||
761 | if (partSelect) | ||
762 | { | ||
763 | IsSelected = partSelect; | ||
764 | // if (!IsAttachment) | ||
765 | // ScheduleGroupForFullUpdate(); | ||
766 | } | ||
767 | else | ||
768 | { | ||
769 | // bad bad bad 2 heavy for large linksets | ||
770 | // since viewer does send lot of (un)selects | ||
771 | // this needs to be replaced by a specific list or count ? | ||
772 | // but that will require extra code in several places | ||
773 | |||
774 | SceneObjectPart[] parts = m_parts.GetArray(); | ||
775 | for (int i = 0; i < parts.Length; i++) | ||
776 | { | ||
777 | SceneObjectPart part = parts[i]; | ||
778 | if (part.IsSelected) | ||
779 | return; | ||
780 | } | ||
781 | IsSelected = partSelect; | ||
782 | if (!IsAttachment) | ||
783 | { | ||
784 | ScheduleGroupForFullUpdate(); | ||
785 | } | ||
786 | } | ||
787 | } | ||
788 | |||
750 | private SceneObjectPart m_PlaySoundMasterPrim = null; | 789 | private SceneObjectPart m_PlaySoundMasterPrim = null; |
751 | public SceneObjectPart PlaySoundMasterPrim | 790 | public SceneObjectPart PlaySoundMasterPrim |
752 | { | 791 | { |
@@ -3161,14 +3200,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3161 | } | 3200 | } |
3162 | } | 3201 | } |
3163 | 3202 | ||
3164 | /* | ||
3165 | RootPart.UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect); | ||
3166 | for (int i = 0; i < parts.Length; i++) | ||
3167 | { | ||
3168 | if (parts[i] != RootPart) | ||
3169 | parts[i].UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect); | ||
3170 | } | ||
3171 | */ | ||
3172 | if (parts.Length > 1) | 3203 | if (parts.Length > 1) |
3173 | { | 3204 | { |
3174 | m_rootPart.UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect, true); | 3205 | m_rootPart.UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect, true); |
@@ -3185,7 +3216,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3185 | } | 3216 | } |
3186 | else | 3217 | else |
3187 | m_rootPart.UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect, false); | 3218 | m_rootPart.UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect, false); |
3188 | |||
3189 | } | 3219 | } |
3190 | } | 3220 | } |
3191 | 3221 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0f7959d..37b5554 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -304,6 +304,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
304 | protected float m_friction = 0.6f; // wood | 304 | protected float m_friction = 0.6f; // wood |
305 | protected float m_bounce = 0.5f; // wood | 305 | protected float m_bounce = 0.5f; // wood |
306 | 306 | ||
307 | |||
308 | protected bool m_isSelected = false; | ||
309 | |||
307 | /// <summary> | 310 | /// <summary> |
308 | /// Stores media texture data | 311 | /// Stores media texture data |
309 | /// </summary> | 312 | /// </summary> |
@@ -577,6 +580,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
577 | } | 580 | } |
578 | } | 581 | } |
579 | 582 | ||
583 | public bool IsSelected | ||
584 | { | ||
585 | get { return m_isSelected; } | ||
586 | set | ||
587 | { | ||
588 | m_isSelected = value; | ||
589 | if (ParentGroup != null) | ||
590 | ParentGroup.PartSelectChanged(value); | ||
591 | } | ||
592 | } | ||
580 | 593 | ||
581 | 594 | ||
582 | public Dictionary<int, string> CollisionFilter | 595 | public Dictionary<int, string> CollisionFilter |
@@ -1907,6 +1920,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1907 | dupe.m_rezzed = m_rezzed; | 1920 | dupe.m_rezzed = m_rezzed; |
1908 | 1921 | ||
1909 | dupe.m_UndoRedo = null; | 1922 | dupe.m_UndoRedo = null; |
1923 | dupe.m_isSelected = false; | ||
1910 | 1924 | ||
1911 | dupe.IgnoreUndoUpdate = false; | 1925 | dupe.IgnoreUndoUpdate = false; |
1912 | dupe.Undoing = false; | 1926 | dupe.Undoing = false; |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index ac791ae..f3f03f5 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -753,9 +753,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
753 | if (m_movementAnimationUpdateCounter >= 2) | 753 | if (m_movementAnimationUpdateCounter >= 2) |
754 | { | 754 | { |
755 | m_movementAnimationUpdateCounter = 0; | 755 | m_movementAnimationUpdateCounter = 0; |
756 | if (Animator != null && ParentID == 0) // skip it if sitting | 756 | if (Animator != null) |
757 | { | 757 | { |
758 | Animator.UpdateMovementAnimations(); | 758 | if(ParentID == 0) // skip it if sitting |
759 | Animator.UpdateMovementAnimations(); | ||
759 | } | 760 | } |
760 | else | 761 | else |
761 | { | 762 | { |
@@ -1400,6 +1401,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1400 | { | 1401 | { |
1401 | // Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT; | 1402 | // Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT; |
1402 | // m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback); | 1403 | // m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback); |
1404 | |||
1403 | Vector3 posAdjusted = AbsolutePosition + HEAD_ADJUSTMENT; | 1405 | Vector3 posAdjusted = AbsolutePosition + HEAD_ADJUSTMENT; |
1404 | Vector3 distTocam = CameraPosition - posAdjusted; | 1406 | Vector3 distTocam = CameraPosition - posAdjusted; |
1405 | float distTocamlen = distTocam.Length(); | 1407 | float distTocamlen = distTocam.Length(); |
@@ -1408,6 +1410,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1408 | distTocam *= 1.0f / distTocamlen; | 1410 | distTocam *= 1.0f / distTocamlen; |
1409 | m_scene.PhysicsScene.RaycastWorld(posAdjusted, distTocam, distTocamlen + 0.3f, RayCastCameraCallback); | 1411 | m_scene.PhysicsScene.RaycastWorld(posAdjusted, distTocam, distTocamlen + 0.3f, RayCastCameraCallback); |
1410 | } | 1412 | } |
1413 | |||
1411 | } | 1414 | } |
1412 | } | 1415 | } |
1413 | 1416 | ||