diff options
author | Teravus Ovares | 2008-02-23 11:42:55 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-02-23 11:42:55 +0000 |
commit | 27508c1ad87786935dbf28aa217bcbe55a9aa645 (patch) | |
tree | 0ae701c00cb8e92ab6416fb6688afeb536960b6e /OpenSim/Region/Physics/OdePlugin | |
parent | * Reduced size of 'startup complete message' by several thousand lines. (diff) | |
download | opensim-SC_OLD-27508c1ad87786935dbf28aa217bcbe55a9aa645.zip opensim-SC_OLD-27508c1ad87786935dbf28aa217bcbe55a9aa645.tar.gz opensim-SC_OLD-27508c1ad87786935dbf28aa217bcbe55a9aa645.tar.bz2 opensim-SC_OLD-27508c1ad87786935dbf28aa217bcbe55a9aa645.tar.xz |
* Added Support within the ODEPlugin for Selected. Which means that;
* When you select a physical prim, it stops while you've got it selected.
* When you move or alter a prim in some manner, it doesn't become collidable until you de-select it
* When you select a prim, it doesn't become temporarily 'phantom' until you make some change to it while it's selected. (this prevents accidental selections in prim floor from causing it to go phantom on you(but don't move it or you'll fall))
* There's one major difference, and that's a physical object won't stop if you don't have permission to edit it. This prevents people who don't have edit permissions on a prim from stopping it while it's moving.
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 20 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 243 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 22 |
3 files changed, 251 insertions, 34 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 499422f..2efca3b 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -87,6 +87,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
87 | private bool m_hackSentFall = false; | 87 | private bool m_hackSentFall = false; |
88 | private bool m_hackSentFly = false; | 88 | private bool m_hackSentFly = false; |
89 | private bool m_foundDebian = false; | 89 | private bool m_foundDebian = false; |
90 | public uint m_localID = 0; | ||
91 | |||
90 | private CollisionLocker ode; | 92 | private CollisionLocker ode; |
91 | 93 | ||
92 | private string m_name = String.Empty; | 94 | private string m_name = String.Empty; |
@@ -94,6 +96,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
94 | private bool[] m_colliderarr = new bool[11]; | 96 | private bool[] m_colliderarr = new bool[11]; |
95 | private bool[] m_colliderGroundarr = new bool[11]; | 97 | private bool[] m_colliderGroundarr = new bool[11]; |
96 | 98 | ||
99 | // Default we're a Character | ||
100 | private CollisionCategories m_collisionCategories = (CollisionCategories.Character); | ||
101 | |||
102 | // Default, Collide with Other Geometries, spaces, bodies and characters. | ||
103 | private CollisionCategories m_collisionFlags = (CollisionCategories.Geom | ||
104 | | CollisionCategories.Space | ||
105 | | CollisionCategories.Body | ||
106 | | CollisionCategories.Character | ||
107 | | CollisionCategories.Land); | ||
97 | 108 | ||
98 | private bool jumping = false; | 109 | private bool jumping = false; |
99 | //private float gravityAccel; | 110 | //private float gravityAccel; |
@@ -157,6 +168,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
157 | set { m_alwaysRun = value; } | 168 | set { m_alwaysRun = value; } |
158 | } | 169 | } |
159 | 170 | ||
171 | public override uint LocalID | ||
172 | { | ||
173 | set { m_localID = value; } | ||
174 | } | ||
175 | |||
160 | public override bool Grabbed | 176 | public override bool Grabbed |
161 | { | 177 | { |
162 | set { return; } | 178 | set { return; } |
@@ -404,6 +420,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
404 | int dAMotorEuler = 1; | 420 | int dAMotorEuler = 1; |
405 | _parent_scene.waitForSpaceUnlock(_parent_scene.space); | 421 | _parent_scene.waitForSpaceUnlock(_parent_scene.space); |
406 | Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH); | 422 | Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH); |
423 | |||
424 | d.GeomSetCategoryBits(Shell, (int)m_collisionCategories); | ||
425 | d.GeomSetCollideBits(Shell, (int)m_collisionFlags); | ||
426 | |||
407 | d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH); | 427 | d.MassSetCapsuleTotal(out ShellMass, m_mass, 2, CAPSULE_RADIUS, CAPSULE_LENGTH); |
408 | Body = d.BodyCreate(_parent_scene.world); | 428 | Body = d.BodyCreate(_parent_scene.world); |
409 | d.BodySetPosition(Body, npositionX, npositionY, npositionZ); | 429 | d.BodySetPosition(Body, npositionX, npositionY, npositionZ); |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 50087a5..6da2296 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -52,12 +52,30 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
52 | private PhysicsVector m_taintsize; | 52 | private PhysicsVector m_taintsize; |
53 | private PhysicsVector m_taintVelocity = PhysicsVector.Zero; | 53 | private PhysicsVector m_taintVelocity = PhysicsVector.Zero; |
54 | private Quaternion m_taintrot; | 54 | private Quaternion m_taintrot; |
55 | private const CollisionCategories m_default_collisionFlags = (CollisionCategories.Geom | ||
56 | | CollisionCategories.Space | ||
57 | | CollisionCategories.Body | ||
58 | | CollisionCategories.Character); | ||
55 | private bool m_taintshape = false; | 59 | private bool m_taintshape = false; |
56 | private bool m_taintPhysics = false; | 60 | private bool m_taintPhysics = false; |
61 | private bool m_collidesLand = true; | ||
62 | private bool m_collidesWater = false; | ||
63 | |||
64 | // Default we're a Geometry | ||
65 | private CollisionCategories m_collisionCategories = (CollisionCategories.Geom ); | ||
66 | |||
67 | // Default, Collide with Other Geometries, spaces and Bodies | ||
68 | private CollisionCategories m_collisionFlags = m_default_collisionFlags; | ||
69 | |||
57 | public bool m_taintremove = false; | 70 | public bool m_taintremove = false; |
58 | public bool m_taintdisable = false; | 71 | public bool m_taintdisable = false; |
59 | public bool m_disabled = false; | 72 | public bool m_disabled = false; |
60 | public bool m_taintadd = false; | 73 | public bool m_taintadd = false; |
74 | public bool m_taintselected = false; | ||
75 | |||
76 | |||
77 | public uint m_localID = 0; | ||
78 | |||
61 | public GCHandle gc; | 79 | public GCHandle gc; |
62 | private CollisionLocker ode; | 80 | private CollisionLocker ode; |
63 | 81 | ||
@@ -74,6 +92,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
74 | 92 | ||
75 | private bool iscolliding = false; | 93 | private bool iscolliding = false; |
76 | private bool m_isphysical = false; | 94 | private bool m_isphysical = false; |
95 | private bool m_isSelected = false; | ||
96 | |||
77 | private bool m_throttleUpdates = false; | 97 | private bool m_throttleUpdates = false; |
78 | private int throttleCounter = 0; | 98 | private int throttleCounter = 0; |
79 | public int m_interpenetrationcount = 0; | 99 | public int m_interpenetrationcount = 0; |
@@ -172,6 +192,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
172 | set { return; } | 192 | set { return; } |
173 | } | 193 | } |
174 | 194 | ||
195 | public override uint LocalID | ||
196 | { | ||
197 | set { m_localID = value; } | ||
198 | } | ||
199 | |||
175 | public override bool Grabbed | 200 | public override bool Grabbed |
176 | { | 201 | { |
177 | set { return; } | 202 | set { return; } |
@@ -179,17 +204,59 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
179 | 204 | ||
180 | public override bool Selected | 205 | public override bool Selected |
181 | { | 206 | { |
182 | set { return; } | 207 | set { |
208 | // This only makes the object not collidable if the object | ||
209 | // is physical or the object is modified somehow *IN THE FUTURE* | ||
210 | // without this, if an avatar selects prim, they can walk right | ||
211 | // through it while it's selected | ||
212 | |||
213 | if (m_isphysical || !value) | ||
214 | { | ||
215 | m_taintselected = value; | ||
216 | _parent_scene.AddPhysicsActorTaint(this); | ||
217 | } | ||
218 | else | ||
219 | { | ||
220 | |||
221 | m_taintselected = value; | ||
222 | m_isSelected = value; | ||
223 | } | ||
224 | |||
225 | } | ||
183 | } | 226 | } |
184 | 227 | ||
185 | public void SetGeom(IntPtr geom) | 228 | public void SetGeom(IntPtr geom) |
186 | { | 229 | { |
187 | prev_geom = prim_geom; | 230 | prev_geom = prim_geom; |
188 | prim_geom = geom; | 231 | prim_geom = geom; |
232 | if (prim_geom != (IntPtr)0) | ||
233 | { | ||
234 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
235 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
236 | } | ||
189 | //m_log.Warn("Setting Geom to: " + prim_geom); | 237 | //m_log.Warn("Setting Geom to: " + prim_geom); |
190 | 238 | ||
191 | } | 239 | } |
192 | 240 | ||
241 | public void enableBodySoft() | ||
242 | { | ||
243 | if (m_isphysical) | ||
244 | if (Body != (IntPtr)0) | ||
245 | d.BodyEnable(Body); | ||
246 | |||
247 | m_disabled = false; | ||
248 | } | ||
249 | |||
250 | public void disableBodySoft() | ||
251 | { | ||
252 | m_disabled = true; | ||
253 | |||
254 | if (m_isphysical) | ||
255 | if (Body != (IntPtr)0) | ||
256 | d.BodyDisable(Body); | ||
257 | } | ||
258 | |||
259 | |||
193 | public void enableBody() | 260 | public void enableBody() |
194 | { | 261 | { |
195 | // Sets the geom to a body | 262 | // Sets the geom to a body |
@@ -204,6 +271,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
204 | myrot.Z = _orientation.z; | 271 | myrot.Z = _orientation.z; |
205 | d.BodySetQuaternion(Body, ref myrot); | 272 | d.BodySetQuaternion(Body, ref myrot); |
206 | d.GeomSetBody(prim_geom, Body); | 273 | d.GeomSetBody(prim_geom, Body); |
274 | m_collisionCategories |= CollisionCategories.Body; | ||
275 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); | ||
276 | |||
277 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
278 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
279 | |||
280 | |||
207 | d.BodySetAutoDisableFlag(Body, true); | 281 | d.BodySetAutoDisableFlag(Body, true); |
208 | d.BodySetAutoDisableSteps(Body, 20); | 282 | d.BodySetAutoDisableSteps(Body, 20); |
209 | 283 | ||
@@ -332,6 +406,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
332 | //this kills the body so things like 'mesh' can re-create it. | 406 | //this kills the body so things like 'mesh' can re-create it. |
333 | if (Body != (IntPtr) 0) | 407 | if (Body != (IntPtr) 0) |
334 | { | 408 | { |
409 | m_collisionCategories &= ~CollisionCategories.Body; | ||
410 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); | ||
411 | |||
412 | if (prim_geom != (IntPtr)0) | ||
413 | { | ||
414 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
415 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
416 | } | ||
417 | |||
335 | _parent_scene.remActivePrim(this); | 418 | _parent_scene.remActivePrim(this); |
336 | d.BodyDestroy(Body); | 419 | d.BodyDestroy(Body); |
337 | Body = (IntPtr) 0; | 420 | Body = (IntPtr) 0; |
@@ -425,10 +508,81 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
425 | if (m_taintdisable) | 508 | if (m_taintdisable) |
426 | changedisable(timestep); | 509 | changedisable(timestep); |
427 | 510 | ||
511 | if (m_taintselected != m_isSelected) | ||
512 | changeSelectedStatus(timestep); | ||
513 | |||
428 | if (m_taintVelocity != PhysicsVector.Zero) | 514 | if (m_taintVelocity != PhysicsVector.Zero) |
429 | changevelocity(timestep); | 515 | changevelocity(timestep); |
430 | } | 516 | } |
431 | 517 | ||
518 | private void changeSelectedStatus(float timestep) | ||
519 | { | ||
520 | while (ode.lockquery()) | ||
521 | { | ||
522 | } | ||
523 | ode.dlock(_parent_scene.world); | ||
524 | |||
525 | if (m_taintselected) | ||
526 | { | ||
527 | |||
528 | |||
529 | m_collisionCategories = CollisionCategories.Selected; | ||
530 | m_collisionFlags = (CollisionCategories.Sensor | CollisionCategories.Space); | ||
531 | |||
532 | // We do the body disable soft twice because 'in theory' a collision could have happened | ||
533 | // in between the disabling and the collision properties setting | ||
534 | // which would wake the physical body up from a soft disabling and potentially cause it to fall | ||
535 | // through the ground. | ||
536 | |||
537 | if (m_isphysical) | ||
538 | { | ||
539 | disableBodySoft(); | ||
540 | } | ||
541 | |||
542 | if (prim_geom != (IntPtr)0) | ||
543 | { | ||
544 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
545 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
546 | } | ||
547 | |||
548 | if (m_isphysical) | ||
549 | { | ||
550 | disableBodySoft(); | ||
551 | } | ||
552 | |||
553 | } | ||
554 | else | ||
555 | { | ||
556 | |||
557 | m_collisionCategories = CollisionCategories.Geom; | ||
558 | |||
559 | if (m_isphysical) | ||
560 | m_collisionCategories |= CollisionCategories.Body; | ||
561 | |||
562 | |||
563 | m_collisionFlags = m_default_collisionFlags; | ||
564 | |||
565 | if (m_collidesLand) | ||
566 | m_collisionFlags |= CollisionCategories.Land; | ||
567 | if (m_collidesWater) | ||
568 | m_collisionFlags |= CollisionCategories.Water; | ||
569 | |||
570 | if (prim_geom != (IntPtr)0) | ||
571 | { | ||
572 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
573 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
574 | } | ||
575 | if (m_isphysical) | ||
576 | enableBodySoft(); | ||
577 | |||
578 | |||
579 | } | ||
580 | |||
581 | ode.dunlock(_parent_scene.world); | ||
582 | resetCollisionAccounting(); | ||
583 | m_isSelected = m_taintselected; | ||
584 | } | ||
585 | |||
432 | public void ResetTaints() | 586 | public void ResetTaints() |
433 | { | 587 | { |
434 | 588 | ||
@@ -438,6 +592,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
438 | 592 | ||
439 | m_taintPhysics = m_isphysical; | 593 | m_taintPhysics = m_isphysical; |
440 | 594 | ||
595 | m_taintselected = m_isSelected; | ||
596 | |||
441 | m_taintsize = _size; | 597 | m_taintsize = _size; |
442 | 598 | ||
443 | 599 | ||
@@ -586,6 +742,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
586 | ode.dunlock(_parent_scene.world); | 742 | ode.dunlock(_parent_scene.world); |
587 | _parent_scene.geom_name_map[prim_geom] = this.m_primName; | 743 | _parent_scene.geom_name_map[prim_geom] = this.m_primName; |
588 | _parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this; | 744 | _parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this; |
745 | |||
746 | changeSelectedStatus(timestep); | ||
747 | |||
589 | m_taintadd = false; | 748 | m_taintadd = false; |
590 | 749 | ||
591 | 750 | ||
@@ -630,6 +789,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
630 | } | 789 | } |
631 | ode.dunlock(_parent_scene.world); | 790 | ode.dunlock(_parent_scene.world); |
632 | 791 | ||
792 | changeSelectedStatus(timestep); | ||
793 | |||
633 | resetCollisionAccounting(); | 794 | resetCollisionAccounting(); |
634 | m_taintposition = _position; | 795 | m_taintposition = _position; |
635 | } | 796 | } |
@@ -682,7 +843,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
682 | m_taintdisable = false; | 843 | m_taintdisable = false; |
683 | } | 844 | } |
684 | 845 | ||
685 | public void changePhysicsStatus(float timestap) | 846 | public void changePhysicsStatus(float timestep) |
686 | { | 847 | { |
687 | lock (ode) | 848 | lock (ode) |
688 | { | 849 | { |
@@ -709,6 +870,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
709 | ode.dunlock(_parent_scene.world); | 870 | ode.dunlock(_parent_scene.world); |
710 | } | 871 | } |
711 | 872 | ||
873 | changeSelectedStatus(timestep); | ||
874 | |||
712 | resetCollisionAccounting(); | 875 | resetCollisionAccounting(); |
713 | m_taintPhysics = m_isphysical; | 876 | m_taintPhysics = m_isphysical; |
714 | } | 877 | } |
@@ -880,6 +1043,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
880 | 1043 | ||
881 | ode.dunlock(_parent_scene.world); | 1044 | ode.dunlock(_parent_scene.world); |
882 | 1045 | ||
1046 | changeSelectedStatus(timestamp); | ||
1047 | |||
883 | resetCollisionAccounting(); | 1048 | resetCollisionAccounting(); |
884 | m_taintsize = _size; | 1049 | m_taintsize = _size; |
885 | } | 1050 | } |
@@ -927,7 +1092,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
927 | // Re creates body on size. | 1092 | // Re creates body on size. |
928 | // EnableBody also does setMass() | 1093 | // EnableBody also does setMass() |
929 | enableBody(); | 1094 | enableBody(); |
930 | d.BodyEnable(Body); | 1095 | |
931 | } | 1096 | } |
932 | } | 1097 | } |
933 | else | 1098 | else |
@@ -1032,66 +1197,76 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1032 | d.BodyEnable(Body); | 1197 | d.BodyEnable(Body); |
1033 | } | 1198 | } |
1034 | } | 1199 | } |
1200 | |||
1201 | |||
1035 | _parent_scene.geom_name_map[prim_geom] = oldname; | 1202 | _parent_scene.geom_name_map[prim_geom] = oldname; |
1036 | 1203 | ||
1037 | ode.dunlock(_parent_scene.world); | 1204 | ode.dunlock(_parent_scene.world); |
1038 | 1205 | ||
1206 | changeSelectedStatus(timestamp); | ||
1207 | |||
1039 | resetCollisionAccounting(); | 1208 | resetCollisionAccounting(); |
1040 | m_taintshape = false; | 1209 | m_taintshape = false; |
1041 | } | 1210 | } |
1042 | 1211 | ||
1043 | public void changeAddForce(float timestamp) | 1212 | public void changeAddForce(float timestamp) |
1044 | { | 1213 | { |
1045 | while (ode.lockquery()) | 1214 | if (!m_isSelected) |
1046 | { | 1215 | { |
1047 | } | 1216 | while (ode.lockquery()) |
1048 | ode.dlock(_parent_scene.world); | 1217 | { |
1218 | } | ||
1219 | ode.dlock(_parent_scene.world); | ||
1049 | 1220 | ||
1050 | 1221 | ||
1051 | lock (m_forcelist) | 1222 | lock (m_forcelist) |
1052 | { | ||
1053 | //m_log.Info("[PHYSICS]: dequeing forcelist"); | ||
1054 | if (IsPhysical) | ||
1055 | { | 1223 | { |
1056 | PhysicsVector iforce = new PhysicsVector(); | 1224 | //m_log.Info("[PHYSICS]: dequeing forcelist"); |
1057 | for (int i = 0; i < m_forcelist.Count; i++) | 1225 | if (IsPhysical) |
1058 | { | 1226 | { |
1059 | iforce = iforce + (m_forcelist[i]*100); | 1227 | PhysicsVector iforce = new PhysicsVector(); |
1060 | } | 1228 | for (int i = 0; i < m_forcelist.Count; i++) |
1061 | d.BodyEnable(Body); | 1229 | { |
1062 | d.BodyAddForce(Body, iforce.X, iforce.Y, iforce.Z); | 1230 | iforce = iforce + (m_forcelist[i] * 100); |
1231 | } | ||
1232 | d.BodyEnable(Body); | ||
1233 | d.BodyAddForce(Body, iforce.X, iforce.Y, iforce.Z); | ||
1234 | } | ||
1235 | m_forcelist.Clear(); | ||
1063 | } | 1236 | } |
1064 | m_forcelist.Clear(); | ||
1065 | } | ||
1066 | 1237 | ||
1067 | ode.dunlock(_parent_scene.world); | 1238 | ode.dunlock(_parent_scene.world); |
1068 | 1239 | ||
1069 | m_collisionscore = 0; | 1240 | m_collisionscore = 0; |
1070 | m_interpenetrationcount = 0; | 1241 | m_interpenetrationcount = 0; |
1242 | } | ||
1071 | m_taintforce = false; | 1243 | m_taintforce = false; |
1072 | 1244 | ||
1073 | } | 1245 | } |
1074 | private void changevelocity(float timestep) | 1246 | private void changevelocity(float timestep) |
1075 | { | 1247 | { |
1076 | lock (ode) | 1248 | if (!m_isSelected) |
1077 | { | 1249 | { |
1078 | while (ode.lockquery()) | 1250 | lock (ode) |
1079 | { | 1251 | { |
1080 | } | 1252 | while (ode.lockquery()) |
1081 | ode.dlock(_parent_scene.world); | 1253 | { |
1254 | } | ||
1255 | ode.dlock(_parent_scene.world); | ||
1082 | 1256 | ||
1083 | System.Threading.Thread.Sleep(20); | 1257 | System.Threading.Thread.Sleep(20); |
1084 | if (IsPhysical) | 1258 | if (IsPhysical) |
1085 | { | ||
1086 | if (Body != (IntPtr)0) | ||
1087 | { | 1259 | { |
1088 | d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); | 1260 | if (Body != (IntPtr)0) |
1261 | { | ||
1262 | d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); | ||
1263 | } | ||
1089 | } | 1264 | } |
1090 | } | ||
1091 | 1265 | ||
1092 | ode.dunlock(_parent_scene.world); | 1266 | ode.dunlock(_parent_scene.world); |
1267 | } | ||
1268 | //resetCollisionAccounting(); | ||
1093 | } | 1269 | } |
1094 | //resetCollisionAccounting(); | ||
1095 | m_taintVelocity = PhysicsVector.Zero; | 1270 | m_taintVelocity = PhysicsVector.Zero; |
1096 | } | 1271 | } |
1097 | public override bool IsPhysical | 1272 | public override bool IsPhysical |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index b3780fd..76bd3f2 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -78,6 +78,21 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
78 | } | 78 | } |
79 | } | 79 | } |
80 | 80 | ||
81 | [Flags] | ||
82 | public enum CollisionCategories : int | ||
83 | { | ||
84 | Disabled = 0, | ||
85 | Geom = 0x00000001, | ||
86 | Body = 0x00000002, | ||
87 | Space = 0x00000004, | ||
88 | Character = 0x00000008, | ||
89 | Land = 0x00000010, | ||
90 | Water = 0x00000020, | ||
91 | Wind = 0x00000040, | ||
92 | Sensor = 0x00000080, | ||
93 | Selected = 0x00000100 | ||
94 | } | ||
95 | |||
81 | public class OdeScene : PhysicsScene | 96 | public class OdeScene : PhysicsScene |
82 | { | 97 | { |
83 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 98 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
@@ -997,6 +1012,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
997 | { | 1012 | { |
998 | // creating a new space for prim and inserting it into main space. | 1013 | // creating a new space for prim and inserting it into main space. |
999 | staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY] = d.HashSpaceCreate(IntPtr.Zero); | 1014 | staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY] = d.HashSpaceCreate(IntPtr.Zero); |
1015 | d.GeomSetCategoryBits(staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY], (int)CollisionCategories.Space); | ||
1000 | waitForSpaceUnlock(space); | 1016 | waitForSpaceUnlock(space); |
1001 | d.SpaceAdd(space, staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY]); | 1017 | d.SpaceAdd(space, staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY]); |
1002 | return staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY]; | 1018 | return staticPrimspace[iprimspaceArrItemX, iprimspaceArrItemY]; |
@@ -1656,6 +1672,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1656 | offset, thickness, wrap); | 1672 | offset, thickness, wrap); |
1657 | d.GeomHeightfieldDataSetBounds(HeightmapData, m_regionWidth, m_regionHeight); | 1673 | d.GeomHeightfieldDataSetBounds(HeightmapData, m_regionWidth, m_regionHeight); |
1658 | LandGeom = d.CreateHeightfield(space, HeightmapData, 1); | 1674 | LandGeom = d.CreateHeightfield(space, HeightmapData, 1); |
1675 | if (LandGeom != (IntPtr)0) | ||
1676 | { | ||
1677 | d.GeomSetCategoryBits(LandGeom, (int)(CollisionCategories.Land)); | ||
1678 | d.GeomSetCollideBits(LandGeom, (int)(CollisionCategories.Space)); | ||
1679 | |||
1680 | } | ||
1659 | geom_name_map[LandGeom] = "Terrain"; | 1681 | geom_name_map[LandGeom] = "Terrain"; |
1660 | 1682 | ||
1661 | d.Matrix3 R = new d.Matrix3(); | 1683 | d.Matrix3 R = new d.Matrix3(); |