aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorTeravus Ovares2007-12-26 17:16:47 +0000
committerTeravus Ovares2007-12-26 17:16:47 +0000
commitf852b6455550569d002d0b1c527249f3f7894326 (patch)
tree95abccc4ae8529dc8c1b2aa283ac44e952f7dda7
parent* Patch by Melanie to fix CreateSelected (diff)
downloadopensim-SC-f852b6455550569d002d0b1c527249f3f7894326.zip
opensim-SC-f852b6455550569d002d0b1c527249f3f7894326.tar.gz
opensim-SC-f852b6455550569d002d0b1c527249f3f7894326.tar.bz2
opensim-SC-f852b6455550569d002d0b1c527249f3f7894326.tar.xz
* This update includes a wide range of changes to the ODEPlugin for avatar movement, including:
** - avatar can navigate stairs better now ** - avatar can land without shooting into the air ** - excessive collisions with the ground are tempered somewhat and should only shoot the avatar up 20m instead of 200m ** - Try Catched a TextureDownloadModule.cs array out of bounds error with a report that causes it not to crash the sim, however it reports a few important items for tracking it down.
-rw-r--r--OpenSim/Region/Environment/Modules/TextureDownloadModule.cs10
-rw-r--r--OpenSim/Region/Environment/Scenes/ScenePresence.cs22
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs39
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs8
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs50
5 files changed, 86 insertions, 43 deletions
diff --git a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
index d126569..0adace1 100644
--- a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
+++ b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
@@ -319,7 +319,15 @@ namespace OpenSim.Region.Environment.Modules
319 int size = m_asset.Data.Length - 600 - (1000 * (PacketCounter - 1)); 319 int size = m_asset.Data.Length - 600 - (1000 * (PacketCounter - 1));
320 if (size > 1000) size = 1000; 320 if (size > 1000) size = 1000;
321 im.ImageData.Data = new byte[size]; 321 im.ImageData.Data = new byte[size];
322 Array.Copy(m_asset.Data, 600 + (1000 * (PacketCounter - 1)), im.ImageData.Data, 0, size); 322 try
323 {
324 Array.Copy(m_asset.Data, 600 + (1000 * (PacketCounter - 1)), im.ImageData.Data, 0, size);
325 }
326 catch (System.ArgumentOutOfRangeException)
327 {
328 OpenSim.Framework.Console.MainLog.Instance.Warn("TEXTURE", "Unable to separate texture into multiple packets: Array bounds failure on asset:" + m_asset.FullID.ToString() + "- TextureDownloadModule.cs. line:328");
329 return;
330 }
323 RequestUser.OutPacket(im, ThrottleOutPacketType.Texture); 331 RequestUser.OutPacket(im, ThrottleOutPacketType.Texture);
324 PacketCounter++; 332 PacketCounter++;
325 } 333 }
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 5570136..03f1a70 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -999,17 +999,17 @@ namespace OpenSim.Region.Environment.Scenes
999 if (m_physicsActor.Flying) 999 if (m_physicsActor.Flying)
1000 { 1000 {
1001 direc *= 4; 1001 direc *= 4;
1002 bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 1002 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
1003 bool colliding = (m_physicsActor.IsColliding==true); 1003 //bool colliding = (m_physicsActor.IsColliding==true);
1004 if (controlland) 1004 //if (controlland)
1005 MainLog.Instance.Verbose("AGENT","landCommand"); 1005 // MainLog.Instance.Verbose("AGENT","landCommand");
1006 if (colliding ) 1006 //if (colliding )
1007 MainLog.Instance.Verbose("AGENT","colliding"); 1007 // MainLog.Instance.Verbose("AGENT","colliding");
1008 if (m_physicsActor.Flying && colliding && controlland) 1008 //if (m_physicsActor.Flying && colliding && controlland)
1009 { 1009 //{
1010 StopFlying(); 1010 // StopFlying();
1011 MainLog.Instance.Verbose("AGENT", "Stop FLying"); 1011 // MainLog.Instance.Verbose("AGENT", "Stop FLying");
1012 } 1012 //}
1013 } 1013 }
1014 else 1014 else
1015 { 1015 {
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index 33b2e4f..9676db4 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -111,22 +111,22 @@ namespace OpenSim.Region.Physics.OdePlugin
111 111
112 112
113 113
114 Amotor = d.JointCreateAMotor(parent_scene.world, IntPtr.Zero); 114 //Amotor = d.JointCreateAMotor(parent_scene.world, IntPtr.Zero);
115 d.JointAttach(Amotor, Body, IntPtr.Zero); 115 //d.JointAttach(Amotor, Body, IntPtr.Zero);
116 d.JointSetAMotorMode(Amotor, dAMotorEuler); 116 //d.JointSetAMotorMode(Amotor, dAMotorEuler);
117 d.JointSetAMotorNumAxes(Amotor, 3); 117 //d.JointSetAMotorNumAxes(Amotor, 3);
118 d.JointSetAMotorAxis(Amotor, 0, 0, 1, 0, 0); 118 //d.JointSetAMotorAxis(Amotor, 0, 0, 1, 0, 0);
119 d.JointSetAMotorAxis(Amotor, 1, 0, 0, 1, 0); 119 //d.JointSetAMotorAxis(Amotor, 1, 0, 0, 1, 0);
120 d.JointSetAMotorAxis(Amotor, 2, 0, 0, 0, 1); 120 ///d.JointSetAMotorAxis(Amotor, 2, 0, 0, 0, 1);
121 d.JointSetAMotorAngle(Amotor, 0, 0); 121 //d.JointSetAMotorAngle(Amotor, 0, 0);
122 d.JointSetAMotorAngle(Amotor, 1, 0); 122 //d.JointSetAMotorAngle(Amotor, 1, 0);
123 d.JointSetAMotorAngle(Amotor, 2, 0); 123 //d.JointSetAMotorAngle(Amotor, 2, 0);
124 d.JointSetAMotorParam(Amotor, 0, -0); 124 //d.JointSetAMotorParam(Amotor, 0, -0);
125 d.JointSetAMotorParam(Amotor, 0x200, -0); 125 //d.JointSetAMotorParam(Amotor, 0x200, -0);
126 d.JointSetAMotorParam(Amotor, 0x100, -0); 126 //d.JointSetAMotorParam(Amotor, 0x100, -0);
127 d.JointSetAMotorParam(Amotor, 0, 0); 127 // d.JointSetAMotorParam(Amotor, 0, 0);
128 d.JointSetAMotorParam(Amotor, 3, 0); 128 // d.JointSetAMotorParam(Amotor, 3, 0);
129 d.JointSetAMotorParam(Amotor, 2, 0); 129 // d.JointSetAMotorParam(Amotor, 2, 0);
130 130
131 131
132 132
@@ -269,7 +269,10 @@ namespace OpenSim.Region.Physics.OdePlugin
269 m_pidControllerActive = true; 269 m_pidControllerActive = true;
270 } 270 }
271 } 271 }
272 272 public void SetPidStatus(bool status)
273 {
274 m_pidControllerActive = status;
275 }
273 public override PhysicsVector Position 276 public override PhysicsVector Position
274 { 277 {
275 get { return _position; } 278 get { return _position; }
@@ -583,7 +586,7 @@ namespace OpenSim.Region.Physics.OdePlugin
583 { 586 {
584 lock (OdeScene.OdeLock) 587 lock (OdeScene.OdeLock)
585 { 588 {
586 d.JointDestroy(Amotor); 589 // d.JointDestroy(Amotor);
587 d.GeomDestroy(Shell); 590 d.GeomDestroy(Shell);
588 _parent_scene.geom_name_map.Remove(Shell); 591 _parent_scene.geom_name_map.Remove(Shell);
589 d.BodyDestroy(Body); 592 d.BodyDestroy(Body);
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 32a9fc7..35328b8 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -375,14 +375,6 @@ namespace OpenSim.Region.Physics.OdePlugin
375 { 375 {
376 string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); 376 string primScenAvatarIn = _parent_scene.whichspaceamIin(_position);
377 int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); 377 int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
378 if (primScenAvatarIn == "0")
379 {
380 MainLog.Instance.Verbose("Physics", "Prim " + m_primName + " in space with no prim: " + primScenAvatarIn + ". Expected to be at: " + m_targetSpace.ToString() + " . Arr:': " + arrayitem[0].ToString() + "," + arrayitem[1].ToString());
381 }
382 else
383 {
384 MainLog.Instance.Verbose("Physics", "Prim " + m_primName + " in Prim space with prim: " + primScenAvatarIn + ". Expected to be at: " + m_targetSpace.ToString() + ". Arr:" + arrayitem[0].ToString() + "," + arrayitem[1].ToString());
385 }
386 m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); 378 m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace);
387 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); 379 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
388 d.SpaceAdd(m_targetSpace, prim_geom); 380 d.SpaceAdd(m_targetSpace, prim_geom);
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 51c0e15..8bb822e 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -136,7 +136,7 @@ namespace OpenSim.Region.Physics.OdePlugin
136 TerrainContact.surface.soft_erp = 0.1025f; 136 TerrainContact.surface.soft_erp = 0.1025f;
137 137
138 AvatarMovementprimContact.surface.mu = 150.0f; 138 AvatarMovementprimContact.surface.mu = 150.0f;
139 AvatarMovementprimContact.surface.bounce = 0.2f; 139 AvatarMovementprimContact.surface.bounce = 0.1f;
140 140
141 AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP; 141 AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP;
142 AvatarMovementTerrainContact.surface.mu = 150.0f; 142 AvatarMovementTerrainContact.surface.mu = 150.0f;
@@ -297,7 +297,9 @@ namespace OpenSim.Region.Physics.OdePlugin
297 { 297 {
298 p2.CollidingObj = true; 298 p2.CollidingObj = true;
299 //contacts[i].depth = 0.003f; 299 //contacts[i].depth = 0.003f;
300 //p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f); 300 p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f);
301 OdeCharacter character = (OdeCharacter)p2;
302 character.SetPidStatus(true);
301 //contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2)); 303 //contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2));
302 304
303 } 305 }
@@ -309,8 +311,10 @@ namespace OpenSim.Region.Physics.OdePlugin
309 { 311 {
310 p1.CollidingObj = true; 312 p1.CollidingObj = true;
311 //contacts[i].depth = 0.003f; 313 //contacts[i].depth = 0.003f;
312 //p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f); 314 p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f);
313 //contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p2.Size.X / 2), contacts[i].pos.Y + (p2.Size.Y / 2), contacts[i].pos.Z + (p2.Size.Z / 2)); 315 //contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p2.Size.X / 2), contacts[i].pos.Y + (p2.Size.Y / 2), contacts[i].pos.Z + (p2.Size.Z / 2));
316 OdeCharacter character = (OdeCharacter)p2;
317 character.SetPidStatus(true);
314 } 318 }
315 else 319 else
316 { 320 {
@@ -321,12 +325,48 @@ namespace OpenSim.Region.Physics.OdePlugin
321 if (p1.PhysicsActorType == (int)ActorTypes.Prim && p2.PhysicsActorType == (int)ActorTypes.Prim) 325 if (p1.PhysicsActorType == (int)ActorTypes.Prim && p2.PhysicsActorType == (int)ActorTypes.Prim)
322 { 326 {
323 // Don't collide, one or both prim will explode. 327 // Don't collide, one or both prim will explode.
324 contacts[i].depth = 0.0f; 328 contacts[i].depth = -1f;
329 }
330 if (contacts[i].depth >= 1.00f)
331 {
332 if ((p2.PhysicsActorType == (int)ActorTypes.Agent && p1.PhysicsActorType == (int)ActorTypes.Unknown) || (p1.PhysicsActorType == (int)ActorTypes.Agent && p2.PhysicsActorType == (int)ActorTypes.Unknown))
333 {
334
335 if (p2.PhysicsActorType == (int)ActorTypes.Agent)
336 {
337 OdeCharacter character = (OdeCharacter)p2;
338
339 //p2.CollidingObj = true;
340 contacts[i].depth = 0.003f;
341 p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 0.5f);
342 contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2));
343 character.SetPidStatus(true);
344
345 }
346 else
347 {
348
349 }
350 if (p1.PhysicsActorType == (int)ActorTypes.Agent)
351 {
352 OdeCharacter character = (OdeCharacter)p2;
353
354 //p2.CollidingObj = true;
355 contacts[i].depth = 0.003f;
356 p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 0.5f);
357 contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2));
358 character.SetPidStatus(true);
359 }
360 else
361 {
362 //contacts[i].depth = 0.0000000f;
363 }
364 }
325 } 365 }
326 } 366 }
327 #endregion 367 #endregion
328 368
329 if (contacts[i].depth > 0f) 369 if (contacts[i].depth >= 0f)
330 { 370 {
331 if (name1 == "Terrain" || name2 == "Terrain") 371 if (name1 == "Terrain" || name2 == "Terrain")
332 { 372 {