aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs138
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs11
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs30
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs15
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt8
5 files changed, 111 insertions, 91 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
index 4cfa33d..ae58dfd 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
@@ -316,76 +316,74 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
316 } 316 }
317 } 317 }
318 318
319 // Disabled for now as it looks like http://opensimulator.org/mantis/view.php?id=6311 was fixed by fixes 319 // XXX: This code was placed here to try and accomodate RLV which moves given folders named #RLV/~<name>
320 // to inventory folder versioning allowing the viewer to move the received folder itself as happens on the 320 // to the requested folder, which in this case is #RLV. However, it is the viewer that appears to be
321 // LL grid. Doing it again server-side then wrongly does a second create and move 321 // response from renaming the #RLV/~example folder to ~example. For some reason this is not yet
322// // XXX: This code was placed here to try and accomdate RLV which moves given folders named #RLV/~<name> 322 // happening, possibly because we are not sending the correct inventory update messages with the correct
323// // to a folder called name in #RLV. However, this approach may not be ultimately correct - from analysis 323 // transaction IDs
324// // of Firestorm 4.2.2 on sending an InventoryOffered instead of TaskInventoryOffered (as was previously 324 else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted)
325// // done), the viewer itself would appear to move and rename the folder, rather than the simulator doing it here. 325 {
326// else if (im.dialog == (byte) InstantMessageDialog.TaskInventoryAccepted) 326 UUID destinationFolderID = UUID.Zero;
327// { 327
328// UUID destinationFolderID = UUID.Zero; 328 if (im.binaryBucket != null && im.binaryBucket.Length >= 16)
329// 329 {
330// if (im.binaryBucket != null && im.binaryBucket.Length >= 16) 330 destinationFolderID = new UUID(im.binaryBucket, 0);
331// { 331 }
332// destinationFolderID = new UUID(im.binaryBucket, 0); 332
333// } 333 if (destinationFolderID != UUID.Zero)
334// 334 {
335// if (destinationFolderID != UUID.Zero) 335 InventoryFolderBase destinationFolder = new InventoryFolderBase(destinationFolderID, client.AgentId);
336// { 336 if (destinationFolder == null)
337// InventoryFolderBase destinationFolder = new InventoryFolderBase(destinationFolderID, client.AgentId); 337 {
338// if (destinationFolder == null) 338 m_log.WarnFormat(
339// { 339 "[INVENTORY TRANSFER]: TaskInventoryAccepted message from {0} in {1} specified folder {2} which does not exist",
340// m_log.WarnFormat( 340 client.Name, scene.Name, destinationFolderID);
341// "[INVENTORY TRANSFER]: TaskInventoryAccepted message from {0} in {1} specified folder {2} which does not exist", 341
342// client.Name, scene.Name, destinationFolderID); 342 return;
343// 343 }
344// return; 344
345// } 345 IInventoryService invService = scene.InventoryService;
346// 346
347// IInventoryService invService = scene.InventoryService; 347 UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip
348// 348
349// UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip 349 InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId);
350// 350 item = invService.GetItem(item);
351// InventoryItemBase item = new InventoryItemBase(inventoryID, client.AgentId); 351 InventoryFolderBase folder = null;
352// item = invService.GetItem(item); 352 UUID? previousParentFolderID = null;
353// InventoryFolderBase folder = null; 353
354// UUID? previousParentFolderID = null; 354 if (item != null) // It's an item
355// 355 {
356// if (item != null) // It's an item 356 previousParentFolderID = item.Folder;
357// { 357 item.Folder = destinationFolderID;
358// previousParentFolderID = item.Folder; 358
359// item.Folder = destinationFolderID; 359 invService.DeleteItems(item.Owner, new List<UUID>() { item.ID });
360// 360 scene.AddInventoryItem(client, item);
361// invService.DeleteItems(item.Owner, new List<UUID>() { item.ID }); 361 }
362// scene.AddInventoryItem(client, item); 362 else
363// } 363 {
364// else 364 folder = new InventoryFolderBase(inventoryID, client.AgentId);
365// { 365 folder = invService.GetFolder(folder);
366// folder = new InventoryFolderBase(inventoryID, client.AgentId); 366
367// folder = invService.GetFolder(folder); 367 if (folder != null) // It's a folder
368// 368 {
369// if (folder != null) // It's a folder 369 previousParentFolderID = folder.ParentID;
370// { 370 folder.ParentID = destinationFolderID;
371// previousParentFolderID = folder.ParentID; 371 invService.MoveFolder(folder);
372// folder.ParentID = destinationFolderID; 372 }
373// invService.MoveFolder(folder); 373 }
374// } 374
375// } 375 // Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code).
376// 376 if (previousParentFolderID != null)
377// // Tell client about updates to original parent and new parent (this should probably be factored with existing move item/folder code). 377 {
378// if (previousParentFolderID != null) 378 InventoryFolderBase previousParentFolder
379// { 379 = new InventoryFolderBase((UUID)previousParentFolderID, client.AgentId);
380// InventoryFolderBase previousParentFolder 380 previousParentFolder = invService.GetFolder(previousParentFolder);
381// = new InventoryFolderBase((UUID)previousParentFolderID, client.AgentId); 381 scene.SendInventoryUpdate(client, previousParentFolder, true, true);
382// previousParentFolder = invService.GetFolder(previousParentFolder); 382
383// scene.SendInventoryUpdate(client, previousParentFolder, true, true); 383 scene.SendInventoryUpdate(client, destinationFolder, true, true);
384// 384 }
385// scene.SendInventoryUpdate(client, destinationFolder, true, true); 385 }
386// } 386 }
387// }
388// }
389 else if ( 387 else if (
390 im.dialog == (byte)InstantMessageDialog.InventoryDeclined 388 im.dialog == (byte)InstantMessageDialog.InventoryDeclined
391 || im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined) 389 || im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined)
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
index b9c2cf9..1f7c398 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
@@ -59,7 +59,7 @@ public sealed class BSLinksetCompound : BSLinkset
59 // refresh will happen once after all the other taints are applied. 59 // refresh will happen once after all the other taints are applied.
60 public override void Refresh(BSPhysObject requestor) 60 public override void Refresh(BSPhysObject requestor)
61 { 61 {
62 // External request for Refresh (from BSPrim) is not necessary 62 // External request for Refresh (from BSPrim) doesn't need to do anything
63 // InternalRefresh(requestor); 63 // InternalRefresh(requestor);
64 } 64 }
65 65
@@ -86,7 +86,7 @@ public sealed class BSLinksetCompound : BSLinkset
86 DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child)); 86 DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child));
87 if (!IsRoot(child)) 87 if (!IsRoot(child))
88 { 88 {
89 // Physical children are removed from the world as the shape ofthe root compound 89 // The origional prims are removed from the world as the shape of the root compound
90 // shape takes over. 90 // shape takes over.
91 BulletSimAPI.AddToCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); 91 BulletSimAPI.AddToCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE);
92 BulletSimAPI.ForceActivationState2(child.PhysBody.ptr, ActivationState.DISABLE_SIMULATION); 92 BulletSimAPI.ForceActivationState2(child.PhysBody.ptr, ActivationState.DISABLE_SIMULATION);
@@ -118,7 +118,7 @@ public sealed class BSLinksetCompound : BSLinkset
118 // Called at taint-time!! 118 // Called at taint-time!!
119 public override void UpdateProperties(BSPhysObject updated) 119 public override void UpdateProperties(BSPhysObject updated)
120 { 120 {
121 // Nothing to do for constraints on property updates 121 // Nothing to do for compound linksets on property updates
122 } 122 }
123 123
124 // The children move around in relationship to the root. 124 // The children move around in relationship to the root.
@@ -257,6 +257,11 @@ public sealed class BSLinksetCompound : BSLinkset
257 BulletSimAPI.AddChildShapeToCompoundShape2(LinksetRoot.PhysShape.ptr, cPrim.PhysShape.ptr, displacementPos, displacementRot); 257 BulletSimAPI.AddChildShapeToCompoundShape2(LinksetRoot.PhysShape.ptr, cPrim.PhysShape.ptr, displacementPos, displacementRot);
258 } 258 }
259 } 259 }
260
261 // TODO: need to phantomize the child prims left behind.
262 // Maybe just destroy the children bodies and shapes and have them rebuild on unlink.
263 // Selection/deselection might cause way too many build/destructions esp. for LARGE linksets.
264
260 return false; // 'false' says to move onto the next child in the list 265 return false; // 'false' says to move onto the next child in the list
261 }); 266 });
262 267
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
190 } 190 }
191 public override bool Selected { 191 public override bool Selected {
192 set { 192 set {
193 _isSelected = value; 193 if (value != _isSelected)
194 PhysicsScene.TaintedObject("BSPrim.setSelected", delegate()
195 { 194 {
196 DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected); 195 _isSelected = value;
197 SetObjectDynamic(false); 196 PhysicsScene.TaintedObject("BSPrim.setSelected", delegate()
198 }); 197 {
198 DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected);
199 SetObjectDynamic(false);
200 });
201 }
199 } 202 }
200 } 203 }
201 public override void CrossingFailure() { return; } 204 public override void CrossingFailure() { return; }
@@ -678,8 +681,11 @@ public sealed class BSPrim : BSPhysObject
678 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_STATIC_OBJECT); 681 CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_STATIC_OBJECT);
679 // Stop all movement 682 // Stop all movement
680 ZeroMotion(true); 683 ZeroMotion(true);
681 // Center of mass is at the center of the object 684
682 // DEBUG DEBUG BulletSimAPI.SetCenterOfMassByPosRot2(Linkset.LinksetRoot.PhysBody.ptr, _position, _orientation); 685 // Set various physical properties so other object interact properly
686 BulletSimAPI.SetFriction2(PhysBody.ptr, PhysicsScene.Params.defaultFriction);
687 BulletSimAPI.SetRestitution2(PhysBody.ptr, PhysicsScene.Params.defaultRestitution);
688
683 // Mass is zero which disables a bunch of physics stuff in Bullet 689 // Mass is zero which disables a bunch of physics stuff in Bullet
684 UpdatePhysicalMassProperties(0f); 690 UpdatePhysicalMassProperties(0f);
685 // Set collision detection parameters 691 // Set collision detection parameters
@@ -688,13 +694,15 @@ public sealed class BSPrim : BSPhysObject
688 BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, PhysicsScene.Params.ccdMotionThreshold); 694 BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, PhysicsScene.Params.ccdMotionThreshold);
689 BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius); 695 BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, PhysicsScene.Params.ccdSweptSphereRadius);
690 } 696 }
691 // There can be special things needed for implementing linksets 697
692 Linkset.MakeStatic(this);
693 // The activation state is 'disabled' so Bullet will not try to act on it. 698 // The activation state is 'disabled' so Bullet will not try to act on it.
694 // BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.DISABLE_SIMULATION); 699 // BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.DISABLE_SIMULATION);
695 // Start it out sleeping and physical actions could wake it up. 700 // Start it out sleeping and physical actions could wake it up.
696 BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.ISLAND_SLEEPING); 701 BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.ISLAND_SLEEPING);
697 702
703 // There can be special things needed for implementing linksets
704 Linkset.MakeStatic(this);
705
698 PhysBody.collisionGroup = CollisionFilterGroups.StaticObjectGroup; 706 PhysBody.collisionGroup = CollisionFilterGroups.StaticObjectGroup;
699 PhysBody.collisionMask = CollisionFilterGroups.StaticObjectMask; 707 PhysBody.collisionMask = CollisionFilterGroups.StaticObjectMask;
700 } 708 }
@@ -1326,7 +1334,7 @@ public sealed class BSPrim : BSPhysObject
1326 // Rebuild the geometry and object. 1334 // Rebuild the geometry and object.
1327 // This is called when the shape changes so we need to recreate the mesh/hull. 1335 // This is called when the shape changes so we need to recreate the mesh/hull.
1328 // Called at taint-time!!! 1336 // Called at taint-time!!!
1329 private void CreateGeomAndObject(bool forceRebuild) 1337 public void CreateGeomAndObject(bool forceRebuild)
1330 { 1338 {
1331 // If this prim is part of a linkset, we must remove and restore the physical 1339 // If this prim is part of a linkset, we must remove and restore the physical
1332 // links if the body is rebuilt. 1340 // links if the body is rebuilt.
@@ -1341,7 +1349,7 @@ public sealed class BSPrim : BSPhysObject
1341 { 1349 {
1342 // Called if the current prim body is about to be destroyed. 1350 // Called if the current prim body is about to be destroyed.
1343 // Remove all the physical dependencies on the old body. 1351 // Remove all the physical dependencies on the old body.
1344 // (Maybe someday make the changing of BSShape an event handled by BSLinkset.) 1352 // (Maybe someday make the changing of BSShape an event to be subscribed to by BSLinkset, ...)
1345 needToRestoreLinkset = Linkset.RemoveBodyDependencies(this); 1353 needToRestoreLinkset = Linkset.RemoveBodyDependencies(this);
1346 needToRestoreVehicle = _vehicle.RemoveBodyDependencies(this); 1354 needToRestoreVehicle = _vehicle.RemoveBodyDependencies(this);
1347 }); 1355 });
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
index a5e5754..a77dee9 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
@@ -415,7 +415,7 @@ public sealed class BSShapeCollection : IDisposable
415 if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE) 415 if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE)
416 { 416 {
417 // an avatar capsule is close to a native shape (it is not shared) 417 // an avatar capsule is close to a native shape (it is not shared)
418 ret = GetReferenceToNativeShape(prim, BSPhysicsShapeType.SHAPE_CAPSULE, 418 GetReferenceToNativeShape(prim, BSPhysicsShapeType.SHAPE_CAPSULE,
419 FixedShapeKey.KEY_CAPSULE, shapeCallback); 419 FixedShapeKey.KEY_CAPSULE, shapeCallback);
420 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,avatarCapsule,shape={1}", prim.LocalID, prim.PhysShape); 420 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,avatarCapsule,shape={1}", prim.LocalID, prim.PhysShape);
421 ret = true; 421 ret = true;
@@ -423,7 +423,7 @@ public sealed class BSShapeCollection : IDisposable
423 } 423 }
424 424
425 // Compound shapes are handled special as they are rebuilt from scratch. 425 // Compound shapes are handled special as they are rebuilt from scratch.
426 // This isn't too great a hardship since most of the child shapes will already been created. 426 // This isn't too great a hardship since most of the child shapes will have already been created.
427 if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_COMPOUND) 427 if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_COMPOUND)
428 { 428 {
429 ret = GetReferenceToCompoundShape(prim, shapeCallback); 429 ret = GetReferenceToCompoundShape(prim, shapeCallback);
@@ -460,6 +460,9 @@ public sealed class BSShapeCollection : IDisposable
460 && pbs.PathScaleX == 100 && pbs.PathScaleY == 100 460 && pbs.PathScaleX == 100 && pbs.PathScaleY == 100
461 && pbs.PathShearX == 0 && pbs.PathShearY == 0) ) ) 461 && pbs.PathShearX == 0 && pbs.PathShearY == 0) ) )
462 { 462 {
463 if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,maybeNative,force={1},primScale={2},primSize={3},primShape={4}",
464 prim.LocalID, forceRebuild, prim.Scale, prim.Size, prim.PhysShape.type);
465
463 // It doesn't look like Bullet scales spheres so make sure the scales are all equal 466 // It doesn't look like Bullet scales spheres so make sure the scales are all equal
464 if ((pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1) 467 if ((pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1)
465 && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z) 468 && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z)
@@ -538,6 +541,8 @@ public sealed class BSShapeCollection : IDisposable
538 if (DDetail) DetailLog("{0},BSShapeCollection.AddNativeShapeToPrim,create,newshape={1},scale={2}", 541 if (DDetail) DetailLog("{0},BSShapeCollection.AddNativeShapeToPrim,create,newshape={1},scale={2}",
539 prim.LocalID, newShape, prim.Scale); 542 prim.LocalID, newShape, prim.Scale);
540 543
544 // native shapes are scaled by Bullet
545 prim.Scale = prim.Size;
541 prim.PhysShape = newShape; 546 prim.PhysShape = newShape;
542 return true; 547 return true;
543 } 548 }
@@ -550,8 +555,8 @@ public sealed class BSShapeCollection : IDisposable
550 ShapeData nativeShapeData = new ShapeData(); 555 ShapeData nativeShapeData = new ShapeData();
551 nativeShapeData.Type = shapeType; 556 nativeShapeData.Type = shapeType;
552 nativeShapeData.ID = prim.LocalID; 557 nativeShapeData.ID = prim.LocalID;
553 nativeShapeData.Scale = prim.Scale; 558 nativeShapeData.Scale = prim.Size;
554 nativeShapeData.Size = prim.Scale; // unneeded, I think. 559 nativeShapeData.Size = prim.Size; // unneeded, I think.
555 nativeShapeData.MeshKey = (ulong)shapeKey; 560 nativeShapeData.MeshKey = (ulong)shapeKey;
556 nativeShapeData.HullKey = (ulong)shapeKey; 561 nativeShapeData.HullKey = (ulong)shapeKey;
557 562
@@ -566,8 +571,6 @@ public sealed class BSShapeCollection : IDisposable
566 else 571 else
567 { 572 {
568 // Native shapes are scaled in Bullet so set the scaling to the size 573 // Native shapes are scaled in Bullet so set the scaling to the size
569 prim.Scale = prim.Size;
570 nativeShapeData.Scale = prim.Scale;
571 newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, nativeShapeData), shapeType); 574 newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, nativeShapeData), shapeType);
572 } 575 }
573 if (newShape.ptr == IntPtr.Zero) 576 if (newShape.ptr == IntPtr.Zero)
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
520121128.1600: mesh object not rezzing (no physics mesh). 520121128.1600: mesh object not rezzing (no physics mesh).
6 Causes many errors. Doesn't stop after first error with box shape. 6 Causes many errors. Doesn't stop after first error with box shape.
7 Eventually crashes when deleting the object. 7 Eventually crashes when deleting the object.
820121206.1434: rez Sam-pan into OSGrid BulletSim11 region
9 Immediate simulator crash. Mono does not output any stacktrace and
10 log just stops after reporting taint-time linking of the linkset.
8 11
9VEHICLES TODO LIST: 12VEHICLES TODO LIST:
10================================================= 13=================================================
@@ -23,9 +26,12 @@ After getting off a vehicle, the root prim is phantom (can be walked through)
23Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint) 26Linkset explosion after three "rides" on Nebadon lite vehicle (LinksetConstraint)
24Implement referenceFrame for all the motion routines. 27Implement referenceFrame for all the motion routines.
25Cannot edit/move a vehicle being ridden: it jumps back to the origional position. 28Cannot edit/move a vehicle being ridden: it jumps back to the origional position.
29Border crossing with linked vehicle causes crash
26 30
27BULLETSIM TODO LIST: 31BULLETSIM TODO LIST:
28================================================= 32=================================================
33Duplicating a physical prim causes old prim to jump away
34 Dup a phys prim and the original become unselected and thus interacts w/ selected prim.
29Disable activity of passive linkset children. 35Disable activity of passive linkset children.
30 Since the linkset is a compound object, the old prims are left lying 36 Since the linkset is a compound object, the old prims are left lying
31 around and need to be phantomized so they don't collide, ... 37 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
96Generalize Dynamics and PID with standardized motors. 102Generalize Dynamics and PID with standardized motors.
97Generalize Linkset and vehicles into PropertyManagers 103Generalize Linkset and vehicles into PropertyManagers
98 Methods for Refresh, RemoveBodyDependencies, RestoreBodyDependencies 104 Methods for Refresh, RemoveBodyDependencies, RestoreBodyDependencies
99 Possibly generalized a 'pre step action' registration. 105 Potentially add events for shape destruction, etc.
100Complete implemention of preStepActions 106Complete implemention of preStepActions
101 Replace vehicle step call with prestep event. 107 Replace vehicle step call with prestep event.
102 Is there a need for postStepActions? postStepTaints? 108 Is there a need for postStepActions? postStepTaints?