Merge branch 'master' of /home/opensim/var/repo/opensim

0.7.5-pf-bulletsim
BlueWall 2012-12-08 17:34:08 -05:00
commit a37040d07a
7 changed files with 111 additions and 91 deletions

View File

@ -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 // XXX: This code was placed here to try and accomodate RLV which moves given folders named #RLV/~<name>
// to inventory folder versioning allowing the viewer to move the received folder itself as happens on the // to the requested folder, which in this case is #RLV. However, it is the viewer that appears to be
// LL grid. Doing it again server-side then wrongly does a second create and move // response from renaming the #RLV/~example folder to ~example. For some reason this is not yet
// // XXX: This code was placed here to try and accomdate RLV which moves given folders named #RLV/~<name> // happening, possibly because we are not sending the correct inventory update messages with the correct
// // to a folder called name in #RLV. However, this approach may not be ultimately correct - from analysis // transaction IDs
// // of Firestorm 4.2.2 on sending an InventoryOffered instead of TaskInventoryOffered (as was previously else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted)
// // 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;
// {
// UUID destinationFolderID = UUID.Zero; if (im.binaryBucket != null && im.binaryBucket.Length >= 16)
// {
// if (im.binaryBucket != null && im.binaryBucket.Length >= 16) destinationFolderID = new UUID(im.binaryBucket, 0);
// { }
// destinationFolderID = new UUID(im.binaryBucket, 0);
// } if (destinationFolderID != UUID.Zero)
// {
// if (destinationFolderID != UUID.Zero) InventoryFolderBase destinationFolder = new InventoryFolderBase(destinationFolderID, client.AgentId);
// { if (destinationFolder == null)
// 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",
// m_log.WarnFormat( client.Name, scene.Name, destinationFolderID);
// "[INVENTORY TRANSFER]: TaskInventoryAccepted message from {0} in {1} specified folder {2} which does not exist",
// client.Name, scene.Name, destinationFolderID); return;
// }
// return;
// } IInventoryService invService = scene.InventoryService;
//
// IInventoryService invService = scene.InventoryService; UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
//
// 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);
// InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId); InventoryFolderBase folder = null;
// item = invService.GetItem(item); UUID? previousParentFolderID = null;
// InventoryFolderBase folder = null;
// UUID? previousParentFolderID = null; if (item != null) // It's an item
// {
// if (item != null) // It's an item previousParentFolderID = item.Folder;
// { item.Folder = destinationFolderID;
// previousParentFolderID = item.Folder;
// item.Folder = destinationFolderID; invService.DeleteItems(item.Owner, new List<UUID>() { item.ID });
// scene.AddInventoryItem(client, item);
// invService.DeleteItems(item.Owner, new List<UUID>() { item.ID }); }
// scene.AddInventoryItem(client, item); else
// } {
// else folder = new InventoryFolderBase(inventoryID, client.AgentId);
// { folder = invService.GetFolder(folder);
// folder = new InventoryFolderBase(inventoryID, client.AgentId);
// folder = invService.GetFolder(folder); if (folder != null) // It's a folder
// {
// if (folder != null) // It's a folder previousParentFolderID = folder.ParentID;
// { folder.ParentID = destinationFolderID;
// previousParentFolderID = folder.ParentID; invService.MoveFolder(folder);
// 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)
// // 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);
// InventoryFolderBase previousParentFolder previousParentFolder = invService.GetFolder(previousParentFolder);
// = new InventoryFolderBase((UUID)previousParentFolderID, client.AgentId); scene.SendInventoryUpdate(client, previousParentFolder, true, true);
// previousParentFolder = invService.GetFolder(previousParentFolder);
// scene.SendInventoryUpdate(client, previousParentFolder, true, true); scene.SendInventoryUpdate(client, destinationFolder, true, true);
// }
// scene.SendInventoryUpdate(client, destinationFolder, true, true); }
// } }
// }
// }
else if ( else if (
im.dialog == (byte)InstantMessageDialog.InventoryDeclined im.dialog == (byte)InstantMessageDialog.InventoryDeclined
|| im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined) || im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined)

View File

