aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
diff options
context:
space:
mode:
authorTeravus Ovares2008-01-30 07:09:58 +0000
committerTeravus Ovares2008-01-30 07:09:58 +0000
commitfc9b3ec5a8c65f9b97e81f0e41abe4a9f45d4b3a (patch)
tree7117d76c491ecdb8cf4d4b302ee51aa3fac17502 /OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
parent* Fixed a crash if the server is unable to connect to the UserServer when a u... (diff)
downloadopensim-SC_OLD-fc9b3ec5a8c65f9b97e81f0e41abe4a9f45d4b3a.zip
opensim-SC_OLD-fc9b3ec5a8c65f9b97e81f0e41abe4a9f45d4b3a.tar.gz
opensim-SC_OLD-fc9b3ec5a8c65f9b97e81f0e41abe4a9f45d4b3a.tar.bz2
opensim-SC_OLD-fc9b3ec5a8c65f9b97e81f0e41abe4a9f45d4b3a.tar.xz
* Experimental ODE Update to make ODE more stable
* WARNING: This update will break *nix support. Will be restored in the next revision
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/ODEPrim.cs')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs28
1 files changed, 25 insertions, 3 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index d70819e..93ba29e 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -140,15 +140,20 @@ namespace OpenSim.Region.Physics.OdePlugin
140 { 140 {
141 if (((_size.X / 2f) > 0f)) 141 if (((_size.X / 2f) > 0f))
142 { 142 {
143
144
145 _parent_scene.waitForSpaceUnlock(m_targetSpace);
143 prim_geom = d.CreateSphere(m_targetSpace, _size.X / 2); 146 prim_geom = d.CreateSphere(m_targetSpace, _size.X / 2);
144 } 147 }
145 else 148 else
146 { 149 {
150 _parent_scene.waitForSpaceUnlock(m_targetSpace);
147 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 151 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
148 } 152 }
149 } 153 }
150 else 154 else
151 { 155 {
156 _parent_scene.waitForSpaceUnlock(m_targetSpace);
152 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 157 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
153 } 158 }
154 } 159 }
@@ -166,7 +171,7 @@ namespace OpenSim.Region.Physics.OdePlugin
166 //} 171 //}
167 else 172 else
168 { 173 {
169 174 _parent_scene.waitForSpaceUnlock(m_targetSpace);
170 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 175 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
171 } 176 }
172 } 177 }
@@ -190,6 +195,12 @@ namespace OpenSim.Region.Physics.OdePlugin
190 } 195 }
191 } 196 }
192 197
198 /// <summary>
199 /// Nasty, however without this you get
200 /// 'invalid operation for locked space' when things are really loaded down
201 /// </summary>
202 /// <param name="space"></param>
203
193 public override int PhysicsActorType 204 public override int PhysicsActorType
194 { 205 {
195 get { return (int) ActorTypes.Prim; } 206 get { return (int) ActorTypes.Prim; }
@@ -375,6 +386,7 @@ namespace OpenSim.Region.Physics.OdePlugin
375 3*sizeof (int)); 386 3*sizeof (int));
376 d.GeomTriMeshDataPreprocess(_triMeshData); 387 d.GeomTriMeshDataPreprocess(_triMeshData);
377 388
389 _parent_scene.waitForSpaceUnlock(m_targetSpace);
378 prim_geom = d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null); 390 prim_geom = d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null);
379 391
380 if (IsPhysical && Body == (IntPtr) 0) 392 if (IsPhysical && Body == (IntPtr) 0)
@@ -427,6 +439,8 @@ namespace OpenSim.Region.Physics.OdePlugin
427 int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); 439 int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
428 m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); 440 m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace);
429 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); 441 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
442
443 _parent_scene.waitForSpaceUnlock(m_targetSpace);
430 d.SpaceAdd(m_targetSpace, prim_geom); 444 d.SpaceAdd(m_targetSpace, prim_geom);
431 } 445 }
432 446
@@ -486,6 +500,7 @@ namespace OpenSim.Region.Physics.OdePlugin
486 } 500 }
487 if (d.SpaceQuery(m_targetSpace, prim_geom)) 501 if (d.SpaceQuery(m_targetSpace, prim_geom))
488 { 502 {
503 _parent_scene.waitForSpaceUnlock(m_targetSpace);
489 d.SpaceRemove(m_targetSpace, prim_geom); 504 d.SpaceRemove(m_targetSpace, prim_geom);
490 } 505 }
491 d.GeomDestroy(prim_geom); 506 d.GeomDestroy(prim_geom);
@@ -510,17 +525,20 @@ namespace OpenSim.Region.Physics.OdePlugin
510 { 525 {
511 if (((_size.X / 2f) > 0f) && ((_size.X / 2f) < 1000)) 526 if (((_size.X / 2f) > 0f) && ((_size.X / 2f) < 1000))
512 { 527 {
528 _parent_scene.waitForSpaceUnlock(m_targetSpace);
513 prim_geom = d.CreateSphere(m_targetSpace, _size.X / 2); 529 prim_geom = d.CreateSphere(m_targetSpace, _size.X / 2);
514 } 530 }
515 else 531 else
516 { 532 {
517 OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Failed to load a sphere bad size"); 533 OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Failed to load a sphere bad size");
534 _parent_scene.waitForSpaceUnlock(m_targetSpace);
518 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 535 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
519 } 536 }
520 537
521 } 538 }
522 else 539 else
523 { 540 {
541 _parent_scene.waitForSpaceUnlock(m_targetSpace);
524 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 542 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
525 } 543 }
526 } 544 }
@@ -538,7 +556,7 @@ namespace OpenSim.Region.Physics.OdePlugin
538 //} 556 //}
539 else 557 else
540 { 558 {
541 559 _parent_scene.waitForSpaceUnlock(m_targetSpace);
542 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 560 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
543 } 561 }
544 //prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 562 //prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
@@ -557,10 +575,12 @@ namespace OpenSim.Region.Physics.OdePlugin
557 { 575 {
558 if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) 576 if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z)
559 { 577 {
578 _parent_scene.waitForSpaceUnlock(m_targetSpace);
560 prim_geom = d.CreateSphere(m_targetSpace, _size.X / 2); 579 prim_geom = d.CreateSphere(m_targetSpace, _size.X / 2);
561 } 580 }
562 else 581 else
563 { 582 {
583 _parent_scene.waitForSpaceUnlock(m_targetSpace);
564 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 584 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
565 } 585 }
566 } 586 }
@@ -578,7 +598,7 @@ namespace OpenSim.Region.Physics.OdePlugin
578 //} 598 //}
579 else 599 else
580 { 600 {
581 601 _parent_scene.waitForSpaceUnlock(m_targetSpace);
582 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 602 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
583 } 603 }
584 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); 604 d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
@@ -630,11 +650,13 @@ namespace OpenSim.Region.Physics.OdePlugin
630 } 650 }
631 else 651 else
632 { 652 {
653 _parent_scene.waitForSpaceUnlock(m_targetSpace);
633 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 654 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
634 } 655 }
635 } 656 }
636 else 657 else
637 { 658 {
659 _parent_scene.waitForSpaceUnlock(m_targetSpace);
638 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z); 660 prim_geom = d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z);
639 } 661 }
640 if (IsPhysical && Body == (IntPtr) 0) 662 if (IsPhysical && Body == (IntPtr) 0)