From 9102f6e5da1731aab9d1f9a449dce781ffd0ba36 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 5 Aug 2016 22:50:15 +0100 Subject: fill data for llDetected funtions of collisions closer to the event. (xengine wasn't update with this on merge bc was not used there). fix some parameters --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 17 +++-- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 52 +++++++++------ OpenSim/Region/ScriptEngine/Shared/Helpers.cs | 76 +++++++++++++++++----- .../Region/ScriptEngine/XEngine/EventManager.cs | 19 ++---- 4 files changed, 106 insertions(+), 58 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0b8076a..0847b0b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2712,8 +2712,7 @@ namespace OpenSim.Region.Framework.Scenes detobj.velVector = obj.Velocity; detobj.colliderType = 0; detobj.groupUUID = obj.GroupID; - detobj.linkNumber = LinkNum; // pass my link number - + detobj.linkNumber = LinkNum; return detobj; } @@ -2726,9 +2725,13 @@ namespace OpenSim.Region.Framework.Scenes detobj.posVector = av.AbsolutePosition; detobj.rotQuat = av.Rotation; detobj.velVector = av.Velocity; - detobj.colliderType = 0; + detobj.colliderType = av.isNPC ? 0x20 : 0x1; // OpenSim\Region\ScriptEngine\Shared\Helpers.cs + if(av.IsSatOnObject) + detobj.colliderType |= 0x4; //passive + else if(detobj.velVector != Vector3.Zero) + detobj.colliderType |= 0x2; //active detobj.groupUUID = av.ControllingClient.ActiveGroupId; - detobj.linkNumber = LinkNum; // pass my link number + detobj.linkNumber = LinkNum; return detobj; } @@ -2842,7 +2845,8 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup.Scene == null || ParentGroup.IsDeleted) return; - // single threaded here + // this a thread from physics ( heartbeat ) + CollisionEventUpdate a = (CollisionEventUpdate)e; Dictionary collissionswith = a.m_objCollisionList; List thisHitColliders = new List(); @@ -2860,7 +2864,6 @@ namespace OpenSim.Region.Framework.Scenes } m_lastColliders.Clear(); } - else { List soundinfolist = new List(); @@ -5256,7 +5259,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter { // subscribe to physics updates. pa.OnCollisionUpdate += PhysicsCollision; - pa.SubscribeEvents(50); // 20 reports per second + pa.SubscribeEvents(100); // 10 reports per second } else { diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3d8aad7..732d5ef 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -6037,7 +6037,11 @@ namespace OpenSim.Region.Framework.Scenes detobj.posVector = av.AbsolutePosition; detobj.rotQuat = av.Rotation; detobj.velVector = av.Velocity; - detobj.colliderType = 0; + detobj.colliderType = av.isNPC ? 0x20 : 0x1; // OpenSim\Region\ScriptEngine\Shared\Helpers.cs + if(av.IsSatOnObject) + detobj.colliderType |= 0x4; //passive + else if(detobj.velVector != Vector3.Zero) + detobj.colliderType |= 0x2; //active detobj.groupUUID = av.ControllingClient.ActiveGroupId; detobj.linkNumber = 0; @@ -6129,9 +6133,6 @@ namespace OpenSim.Region.Framework.Scenes List thisHitColliders = new List(); List endedColliders = new List(); List startedColliders = new List(); - List soundinfolist = new List(); - CollisionForSoundInfo soundinfo; - ContactPoint curcontact; if (coldata.Count == 0) { @@ -6144,30 +6145,41 @@ namespace OpenSim.Region.Framework.Scenes } m_lastColliders.Clear(); } - else { - bool candoparcelSound = ParcelAllowThisAvatarSounds; - - foreach (uint id in coldata.Keys) + List soundinfolist = new List(); + if(ParcelAllowThisAvatarSounds) { - thisHitColliders.Add(id); - if (!m_lastColliders.Contains(id)) + CollisionForSoundInfo soundinfo; + ContactPoint curcontact; + + foreach (uint id in coldata.Keys) { - startedColliders.Add(id); - curcontact = coldata[id]; - if (candoparcelSound && Math.Abs(curcontact.RelativeSpeed) > 0.2) + thisHitColliders.Add(id); + if (!m_lastColliders.Contains(id)) { - soundinfo = new CollisionForSoundInfo(); - soundinfo.colliderID = id; - soundinfo.position = curcontact.Position; - soundinfo.relativeVel = curcontact.RelativeSpeed; - soundinfolist.Add(soundinfo); + startedColliders.Add(id); + curcontact = coldata[id]; + if (Math.Abs(curcontact.RelativeSpeed) > 0.2) + { + soundinfo = new CollisionForSoundInfo(); + soundinfo.colliderID = id; + soundinfo.position = curcontact.Position; + soundinfo.relativeVel = curcontact.RelativeSpeed; + soundinfolist.Add(soundinfo); + } } } - //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString()); } - + else + { + foreach (uint id in coldata.Keys) + { + thisHitColliders.Add(id); + if (!m_lastColliders.Contains(id)) + startedColliders.Add(id); + } + } // calculate things that ended colliding foreach (uint localID in m_lastColliders) { diff --git a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs index d30a1c4..9f34c98 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs @@ -213,24 +213,6 @@ namespace OpenSim.Region.ScriptEngine.Shared if (presence.PresenceType == PresenceType.Npc) Type = 0x20; - // Cope Impl. We don't use OS_NPC. - //if (presence.PresenceType != PresenceType.Npc) - //{ - // Type = AGENT; - //} - //else - //{ - // Type = OS_NPC; - - // INPCModule npcModule = scene.RequestModuleInterface(); - // INPC npcData = npcModule.GetNPC(presence.UUID, presence.Scene); - - // if (npcData.SenseAsAgent) - // { - // Type |= AGENT; - // } - //} - if (presence.Velocity != Vector3.Zero) Type |= ACTIVE; @@ -267,6 +249,64 @@ namespace OpenSim.Region.ScriptEngine.Shared Velocity = new LSL_Types.Vector3(part.Velocity); } + + public void Populate(Scene scene, DetectedObject obj) + { + if(obj.keyUUID == UUID.Zero) // land + { + Position = new LSL_Types.Vector3(obj.posVector); + Rotation.s = 1.0; + return; + } + + if((obj.colliderType & 0x21) != 0) // avatar or npc + { + ScenePresence presence = scene.GetScenePresence(obj.keyUUID); + if (presence == null) + return; + + Name = obj.nameStr; + Owner = obj.keyUUID; + Group = obj.groupUUID; + Position = new LSL_Types.Vector3(obj.posVector); + Rotation = new LSL_Types.Quaternion(obj.rotQuat); + Velocity = new LSL_Types.Vector3(obj.velVector); + LinkNum = obj.linkNumber; + Type = obj.colliderType; + return; + } + + SceneObjectPart part = scene.GetSceneObjectPart(obj.keyUUID); + if(part == null) + return; + + Name = obj.nameStr; + Owner = obj.keyUUID; + Group = obj.groupUUID; + Position = new LSL_Types.Vector3(obj.posVector); + Rotation = new LSL_Types.Quaternion(obj.rotQuat); + Velocity = new LSL_Types.Vector3(obj.velVector); + LinkNum = obj.linkNumber; + if(obj.velVector == Vector3.Zero) + Type = 4; + else + Type = 2; + + part = part.ParentGroup.RootPart; + foreach (SceneObjectPart p in part.ParentGroup.Parts) + { + if (p.Inventory.ContainsScripts()) + { + // at sl a physical prim is active also if has active scripts + // assuming all scripts are in run state to save time + if((part.Flags & PrimFlags.Physics) != 0 ) + Type = 10; // script + active + else + Type |= SCRIPTED; // Scripted + break; + } + } + } } /// diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs index ad775ff..f1b1e66 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs @@ -244,7 +244,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine { DetectParams d = new DetectParams(); d.Key =detobj.keyUUID; - d.Populate(myScriptEngine.World); + d.Populate(myScriptEngine.World, detobj); d.LinkNum = detobj.linkNumber; // do it here since currently linknum is collided part det.Add(d); } @@ -264,9 +264,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine foreach (DetectedObject detobj in col.Colliders) { DetectParams d = new DetectParams(); - d.Key =detobj.keyUUID; - d.Populate(myScriptEngine.World); - d.LinkNum = detobj.linkNumber; // do it here since currently linknum is collided part + d.Populate(myScriptEngine.World, detobj); det.Add(d); } @@ -284,9 +282,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine foreach (DetectedObject detobj in col.Colliders) { DetectParams d = new DetectParams(); - d.Key =detobj.keyUUID; - d.Populate(myScriptEngine.World); - d.LinkNum = detobj.linkNumber; // do it here since currently linknum is collided part + d.Populate(myScriptEngine.World, detobj); det.Add(d); } @@ -304,8 +300,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine foreach (DetectedObject detobj in col.Colliders) { DetectParams d = new DetectParams(); - d.Position = detobj.posVector; - d.Populate(myScriptEngine.World); + d.Populate(myScriptEngine.World, detobj); det.Add(d); myScriptEngine.PostObjectEvent(localID, new EventParams( "land_collision_start", @@ -322,8 +317,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine foreach (DetectedObject detobj in col.Colliders) { DetectParams d = new DetectParams(); - d.Position = detobj.posVector; - d.Populate(myScriptEngine.World); + d.Populate(myScriptEngine.World,detobj); det.Add(d); myScriptEngine.PostObjectEvent(localID, new EventParams( "land_collision", @@ -339,8 +333,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine foreach (DetectedObject detobj in col.Colliders) { DetectParams d = new DetectParams(); - d.Position = detobj.posVector; - d.Populate(myScriptEngine.World); + d.Populate(myScriptEngine.World,detobj); det.Add(d); myScriptEngine.PostObjectEvent(localID, new EventParams( "land_collision_end", -- cgit v1.1