diff options
author | Teravus Ovares | 2008-02-12 07:32:32 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-02-12 07:32:32 +0000 |
commit | e5ede36f0c8974dc81d1755d16513641aff535c2 (patch) | |
tree | ea29d39f83ceb72b61d98184aab08c90ee3d7b10 | |
parent | * A bunch of updates to make things more smooth. (diff) | |
download | opensim-SC-e5ede36f0c8974dc81d1755d16513641aff535c2.zip opensim-SC-e5ede36f0c8974dc81d1755d16513641aff535c2.tar.gz opensim-SC-e5ede36f0c8974dc81d1755d16513641aff535c2.tar.bz2 opensim-SC-e5ede36f0c8974dc81d1755d16513641aff535c2.tar.xz |
* Physical prim cross borders and continue from where the left off on the other side now, assuming the region on the other side has physical prim enabled.
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 22 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 25 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 44 |
5 files changed, 78 insertions, 19 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index b797cc3..ba2a2cf 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -745,7 +745,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
745 | } | 745 | } |
746 | catch (Exception e) | 746 | catch (Exception e) |
747 | { | 747 | { |
748 | m_log.Error("[Scene]: Failed with exception " + e.ToString()); | 748 | m_log.Error("[Scene]: Failed with exception " + e.ToString() + " On Region: " + RegionInfo.RegionName); |
749 | } | 749 | } |
750 | finally | 750 | finally |
751 | { | 751 | { |
@@ -1230,32 +1230,32 @@ namespace OpenSim.Region.Environment.Scenes | |||
1230 | int thisx = (int)RegionInfo.RegionLocX; | 1230 | int thisx = (int)RegionInfo.RegionLocX; |
1231 | int thisy = (int)RegionInfo.RegionLocY; | 1231 | int thisy = (int)RegionInfo.RegionLocY; |
1232 | ulong newRegionHandle = 0; | 1232 | ulong newRegionHandle = 0; |
1233 | LLVector3 pos = grp.AbsolutePosition; | 1233 | LLVector3 pos = position; |
1234 | 1234 | ||
1235 | if (position.X > 255.6f) | 1235 | if (position.X > 257f) |
1236 | { | 1236 | { |
1237 | pos.X = ((pos.X - 256) + 10); | 1237 | pos.X = ((pos.X - 256)); |
1238 | 1238 | ||
1239 | newRegionHandle = Util.UIntsToLong((uint)((thisx + 1) * 256), (uint)(thisy * 256)); | 1239 | newRegionHandle = Util.UIntsToLong((uint)((thisx + 1) * 256), (uint)(thisy * 256)); |
1240 | 1240 | ||
1241 | // x + 1 | 1241 | // x + 1 |
1242 | } | 1242 | } |
1243 | else if (position.X < 0.4f) | 1243 | else if (position.X < -1f) |
1244 | { | 1244 | { |
1245 | pos.X = ((pos.X + 256) - 10); | 1245 | pos.X = ((pos.X + 256)); |
1246 | newRegionHandle = Util.UIntsToLong((uint)((thisx - 1) * 256), (uint)(thisy * 256)); | 1246 | newRegionHandle = Util.UIntsToLong((uint)((thisx - 1) * 256), (uint)(thisy * 256)); |
1247 | // x - 1 | 1247 | // x - 1 |
1248 | } | 1248 | } |
1249 | 1249 | ||
1250 | if (position.Y > 255.6f) | 1250 | if (position.Y > 257f) |
1251 | { | 1251 | { |
1252 | pos.Y = ((pos.Y - 256) + 10); | 1252 | pos.Y = ((pos.Y - 256)); |
1253 | newRegionHandle = Util.UIntsToLong((uint)(thisx * 256), (uint)((thisy + 1) * 256)); | 1253 | newRegionHandle = Util.UIntsToLong((uint)(thisx * 256), (uint)((thisy + 1) * 256)); |
1254 | // y + 1 | 1254 | // y + 1 |
1255 | } | 1255 | } |
1256 | else if (position.Y < 0.4f) | 1256 | else if (position.Y < -1f) |
1257 | { | 1257 | { |
1258 | pos.Y = ((pos.Y + 256) - 10); | 1258 | pos.Y = ((pos.Y + 256)); |
1259 | newRegionHandle = Util.UIntsToLong((uint)(thisx * 256), (uint)((thisy - 1) * 256)); | 1259 | newRegionHandle = Util.UIntsToLong((uint)(thisx * 256), (uint)((thisy - 1) * 256)); |
1260 | // y - 1 | 1260 | // y - 1 |
1261 | } | 1261 | } |
@@ -1287,7 +1287,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1287 | } | 1287 | } |
1288 | public void IncomingInterRegionPrimGroup(ulong regionHandle, LLUUID primID, string objXMLData) | 1288 | public void IncomingInterRegionPrimGroup(ulong regionHandle, LLUUID primID, string objXMLData) |
1289 | { | 1289 | { |
1290 | m_log.Warn("{[INTERREGION]: OMG! A new prim arrived from a neighbor!.. Kyill eeehht! before it corrupts my entire database! AHHH! I feel so dirty now! yuck! ack! arg!"); | 1290 | m_log.Warn("{[INTERREGION]: A new prim arrived from a neighbor"); |
1291 | m_sceneXmlLoader.LoadGroupFromXml2String(objXMLData); | 1291 | m_sceneXmlLoader.LoadGroupFromXml2String(objXMLData); |
1292 | 1292 | ||
1293 | } | 1293 | } |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 3b146ea..117bcbc 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -126,7 +126,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
126 | set | 126 | set |
127 | { | 127 | { |
128 | LLVector3 val = value; | 128 | LLVector3 val = value; |
129 | if (val.X > 255.6f || val.X < 0.4f || val.Y > 255.6f || val.Y < 0.4f) | 129 | if (val.X > 257f || val.X < -1f || val.Y > 257f || val.Y < -1f) |
130 | { | 130 | { |
131 | m_scene.CrossPrimGroupIntoNewRegion(val, this); | 131 | m_scene.CrossPrimGroupIntoNewRegion(val, this); |
132 | } | 132 | } |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 7900900..4f5eefe 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -405,7 +405,19 @@ namespace OpenSim.Region.Environment.Scenes | |||
405 | 405 | ||
406 | return m_velocity; | 406 | return m_velocity; |
407 | } | 407 | } |
408 | set { m_velocity = value; } | 408 | set { |
409 | |||
410 | m_velocity = value; | ||
411 | if (PhysActor != null) | ||
412 | { | ||
413 | if (PhysActor.IsPhysical) | ||
414 | { | ||
415 | PhysActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z); | ||
416 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | ||
417 | } | ||
418 | } | ||
419 | |||
420 | } | ||
409 | } | 421 | } |
410 | 422 | ||
411 | public LLVector3 RotationalVelocity | 423 | public LLVector3 RotationalVelocity |
@@ -742,6 +754,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
742 | { | 754 | { |
743 | XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart)); | 755 | XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart)); |
744 | SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader); | 756 | SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader); |
757 | |||
745 | return newobject; | 758 | return newobject; |
746 | } | 759 | } |
747 | 760 | ||
@@ -1776,6 +1789,16 @@ namespace OpenSim.Region.Environment.Scenes | |||
1776 | 1789 | ||
1777 | public void PhysicsRequestingTerseUpdate() | 1790 | public void PhysicsRequestingTerseUpdate() |
1778 | { | 1791 | { |
1792 | if (PhysActor != null) | ||
1793 | { | ||
1794 | LLVector3 newpos = new LLVector3(PhysActor.Position.GetBytes(), 0); | ||
1795 | if (newpos.X > 257f || newpos.X < -1f || newpos.Y > 257f || newpos.Y < -1f) | ||
1796 | { | ||
1797 | m_parentGroup.AbsolutePosition = newpos; | ||
1798 | return; | ||
1799 | } | ||
1800 | |||
1801 | } | ||
1779 | ScheduleTerseUpdate(); | 1802 | ScheduleTerseUpdate(); |
1780 | 1803 | ||
1781 | //SendTerseUpdateToAllClients(); | 1804 | //SendTerseUpdateToAllClients(); |
diff --git a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs index 6d911f1..4982613 100644 --- a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs +++ b/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs | |||
@@ -175,6 +175,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
175 | public void CreatePrimFromXml(string xmlData) | 175 | public void CreatePrimFromXml(string xmlData) |
176 | { | 176 | { |
177 | SceneObjectGroup obj = new SceneObjectGroup(xmlData); | 177 | SceneObjectGroup obj = new SceneObjectGroup(xmlData); |
178 | LLVector3 receivedVelocity = obj.RootPart.Velocity; | ||
179 | //System.Console.WriteLine(obj.RootPart.Velocity.ToString()); | ||
178 | m_innerScene.AddEntityFromStorage(obj); | 180 | m_innerScene.AddEntityFromStorage(obj); |
179 | 181 | ||
180 | SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); | 182 | SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); |
@@ -191,6 +193,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
191 | new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, | 193 | new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, |
192 | rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); | 194 | rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); |
193 | rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); | 195 | rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); |
196 | rootPart.Velocity = receivedVelocity; | ||
197 | |||
194 | } | 198 | } |
195 | } | 199 | } |
196 | 200 | ||
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 819d823..5cdbb77 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -49,6 +49,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
49 | private Quaternion _orientation; | 49 | private Quaternion _orientation; |
50 | private PhysicsVector m_taintposition; | 50 | private PhysicsVector m_taintposition; |
51 | private PhysicsVector m_taintsize; | 51 | private PhysicsVector m_taintsize; |
52 | private PhysicsVector m_taintVelocity = PhysicsVector.Zero; | ||
52 | private Quaternion m_taintrot; | 53 | private Quaternion m_taintrot; |
53 | private bool m_taintshape = false; | 54 | private bool m_taintshape = false; |
54 | private bool m_taintPhysics = false; | 55 | private bool m_taintPhysics = false; |
@@ -455,8 +456,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
455 | 456 | ||
456 | if (m_taintdisable) | 457 | if (m_taintdisable) |
457 | changedisable(timestep); | 458 | changedisable(timestep); |
459 | |||
460 | if (m_taintVelocity != PhysicsVector.Zero) | ||
461 | changevelocity(timestep); | ||
458 | } | 462 | } |
459 | 463 | ||
464 | |||
465 | |||
460 | public void Move(float timestep) | 466 | public void Move(float timestep) |
461 | { | 467 | { |
462 | if (m_isphysical) | 468 | if (m_isphysical) |
@@ -743,7 +749,18 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
743 | m_taintforce = false; | 749 | m_taintforce = false; |
744 | 750 | ||
745 | } | 751 | } |
746 | 752 | private void changevelocity(float timestep) | |
753 | { | ||
754 | System.Threading.Thread.Sleep(20); | ||
755 | if (IsPhysical) | ||
756 | { | ||
757 | if (Body != (IntPtr)0) | ||
758 | { | ||
759 | d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); | ||
760 | } | ||
761 | } | ||
762 | m_taintVelocity = PhysicsVector.Zero; | ||
763 | } | ||
747 | public override bool IsPhysical | 764 | public override bool IsPhysical |
748 | { | 765 | { |
749 | get { return m_isphysical; } | 766 | get { return m_isphysical; } |
@@ -838,7 +855,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
838 | returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z)/2; | 855 | returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z)/2; |
839 | return returnVelocity; | 856 | return returnVelocity; |
840 | } | 857 | } |
841 | set { _velocity = value; } | 858 | set { |
859 | _velocity = value; | ||
860 | |||
861 | m_taintVelocity = value; | ||
862 | _parent_scene.AddPhysicsActorTaint(this); | ||
863 | |||
864 | |||
865 | } | ||
842 | } | 866 | } |
843 | 867 | ||
844 | public override bool Kinematic | 868 | public override bool Kinematic |
@@ -898,16 +922,24 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
898 | d.Vector3 rotvel = d.BodyGetAngularVel(Body); | 922 | d.Vector3 rotvel = d.BodyGetAngularVel(Body); |
899 | 923 | ||
900 | PhysicsVector l_position = new PhysicsVector(); | 924 | PhysicsVector l_position = new PhysicsVector(); |
925 | |||
926 | |||
901 | // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) | 927 | // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) |
902 | if (vec.X < 0.0f) vec.X = 0.0f; | 928 | //if (vec.X < 0.0f) vec.X = 0.0f; |
903 | if (vec.Y < 0.0f) vec.Y = 0.0f; | 929 | //if (vec.Y < 0.0f) vec.Y = 0.0f; |
904 | if (vec.X > 255.95f) vec.X = 255.95f; | 930 | //if (vec.X > 255.95f) vec.X = 255.95f; |
905 | if (vec.Y > 255.95f) vec.Y = 255.95f; | 931 | //if (vec.Y > 255.95f) vec.Y = 255.95f; |
906 | m_lastposition = _position; | 932 | m_lastposition = _position; |
907 | 933 | ||
908 | l_position.X = vec.X; | 934 | l_position.X = vec.X; |
909 | l_position.Y = vec.Y; | 935 | l_position.Y = vec.Y; |
910 | l_position.Z = vec.Z; | 936 | l_position.Z = vec.Z; |
937 | |||
938 | if (l_position.X > 257f || l_position.X < -1f || l_position.Y > 257f || l_position.Y < -1f) | ||
939 | { | ||
940 | base.RequestPhysicsterseUpdate(); | ||
941 | } | ||
942 | |||
911 | if (l_position.Z < 0) | 943 | if (l_position.Z < 0) |
912 | { | 944 | { |
913 | // This is so prim that get lost underground don't fall forever and suck up | 945 | // This is so prim that get lost underground don't fall forever and suck up |