diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 785ebf7..10395b6 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -207,7 +207,14 @@ namespace OpenSim.Region.Environment.Scenes | |||
207 | public bool IsSelected | 207 | public bool IsSelected |
208 | { | 208 | { |
209 | get { return m_isSelected; } | 209 | get { return m_isSelected; } |
210 | set { m_isSelected = value; } | 210 | set { |
211 | m_isSelected = value; | ||
212 | // Tell physics engine that group is selected | ||
213 | if (m_rootPart.PhysActor != null) | ||
214 | { | ||
215 | m_rootPart.PhysActor.Selected = value; | ||
216 | } | ||
217 | } | ||
211 | } | 218 | } |
212 | 219 | ||
213 | // The UUID for the Region this Object is in. | 220 | // The UUID for the Region this Object is in. |
@@ -1039,20 +1046,45 @@ namespace OpenSim.Region.Environment.Scenes | |||
1039 | } | 1046 | } |
1040 | 1047 | ||
1041 | /// <summary> | 1048 | /// <summary> |
1042 | /// | 1049 | /// If object is physical, apply force to move it around |
1050 | /// If object is not physical, just put it at the resulting location | ||
1043 | /// </summary> | 1051 | /// </summary> |
1044 | /// <param name="offset"></param> | 1052 | /// <param name="offset">Always seems to be 0,0,0, so ignoring</param> |
1045 | /// <param name="pos"></param> | 1053 | /// <param name="pos">New position. We do the math here to turn it into a force</param> |
1046 | /// <param name="remoteClient"></param> | 1054 | /// <param name="remoteClient"></param> |
1047 | public void GrabMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient) | 1055 | public void GrabMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient) |
1048 | { | 1056 | { |
1057 | |||
1049 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) | 1058 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) |
1050 | { | 1059 | { |
1051 | AbsolutePosition = pos; | 1060 | |
1052 | m_rootPart.SendTerseUpdateToAllClients(); | 1061 | if (m_rootPart.PhysActor != null) |
1062 | { | ||
1063 | if (m_rootPart.PhysActor.IsPhysical) | ||
1064 | { | ||
1065 | LLVector3 llmoveforce = pos - AbsolutePosition; | ||
1066 | PhysicsVector grabforce = new PhysicsVector(llmoveforce.X, llmoveforce.Y, llmoveforce.Z); | ||
1067 | grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; | ||
1068 | m_rootPart.PhysActor.AddForce(grabforce); | ||
1069 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | ||
1070 | } | ||
1071 | else | ||
1072 | { | ||
1073 | NonPhysicalGrabMovement(pos); | ||
1074 | } | ||
1075 | } | ||
1076 | else | ||
1077 | { | ||
1078 | NonPhysicalGrabMovement(pos); | ||
1079 | } | ||
1053 | } | 1080 | } |
1054 | } | 1081 | } |
1082 | public void NonPhysicalGrabMovement(LLVector3 pos) | ||
1083 | { | ||
1084 | AbsolutePosition = pos; | ||
1085 | m_rootPart.SendTerseUpdateToAllClients(); | ||
1055 | 1086 | ||
1087 | } | ||
1056 | /// <summary> | 1088 | /// <summary> |
1057 | /// | 1089 | /// |
1058 | /// </summary> | 1090 | /// </summary> |