diff options
author | Jeff Ames | 2008-05-17 00:06:35 +0000 |
---|---|---|
committer | Jeff Ames | 2008-05-17 00:06:35 +0000 |
commit | a5f08b430d644c7a4274db9fff3db0c63a6a7857 (patch) | |
tree | 4216400d14b587763167839344d61c0a6f6d8c85 /OpenSim/Region/Physics/OdePlugin | |
parent | * Committing patch from mantis 0001297: [PATCH] Fix behavior of child prim in... (diff) | |
download | opensim-SC-a5f08b430d644c7a4274db9fff3db0c63a6a7857.zip opensim-SC-a5f08b430d644c7a4274db9fff3db0c63a6a7857.tar.gz opensim-SC-a5f08b430d644c7a4274db9fff3db0c63a6a7857.tar.bz2 opensim-SC-a5f08b430d644c7a4274db9fff3db0c63a6a7857.tar.xz |
Formatting cleanup.
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 154 |
1 files changed, 21 insertions, 133 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 1f9a6b6..1ba4bb1 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -69,8 +69,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
69 | private float PID_G = 25f; | 69 | private float PID_G = 25f; |
70 | private float m_tensor = 5f; | 70 | private float m_tensor = 5f; |
71 | private int body_autodisable_frames = 20; | 71 | private int body_autodisable_frames = 20; |
72 | |||
73 | |||
74 | 72 | ||
75 | private bool m_usePID = false; | 73 | private bool m_usePID = false; |
76 | 74 | ||
@@ -98,7 +96,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
98 | public bool m_taintselected = false; | 96 | public bool m_taintselected = false; |
99 | public bool m_taintCollidesWater = false; | 97 | public bool m_taintCollidesWater = false; |
100 | 98 | ||
101 | |||
102 | public uint m_localID = 0; | 99 | public uint m_localID = 0; |
103 | 100 | ||
104 | //public GCHandle gc; | 101 | //public GCHandle gc; |
@@ -148,11 +145,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
148 | 145 | ||
149 | private IntPtr m_linkJoint = (IntPtr)0; | 146 | private IntPtr m_linkJoint = (IntPtr)0; |
150 | 147 | ||
151 | |||
152 | public OdePrim(String primName, OdeScene parent_scene, PhysicsVector pos, PhysicsVector size, | 148 | public OdePrim(String primName, OdeScene parent_scene, PhysicsVector pos, PhysicsVector size, |
153 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) | 149 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) |
154 | { | 150 | { |
155 | |||
156 | _target_velocity = new PhysicsVector(0, 0, 0); | 151 | _target_velocity = new PhysicsVector(0, 0, 0); |
157 | //gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned); | 152 | //gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned); |
158 | ode = dode; | 153 | ode = dode; |
@@ -214,7 +209,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
214 | m_taintadd = true; | 209 | m_taintadd = true; |
215 | _parent_scene.AddPhysicsActorTaint(this); | 210 | _parent_scene.AddPhysicsActorTaint(this); |
216 | // don't do .add() here; old geoms get recycled with the same hash | 211 | // don't do .add() here; old geoms get recycled with the same hash |
217 | |||
218 | } | 212 | } |
219 | 213 | ||
220 | public override int PhysicsActorType | 214 | public override int PhysicsActorType |
@@ -256,11 +250,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
256 | } | 250 | } |
257 | else | 251 | else |
258 | { | 252 | { |
259 | |||
260 | m_taintselected = value; | 253 | m_taintselected = value; |
261 | m_isSelected = value; | 254 | m_isSelected = value; |
262 | } | 255 | } |
263 | |||
264 | } | 256 | } |
265 | } | 257 | } |
266 | 258 | ||
@@ -274,14 +266,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
274 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 266 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
275 | } | 267 | } |
276 | //m_log.Warn("Setting Geom to: " + prim_geom); | 268 | //m_log.Warn("Setting Geom to: " + prim_geom); |
277 | |||
278 | } | 269 | } |
279 | 270 | ||
280 | public void enableBodySoft() | 271 | public void enableBodySoft() |
281 | { | 272 | { |
282 | if (m_isphysical) | 273 | if (m_isphysical && Body != (IntPtr)0) |
283 | if (Body != (IntPtr)0) | 274 | d.BodyEnable(Body); |
284 | d.BodyEnable(Body); | ||
285 | 275 | ||
286 | m_disabled = false; | 276 | m_disabled = false; |
287 | } | 277 | } |
@@ -290,12 +280,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
290 | { | 280 | { |
291 | m_disabled = true; | 281 | m_disabled = true; |
292 | 282 | ||
293 | if (m_isphysical) | 283 | if (m_isphysical && Body != (IntPtr)0) |
294 | if (Body != (IntPtr)0) | 284 | d.BodyDisable(Body); |
295 | d.BodyDisable(Body); | ||
296 | } | 285 | } |
297 | 286 | ||
298 | |||
299 | public void enableBody() | 287 | public void enableBody() |
300 | { | 288 | { |
301 | // Sets the geom to a body | 289 | // Sets the geom to a body |
@@ -316,7 +304,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
316 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 304 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
317 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 305 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
318 | 306 | ||
319 | |||
320 | d.BodySetAutoDisableFlag(Body, true); | 307 | d.BodySetAutoDisableFlag(Body, true); |
321 | d.BodySetAutoDisableSteps(Body, body_autodisable_frames); | 308 | d.BodySetAutoDisableSteps(Body, body_autodisable_frames); |
322 | 309 | ||
@@ -342,7 +329,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
342 | // No material is passed to the physics engines yet.. soo.. | 329 | // No material is passed to the physics engines yet.. soo.. |
343 | // we're using the m_density constant in the class definition | 330 | // we're using the m_density constant in the class definition |
344 | 331 | ||
345 | |||
346 | float returnMass = 0; | 332 | float returnMass = 0; |
347 | 333 | ||
348 | switch (_pbs.ProfileShape) | 334 | switch (_pbs.ProfileShape) |
@@ -439,7 +425,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
439 | float hollowVolume = 0; | 425 | float hollowVolume = 0; |
440 | switch (_pbs.HollowShape) | 426 | switch (_pbs.HollowShape) |
441 | { | 427 | { |
442 | |||
443 | case HollowShape.Same: | 428 | case HollowShape.Same: |
444 | case HollowShape.Circle: | 429 | case HollowShape.Circle: |
445 | // Hollow shape is a perfect cyllinder in respect to the cube's scale | 430 | // Hollow shape is a perfect cyllinder in respect to the cube's scale |
@@ -459,8 +444,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
459 | hollowVolume = hollowsizex * hollowsizey * hollowsizez; | 444 | hollowVolume = hollowsizex * hollowsizey * hollowsizez; |
460 | break; | 445 | break; |
461 | 446 | ||
462 | |||
463 | |||
464 | case HollowShape.Triangle: | 447 | case HollowShape.Triangle: |
465 | // Equilateral Triangular Prism volume hollow calculation | 448 | // Equilateral Triangular Prism volume hollow calculation |
466 | // Triangle is an Equilateral Triangular Prism with aLength = to _size.Y | 449 | // Triangle is an Equilateral Triangular Prism with aLength = to _size.Y |
@@ -493,7 +476,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
493 | // we treat this as a box currently | 476 | // we treat this as a box currently |
494 | volume = _size.X * _size.Y * _size.Z; | 477 | volume = _size.X * _size.Y * _size.Z; |
495 | } | 478 | } |
496 | |||
497 | } | 479 | } |
498 | else | 480 | else |
499 | { | 481 | { |
@@ -501,6 +483,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
501 | volume = _size.X * _size.Y * _size.Z; | 483 | volume = _size.X * _size.Y * _size.Z; |
502 | } | 484 | } |
503 | break; | 485 | break; |
486 | |||
504 | case ProfileShape.EquilateralTriangle: | 487 | case ProfileShape.EquilateralTriangle: |
505 | /* | 488 | /* |
506 | v = (abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2) * h | 489 | v = (abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2) * h |
@@ -533,7 +516,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
533 | float hollowVolume = 0; | 516 | float hollowVolume = 0; |
534 | switch (_pbs.HollowShape) | 517 | switch (_pbs.HollowShape) |
535 | { | 518 | { |
536 | |||
537 | case HollowShape.Same: | 519 | case HollowShape.Same: |
538 | case HollowShape.Triangle: | 520 | case HollowShape.Triangle: |
539 | // Equilateral Triangular Prism volume hollow calculation | 521 | // Equilateral Triangular Prism volume hollow calculation |
@@ -562,7 +544,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
562 | hollowVolume = ((float)((Math.PI * Math.Pow(hRadius, 2) * hLength)/2) * hollowAmount); | 544 | hollowVolume = ((float)((Math.PI * Math.Pow(hRadius, 2) * hLength)/2) * hollowAmount); |
563 | break; | 545 | break; |
564 | 546 | ||
565 | |||
566 | default: | 547 | default: |
567 | hollowVolume = 0; | 548 | hollowVolume = 0; |
568 | break; | 549 | break; |
@@ -642,7 +623,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
642 | 623 | ||
643 | #endregion | 624 | #endregion |
644 | 625 | ||
645 | |||
646 | public void setMass() | 626 | public void setMass() |
647 | { | 627 | { |
648 | if (Body != (IntPtr) 0) | 628 | if (Body != (IntPtr) 0) |
@@ -656,7 +636,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
656 | } | 636 | } |
657 | } | 637 | } |
658 | 638 | ||
659 | |||
660 | public void disableBody() | 639 | public void disableBody() |
661 | { | 640 | { |
662 | //this kills the body so things like 'mesh' can re-create it. | 641 | //this kills the body so things like 'mesh' can re-create it. |
@@ -689,7 +668,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
689 | 668 | ||
690 | Thread.Sleep(10); | 669 | Thread.Sleep(10); |
691 | 670 | ||
692 | |||
693 | //Kill Body so that mesh can re-make the geom | 671 | //Kill Body so that mesh can re-make the geom |
694 | if (IsPhysical && Body != (IntPtr) 0) | 672 | if (IsPhysical && Body != (IntPtr) 0) |
695 | { | 673 | { |
@@ -707,7 +685,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
707 | 3*sizeof (int)); | 685 | 3*sizeof (int)); |
708 | d.GeomTriMeshDataPreprocess(_triMeshData); | 686 | d.GeomTriMeshDataPreprocess(_triMeshData); |
709 | 687 | ||
710 | |||
711 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | 688 | _parent_scene.waitForSpaceUnlock(m_targetSpace); |
712 | 689 | ||
713 | try | 690 | try |
@@ -719,7 +696,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
719 | } | 696 | } |
720 | catch (AccessViolationException) | 697 | catch (AccessViolationException) |
721 | { | 698 | { |
722 | |||
723 | m_log.Error("[PHYSICS]: MESH LOCKED"); | 699 | m_log.Error("[PHYSICS]: MESH LOCKED"); |
724 | return; | 700 | return; |
725 | } | 701 | } |
@@ -730,14 +706,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
730 | m_collisionscore = 0; | 706 | m_collisionscore = 0; |
731 | 707 | ||
732 | enableBody(); | 708 | enableBody(); |
733 | |||
734 | } | 709 | } |
735 | } | 710 | } |
736 | 711 | ||
737 | public void ProcessTaints(float timestep) | 712 | public void ProcessTaints(float timestep) |
738 | { | 713 | { |
739 | |||
740 | |||
741 | if (m_taintadd) | 714 | if (m_taintadd) |
742 | { | 715 | { |
743 | changeadd(timestep); | 716 | changeadd(timestep); |
@@ -783,7 +756,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
783 | 756 | ||
784 | if (!m_angularlock.IsIdentical(m_taintAngularLock,0)) | 757 | if (!m_angularlock.IsIdentical(m_taintAngularLock,0)) |
785 | changeAngularLock(timestep); | 758 | changeAngularLock(timestep); |
786 | |||
787 | } | 759 | } |
788 | else | 760 | else |
789 | { | 761 | { |
@@ -812,7 +784,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
812 | { | 784 | { |
813 | d.JointDestroy(Amotor); | 785 | d.JointDestroy(Amotor); |
814 | Amotor = (IntPtr)0; | 786 | Amotor = (IntPtr)0; |
815 | } | 787 | } |
816 | } | 788 | } |
817 | } | 789 | } |
818 | } | 790 | } |
@@ -822,7 +794,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
822 | 794 | ||
823 | private void changelink(float timestep) | 795 | private void changelink(float timestep) |
824 | { | 796 | { |
825 | |||
826 | if (_parent == null && m_taintparent != null) | 797 | if (_parent == null && m_taintparent != null) |
827 | { | 798 | { |
828 | if (m_taintparent.PhysicsActorType == (int)ActorTypes.Prim) | 799 | if (m_taintparent.PhysicsActorType == (int)ActorTypes.Prim) |
@@ -836,7 +807,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
836 | d.JointSetFixed(m_linkJoint); | 807 | d.JointSetFixed(m_linkJoint); |
837 | } | 808 | } |
838 | } | 809 | } |
839 | |||
840 | } | 810 | } |
841 | else if (_parent != null && m_taintparent == null) | 811 | else if (_parent != null && m_taintparent == null) |
842 | { | 812 | { |
@@ -845,20 +815,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
845 | 815 | ||
846 | _linkJointGroup = (IntPtr)0; | 816 | _linkJointGroup = (IntPtr)0; |
847 | m_linkJoint = (IntPtr)0; | 817 | m_linkJoint = (IntPtr)0; |
848 | |||
849 | } | 818 | } |
850 | 819 | ||
851 | |||
852 | _parent = m_taintparent; | 820 | _parent = m_taintparent; |
853 | } | 821 | } |
854 | 822 | ||
855 | private void changeSelectedStatus(float timestep) | 823 | private void changeSelectedStatus(float timestep) |
856 | { | 824 | { |
857 | |||
858 | if (m_taintselected) | 825 | if (m_taintselected) |
859 | { | 826 | { |
860 | |||
861 | |||
862 | m_collisionCategories = CollisionCategories.Selected; | 827 | m_collisionCategories = CollisionCategories.Selected; |
863 | m_collisionFlags = (CollisionCategories.Sensor | CollisionCategories.Space); | 828 | m_collisionFlags = (CollisionCategories.Sensor | CollisionCategories.Space); |
864 | 829 | ||
@@ -882,17 +847,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
882 | { | 847 | { |
883 | disableBodySoft(); | 848 | disableBodySoft(); |
884 | } | 849 | } |
885 | |||
886 | } | 850 | } |
887 | else | 851 | else |
888 | { | 852 | { |
889 | |||
890 | m_collisionCategories = CollisionCategories.Geom; | 853 | m_collisionCategories = CollisionCategories.Geom; |
891 | 854 | ||
892 | if (m_isphysical) | 855 | if (m_isphysical) |
893 | m_collisionCategories |= CollisionCategories.Body; | 856 | m_collisionCategories |= CollisionCategories.Body; |
894 | 857 | ||
895 | |||
896 | m_collisionFlags = m_default_collisionFlags; | 858 | m_collisionFlags = m_default_collisionFlags; |
897 | 859 | ||
898 | if (m_collidesLand) | 860 | if (m_collidesLand) |
@@ -910,42 +872,27 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
910 | d.BodySetLinearVel(Body, 0f, 0f, 0f); | 872 | d.BodySetLinearVel(Body, 0f, 0f, 0f); |
911 | enableBodySoft(); | 873 | enableBodySoft(); |
912 | } | 874 | } |
913 | |||
914 | |||
915 | } | 875 | } |
916 | 876 | ||
917 | |||
918 | resetCollisionAccounting(); | 877 | resetCollisionAccounting(); |
919 | m_isSelected = m_taintselected; | 878 | m_isSelected = m_taintselected; |
920 | } | 879 | } |
921 | 880 | ||
922 | public void ResetTaints() | 881 | public void ResetTaints() |
923 | { | 882 | { |
924 | |||
925 | m_taintposition = _position; | 883 | m_taintposition = _position; |
926 | |||
927 | m_taintrot = _orientation; | 884 | m_taintrot = _orientation; |
928 | |||
929 | m_taintPhysics = m_isphysical; | 885 | m_taintPhysics = m_isphysical; |
930 | |||
931 | m_taintselected = m_isSelected; | 886 | m_taintselected = m_isSelected; |
932 | |||
933 | m_taintsize = _size; | 887 | m_taintsize = _size; |
934 | |||
935 | |||
936 | m_taintshape = false; | 888 | m_taintshape = false; |
937 | |||
938 | m_taintforce = false; | 889 | m_taintforce = false; |
939 | |||
940 | m_taintdisable = false; | 890 | m_taintdisable = false; |
941 | |||
942 | m_taintVelocity = PhysicsVector.Zero; | 891 | m_taintVelocity = PhysicsVector.Zero; |
943 | } | 892 | } |
893 | |||
944 | public void changeadd(float timestep) | 894 | public void changeadd(float timestep) |
945 | { | 895 | { |
946 | |||
947 | |||
948 | |||
949 | int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position); | 896 | int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position); |
950 | IntPtr targetspace = _parent_scene.calculateSpaceForGeom(_position); | 897 | IntPtr targetspace = _parent_scene.calculateSpaceForGeom(_position); |
951 | 898 | ||
@@ -954,12 +901,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
954 | 901 | ||
955 | m_targetSpace = targetspace; | 902 | m_targetSpace = targetspace; |
956 | 903 | ||
957 | 904 | if (_mesh == null) | |
958 | |||
959 | if (_mesh != null) | ||
960 | { | ||
961 | } | ||
962 | else | ||
963 | { | 905 | { |
964 | if (_parent_scene.needsMeshing(_pbs)) | 906 | if (_parent_scene.needsMeshing(_pbs)) |
965 | { | 907 | { |
@@ -983,8 +925,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
983 | { | 925 | { |
984 | if (((_size.X / 2f) > 0f)) | 926 | if (((_size.X / 2f) > 0f)) |
985 | { | 927 | { |
986 | |||
987 | |||
988 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | 928 | _parent_scene.waitForSpaceUnlock(m_targetSpace); |
989 | try | 929 | try |
990 | { | 930 | { |
@@ -1065,13 +1005,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1065 | d.GeomSetQuaternion(prim_geom, ref myrot); | 1005 | d.GeomSetQuaternion(prim_geom, ref myrot); |
1066 | } | 1006 | } |
1067 | 1007 | ||
1068 | |||
1069 | if (m_isphysical && Body == (IntPtr)0) | 1008 | if (m_isphysical && Body == (IntPtr)0) |
1070 | { | 1009 | { |
1071 | enableBody(); | 1010 | enableBody(); |
1072 | } | 1011 | } |
1073 | |||
1074 | |||
1075 | } | 1012 | } |
1076 | 1013 | ||
1077 | _parent_scene.geom_name_map[prim_geom] = this.m_primName; | 1014 | _parent_scene.geom_name_map[prim_geom] = this.m_primName; |
@@ -1080,14 +1017,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1080 | changeSelectedStatus(timestep); | 1017 | changeSelectedStatus(timestep); |
1081 | 1018 | ||
1082 | m_taintadd = false; | 1019 | m_taintadd = false; |
1083 | |||
1084 | |||
1085 | } | 1020 | } |
1021 | |||
1086 | public void changemove(float timestep) | 1022 | public void changemove(float timestep) |
1087 | { | 1023 | { |
1088 | |||
1089 | |||
1090 | |||
1091 | if (m_isphysical) | 1024 | if (m_isphysical) |
1092 | { | 1025 | { |
1093 | // This is a fallback.. May no longer be necessary. | 1026 | // This is a fallback.. May no longer be necessary. |
@@ -1115,7 +1048,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1115 | } | 1048 | } |
1116 | } | 1049 | } |
1117 | d.BodyEnable(Body); | 1050 | d.BodyEnable(Body); |
1118 | |||
1119 | } | 1051 | } |
1120 | else | 1052 | else |
1121 | { | 1053 | { |
@@ -1136,7 +1068,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1136 | } | 1068 | } |
1137 | } | 1069 | } |
1138 | 1070 | ||
1139 | |||
1140 | changeSelectedStatus(timestep); | 1071 | changeSelectedStatus(timestep); |
1141 | 1072 | ||
1142 | resetCollisionAccounting(); | 1073 | resetCollisionAccounting(); |
@@ -1151,21 +1082,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1151 | 1082 | ||
1152 | if (IsPhysical && Body != (IntPtr)0 && !m_isSelected) | 1083 | if (IsPhysical && Body != (IntPtr)0 && !m_isSelected) |
1153 | { | 1084 | { |
1154 | |||
1155 | //float PID_P = 900.0f; | 1085 | //float PID_P = 900.0f; |
1156 | 1086 | ||
1157 | |||
1158 | float m_mass = CalculateMass(); | 1087 | float m_mass = CalculateMass(); |
1159 | 1088 | ||
1160 | fz = 0f; | 1089 | fz = 0f; |
1161 | //m_log.Info(m_collisionFlags.ToString()); | 1090 | //m_log.Info(m_collisionFlags.ToString()); |
1162 | 1091 | ||
1163 | |||
1164 | |||
1165 | |||
1166 | if (m_buoyancy != 0) | 1092 | if (m_buoyancy != 0) |
1167 | { | 1093 | { |
1168 | |||
1169 | if (m_buoyancy > 0) | 1094 | if (m_buoyancy > 0) |
1170 | { | 1095 | { |
1171 | fz = (((-1 * _parent_scene.gravityz) * m_buoyancy) * m_mass); | 1096 | fz = (((-1 * _parent_scene.gravityz) * m_buoyancy) * m_mass); |
@@ -1177,8 +1102,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1177 | { | 1102 | { |
1178 | fz = (-1 * (((-1 * _parent_scene.gravityz) * (-1 * m_buoyancy)) * m_mass)); | 1103 | fz = (-1 * (((-1 * _parent_scene.gravityz) * (-1 * m_buoyancy)) * m_mass)); |
1179 | } | 1104 | } |
1180 | |||
1181 | |||
1182 | } | 1105 | } |
1183 | 1106 | ||
1184 | if (m_usePID) | 1107 | if (m_usePID) |
@@ -1190,28 +1113,21 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1190 | 1113 | ||
1191 | // If the PID Controller isn't active then we set our force | 1114 | // If the PID Controller isn't active then we set our force |
1192 | // calculating base velocity to the current position | 1115 | // calculating base velocity to the current position |
1193 | |||
1194 | |||
1195 | 1116 | ||
1196 | if ((m_PIDTau < 1)) | 1117 | if ((m_PIDTau < 1)) |
1197 | { | 1118 | { |
1198 | PID_G = PID_G / m_PIDTau; | 1119 | PID_G = PID_G / m_PIDTau; |
1199 | } | 1120 | } |
1200 | 1121 | ||
1201 | |||
1202 | if ((PID_G - m_PIDTau) <= 0) | 1122 | if ((PID_G - m_PIDTau) <= 0) |
1203 | { | 1123 | { |
1204 | PID_G = m_PIDTau + 1; | 1124 | PID_G = m_PIDTau + 1; |
1205 | } | 1125 | } |
1206 | //PidStatus = true; | 1126 | //PidStatus = true; |
1207 | 1127 | ||
1208 | |||
1209 | |||
1210 | |||
1211 | PhysicsVector vec = new PhysicsVector(); | 1128 | PhysicsVector vec = new PhysicsVector(); |
1212 | d.Vector3 vel = d.BodyGetLinearVel(Body); | 1129 | d.Vector3 vel = d.BodyGetLinearVel(Body); |
1213 | 1130 | ||
1214 | |||
1215 | d.Vector3 pos = d.BodyGetPosition(Body); | 1131 | d.Vector3 pos = d.BodyGetPosition(Body); |
1216 | _target_velocity = | 1132 | _target_velocity = |
1217 | new PhysicsVector( | 1133 | new PhysicsVector( |
@@ -1220,20 +1136,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1220 | (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) | 1136 | (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) |
1221 | ); | 1137 | ); |
1222 | 1138 | ||
1223 | |||
1224 | // if velocity is zero, use position control; otherwise, velocity control | 1139 | // if velocity is zero, use position control; otherwise, velocity control |
1225 | 1140 | ||
1226 | if (_target_velocity.IsIdentical(PhysicsVector.Zero,0.1f)) | 1141 | if (_target_velocity.IsIdentical(PhysicsVector.Zero,0.1f)) |
1227 | { | 1142 | { |
1228 | // keep track of where we stopped. No more slippin' & slidin' | 1143 | // keep track of where we stopped. No more slippin' & slidin' |
1229 | 1144 | ||
1230 | |||
1231 | // We only want to deactivate the PID Controller if we think we want to have our surrogate | 1145 | // We only want to deactivate the PID Controller if we think we want to have our surrogate |
1232 | // react to the physics scene by moving it's position. | 1146 | // react to the physics scene by moving it's position. |
1233 | // Avatar to Avatar collisions | 1147 | // Avatar to Avatar collisions |
1234 | // Prim to avatar collisions | 1148 | // Prim to avatar collisions |
1235 | 1149 | ||
1236 | |||
1237 | //fx = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2); | 1150 | //fx = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2); |
1238 | //fy = (_target_velocity.Y - vel.Y) * (PID_D) + (_zeroPosition.Y - pos.Y) * (PID_P * 2); | 1151 | //fy = (_target_velocity.Y - vel.Y) * (PID_D) + (_zeroPosition.Y - pos.Y) * (PID_P * 2); |
1239 | //fz = fz + (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P; | 1152 | //fz = fz + (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P; |
@@ -1241,25 +1154,19 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1241 | d.BodySetLinearVel(Body, 0, 0, 0); | 1154 | d.BodySetLinearVel(Body, 0, 0, 0); |
1242 | d.BodyAddForce(Body, 0, 0, fz); | 1155 | d.BodyAddForce(Body, 0, 0, fz); |
1243 | return; | 1156 | return; |
1244 | |||
1245 | } | 1157 | } |
1246 | else | 1158 | else |
1247 | { | 1159 | { |
1248 | |||
1249 | _zeroFlag = false; | 1160 | _zeroFlag = false; |
1250 | 1161 | ||
1251 | // We're flying and colliding with something | 1162 | // We're flying and colliding with something |
1252 | fx = ((_target_velocity.X) - vel.X) * (PID_D); | 1163 | fx = ((_target_velocity.X) - vel.X) * (PID_D); |
1253 | fy = ((_target_velocity.Y) - vel.Y) * (PID_D); | 1164 | fy = ((_target_velocity.Y) - vel.Y) * (PID_D); |
1254 | 1165 | ||
1255 | 1166 | // vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P; | |
1256 | |||
1257 | |||
1258 | // vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P; | ||
1259 | 1167 | ||
1260 | fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); | 1168 | fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); |
1261 | } | 1169 | } |
1262 | |||
1263 | } | 1170 | } |
1264 | 1171 | ||
1265 | fx *= m_mass; | 1172 | fx *= m_mass; |
@@ -1285,8 +1192,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1285 | 1192 | ||
1286 | public void rotate(float timestep) | 1193 | public void rotate(float timestep) |
1287 | { | 1194 | { |
1288 | |||
1289 | |||
1290 | d.Quaternion myrot = new d.Quaternion(); | 1195 | d.Quaternion myrot = new d.Quaternion(); |
1291 | myrot.W = _orientation.w; | 1196 | myrot.W = _orientation.w; |
1292 | myrot.X = _orientation.x; | 1197 | myrot.X = _orientation.x; |
@@ -1313,7 +1218,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1313 | 1218 | ||
1314 | public void changedisable(float timestep) | 1219 | public void changedisable(float timestep) |
1315 | { | 1220 | { |
1316 | |||
1317 | m_disabled = true; | 1221 | m_disabled = true; |
1318 | if (Body != (IntPtr)0) | 1222 | if (Body != (IntPtr)0) |
1319 | { | 1223 | { |
@@ -1321,14 +1225,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1321 | Body = (IntPtr)0; | 1225 | Body = (IntPtr)0; |
1322 | } | 1226 | } |
1323 | 1227 | ||
1324 | |||
1325 | m_taintdisable = false; | 1228 | m_taintdisable = false; |
1326 | } | 1229 | } |
1327 | 1230 | ||
1328 | public void changePhysicsStatus(float timestep) | 1231 | public void changePhysicsStatus(float timestep) |
1329 | { | 1232 | { |
1330 | |||
1331 | |||
1332 | if (m_isphysical == true) | 1233 | if (m_isphysical == true) |
1333 | { | 1234 | { |
1334 | if (Body == (IntPtr)0) | 1235 | if (Body == (IntPtr)0) |
@@ -1366,7 +1267,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1366 | 1267 | ||
1367 | public void changesize(float timestamp) | 1268 | public void changesize(float timestamp) |
1368 | { | 1269 | { |
1369 | |||
1370 | //if (!_parent_scene.geom_name_map.ContainsKey(prim_geom)) | 1270 | //if (!_parent_scene.geom_name_map.ContainsKey(prim_geom)) |
1371 | //{ | 1271 | //{ |
1372 | // m_taintsize = _size; | 1272 | // m_taintsize = _size; |
@@ -1418,7 +1318,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1418 | myrot.Z = _orientation.z; | 1318 | myrot.Z = _orientation.z; |
1419 | d.GeomSetQuaternion(prim_geom, ref myrot); | 1319 | d.GeomSetQuaternion(prim_geom, ref myrot); |
1420 | 1320 | ||
1421 | |||
1422 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); | 1321 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); |
1423 | if (IsPhysical && Body == (IntPtr)0) | 1322 | if (IsPhysical && Body == (IntPtr)0) |
1424 | { | 1323 | { |
@@ -1520,7 +1419,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1520 | myrot.Z = _orientation.z; | 1419 | myrot.Z = _orientation.z; |
1521 | d.GeomSetQuaternion(prim_geom, ref myrot); | 1420 | d.GeomSetQuaternion(prim_geom, ref myrot); |
1522 | 1421 | ||
1523 | |||
1524 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); | 1422 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); |
1525 | if (IsPhysical && Body == (IntPtr) 0) | 1423 | if (IsPhysical && Body == (IntPtr) 0) |
1526 | { | 1424 | { |
@@ -1559,7 +1457,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1559 | 1457 | ||
1560 | public void changeshape(float timestamp) | 1458 | public void changeshape(float timestamp) |
1561 | { | 1459 | { |
1562 | |||
1563 | string oldname = _parent_scene.geom_name_map[prim_geom]; | 1460 | string oldname = _parent_scene.geom_name_map[prim_geom]; |
1564 | 1461 | ||
1565 | // Cleanup of old prim geometry and Bodies | 1462 | // Cleanup of old prim geometry and Bodies |
@@ -1574,7 +1471,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1574 | if (_size.Y <= 0) _size.Y = 0.01f; | 1471 | if (_size.Y <= 0) _size.Y = 0.01f; |
1575 | if (_size.Z <= 0) _size.Z = 0.01f; | 1472 | if (_size.Z <= 0) _size.Z = 0.01f; |
1576 | // Construction of new prim | 1473 | // Construction of new prim |
1577 | 1474 | ||
1578 | if (_parent_scene.needsMeshing(_pbs)) | 1475 | if (_parent_scene.needsMeshing(_pbs)) |
1579 | { | 1476 | { |
1580 | // Don't need to re-enable body.. it's done in SetMesh | 1477 | // Don't need to re-enable body.. it's done in SetMesh |
@@ -1596,14 +1493,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1596 | myrot.Z = _orientation.z; | 1493 | myrot.Z = _orientation.z; |
1597 | d.GeomSetQuaternion(prim_geom, ref myrot); | 1494 | d.GeomSetQuaternion(prim_geom, ref myrot); |
1598 | 1495 | ||
1599 | |||
1600 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); | 1496 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); |
1601 | if (IsPhysical && Body == (IntPtr)0) | 1497 | if (IsPhysical && Body == (IntPtr)0) |
1602 | { | 1498 | { |
1603 | // Re creates body on size. | 1499 | // Re creates body on size. |
1604 | // EnableBody also does setMass() | 1500 | // EnableBody also does setMass() |
1605 | enableBody(); | 1501 | enableBody(); |
1606 | |||
1607 | } | 1502 | } |
1608 | } | 1503 | } |
1609 | else | 1504 | else |
@@ -1623,7 +1518,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1623 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | 1518 | _parent_scene.waitForSpaceUnlock(m_targetSpace); |
1624 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); | 1519 | SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); |
1625 | } | 1520 | } |
1626 | |||
1627 | } | 1521 | } |
1628 | else | 1522 | else |
1629 | { | 1523 | { |
@@ -1698,7 +1592,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1698 | myrot.Z = _orientation.z; | 1592 | myrot.Z = _orientation.z; |
1699 | d.GeomSetQuaternion(prim_geom, ref myrot); | 1593 | d.GeomSetQuaternion(prim_geom, ref myrot); |
1700 | 1594 | ||
1701 | |||
1702 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); | 1595 | //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); |
1703 | if (IsPhysical && Body == (IntPtr)0) | 1596 | if (IsPhysical && Body == (IntPtr)0) |
1704 | { | 1597 | { |
@@ -1709,7 +1602,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1709 | } | 1602 | } |
1710 | } | 1603 | } |
1711 | 1604 | ||
1712 | |||
1713 | _parent_scene.geom_name_map[prim_geom] = oldname; | 1605 | _parent_scene.geom_name_map[prim_geom] = oldname; |
1714 | 1606 | ||
1715 | changeSelectedStatus(timestamp); | 1607 | changeSelectedStatus(timestamp); |
@@ -1722,9 +1614,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1722 | { | 1614 | { |
1723 | if (!m_isSelected) | 1615 | if (!m_isSelected) |
1724 | { | 1616 | { |
1725 | |||
1726 | |||
1727 | |||
1728 | lock (m_forcelist) | 1617 | lock (m_forcelist) |
1729 | { | 1618 | { |
1730 | //m_log.Info("[PHYSICS]: dequeing forcelist"); | 1619 | //m_log.Info("[PHYSICS]: dequeing forcelist"); |
@@ -1741,19 +1630,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1741 | m_forcelist.Clear(); | 1630 | m_forcelist.Clear(); |
1742 | } | 1631 | } |
1743 | 1632 | ||
1744 | |||
1745 | m_collisionscore = 0; | 1633 | m_collisionscore = 0; |
1746 | m_interpenetrationcount = 0; | 1634 | m_interpenetrationcount = 0; |
1747 | } | 1635 | } |
1748 | m_taintforce = false; | 1636 | m_taintforce = false; |
1749 | 1637 | ||
1750 | } | 1638 | } |
1639 | |||
1751 | private void changevelocity(float timestep) | 1640 | private void changevelocity(float timestep) |
1752 | { | 1641 | { |
1753 | if (!m_isSelected) | 1642 | if (!m_isSelected) |
1754 | { | 1643 | { |
1755 | |||
1756 | |||
1757 | Thread.Sleep(20); | 1644 | Thread.Sleep(20); |
1758 | if (IsPhysical) | 1645 | if (IsPhysical) |
1759 | { | 1646 | { |
@@ -1767,6 +1654,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1767 | } | 1654 | } |
1768 | m_taintVelocity = PhysicsVector.Zero; | 1655 | m_taintVelocity = PhysicsVector.Zero; |
1769 | } | 1656 | } |
1657 | |||
1770 | public override bool IsPhysical | 1658 | public override bool IsPhysical |
1771 | { | 1659 | { |
1772 | get { return m_isphysical; } | 1660 | get { return m_isphysical; } |
@@ -1974,10 +1862,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1974 | public void UpdatePositionAndVelocity() | 1862 | public void UpdatePositionAndVelocity() |
1975 | { | 1863 | { |
1976 | // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! | 1864 | // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! |
1977 | if (_parent != null) | 1865 | if (_parent == null) |
1978 | { | ||
1979 | } | ||
1980 | else | ||
1981 | { | 1866 | { |
1982 | PhysicsVector pv = new PhysicsVector(0, 0, 0); | 1867 | PhysicsVector pv = new PhysicsVector(0, 0, 0); |
1983 | bool lastZeroFlag = _zeroFlag; | 1868 | bool lastZeroFlag = _zeroFlag; |
@@ -2173,6 +2058,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2173 | public override void SetMomentum(PhysicsVector momentum) | 2058 | public override void SetMomentum(PhysicsVector momentum) |
2174 | { | 2059 | { |
2175 | } | 2060 | } |
2061 | |||
2176 | public override PhysicsVector PIDTarget { set { m_PIDTarget = value; ; } } | 2062 | public override PhysicsVector PIDTarget { set { m_PIDTarget = value; ; } } |
2177 | public override bool PIDActive { set { m_usePID = value; } } | 2063 | public override bool PIDActive { set { m_usePID = value; } } |
2178 | public override float PIDTau { set { m_PIDTau = value; } } | 2064 | public override float PIDTau { set { m_PIDTau = value; } } |
@@ -2188,8 +2074,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2188 | Amotor = IntPtr.Zero; | 2074 | Amotor = IntPtr.Zero; |
2189 | } | 2075 | } |
2190 | 2076 | ||
2191 | |||
2192 | |||
2193 | float axisnum = 3; | 2077 | float axisnum = 3; |
2194 | 2078 | ||
2195 | axisnum = (axisnum - (axis.X + axis.Y + axis.Z)); | 2079 | axisnum = (axisnum - (axis.X + axis.Y + axis.Z)); |
@@ -2217,17 +2101,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2217 | i++; | 2101 | i++; |
2218 | } | 2102 | } |
2219 | 2103 | ||
2220 | |||
2221 | if (axis.Z == 0) | 2104 | if (axis.Z == 0) |
2222 | { | 2105 | { |
2223 | d.JointSetAMotorAxis(Amotor, i, 0, 0, 0, 1); | 2106 | d.JointSetAMotorAxis(Amotor, i, 0, 0, 0, 1); |
2224 | i++; | 2107 | i++; |
2225 | } | 2108 | } |
2109 | |||
2226 | for (int j = 0; j < (int)axisnum; j++) | 2110 | for (int j = 0; j < (int)axisnum; j++) |
2227 | { | 2111 | { |
2228 | //d.JointSetAMotorAngle(Amotor, j, 0); | 2112 | //d.JointSetAMotorAngle(Amotor, j, 0); |
2229 | } | 2113 | } |
2230 | // | 2114 | |
2231 | //d.JointSetAMotorAngle(Amotor, 1, 0); | 2115 | //d.JointSetAMotorAngle(Amotor, 1, 0); |
2232 | //d.JointSetAMotorAngle(Amotor, 2, 0); | 2116 | //d.JointSetAMotorAngle(Amotor, 2, 0); |
2233 | 2117 | ||
@@ -2242,16 +2126,19 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2242 | d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f); | 2126 | d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f); |
2243 | d.JointSetAMotorParam(Amotor, (int)dParam.FMax, m_tensor); | 2127 | d.JointSetAMotorParam(Amotor, (int)dParam.FMax, m_tensor); |
2244 | } | 2128 | } |
2129 | |||
2245 | public override void SubscribeEvents(int ms) | 2130 | public override void SubscribeEvents(int ms) |
2246 | { | 2131 | { |
2247 | m_eventsubscription = ms; | 2132 | m_eventsubscription = ms; |
2248 | _parent_scene.addCollisionEventReporting(this); | 2133 | _parent_scene.addCollisionEventReporting(this); |
2249 | } | 2134 | } |
2135 | |||
2250 | public override void UnSubscribeEvents() | 2136 | public override void UnSubscribeEvents() |
2251 | { | 2137 | { |
2252 | _parent_scene.remCollisionEventReporting(this); | 2138 | _parent_scene.remCollisionEventReporting(this); |
2253 | m_eventsubscription = 0; | 2139 | m_eventsubscription = 0; |
2254 | } | 2140 | } |
2141 | |||
2255 | public void AddCollisionEvent(uint CollidedWith, float depth) | 2142 | public void AddCollisionEvent(uint CollidedWith, float depth) |
2256 | { | 2143 | { |
2257 | if (CollisionEventsThisFrame == null) | 2144 | if (CollisionEventsThisFrame == null) |
@@ -2273,6 +2160,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2273 | CollisionEventsThisFrame = new CollisionEventUpdate(); | 2160 | CollisionEventsThisFrame = new CollisionEventUpdate(); |
2274 | } | 2161 | } |
2275 | } | 2162 | } |
2163 | |||
2276 | public override bool SubscribedEvents() | 2164 | public override bool SubscribedEvents() |
2277 | { | 2165 | { |
2278 | if (m_eventsubscription > 0) | 2166 | if (m_eventsubscription > 0) |