sop: - added UpdatePhysicsSubscribedEvents() to update physics ator collision events subcription where needed. Made it consider also VolumeDtc and phantom cases. - added extra calls to it on physics ator proprieties changes. - Fixed land collisions reports. - Handle the case of physics sending a last zero colisions reports to trigger collision_end. - Made the physics collisions report rate be 20 per second. (needs review/testing)

avinationmerge
UbitUmarov 2012-05-15 15:54:02 +01:00
parent 9d67523235
commit ca14534b91
1 changed files with 118 additions and 48 deletions

View File

@ -123,10 +123,16 @@ namespace OpenSim.Region.Framework.Scenes
/// </value> /// </value>
public const int ALL_SIDES = -1; public const int ALL_SIDES = -1;
private const scriptEvents PhyscicsNeededSubsEvents = ( private const scriptEvents PhysicsNeededSubsEvents = (
scriptEvents.collision | scriptEvents.collision_start | scriptEvents.collision_end | scriptEvents.collision | scriptEvents.collision_start | scriptEvents.collision_end |
scriptEvents.land_collision | scriptEvents.land_collision_start | scriptEvents.land_collision_end scriptEvents.land_collision | scriptEvents.land_collision_start | scriptEvents.land_collision_end
); );
private const scriptEvents PhyscicsPhantonSubsEvents = (
scriptEvents.land_collision | scriptEvents.land_collision_start | scriptEvents.land_collision_end
);
private const scriptEvents PhyscicsVolumeDtcSubsEvents = (
scriptEvents.collision_start | scriptEvents.collision_end
);
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@ -1882,7 +1888,10 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if ((!isPhantom || isPhysical || _VolumeDetectActive) && !ParentGroup.IsAttachment if ((!isPhantom || isPhysical || _VolumeDetectActive) && !ParentGroup.IsAttachment
&& !(Shape.PathCurve == (byte)Extrusion.Flexible)) && !(Shape.PathCurve == (byte)Extrusion.Flexible))
{
AddToPhysics(isPhysical, isPhantom, building, isPhysical); AddToPhysics(isPhysical, isPhantom, building, isPhysical);
UpdatePhysicsSubscribedEvents(); // not sure if appliable here
}
else else
PhysActor = null; // just to be sure PhysActor = null; // just to be sure
} }
@ -1975,6 +1984,7 @@ namespace OpenSim.Region.Framework.Scenes
bool UsePhysics = ((dupe.Flags & PrimFlags.Physics) != 0); bool UsePhysics = ((dupe.Flags & PrimFlags.Physics) != 0);
dupe.DoPhysicsPropertyUpdate(UsePhysics, true); dupe.DoPhysicsPropertyUpdate(UsePhysics, true);
// dupe.UpdatePhysicsSubscribedEvents(); // not sure...
} }
if (dupe.PhysActor != null) if (dupe.PhysActor != null)
@ -2602,6 +2612,21 @@ namespace OpenSim.Region.Framework.Scenes
List<uint> endedColliders = new List<uint>(); List<uint> endedColliders = new List<uint>();
List<uint> startedColliders = new List<uint>(); List<uint> startedColliders = new List<uint>();
if (collissionswith.Count == 0)
{
if (m_lastColliders.Count == 0)
return; // nothing to do
foreach (uint localID in m_lastColliders)
{
endedColliders.Add(localID);
}
m_lastColliders.Clear();
}
else
{
// calculate things that started colliding this time // calculate things that started colliding this time
// and build up list of colliders this time // and build up list of colliders this time
foreach (uint localid in collissionswith.Keys) foreach (uint localid in collissionswith.Keys)
@ -2625,7 +2650,7 @@ namespace OpenSim.Region.Framework.Scenes
// remove things that ended colliding from the last colliders list // remove things that ended colliding from the last colliders list
foreach (uint localID in endedColliders) foreach (uint localID in endedColliders)
m_lastColliders.Remove(localID); m_lastColliders.Remove(localID);
}
// play the sound. // play the sound.
if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f) if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f)
SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false); SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false);
@ -2636,12 +2661,9 @@ namespace OpenSim.Region.Framework.Scenes
SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd); SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd);
if (startedColliders.Contains(0)) if (startedColliders.Contains(0))
{ SendLandCollisionEvent(scriptEvents.land_collision_start, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingStart);
if (m_lastColliders.Contains(0)) if (m_lastColliders.Contains(0))
SendLandCollisionEvent(scriptEvents.land_collision, ParentGroup.Scene.EventManager.TriggerScriptLandColliding); SendLandCollisionEvent(scriptEvents.land_collision, ParentGroup.Scene.EventManager.TriggerScriptLandColliding);
else
SendLandCollisionEvent(scriptEvents.land_collision_start, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingStart);
}
if (endedColliders.Contains(0)) if (endedColliders.Contains(0))
SendLandCollisionEvent(scriptEvents.land_collision_end, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd); SendLandCollisionEvent(scriptEvents.land_collision_end, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd);
} }
@ -4383,26 +4405,28 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (pa == null) if (pa == null)
{ {
AddToPhysics(UsePhysics, SetPhantom, building , false); AddToPhysics(UsePhysics, SetPhantom, building, false);
pa = PhysActor; pa = PhysActor;
/*
if (pa != null) if (pa != null)
{ {
if ( if (
// ((AggregateScriptEvents & scriptEvents.collision) != 0) || // ((AggregateScriptEvents & scriptEvents.collision) != 0) ||
// ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || // ((AggregateScriptEvents & scriptEvents.collision_end) != 0) ||
// ((AggregateScriptEvents & scriptEvents.collision_start) != 0) || // ((AggregateScriptEvents & scriptEvents.collision_start) != 0) ||
// ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || // ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) ||
// ((AggregateScriptEvents & scriptEvents.land_collision) != 0) || // ((AggregateScriptEvents & scriptEvents.land_collision) != 0) ||
// ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || // ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) ||
((AggregateScriptEvents & PhyscicsNeededSubsEvents) != 0) || ((ParentGroup.RootPart.AggregateScriptEvents & PhyscicsNeededSubsEvents) != 0) || (CollisionSound != UUID.Zero) ((AggregateScriptEvents & PhysicsNeededSubsEvents) != 0) ||
// (CollisionSound != UUID.Zero) ((ParentGroup.RootPart.AggregateScriptEvents & PhysicsNeededSubsEvents) != 0) ||
(CollisionSound != UUID.Zero)
) )
{ {
pa.OnCollisionUpdate += PhysicsCollision; pa.OnCollisionUpdate += PhysicsCollision;
pa.SubscribeEvents(1000); pa.SubscribeEvents(1000);
} }
} }
*/
} }
else // it already has a physical representation else // it already has a physical representation
@ -4414,9 +4438,13 @@ namespace OpenSim.Region.Framework.Scenes
else else
pa.SetVolumeDetect(0); pa.SetVolumeDetect(0);
*/ */
if (pa.Building != building) if (pa.Building != building)
pa.Building = building; pa.Building = building;
} }
UpdatePhysicsSubscribedEvents();
} }
} }
@ -4539,8 +4567,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// This isn't the same as turning off physical, since even without being physical the prim has a physics /// This isn't the same as turning off physical, since even without being physical the prim has a physics
/// representation for collision detection. Rather, this would be used in situations such as making a prim /// representation for collision detection.
/// phantom.
/// </remarks> /// </remarks>
public void RemoveFromPhysics() public void RemoveFromPhysics()
{ {
@ -4704,6 +4731,46 @@ namespace OpenSim.Region.Framework.Scenes
ScheduleFullUpdate(); ScheduleFullUpdate();
} }
private void UpdatePhysicsSubscribedEvents()
{
PhysicsActor pa = PhysActor;
if (pa == null)
return;
pa.OnCollisionUpdate -= PhysicsCollision;
bool hassound = ( CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f);
scriptEvents CombinedEvents = AggregateScriptEvents;
// merge with root part
if (ParentGroup != null && ParentGroup.RootPart != null)
CombinedEvents |= ParentGroup.RootPart.AggregateScriptEvents;
// submit to this part case
if (VolumeDetectActive)
{
CombinedEvents &= PhyscicsVolumeDtcSubsEvents;
hassound = false;
}
else if ((Flags & PrimFlags.Phantom) != 0)
CombinedEvents &= PhyscicsPhantonSubsEvents;
else
CombinedEvents &= PhysicsNeededSubsEvents;
if (hassound || CombinedEvents != 0)
{
// subscribe to physics updates.
pa.OnCollisionUpdate += PhysicsCollision;
pa.SubscribeEvents(50); // 20 reports per second
}
else
{
pa.UnSubscribeEvents();
}
}
public void aggregateScriptEvents() public void aggregateScriptEvents()
{ {
if (ParentGroup == null || ParentGroup.RootPart == null) if (ParentGroup == null || ParentGroup.RootPart == null)
@ -4740,7 +4807,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
objectflagupdate |= (uint) PrimFlags.AllowInventoryDrop; objectflagupdate |= (uint) PrimFlags.AllowInventoryDrop;
} }
/*
PhysicsActor pa = PhysActor; PhysicsActor pa = PhysActor;
if (pa != null) if (pa != null)
{ {
@ -4751,7 +4818,7 @@ namespace OpenSim.Region.Framework.Scenes
// ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || // ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) ||
// ((AggregateScriptEvents & scriptEvents.land_collision) != 0) || // ((AggregateScriptEvents & scriptEvents.land_collision) != 0) ||
// ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || // ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) ||
((AggregateScriptEvents & PhyscicsNeededSubsEvents) != 0) || ((ParentGroup.RootPart.AggregateScriptEvents & PhyscicsNeededSubsEvents) != 0) || (CollisionSound != UUID.Zero) ((AggregateScriptEvents & PhysicsNeededSubsEvents) != 0) || ((ParentGroup.RootPart.AggregateScriptEvents & PhysicsNeededSubsEvents) != 0) || (CollisionSound != UUID.Zero)
) )
{ {
// subscribe to physics updates. // subscribe to physics updates.
@ -4764,6 +4831,9 @@ namespace OpenSim.Region.Framework.Scenes
pa.OnCollisionUpdate -= PhysicsCollision; pa.OnCollisionUpdate -= PhysicsCollision;
} }
} }
*/
UpdatePhysicsSubscribedEvents();
//if ((GetEffectiveObjectFlags() & (uint)PrimFlags.Scripted) != 0) //if ((GetEffectiveObjectFlags() & (uint)PrimFlags.Scripted) != 0)
//{ //{
// ParentGroup.Scene.EventManager.OnScriptTimerEvent += handleTimerAccounting; // ParentGroup.Scene.EventManager.OnScriptTimerEvent += handleTimerAccounting;