@ -59,7 +59,7 @@ public sealed class BSLinksetCompound : BSLinkset
// refresh will happen once after all the other taints are applied. // refresh will happen once after all the other taints are applied.
public override void Refresh(BSPhysObject requestor) 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); // InternalRefresh(requestor);
} }
@ -86,7 +86,7 @@ public sealed class BSLinksetCompound : BSLinkset
DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child)); DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child));
if (!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. // shape takes over.
BulletSimAPI.AddToCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); BulletSimAPI.AddToCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE);
BulletSimAPI.ForceActivationState2(child.PhysBody.ptr, ActivationState.DISABLE_SIMULATION); BulletSimAPI.ForceActivationState2(child.PhysBody.ptr, ActivationState.DISABLE_SIMULATION);
@ -118,7 +118,7 @@ public sealed class BSLinksetCompound : BSLinkset
// Called at taint-time!! // Called at taint-time!!
public override void UpdateProperties(BSPhysObject updated) 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. // 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); 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 return false; // 'false' says to move onto the next child in the list
}); });

View File

@ -190,12 +190,15 @@ public sealed class BSPrim : BSPhysObject
} }
public override bool Selected { public override bool Selected {
set { set {
_isSelected = value; if (value != _isSelected)
PhysicsScene.TaintedObject("BSPrim.setSelected", delegate()
{ {
DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected); _isSelected = value;
SetObjectDynamic(false); PhysicsScene.TaintedObject("BSPrim.setSelected", delegate()
}); {
DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected);
SetObjectDynamic(false);
});
}
} }
} }
public override void CrossingFailure() { return; } public override void CrossingFailure() { return; }
@ -678,8 +681,11 @@ public sealed class BSPrim : BSPhysObject
CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_STATIC_OBJECT); CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_STATIC_OBJECT);
// Stop all movement // Stop all movement
ZeroMotion(true); 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 // Mass is zero which disables a bunch of physics stuff in Bullet
UpdatePhysicalMassProperties(0f); UpdatePhysicalMassProperties(0f);
// Set collision detection parameters // Set collision detection parameters
@ -688,13 +694,15 @@ public sealed class BSPrim : BSPhysObject
BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, PhysicsScene.Params.ccdMotionThreshold); BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, PhysicsScene.Params.ccdMotionThreshold);
BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius); 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. // The activation state is 'disabled' so Bullet will not try to act on it.
// BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.DISABLE_SIMULATION); // BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.DISABLE_SIMULATION);
// Start it out sleeping and physical actions could wake it up. // Start it out sleeping and physical actions could wake it up.
BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.ISLAND_SLEEPING); BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.ISLAND_SLEEPING);
// There can be special things needed for implementing linksets
Linkset.MakeStatic(this);
PhysBody.collisionGroup = CollisionFilterGroups.StaticObjectGroup; PhysBody.collisionGroup = CollisionFilterGroups.StaticObjectGroup;
PhysBody.collisionMask = CollisionFilterGroups.StaticObjectMask; PhysBody.collisionMask = CollisionFilterGroups.StaticObjectMask;
} }
@ -1326,7 +1334,7 @@ public sealed class BSPrim : BSPhysObject
// Rebuild the geometry and object. // Rebuild the geometry and object.
// This is called when the shape changes so we need to recreate the mesh/hull. // This is called when the shape changes so we need to recreate the mesh/hull.
// Called at taint-time!!! // 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 // If this prim is part of a linkset, we must remove and restore the physical
// links if the body is rebuilt. // 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. // Called if the current prim body is about to be destroyed.
// Remove all the physical dependencies on the old body. // 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); needToRestoreLinkset = Linkset.RemoveBodyDependencies(this);
needToRestoreVehicle = _vehicle.RemoveBodyDependencies(this); needToRestoreVehicle = _vehicle.RemoveBodyDependencies(this);
}); });

View File

