aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectPart.cs')
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs78
1 files changed, 46 insertions, 32 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 76fe4b6..7bab3b6 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -170,9 +170,10 @@ namespace OpenSim.Region.Environment.Scenes
170 { 170 {
171 try 171 try
172 { 172 {
173 //lock (m_scene.SyncRoot) 173 //lock (m_parentGroup.m_scene.SyncRoot)
174 //{ 174 //{
175 PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); 175 PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
176 m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor);
176 //} 177 //}
177 } 178 }
178 catch (Exception e) 179 catch (Exception e)
@@ -225,6 +226,7 @@ namespace OpenSim.Region.Environment.Scenes
225 //lock (m_scene.SyncRoot) 226 //lock (m_scene.SyncRoot)
226 //{ 227 //{
227 PhysActor.Orientation = new Quaternion(value.W, value.X, value.Y, value.Z); 228 PhysActor.Orientation = new Quaternion(value.W, value.X, value.Y, value.Z);
229 m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor);
228 //} 230 //}
229 } 231 }
230 catch (Exception ex) 232 catch (Exception ex)
@@ -502,7 +504,7 @@ namespace OpenSim.Region.Environment.Scenes
502 RotationOffset = rotation; 504 RotationOffset = rotation;
503 ObjectFlags = flags; 505 ObjectFlags = flags;
504 bool UsePhysics = ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0); 506 bool UsePhysics = ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
505 doPhysicsPropertyUpdate(UsePhysics); 507 doPhysicsPropertyUpdate(UsePhysics, true);
506 ScheduleFullUpdate(); 508 ScheduleFullUpdate();
507 } 509 }
508 510
@@ -518,7 +520,7 @@ namespace OpenSim.Region.Environment.Scenes
518 XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart)); 520 XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart));
519 SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader); 521 SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader);
520 bool UsePhysics = ((newobject.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0); 522 bool UsePhysics = ((newobject.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
521 newobject.doPhysicsPropertyUpdate(UsePhysics); 523 newobject.doPhysicsPropertyUpdate(UsePhysics, true);
522 524
523 return newobject; 525 return newobject;
524 } 526 }
@@ -586,7 +588,7 @@ namespace OpenSim.Region.Environment.Scenes
586 Array.Copy(Shape.ExtraParams, extraP, extraP.Length); 588 Array.Copy(Shape.ExtraParams, extraP, extraP.Length);
587 dupe.Shape.ExtraParams = extraP; 589 dupe.Shape.ExtraParams = extraP;
588 bool UsePhysics = ((dupe.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0); 590 bool UsePhysics = ((dupe.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
589 dupe.doPhysicsPropertyUpdate(UsePhysics); 591 dupe.doPhysicsPropertyUpdate(UsePhysics, true);
590 592
591 return dupe; 593 return dupe;
592 } 594 }
@@ -852,7 +854,7 @@ namespace OpenSim.Region.Environment.Scenes
852 AddFlag(LLObject.ObjectFlags.Physics); 854 AddFlag(LLObject.ObjectFlags.Physics);
853 if (!wasUsingPhysics) 855 if (!wasUsingPhysics)
854 { 856 {
855 doPhysicsPropertyUpdate(UsePhysics); 857 doPhysicsPropertyUpdate(UsePhysics,false);
856 } 858 }
857 859
858 } 860 }
@@ -861,7 +863,7 @@ namespace OpenSim.Region.Environment.Scenes
861 RemFlag(LLObject.ObjectFlags.Physics); 863 RemFlag(LLObject.ObjectFlags.Physics);
862 if (wasUsingPhysics) 864 if (wasUsingPhysics)
863 { 865 {
864 doPhysicsPropertyUpdate(UsePhysics); 866 doPhysicsPropertyUpdate(UsePhysics, false);
865 } 867 }
866 } 868 }
867 869
@@ -892,12 +894,12 @@ namespace OpenSim.Region.Environment.Scenes
892 new PhysicsVector(Scale.X, Scale.Y, Scale.Z), 894 new PhysicsVector(Scale.X, Scale.Y, Scale.Z),
893 new Quaternion(RotationOffset.W, RotationOffset.X, 895 new Quaternion(RotationOffset.W, RotationOffset.X,
894 RotationOffset.Y, RotationOffset.Z), UsePhysics); 896 RotationOffset.Y, RotationOffset.Z), UsePhysics);
895 doPhysicsPropertyUpdate(UsePhysics); 897 doPhysicsPropertyUpdate(UsePhysics, true);
896 } 898 }
897 else 899 else
898 { 900 {
899 PhysActor.IsPhysical = UsePhysics; 901 PhysActor.IsPhysical = UsePhysics;
900 doPhysicsPropertyUpdate(UsePhysics); 902 doPhysicsPropertyUpdate(UsePhysics,false);
901 } 903 }
902 } 904 }
903 905
@@ -912,36 +914,45 @@ namespace OpenSim.Region.Environment.Scenes
912// System.Console.WriteLine("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); 914// System.Console.WriteLine("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString());
913 ScheduleFullUpdate(); 915 ScheduleFullUpdate();
914 } 916 }
915 public void doPhysicsPropertyUpdate(bool UsePhysics) 917 public void doPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
916 { 918 {
917 919
918 if (PhysActor != null) 920 if (PhysActor != null)
919 { 921 {
920 if (PhysActor.IsPhysical) 922 if (UsePhysics != PhysActor.IsPhysical || isNew)
921 { 923 {
922 PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; 924
923 PhysActor.OnOutOfBounds -= PhysicsOutOfBounds; 925 if (PhysActor.IsPhysical)
924 } 926 {
925 m_parentGroup.m_scene.PhysScene.RemovePrim(PhysActor); 927 PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate;
926 /// that's not wholesome. Had to make m_scene public 928 PhysActor.OnOutOfBounds -= PhysicsOutOfBounds;
927 PhysActor = null; 929 }
928 930
929 if ((ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0) 931 PhysActor.IsPhysical = UsePhysics;
930 { 932 // If we're not what we're supposed to be in the physics scene, recreate ourselves.
931 PhysActor = m_parentGroup.m_scene.PhysScene.AddPrimShape( 933 //m_parentGroup.m_scene.PhysScene.RemovePrim(PhysActor);
932 Name, 934 /// that's not wholesome. Had to make m_scene public
933 Shape, 935 //PhysActor = null;
934 new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, 936
935 AbsolutePosition.Z), 937
936 new PhysicsVector(Scale.X, Scale.Y, Scale.Z), 938 if ((ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
937 new Quaternion(RotationOffset.W, RotationOffset.X,
938 RotationOffset.Y, RotationOffset.Z), UsePhysics);
939 if (UsePhysics)
940 { 939 {
941 PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; 940 //PhysActor = m_parentGroup.m_scene.PhysScene.AddPrimShape(
942 PhysActor.OnOutOfBounds += PhysicsOutOfBounds; 941 //Name,
942 //Shape,
943 //new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y,
944 //AbsolutePosition.Z),
945 //new PhysicsVector(Scale.X, Scale.Y, Scale.Z),
946 //new Quaternion(RotationOffset.W, RotationOffset.X,
947 //RotationOffset.Y, RotationOffset.Z), UsePhysics);
948 if (UsePhysics)
949 {
950 PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
951 PhysActor.OnOutOfBounds += PhysicsOutOfBounds;
952 }
943 } 953 }
944 } 954 }
955 m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor);
945 } 956 }
946 } 957 }
947 958
@@ -1195,8 +1206,11 @@ namespace OpenSim.Region.Environment.Scenes
1195 public void PhysicsOutOfBounds(PhysicsVector pos) 1206 public void PhysicsOutOfBounds(PhysicsVector pos)
1196 { 1207 {
1197 OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Physical Object went out of bounds."); 1208 OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Physical Object went out of bounds.");
1198 doPhysicsPropertyUpdate(false); 1209 RemFlag(LLObject.ObjectFlags.Physics);
1199 ScheduleFullUpdate(); 1210 doPhysicsPropertyUpdate(false,true);
1211 m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor);
1212
1213
1200 } 1214 }
1201 1215
1202 1216