aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorTeravus Ovares2008-02-12 04:27:20 +0000
committerTeravus Ovares2008-02-12 04:27:20 +0000
commit6e01769bcff35be9cace62a0342cf2d275608891 (patch)
tree124df7910fc0f1d31a13e297ced2dd73ce91a292 /OpenSim/Region
parentdefault to appending for log files per Mantis 530, and per (diff)
downloadopensim-SC-6e01769bcff35be9cace62a0342cf2d275608891.zip
opensim-SC-6e01769bcff35be9cace62a0342cf2d275608891.tar.gz
opensim-SC-6e01769bcff35be9cace62a0342cf2d275608891.tar.bz2
opensim-SC-6e01769bcff35be9cace62a0342cf2d275608891.tar.xz
* A bunch of updates to make things more smooth.
** Sending the actual TimeDilation to the client now instead of the 62455 constant. The client is *supposed* to use that value to sync with the simulator. (actually sending ushort.maxvalue * TimeDilation) ** Disabling prim that inter-penetrate instead of just not attaching a joint ** Reduced prim spin a 'little' bit, but not *enough* ** Tweaked the TimeDilation algorithm to be closer to 1.0 by default and various changes to the sim stats reporter ** Created a .SetValues method to PhysicsVector so we can simply call the setvalues function instead of .x, .y, .z sets. ** Experimented with a .GetBytes Method on PhysicsActor to be able to use the LLVector3.FromBytes() method. ** Upped the Inter-penetration depth to 0.25 instead of .08.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/ClientView.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/InnerScene.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs15
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs5
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs19
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/SimStatsReporter.cs14
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsVector.cs57
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs40
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs11
10 files changed, 133 insertions, 34 deletions
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index cb076b5..41ec783 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -1567,7 +1567,7 @@ namespace OpenSim.Region.ClientStack
1567 ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); 1567 ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
1568 // TODO: don't create new blocks if recycling an old packet 1568 // TODO: don't create new blocks if recycling an old packet
1569 objupdate.RegionData.RegionHandle = regionHandle; 1569 objupdate.RegionData.RegionHandle = regionHandle;
1570 objupdate.RegionData.TimeDilation = 64096; 1570 objupdate.RegionData.TimeDilation = ushort.MaxValue;
1571 objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1]; 1571 objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
1572 objupdate.ObjectData[0] = CreateDefaultAvatarPacket(textureEntry); 1572 objupdate.ObjectData[0] = CreateDefaultAvatarPacket(textureEntry);
1573 1573
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 219db63..7831858 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -240,7 +240,7 @@ namespace OpenSim.Region.Environment.Scenes
240 if (TryGetAvatar(remoteClient.AgentId, out av)) { 240 if (TryGetAvatar(remoteClient.AgentId, out av)) {
241 ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); 241 ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
242 objupdate.RegionData.RegionHandle = m_regInfo.RegionHandle; 242 objupdate.RegionData.RegionHandle = m_regInfo.RegionHandle;
243 objupdate.RegionData.TimeDilation = 64096; 243 objupdate.RegionData.TimeDilation = ushort.MaxValue;
244 objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[2]; 244 objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[2];
245 // avatar stuff - horrible group copypaste 245 // avatar stuff - horrible group copypaste
246 246
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 6b4f377..b797cc3 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -69,7 +69,7 @@ namespace OpenSim.Region.Environment.Scenes
69 public InnerScene m_innerScene; 69 public InnerScene m_innerScene;
70 70
71 private Random Rand = new Random(); 71 private Random Rand = new Random();
72 private uint _primCount = 702000; 72 private uint _primCount = 720000;
73 private readonly Mutex _primAllocateMutex = new Mutex(false); 73 private readonly Mutex _primAllocateMutex = new Mutex(false);
74 74
75 private int m_timePhase = 24; 75 private int m_timePhase = 24;
@@ -113,7 +113,7 @@ namespace OpenSim.Region.Environment.Scenes
113 113
114 protected int m_fps = 10; 114 protected int m_fps = 10;
115 protected int m_frame = 0; 115 protected int m_frame = 0;
116 protected float m_timespan = 0.1f; 116 protected float m_timespan = 0.089f;
117 protected DateTime m_lastupdate = DateTime.Now; 117 protected DateTime m_lastupdate = DateTime.Now;
118 118
119 protected float m_timedilation = 1.0f; 119 protected float m_timedilation = 1.0f;
@@ -750,8 +750,17 @@ namespace OpenSim.Region.Environment.Scenes
750 finally 750 finally
751 { 751 {
752 updateLock.ReleaseMutex(); 752 updateLock.ReleaseMutex();
753 // Get actual time dilation
754 float tmpval = (m_timespan / (float)SinceLastFrame.TotalSeconds);
753 755
754 m_timedilation = m_timespan / (float)SinceLastFrame.TotalSeconds; 756 // If actual time dilation is greater then one, we're catching up, so subtract
757 // the amount that's greater then 1 from the time dilation
758 if (tmpval > 1.0)
759 {
760 tmpval = tmpval - (tmpval - 1.0f);
761 }
762 m_timedilation = tmpval;
763
755 m_lastupdate = DateTime.Now; 764 m_lastupdate = DateTime.Now;
756 } 765 }
757 } 766 }
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index a745d9c..3b146ea 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -1593,7 +1593,10 @@ namespace OpenSim.Region.Environment.Scenes
1593 part.UpdateMovement(); 1593 part.UpdateMovement();
1594 } 1594 }
1595 } 1595 }
1596 1596 public float GetTimeDilation()
1597 {
1598 return m_scene.TimeDilation;
1599 }
1597 /// <summary> 1600 /// <summary>
1598 /// Added as a way for the storage provider to reset the scene, 1601 /// Added as a way for the storage provider to reset the scene,
1599 /// most likely a better way to do this sort of thing but for now... 1602 /// most likely a better way to do this sort of thing but for now...
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 180ed51..7900900 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -94,10 +94,12 @@ namespace OpenSim.Region.Environment.Scenes
94 public byte ObjectSaleType; 94 public byte ObjectSaleType;
95 public int SalePrice; 95 public int SalePrice;
96 public uint Category; 96 public uint Category;
97
97 98
98 public Int32 CreationDate; 99 public Int32 CreationDate;
99 public uint ParentID = 0; 100 public uint ParentID = 0;
100 101
102 private PhysicsVector m_lastRotationalVelocity = PhysicsVector.Zero;
101 private Vector3 m_sitTargetPosition = new Vector3(0, 0, 0); 103 private Vector3 m_sitTargetPosition = new Vector3(0, 0, 0);
102 private Quaternion m_sitTargetOrientation = new Quaternion(0, 0, 0, 1); 104 private Quaternion m_sitTargetOrientation = new Quaternion(0, 0, 0, 1);
103 private LLUUID m_sitTargetAvatar = LLUUID.Zero; 105 private LLUUID m_sitTargetAvatar = LLUUID.Zero;
@@ -417,9 +419,7 @@ namespace OpenSim.Region.Environment.Scenes
417 { 419 {
418 if (PhysActor.IsPhysical) 420 if (PhysActor.IsPhysical)
419 { 421 {
420 m_rotationalvelocity.X = PhysActor.RotationalVelocity.X; 422 m_rotationalvelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(),0);
421 m_rotationalvelocity.Y = PhysActor.RotationalVelocity.Y;
422 m_rotationalvelocity.Z = PhysActor.RotationalVelocity.Z;
423 } 423 }
424 } 424 }
425 425
@@ -1693,7 +1693,7 @@ namespace OpenSim.Region.Environment.Scenes
1693 1693
1694 1694
1695 byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A}; 1695 byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A};
1696 remoteClient.SendPrimitiveToClient(m_regionHandle, 64096, LocalID, m_shape, lPos, clientFlags, m_uuid, 1696 remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalID, m_shape, lPos, clientFlags, m_uuid,
1697 OwnerID, 1697 OwnerID,
1698 m_text, color, ParentID, m_particleSystem, lRot, m_clickAction, m_TextureAnimation); 1698 m_text, color, ParentID, m_particleSystem, lRot, m_clickAction, m_TextureAnimation);
1699 } 1699 }
@@ -1741,12 +1741,13 @@ namespace OpenSim.Region.Environment.Scenes
1741 LLQuaternion mRot = RotationOffset; 1741 LLQuaternion mRot = RotationOffset;
1742 if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0) 1742 if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0)
1743 { 1743 {
1744 remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot); 1744 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalID, lPos, mRot);
1745 } 1745 }
1746 else 1746 else
1747 { 1747 {
1748 remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot, Velocity, 1748 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalID, lPos, mRot, Velocity,
1749 RotationalVelocity); 1749 RotationalVelocity);
1750 //System.Console.WriteLine("LID: " + LocalID + " RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString());
1750 } 1751 }
1751 } 1752 }
1752 1753
@@ -1755,13 +1756,13 @@ namespace OpenSim.Region.Environment.Scenes
1755 LLQuaternion mRot = RotationOffset; 1756 LLQuaternion mRot = RotationOffset;
1756 if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0) 1757 if ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) == 0)
1757 { 1758 {
1758 remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot); 1759 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalID, lPos, mRot);
1759 } 1760 }
1760 else 1761 else
1761 { 1762 {
1762 remoteClient.SendPrimTerseUpdate(m_regionHandle, 64096, LocalID, lPos, mRot, Velocity, 1763 remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalID, lPos, mRot, Velocity,
1763 RotationalVelocity); 1764 RotationalVelocity);
1764 //System.Console.WriteLine("RVel:" + RotationalVelocity); 1765 //System.Console.WriteLine("LID: " + LocalID + "RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString());
1765 } 1766 }
1766 } 1767 }
1767 1768
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 8155b10..5403fc7 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -1289,7 +1289,7 @@ namespace OpenSim.Region.Environment.Scenes
1289 LLVector3 pos = m_pos; 1289 LLVector3 pos = m_pos;
1290 LLVector3 vel = Velocity; 1290 LLVector3 vel = Velocity;
1291 LLQuaternion rot = new LLQuaternion(m_bodyRot.x, m_bodyRot.y, m_bodyRot.z, m_bodyRot.w); 1291 LLQuaternion rot = new LLQuaternion(m_bodyRot.x, m_bodyRot.y, m_bodyRot.z, m_bodyRot.w);
1292 remoteClient.SendAvatarTerseUpdate(m_regionHandle, 64096, LocalId, new LLVector3(pos.X, pos.Y, pos.Z), 1292 remoteClient.SendAvatarTerseUpdate(m_regionHandle, (ushort)(m_scene.TimeDilation * (float)ushort.MaxValue), LocalId, new LLVector3(pos.X, pos.Y, pos.Z),
1293 new LLVector3(vel.X, vel.Y, vel.Z), rot); 1293 new LLVector3(vel.X, vel.Y, vel.Z), rot);
1294 1294
1295 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS); 1295 m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
diff --git a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
index 3e1fec2..a0539f0 100644
--- a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
+++ b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs
@@ -181,7 +181,7 @@ namespace OpenSim.Region.Environment.Scenes
181 // Then we divide the whole amount by the amount of seconds pass in between stats updates. 181 // Then we divide the whole amount by the amount of seconds pass in between stats updates.
182 182
183 sb[0].StatID = (uint) Stats.TimeDilation; 183 sb[0].StatID = (uint) Stats.TimeDilation;
184 sb[0].StatValue = ((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); 184 sb[0].StatValue = m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor));
185 185
186 sb[1].StatID = (uint) Stats.SimFPS; 186 sb[1].StatID = (uint) Stats.SimFPS;
187 sb[1].StatValue = simfps/statsUpdateFactor; 187 sb[1].StatValue = simfps/statsUpdateFactor;
@@ -280,13 +280,13 @@ namespace OpenSim.Region.Environment.Scenes
280 280
281 public void AddTimeDilation(float td) 281 public void AddTimeDilation(float td)
282 { 282 {
283 float tdsetting = td; 283 //float tdsetting = td;
284 if (tdsetting > 1.0f) 284 //if (tdsetting > 1.0f)
285 tdsetting = (tdsetting - (tdsetting - 0.91f)); 285 //tdsetting = (tdsetting - (tdsetting - 0.91f));
286 286
287 if (tdsetting < 0) 287 //if (tdsetting < 0)
288 tdsetting = 0.0f; 288 //tdsetting = 0.0f;
289 m_timeDilation += tdsetting; 289 m_timeDilation = td;
290 } 290 }
291 291
292 public void SetRootAgents(int rootAgents) 292 public void SetRootAgents(int rootAgents)
diff --git a/OpenSim/Region/Physics/Manager/PhysicsVector.cs b/OpenSim/Region/Physics/Manager/PhysicsVector.cs
index 1f5d0dc..4b2e756 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsVector.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsVector.cs
@@ -46,7 +46,12 @@ namespace OpenSim.Region.Physics.Manager
46 Y = y; 46 Y = y;
47 Z = z; 47 Z = z;
48 } 48 }
49 49 public void setValues(float x, float y, float z)
50 {
51 X = x;
52 Y = y;
53 Z = z;
54 }
50 public static readonly PhysicsVector Zero = new PhysicsVector(0f, 0f, 0f); 55 public static readonly PhysicsVector Zero = new PhysicsVector(0f, 0f, 0f);
51 56
52 public override string ToString() 57 public override string ToString()
@@ -54,6 +59,56 @@ namespace OpenSim.Region.Physics.Manager
54 return "<" + X + "," + Y + "," + Z + ">"; 59 return "<" + X + "," + Y + "," + Z + ">";
55 } 60 }
56 61
62 /// <summary>
63 /// These routines are the easiest way to store XYZ values in an LLVector3 without requiring 3 calls.
64 /// </summary>
65 /// <returns></returns>
66 public byte[] GetBytes()
67 {
68 byte[] byteArray = new byte[12];
69
70 Buffer.BlockCopy(BitConverter.GetBytes(X), 0, byteArray, 0, 4);
71 Buffer.BlockCopy(BitConverter.GetBytes(Y), 0, byteArray, 4, 4);
72 Buffer.BlockCopy(BitConverter.GetBytes(Z), 0, byteArray, 8, 4);
73
74 if (!BitConverter.IsLittleEndian)
75 {
76 Array.Reverse(byteArray, 0, 4);
77 Array.Reverse(byteArray, 4, 4);
78 Array.Reverse(byteArray, 8, 4);
79 }
80
81 return byteArray;
82 }
83
84 public void FromBytes(byte[] byteArray, int pos)
85 {
86 byte[] conversionBuffer = null;
87 if (!BitConverter.IsLittleEndian)
88 {
89 // Big endian architecture
90 if (conversionBuffer == null)
91 conversionBuffer = new byte[12];
92
93 Buffer.BlockCopy(byteArray, pos, conversionBuffer, 0, 12);
94
95 Array.Reverse(conversionBuffer, 0, 4);
96 Array.Reverse(conversionBuffer, 4, 4);
97 Array.Reverse(conversionBuffer, 8, 4);
98
99 X = BitConverter.ToSingle(conversionBuffer, 0);
100 Y = BitConverter.ToSingle(conversionBuffer, 4);
101 Z = BitConverter.ToSingle(conversionBuffer, 8);
102 }
103 else
104 {
105 // Little endian architecture
106 X = BitConverter.ToSingle(byteArray, pos);
107 Y = BitConverter.ToSingle(byteArray, pos + 4);
108 Z = BitConverter.ToSingle(byteArray, pos + 8);
109 }
110 }
111
57 // Operations 112 // Operations
58 public static PhysicsVector operator +(PhysicsVector a, PhysicsVector b) 113 public static PhysicsVector operator +(PhysicsVector a, PhysicsVector b)
59 { 114 {
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 12d7694..819d823 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -53,6 +53,7 @@ namespace OpenSim.Region.Physics.OdePlugin
53 private bool m_taintshape = false; 53 private bool m_taintshape = false;
54 private bool m_taintPhysics = false; 54 private bool m_taintPhysics = false;
55 public bool m_taintremove = false; 55 public bool m_taintremove = false;
56 public bool m_taintdisable = false;
56 57
57 private bool m_taintforce = false; 58 private bool m_taintforce = false;
58 private List<PhysicsVector> m_forcelist = new List<PhysicsVector>(); 59 private List<PhysicsVector> m_forcelist = new List<PhysicsVector>();
@@ -451,6 +452,9 @@ namespace OpenSim.Region.Physics.OdePlugin
451 452
452 if (m_taintforce) 453 if (m_taintforce)
453 changeAddForce(timestep); 454 changeAddForce(timestep);
455
456 if (m_taintdisable)
457 changedisable(timestep);
454 } 458 }
455 459
456 public void Move(float timestep) 460 public void Move(float timestep)
@@ -494,6 +498,13 @@ namespace OpenSim.Region.Physics.OdePlugin
494 498
495 m_taintrot = _orientation; 499 m_taintrot = _orientation;
496 } 500 }
501 public void changedisable(float timestep)
502 {
503 if (Body != (IntPtr) 0)
504 d.BodyDisable(Body);
505
506 m_taintdisable = false;
507 }
497 508
498 public void changePhysicsStatus(float timestap) 509 public void changePhysicsStatus(float timestap)
499 { 510 {
@@ -862,7 +873,16 @@ namespace OpenSim.Region.Physics.OdePlugin
862 873
863 public override PhysicsVector RotationalVelocity 874 public override PhysicsVector RotationalVelocity
864 { 875 {
865 get { return m_rotationalVelocity; } 876 get {
877 if (_zeroFlag)
878 return PhysicsVector.Zero;
879 m_lastUpdateSent = false;
880
881 if (m_rotationalVelocity.IsIdentical(PhysicsVector.Zero, 0.2f))
882 return PhysicsVector.Zero;
883
884 return m_rotationalVelocity;
885 }
866 set { m_rotationalVelocity = value; } 886 set { m_rotationalVelocity = value; }
867 } 887 }
868 888
@@ -917,6 +937,7 @@ namespace OpenSim.Region.Physics.OdePlugin
917 && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02)) 937 && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02))
918 { 938 {
919 _zeroFlag = true; 939 _zeroFlag = true;
940 m_throttleUpdates = false;
920 } 941 }
921 else 942 else
922 { 943 {
@@ -944,9 +965,7 @@ namespace OpenSim.Region.Physics.OdePlugin
944 { 965 {
945 m_throttleUpdates = false; 966 m_throttleUpdates = false;
946 throttleCounter = 0; 967 throttleCounter = 0;
947 m_rotationalVelocity.X = 0; 968 m_rotationalVelocity = PhysicsVector.Zero;
948 m_rotationalVelocity.Y = 0;
949 m_rotationalVelocity.Z = 0;
950 base.RequestPhysicsterseUpdate(); 969 base.RequestPhysicsterseUpdate();
951 m_lastUpdateSent = true; 970 m_lastUpdateSent = true;
952 } 971 }
@@ -960,10 +979,15 @@ namespace OpenSim.Region.Physics.OdePlugin
960 _velocity.X = vel.X; 979 _velocity.X = vel.X;
961 _velocity.Y = vel.Y; 980 _velocity.Y = vel.Y;
962 _velocity.Z = vel.Z; 981 _velocity.Z = vel.Z;
963 982 if (_velocity.IsIdentical(PhysicsVector.Zero, 0.5f))
964 m_rotationalVelocity.X = rotvel.X; 983 {
965 m_rotationalVelocity.Y = rotvel.Y; 984 m_rotationalVelocity = PhysicsVector.Zero;
966 m_rotationalVelocity.Z = rotvel.Z; 985 }
986 else
987 {
988 m_rotationalVelocity.setValues(rotvel.X, rotvel.Y, rotvel.Z);
989 }
990
967 //System.Console.WriteLine("ODE: " + m_rotationalVelocity.ToString()); 991 //System.Console.WriteLine("ODE: " + m_rotationalVelocity.ToString());
968 _orientation.w = ori.W; 992 _orientation.w = ori.W;
969 _orientation.x = ori.X; 993 _orientation.x = ori.X;
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index f1d8232..1aa141b 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -405,8 +405,15 @@ namespace OpenSim.Region.Physics.OdePlugin
405 // If you interpenetrate a prim with another prim 405 // If you interpenetrate a prim with another prim
406 if (p1.PhysicsActorType == (int) ActorTypes.Prim && p2.PhysicsActorType == (int) ActorTypes.Prim) 406 if (p1.PhysicsActorType == (int) ActorTypes.Prim && p2.PhysicsActorType == (int) ActorTypes.Prim)
407 { 407 {
408 // Don't collide, one or both prim will explode. 408 if (contacts[i].depth >= 0.25f)
409 contacts[i].depth = 0f; 409 {
410 // Don't collide, one or both prim will explode.
411 ((OdePrim)p1).m_taintdisable = true;
412 AddPhysicsActorTaint(p1);
413 ((OdePrim)p2).m_taintdisable = true;
414 AddPhysicsActorTaint(p2);
415 contacts[i].depth = 0f;
416 }
410 } 417 }
411 if (contacts[i].depth >= 1.00f) 418 if (contacts[i].depth >= 1.00f)
412 { 419 {