diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IVoiceModule.cs (renamed from OpenSim/Framework/Servers/GetAssetStreamHandler.cs) | 38 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 110 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 265 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | 53 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs | 3 |
7 files changed, 215 insertions, 260 deletions
diff --git a/OpenSim/Framework/Servers/GetAssetStreamHandler.cs b/OpenSim/Region/Framework/Interfaces/IVoiceModule.cs index c6958de..2e555fa 100644 --- a/OpenSim/Framework/Servers/GetAssetStreamHandler.cs +++ b/OpenSim/Region/Framework/Interfaces/IVoiceModule.cs | |||
@@ -25,39 +25,21 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | |
29 | using System.IO; | 29 | using System.IO; |
30 | using System.Reflection; | ||
31 | using System.Text; | ||
32 | using System.Text.RegularExpressions; | ||
33 | using System.Xml; | ||
34 | using System.Xml.Serialization; | ||
35 | using log4net; | ||
36 | using OpenMetaverse; | 30 | using OpenMetaverse; |
37 | using OpenSim.Data; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Servers; | ||
40 | using OpenSim.Framework.Servers.HttpServer; | ||
41 | using OpenSim.Framework.Statistics; | ||
42 | using System.Net; | ||
43 | 31 | ||
44 | namespace OpenSim.Framework.Servers | 32 | namespace OpenSim.Region.Framework.Interfaces |
45 | { | 33 | { |
46 | public class GetAssetStreamHandler : BaseGetAssetStreamHandler | 34 | public interface IVoiceModule |
47 | { | 35 | { |
48 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
49 | |||
50 | private readonly IAssetDataPlugin m_assetProvider; | ||
51 | |||
52 | public GetAssetStreamHandler(IAssetDataPlugin assetProvider) | ||
53 | : base("GET", "/assets") | ||
54 | { | ||
55 | m_assetProvider = assetProvider; | ||
56 | } | ||
57 | 36 | ||
58 | protected override AssetBase GetAsset(UUID assetID) | 37 | /// <summary> |
59 | { | 38 | /// Set the SIP url to be used by a parcel, this will allow manual setting of a SIP address |
60 | return m_assetProvider.GetAsset(assetID); | 39 | /// for a particular piece of land, allowing region owners to use preconfigured SIP conference channels. |
61 | } | 40 | /// This is used by osSetParcelSIPAddress |
41 | /// </summary> | ||
42 | void setLandSIPAddress(string SIPAddress,UUID GlobalID); | ||
43 | |||
62 | } | 44 | } |
63 | } | 45 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 6ba7e41..3c17bbe 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -250,16 +250,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
250 | /// </summary> | 250 | /// </summary> |
251 | public override Vector3 AbsolutePosition | 251 | public override Vector3 AbsolutePosition |
252 | { | 252 | { |
253 | get | 253 | get { return m_rootPart.GroupPosition; } |
254 | { | ||
255 | if (m_rootPart == null) | ||
256 | { | ||
257 | throw new NullReferenceException( | ||
258 | string.Format("[SCENE OBJECT GROUP]: Object {0} has no root part.", m_uuid)); | ||
259 | } | ||
260 | |||
261 | return m_rootPart.GroupPosition; | ||
262 | } | ||
263 | set | 254 | set |
264 | { | 255 | { |
265 | Vector3 val = value; | 256 | Vector3 val = value; |
@@ -291,41 +282,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
291 | 282 | ||
292 | public override uint LocalId | 283 | public override uint LocalId |
293 | { | 284 | { |
294 | get | 285 | get { return m_rootPart.LocalId; } |
295 | { | ||
296 | if (m_rootPart == null) | ||
297 | { | ||
298 | m_log.Error("[SCENE OBJECT GROUP]: Unable to find the rootpart for a LocalId Request!"); | ||
299 | return 0; | ||
300 | } | ||
301 | |||
302 | return m_rootPart.LocalId; | ||
303 | } | ||
304 | set { m_rootPart.LocalId = value; } | 286 | set { m_rootPart.LocalId = value; } |
305 | } | 287 | } |
306 | 288 | ||
307 | public override UUID UUID | 289 | public override UUID UUID |
308 | { | 290 | { |
309 | get { | 291 | get { return m_rootPart.UUID; } |
310 | if (m_rootPart == null) | ||
311 | { | ||
312 | m_log.Error("Got a null rootpart while requesting UUID. Called from: ", new Exception()); | ||
313 | return UUID.Zero; | ||
314 | } | ||
315 | else return m_rootPart.UUID; | ||
316 | } | ||
317 | set { m_rootPart.UUID = value; } | 292 | set { m_rootPart.UUID = value; } |
318 | } | 293 | } |
319 | 294 | ||
320 | public UUID OwnerID | 295 | public UUID OwnerID |
321 | { | 296 | { |
322 | get | 297 | get { return m_rootPart.OwnerID; } |
323 | { | ||
324 | if (m_rootPart == null) | ||
325 | return UUID.Zero; | ||
326 | |||
327 | return m_rootPart.OwnerID; | ||
328 | } | ||
329 | set { m_rootPart.OwnerID = value; } | 298 | set { m_rootPart.OwnerID = value; } |
330 | } | 299 | } |
331 | 300 | ||
@@ -366,7 +335,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
366 | { | 335 | { |
367 | m_isSelected = value; | 336 | m_isSelected = value; |
368 | // Tell physics engine that group is selected | 337 | // Tell physics engine that group is selected |
369 | if (m_rootPart != null && m_rootPart.PhysActor != null) | 338 | if (m_rootPart.PhysActor != null) |
370 | { | 339 | { |
371 | m_rootPart.PhysActor.Selected = value; | 340 | m_rootPart.PhysActor.Selected = value; |
372 | // Pass it on to the children. | 341 | // Pass it on to the children. |
@@ -399,13 +368,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
399 | #region Constructors | 368 | #region Constructors |
400 | 369 | ||
401 | /// <summary> | 370 | /// <summary> |
402 | /// Constructor | ||
403 | /// </summary> | ||
404 | public SceneObjectGroup() | ||
405 | { | ||
406 | } | ||
407 | |||
408 | /// <summary> | ||
409 | /// This constructor creates a SceneObjectGroup using a pre-existing SceneObjectPart. | 371 | /// This constructor creates a SceneObjectGroup using a pre-existing SceneObjectPart. |
410 | /// The original SceneObjectPart will be used rather than a copy, preserving | 372 | /// The original SceneObjectPart will be used rather than a copy, preserving |
411 | /// its existing localID and UUID. | 373 | /// its existing localID and UUID. |
@@ -419,9 +381,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
419 | /// Constructor. This object is added to the scene later via AttachToScene() | 381 | /// Constructor. This object is added to the scene later via AttachToScene() |
420 | /// </summary> | 382 | /// </summary> |
421 | public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) | 383 | public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) |
422 | { | 384 | { |
423 | Vector3 rootOffset = new Vector3(0, 0, 0); | 385 | SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, Vector3.Zero)); |
424 | SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, rootOffset)); | ||
425 | } | 386 | } |
426 | 387 | ||
427 | /// <summary> | 388 | /// <summary> |
@@ -462,11 +423,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
462 | 423 | ||
463 | public UUID GetFromItemID() | 424 | public UUID GetFromItemID() |
464 | { | 425 | { |
465 | if (m_rootPart != null) | 426 | return m_rootPart.FromItemID; |
466 | { | ||
467 | return m_rootPart.FromItemID; | ||
468 | } | ||
469 | return UUID.Zero; | ||
470 | } | 427 | } |
471 | 428 | ||
472 | /// <summary> | 429 | /// <summary> |
@@ -958,11 +915,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
958 | 915 | ||
959 | public byte GetAttachmentPoint() | 916 | public byte GetAttachmentPoint() |
960 | { | 917 | { |
961 | if (m_rootPart != null) | 918 | return m_rootPart.Shape.State; |
962 | { | ||
963 | return m_rootPart.Shape.State; | ||
964 | } | ||
965 | return (byte)0; | ||
966 | } | 919 | } |
967 | 920 | ||
968 | public void ClearPartAttachmentData() | 921 | public void ClearPartAttachmentData() |
@@ -1071,7 +1024,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1071 | /// </summary> | 1024 | /// </summary> |
1072 | /// <param name="part"></param> | 1025 | /// <param name="part"></param> |
1073 | public void SetRootPart(SceneObjectPart part) | 1026 | public void SetRootPart(SceneObjectPart part) |
1074 | { | 1027 | { |
1028 | if (part == null) | ||
1029 | throw new ArgumentNullException("Cannot give SceneObjectGroup a null root SceneObjectPart"); | ||
1030 | |||
1075 | part.SetParent(this); | 1031 | part.SetParent(this); |
1076 | m_rootPart = part; | 1032 | m_rootPart = part; |
1077 | if (!IsAttachment) | 1033 | if (!IsAttachment) |
@@ -1224,7 +1180,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1224 | 1180 | ||
1225 | if (!silent) | 1181 | if (!silent) |
1226 | { | 1182 | { |
1227 | if (m_rootPart != null && part == m_rootPart) | 1183 | if (part == m_rootPart) |
1228 | avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId); | 1184 | avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId); |
1229 | } | 1185 | } |
1230 | } | 1186 | } |
@@ -1447,7 +1403,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1447 | /// <param name="part"></param> | 1403 | /// <param name="part"></param> |
1448 | internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags) | 1404 | internal void SendPartFullUpdate(IClientAPI remoteClient, SceneObjectPart part, uint clientFlags) |
1449 | { | 1405 | { |
1450 | if (m_rootPart != null && m_rootPart.UUID == part.UUID) | 1406 | if (m_rootPart.UUID == part.UUID) |
1451 | { | 1407 | { |
1452 | if (IsAttachment) | 1408 | if (IsAttachment) |
1453 | { | 1409 | { |
@@ -1881,12 +1837,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1881 | if (m_isDeleted) | 1837 | if (m_isDeleted) |
1882 | return; | 1838 | return; |
1883 | 1839 | ||
1884 | // This is what happens when an orphanced link set child prim's | ||
1885 | // group was queued when it was linked | ||
1886 | // | ||
1887 | if (m_rootPart == null) | ||
1888 | return; | ||
1889 | |||
1890 | // Even temporary objects take part in physics (e.g. temp-on-rez bullets) | 1840 | // Even temporary objects take part in physics (e.g. temp-on-rez bullets) |
1891 | //if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) | 1841 | //if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) |
1892 | // return; | 1842 | // return; |
@@ -3129,26 +3079,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
3129 | int yaxis = 4; | 3079 | int yaxis = 4; |
3130 | int zaxis = 8; | 3080 | int zaxis = 8; |
3131 | 3081 | ||
3132 | if (m_rootPart != null) | 3082 | setX = ((axis & xaxis) != 0) ? true : false; |
3133 | { | 3083 | setY = ((axis & yaxis) != 0) ? true : false; |
3134 | setX = ((axis & xaxis) != 0) ? true : false; | 3084 | setZ = ((axis & zaxis) != 0) ? true : false; |
3135 | setY = ((axis & yaxis) != 0) ? true : false; | ||
3136 | setZ = ((axis & zaxis) != 0) ? true : false; | ||
3137 | 3085 | ||
3138 | float setval = (rotate10 > 0) ? 1f : 0f; | 3086 | float setval = (rotate10 > 0) ? 1f : 0f; |
3139 | 3087 | ||
3140 | if (setX) | 3088 | if (setX) |
3141 | m_rootPart.RotationAxis.X = setval; | 3089 | m_rootPart.RotationAxis.X = setval; |
3142 | if (setY) | 3090 | if (setY) |
3143 | m_rootPart.RotationAxis.Y = setval; | 3091 | m_rootPart.RotationAxis.Y = setval; |
3144 | if (setZ) | 3092 | if (setZ) |
3145 | m_rootPart.RotationAxis.Z = setval; | 3093 | m_rootPart.RotationAxis.Z = setval; |
3146 | |||
3147 | if (setX || setY || setZ) | ||
3148 | { | ||
3149 | m_rootPart.SetPhysicsAxisRotation(); | ||
3150 | } | ||
3151 | 3094 | ||
3095 | if (setX || setY || setZ) | ||
3096 | { | ||
3097 | m_rootPart.SetPhysicsAxisRotation(); | ||
3152 | } | 3098 | } |
3153 | } | 3099 | } |
3154 | 3100 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index b0d279c..51bb114 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -415,9 +415,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
415 | set | 415 | set |
416 | { | 416 | { |
417 | m_name = value; | 417 | m_name = value; |
418 | if (PhysActor != null) | 418 | PhysicsActor pa = PhysActor; |
419 | if (pa != null) | ||
419 | { | 420 | { |
420 | PhysActor.SOPName = value; | 421 | pa.SOPName = value; |
421 | } | 422 | } |
422 | } | 423 | } |
423 | } | 424 | } |
@@ -427,10 +428,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
427 | get { return (byte) m_material; } | 428 | get { return (byte) m_material; } |
428 | set | 429 | set |
429 | { | 430 | { |
431 | PhysicsActor pa = PhysActor; | ||
430 | m_material = (Material)value; | 432 | m_material = (Material)value; |
431 | if (PhysActor != null) | 433 | if (pa != null) |
432 | { | 434 | { |
433 | PhysActor.SetMaterial((int)value); | 435 | pa.SetMaterial((int)value); |
434 | } | 436 | } |
435 | } | 437 | } |
436 | } | 438 | } |
@@ -501,11 +503,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
501 | get | 503 | get |
502 | { | 504 | { |
503 | // If this is a linkset, we don't want the physics engine mucking up our group position here. | 505 | // If this is a linkset, we don't want the physics engine mucking up our group position here. |
504 | if (PhysActor != null && _parentID == 0) | 506 | PhysicsActor pa = PhysActor; |
507 | if (pa != null && _parentID == 0) | ||
505 | { | 508 | { |
506 | m_groupPosition.X = PhysActor.Position.X; | 509 | m_groupPosition.X = pa.Position.X; |
507 | m_groupPosition.Y = PhysActor.Position.Y; | 510 | m_groupPosition.Y = pa.Position.Y; |
508 | m_groupPosition.Z = PhysActor.Position.Z; | 511 | m_groupPosition.Z = pa.Position.Z; |
509 | } | 512 | } |
510 | 513 | ||
511 | if (IsAttachment) | 514 | if (IsAttachment) |
@@ -525,26 +528,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
525 | 528 | ||
526 | m_groupPosition = value; | 529 | m_groupPosition = value; |
527 | 530 | ||
528 | if (PhysActor != null) | 531 | PhysicsActor pa = PhysActor; |
532 | if (pa != null) | ||
529 | { | 533 | { |
530 | try | 534 | try |
531 | { | 535 | { |
532 | // Root prim actually goes at Position | 536 | // Root prim actually goes at Position |
533 | if (_parentID == 0) | 537 | if (_parentID == 0) |
534 | { | 538 | { |
535 | PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); | 539 | pa.Position = new PhysicsVector(value.X, value.Y, value.Z); |
536 | } | 540 | } |
537 | else | 541 | else |
538 | { | 542 | { |
539 | // To move the child prim in respect to the group position and rotation we have to calculate | 543 | // To move the child prim in respect to the group position and rotation we have to calculate |
540 | Vector3 resultingposition = GetWorldPosition(); | 544 | Vector3 resultingposition = GetWorldPosition(); |
541 | PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); | 545 | pa.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); |
542 | Quaternion resultingrot = GetWorldRotation(); | 546 | Quaternion resultingrot = GetWorldRotation(); |
543 | PhysActor.Orientation = resultingrot; | 547 | pa.Orientation = resultingrot; |
544 | } | 548 | } |
545 | 549 | ||
546 | // Tell the physics engines that this prim changed. | 550 | // Tell the physics engines that this prim changed. |
547 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 551 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
548 | } | 552 | } |
549 | catch (Exception e) | 553 | catch (Exception e) |
550 | { | 554 | { |
@@ -577,15 +581,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
577 | 581 | ||
578 | if (ParentGroup != null && !ParentGroup.IsDeleted) | 582 | if (ParentGroup != null && !ParentGroup.IsDeleted) |
579 | { | 583 | { |
580 | if (_parentID != 0 && PhysActor != null) | 584 | PhysicsActor pa = PhysActor; |
585 | if (_parentID != 0 && pa != null) | ||
581 | { | 586 | { |
582 | Vector3 resultingposition = GetWorldPosition(); | 587 | Vector3 resultingposition = GetWorldPosition(); |
583 | PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); | 588 | pa.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); |
584 | Quaternion resultingrot = GetWorldRotation(); | 589 | Quaternion resultingrot = GetWorldRotation(); |
585 | PhysActor.Orientation = resultingrot; | 590 | pa.Orientation = resultingrot; |
586 | 591 | ||
587 | // Tell the physics engines that this prim changed. | 592 | // Tell the physics engines that this prim changed. |
588 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 593 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
589 | } | 594 | } |
590 | } | 595 | } |
591 | } | 596 | } |
@@ -595,13 +600,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
595 | { | 600 | { |
596 | get | 601 | get |
597 | { | 602 | { |
603 | PhysicsActor pa = PhysActor; | ||
598 | // We don't want the physics engine mucking up the rotations in a linkset | 604 | // We don't want the physics engine mucking up the rotations in a linkset |
599 | if ((_parentID == 0) && (Shape.PCode != 9 || Shape.State == 0) && (PhysActor != null)) | 605 | if ((_parentID == 0) && (Shape.PCode != 9 || Shape.State == 0) && (pa != null)) |
600 | { | 606 | { |
601 | if (PhysActor.Orientation.X != 0 || PhysActor.Orientation.Y != 0 | 607 | if (pa.Orientation.X != 0 || pa.Orientation.Y != 0 |
602 | || PhysActor.Orientation.Z != 0 || PhysActor.Orientation.W != 0) | 608 | || pa.Orientation.Z != 0 || pa.Orientation.W != 0) |
603 | { | 609 | { |
604 | m_rotationOffset = PhysActor.Orientation; | 610 | m_rotationOffset = pa.Orientation; |
605 | } | 611 | } |
606 | } | 612 | } |
607 | 613 | ||
@@ -610,27 +616,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
610 | 616 | ||
611 | set | 617 | set |
612 | { | 618 | { |
619 | PhysicsActor pa = PhysActor; | ||
613 | StoreUndoState(); | 620 | StoreUndoState(); |
614 | m_rotationOffset = value; | 621 | m_rotationOffset = value; |
615 | 622 | ||
616 | if (PhysActor != null) | 623 | if (pa != null) |
617 | { | 624 | { |
618 | try | 625 | try |
619 | { | 626 | { |
620 | // Root prim gets value directly | 627 | // Root prim gets value directly |
621 | if (_parentID == 0) | 628 | if (_parentID == 0) |
622 | { | 629 | { |
623 | PhysActor.Orientation = value; | 630 | pa.Orientation = value; |
624 | //m_log.Info("[PART]: RO1:" + PhysActor.Orientation.ToString()); | 631 | //m_log.Info("[PART]: RO1:" + PhysActor.Orientation.ToString()); |
625 | } | 632 | } |
626 | else | 633 | else |
627 | { | 634 | { |
628 | // Child prim we have to calculate it's world rotationwel | 635 | // Child prim we have to calculate it's world rotationwel |
629 | Quaternion resultingrotation = GetWorldRotation(); | 636 | Quaternion resultingrotation = GetWorldRotation(); |
630 | PhysActor.Orientation = resultingrotation; | 637 | pa.Orientation = resultingrotation; |
631 | //m_log.Info("[PART]: RO2:" + PhysActor.Orientation.ToString()); | 638 | //m_log.Info("[PART]: RO2:" + PhysActor.Orientation.ToString()); |
632 | } | 639 | } |
633 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 640 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
634 | //} | 641 | //} |
635 | } | 642 | } |
636 | catch (Exception ex) | 643 | catch (Exception ex) |
@@ -650,13 +657,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
650 | //if (PhysActor.Velocity.X != 0 || PhysActor.Velocity.Y != 0 | 657 | //if (PhysActor.Velocity.X != 0 || PhysActor.Velocity.Y != 0 |
651 | //|| PhysActor.Velocity.Z != 0) | 658 | //|| PhysActor.Velocity.Z != 0) |
652 | //{ | 659 | //{ |
653 | if (PhysActor != null) | 660 | PhysicsActor pa = PhysActor; |
661 | if (pa != null) | ||
654 | { | 662 | { |
655 | if (PhysActor.IsPhysical) | 663 | if (pa.IsPhysical) |
656 | { | 664 | { |
657 | m_velocity.X = PhysActor.Velocity.X; | 665 | m_velocity.X = pa.Velocity.X; |
658 | m_velocity.Y = PhysActor.Velocity.Y; | 666 | m_velocity.Y = pa.Velocity.Y; |
659 | m_velocity.Z = PhysActor.Velocity.Z; | 667 | m_velocity.Z = pa.Velocity.Z; |
660 | } | 668 | } |
661 | } | 669 | } |
662 | 670 | ||
@@ -666,12 +674,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
666 | set | 674 | set |
667 | { | 675 | { |
668 | m_velocity = value; | 676 | m_velocity = value; |
669 | if (PhysActor != null) | 677 | PhysicsActor pa = PhysActor; |
678 | if (pa != null) | ||
670 | { | 679 | { |
671 | if (PhysActor.IsPhysical) | 680 | if (pa.IsPhysical) |
672 | { | 681 | { |
673 | PhysActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z); | 682 | pa.Velocity = new PhysicsVector(value.X, value.Y, value.Z); |
674 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 683 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
675 | } | 684 | } |
676 | } | 685 | } |
677 | } | 686 | } |
@@ -688,9 +697,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
688 | { | 697 | { |
689 | get | 698 | get |
690 | { | 699 | { |
691 | if ((PhysActor != null) && PhysActor.IsPhysical) | 700 | PhysicsActor pa = PhysActor; |
701 | if ((pa != null) && pa.IsPhysical) | ||
692 | { | 702 | { |
693 | m_angularVelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(), 0); | 703 | m_angularVelocity.FromBytes(pa.RotationalVelocity.GetBytes(), 0); |
694 | } | 704 | } |
695 | return m_angularVelocity; | 705 | return m_angularVelocity; |
696 | } | 706 | } |
@@ -709,10 +719,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
709 | get { return m_description; } | 719 | get { return m_description; } |
710 | set | 720 | set |
711 | { | 721 | { |
722 | PhysicsActor pa = PhysActor; | ||
712 | m_description = value; | 723 | m_description = value; |
713 | if (PhysActor != null) | 724 | if (pa != null) |
714 | { | 725 | { |
715 | PhysActor.SOPDescription = value; | 726 | pa.SOPDescription = value; |
716 | } | 727 | } |
717 | } | 728 | } |
718 | } | 729 | } |
@@ -806,14 +817,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
806 | if (m_shape != null) { | 817 | if (m_shape != null) { |
807 | m_shape.Scale = value; | 818 | m_shape.Scale = value; |
808 | 819 | ||
809 | if (PhysActor != null && m_parentGroup != null) | 820 | PhysicsActor pa = PhysActor; |
821 | if (pa != null && m_parentGroup != null) | ||
810 | { | 822 | { |
811 | if (m_parentGroup.Scene != null) | 823 | if (m_parentGroup.Scene != null) |
812 | { | 824 | { |
813 | if (m_parentGroup.Scene.PhysicsScene != null) | 825 | if (m_parentGroup.Scene.PhysicsScene != null) |
814 | { | 826 | { |
815 | PhysActor.Size = new PhysicsVector(m_shape.Scale.X, m_shape.Scale.Y, m_shape.Scale.Z); | 827 | pa.Size = new PhysicsVector(m_shape.Scale.X, m_shape.Scale.Y, m_shape.Scale.Z); |
816 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 828 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
817 | } | 829 | } |
818 | } | 830 | } |
819 | } | 831 | } |
@@ -1343,13 +1355,14 @@ if (m_shape != null) { | |||
1343 | RigidBody); | 1355 | RigidBody); |
1344 | 1356 | ||
1345 | // Basic Physics returns null.. joy joy joy. | 1357 | // Basic Physics returns null.. joy joy joy. |
1346 | if (PhysActor != null) | 1358 | PhysicsActor pa = PhysActor; |
1359 | if (pa != null) | ||
1347 | { | 1360 | { |
1348 | PhysActor.SOPName = this.Name; // save object name and desc into the PhysActor so ODE internals know the joint/body info | 1361 | pa.SOPName = this.Name; // save object name and desc into the PhysActor so ODE internals know the joint/body info |
1349 | PhysActor.SOPDescription = this.Description; | 1362 | pa.SOPDescription = this.Description; |
1350 | PhysActor.LocalID = LocalId; | 1363 | pa.LocalID = LocalId; |
1351 | DoPhysicsPropertyUpdate(RigidBody, true); | 1364 | DoPhysicsPropertyUpdate(RigidBody, true); |
1352 | PhysActor.SetVolumeDetect(VolumeDetectActive ? 1 : 0); | 1365 | pa.SetVolumeDetect(VolumeDetectActive ? 1 : 0); |
1353 | } | 1366 | } |
1354 | } | 1367 | } |
1355 | } | 1368 | } |
@@ -1563,23 +1576,24 @@ if (m_shape != null) { | |||
1563 | } | 1576 | } |
1564 | else | 1577 | else |
1565 | { | 1578 | { |
1566 | if (PhysActor != null) | 1579 | PhysicsActor pa = PhysActor; |
1580 | if (pa != null) | ||
1567 | { | 1581 | { |
1568 | if (UsePhysics != PhysActor.IsPhysical || isNew) | 1582 | if (UsePhysics != pa.IsPhysical || isNew) |
1569 | { | 1583 | { |
1570 | if (PhysActor.IsPhysical) // implies UsePhysics==false for this block | 1584 | if (pa.IsPhysical) // implies UsePhysics==false for this block |
1571 | { | 1585 | { |
1572 | if (!isNew) | 1586 | if (!isNew) |
1573 | ParentGroup.Scene.RemovePhysicalPrim(1); | 1587 | ParentGroup.Scene.RemovePhysicalPrim(1); |
1574 | 1588 | ||
1575 | PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; | 1589 | pa.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; |
1576 | PhysActor.OnOutOfBounds -= PhysicsOutOfBounds; | 1590 | pa.OnOutOfBounds -= PhysicsOutOfBounds; |
1577 | PhysActor.delink(); | 1591 | pa.delink(); |
1578 | 1592 | ||
1579 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints && (!isNew)) | 1593 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints && (!isNew)) |
1580 | { | 1594 | { |
1581 | // destroy all joints connected to this now deactivated body | 1595 | // destroy all joints connected to this now deactivated body |
1582 | m_parentGroup.Scene.PhysicsScene.RemoveAllJointsConnectedToActorThreadLocked(PhysActor); | 1596 | m_parentGroup.Scene.PhysicsScene.RemoveAllJointsConnectedToActorThreadLocked(pa); |
1583 | } | 1597 | } |
1584 | 1598 | ||
1585 | // stop client-side interpolation of all joint proxy objects that have just been deleted | 1599 | // stop client-side interpolation of all joint proxy objects that have just been deleted |
@@ -1598,7 +1612,7 @@ if (m_shape != null) { | |||
1598 | //RotationalVelocity = new Vector3(0, 0, 0); | 1612 | //RotationalVelocity = new Vector3(0, 0, 0); |
1599 | } | 1613 | } |
1600 | 1614 | ||
1601 | PhysActor.IsPhysical = UsePhysics; | 1615 | pa.IsPhysical = UsePhysics; |
1602 | 1616 | ||
1603 | 1617 | ||
1604 | // If we're not what we're supposed to be in the physics scene, recreate ourselves. | 1618 | // If we're not what we're supposed to be in the physics scene, recreate ourselves. |
@@ -1612,19 +1626,19 @@ if (m_shape != null) { | |||
1612 | { | 1626 | { |
1613 | ParentGroup.Scene.AddPhysicalPrim(1); | 1627 | ParentGroup.Scene.AddPhysicalPrim(1); |
1614 | 1628 | ||
1615 | PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; | 1629 | pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; |
1616 | PhysActor.OnOutOfBounds += PhysicsOutOfBounds; | 1630 | pa.OnOutOfBounds += PhysicsOutOfBounds; |
1617 | if (_parentID != 0 && _parentID != LocalId) | 1631 | if (_parentID != 0 && _parentID != LocalId) |
1618 | { | 1632 | { |
1619 | if (ParentGroup.RootPart.PhysActor != null) | 1633 | if (ParentGroup.RootPart.PhysActor != null) |
1620 | { | 1634 | { |
1621 | PhysActor.link(ParentGroup.RootPart.PhysActor); | 1635 | pa.link(ParentGroup.RootPart.PhysActor); |
1622 | } | 1636 | } |
1623 | } | 1637 | } |
1624 | } | 1638 | } |
1625 | } | 1639 | } |
1626 | } | 1640 | } |
1627 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 1641 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
1628 | } | 1642 | } |
1629 | } | 1643 | } |
1630 | } | 1644 | } |
@@ -1690,9 +1704,10 @@ if (m_shape != null) { | |||
1690 | 1704 | ||
1691 | public Vector3 GetGeometricCenter() | 1705 | public Vector3 GetGeometricCenter() |
1692 | { | 1706 | { |
1693 | if (PhysActor != null) | 1707 | PhysicsActor pa = PhysActor; |
1708 | if (pa != null) | ||
1694 | { | 1709 | { |
1695 | return new Vector3(PhysActor.CenterOfMass.X, PhysActor.CenterOfMass.Y, PhysActor.CenterOfMass.Z); | 1710 | return new Vector3(pa.CenterOfMass.X, pa.CenterOfMass.Y, pa.CenterOfMass.Z); |
1696 | } | 1711 | } |
1697 | else | 1712 | else |
1698 | { | 1713 | { |
@@ -1702,9 +1717,10 @@ if (m_shape != null) { | |||
1702 | 1717 | ||
1703 | public float GetMass() | 1718 | public float GetMass() |
1704 | { | 1719 | { |
1705 | if (PhysActor != null) | 1720 | PhysicsActor pa = PhysActor; |
1721 | if (pa != null) | ||
1706 | { | 1722 | { |
1707 | return PhysActor.Mass; | 1723 | return pa.Mass; |
1708 | } | 1724 | } |
1709 | else | 1725 | else |
1710 | { | 1726 | { |
@@ -1714,8 +1730,9 @@ if (m_shape != null) { | |||
1714 | 1730 | ||
1715 | public PhysicsVector GetForce() | 1731 | public PhysicsVector GetForce() |
1716 | { | 1732 | { |
1717 | if (PhysActor != null) | 1733 | PhysicsActor pa = PhysActor; |
1718 | return PhysActor.Force; | 1734 | if (pa != null) |
1735 | return pa.Force; | ||
1719 | else | 1736 | else |
1720 | return new PhysicsVector(); | 1737 | return new PhysicsVector(); |
1721 | } | 1738 | } |
@@ -2094,11 +2111,15 @@ if (m_shape != null) { | |||
2094 | 2111 | ||
2095 | public void PhysicsRequestingTerseUpdate() | 2112 | public void PhysicsRequestingTerseUpdate() |
2096 | { | 2113 | { |
2097 | if (PhysActor != null) | 2114 | PhysicsActor pa = PhysActor; |
2115 | if (pa != null) | ||
2098 | { | 2116 | { |
2099 | Vector3 newpos = new Vector3(PhysActor.Position.GetBytes(), 0); | 2117 | Vector3 newpos = new Vector3(pa.Position.GetBytes(), 0); |
2100 | 2118 | ||
2101 | if (m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.N) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.S) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.E) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.W)) | 2119 | if (m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.N) | |
2120 | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.S) | | ||
2121 | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.E) | | ||
2122 | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.W)) | ||
2102 | { | 2123 | { |
2103 | m_parentGroup.AbsolutePosition = newpos; | 2124 | m_parentGroup.AbsolutePosition = newpos; |
2104 | return; | 2125 | return; |
@@ -2294,14 +2315,15 @@ if (m_shape != null) { | |||
2294 | if (texture != null) | 2315 | if (texture != null) |
2295 | m_shape.SculptData = texture.Data; | 2316 | m_shape.SculptData = texture.Data; |
2296 | 2317 | ||
2297 | if (PhysActor != null) | 2318 | PhysicsActor pa = PhysActor; |
2319 | if (pa != null) | ||
2298 | { | 2320 | { |
2299 | // Tricks physics engine into thinking we've changed the part shape. | 2321 | // Tricks physics engine into thinking we've changed the part shape. |
2300 | PrimitiveBaseShape m_newshape = m_shape.Copy(); | 2322 | PrimitiveBaseShape m_newshape = m_shape.Copy(); |
2301 | PhysActor.Shape = m_newshape; | 2323 | pa.Shape = m_newshape; |
2302 | m_shape = m_newshape; | 2324 | m_shape = m_newshape; |
2303 | 2325 | ||
2304 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 2326 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2305 | } | 2327 | } |
2306 | } | 2328 | } |
2307 | } | 2329 | } |
@@ -2520,9 +2542,10 @@ if (m_shape != null) { | |||
2520 | 2542 | ||
2521 | public void SetBuoyancy(float fvalue) | 2543 | public void SetBuoyancy(float fvalue) |
2522 | { | 2544 | { |
2523 | if (PhysActor != null) | 2545 | PhysicsActor pa = PhysActor; |
2546 | if (pa != null) | ||
2524 | { | 2547 | { |
2525 | PhysActor.Buoyancy = fvalue; | 2548 | pa.Buoyancy = fvalue; |
2526 | } | 2549 | } |
2527 | } | 2550 | } |
2528 | 2551 | ||
@@ -2538,56 +2561,62 @@ if (m_shape != null) { | |||
2538 | 2561 | ||
2539 | public void SetFloatOnWater(int floatYN) | 2562 | public void SetFloatOnWater(int floatYN) |
2540 | { | 2563 | { |
2541 | if (PhysActor != null) | 2564 | PhysicsActor pa = PhysActor; |
2565 | if (pa != null) | ||
2542 | { | 2566 | { |
2543 | if (floatYN == 1) | 2567 | if (floatYN == 1) |
2544 | { | 2568 | { |
2545 | PhysActor.FloatOnWater = true; | 2569 | pa.FloatOnWater = true; |
2546 | } | 2570 | } |
2547 | else | 2571 | else |
2548 | { | 2572 | { |
2549 | PhysActor.FloatOnWater = false; | 2573 | pa.FloatOnWater = false; |
2550 | } | 2574 | } |
2551 | } | 2575 | } |
2552 | } | 2576 | } |
2553 | 2577 | ||
2554 | public void SetForce(PhysicsVector force) | 2578 | public void SetForce(PhysicsVector force) |
2555 | { | 2579 | { |
2556 | if (PhysActor != null) | 2580 | PhysicsActor pa = PhysActor; |
2581 | if (pa != null) | ||
2557 | { | 2582 | { |
2558 | PhysActor.Force = force; | 2583 | pa.Force = force; |
2559 | } | 2584 | } |
2560 | } | 2585 | } |
2561 | 2586 | ||
2562 | public void SetVehicleType(int type) | 2587 | public void SetVehicleType(int type) |
2563 | { | 2588 | { |
2564 | if (PhysActor != null) | 2589 | PhysicsActor pa = PhysActor; |
2590 | if (pa != null) | ||
2565 | { | 2591 | { |
2566 | PhysActor.VehicleType = type; | 2592 | pa.VehicleType = type; |
2567 | } | 2593 | } |
2568 | } | 2594 | } |
2569 | 2595 | ||
2570 | public void SetVehicleFloatParam(int param, float value) | 2596 | public void SetVehicleFloatParam(int param, float value) |
2571 | { | 2597 | { |
2572 | if (PhysActor != null) | 2598 | PhysicsActor pa = PhysActor; |
2599 | if (pa != null) | ||
2573 | { | 2600 | { |
2574 | PhysActor.VehicleFloatParam(param, value); | 2601 | pa.VehicleFloatParam(param, value); |
2575 | } | 2602 | } |
2576 | } | 2603 | } |
2577 | 2604 | ||
2578 | public void SetVehicleVectorParam(int param, PhysicsVector value) | 2605 | public void SetVehicleVectorParam(int param, PhysicsVector value) |
2579 | { | 2606 | { |
2580 | if (PhysActor != null) | 2607 | PhysicsActor pa = PhysActor; |
2608 | if (pa != null) | ||
2581 | { | 2609 | { |
2582 | PhysActor.VehicleVectorParam(param, value); | 2610 | pa.VehicleVectorParam(param, value); |
2583 | } | 2611 | } |
2584 | } | 2612 | } |
2585 | 2613 | ||
2586 | public void SetVehicleRotationParam(int param, Quaternion rotation) | 2614 | public void SetVehicleRotationParam(int param, Quaternion rotation) |
2587 | { | 2615 | { |
2588 | if (PhysActor != null) | 2616 | PhysicsActor pa = PhysActor; |
2617 | if (pa != null) | ||
2589 | { | 2618 | { |
2590 | PhysActor.VehicleRotationParam(param, rotation); | 2619 | pa.VehicleRotationParam(param, rotation); |
2591 | } | 2620 | } |
2592 | } | 2621 | } |
2593 | 2622 | ||
@@ -2615,10 +2644,11 @@ if (m_shape != null) { | |||
2615 | 2644 | ||
2616 | public void SetPhysicsAxisRotation() | 2645 | public void SetPhysicsAxisRotation() |
2617 | { | 2646 | { |
2618 | if (PhysActor != null) | 2647 | PhysicsActor pa = PhysActor; |
2648 | if (pa != null) | ||
2619 | { | 2649 | { |
2620 | PhysActor.LockAngularMotion(RotationAxis); | 2650 | pa.LockAngularMotion(RotationAxis); |
2621 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 2651 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2622 | } | 2652 | } |
2623 | } | 2653 | } |
2624 | 2654 | ||
@@ -3350,8 +3380,9 @@ if (m_shape != null) { | |||
3350 | { | 3380 | { |
3351 | IsVD = false; // Switch it of for the course of this routine | 3381 | IsVD = false; // Switch it of for the course of this routine |
3352 | VolumeDetectActive = false; // and also permanently | 3382 | VolumeDetectActive = false; // and also permanently |
3353 | if (PhysActor != null) | 3383 | PhysicsActor pa = PhysActor; |
3354 | PhysActor.SetVolumeDetect(0); // Let physics know about it too | 3384 | if (pa != null) |
3385 | pa.SetVolumeDetect(0); // Let physics know about it too | ||
3355 | } | 3386 | } |
3356 | else | 3387 | else |
3357 | { | 3388 | { |
@@ -3399,18 +3430,21 @@ if (m_shape != null) { | |||
3399 | if (IsPhantom || IsAttachment) // note: this may have been changed above in the case of joints | 3430 | if (IsPhantom || IsAttachment) // note: this may have been changed above in the case of joints |
3400 | { | 3431 | { |
3401 | AddFlag(PrimFlags.Phantom); | 3432 | AddFlag(PrimFlags.Phantom); |
3402 | if (PhysActor != null) | 3433 | PhysicsActor pa = PhysActor; |
3434 | if (pa != null) | ||
3403 | { | 3435 | { |
3404 | m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor); | 3436 | m_parentGroup.Scene.PhysicsScene.RemovePrim(pa); |
3405 | /// that's not wholesome. Had to make Scene public | 3437 | /// that's not wholesome. Had to make Scene public |
3406 | PhysActor = null; | 3438 | pa = null; |
3407 | } | 3439 | } |
3408 | } | 3440 | } |
3409 | else // Not phantom | 3441 | else // Not phantom |
3410 | { | 3442 | { |
3411 | RemFlag(PrimFlags.Phantom); | 3443 | RemFlag(PrimFlags.Phantom); |
3412 | 3444 | ||
3413 | if (PhysActor == null) | 3445 | // This is NOT safe!! |
3446 | PhysicsActor pa = PhysActor; | ||
3447 | if (pa == null) | ||
3414 | { | 3448 | { |
3415 | // It's not phantom anymore. So make sure the physics engine get's knowledge of it | 3449 | // It's not phantom anymore. So make sure the physics engine get's knowledge of it |
3416 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( | 3450 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( |
@@ -3421,9 +3455,9 @@ if (m_shape != null) { | |||
3421 | RotationOffset, | 3455 | RotationOffset, |
3422 | UsePhysics); | 3456 | UsePhysics); |
3423 | 3457 | ||
3424 | if (PhysActor != null) | 3458 | if (pa != null) |
3425 | { | 3459 | { |
3426 | PhysActor.LocalID = LocalId; | 3460 | pa.LocalID = LocalId; |
3427 | DoPhysicsPropertyUpdate(UsePhysics, true); | 3461 | DoPhysicsPropertyUpdate(UsePhysics, true); |
3428 | if (m_parentGroup != null) | 3462 | if (m_parentGroup != null) |
3429 | { | 3463 | { |
@@ -3442,14 +3476,14 @@ if (m_shape != null) { | |||
3442 | (CollisionSound != UUID.Zero) | 3476 | (CollisionSound != UUID.Zero) |
3443 | ) | 3477 | ) |
3444 | { | 3478 | { |
3445 | PhysActor.OnCollisionUpdate += PhysicsCollision; | 3479 | pa.OnCollisionUpdate += PhysicsCollision; |
3446 | PhysActor.SubscribeEvents(1000); | 3480 | pa.SubscribeEvents(1000); |
3447 | } | 3481 | } |
3448 | } | 3482 | } |
3449 | } | 3483 | } |
3450 | else // it already has a physical representation | 3484 | else // it already has a physical representation |
3451 | { | 3485 | { |
3452 | PhysActor.IsPhysical = UsePhysics; | 3486 | pa.IsPhysical = UsePhysics; |
3453 | 3487 | ||
3454 | DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status. If it's phantom this will remove the prim | 3488 | DoPhysicsPropertyUpdate(UsePhysics, false); // Update physical status. If it's phantom this will remove the prim |
3455 | if (m_parentGroup != null) | 3489 | if (m_parentGroup != null) |
@@ -3472,9 +3506,10 @@ if (m_shape != null) { | |||
3472 | // Defensive programming calls for a check here. | 3506 | // Defensive programming calls for a check here. |
3473 | // Better would be throwing an exception that could be catched by a unit test as the internal | 3507 | // Better would be throwing an exception that could be catched by a unit test as the internal |
3474 | // logic should make sure, this Physactor is always here. | 3508 | // logic should make sure, this Physactor is always here. |
3475 | if (this.PhysActor != null) | 3509 | PhysicsActor pa = this.PhysActor; |
3510 | if (pa != null) | ||
3476 | { | 3511 | { |
3477 | PhysActor.SetVolumeDetect(1); | 3512 | pa.SetVolumeDetect(1); |
3478 | AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active | 3513 | AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active |
3479 | this.VolumeDetectActive = true; | 3514 | this.VolumeDetectActive = true; |
3480 | } | 3515 | } |
@@ -3482,10 +3517,11 @@ if (m_shape != null) { | |||
3482 | } | 3517 | } |
3483 | else | 3518 | else |
3484 | { // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like | 3519 | { // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like |
3485 | // (mumbles, well, at least if you have infinte CPU powers :-)) | 3520 | // (mumbles, well, at least if you have infinte CPU powers :-) ) |
3486 | if (this.PhysActor != null) | 3521 | PhysicsActor pa = this.PhysActor; |
3522 | if (pa != null) | ||
3487 | { | 3523 | { |
3488 | PhysActor.SetVolumeDetect(0); | 3524 | pa.SetVolumeDetect(0); |
3489 | } | 3525 | } |
3490 | this.VolumeDetectActive = false; | 3526 | this.VolumeDetectActive = false; |
3491 | } | 3527 | } |
@@ -3543,10 +3579,11 @@ if (m_shape != null) { | |||
3543 | m_shape.PathTaperY = shapeBlock.PathTaperY; | 3579 | m_shape.PathTaperY = shapeBlock.PathTaperY; |
3544 | m_shape.PathTwist = shapeBlock.PathTwist; | 3580 | m_shape.PathTwist = shapeBlock.PathTwist; |
3545 | m_shape.PathTwistBegin = shapeBlock.PathTwistBegin; | 3581 | m_shape.PathTwistBegin = shapeBlock.PathTwistBegin; |
3546 | if (PhysActor != null) | 3582 | PhysicsActor pa = PhysActor; |
3583 | if (pa != null) | ||
3547 | { | 3584 | { |
3548 | PhysActor.Shape = m_shape; | 3585 | pa.Shape = m_shape; |
3549 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 3586 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
3550 | } | 3587 | } |
3551 | 3588 | ||
3552 | // This is what makes vehicle trailers work | 3589 | // This is what makes vehicle trailers work |
@@ -3647,19 +3684,21 @@ if (m_shape != null) { | |||
3647 | ) | 3684 | ) |
3648 | { | 3685 | { |
3649 | // subscribe to physics updates. | 3686 | // subscribe to physics updates. |
3650 | if (PhysActor != null) | 3687 | PhysicsActor pa = PhysActor; |
3688 | if (pa != null) | ||
3651 | { | 3689 | { |
3652 | PhysActor.OnCollisionUpdate += PhysicsCollision; | 3690 | pa.OnCollisionUpdate += PhysicsCollision; |
3653 | PhysActor.SubscribeEvents(1000); | 3691 | pa.SubscribeEvents(1000); |
3654 | 3692 | ||
3655 | } | 3693 | } |
3656 | } | 3694 | } |
3657 | else | 3695 | else |
3658 | { | 3696 | { |
3659 | if (PhysActor != null) | 3697 | PhysicsActor pa = PhysActor; |
3698 | if (pa != null) | ||
3660 | { | 3699 | { |
3661 | PhysActor.UnSubscribeEvents(); | 3700 | pa.UnSubscribeEvents(); |
3662 | PhysActor.OnCollisionUpdate -= PhysicsCollision; | 3701 | pa.OnCollisionUpdate -= PhysicsCollision; |
3663 | } | 3702 | } |
3664 | } | 3703 | } |
3665 | 3704 | ||
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 23fe2d3..6772f75 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2269,7 +2269,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2269 | { | 2269 | { |
2270 | //Record the time we enter this state so we know whether to "land" or not | 2270 | //Record the time we enter this state so we know whether to "land" or not |
2271 | m_animPersistUntil = DateTime.Now.Ticks; | 2271 | m_animPersistUntil = DateTime.Now.Ticks; |
2272 | return "FALLDOWN"; | 2272 | return "FALLDOWN"; // this falling animation is invoked too frequently when capsule tilt correction is used - why? |
2273 | } | 2273 | } |
2274 | } | 2274 | } |
2275 | } | 2275 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 5ae81cd..fe74158 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | |||
@@ -65,8 +65,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
65 | //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); | 65 | //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); |
66 | //int time = System.Environment.TickCount; | 66 | //int time = System.Environment.TickCount; |
67 | 67 | ||
68 | SceneObjectGroup sceneObject = new SceneObjectGroup(); | ||
69 | |||
70 | // libomv.types changes UUID to Guid | 68 | // libomv.types changes UUID to Guid |
71 | xmlData = xmlData.Replace("<UUID>", "<Guid>"); | 69 | xmlData = xmlData.Replace("<UUID>", "<Guid>"); |
72 | xmlData = xmlData.Replace("</UUID>", "</Guid>"); | 70 | xmlData = xmlData.Replace("</UUID>", "</Guid>"); |
@@ -88,17 +86,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
88 | parts = doc.GetElementsByTagName("RootPart"); | 86 | parts = doc.GetElementsByTagName("RootPart"); |
89 | 87 | ||
90 | if (parts.Count == 0) | 88 | if (parts.Count == 0) |
91 | { | ||
92 | throw new Exception("Invalid Xml format - no root part"); | 89 | throw new Exception("Invalid Xml format - no root part"); |
93 | } | 90 | |
94 | else | 91 | sr = new StringReader(parts[0].InnerXml); |
95 | { | 92 | reader = new XmlTextReader(sr); |
96 | sr = new StringReader(parts[0].InnerXml); | 93 | SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(fromUserInventoryItemID, reader)); |
97 | reader = new XmlTextReader(sr); | 94 | reader.Close(); |
98 | sceneObject.SetRootPart(SceneObjectPart.FromXml(fromUserInventoryItemID, reader)); | 95 | sr.Close(); |
99 | reader.Close(); | ||
100 | sr.Close(); | ||
101 | } | ||
102 | 96 | ||
103 | parts = doc.GetElementsByTagName("Part"); | 97 | parts = doc.GetElementsByTagName("Part"); |
104 | 98 | ||
@@ -119,16 +113,15 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
119 | // Script state may, or may not, exist. Not having any, is NOT | 113 | // Script state may, or may not, exist. Not having any, is NOT |
120 | // ever a problem. | 114 | // ever a problem. |
121 | sceneObject.LoadScriptState(doc); | 115 | sceneObject.LoadScriptState(doc); |
116 | |||
117 | return sceneObject; | ||
122 | } | 118 | } |
123 | catch (Exception e) | 119 | catch (Exception e) |
124 | { | 120 | { |
125 | m_log.ErrorFormat( | 121 | m_log.ErrorFormat( |
126 | "[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); | 122 | "[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); |
123 | return null; | ||
127 | } | 124 | } |
128 | |||
129 | //m_log.DebugFormat("[SERIALIZER]: Finished deserialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time); | ||
130 | |||
131 | return sceneObject; | ||
132 | } | 125 | } |
133 | 126 | ||
134 | /// <summary> | 127 | /// <summary> |
@@ -194,8 +187,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
194 | { | 187 | { |
195 | //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); | 188 | //m_log.DebugFormat("[SOG]: Starting deserialization of SOG"); |
196 | //int time = System.Environment.TickCount; | 189 | //int time = System.Environment.TickCount; |
197 | |||
198 | SceneObjectGroup sceneObject = new SceneObjectGroup(); | ||
199 | 190 | ||
200 | // libomv.types changes UUID to Guid | 191 | // libomv.types changes UUID to Guid |
201 | xmlData = xmlData.Replace("<UUID>", "<Guid>"); | 192 | xmlData = xmlData.Replace("<UUID>", "<Guid>"); |
@@ -212,21 +203,23 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
212 | 203 | ||
213 | XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart"); | 204 | XmlNodeList parts = doc.GetElementsByTagName("SceneObjectPart"); |
214 | 205 | ||
215 | // Process the root part first | 206 | if (parts.Count == 0) |
216 | if (parts.Count > 0) | ||
217 | { | 207 | { |
218 | StringReader sr = new StringReader(parts[0].OuterXml); | 208 | m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed: No SceneObjectPart nodes. xml was " + xmlData); |
219 | XmlTextReader reader = new XmlTextReader(sr); | 209 | return null; |
220 | sceneObject.SetRootPart(SceneObjectPart.FromXml(reader)); | ||
221 | reader.Close(); | ||
222 | sr.Close(); | ||
223 | } | 210 | } |
224 | 211 | ||
212 | StringReader sr = new StringReader(parts[0].OuterXml); | ||
213 | XmlTextReader reader = new XmlTextReader(sr); | ||
214 | SceneObjectGroup sceneObject = new SceneObjectGroup(SceneObjectPart.FromXml(reader)); | ||
215 | reader.Close(); | ||
216 | sr.Close(); | ||
217 | |||
225 | // Then deal with the rest | 218 | // Then deal with the rest |
226 | for (int i = 1; i < parts.Count; i++) | 219 | for (int i = 1; i < parts.Count; i++) |
227 | { | 220 | { |
228 | StringReader sr = new StringReader(parts[i].OuterXml); | 221 | sr = new StringReader(parts[i].OuterXml); |
229 | XmlTextReader reader = new XmlTextReader(sr); | 222 | reader = new XmlTextReader(sr); |
230 | SceneObjectPart part = SceneObjectPart.FromXml(reader); | 223 | SceneObjectPart part = SceneObjectPart.FromXml(reader); |
231 | sceneObject.AddPart(part); | 224 | sceneObject.AddPart(part); |
232 | part.StoreUndoState(); | 225 | part.StoreUndoState(); |
@@ -238,15 +231,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
238 | // ever a problem. | 231 | // ever a problem. |
239 | 232 | ||
240 | sceneObject.LoadScriptState(doc); | 233 | sceneObject.LoadScriptState(doc); |
234 | return sceneObject; | ||
241 | } | 235 | } |
242 | catch (Exception e) | 236 | catch (Exception e) |
243 | { | 237 | { |
244 | m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); | 238 | m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}. xml was {1}", e, xmlData); |
239 | return null; | ||
245 | } | 240 | } |
246 | |||
247 | //m_log.DebugFormat("[SERIALIZER]: Finished deserialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time); | ||
248 | |||
249 | return sceneObject; | ||
250 | } | 241 | } |
251 | 242 | ||
252 | /// <summary> | 243 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs index bb8f27d..3b0e77f 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs | |||
@@ -128,7 +128,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
128 | 128 | ||
129 | private SceneObjectGroup NewSOG() | 129 | private SceneObjectGroup NewSOG() |
130 | { | 130 | { |
131 | SceneObjectGroup sog = new SceneObjectGroup(); | ||
132 | SceneObjectPart sop = new SceneObjectPart(UUID.Random(), PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); | 131 | SceneObjectPart sop = new SceneObjectPart(UUID.Random(), PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero); |
133 | sop.Name = RandomName(); | 132 | sop.Name = RandomName(); |
134 | sop.Description = sop.Name; | 133 | sop.Description = sop.Name; |
@@ -136,9 +135,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
136 | sop.SitName = RandomName(); | 135 | sop.SitName = RandomName(); |
137 | sop.TouchName = RandomName(); | 136 | sop.TouchName = RandomName(); |
138 | sop.ObjectFlags |= (uint)PrimFlags.Phantom; | 137 | sop.ObjectFlags |= (uint)PrimFlags.Phantom; |
139 | |||
140 | sog.SetRootPart(sop); | ||
141 | 138 | ||
139 | SceneObjectGroup sog = new SceneObjectGroup(sop); | ||
142 | scene.AddNewSceneObject(sog, false); | 140 | scene.AddNewSceneObject(sog, false); |
143 | 141 | ||
144 | return sog; | 142 | return sog; |
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs index 7fb2d25..19c0fea 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs | |||
@@ -407,9 +407,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests | |||
407 | sop.Shape.State = 1; | 407 | sop.Shape.State = 1; |
408 | sop.OwnerID = agent; | 408 | sop.OwnerID = agent; |
409 | 409 | ||
410 | SceneObjectGroup sog = new SceneObjectGroup(); | 410 | SceneObjectGroup sog = new SceneObjectGroup(sop); |
411 | sog.SetScene(scene); | 411 | sog.SetScene(scene); |
412 | sog.SetRootPart(sop); | ||
413 | 412 | ||
414 | return sog; | 413 | return sog; |
415 | } | 414 | } |