diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 128 |
1 files changed, 120 insertions, 8 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 16c6bb0..9f160a5 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -49,6 +49,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
49 | private CollisionLocker ode; | 49 | private CollisionLocker ode; |
50 | private OdeScene _mScene; | 50 | private OdeScene _mScene; |
51 | 51 | ||
52 | |||
52 | public OdePlugin() | 53 | public OdePlugin() |
53 | { | 54 | { |
54 | ode = new CollisionLocker(); | 55 | ode = new CollisionLocker(); |
@@ -98,16 +99,26 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
98 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 99 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
99 | 100 | ||
100 | CollisionLocker ode; | 101 | CollisionLocker ode; |
101 | 102 | ||
103 | protected Random fluidRandomizer = new Random(System.Environment.TickCount); | ||
104 | |||
102 | private const uint m_regionWidth = Constants.RegionSize; | 105 | private const uint m_regionWidth = Constants.RegionSize; |
103 | private const uint m_regionHeight = Constants.RegionSize; | 106 | private const uint m_regionHeight = Constants.RegionSize; |
104 | 107 | ||
105 | private static float ODE_STEPSIZE = 0.020f; | 108 | private static float ODE_STEPSIZE = 0.020f; |
106 | private static float metersInSpace = 29.9f; | 109 | private static float metersInSpace = 29.9f; |
107 | 110 | ||
111 | private float waterlevel = 0f; | ||
112 | private int framecount = 0; | ||
108 | private IntPtr contactgroup; | 113 | private IntPtr contactgroup; |
109 | private IntPtr LandGeom = (IntPtr) 0; | 114 | private IntPtr LandGeom = (IntPtr) 0; |
115 | |||
116 | private IntPtr WaterGeom = (IntPtr)0; | ||
117 | |||
110 | private float[] _heightmap; | 118 | private float[] _heightmap; |
119 | |||
120 | private float[] _watermap; | ||
121 | |||
111 | private float[] _origheightmap; | 122 | private float[] _origheightmap; |
112 | 123 | ||
113 | private d.NearCallback nearCallback; | 124 | private d.NearCallback nearCallback; |
@@ -120,13 +131,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
120 | public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); | 131 | public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); |
121 | public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); | 132 | public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>(); |
122 | private d.ContactGeom[] contacts = new d.ContactGeom[80]; | 133 | private d.ContactGeom[] contacts = new d.ContactGeom[80]; |
134 | |||
123 | private d.Contact contact; | 135 | private d.Contact contact; |
124 | private d.Contact TerrainContact; | 136 | private d.Contact TerrainContact; |
125 | private d.Contact AvatarMovementprimContact; | 137 | private d.Contact AvatarMovementprimContact; |
126 | private d.Contact AvatarMovementTerrainContact; | 138 | private d.Contact AvatarMovementTerrainContact; |
139 | private d.Contact WaterContact; | ||
127 | 140 | ||
128 | |||
129 | 141 | ||
142 | private int m_randomizeWater = 200; | ||
130 | private int m_physicsiterations = 10; | 143 | private int m_physicsiterations = 10; |
131 | private float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag | 144 | private float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag |
132 | private PhysicsActor PANull = new NullPhysicsActor(); | 145 | private PhysicsActor PANull = new NullPhysicsActor(); |
@@ -176,6 +189,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
176 | TerrainContact.surface.bounce = 0.1f; | 189 | TerrainContact.surface.bounce = 0.1f; |
177 | TerrainContact.surface.soft_erp = 0.1025f; | 190 | TerrainContact.surface.soft_erp = 0.1025f; |
178 | 191 | ||
192 | WaterContact.surface.mode |= (d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM); | ||
193 | WaterContact.surface.mu = 0f; // No friction | ||
194 | WaterContact.surface.bounce = 0.0f; // No bounce | ||
195 | WaterContact.surface.soft_cfm = 0.01f; | ||
196 | WaterContact.surface.soft_erp = 0.010f; | ||
197 | |||
179 | // Prim contact friction and bounce | 198 | // Prim contact friction and bounce |
180 | // THis is the *non* moving version of friction and bounce | 199 | // THis is the *non* moving version of friction and bounce |
181 | // Use this when an avatar comes in contact with a prim | 200 | // Use this when an avatar comes in contact with a prim |
@@ -187,8 +206,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
187 | // Use this when an avatar is in contact with the terrain and moving. | 206 | // Use this when an avatar is in contact with the terrain and moving. |
188 | AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP; | 207 | AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP; |
189 | AvatarMovementTerrainContact.surface.mu = 75.0f; | 208 | AvatarMovementTerrainContact.surface.mu = 75.0f; |
190 | AvatarMovementTerrainContact.surface.bounce = 0.1f; | 209 | AvatarMovementTerrainContact.surface.bounce = 0.05f; |
191 | AvatarMovementTerrainContact.surface.soft_erp = 0.1025f; | 210 | AvatarMovementTerrainContact.surface.soft_erp = 0.05025f; |
192 | 211 | ||
193 | lock (OdeLock) | 212 | lock (OdeLock) |
194 | { | 213 | { |
@@ -216,7 +235,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
216 | 235 | ||
217 | // zero out a heightmap array float array (single dimention [flattened])) | 236 | // zero out a heightmap array float array (single dimention [flattened])) |
218 | _heightmap = new float[514*514]; | 237 | _heightmap = new float[514*514]; |
219 | 238 | _watermap = new float[258 * 258]; | |
220 | 239 | ||
221 | // Zero out the prim spaces array (we split our space into smaller spaces so | 240 | // Zero out the prim spaces array (we split our space into smaller spaces so |
222 | // we can hit test less. | 241 | // we can hit test less. |
@@ -571,12 +590,36 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
571 | joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); | 590 | joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); |
572 | } | 591 | } |
573 | } | 592 | } |
593 | else if (name1 == "Water" || name2 == "Water") | ||
594 | { | ||
595 | if ((p2.PhysicsActorType == (int)ActorTypes.Prim)) | ||
596 | { | ||
597 | |||
598 | } | ||
599 | else | ||
600 | { | ||
601 | |||
602 | } | ||
603 | WaterContact.surface.soft_cfm = 0.0000f; | ||
604 | WaterContact.surface.soft_erp = 0.00000f; | ||
605 | if (contacts[i].depth > 0.1f) | ||
606 | { | ||
607 | contacts[i].depth *= 52; | ||
608 | //contacts[i].normal = new d.Vector3(0, 0, 1); | ||
609 | //contacts[i].pos = new d.Vector3(0, 0, contacts[i].pos.Z - 5f); | ||
610 | } | ||
611 | WaterContact.geom = contacts[i]; | ||
612 | |||
613 | joint = d.JointCreateContact(world, contactgroup, ref WaterContact); | ||
614 | |||
615 | //m_log.Info("[PHYSICS]: Prim Water Contact" + contacts[i].depth); | ||
616 | } | ||
574 | else | 617 | else |
575 | { | 618 | { |
576 | // we're colliding with prim or avatar | 619 | // we're colliding with prim or avatar |
577 | 620 | ||
578 | // check if we're moving | 621 | // check if we're moving |
579 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && | 622 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent) && |
580 | (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | 623 | (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) |
581 | { | 624 | { |
582 | // Use the Movement prim contact | 625 | // Use the Movement prim contact |
@@ -1279,6 +1322,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1279 | /// <returns></returns> | 1322 | /// <returns></returns> |
1280 | public override float Simulate(float timeStep) | 1323 | public override float Simulate(float timeStep) |
1281 | { | 1324 | { |
1325 | if (framecount >= int.MaxValue) | ||
1326 | framecount = 0; | ||
1327 | |||
1328 | framecount++; | ||
1329 | |||
1282 | float fps = 0; | 1330 | float fps = 0; |
1283 | //m_log.Info(timeStep.ToString()); | 1331 | //m_log.Info(timeStep.ToString()); |
1284 | step_time += timeStep; | 1332 | step_time += timeStep; |
@@ -1369,11 +1417,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1369 | foreach (OdePrim prim in _activeprims) | 1417 | foreach (OdePrim prim in _activeprims) |
1370 | { | 1418 | { |
1371 | prim.m_collisionscore = 0; | 1419 | prim.m_collisionscore = 0; |
1420 | prim.Move(timeStep); | ||
1372 | } | 1421 | } |
1373 | } | 1422 | } |
1374 | 1423 | ||
1375 | 1424 | //if ((framecount % m_randomizeWater) == 0) | |
1376 | 1425 | // randomizeWater(waterlevel); | |
1377 | 1426 | ||
1378 | 1427 | ||
1379 | collision_optimized(timeStep); | 1428 | collision_optimized(timeStep); |
@@ -1772,6 +1821,69 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1772 | { | 1821 | { |
1773 | } | 1822 | } |
1774 | 1823 | ||
1824 | public override void SetWaterLevel(float baseheight) | ||
1825 | { | ||
1826 | waterlevel = baseheight; | ||
1827 | randomizeWater(waterlevel); | ||
1828 | } | ||
1829 | |||
1830 | public void randomizeWater(float baseheight) | ||
1831 | { | ||
1832 | const uint heightmapWidth = m_regionWidth + 2; | ||
1833 | const uint heightmapHeight = m_regionHeight + 2; | ||
1834 | const uint heightmapWidthSamples = m_regionWidth + 2; | ||
1835 | const uint heightmapHeightSamples = m_regionHeight + 2; | ||
1836 | const float scale = 1.0f; | ||
1837 | const float offset = 0.0f; | ||
1838 | const float thickness = 2.9f; | ||
1839 | const int wrap = 0; | ||
1840 | |||
1841 | for (int i = 0; i < (258 * 258); i++) | ||
1842 | { | ||
1843 | _watermap[i] = (baseheight-0.1f) + ((float)fluidRandomizer.Next(1,9) / 10f); | ||
1844 | // m_log.Info((baseheight - 0.1f) + ((float)fluidRandomizer.Next(1, 9) / 10f)); | ||
1845 | } | ||
1846 | |||
1847 | |||
1848 | lock (OdeLock) | ||
1849 | { | ||
1850 | if (!(WaterGeom == (IntPtr)0)) | ||
1851 | { | ||
1852 | d.SpaceRemove(space, WaterGeom); | ||
1853 | } | ||
1854 | IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); | ||
1855 | d.GeomHeightfieldDataBuildSingle(HeightmapData, _watermap, 0, heightmapWidth, heightmapHeight, | ||
1856 | (int)heightmapWidthSamples, (int)heightmapHeightSamples, scale, | ||
1857 | offset, thickness, wrap); | ||
1858 | d.GeomHeightfieldDataSetBounds(HeightmapData, m_regionWidth, m_regionHeight); | ||
1859 | WaterGeom = d.CreateHeightfield(space, HeightmapData, 1); | ||
1860 | if (WaterGeom != (IntPtr)0) | ||
1861 | { | ||
1862 | d.GeomSetCategoryBits(WaterGeom, (int)(CollisionCategories.Water)); | ||
1863 | d.GeomSetCollideBits(WaterGeom, (int)(CollisionCategories.Space)); | ||
1864 | |||
1865 | } | ||
1866 | geom_name_map[WaterGeom] = "Water"; | ||
1867 | |||
1868 | d.Matrix3 R = new d.Matrix3(); | ||
1869 | |||
1870 | Quaternion q1 = Quaternion.FromAngleAxis(1.5707f, new Vector3(1, 0, 0)); | ||
1871 | Quaternion q2 = Quaternion.FromAngleAxis(1.5707f, new Vector3(0, 1, 0)); | ||
1872 | //Axiom.Math.Quaternion q3 = Axiom.Math.Quaternion.FromAngleAxis(3.14f, new Axiom.Math.Vector3(0, 0, 1)); | ||
1873 | |||
1874 | q1 = q1 * q2; | ||
1875 | //q1 = q1 * q3; | ||
1876 | Vector3 v3 = new Vector3(); | ||
1877 | float angle = 0; | ||
1878 | q1.ToAngleAxis(ref angle, ref v3); | ||
1879 | |||
1880 | d.RFromAxisAndAngle(out R, v3.x, v3.y, v3.z, angle); | ||
1881 | d.GeomSetRotation(WaterGeom, ref R); | ||
1882 | d.GeomSetPosition(WaterGeom, 128, 128, 0); | ||
1883 | } | ||
1884 | |||
1885 | } | ||
1886 | |||
1775 | public override void Dispose() | 1887 | public override void Dispose() |
1776 | { | 1888 | { |
1777 | lock (OdeLock) | 1889 | lock (OdeLock) |