From d01535690254a347939bc8946d8c10e78a8ea577 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Mon, 3 Mar 2008 16:52:25 +0000 Subject: [PATCH] * Applied patch 708 from devalnor. Thanks devalnor! * ODE: Added support for larger box stacks. (they're slow, but they work) * ODEPlugin no longer tries to 'catch up' with the simulator frame rate if it gets behind. Catching up was causing a lot of problems with larger box stacks and other things that stall the simulator (like saving prim in the datastore) --- CONTRIBUTORS.txt | 1 + .../Environment/Scenes/Scene.Inventory.cs | 45 +++++- .../Environment/Scenes/SceneObjectPart.cs | 2 +- OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 25 +-- OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 151 ++++++++++-------- 5 files changed, 134 insertions(+), 90 deletions(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 58bef0c377..4435385038 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -46,6 +46,7 @@ Patches * jimbo2120 (International Business Machines Corp.) * brianw/Sir_Ahzz * ChrisDown +* devalnor-#708 LSL Devs diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index e41f1806a3..8481737dbb 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -606,16 +606,47 @@ namespace OpenSim.Region.Environment.Scenes public void UpdateTaskInventory(IClientAPI remoteClient, LLUUID itemID, LLUUID folderID, uint primLocalID) { + SceneObjectGroup group = GetGroupByPrim(primLocalID); + if (group != null) { - // TODO Retrieve itemID from client's inventory to pass on - //group.AddInventoryItem(remoteClient, primLocalID, null); - m_log.InfoFormat( - "[PRIM INVENTORY]: " + - "Non script prim inventory not yet implemented!" - + "\nUpdateTaskInventory called with item {0}, folder {1}, primLocalID {2}, user {3}", - itemID, folderID, primLocalID, remoteClient.Name); + LLUUID copyID = LLUUID.Random(); + if (itemID != LLUUID.Zero) + { + CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); + + if (userInfo != null && userInfo.RootFolder != null) + { + InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); + + // Try library + // XXX clumsy, possibly should be one call + if (null == item) + { + item = CommsManager.UserProfileCacheService.libraryRoot.HasItem(itemID); + } + + if (item != null) + { + + group.AddInventoryItem(remoteClient, primLocalID, item, copyID); + m_log.InfoFormat("[PRIMINVENTORY]: Update with item {0} requested of prim {1} for {2}", item.inventoryName, primLocalID, remoteClient.Name); + group.GetProperties(remoteClient); + + } + else + { + m_log.ErrorFormat( + "[PRIM INVENTORY]: Could not find inventory item {0} to update for {1}!", + itemID, remoteClient.Name); + } + + } + + } + + } else { diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 04fa03e086..a6a5063d0a 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -1844,7 +1844,7 @@ namespace OpenSim.Region.Environment.Scenes m_log.Info("[PHYSICS]: Physical Object went out of bounds."); RemFlag(LLObject.ObjectFlags.Physics); DoPhysicsPropertyUpdate(false, true); - m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); + //m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); } public virtual void OnGrab(LLVector3 offsetPos, IClientAPI remoteClient) diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index eb90cf451b..726f2e9492 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -617,20 +617,23 @@ namespace OpenSim.Region.Physics.OdePlugin public void disableBody() { //this kills the body so things like 'mesh' can re-create it. - if (Body != (IntPtr) 0) + lock (this) { - m_collisionCategories &= ~CollisionCategories.Body; - m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); - - if (prim_geom != (IntPtr)0) + if (Body != (IntPtr)0) { - d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); - d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); - } + m_collisionCategories &= ~CollisionCategories.Body; + m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); - _parent_scene.remActivePrim(this); - d.BodyDestroy(Body); - Body = (IntPtr) 0; + if (prim_geom != (IntPtr)0) + { + d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); + d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); + } + + _parent_scene.remActivePrim(this); + d.BodyDestroy(Body); + Body = (IntPtr)0; + } } m_disabled = true; m_collisionscore = 0; diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 76bd3f2f76..563bf44d5e 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs @@ -661,7 +661,9 @@ namespace OpenSim.Region.Physics.OdePlugin { try { - d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); + + d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); + } catch (AccessViolationException) { @@ -685,7 +687,10 @@ namespace OpenSim.Region.Physics.OdePlugin } try { - d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback); + lock (chr) + { + d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback); + } } catch (AccessViolationException) { @@ -759,90 +764,93 @@ namespace OpenSim.Region.Physics.OdePlugin /// public void RemovePrimThreadLocked(OdePrim prim) { - lock (ode) + lock (prim) { - if (prim.prim_geom != (IntPtr)0) + lock (ode) { - while (ode.lockquery()) + if (prim.prim_geom != (IntPtr)0) { - } - ode.dlock(world); - //System.Threading.Thread.Sleep(20); - prim.ResetTaints(); - - - if (prim.IsPhysical) - { - prim.disableBody(); - } - // we don't want to remove the main space - - // If the geometry is in the targetspace, remove it from the target space - //m_log.Warn(prim.m_targetSpace); - - //if (prim.m_targetSpace != (IntPtr)0) - //{ - if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom)) + while (ode.lockquery()) { + } + ode.dlock(world); + //System.Threading.Thread.Sleep(20); + prim.ResetTaints(); - if (d.GeomIsSpace(prim.m_targetSpace)) + + if (prim.IsPhysical) + { + prim.disableBody(); + } + // we don't want to remove the main space + + // If the geometry is in the targetspace, remove it from the target space + //m_log.Warn(prim.m_targetSpace); + + //if (prim.m_targetSpace != (IntPtr)0) + //{ + //if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom)) + //{ + + //if (d.GeomIsSpace(prim.m_targetSpace)) + //{ + //waitForSpaceUnlock(prim.m_targetSpace); + //d.SpaceRemove(prim.m_targetSpace, prim.prim_geom); + prim.m_targetSpace = (IntPtr)0; + //} + //else + //{ + // m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + + //((OdePrim)prim).m_targetSpace.ToString()); + //} + + //} + //} + //m_log.Warn(prim.prim_geom); + try + { + if (prim.prim_geom != (IntPtr)0) { - waitForSpaceUnlock(prim.m_targetSpace); - d.SpaceRemove(prim.m_targetSpace, prim.prim_geom); - prim.m_targetSpace = (IntPtr) 0; + d.GeomDestroy(prim.prim_geom); + prim.prim_geom = (IntPtr)0; } else { - m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + - ((OdePrim)prim).m_targetSpace.ToString()); + m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene"); } } - //} - //m_log.Warn(prim.prim_geom); - try - { - if (prim.prim_geom != (IntPtr)0) + catch (System.AccessViolationException) { - d.GeomDestroy(prim.prim_geom); - prim.prim_geom = (IntPtr)0; - } - else - { - m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene"); + m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed."); } + _prims.Remove(prim); + //If there are no more geometries in the sub-space, we don't need it in the main space anymore + //if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0) + //{ + //if (!(prim.m_targetSpace.Equals(null))) + //{ + //if (d.GeomIsSpace(prim.m_targetSpace)) + //{ + //waitForSpaceUnlock(prim.m_targetSpace); + //d.SpaceRemove(space, prim.m_targetSpace); + // free up memory used by the space. + //d.SpaceDestroy(prim.m_targetSpace); + //int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position); + //resetSpaceArrayItemToZero(xyspace[0], xyspace[1]); + //} + //else + //{ + //m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + + //((OdePrim) prim).m_targetSpace.ToString()); + //} + //} + //} } - catch (System.AccessViolationException) - { - m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed."); - } - _prims.Remove(prim); - //If there are no more geometries in the sub-space, we don't need it in the main space anymore - //if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0) - //{ - //if (!(prim.m_targetSpace.Equals(null))) - //{ - //if (d.GeomIsSpace(prim.m_targetSpace)) - //{ - //waitForSpaceUnlock(prim.m_targetSpace); - //d.SpaceRemove(space, prim.m_targetSpace); - // free up memory used by the space. - //d.SpaceDestroy(prim.m_targetSpace); - //int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position); - //resetSpaceArrayItemToZero(xyspace[0], xyspace[1]); - //} - //else - //{ - //m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" + - //((OdePrim) prim).m_targetSpace.ToString()); - //} - //} - //} + ode.dunlock(world); } - - ode.dunlock(world); } } @@ -934,7 +942,7 @@ namespace OpenSim.Region.Physics.OdePlugin d.SpaceRemove(space, currentspace); // free up memory used by the space. - d.SpaceDestroy(currentspace); + //d.SpaceDestroy(currentspace); resetSpaceArrayItemToZero(currentspace); } else @@ -1236,7 +1244,7 @@ namespace OpenSim.Region.Physics.OdePlugin public override float Simulate(float timeStep) { float fps = 0; - + //m_log.Info(timeStep.ToString()); step_time += timeStep; @@ -1275,8 +1283,9 @@ namespace OpenSim.Region.Physics.OdePlugin // Figure out the Frames Per Second we're going at. //(step_time == 0.004f, there's 250 of those per second. Times the step time/step size + step_time = 0.09375f; fps = (step_time/ODE_STEPSIZE) * 1000; - + while (step_time > 0.0f) { lock (ode)