diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 582aac4763..bcb7f42f42 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) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index b9c2cf967f..1f7c398396 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. @@ -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 62aaf800c6..4d203ffc48 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); }); diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs index e77b6bad6d..933f573e78 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) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt index d51003c40b..a2161c3460 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? diff --git a/bin/openjpeg-dotnet-x86_64.dll b/bin/openjpeg-dotnet-x86_64.dll new file mode 100755 index 0000000000..9e8cd21507 Binary files /dev/null and b/bin/openjpeg-dotnet-x86_64.dll differ diff --git a/bin/openjpeg-dotnet.dll b/bin/openjpeg-dotnet.dll new file mode 100755 index 0000000000..6377b8d970 Binary files /dev/null and b/bin/openjpeg-dotnet.dll differ