Merge branch 'master' of /home/opensim/var/repo/opensim
						commit
						a37040d07a
					
				|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -190,6 +190,8 @@ public sealed class BSPrim : BSPhysObject | ||||||
|     } |     } | ||||||
|     public override bool Selected { |     public override bool Selected { | ||||||
|         set { |         set { | ||||||
|  |             if (value != _isSelected) | ||||||
|  |             { | ||||||
|                 _isSelected = value; |                 _isSelected = value; | ||||||
|                 PhysicsScene.TaintedObject("BSPrim.setSelected", delegate() |                 PhysicsScene.TaintedObject("BSPrim.setSelected", delegate() | ||||||
|                 { |                 { | ||||||
|  | @ -198,6 +200,7 @@ public sealed class BSPrim : BSPhysObject | ||||||
|                 }); |                 }); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|     public override void CrossingFailure() { return; } |     public override void CrossingFailure() { return; } | ||||||
| 
 | 
 | ||||||
|     // link me to the specified parent |     // link me to the specified parent | ||||||
|  | @ -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); | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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? | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	 BlueWall
						BlueWall