From 63cff49bceab2a8edc889d1abaae840512bf60e6 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Sat, 8 Dec 2012 01:29:58 +0000 Subject: Re-enable code disabled in f605a62 to allow a TaskInventoryAccepted message to nominate a non-root destination folder. This is in relation to http://opensimulator.org/mantis/view.php?id=6311 This is after further analysis which shows the viewer expects the server to move the folder for #RLV give but then should be renaming the folder itself. For some reason this is not happening, possibly because we are not sending BulkUpdates or because we are not using transaction IDs properly. This needs to be fixed in the future. However, moving the folder even if the rename isn't correctly triggered in the viewer seems preferable to disabling this code altogether. --- .../Inventory/Transfer/InventoryTransferModule.cs | 138 ++++++++++----------- 1 file changed, 68 insertions(+), 70 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 582aac4..bcb7f42 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs @@ -300,76 +300,74 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer } } - // Disabled for now as it looks like http://opensimulator.org/mantis/view.php?id=6311 was fixed by fixes - // to inventory folder versioning allowing the viewer to move the received folder itself as happens on the - // LL grid. Doing it again server-side then wrongly does a second create and move -// // XXX: This code was placed here to try and accomdate RLV which moves given folders named #RLV/~ -// // to a folder called name in #RLV. However, this approach may not be ultimately correct - from analysis -// // of Firestorm 4.2.2 on sending an InventoryOffered instead of TaskInventoryOffered (as was previously -// // done), the viewer itself would appear to move and rename the folder, rather than the simulator doing it here. -// else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted) -// { -// UUID destinationFolderID = UUID.Zero; -// -// if (im.binaryBucket != null && im.binaryBucket.Length >= 16) -// { -// destinationFolderID = new UUID(im.binaryBucket, 0); -// } -// -// if (destinationFolderID != UUID.Zero) -// { -// InventoryFolderBase destinationFolder = new InventoryFolderBase(destinationFolderID, client.AgentId); -// if (destinationFolder == null) -// { -// m_log.WarnFormat( -// "[INVENTORY TRANSFER]: TaskInventoryAccepted message from {0} in {1} specified folder {2} which does not exist", -// client.Name, scene.Name, destinationFolderID); -// -// return; -// } -// -// IInventoryService invService = scene.InventoryService; -// -// UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip -// -// InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId); -// item = invService.GetItem(item); -// InventoryFolderBase folder = null; -// UUID? previousParentFolderID = null; -// -// if (item != null) // It's an item -// { -// previousParentFolderID = item.Folder; -// item.Folder = destinationFolderID; -// -// invService.DeleteItems(item.Owner, new List() { item.ID }); -// scene.AddInventoryItem(client, item); -// } -// else -// { -// folder = new InventoryFolderBase(inventoryID, client.AgentId); -// folder = invService.GetFolder(folder); -// -// if (folder != null) // It's a folder -// { -// previousParentFolderID = folder.ParentID; -// folder.ParentID = destinationFolderID; -// invService.MoveFolder(folder); -// } -// } -// -// // Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code). -// if (previousParentFolderID != null) -// { -// InventoryFolderBase previousParentFolder -// = new InventoryFolderBase((UUID)previousParentFolderID, client.AgentId); -// previousParentFolder = invService.GetFolder(previousParentFolder); -// scene.SendInventoryUpdate(client, previousParentFolder, true, true); -// -// scene.SendInventoryUpdate(client, destinationFolder, true, true); -// } -// } -// } + // XXX: This code was placed here to try and accomodate RLV which moves given folders named #RLV/~ + // to the requested folder, which in this case is #RLV. However, it is the viewer that appears to be + // response from renaming the #RLV/~example folder to ~example. For some reason this is not yet + // happening, possibly because we are not sending the correct inventory update messages with the correct + // transaction IDs + else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted) + { + UUID destinationFolderID = UUID.Zero; + + if (im.binaryBucket != null && im.binaryBucket.Length >= 16) + { + destinationFolderID = new UUID(im.binaryBucket, 0); + } + + if (destinationFolderID != UUID.Zero) + { + InventoryFolderBase destinationFolder = new InventoryFolderBase(destinationFolderID, client.AgentId); + if (destinationFolder == null) + { + m_log.WarnFormat( + "[INVENTORY TRANSFER]: TaskInventoryAccepted message from {0} in {1} specified folder {2} which does not exist", + client.Name, scene.Name, destinationFolderID); + + return; + } + + IInventoryService invService = scene.InventoryService; + + UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip + + InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId); + item = invService.GetItem(item); + InventoryFolderBase folder = null; + UUID? previousParentFolderID = null; + + if (item != null) // It's an item + { + previousParentFolderID = item.Folder; + item.Folder = destinationFolderID; + + invService.DeleteItems(item.Owner, new List() { item.ID }); + scene.AddInventoryItem(client, item); + } + else + { + folder = new InventoryFolderBase(inventoryID, client.AgentId); + folder = invService.GetFolder(folder); + + if (folder != null) // It's a folder + { + previousParentFolderID = folder.ParentID; + folder.ParentID = destinationFolderID; + invService.MoveFolder(folder); + } + } + + // Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code). + if (previousParentFolderID != null) + { + InventoryFolderBase previousParentFolder + = new InventoryFolderBase((UUID)previousParentFolderID, client.AgentId); + previousParentFolder = invService.GetFolder(previousParentFolder); + scene.SendInventoryUpdate(client, previousParentFolder, true, true); + + scene.SendInventoryUpdate(client, destinationFolder, true, true); + } + } + } else if ( im.dialog == (byte)InstantMessageDialog.InventoryDeclined || im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined) -- cgit v1.1 From addb791f3df481560d36cbeea6824bfe48d0d971 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Thu, 6 Dec 2012 13:00:52 -0800 Subject: BulletSim: update comments and add more to TODO list. --- OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs | 6 +++--- OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index b9c2cf9..492c7b1 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs @@ -59,7 +59,7 @@ public sealed class BSLinksetCompound : BSLinkset // refresh will happen once after all the other taints are applied. public override void Refresh(BSPhysObject requestor) { - // External request for Refresh (from BSPrim) is not necessary + // External request for Refresh (from BSPrim) doesn't need to do anything // InternalRefresh(requestor); } @@ -86,7 +86,7 @@ public sealed class BSLinksetCompound : BSLinkset DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child)); if (!IsRoot(child)) { - // Physical children are removed from the world as the shape ofthe root compound + // The origional prims are removed from the world as the shape of the root compound // shape takes over. BulletSimAPI.AddToCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); BulletSimAPI.ForceActivationState2(child.PhysBody.ptr, ActivationState.DISABLE_SIMULATION); @@ -118,7 +118,7 @@ public sealed class BSLinksetCompound : BSLinkset // Called at taint-time!! public override void UpdateProperties(BSPhysObject updated) { - // Nothing to do for constraints on property updates + // Nothing to do for compound linksets on property updates } // The children move around in relationship to the root. diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt index d51003c..a2161c3 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt @@ -5,6 +5,9 @@ CRASHES 20121128.1600: mesh object not rezzing (no physics mesh). Causes many errors. Doesn't stop after first error with box shape. Eventually crashes when deleting the object. +20121206.1434: rez Sam-pan into OSGrid BulletSim11 region + Immediate simulator crash. Mono does not output any stacktrace and + log just stops after reporting taint-time linking of the linkset. VEHICLES TODO LIST: ================================================= @@ -23,9 +26,12 @@ After getting off a vehicle, the root prim is phantom (can be walked through) Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint) Implement referenceFrame for all the motion routines. Cannot edit/move a vehicle being ridden: it jumps back to the origional position. +Border crossing with linked vehicle causes crash BULLETSIM TODO LIST: ================================================= +Duplicating a physical prim causes old prim to jump away + Dup a phys prim and the original become unselected and thus interacts w/ selected prim. Disable activity of passive linkset children. Since the linkset is a compound object, the old prims are left lying around and need to be phantomized so they don't collide, ... @@ -96,7 +102,7 @@ Breakout code for mesh/hull/compound/native into separate BSShape* classes Generalize Dynamics and PID with standardized motors. Generalize Linkset and vehicles into PropertyManagers Methods for Refresh, RemoveBodyDependencies, RestoreBodyDependencies - Possibly generalized a 'pre step action' registration. + Potentially add events for shape destruction, etc. Complete implemention of preStepActions Replace vehicle step call with prestep event. Is there a need for postStepActions? postStepTaints? -- cgit v1.1 From 216c121935537f707e6334176e590225fdc988d8 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Sat, 8 Dec 2012 08:59:53 -0800 Subject: BulletSim: fix small problem with setting size/scale of native shapes which caused the native shapes to be rebuilt when not necessary. --- OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs index e77b6ba..933f573 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs @@ -415,7 +415,7 @@ public sealed class BSShapeCollection : IDisposable if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE) { // an avatar capsule is close to a native shape (it is not shared) - ret = GetReferenceToNativeShape(prim, BSPhysicsShapeType.SHAPE_CAPSULE, + GetReferenceToNativeShape(prim, BSPhysicsShapeType.SHAPE_CAPSULE, FixedShapeKey.KEY_CAPSULE, shapeCallback); if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,avatarCapsule,shape={1}", prim.LocalID, prim.PhysShape); ret = true; @@ -423,7 +423,7 @@ public sealed class BSShapeCollection : IDisposable } // Compound shapes are handled special as they are rebuilt from scratch. - // This isn't too great a hardship since most of the child shapes will already been created. + // This isn't too great a hardship since most of the child shapes will have already been created. if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_COMPOUND) { ret = GetReferenceToCompoundShape(prim, shapeCallback); @@ -460,6 +460,9 @@ public sealed class BSShapeCollection : IDisposable && pbs.PathScaleX == 100 && pbs.PathScaleY == 100 && pbs.PathShearX == 0 && pbs.PathShearY == 0) ) ) { + if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,maybeNative,force={1},primScale={2},primSize={3},primShape={4}", + prim.LocalID, forceRebuild, prim.Scale, prim.Size, prim.PhysShape.type); + // It doesn't look like Bullet scales spheres so make sure the scales are all equal if ((pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1) && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z) @@ -538,6 +541,8 @@ public sealed class BSShapeCollection : IDisposable if (DDetail) DetailLog("{0},BSShapeCollection.AddNativeShapeToPrim,create,newshape={1},scale={2}", prim.LocalID, newShape, prim.Scale); + // native shapes are scaled by Bullet + prim.Scale = prim.Size; prim.PhysShape = newShape; return true; } @@ -550,8 +555,8 @@ public sealed class BSShapeCollection : IDisposable ShapeData nativeShapeData = new ShapeData(); nativeShapeData.Type = shapeType; nativeShapeData.ID = prim.LocalID; - nativeShapeData.Scale = prim.Scale; - nativeShapeData.Size = prim.Scale; // unneeded, I think. + nativeShapeData.Scale = prim.Size; + nativeShapeData.Size = prim.Size; // unneeded, I think. nativeShapeData.MeshKey = (ulong)shapeKey; nativeShapeData.HullKey = (ulong)shapeKey; @@ -566,8 +571,6 @@ public sealed class BSShapeCollection : IDisposable else { // Native shapes are scaled in Bullet so set the scaling to the size - prim.Scale = prim.Size; - nativeShapeData.Scale = prim.Scale; newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, nativeShapeData), shapeType); } if (newShape.ptr == IntPtr.Zero) -- cgit v1.1 From 04e64d73dfddf9ef3e3716f6c43752c6f63438cb Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Sat, 8 Dec 2012 09:12:45 -0800 Subject: BulletSim: set material properties for static objects. Move Linkset.MakeStatic() after call to ForceActivationState2() since linkset might change activation state. Make BSPrim.CreateGeomAndObject public as linkset rebuilding might need access to it. Only rebuild prim if selection state is actually changes -- OpenSimulator calls PhysObject.Selected() multiple times whenever a prim is selected or deselected. --- .../Physics/BulletSPlugin/BSLinksetCompound.cs | 5 ++++ OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 30 ++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index 492c7b1..1f7c398 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs @@ -257,6 +257,11 @@ public sealed class BSLinksetCompound : BSLinkset BulletSimAPI.AddChildShapeToCompoundShape2(LinksetRoot.PhysShape.ptr, cPrim.PhysShape.ptr, displacementPos, displacementRot); } } + + // TODO: need to phantomize the child prims left behind. + // Maybe just destroy the children bodies and shapes and have them rebuild on unlink. + // Selection/deselection might cause way too many build/destructions esp. for LARGE linksets. + return false; // 'false' says to move onto the next child in the list }); diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 62aaf80..4d203ff 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs @@ -190,12 +190,15 @@ public sealed class BSPrim : BSPhysObject } public override bool Selected { set { - _isSelected = value; - PhysicsScene.TaintedObject("BSPrim.setSelected", delegate() + if (value != _isSelected) { - DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected); - SetObjectDynamic(false); - }); + _isSelected = value; + PhysicsScene.TaintedObject("BSPrim.setSelected", delegate() + { + DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected); + SetObjectDynamic(false); + }); + } } } public override void CrossingFailure() { return; } @@ -678,8 +681,11 @@ public sealed class BSPrim : BSPhysObject CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_STATIC_OBJECT); // Stop all movement ZeroMotion(true); - // Center of mass is at the center of the object - // DEBUG DEBUG BulletSimAPI.SetCenterOfMassByPosRot2(Linkset.LinksetRoot.PhysBody.ptr, _position, _orientation); + + // Set various physical properties so other object interact properly + BulletSimAPI.SetFriction2(PhysBody.ptr, PhysicsScene.Params.defaultFriction); + BulletSimAPI.SetRestitution2(PhysBody.ptr, PhysicsScene.Params.defaultRestitution); + // Mass is zero which disables a bunch of physics stuff in Bullet UpdatePhysicalMassProperties(0f); // Set collision detection parameters @@ -688,13 +694,15 @@ public sealed class BSPrim : BSPhysObject BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, PhysicsScene.Params.ccdMotionThreshold); BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius); } - // There can be special things needed for implementing linksets - Linkset.MakeStatic(this); + // The activation state is 'disabled' so Bullet will not try to act on it. // BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.DISABLE_SIMULATION); // Start it out sleeping and physical actions could wake it up. BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.ISLAND_SLEEPING); + // There can be special things needed for implementing linksets + Linkset.MakeStatic(this); + PhysBody.collisionGroup = CollisionFilterGroups.StaticObjectGroup; PhysBody.collisionMask = CollisionFilterGroups.StaticObjectMask; } @@ -1326,7 +1334,7 @@ public sealed class BSPrim : BSPhysObject // Rebuild the geometry and object. // This is called when the shape changes so we need to recreate the mesh/hull. // Called at taint-time!!! - private void CreateGeomAndObject(bool forceRebuild) + public void CreateGeomAndObject(bool forceRebuild) { // If this prim is part of a linkset, we must remove and restore the physical // links if the body is rebuilt. @@ -1341,7 +1349,7 @@ public sealed class BSPrim : BSPhysObject { // Called if the current prim body is about to be destroyed. // Remove all the physical dependencies on the old body. - // (Maybe someday make the changing of BSShape an event handled by BSLinkset.) + // (Maybe someday make the changing of BSShape an event to be subscribed to by BSLinkset, ...) needToRestoreLinkset = Linkset.RemoveBodyDependencies(this); needToRestoreVehicle = _vehicle.RemoveBodyDependencies(this); }); -- cgit v1.1