aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs24
1 files changed, 20 insertions, 4 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 468e2d0..60ea480 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -153,6 +153,11 @@ namespace OpenSim.Region.Environment.Scenes
153 //unkown if this will be kept, added as a way of removing the group position from the group class 153 //unkown if this will be kept, added as a way of removing the group position from the group class
154 protected LLVector3 m_groupPosition; 154 protected LLVector3 m_groupPosition;
155 155
156 /// <summary>
157 /// Method for a prim to get it's world position from the group.
158 /// Remember, the Group Position simply gives the position of the group itself
159 /// </summary>
160 /// <returns>A Linked Child Prim objects position in world</returns>
156 public LLVector3 GetWorldPosition() 161 public LLVector3 GetWorldPosition()
157 { 162 {
158 163
@@ -175,6 +180,10 @@ namespace OpenSim.Region.Environment.Scenes
175 //return (new LLVector3(axiomPos.x, axiomPos.y, axiomPos.z) + AbsolutePosition); 180 //return (new LLVector3(axiomPos.x, axiomPos.y, axiomPos.z) + AbsolutePosition);
176 } 181 }
177 182
183 /// <summary>
184 /// Gets the rotation of this prim offset by the group rotation
185 /// </summary>
186 /// <returns></returns>
178 public LLQuaternion GetWorldRotation() 187 public LLQuaternion GetWorldRotation()
179 { 188 {
180 Quaternion newRot; 189 Quaternion newRot;
@@ -211,6 +220,7 @@ namespace OpenSim.Region.Environment.Scenes
211 { 220 {
212 get 221 get
213 { 222 {
223 // If this is a linkset, we don't want the physics engine mucking up our group position here.
214 if (PhysActor != null && ParentID == 0) 224 if (PhysActor != null && ParentID == 0)
215 { 225 {
216 m_groupPosition.X = PhysActor.Position.X; 226 m_groupPosition.X = PhysActor.Position.X;
@@ -228,6 +238,7 @@ namespace OpenSim.Region.Environment.Scenes
228 try 238 try
229 { 239 {
230 240
241 // Root prim actually goes at Position
231 if (ParentID == 0) 242 if (ParentID == 0)
232 { 243 {
233 PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); 244 PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
@@ -235,12 +246,16 @@ namespace OpenSim.Region.Environment.Scenes
235 } 246 }
236 else 247 else
237 { 248 {
249
250 // To move the child prim in respect to the group position and rotation we have to calculate
251
238 LLVector3 resultingposition = GetWorldPosition(); 252 LLVector3 resultingposition = GetWorldPosition();
239 PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); 253 PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z);
240 LLQuaternion resultingrot = GetWorldRotation(); 254 LLQuaternion resultingrot = GetWorldRotation();
241 PhysActor.Orientation = new Quaternion(resultingrot.W, resultingrot.X, resultingrot.Y, resultingrot.Z); 255 PhysActor.Orientation = new Quaternion(resultingrot.W, resultingrot.X, resultingrot.Y, resultingrot.Z);
242 } 256 }
243 257
258 // Tell the physics engines that this prim changed.
244 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 259 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
245 } 260 }
246 catch (Exception e) 261 catch (Exception e)
@@ -260,7 +275,7 @@ namespace OpenSim.Region.Environment.Scenes
260 set { m_offsetPosition = value; 275 set { m_offsetPosition = value;
261 try 276 try
262 { 277 {
263 // Hack to get the child prim to update positions in the physics engine 278 // Hack to get the child prim to update world positions in the physics engine
264 ParentGroup.ResetChildPrimPhysicsPositions(); 279 ParentGroup.ResetChildPrimPhysicsPositions();
265 } 280 }
266 catch (System.NullReferenceException) 281 catch (System.NullReferenceException)
@@ -282,6 +297,7 @@ namespace OpenSim.Region.Environment.Scenes
282 { 297 {
283 get 298 get
284 { 299 {
300 // We don't want the physics engine mucking up the rotations in a linkset
285 if (PhysActor != null && ParentID == 0) 301 if (PhysActor != null && ParentID == 0)
286 { 302 {
287 if (PhysActor.Orientation.x != 0 || PhysActor.Orientation.y != 0 303 if (PhysActor.Orientation.x != 0 || PhysActor.Orientation.y != 0
@@ -303,8 +319,7 @@ namespace OpenSim.Region.Environment.Scenes
303 { 319 {
304 try 320 try
305 { 321 {
306 //lock (Scene.SyncRoot) 322 // Root prim gets value directly
307 //{
308 if (ParentID == 0) 323 if (ParentID == 0)
309 { 324 {
310 PhysActor.Orientation = new Quaternion(value.W, value.X, value.Y, value.Z); 325 PhysActor.Orientation = new Quaternion(value.W, value.X, value.Y, value.Z);
@@ -312,6 +327,7 @@ namespace OpenSim.Region.Environment.Scenes
312 } 327 }
313 else 328 else
314 { 329 {
330 // Child prim we have to calculate it's world rotation
315 LLQuaternion resultingrotation = GetWorldRotation(); 331 LLQuaternion resultingrotation = GetWorldRotation();
316 PhysActor.Orientation = new Quaternion(resultingrotation.W, resultingrotation.X, resultingrotation.Y, resultingrotation.Z); 332 PhysActor.Orientation = new Quaternion(resultingrotation.W, resultingrotation.X, resultingrotation.Y, resultingrotation.Z);
317 //MainLog.Instance.Verbose("PART", "RO2:" + PhysActor.Orientation.ToString()); 333 //MainLog.Instance.Verbose("PART", "RO2:" + PhysActor.Orientation.ToString());