@ -415,7 +415,7 @@ public sealed class BSShapeCollection : IDisposable
if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE) if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE)
{ {
// an avatar capsule is close to a native shape (it is not shared) // 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); FixedShapeKey.KEY_CAPSULE, shapeCallback);
if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,avatarCapsule,shape={1}", prim.LocalID, prim.PhysShape); if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,avatarCapsule,shape={1}", prim.LocalID, prim.PhysShape);
ret = true; ret = true;
@ -423,7 +423,7 @@ public sealed class BSShapeCollection : IDisposable
} }
// Compound shapes are handled special as they are rebuilt from scratch. // 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) if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_COMPOUND)
{ {
ret = GetReferenceToCompoundShape(prim, shapeCallback); ret = GetReferenceToCompoundShape(prim, shapeCallback);
@ -460,6 +460,9 @@ public sealed class BSShapeCollection : IDisposable
&& pbs.PathScaleX == 100 && pbs.PathScaleY == 100 && pbs.PathScaleX == 100 && pbs.PathScaleY == 100
&& pbs.PathShearX == 0 && pbs.PathShearY == 0) ) ) && 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 // 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) if ((pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1)
&& pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z) && 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}", if (DDetail) DetailLog("{0},BSShapeCollection.AddNativeShapeToPrim,create,newshape={1},scale={2}",
prim.LocalID, newShape, prim.Scale); prim.LocalID, newShape, prim.Scale);
// native shapes are scaled by Bullet
prim.Scale = prim.Size;
prim.PhysShape = newShape; prim.PhysShape = newShape;
return true; return true;
} }
@ -550,8 +555,8 @@ public sealed class BSShapeCollection : IDisposable
ShapeData nativeShapeData = new ShapeData(); ShapeData nativeShapeData = new ShapeData();
nativeShapeData.Type = shapeType; nativeShapeData.Type = shapeType;
nativeShapeData.ID = prim.LocalID; nativeShapeData.ID = prim.LocalID;
nativeShapeData.Scale = prim.Scale; nativeShapeData.Scale = prim.Size;
nativeShapeData.Size = prim.Scale; // unneeded, I think. nativeShapeData.Size = prim.Size; // unneeded, I think.
nativeShapeData.MeshKey = (ulong)shapeKey; nativeShapeData.MeshKey = (ulong)shapeKey;
nativeShapeData.HullKey = (ulong)shapeKey; nativeShapeData.HullKey = (ulong)shapeKey;
@ -566,8 +571,6 @@ public sealed class BSShapeCollection : IDisposable
else else
{ {
// Native shapes are scaled in Bullet so set the scaling to the size // 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); newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, nativeShapeData), shapeType);
} }
if (newShape.ptr == IntPtr.Zero) if (newShape.ptr == IntPtr.Zero)

View File

@ -5,6 +5,9 @@ CRASHES
20121128.1600: mesh object not rezzing (no physics mesh). 20121128.1600: mesh object not rezzing (no physics mesh).
Causes many errors. Doesn't stop after first error with box shape. Causes many errors. Doesn't stop after first error with box shape.
Eventually crashes when deleting the object. 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: 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) Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint)
Implement referenceFrame for all the motion routines. Implement referenceFrame for all the motion routines.
Cannot edit/move a vehicle being ridden: it jumps back to the origional position. Cannot edit/move a vehicle being ridden: it jumps back to the origional position.
Border crossing with linked vehicle causes crash
BULLETSIM TODO LIST: 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. Disable activity of passive linkset children.
Since the linkset is a compound object, the old prims are left lying Since the linkset is a compound object, the old prims are left lying
around and need to be phantomized so they don't collide, ... 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 Dynamics and PID with standardized motors.
Generalize Linkset and vehicles into PropertyManagers Generalize Linkset and vehicles into PropertyManagers
Methods for Refresh, RemoveBodyDependencies, RestoreBodyDependencies Methods for Refresh, RemoveBodyDependencies, RestoreBodyDependencies
Possibly generalized a 'pre step action' registration. Potentially add events for shape destruction, etc.
Complete implemention of preStepActions Complete implemention of preStepActions
Replace vehicle step call with prestep event. Replace vehicle step call with prestep event.
Is there a need for postStepActions? postStepTaints? Is there a need for postStepActions? postStepTaints?

BIN
bin/openjpeg-dotnet-x86_64.dll Executable file

Binary file not shown.

BIN
bin/openjpeg-dotnet.dll Executable file

Binary file not shown.