* ODE step two on the way to separate dynamic space allocation ( One more to go )
							parent
							
								
									9020ec5af9
								
							
						
					
					
						commit
						b63076c303
					
				|  | @ -806,6 +806,7 @@ namespace OpenSim.Region.Environment.Scenes | ||||||
|             bool IsTemporary = false; |             bool IsTemporary = false; | ||||||
|             bool IsPhantom = false; |             bool IsPhantom = false; | ||||||
|             bool CastsShadows = false; |             bool CastsShadows = false; | ||||||
|  |             bool wasUsingPhysics = ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0); | ||||||
|             //bool IsLocked = false; |             //bool IsLocked = false; | ||||||
|             int i = 0; |             int i = 0; | ||||||
| 
 | 
 | ||||||
|  | @ -829,19 +830,24 @@ namespace OpenSim.Region.Environment.Scenes | ||||||
|             if (UsePhysics ) |             if (UsePhysics ) | ||||||
|             { |             { | ||||||
|                 AddFlag(LLObject.ObjectFlags.Physics); |                 AddFlag(LLObject.ObjectFlags.Physics); | ||||||
|                 if (PhysActor != null) |                 if (!wasUsingPhysics) | ||||||
|                     PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; |                 { | ||||||
|  |                     doPhysicsPropertyUpdate(UsePhysics); | ||||||
|  |                 } | ||||||
| 
 | 
 | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 if (m_parentGroup.m_scene.m_physicalPrim) |                 RemFlag(LLObject.ObjectFlags.Physics); | ||||||
|  |                 if (wasUsingPhysics) | ||||||
|                 { |                 { | ||||||
|                     RemFlag(LLObject.ObjectFlags.Physics); |                     doPhysicsPropertyUpdate(UsePhysics); | ||||||
|                     if (PhysActor != null) |  | ||||||
|                         PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |                  | ||||||
|  | 
 | ||||||
|  |                  | ||||||
|  |              | ||||||
| 
 | 
 | ||||||
|             if (IsPhantom) |             if (IsPhantom) | ||||||
|             { |             { | ||||||
|  | @ -884,6 +890,35 @@ namespace OpenSim.Region.Environment.Scenes | ||||||
| //            System.Console.WriteLine("Update:  PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); | //            System.Console.WriteLine("Update:  PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); | ||||||
|             ScheduleFullUpdate(); |             ScheduleFullUpdate(); | ||||||
|         } |         } | ||||||
|  |         private void doPhysicsPropertyUpdate(bool UsePhysics) | ||||||
|  |         { | ||||||
|  |             if (PhysActor != null) | ||||||
|  |             { | ||||||
|  |                 if (PhysActor.IsPhysical) | ||||||
|  |                 { | ||||||
|  |                     PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; | ||||||
|  |                     PhysActor.OnOutOfBounds -= PhysicsOutOfBounds; | ||||||
|  |                 } | ||||||
|  |                 m_parentGroup.m_scene.PhysScene.RemovePrim(PhysActor); | ||||||
|  |                 /// that's not wholesome.  Had to make m_scene public | ||||||
|  |                 PhysActor = null; | ||||||
|  | 
 | ||||||
|  |                 PhysActor = m_parentGroup.m_scene.PhysScene.AddPrimShape( | ||||||
|  |                 Name, | ||||||
|  |                 Shape, | ||||||
|  |                 new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, | ||||||
|  |                                   AbsolutePosition.Z), | ||||||
|  |                 new PhysicsVector(Scale.X, Scale.Y, Scale.Z), | ||||||
|  |                 new Quaternion(RotationOffset.W, RotationOffset.X, | ||||||
|  |                                RotationOffset.Y, RotationOffset.Z), UsePhysics); | ||||||
|  |                 if (UsePhysics) | ||||||
|  |                 { | ||||||
|  |                     PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; | ||||||
|  |                     PhysActor.OnOutOfBounds += PhysicsOutOfBounds; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         public void UpdateExtraParam(ushort type, bool inUse, byte[] data) |         public void UpdateExtraParam(ushort type, bool inUse, byte[] data) | ||||||
|         { |         { | ||||||
|  | @ -1130,6 +1165,13 @@ namespace OpenSim.Region.Environment.Scenes | ||||||
|         } |         } | ||||||
|         #endregion |         #endregion | ||||||
| 
 | 
 | ||||||
|  |         public void PhysicsOutOfBounds(PhysicsVector pos) | ||||||
|  |         { | ||||||
|  |             OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Physical Object went out of bounds."); | ||||||
|  |             doPhysicsPropertyUpdate(false); | ||||||
|  |             ScheduleFullUpdate(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         public virtual void OnGrab(LLVector3 offsetPos, IClientAPI remoteClient) |         public virtual void OnGrab(LLVector3 offsetPos, IClientAPI remoteClient) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -99,6 +99,7 @@ namespace OpenSim.Region.Physics.Manager | ||||||
|     {  |     {  | ||||||
|         public delegate void RequestTerseUpdate(); |         public delegate void RequestTerseUpdate(); | ||||||
|         public delegate void CollisionUpdate(EventArgs e); |         public delegate void CollisionUpdate(EventArgs e); | ||||||
|  |         public delegate void OutOfBounds(PhysicsVector pos); | ||||||
| 
 | 
 | ||||||
| #pragma warning disable 67 | #pragma warning disable 67 | ||||||
|         public event PositionUpdate OnPositionUpdate; |         public event PositionUpdate OnPositionUpdate; | ||||||
|  | @ -106,6 +107,7 @@ namespace OpenSim.Region.Physics.Manager | ||||||
|         public event OrientationUpdate OnOrientationUpdate; |         public event OrientationUpdate OnOrientationUpdate; | ||||||
|         public event RequestTerseUpdate OnRequestTerseUpdate; |         public event RequestTerseUpdate OnRequestTerseUpdate; | ||||||
|         public event CollisionUpdate OnCollisionUpdate; |         public event CollisionUpdate OnCollisionUpdate; | ||||||
|  |         public event OutOfBounds OnOutOfBounds; | ||||||
| #pragma warning restore 67 | #pragma warning restore 67 | ||||||
| 
 | 
 | ||||||
|         public static PhysicsActor Null |         public static PhysicsActor Null | ||||||
|  | @ -130,6 +132,18 @@ namespace OpenSim.Region.Physics.Manager | ||||||
|                 OnRequestTerseUpdate(); |                 OnRequestTerseUpdate(); | ||||||
|             } |             } | ||||||
|              |              | ||||||
|  |         } | ||||||
|  |         public virtual void RaiseOutOfBounds(PhysicsVector pos) | ||||||
|  |         { | ||||||
|  |             // Make a temporary copy of the event to avoid possibility of | ||||||
|  |             // a race condition if the last subscriber unsubscribes | ||||||
|  |             // immediately after the null check and before the event is raised. | ||||||
|  |             OutOfBounds handler = OnOutOfBounds; | ||||||
|  |             if (handler != null) | ||||||
|  |             { | ||||||
|  |                 OnOutOfBounds(pos); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|         } |         } | ||||||
|         public virtual void SendCollisionUpdate(EventArgs e) |         public virtual void SendCollisionUpdate(EventArgs e) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -382,7 +382,25 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                         p = (OdePrim) prim; |                         p = (OdePrim) prim; | ||||||
|                         p.disableBody(); |                         p.disableBody(); | ||||||
|                     } |                     } | ||||||
|                      |                     // we don't want to remove the main space | ||||||
|  |                     if (((OdePrim)prim).m_targetSpace != space && ((OdePrim)prim).IsPhysical == false) | ||||||
|  |                     { | ||||||
|  |                         // If the geometry is in the targetspace, remove it from the target space | ||||||
|  |                         if (d.SpaceQuery(((OdePrim)prim).m_targetSpace, ((OdePrim)prim).prim_geom)) | ||||||
|  |                         { | ||||||
|  |                             d.SpaceRemove(space, ((OdePrim)prim).prim_geom); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         //If there are no more geometries in the sub-space, we don't need it in the main space anymore | ||||||
|  |                         if (d.SpaceGetNumGeoms(((OdePrim)prim).m_targetSpace) == 0) | ||||||
|  |                         { | ||||||
|  |                             d.SpaceRemove(space, ((OdePrim)prim).m_targetSpace); | ||||||
|  |                             // free up memory used by the space. | ||||||
|  |                             d.SpaceDestroy(((OdePrim)prim).m_targetSpace); | ||||||
|  |                             resetSpaceArrayItemToZero(calculateSpaceArrayItemFromPos(((OdePrim)prim).Position)); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|                     d.GeomDestroy(((OdePrim)prim).prim_geom); |                     d.GeomDestroy(((OdePrim)prim).prim_geom); | ||||||
|                      |                      | ||||||
|                     _prims.Remove((OdePrim)prim); |                     _prims.Remove((OdePrim)prim); | ||||||
|  | @ -390,19 +408,73 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         public void resetSpaceArrayItemToZero(IntPtr space) | ||||||
|  |         { | ||||||
|  |             for (int i = 0; i < staticPrimspace.Length; i++) | ||||||
|  |             { | ||||||
|  |                 if (staticPrimspace[i] == space) | ||||||
|  |                     staticPrimspace[i] = IntPtr.Zero; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         public void resetSpaceArrayItemToZero(int arrayitem) | ||||||
|  |         { | ||||||
|  |             staticPrimspace[arrayitem] = IntPtr.Zero; | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos) |         public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace) | ||||||
|         { |         { | ||||||
|             //Todo recalculate space the prim is in. |             //Todo recalculate space the prim is in. | ||||||
|  |             // Called from setting the Position and Size of an ODEPrim so  | ||||||
|  |             // it's already in locked space. | ||||||
| 
 | 
 | ||||||
|  |             // we don't want to remove the main space | ||||||
|  |             // we don't need to test physical here because this function should  | ||||||
|  |             // never be called if the prim is physical(active) | ||||||
|  |             if (currentspace != space) | ||||||
|  |             { | ||||||
|  |                 if (d.SpaceQuery(currentspace, geom)) | ||||||
|  |                 { | ||||||
|  |                     d.SpaceRemove(space, geom); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 //If there are no more geometries in the sub-space, we don't need it in the main space anymore | ||||||
|  |                 if (d.SpaceGetNumGeoms(currentspace) == 0) | ||||||
|  |                 { | ||||||
|  |                     d.SpaceRemove(space, currentspace); | ||||||
|  |                     // free up memory used by the space. | ||||||
|  |                     d.SpaceDestroy(currentspace); | ||||||
|  |                     resetSpaceArrayItemToZero(currentspace); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |                  | ||||||
|  |             // The routines in the Position and Size sections do the 'inserting' into the space,  | ||||||
|  |             // so all we have to do is make sure that the space that we're putting the prim into  | ||||||
|  |             // is in the 'main' space. | ||||||
|  |             int iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos); | ||||||
|  |             IntPtr newspace = calculateSpaceForGeom(pos); | ||||||
|  | 
 | ||||||
|  |             if (newspace == IntPtr.Zero)  | ||||||
|  |                 newspace = createprimspace(iprimspaceArrItem); | ||||||
|  |                      | ||||||
|  |             return newspace; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public IntPtr createprimspace(int iprimspaceArrItem) { | ||||||
|  |             // creating a new space for prim and inserting it into main space. | ||||||
|  |             staticPrimspace[iprimspaceArrItem] = d.HashSpaceCreate(IntPtr.Zero); | ||||||
|  |             d.SpaceAdd(space, staticPrimspace[iprimspaceArrItem]); | ||||||
|  |             return staticPrimspace[iprimspaceArrItem]; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public IntPtr calculateSpaceForGeom(PhysicsVector pos) | ||||||
|  |         { | ||||||
| 
 | 
 | ||||||
|             return space; |             return space; | ||||||
|         } |         } | ||||||
| 
 |         public int calculateSpaceArrayItemFromPos(PhysicsVector pos) | ||||||
|         public IntPtr calculateSpaceForNewGeom(PhysicsVector pos) |  | ||||||
|         { |         { | ||||||
| 
 |             return 0; | ||||||
|             return space; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         private PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, Quaternion rotation, |         private PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, Quaternion rotation, | ||||||
|  | @ -423,33 +495,36 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|             rot.y = rotation.y; |             rot.y = rotation.y; | ||||||
|             rot.z = rotation.z; |             rot.z = rotation.z; | ||||||
| 
 | 
 | ||||||
|             IntPtr targetspace = calculateSpaceForNewGeom(pos); |              | ||||||
|  |             int iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos); | ||||||
|  |             IntPtr targetspace = calculateSpaceForGeom(pos); | ||||||
|  | 
 | ||||||
|  |             if (targetspace == IntPtr.Zero) | ||||||
|  |                 targetspace = createprimspace(iprimspaceArrItem); | ||||||
|  | 
 | ||||||
|             OdePrim newPrim; |             OdePrim newPrim; | ||||||
|             lock (OdeLock) |             lock (OdeLock) | ||||||
|             { |             { | ||||||
|                 newPrim = new OdePrim(name, this, targetspace, pos, siz, rot, mesh, pbs, isphysical); |                 newPrim = new OdePrim(name, this, targetspace, pos, siz, rot, mesh, pbs, isphysical); | ||||||
|             } |             } | ||||||
|             _prims.Add(newPrim); |             _prims.Add(newPrim); | ||||||
|  |             OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Added Object"); | ||||||
|             return newPrim; |             return newPrim; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void addActivePrim(OdePrim activatePrim) |         public void addActivePrim(OdePrim activatePrim) | ||||||
|          { |          { | ||||||
|             // adds active prim..   (ones that should be iterated over in collisions_optimized |             // adds active prim..   (ones that should be iterated over in collisions_optimized | ||||||
|              lock (OdeLock) | 
 | ||||||
|              { |  | ||||||
|                  _activeprims.Add(activatePrim); |                  _activeprims.Add(activatePrim); | ||||||
|              } | 
 | ||||||
|         } |         } | ||||||
|         public void remActivePrim(OdePrim deactivatePrim) |         public void remActivePrim(OdePrim deactivatePrim) | ||||||
|         { |         { | ||||||
|             lock (OdeLock) | 
 | ||||||
|             { |                   _activeprims.Remove(deactivatePrim); | ||||||
|                 lock (_activeprims) |                 | ||||||
|                 { | 
 | ||||||
|                     _activeprims.Remove(deactivatePrim); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         public int TriArrayCallback(IntPtr trimesh, IntPtr refObject, int[] triangleIndex, int triCount) |         public int TriArrayCallback(IntPtr trimesh, IntPtr refObject, int[] triangleIndex, int triCount) | ||||||
|         { |         { | ||||||
|  | @ -541,6 +616,7 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
| 
 | 
 | ||||||
|         public override void Simulate(float timeStep) |         public override void Simulate(float timeStep) | ||||||
|         { |         { | ||||||
|  |              | ||||||
|             step_time += timeStep; |             step_time += timeStep; | ||||||
|             lock (OdeLock) |             lock (OdeLock) | ||||||
|             { |             { | ||||||
|  | @ -548,21 +624,7 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                 { |                 { | ||||||
|                     Console.WriteLine("RENDER: frame"); |                     Console.WriteLine("RENDER: frame"); | ||||||
|                 } |                 } | ||||||
|                 foreach (OdePrim p in _prims) |                  | ||||||
|                 { |  | ||||||
|                     if (_characters.Count > 0 && RENDER_FLAG) |  | ||||||
|                     { |  | ||||||
|                         Vector3 rx, ry, rz; |  | ||||||
|                         p.Orientation.ToAxes(out rx, out ry, out rz); |  | ||||||
|                         Console.WriteLine("RENDER: block; " + p.Size.X + ", " + p.Size.Y + ", " + p.Size.Z + "; " + |  | ||||||
|                                           "  0, 0, 1;  " + //shape, size, color |  | ||||||
|                                           (p.Position.X - 128.0f) + ", " + (p.Position.Y - 128.0f) + ", " + |  | ||||||
|                                           (p.Position.Z - 33.0f) + ";  " + // position |  | ||||||
|                                           rx.x + "," + ry.x + "," + rz.x + ", " + // rotation |  | ||||||
|                                           rx.y + "," + ry.y + "," + rz.y + ", " + |  | ||||||
|                                           rx.z + "," + ry.z + "," + rz.z); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                  |                  | ||||||
| 
 | 
 | ||||||
|                 // If We're loaded down by something else,  |                 // If We're loaded down by something else,  | ||||||
|  | @ -570,6 +632,8 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                 // skip a few frames to catch up gracefully. |                 // skip a few frames to catch up gracefully. | ||||||
|                 // without shooting the physicsactors all over the place |                 // without shooting the physicsactors all over the place | ||||||
|                  |                  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|                 if (step_time >= m_SkipFramesAtms) |                 if (step_time >= m_SkipFramesAtms) | ||||||
|                 { |                 { | ||||||
|                     // Instead of trying to catch up, it'll do one physics frame only |                     // Instead of trying to catch up, it'll do one physics frame only | ||||||
|  | @ -580,10 +644,12 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                 { |                 { | ||||||
|                     m_physicsiterations = 10; |                     m_physicsiterations = 10; | ||||||
|                 } |                 } | ||||||
|  |                  | ||||||
|                 // Process 10 frames if the sim is running normal..   |                 // Process 10 frames if the sim is running normal..   | ||||||
|                 // process 5 frames if the sim is running slow |                 // process 5 frames if the sim is running slow | ||||||
|                 d.WorldSetQuickStepNumIterations(world, m_physicsiterations); |                 d.WorldSetQuickStepNumIterations(world, m_physicsiterations); | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|                 int i = 0; |                 int i = 0; | ||||||
|                 while (step_time > 0.0f) |                 while (step_time > 0.0f) | ||||||
|                 { |                 { | ||||||
|  | @ -640,11 +706,13 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                 } |                 } | ||||||
|                 if (timeStep < 0.2f) |                 if (timeStep < 0.2f) | ||||||
|                 { |                 { | ||||||
|  |                     OdePrim outofBoundsPrim = null; | ||||||
|                     foreach (OdePrim actor in _activeprims) |                     foreach (OdePrim actor in _activeprims) | ||||||
|                     { |                     { | ||||||
|                         if (actor.IsPhysical && (d.BodyIsEnabled(actor.Body) || !actor._zeroFlag)) |                         if (actor.IsPhysical && (d.BodyIsEnabled(actor.Body) || !actor._zeroFlag)) | ||||||
|                         { |                         { | ||||||
|                             actor.UpdatePositionAndVelocity(); |                             actor.UpdatePositionAndVelocity(); | ||||||
|  |                              | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  | @ -716,6 +784,7 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|         { |         { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     # region ODE Actors | ||||||
| 
 | 
 | ||||||
|     public class OdeCharacter : PhysicsActor |     public class OdeCharacter : PhysicsActor | ||||||
|     { |     { | ||||||
|  | @ -1185,13 +1254,14 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|         private IMesh _mesh; |         private IMesh _mesh; | ||||||
|         private PrimitiveBaseShape _pbs; |         private PrimitiveBaseShape _pbs; | ||||||
|         private OdeScene _parent_scene; |         private OdeScene _parent_scene; | ||||||
|         private IntPtr m_targetSpace = (IntPtr)0; |         public IntPtr m_targetSpace = (IntPtr)0; | ||||||
|         public IntPtr prim_geom; |         public IntPtr prim_geom; | ||||||
|         public IntPtr _triMeshData; |         public IntPtr _triMeshData; | ||||||
|         private bool iscolliding = false; |         private bool iscolliding = false; | ||||||
|         private bool m_isphysical = false; |         private bool m_isphysical = false; | ||||||
|         private bool m_throttleUpdates = false; |         private bool m_throttleUpdates = false; | ||||||
|         private int throttleCounter = 0; |         private int throttleCounter = 0; | ||||||
|  |         public bool outofBounds = false; | ||||||
|          |          | ||||||
|         public bool _zeroFlag = false; |         public bool _zeroFlag = false; | ||||||
|         private bool m_lastUpdateSent = false; |         private bool m_lastUpdateSent = false; | ||||||
|  | @ -1402,7 +1472,9 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
| 
 | 
 | ||||||
|         public override PhysicsVector Position |         public override PhysicsVector Position | ||||||
|         { |         { | ||||||
|             get { return _position;} |             get {return _position; } | ||||||
|  |                  | ||||||
|  |             | ||||||
|             set |             set | ||||||
|             { |             { | ||||||
|                 _position = value; |                 _position = value; | ||||||
|  | @ -1421,9 +1493,9 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                     else |                     else | ||||||
|                     { |                     { | ||||||
|                         d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); |                         d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | ||||||
|                         |                         m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); | ||||||
|                     } |                     } | ||||||
|                     m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position); |                     | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -1449,6 +1521,9 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                         disableBody(); |                         disableBody(); | ||||||
|                     } |                     } | ||||||
|                     d.GeomDestroy(prim_geom); |                     d.GeomDestroy(prim_geom); | ||||||
|  | 
 | ||||||
|  |                     // Recalculate which space this geometry should be in. | ||||||
|  |                     m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position, m_targetSpace); | ||||||
|                     // Construction of new prim |                     // Construction of new prim | ||||||
|                     if (this._parent_scene.needsMeshing(_pbs)) |                     if (this._parent_scene.needsMeshing(_pbs)) | ||||||
|                     { |                     { | ||||||
|  | @ -1478,7 +1553,7 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                          |                          | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     m_targetSpace = _parent_scene.recalculateSpaceForGeom(prim_geom, _position); |                      | ||||||
|                     _parent_scene.geom_name_map[prim_geom] = oldname; |                     _parent_scene.geom_name_map[prim_geom] = oldname; | ||||||
| 
 | 
 | ||||||
|                 } |                 } | ||||||
|  | @ -1639,20 +1714,7 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                     // Disables the prim's movement physics....   |                     // Disables the prim's movement physics....   | ||||||
|                     // It's a hack and will generate a console message if it fails. |                     // It's a hack and will generate a console message if it fails. | ||||||
|                      |                      | ||||||
|                         try |                         | ||||||
|                         { |  | ||||||
|                             disableBody(); |  | ||||||
| 
 |  | ||||||
|                         } |  | ||||||
|                         catch (System.Exception e) |  | ||||||
|                         { |  | ||||||
|                             if (Body != (IntPtr)0) |  | ||||||
|                             { |  | ||||||
|                                 d.BodyDestroy(Body); |  | ||||||
|                                 Body = (IntPtr)0; |  | ||||||
| 
 |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                      |                      | ||||||
|                      |                      | ||||||
|                     IsPhysical = false; |                     IsPhysical = false; | ||||||
|  | @ -1662,10 +1724,11 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|                     m_rotationalVelocity.X = 0; |                     m_rotationalVelocity.X = 0; | ||||||
|                     m_rotationalVelocity.Y = 0; |                     m_rotationalVelocity.Y = 0; | ||||||
|                     m_rotationalVelocity.Z = 0; |                     m_rotationalVelocity.Z = 0; | ||||||
|                     base.RequestPhysicsterseUpdate(); |                     //base.RequestPhysicsterseUpdate(); | ||||||
|                     m_throttleUpdates = false; |                     m_throttleUpdates = false; | ||||||
|                     throttleCounter = 0; |                     throttleCounter = 0; | ||||||
|                     _zeroFlag = true; |                     _zeroFlag = true; | ||||||
|  |                     outofBounds = true; | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02)  |                 if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02)  | ||||||
|  | @ -1755,3 +1818,4 @@ namespace OpenSim.Region.Physics.OdePlugin | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |     #endregion | ||||||
		Loading…
	
		Reference in New Issue
	
	 Teravus Ovares
						Teravus Ovares