Merge branch 'avination' into careminster

Conflicts:
	OpenSim/Data/MySQL/MySQLSimulationData.cs
	OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
avinationmerge
Melanie 2012-05-15 21:24:27 +01:00
commit 81ce169dfe
5 changed files with 204 additions and 64 deletions

View File

@ -171,6 +171,7 @@ namespace OpenSim.Data.MySQL
"ParticleSystem, ClickAction, Material, " + "ParticleSystem, ClickAction, Material, " +
"CollisionSound, CollisionSoundVolume, " + "CollisionSound, CollisionSoundVolume, " +
"PassTouches, " + "PassTouches, " +
"PassCollisions, " +
"LinkNumber, MediaURL, KeyframeMotion, " + "LinkNumber, MediaURL, KeyframeMotion, " +
"PhysicsShapeType, Density, GravityModifier, " + "PhysicsShapeType, Density, GravityModifier, " +
"Friction, Restitution) values (" + "?UUID, " + "Friction, Restitution) values (" + "?UUID, " +
@ -204,7 +205,7 @@ namespace OpenSim.Data.MySQL
"?SaleType, ?ColorR, ?ColorG, " + "?SaleType, ?ColorR, ?ColorG, " +
"?ColorB, ?ColorA, ?ParticleSystem, " + "?ColorB, ?ColorA, ?ParticleSystem, " +
"?ClickAction, ?Material, ?CollisionSound, " + "?ClickAction, ?Material, ?CollisionSound, " +
"?CollisionSoundVolume, ?PassTouches, " + "?CollisionSoundVolume, ?PassTouches, ?PassCollisions, " +
"?LinkNumber, ?MediaURL, ?KeyframeMotion, " + "?LinkNumber, ?MediaURL, ?KeyframeMotion, " +
"?PhysicsShapeType, ?Density, ?GravityModifier, " + "?PhysicsShapeType, ?Density, ?GravityModifier, " +
"?Friction, ?Restitution)"; "?Friction, ?Restitution)";
@ -1231,6 +1232,7 @@ namespace OpenSim.Data.MySQL
prim.CollisionSoundVolume = (float)(double)row["CollisionSoundVolume"]; prim.CollisionSoundVolume = (float)(double)row["CollisionSoundVolume"];
prim.PassTouches = ((sbyte)row["PassTouches"] != 0); prim.PassTouches = ((sbyte)row["PassTouches"] != 0);
prim.PassCollisions = ((sbyte)row["PassCollisions"] != 0);
prim.LinkNum = (int)row["LinkNumber"]; prim.LinkNum = (int)row["LinkNumber"];
if (!(row["MediaURL"] is System.DBNull)) if (!(row["MediaURL"] is System.DBNull))
@ -1605,6 +1607,11 @@ namespace OpenSim.Data.MySQL
else else
cmd.Parameters.AddWithValue("PassTouches", 0); cmd.Parameters.AddWithValue("PassTouches", 0);
if (prim.PassCollisions)
cmd.Parameters.AddWithValue("PassCollisions", 1);
else
cmd.Parameters.AddWithValue("PassCollisions", 0);
cmd.Parameters.AddWithValue("LinkNumber", prim.LinkNum); cmd.Parameters.AddWithValue("LinkNumber", prim.LinkNum);
cmd.Parameters.AddWithValue("MediaURL", prim.MediaUrl); cmd.Parameters.AddWithValue("MediaURL", prim.MediaUrl);

View File

