aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
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.cs110
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs265
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs53
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/EntityManagerTests.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs3
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
28using System; 28
29using System.IO; 29using System.IO;
30using System.Reflection;
31using System.Text;
32using System.Text.RegularExpressions;
33using System.Xml;
34using System.Xml.Serialization;
35using log4net;
36using OpenMetaverse; 30using OpenMetaverse;
37using OpenSim.Data;
38using OpenSim.Framework;
39using OpenSim.Framework.Servers;
40using OpenSim.Framework.Servers.HttpServer;
41using OpenSim.Framework.Statistics;
42using System.Net;
43 31
44namespace OpenSim.Framework.Servers 32namespace 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
806if (m_shape != null) { 817if (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 }