Use faster any contact point collision detection for Volumedetect, plus
some clean upavinationmerge
							parent
							
								
									906ac4adc4
								
							
						
					
					
						commit
						4c2523b1c2
					
				|  | @ -134,7 +134,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
| 
 | ||||
| //        private bool m_collidesLand = true; | ||||
|         private bool m_collidesWater; | ||||
|         public bool m_returnCollisions; | ||||
| //        public bool m_returnCollisions; | ||||
| 
 | ||||
|         private bool m_NoColide;  // for now only for internal use for bad meshs | ||||
| 
 | ||||
|  | @ -164,8 +164,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|         private List<OdePrim> childrenPrim = new List<OdePrim>(); | ||||
| 
 | ||||
| 
 | ||||
|         private bool m_throttleUpdates; | ||||
|         private int throttleCounter; | ||||
| //        private bool m_throttleUpdates; | ||||
| //        private int throttleCounter; | ||||
|         public float m_collisionscore; | ||||
|         int m_colliderfilter = 0; | ||||
| 
 | ||||
|  | @ -363,12 +363,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|             set { return; } | ||||
|         } | ||||
| 
 | ||||
|         public override bool ThrottleUpdates | ||||
| 
 | ||||
|         public override bool ThrottleUpdates {get;set;} | ||||
| /* | ||||
|         { | ||||
|             get { return m_throttleUpdates; } | ||||
|             set { m_throttleUpdates = value; } | ||||
|         } | ||||
| 
 | ||||
| */ | ||||
|         public override bool Stopped | ||||
|         { | ||||
|             get { return _zeroFlag; } | ||||
|  | @ -951,7 +953,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|         { | ||||
|             if (CollisionEventsThisFrame == null) | ||||
|                 CollisionEventsThisFrame = new CollisionEventUpdate(); | ||||
|             CollisionEventsThisFrame.AddCollider(CollidedWith, contact); | ||||
| //            if(CollisionEventsThisFrame.Count < 32) | ||||
|                 CollisionEventsThisFrame.AddCollider(CollidedWith, contact); | ||||
|         } | ||||
| 
 | ||||
|         public void SendCollisions() | ||||
|  | @ -977,6 +980,10 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     if (ncolisions > 10) | ||||
|                     { | ||||
|                     } | ||||
| 
 | ||||
|                     SentEmptyCollisionsEvent = false; | ||||
|                     CollisionEventsThisFrame.Clear(); | ||||
|                 } | ||||
|  | @ -1746,8 +1753,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|             if (childrenPrim.Count == 0) | ||||
|             { | ||||
|                 collide_geom = prim_geom; | ||||
|                 m_targetSpace = _parent_scene.ActiveSpace; | ||||
|                 d.SpaceAdd(m_targetSpace, prim_geom); | ||||
|                 m_targetSpace = _parent_scene.ActiveSpace;                | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -1755,7 +1761,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|                 d.HashSpaceSetLevels(m_targetSpace, -2, 8); | ||||
|                 d.SpaceSetSublevel(m_targetSpace, 3); | ||||
|                 d.SpaceSetCleanup(m_targetSpace, false); | ||||
|                 d.SpaceAdd(m_targetSpace, prim_geom); | ||||
| 
 | ||||
|                 d.GeomSetCategoryBits(m_targetSpace, (uint)(CollisionCategories.Space | | ||||
|                                                             CollisionCategories.Geom | | ||||
|  | @ -1766,12 +1771,21 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|                 collide_geom = m_targetSpace; | ||||
|             } | ||||
| 
 | ||||
|             d.SpaceAdd(m_targetSpace, prim_geom); | ||||
| 
 | ||||
|             if (m_delaySelect) | ||||
|             { | ||||
|                 m_isSelected = true; | ||||
|                 m_delaySelect = false; | ||||
|             } | ||||
| 
 | ||||
|             m_collisionscore = 0; | ||||
| 
 | ||||
|             UpdateCollisionCatFlags(); | ||||
|             ApplyCollisionCatFlags(); | ||||
| 
 | ||||
|             _parent_scene.addActivePrim(this); | ||||
| 
 | ||||
|             lock (childrenPrim) | ||||
|             { | ||||
|                 foreach (OdePrim prm in childrenPrim) | ||||
|  | @ -1809,10 +1823,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|                 createAMotor(m_angularlock); | ||||
|             } | ||||
| 
 | ||||
|             m_collisionscore = 0; | ||||
| 
 | ||||
|             UpdateCollisionCatFlags(); | ||||
|             ApplyCollisionCatFlags(); | ||||
| 
 | ||||
|             if (m_isSelected || m_disabled) | ||||
|             { | ||||
|  | @ -1824,7 +1834,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|                 d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z); | ||||
|             } | ||||
| 
 | ||||
|             _parent_scene.addActivePrim(this); | ||||
|             _parent_scene.addActiveGroups(this); | ||||
|         } | ||||
| 
 | ||||