@ -123,11 +123,17 @@ 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);
/// <value> /// <value>
@ -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)
@ -2605,45 +2615,61 @@ 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>();
// calculate things that started colliding this time if (collissionswith.Count == 0)
// and build up list of colliders this time
foreach (uint localid in collissionswith.Keys)
{ {
thisHitColliders.Add(localid); if (m_lastColliders.Count == 0)
if (!m_lastColliders.Contains(localid)) return; // nothing to do
startedColliders.Add(localid);
}
// calculate things that ended colliding foreach (uint localID in m_lastColliders)
foreach (uint localID in m_lastColliders) {
{
if (!thisHitColliders.Contains(localID))
endedColliders.Add(localID); endedColliders.Add(localID);
}
m_lastColliders.Clear();
} }
//add the items that started colliding this time to the last colliders list. else
foreach (uint localID in startedColliders) {
m_lastColliders.Add(localID);
// remove things that ended colliding from the last colliders list // calculate things that started colliding this time
foreach (uint localID in endedColliders) // and build up list of colliders this time
m_lastColliders.Remove(localID); foreach (uint localid in collissionswith.Keys)
{
thisHitColliders.Add(localid);
if (!m_lastColliders.Contains(localid))
startedColliders.Add(localid);
}
// calculate things that ended colliding
foreach (uint localID in m_lastColliders)
{
if (!thisHitColliders.Contains(localID))
endedColliders.Add(localID);
}
//add the items that started colliding this time to the last colliders list.
foreach (uint localID in startedColliders)
m_lastColliders.Add(localID);
// remove things that ended colliding from the last colliders list
foreach (uint localID in endedColliders)
m_lastColliders.Remove(localID);
}
// play the sound. // play the sound.
if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f)
bool IsNotVolumeDtc = !VolumeDetectActive;
if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f && IsNotVolumeDtc)
SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false); SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0, 0, false, false);
SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart); SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart);
SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding); if (IsNotVolumeDtc)
SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding);
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);
} }
@ -4386,26 +4412,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.SubscribeEvents(1000); pa.OnCollisionUpdate += PhysicsCollision;
} pa.SubscribeEvents(1000);
} }
}
*/
} }
else // it already has a physical representation else // it already has a physical representation
{ {
@ -4416,9 +4444,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();
} }
} }
@ -4541,8 +4573,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()
{ {
@ -4706,6 +4737,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)
@ -4742,7 +4813,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)
{ {
@ -4753,7 +4824,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.
@ -4766,6 +4837,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;

View File

@ -194,8 +194,10 @@ namespace OpenSim.Region.Physics.OdePlugin
public int givefakeori = 0; public int givefakeori = 0;
private Quaternion fakeori; private Quaternion fakeori;
public int m_eventsubscription; private int m_eventsubscription;
private CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate(); private int m_cureventsubscription;
private CollisionEventUpdate CollisionEventsThisFrame = null;
private bool SentEmptyCollisionsEvent;
public volatile bool childPrim; public volatile bool childPrim;
@ -931,12 +933,21 @@ namespace OpenSim.Region.Physics.OdePlugin
public override void SubscribeEvents(int ms) public override void SubscribeEvents(int ms)
{ {
m_eventsubscription = ms; m_eventsubscription = ms;
m_cureventsubscription = 0;
if (CollisionEventsThisFrame == null)
CollisionEventsThisFrame = new CollisionEventUpdate();
SentEmptyCollisionsEvent = false;
_parent_scene.AddCollisionEventReporting(this); _parent_scene.AddCollisionEventReporting(this);
} }
public override void UnSubscribeEvents() public override void UnSubscribeEvents()
{ {
_parent_scene.RemoveCollisionEventReporting(this); _parent_scene.RemoveCollisionEventReporting(this);
if (CollisionEventsThisFrame != null)
{
CollisionEventsThisFrame.Clear();
CollisionEventsThisFrame = null;
}
m_eventsubscription = 0; m_eventsubscription = 0;
} }
@ -944,7 +955,6 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
if (CollisionEventsThisFrame == null) if (CollisionEventsThisFrame == null)
CollisionEventsThisFrame = new CollisionEventUpdate(); CollisionEventsThisFrame = new CollisionEventUpdate();
CollisionEventsThisFrame.AddCollider(CollidedWith, contact); CollisionEventsThisFrame.AddCollider(CollidedWith, contact);
} }
@ -953,14 +963,34 @@ namespace OpenSim.Region.Physics.OdePlugin
if (CollisionEventsThisFrame == null) if (CollisionEventsThisFrame == null)
return; return;
base.SendCollisionUpdate(CollisionEventsThisFrame); if (m_cureventsubscription < m_eventsubscription)
return;
if (CollisionEventsThisFrame.m_objCollisionList.Count == 0) m_cureventsubscription = 0;
CollisionEventsThisFrame = null;
else int ncolisions = CollisionEventsThisFrame.m_objCollisionList.Count;
CollisionEventsThisFrame = new CollisionEventUpdate();
if (!SentEmptyCollisionsEvent || ncolisions > 0)
{
base.SendCollisionUpdate(CollisionEventsThisFrame);
if (ncolisions == 0)
SentEmptyCollisionsEvent = true;
else
{
SentEmptyCollisionsEvent = false;
CollisionEventsThisFrame.Clear();
}
}
} }
internal void AddCollisionFrameTime(int t)
{
// protect it from overflow crashing
if (m_cureventsubscription + t >= int.MaxValue)
m_cureventsubscription = 0;
m_cureventsubscription += t;
}
public override bool SubscribedEvents() public override bool SubscribedEvents()
{ {
if (m_eventsubscription > 0) if (m_eventsubscription > 0)

View File

@ -620,8 +620,6 @@ namespace OpenSim.Region.Physics.OdePlugin
return d.JointCreateContactPtr(world, contactgroup, contact); return d.JointCreateContactPtr(world, contactgroup, contact);
} }
private bool GetCurContactGeom(int index, ref d.ContactGeom newcontactgeom) private bool GetCurContactGeom(int index, ref d.ContactGeom newcontactgeom)
{ {
if (ContactgeomsArray == IntPtr.Zero || index >= contactsPerCollision) if (ContactgeomsArray == IntPtr.Zero || index >= contactsPerCollision)
@ -1153,6 +1151,31 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
} }
break; break;
case ActorTypes.Ground:
case ActorTypes.Unknown:
default:
switch ((ActorTypes)p2.PhysicsActorType)
{
case ActorTypes.Agent:
if (p2 is OdeCharacter)
{
cc2 = (OdeCharacter)p2;
obj2LocalID = cc2.m_localID;
if (p2events)
cc2.AddCollisionEvent(0, contact);
}
break;
case ActorTypes.Prim:
if (p2 is OdePrim)
{
cp2 = (OdePrim)p2;
obj2LocalID = cp2.m_localID;
if (p2events)
cp2.AddCollisionEvent(0, contact);
}
break;
}
break;
} }
} }
@ -1875,7 +1898,11 @@ namespace OpenSim.Region.Physics.OdePlugin
case ActorTypes.Prim: case ActorTypes.Prim:
OdePrim pobj = (OdePrim)obj; OdePrim pobj = (OdePrim)obj;
pobj.SendCollisions(); if (pobj.Body == IntPtr.Zero || (d.BodyIsEnabled(pobj.Body) && !pobj.m_outbounds))
{
pobj.AddCollisionFrameTime((int)(ODE_STEPSIZE * 1000.0f));
pobj.SendCollisions();
}
break; break;
} }
} }

View File

@ -10366,7 +10366,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
m_host.TaskInventory.LockItemsForRead(false); m_host.TaskInventory.LockItemsForRead(false);
ScenePresence presence = World.GetScenePresence(m_host.OwnerID); // ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
ScenePresence presence = World.GetScenePresence(agentID);
if (presence != null) if (presence != null)
{ {
LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z);
@ -10389,7 +10390,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
m_host.TaskInventory.LockItemsForRead(false); m_host.TaskInventory.LockItemsForRead(false);
ScenePresence presence = World.GetScenePresence(m_host.OwnerID); // ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
ScenePresence presence = World.GetScenePresence(agentID);
if (presence != null) if (presence != null)
{ {
return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W);