|  | @ -3441,92 +3450,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|                     if (++bodydisablecontrol < 20) | ||||
|                         return; | ||||
| 
 | ||||
|                     bodydisablecontrol = 0; | ||||
|                      | ||||
|                     d.BodyEnable(Body); | ||||
|                 } | ||||
| 
 | ||||
|                 bodydisablecontrol = 0; | ||||
| 
 | ||||
|                 d.Vector3 lpos = d.GeomGetPosition(prim_geom); // root position that is seem by rest of simulator | ||||
| 
 | ||||
| /*  moved down to UpdateMove... where it belongs again | ||||
| 
 | ||||
|                 // check outside region | ||||
| 
 | ||||
|                 if (lpos.Z < -100 || lpos.Z > 100000f) | ||||
|                 { | ||||
|                     m_outbounds = true; | ||||
| 
 | ||||
|                     lpos.Z = Util.Clip(lpos.Z, -100f, 100000f); | ||||
|                     _acceleration.X = 0; | ||||
|                     _acceleration.Y = 0; | ||||
|                     _acceleration.Z = 0; | ||||
| 
 | ||||
|                     _velocity.X = 0; | ||||
|                     _velocity.Y = 0; | ||||
|                     _velocity.Z = 0; | ||||
|                     m_rotationalVelocity.X = 0; | ||||
|                     m_rotationalVelocity.Y = 0; | ||||
|                     m_rotationalVelocity.Z = 0; | ||||
| 
 | ||||
|                     d.BodySetLinearVel(Body, 0, 0, 0); // stop it | ||||
|                     d.BodySetAngularVel(Body, 0, 0, 0); // stop it | ||||
|                     d.BodySetPosition(Body, lpos.X, lpos.Y, lpos.Z); // put it somewhere  | ||||
|                     m_lastposition = _position; | ||||
|                     m_lastorientation = _orientation; | ||||
| 
 | ||||
|                     base.RequestPhysicsterseUpdate(); | ||||
| 
 | ||||
|                     throttleCounter = 0; | ||||
|                     _zeroFlag = true; | ||||
| 
 | ||||
|                     disableBodySoft(); // disable it and colisions | ||||
|                     base.RaiseOutOfBounds(_position); | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 if (lpos.X < 0f) | ||||
|                 { | ||||
|                     _position.X = Util.Clip(lpos.X, -2f, -0.1f); | ||||
|                     m_outbounds = true; | ||||
|                 } | ||||
|                 else if (lpos.X > _parent_scene.WorldExtents.X) | ||||
|                 { | ||||
|                     _position.X = Util.Clip(lpos.X, _parent_scene.WorldExtents.X + 0.1f, _parent_scene.WorldExtents.X + 2f); | ||||
|                     m_outbounds = true; | ||||
|                 } | ||||
|                 if (lpos.Y < 0f) | ||||
|                 { | ||||
|                     _position.Y = Util.Clip(lpos.Y, -2f, -0.1f); | ||||
|                     m_outbounds = true; | ||||
|                 } | ||||
|                 else if (lpos.Y > _parent_scene.WorldExtents.Y) | ||||
|                 { | ||||
|                     _position.Y = Util.Clip(lpos.Y, _parent_scene.WorldExtents.Y + 0.1f, _parent_scene.WorldExtents.Y + 2f); | ||||
|                     m_outbounds = true; | ||||
|                 } | ||||
| 
 | ||||
|                 if (m_outbounds) | ||||
|                 { | ||||
|                     m_lastposition = _position; | ||||
|                     m_lastorientation = _orientation; | ||||
| 
 | ||||
|                     d.Vector3 dtmp = d.BodyGetAngularVel(Body); | ||||
|                     m_rotationalVelocity.X = dtmp.X; | ||||
|                     m_rotationalVelocity.Y = dtmp.Y; | ||||
|                     m_rotationalVelocity.Z = dtmp.Z; | ||||
| 
 | ||||
|                     dtmp = d.BodyGetLinearVel(Body); | ||||
|                     _velocity.X = dtmp.X; | ||||
|                     _velocity.Y = dtmp.Y; | ||||
|                     _velocity.Z = dtmp.Z; | ||||
| 
 | ||||
|                     d.BodySetLinearVel(Body, 0, 0, 0); // stop it | ||||
|                     d.BodySetAngularVel(Body, 0, 0, 0); | ||||
|                     d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | ||||
|                     disableBodySoft(); // stop collisions | ||||
|                     base.RequestPhysicsterseUpdate(); | ||||
|                     return; | ||||
|                 } | ||||
| */ | ||||
|                 if (m_vehicle != null && m_vehicle.Type != Vehicle.TYPE_NONE) | ||||
|                 { | ||||
|                     // 'VEHICLES' are dealt with in ODEDynamics.cs | ||||
|  | @ -3721,7 +3652,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
| 
 | ||||
|                         base.RequestPhysicsterseUpdate(); | ||||
| 
 | ||||
|                         throttleCounter = 0; | ||||
| //                        throttleCounter = 0; | ||||
|                         _zeroFlag = true; | ||||
| 
 | ||||
|                         disableBodySoft(); // disable it and colisions | ||||
|  |  | |||
|  | @ -61,6 +61,8 @@ namespace OdeAPI | |||
|         public static int NTotalBodies = 0; | ||||
|         public static int NTotalGeoms = 0; | ||||
| 
 | ||||
|         public const uint CONTACTS_UNIMPORTANT = 0x80000000; | ||||
| 
 | ||||
| 		#region Flags and Enumerations | ||||
| 
 | ||||
|         [Flags] | ||||
|  |  | |||
|  | @ -713,8 +713,18 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
| 
 | ||||
|                 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) | ||||
|                     return; | ||||
| 
 | ||||
|                 count = d.CollidePtr(g1, g2, (contactsPerCollision & 0xffff), ContactgeomsArray, d.ContactGeom.unmanagedSizeOf); | ||||
|                 if(d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc || | ||||
|                     d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc) | ||||
|                 { | ||||
|                     int cflags; | ||||
|                     unchecked | ||||
|                     { | ||||
|                         cflags = (int)(1 | d.CONTACTS_UNIMPORTANT); | ||||
|                     } | ||||
|                     count = d.CollidePtr(g1, g2, cflags, ContactgeomsArray, d.ContactGeom.unmanagedSizeOf); | ||||
|                 } | ||||
|                 else | ||||
|                     count = d.CollidePtr(g1, g2, (contactsPerCollision & 0xffff), ContactgeomsArray, d.ContactGeom.unmanagedSizeOf); | ||||
|             } | ||||
|             catch (SEHException) | ||||
|             { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 UbitUmarov
						UbitUmarov