PhysActor update messages working. Avatar and prim neither move nor position correctly
							parent
							
								
									5c6f0878a1
								
							
						
					
					
						commit
						a036426f18
					
				|  | @ -12,6 +12,7 @@ using OpenMetaverse.StructuredData; | |||
| using OpenSim.Framework; | ||||
| using OpenSim.Services.Interfaces; | ||||
| using OpenSim.Framework.Client; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| using OpenSim.Region.Framework.Scenes.Serialization; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
|  | @ -74,6 +75,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         private ActorType m_actorType = ActorType.PhysicsEngine; | ||||
| 
 | ||||
|         private bool m_debugWithViewer = false; | ||||
|         private long m_messagesSent = 0; | ||||
|         private long m_messagesReceived = 0; | ||||
| 
 | ||||
|         private QuarkSubsriptionInfo m_subscribedQuarks;  | ||||
|          | ||||
|  | @ -165,7 +168,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         { | ||||
|             RegionSyncMessage msg = new RegionSyncMessage(RegionSyncMessage.MsgType.ActorStatus, Convert.ToString((int)ActorStatus.Sync)); | ||||
|             Send(msg); | ||||
|             SendQuarkSubscription(); | ||||
|             // SendQuarkSubscription(); | ||||
|             Thread.Sleep(100); | ||||
|             DoInitialSync(); | ||||
|         } | ||||
|  | @ -196,7 +199,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
| 
 | ||||
|         private void DoInitialSync() | ||||
|         { | ||||
|             m_validLocalScene.DeleteAllSceneObjects(); | ||||
|             // m_validLocalScene.DeleteAllSceneObjects(); | ||||
|             //m_log.Debug(LogHeader + ": send actor type " + m_actorType); | ||||
|             //Send(new RegionSyncMessage(RegionSyncMessage.MsgType.ActorType, Convert.ToString((int)m_actorType))); | ||||
|             //KittyL??? Do we need to send in RegionName? | ||||
|  | @ -204,8 +207,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             //Send(new RegionSyncMessage(RegionSyncMessage.MsgType.RegionName, m_scene.RegionInfo.RegionName)); | ||||
|             //m_log.WarnFormat("Sending region name: \"{0}\"", m_scene.RegionInfo.RegionName); | ||||
| 
 | ||||
|             Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetTerrain)); | ||||
|             Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetObjects)); | ||||
|             // Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetTerrain)); | ||||
|             // Send(new RegionSyncMessage(RegionSyncMessage.MsgType.GetObjects)); | ||||
| 
 | ||||
|             // Register for events which will be forwarded to authoritative scene | ||||
|             // m_scene.EventManager.OnNewClient += EventManager_OnNewClient; | ||||
|  | @ -229,6 +232,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         public void ReportStatus() | ||||
|         { | ||||
|             m_log.WarnFormat("{0} Synchronized to RegionSyncServer at {1}:{2}", LogHeader, m_addr, m_port); | ||||
|             m_log.WarnFormat("{0} Received={1}, Sent={2}", LogHeader, m_messagesReceived, m_messagesSent); | ||||
|             lock (m_syncRoot) | ||||
|             { | ||||
|                 //TODO: should be reporting about the information of the objects/scripts | ||||
|  | @ -278,6 +282,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                 try | ||||
|                 { | ||||
|                     //lock (m_syncRoot) -- KittyL: why do we need to lock here? We could lock inside HandleMessage if necessary, and lock on different objects for better performance | ||||
|                     m_messagesReceived++; | ||||
|                     HandleMessage(msg); | ||||
|                 } | ||||
|                 catch (Exception e) | ||||
|  | @ -310,6 +315,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                 try | ||||
|                 { | ||||
|                     m_client.GetStream().Write(data, 0, data.Length); | ||||
|                     m_messagesSent++; | ||||
|                 } | ||||
|                 // If there is a problem reading from the client, shut 'er down.  | ||||
|                 // *** Still need to alert the module that it's no longer connected! | ||||
|  | @ -319,79 +325,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Send requests to update object properties in the remote authoratative Scene. | ||||
|         /// </summary> | ||||
|         /// <param name="primID">UUID of the object</param> | ||||
|         /// <param name="pName">name of the property to be updated</param> | ||||
|         /// <param name="valParams">parameters of the value of the property</param> | ||||
|         /// <returns></returns> | ||||
|         public void SendSetPrimProperties(UUID primID, string pName, object val) | ||||
|         { | ||||
|             OSDMap data = new OSDMap(); | ||||
|             data["UUID"] = OSD.FromUUID(primID); | ||||
|             data["name"] = OSD.FromString(pName); | ||||
|             object[] valParams = (object[])val; | ||||
|             //data["param"] = OSD.FromString(presence.ControllingClient.LastName); | ||||
|             Vector3 pos, vel; | ||||
|             switch (pName) | ||||
|             { | ||||
|                 case "object_rez": | ||||
|                     //this is to rez an object from the prim's inventory, rather than change the prim's property | ||||
|                     if(valParams.Length<5){ | ||||
|                         m_log.Warn(LogHeader+": values for object's "+pName+" property should include: inventory, pos, velocity, rotation, param"); | ||||
|                         return; | ||||
|                     } | ||||
|                     string inventory = (string)valParams[0]; | ||||
|                     pos = (Vector3)valParams[1]; | ||||
|                     vel = (Vector3)valParams[2]; | ||||
|                     Quaternion rot = (Quaternion)valParams[3]; | ||||
|                     int param = (int)valParams[4]; | ||||
|                     data["inventory"]=OSD.FromString(inventory); | ||||
|                     data["pos"]=OSD.FromVector3(pos); | ||||
|                     data["vel"] = OSD.FromVector3(vel); | ||||
|                     data["rot"] = OSD.FromQuaternion(rot); | ||||
|                     data["param"] = OSD.FromInteger(param); | ||||
|                     break; | ||||
|                 case "color": | ||||
|                     if(valParams.Length<2){ | ||||
|                         m_log.Warn(LogHeader+": values for object's "+pName+" property should include: color-x, color-y, color-z, face"); | ||||
|                         return; | ||||
|                     } | ||||
|                     //double cx = (double)valParams[0]; | ||||
|                     //double cy = (double)valParams[1]; | ||||
|                     //double cz = (double)valParams[2]; | ||||
|                     //Vector3 color = new Vector3((float)cx, (float)cy, (float)cz); | ||||
|                     Vector3 color = (Vector3)valParams[0]; | ||||
|                     data["color"] = OSD.FromVector3(color); | ||||
|                     data["face"] = OSD.FromInteger((int)valParams[1]); | ||||
| 
 | ||||
|                     //m_log.DebugFormat("{0}: to set color {1} on face {2} of prim {3}", LogHeader, color.ToString(), (int)valParams[1], primID); | ||||
| 
 | ||||
|                     break; | ||||
|                 case "pos": | ||||
|                     if (valParams.Length < 1) | ||||
|                     { | ||||
|                         m_log.Warn(LogHeader + ": values for object's " + pName + " property should include: pos(vector)"); | ||||
|                         return; | ||||
|                     } | ||||
|                     //double px = (double)valParams[0]; | ||||
|                     //double py = (double)valParams[1]; | ||||
|                     //double pz = (double)valParams[2]; | ||||
|                     //Vector3 pos = new Vector3((float)px, (float)py, (float)pz); | ||||
|                     pos = (Vector3)valParams[0]; | ||||
|                     data["pos"] = OSD.FromVector3(pos); | ||||
| 
 | ||||
|                     m_log.DebugFormat("{0}: to set pos {1} for prim {2}", LogHeader, pos.ToString(), primID); | ||||
|                     break; | ||||
|                 default: | ||||
|                     // | ||||
|                     break; | ||||
|             } | ||||
| 
 | ||||
|             Send(new RegionSyncMessage(RegionSyncMessage.MsgType.SetObjectProperty, OSDParser.SerializeJsonString(data))); | ||||
|         } | ||||
|         #endregion SEND | ||||
| 
 | ||||
|         //KittyL: Has to define SendCoarseLocations() here, since it's defined in IRegionSyncClientModule. | ||||
|  | @ -415,16 +348,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                     { | ||||
|                         return; | ||||
|                     } | ||||
|                 case RegionSyncMessage.MsgType.Terrain: | ||||
|                 case RegionSyncMessage.MsgType.PhysUpdateAttributes: | ||||
|                     { | ||||
|                         //We need to handle terrain differently as we handle objects: we really will set the HeightMap | ||||
|                         //of each local scene that is the shadow copy of its auth. scene. | ||||
|                         return; | ||||
|                     } | ||||
|                 case RegionSyncMessage.MsgType.NewObject: | ||||
|                 case RegionSyncMessage.MsgType.UpdatedObject: | ||||
|                     { | ||||
|                         HandleAddOrUpdateObjectInLocalScene(msg); | ||||
|                         HandlePhysUpdateAttributes(msg); | ||||
|                         return; | ||||
|                     } | ||||
|                 default: | ||||
|  | @ -436,6 +362,69 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// The physics engine has some updates to the attributes. Unpack the parameters, find the | ||||
|         /// correct PhysicsActor and plug in the new values; | ||||
|         /// </summary> | ||||
|         /// <param name="msg"></param> | ||||
|         private void HandlePhysUpdateAttributes(RegionSyncMessage msg) | ||||
|         { | ||||
|             // TODO:  | ||||
|             OSDMap data = RegionSyncUtil.DeserializeMessage(msg, LogHeader); | ||||
|             try | ||||
|             { | ||||
|                 uint localID = data["localID"].AsUInteger(); | ||||
|                 // m_log.DebugFormat("{0}: HandlPhysUpdateAttributes for {1}", LogHeader, localID); | ||||
|                 SceneObjectPart sop = m_validLocalScene.GetSceneObjectPart(localID); | ||||
|                 if (sop != null) | ||||
|                 { | ||||
|                     sop.PhysActor.Size = data["size"].AsVector3(); | ||||
|                     sop.PhysActor.Position = data["position"].AsVector3(); | ||||
|                     sop.PhysActor.Force = data["force"].AsVector3(); | ||||
|                     sop.PhysActor.Velocity = data["velocity"].AsVector3(); | ||||
|                     sop.PhysActor.Torque = data["torque"].AsVector3(); | ||||
|                     sop.PhysActor.Orientation = data["orientantion"].AsQuaternion(); | ||||
|                     sop.PhysActor.IsPhysical = data["isPhysical"].AsBoolean();  // receive?? | ||||
|                     sop.PhysActor.Flying = data["flying"].AsBoolean();      // receive?? | ||||
|                     sop.PhysActor.Kinematic = data["kinematic"].AsBoolean();    // receive?? | ||||
|                     sop.PhysActor.Buoyancy = (float)(data["buoyancy"].AsReal()); | ||||
|                     sop.PhysActor.Shape = sop.Shape; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     m_log.WarnFormat("{0}: attribute update for unknown localID {1}", LogHeader, localID); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 m_log.WarnFormat("{0}: EXCEPTION processing UpdateAttributes: {1}", LogHeader, e); | ||||
|                 return; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         public void SendPhysUpdateAttributes(PhysicsActor pa) | ||||
|         { | ||||
|             m_log.DebugFormat("{0}: SendPhysUpdateAttributes for {1}", LogHeader, pa.LocalID); | ||||
|             OSDMap data = new OSDMap(9); | ||||
|             data["localID"] = OSD.FromUInteger(pa.LocalID); | ||||
|             data["size"] = OSD.FromVector3(pa.Size); | ||||
|             data["position"] = OSD.FromVector3(pa.Position); | ||||
|             data["force"] = OSD.FromVector3(pa.Force); | ||||
|             data["velocity"] = OSD.FromVector3(pa.Velocity); | ||||
|             data["torque"] = OSD.FromVector3(pa.Torque); | ||||
|             data["orientation"] = OSD.FromQuaternion(pa.Orientation); | ||||
|             data["isPhysical"] = OSD.FromBoolean(pa.IsPhysical); | ||||
|             data["flying"] = OSD.FromBoolean(pa.Flying); | ||||
|             data["buoyancy"] = OSD.FromReal(pa.Buoyancy); | ||||
| 
 | ||||
|             RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.PhysUpdateAttributes,  | ||||
|                                                                 OSDParser.SerializeJsonString(data)); | ||||
|             Send(rsm); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         #region Utility functions | ||||
| 
 | ||||
|         private OSDMap GetOSDMap(string strdata) | ||||
|  |  | |||
|  | @ -35,6 +35,7 @@ using OpenSim.Framework.Client; | |||
| using OpenSim.Region.CoreModules.Framework.InterfaceCommander; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| using log4net; | ||||
| using System.Net; | ||||
| using System.Net.Sockets; | ||||
|  | @ -51,6 +52,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         private string m_serveraddr; | ||||
|         private int m_serverport; | ||||
|         private Scene m_scene; | ||||
|         private static List<Scene> m_allScenes = new List<Scene>(); | ||||
|         private ILog m_log; | ||||
|         private Object m_client_lock = new Object(); | ||||
|         //private PhysEngineToSceneConnector m_scriptEngineToSceneConnector = null; | ||||
|  | @ -64,6 +66,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         private Dictionary<string, PhysEngineToSceneConnector> m_PEToSceneConnectors = new Dictionary<string, PhysEngineToSceneConnector>(); //connector for each auth. scene | ||||
|         private string LogHeader = "[PhysEngineToSceneConnectorModule]"; | ||||
|         private PhysEngineToSceneConnector m_idlePEToSceneConnector = null; | ||||
|         private PhysEngineToSceneConnector m_physEngineToSceneConnector = null; | ||||
| 
 | ||||
|         //quark information | ||||
|         //private int QuarkInfo.SizeX; | ||||
|  | @ -131,6 +134,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             InstallInterfaces(); | ||||
| 
 | ||||
|             m_log.Warn(LogHeader + " Initialised"); | ||||
| 
 | ||||
|             // collect all the scenes for later routing | ||||
|             if (!m_allScenes.Contains(scene)) | ||||
|             { | ||||
|                 m_allScenes.Add(scene); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void PostInitialise() | ||||
|  | @ -202,6 +211,49 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             get { return (m_activeActors != 0); } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// The scene is unknown by ODE so we have to look through the scenes to | ||||
|         /// find the one with this PhysicsActor so we can send the update. | ||||
|         /// </summary> | ||||
|         /// <param name="pa"></param> | ||||
|         public static void RouteUpdate(PhysicsActor pa) | ||||
|         { | ||||
|             SceneObjectPart sop = null; | ||||
|             Scene s = null; | ||||
|             foreach (Scene ss in m_allScenes) | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     sop = ss.GetSceneObjectPart(pa.LocalID); | ||||
|                 } | ||||
|                 catch | ||||
|                 { | ||||
|                     sop = null; | ||||
|                 } | ||||
|                 if (sop != null) | ||||
|                 { | ||||
|                     s = ss; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             if (s != null) | ||||
|             { | ||||
|                 if (s.PhysEngineToSceneConnectorModule != null) | ||||
|                 { | ||||
|                     s.PhysEngineToSceneConnectorModule.SendUpdate(pa); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     Console.WriteLine("RouteUpdate: PhysEngineToSceneConnectorModule is null"); | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 Console.WriteLine("RouteUpdate: no SOP found"); | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
| 
 | ||||
|  | @ -218,6 +270,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|              */ | ||||
|         } | ||||
| 
 | ||||
|         public void SendUpdate(PhysicsActor pa) | ||||
|         { | ||||
|             this.m_physEngineToSceneConnector.SendPhysUpdateAttributes(pa); | ||||
|         } | ||||
| 
 | ||||
|         #region Console Command Interface | ||||
|         //IMPORTANT: these functions should only be actived for the PhysEngineToSceneConnectorModule that is associated with the valid local scene | ||||
| 
 | ||||
|  | @ -307,11 +364,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         private void InitPhysEngineToSceneConnector(string space) | ||||
|         { | ||||
|              | ||||
|             PhysEngineToSceneConnector scriptEngineToSceneConnector = new PhysEngineToSceneConnector(m_scene,  | ||||
|             m_physEngineToSceneConnector = new PhysEngineToSceneConnector(m_scene,  | ||||
|                     m_serveraddr, m_serverport, m_debugWithViewer, /* space,*/ m_syncConfig); | ||||
|             if (scriptEngineToSceneConnector.Start()) | ||||
|             if (m_physEngineToSceneConnector.Start()) | ||||
|             { | ||||
|                 m_PEToSceneConnectors.Add(m_scene.RegionInfo.RegionName, scriptEngineToSceneConnector); | ||||
|                 m_PEToSceneConnectors.Add(m_scene.RegionInfo.RegionName, m_physEngineToSceneConnector); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -108,6 +108,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             ScriptStateSyncEnd, | ||||
|             //Idle script engine overloaded -> overloaded script engine | ||||
|             ScriptStateSyncRequest, | ||||
|             // Physics Engine -> Scene | ||||
|             PhysTerseUpdate, | ||||
|             PhysOutOfBounds, | ||||
|             PhysCollisionUpdate, | ||||
|             // Scene -> Physics Engine | ||||
|             PhysUpdateAttributes, | ||||
|         } | ||||
|         #endregion | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ using OpenSim.Framework; | |||
| using OpenSim.Region.Framework.Scenes; | ||||
| using OpenSim.Region.Framework.Scenes.Serialization; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| using log4net; | ||||
| 
 | ||||
| namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||
|  | @ -94,7 +95,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
| 
 | ||||
|         public string GetStats() | ||||
|         { | ||||
|             int syncedAvCount; | ||||
|             string ret; | ||||
|             //lock (m_syncRoot) | ||||
|             //    syncedAvCount = m_syncedAvatars.Count; | ||||
|  | @ -103,7 +103,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                 double secondsSinceLastStats = DateTime.Now.Subtract(lastStatTime).TotalSeconds; | ||||
|                 lastStatTime = DateTime.Now; | ||||
| 
 | ||||
|                 ret = String.Format("[{0,4}/{1,4}], [{2,4}/{3,4}], [{4,4}/{5,4}], [{6,4} ({7,4})], [{8,8} ({9,8:00.00})], [{10,4} ({11,4})], [{12,8} ({13,8:00.00})], [{14,8} ({15,4}]", | ||||
|                 // ret = String.Format("[{0,4}/{1,4}], [{2,4}/{3,4}], [{4,4}/{5,4}], [{6,4} ({7,4})], [{8,8} ({9,8:00.00})], [{10,4} ({11,4})], [{12,8} ({13,8:00.00})], [{14,8} ({15,4}]", | ||||
|                 ret = String.Format("[{0,4}/{1,4}], [{2,6}/{3,6}], [{4,4}/{5,4}], [{6,6} ({7,6})], [{8,4} ({9,4})]", | ||||
|                     //lastTotalCount, totalAvCount, // TOTAL AVATARS | ||||
|                     //lastLocalCount, syncedAvCount, // LOCAL TO THIS CLIENT VIEW | ||||
|                     //lastRemoteCount, totalAvCount - syncedAvCount, // REMOTE (SHOULD = TOTAL - LOCAL) | ||||
|  | @ -162,7 +163,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             m_receive_loop.Start(); | ||||
| 
 | ||||
|             //tell the remote script engine about the locX, locY of this authoritative scene | ||||
|             SendSceneLoc(); | ||||
|             // SendSceneLoc(); | ||||
|             m_log.DebugFormat("{0}: SceneToPhysEngineConnector initialized", LogHeader); | ||||
|         } | ||||
| 
 | ||||
|         // Stop the listening thread, disconnecting the RegionSyncPhysEngine | ||||
|  | @ -257,7 +259,27 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                         } | ||||
|                         return; | ||||
|                     } | ||||
|                       | ||||
| 
 | ||||
|                 case RegionSyncMessage.MsgType.PhysTerseUpdate: | ||||
|                     { | ||||
|                         HandlePhysTerseUpdate(msg); | ||||
|                         return; | ||||
|                     } | ||||
|                 case RegionSyncMessage.MsgType.PhysOutOfBounds: | ||||
|                     { | ||||
|                         HandlePhysOutOfBounds(msg); | ||||
|                         return; | ||||
|                     } | ||||
|                 case RegionSyncMessage.MsgType.PhysCollisionUpdate: | ||||
|                     { | ||||
|                         HandlePhysCollisionUpdate(msg); | ||||
|                         return; | ||||
|                     } | ||||
|                 case RegionSyncMessage.MsgType.PhysUpdateAttributes: | ||||
|                     { | ||||
|                         HandlePhysUpdateAttributes(msg); | ||||
|                         return; | ||||
|                     } | ||||
|                 default: | ||||
|                     { | ||||
|                         m_log.WarnFormat("{0} Unable to handle unsupported message type", LogHeader); | ||||
|  | @ -266,6 +288,86 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void HandlePhysTerseUpdate(RegionSyncMessage msg) | ||||
|         { | ||||
|             // TODO:  | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         private void HandlePhysOutOfBounds(RegionSyncMessage msg) | ||||
|         { | ||||
|             // TODO:  | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         private void HandlePhysCollisionUpdate(RegionSyncMessage msg) | ||||
|         { | ||||
|             // TODO:  | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// The physics engine has some updates to the attributes. Unpack the parameters, find the | ||||
|         /// correct PhysicsActor and plug in the new values; | ||||
|         /// </summary> | ||||
|         /// <param name="msg"></param> | ||||
|         private void HandlePhysUpdateAttributes(RegionSyncMessage msg) | ||||
|         { | ||||
|             // TODO:  | ||||
|             OSDMap data = RegionSyncUtil.DeserializeMessage(msg, LogHeader); | ||||
|             try | ||||
|             { | ||||
|                 uint localID = data["localID"].AsUInteger(); | ||||
|                 m_log.DebugFormat("{0}: received PhysUpdateAttributes for {1}", LogHeader, localID); | ||||
|                 SceneObjectPart sop = m_scene.GetSceneObjectPart(localID); | ||||
|                 if (sop != null) | ||||
|                 { | ||||
|                     sop.PhysActor.Size = data["size"].AsVector3(); | ||||
|                     sop.PhysActor.Position = data["position"].AsVector3(); | ||||
|                     sop.PhysActor.Force = data["force"].AsVector3(); | ||||
|                     sop.PhysActor.Velocity = data["velocity"].AsVector3(); | ||||
|                     sop.PhysActor.Torque = data["torque"].AsVector3(); | ||||
|                     sop.PhysActor.Orientation = data["orientantion"].AsQuaternion(); | ||||
|                     sop.PhysActor.IsPhysical = data["isPhysical"].AsBoolean();  // receive?? | ||||
|                     sop.PhysActor.Flying = data["flying"].AsBoolean();      // receive?? | ||||
|                     sop.PhysActor.Kinematic = data["kinematic"].AsBoolean();    // receive?? | ||||
|                     sop.PhysActor.Buoyancy = (float)(data["buoyancy"].AsReal()); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     m_log.WarnFormat("{0}: attribute update for unknown localID {1}", LogHeader, localID); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 m_log.WarnFormat("{0}: EXCEPTION processing UpdateAttributes: {1}", LogHeader, e); | ||||
|                 return; | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         public void SendPhysUpdateAttributes(PhysicsActor pa) | ||||
|         { | ||||
|             // m_log.DebugFormat("{0}: sending PhysUpdateAttributes for {1}", LogHeader, pa.LocalID); | ||||
|             OSDMap data = new OSDMap(9); | ||||
|             data["localID"] = OSD.FromUInteger(pa.LocalID); | ||||
|             data["size"] = OSD.FromVector3(pa.Size); | ||||
|             data["position"] = OSD.FromVector3(pa.Position); | ||||
|             data["force"] = OSD.FromVector3(pa.Force); | ||||
|             data["velocity"] = OSD.FromVector3(pa.Velocity); | ||||
|             data["torque"] = OSD.FromVector3(pa.Torque); | ||||
|             data["orientation"] = OSD.FromQuaternion(pa.Orientation); | ||||
|             data["isPhysical"] = OSD.FromBoolean(pa.IsPhysical); | ||||
|             data["flying"] = OSD.FromBoolean(pa.Flying); | ||||
|             data["buoyancy"] = OSD.FromReal(pa.Buoyancy); | ||||
| 
 | ||||
|             RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.PhysUpdateAttributes,  | ||||
|                                                                 OSDParser.SerializeJsonString(data)); | ||||
|             Send(rsm); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         //For simplicity, we assume the subscription sent by PhysEngine is legistimate (no overlapping with other script engines, etc) | ||||
|         private void HandleQuarkSubscription(RegionSyncMessage msg) | ||||
|         { | ||||
|  | @ -335,7 +437,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                                 m_tcpclient.GetStream().EndWrite(ar); | ||||
|                             } | ||||
|                             catch (Exception) | ||||
|                             { } | ||||
|                             { | ||||
|                                 m_log.WarnFormat("{0} Write to output stream failed", LogHeader); | ||||
|                             } | ||||
|                         } | ||||
|                     }, null); | ||||
|                 } | ||||
|  | @ -344,6 +448,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                     m_log.WarnFormat("{0} Physics Engine has disconnected.", LogHeader); | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 m_log.DebugFormat("{0} Attempt to send with no connection", LogHeader); | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         public void SendObjectUpdate(RegionSyncMessage.MsgType msgType, SceneObjectGroup sog) | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ using System.Text; | |||
| using System.Collections.Generic; | ||||
| using System.Threading; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Region.CoreModules.Framework.InterfaceCommander; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using log4net; | ||||
|  | @ -13,6 +14,7 @@ using log4net; | |||
| using OpenMetaverse; | ||||
| using OpenMetaverse.StructuredData; | ||||
| using OpenSim.Region.Framework.Scenes.Serialization; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| 
 | ||||
| namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||
| { | ||||
|  | @ -41,7 +43,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|     } | ||||
| 
 | ||||
|     //Here is the per actor type listening server for physics Engines. | ||||
|     public class SceneToPhysEngineSyncServer : ISceneToPhysEngineServer | ||||
|     public class SceneToPhysEngineSyncServer : ISceneToPhysEngineServer, ICommandableModule | ||||
|     { | ||||
|         #region SceneToPhysEngineSyncServer members | ||||
|         // Set the addr and port for TcpListener | ||||
|  | @ -61,6 +63,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         // static counters that are used to compute global configuration state | ||||
|         private static int m_syncServerInitialized = 0; | ||||
|         private static int m_totalConnections = 0; | ||||
|         private static List<Scene> m_allScenes = new List<Scene>(); | ||||
| 
 | ||||
|         // The local scene. | ||||
|         private Scene m_scene; | ||||
|  | @ -74,6 +77,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         private object m_physEngineConnector_lock = new object(); | ||||
|         //private Dictionary<string, SceneToPhysEngineConnector> m_physEngineConnectors = new Dictionary<string, SceneToPhysEngineConnector>(); | ||||
|         private List<SceneToPhysEngineConnector> m_physEngineConnectors = new List<SceneToPhysEngineConnector>(); | ||||
|         // the last connector created | ||||
|         private SceneToPhysEngineConnector m_sceneToPhysEngineConnector = null; | ||||
| 
 | ||||
|         //list of idle physics engines that have registered. | ||||
|         private List<IdlePhysEngineInfo> m_idlePhysEngineList = new List<IdlePhysEngineInfo>(); | ||||
|  | @ -88,27 +93,176 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         //private int QuarkInfo.SizeX; | ||||
|         //private int QuarkInfo.SizeY; | ||||
| 
 | ||||
|         #region ICommandableModule Members | ||||
|         private readonly Commander m_commander = new Commander("phys"); | ||||
|         public ICommander CommandInterface | ||||
|         { | ||||
|             get { return m_commander; } | ||||
|         } | ||||
| 
 | ||||
|         private void InstallInterfaces() | ||||
|         { | ||||
|             // Command cmdSyncStart = new Command("start", CommandIntentions.COMMAND_HAZARDOUS, SyncStart, "Begins synchronization with RegionSyncServer."); | ||||
|             //cmdSyncStart.AddArgument("server_port", "The port of the server to synchronize with", "Integer"); | ||||
|              | ||||
|             // Command cmdSyncStop = new Command("stop", CommandIntentions.COMMAND_HAZARDOUS, SyncStop, "Stops synchronization with RegionSyncServer."); | ||||
|             //cmdSyncStop.AddArgument("server_address", "The IP address of the server to synchronize with", "String"); | ||||
|             //cmdSyncStop.AddArgument("server_port", "The port of the server to synchronize with", "Integer"); | ||||
| 
 | ||||
|             Command cmdSyncStatus = new Command("status", CommandIntentions.COMMAND_HAZARDOUS, SyncStatus, "Displays synchronization status."); | ||||
| 
 | ||||
|             //The following two commands are more for easier debugging purpose | ||||
|             // Command cmdSyncSetQuarks = new Command("quarkSpace", CommandIntentions.COMMAND_HAZARDOUS, SetQuarkList, "Set the set of quarks to subscribe to. For debugging purpose. Should be issued before \"sync start\""); | ||||
|             // cmdSyncSetQuarks.AddArgument("quarkSpace", "The (rectangle) space of quarks to subscribe, represented by x0_y0,x1_y1, the left-bottom and top-right corners of the rectangel space", "String"); | ||||
| 
 | ||||
|             // Command cmdSyncSetQuarkSize = new Command("quarksize", CommandIntentions.COMMAND_HAZARDOUS, SetQuarkSize, "Set the size of each quark. For debugging purpose. Should be issued before \"sync quarks\""); | ||||
|             // cmdSyncSetQuarkSize.AddArgument("quarksizeX", "The size on x axis of each quark", "Integer"); | ||||
|             // cmdSyncSetQuarkSize.AddArgument("quarksizeY", "The size on y axis of each quark", "Integer"); | ||||
| 
 | ||||
|             // m_commander.RegisterCommand("start", cmdSyncStart); | ||||
|             // m_commander.RegisterCommand("stop", cmdSyncStop); | ||||
|             m_commander.RegisterCommand("status", cmdSyncStatus); | ||||
|             // m_commander.RegisterCommand("quarkSpace", cmdSyncSetQuarks); | ||||
| 
 | ||||
|             lock (m_scene) | ||||
|             { | ||||
|                 // Add this to our scene so scripts can call these functions | ||||
|                 m_scene.RegisterModuleCommander(m_commander); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Processes commandline input. Do not call directly. | ||||
|         /// </summary> | ||||
|         /// <param name="args">Commandline arguments</param> | ||||
|         private void EventManager_OnPluginConsole(string[] args) | ||||
|         { | ||||
|             if (args[0] == "phys") | ||||
|             { | ||||
|                 if (args.Length == 1) | ||||
|                 { | ||||
|                     m_commander.ProcessConsoleCommand("help", new string[0]); | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 string[] tmpArgs = new string[args.Length - 2]; | ||||
|                 int i; | ||||
|                 for (i = 2; i < args.Length; i++) | ||||
|                     tmpArgs[i - 2] = args[i]; | ||||
| 
 | ||||
|                 m_commander.ProcessConsoleCommand(args[1], tmpArgs); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void SyncStart(Object[] args) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|         private void SyncStop(Object[] args) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|         private void SyncStatus(Object[] args) | ||||
|         { | ||||
|             lock (m_physEngineConnector_lock) | ||||
|             { | ||||
|                 if (m_physEngineConnectors.Count == 0) | ||||
|                 { | ||||
|                     m_log.Warn(LogHeader + " Not currently synchronized"); | ||||
|                     return; | ||||
|                 } | ||||
|                 m_log.Warn(LogHeader + " Synchronized"); | ||||
|                 foreach (SceneToPhysEngineConnector pec in m_physEngineConnectors) | ||||
|                 { | ||||
|                     m_log.Warn(pec.GetStats()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         // Check if any of the client views are in a connected state | ||||
|         public bool Synced | ||||
|         { | ||||
|             get | ||||
|             { | ||||
|                 return (m_physEngineConnectors.Count > 0); | ||||
|             } | ||||
|             get { return (m_physEngineConnectors.Count > 0); } | ||||
|         } | ||||
|         public static bool IsPhysEngineScene | ||||
|         { | ||||
|             get { return (m_syncServerInitialized != 0); } | ||||
|             get { return (SceneToPhysEngineSyncServer.m_syncServerInitialized > 0); } | ||||
|         } | ||||
|         public static bool IsPhysEngineScene2() | ||||
|         { | ||||
|             return (SceneToPhysEngineSyncServer.m_syncServerInitialized > 0); | ||||
|         } | ||||
|         public static bool IsActivePhysEngineScene | ||||
|         { | ||||
|             get { return (m_syncServerInitialized != 0 && m_totalConnections != 0); } | ||||
|             get { | ||||
|                 System.Console.WriteLine("IsActivePhysEngineScene: si={0} tc={1}",  | ||||
|                     SceneToPhysEngineSyncServer.m_syncServerInitialized,  | ||||
|                     SceneToPhysEngineSyncServer.m_totalConnections); | ||||
|                 return (SceneToPhysEngineSyncServer.m_syncServerInitialized > 0  | ||||
|                                 && SceneToPhysEngineSyncServer.m_totalConnections > 0);  | ||||
|             } | ||||
|         } | ||||
|         public static bool IsActivePhysEngineScene2() | ||||
|         { | ||||
|             return (SceneToPhysEngineSyncServer.m_syncServerInitialized > 0  | ||||
|                             && SceneToPhysEngineSyncServer.m_totalConnections > 0);  | ||||
|         } | ||||
|         public static bool IsPhysEngineActor | ||||
|         { | ||||
|             get { return PhysEngineToSceneConnectorModule.IsPhysEngineActor; } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// The scene is unknown by ODE so we have to look through the scenes to | ||||
|         /// find the one with this PhysicsActor so we can send the update. | ||||
|         /// </summary> | ||||
|         /// <param name="pa"></param> | ||||
|         public static void RouteUpdate(PhysicsActor pa) | ||||
|         { | ||||
|             SceneObjectPart sop = null; | ||||
|             Scene s = null; | ||||
|             foreach (Scene ss in m_allScenes) | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     sop = ss.GetSceneObjectPart(pa.LocalID); | ||||
|                 } | ||||
|                 catch | ||||
|                 { | ||||
|                     sop = null; | ||||
|                 } | ||||
|                 if (sop != null) | ||||
|                 { | ||||
|                     s = ss; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             if (s != null) | ||||
|             { | ||||
|                 if (s.SceneToPhysEngineSyncServer != null) | ||||
|                 { | ||||
|                     s.SceneToPhysEngineSyncServer.SendUpdate(pa); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     Console.WriteLine("RouteUpdate: SceneToPhysEngineSyncServer is no available"); | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 Console.WriteLine("RouteUpdate: no SOP for update"); | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         public void SendUpdate(PhysicsActor pa) | ||||
|         { | ||||
|             // m_log.DebugFormat("{0}: SendUpdate for {1}", LogHeader, pa.LocalID); | ||||
|             this.m_sceneToPhysEngineConnector.SendPhysUpdateAttributes(pa); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         // Constructor | ||||
|  | @ -126,8 +280,18 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             m_addr = IPAddress.Parse(addr); | ||||
|             m_port = port; | ||||
| 
 | ||||
|             m_scene.RegisterModuleInterface<ISceneToPhysEngineServer>(this); | ||||
| 
 | ||||
|             // remember all the scenes that are configured for connection to physics engine | ||||
|             if (!m_allScenes.Contains(m_scene)) | ||||
|             { | ||||
|                 m_allScenes.Add(m_scene); | ||||
|             } | ||||
| 
 | ||||
|             InitQuarksInScene(); | ||||
|             SubscribeToEvents(); | ||||
|             m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole; | ||||
|             InstallInterfaces(); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -142,12 +306,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         // Start the server | ||||
|         public void Start() | ||||
|         { | ||||
|             SceneToPhysEngineSyncServer.m_syncServerInitialized++; | ||||
|             m_listenerThread = new Thread(new ThreadStart(Listen)); | ||||
|             m_listenerThread.Name = "SceneToPhysEngineSyncServer Listener"; | ||||
|             m_log.WarnFormat(LogHeader + ": Starting {0} thread", m_listenerThread.Name); | ||||
|             m_log.DebugFormat("{0}: Starting {1} thread", LogHeader, m_listenerThread.Name); | ||||
|             m_listenerThread.Start(); | ||||
|             //m_log.Warn("[REGION SYNC SERVER] Started"); | ||||
|             m_syncServerInitialized++; | ||||
|             // m_log.DebugFormat("{0}: Started", LogHeader); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -155,7 +319,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         // Stop the server and disconnect all RegionSyncClients | ||||
|         public void Shutdown() | ||||
|         { | ||||
|             m_syncServerInitialized--; | ||||
|             m_log.DebugFormat("{0}: Shutdown", LogHeader); | ||||
|             SceneToPhysEngineSyncServer.m_syncServerInitialized--; | ||||
|             // Stop the listener and listening thread so no new clients are accepted | ||||
|             m_listener.Stop(); | ||||
|             m_listenerThread.Abort(); | ||||
|  | @ -197,12 +362,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         { | ||||
|             lock (m_physEngineConnector_lock) | ||||
|             { | ||||
|                 //Dictionary<string, SceneToPhysEngineConnector> currentlist = m_physEngineConnectors; | ||||
|                 //Dictionary<string, SceneToPhysEngineConnector> newlist = new Dictionary<string, SceneToPhysEngineConnector>(currentlist); | ||||
|                 m_physEngineConnectors.Add(peConnector); | ||||
|                 // Threads holding the previous version of the list can keep using it since | ||||
|                 // they will not hold it for long and get a new copy next time they need to iterate | ||||
|                 //m_physEngineConnectors = newlist; | ||||
|                 m_sceneToPhysEngineConnector = peConnector; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -237,6 +398,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                     TcpClient tcpclient = m_listener.AcceptTcpClient(); | ||||
|                     IPAddress addr = ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Address; | ||||
|                     int port = ((IPEndPoint)tcpclient.Client.RemoteEndPoint).Port; | ||||
|                     SceneToPhysEngineSyncServer.m_totalConnections++; | ||||
|                     // m_log.DebugFormat("{0}: m_totalConnections = {1}", LogHeader, SceneToPhysEngineSyncServer.m_totalConnections); | ||||
| 
 | ||||
|                     ActorStatus actorStatus = GetActorStatus(tcpclient); | ||||
| 
 | ||||
|  | @ -249,10 +412,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                             break; | ||||
|                         case ActorStatus.Idle: | ||||
|                             IdlePhysEngineInfo idleSE = new IdlePhysEngineInfo(tcpclient); | ||||
|                             m_log.Debug(": adding an idle SE ("+addr+","+port+")"); | ||||
|                             m_log.DebugFormat("{0}: adding an idle SE ({1}:{2})", LogHeader, addr, port); | ||||
|                             m_idlePhysEngineList.Add(idleSE); | ||||
|                             break; | ||||
|                         default: | ||||
|                             m_log.DebugFormat("{0}: Unknown actor status", LogHeader); | ||||
|                             break; | ||||
|                     } | ||||
| 
 | ||||
|  | @ -260,7 +424,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             } | ||||
|             catch (SocketException e) | ||||
|             { | ||||
|                 m_log.WarnFormat(LogHeader + " [Listen] SocketException: {0}", e); | ||||
|                 m_log.WarnFormat("{0}: [Listen] SocketException: {1}", LogHeader, e); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -30,6 +30,7 @@ | |||
| using OpenMetaverse; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| 
 | ||||
| namespace OpenSim.Region.Framework.Interfaces | ||||
| { | ||||
|  | @ -40,5 +41,6 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         // static bool IsActivePhysEngineScene { get; } | ||||
|         // static bool IsPhysEngineActor { get; } | ||||
|         bool DebugWithViewer { get; } | ||||
|         void SendUpdate(PhysicsActor pa); | ||||
|     } | ||||
| } | ||||
|  | @ -30,6 +30,7 @@ | |||
| using OpenMetaverse; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| 
 | ||||
| namespace OpenSim.Region.Framework.Interfaces | ||||
| { | ||||
|  | @ -39,5 +40,6 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         // static bool IsPhysEngineScene { get; } | ||||
|         // static bool IsActivePhysEngineScene { get; } | ||||
|         // static bool IsPhysEngineActor { get; } | ||||
|         void SendUpdate(PhysicsActor pa); | ||||
|     } | ||||
| } | ||||
|  | @ -415,28 +415,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         protected ISceneToPhysEngineServer m_sceneToPhysEngineSyncServer = null; | ||||
|         public ISceneToPhysEngineServer SceneToPhysEngineSyncServer | ||||
|         { | ||||
|             get { return m_sceneToPhysEngineSyncServer; } | ||||
|             get  | ||||
|             { | ||||
|                 if (m_sceneToPhysEngineSyncServer == null) | ||||
|                 { | ||||
|                     // kludge since this module is loaded in postInitialize | ||||
|                     m_sceneToPhysEngineSyncServer = RequestModuleInterface<ISceneToPhysEngineServer>(); | ||||
|                 } | ||||
|                 return m_sceneToPhysEngineSyncServer;  | ||||
|             } | ||||
|             set { m_sceneToPhysEngineSyncServer = value; } | ||||
|         } | ||||
| 
 | ||||
|         // list of physactors for this scene so we can find them later for remote physics | ||||
|         public Dictionary<uint, PhysicsActor> PhysActors = new Dictionary<uint, PhysicsActor>(); | ||||
|         public void AddPhysActor(uint id, PhysicsActor pActor) | ||||
|         { | ||||
|             if (PhysActors.ContainsKey(id)) { | ||||
|                 PhysActors.Remove(id); | ||||
|             } | ||||
|             PhysActors.Add(id, pActor); | ||||
|             return; | ||||
|         } | ||||
|         public void RemovePhysActor(uint id) | ||||
|         { | ||||
|             if (PhysActors.ContainsKey(id)) { | ||||
|                 PhysActors.Remove(id); | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         /////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| 
 | ||||
|         //This function should only be called by an actor who's local Scene is just a cache of the authorative Scene. | ||||
|  |  | |||
|  | @ -997,7 +997,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|                 if (m_rootPart.PhysActor != null) | ||||
|                 { | ||||
|                     Scene.RemovePhysActor(m_rootPart.PhysActor.LocalID); | ||||
|                     m_scene.PhysicsScene.RemovePrim(m_rootPart.PhysActor); | ||||
|                     m_rootPart.PhysActor = null; | ||||
|                 } | ||||
|  | @ -2275,7 +2274,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|                 //if (linkPart.PhysActor != null) | ||||
|                 //{ | ||||
|                 // m_scene.RemovePhysActor(linkPart.PhysActor.LocalID); | ||||
|                 // m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor); | ||||
|          | ||||
|                 //linkPart.PhysActor = null; | ||||
|  | @ -2390,7 +2388,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
|             if (linkPart.PhysActor != null) | ||||
|             { | ||||
|                 m_scene.RemovePhysActor(linkPart.PhysActor.LocalID); | ||||
|                 m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor); | ||||
|             } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1492,8 +1492,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                         PhysActor.SOPName = this.Name; // save object name and desc into the PhysActor so ODE internals know the joint/body info | ||||
|                         PhysActor.SOPDescription = this.Description; | ||||
|                         PhysActor.LocalID = LocalId; | ||||
|                         // RA: register PhysActor with the scene | ||||
|                         ParentGroup.Scene.AddPhysActor(LocalId, PhysActor); | ||||
|                         DoPhysicsPropertyUpdate(RigidBody, true); | ||||
|                         PhysActor.SetVolumeDetect(VolumeDetectActive ? 1 : 0); | ||||
|                     } | ||||
|  | @ -1756,7 +1754,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
| 
 | ||||
| 
 | ||||
|                         // If we're not what we're supposed to be in the physics scene, recreate ourselves. | ||||
|                         //ParentGroup.Scene.RemovePhysActor(PhysActor.LocalID); | ||||
|                         //m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor); | ||||
|                         /// that's not wholesome.  Had to make Scene public | ||||
|                         //PhysActor = null; | ||||
|  | @ -4286,7 +4283,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                 AddFlag(PrimFlags.Phantom); | ||||
|                 if (PhysActor != null) | ||||
|                 { | ||||
|                     ParentGroup.Scene.RemovePhysActor(PhysActor.LocalID); | ||||
|                     m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor); | ||||
|                     /// that's not wholesome.  Had to make Scene public | ||||
|                     PhysActor = null; | ||||
|  | @ -4312,8 +4308,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                     if (pa != null) | ||||
|                     { | ||||
|                         pa.LocalID = LocalId; | ||||
|                         // RA: register PhysActor with scene | ||||
|                         ParentGroup.Scene.AddPhysActor(LocalId, PhysActor); | ||||
|                         DoPhysicsPropertyUpdate(UsePhysics, true); | ||||
|                         if (m_parentGroup != null) | ||||
|                         { | ||||
|  |  | |||
|  | @ -115,6 +115,39 @@ namespace OpenSim.Region.Physics.Manager | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /// <summary> | ||||
|     /// Structure to hold previous values of the PhysicsActor. This is used to see | ||||
|     /// if the values changed before sending updates to the Physics Engine. | ||||
|     /// </summary> | ||||
|     public struct PhysActorLastValues | ||||
|     { | ||||
|         public uint localID; | ||||
|         public Vector3 size; | ||||
|         public Vector3 position; | ||||
|         public Vector3 force; | ||||
|         public Vector3 velocity; | ||||
|         public Vector3 torque; | ||||
|         public Quaternion orientation; | ||||
|         public Boolean isPhysical; | ||||
|         public Boolean flying; | ||||
|         public double buoyancy; | ||||
|         public bool Changed(PhysicsActor pa) | ||||
|         { | ||||
|             bool ret = false; | ||||
|             if (localID != pa.LocalID) { localID = pa.LocalID; ret = true; } | ||||
|             if (size != pa.Size) { size = pa.Size; ret = true; } | ||||
|             if (position != pa.Position) { position = pa.Position; ret = true; } | ||||
|             if (force != pa.Force) { force = pa.Force; ret = true; } | ||||
|             if (velocity != pa.Velocity) { velocity = pa.Velocity; ret = true; } | ||||
|             if (torque != pa.Torque) { torque = pa.Torque; ret = true; } | ||||
|             if (orientation != pa.Orientation) { orientation = pa.Orientation; ret = true; } | ||||
|             if (isPhysical != pa.IsPhysical) { isPhysical = pa.IsPhysical; ret = true; } | ||||
|             if (flying != pa.Flying) { flying = pa.Flying; ret = true; } | ||||
|             if (buoyancy != pa.Buoyancy) { buoyancy = pa.Buoyancy; ret = true; } | ||||
|             return ret; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public abstract class PhysicsActor | ||||
|     { | ||||
|         public delegate void RequestTerseUpdate(); | ||||
|  | @ -144,6 +177,7 @@ namespace OpenSim.Region.Physics.Manager | |||
| 
 | ||||
|         // RA: used to be abstract but changed to allow 'get' without changing all the phys engines | ||||
|         public virtual uint LocalID { set { return; } get { return 0; } } | ||||
|         public PhysActorLastValues lastValues; | ||||
| 
 | ||||
|         public abstract bool Grabbed { set; } | ||||
| 
 | ||||
|  |  | |||
|  | @ -32,6 +32,7 @@ using OpenMetaverse; | |||
| using Ode.NET; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| using OpenSim.Region.CoreModules.RegionSync.RegionSyncModule; | ||||
| using log4net; | ||||
| 
 | ||||
| namespace OpenSim.Region.Physics.OdePlugin | ||||
|  | @ -202,6 +203,19 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|             m_name = avName; | ||||
|         } | ||||
| 
 | ||||
|         public override void RequestPhysicsterseUpdate() | ||||
|         { | ||||
|             if (PhysEngineToSceneConnectorModule.IsPhysEngineActor) | ||||
|             { | ||||
|                 m_log.DebugFormat("[ODE CHARACTER]: Sending terse update for {0}", LocalID); | ||||
|                 PhysEngineToSceneConnectorModule.RouteUpdate(this); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 base.RequestPhysicsterseUpdate(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public override int PhysicsActorType | ||||
|         { | ||||
|             get { return (int) ActorTypes.Agent; } | ||||
|  |  | |||
|  | @ -47,7 +47,9 @@ using log4net; | |||
| using OpenMetaverse; | ||||
| using Ode.NET; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Region.Framework; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| using OpenSim.Region.CoreModules.RegionSync.RegionSyncModule; | ||||
| 
 | ||||
| namespace OpenSim.Region.Physics.OdePlugin | ||||
| { | ||||
|  | @ -252,6 +254,18 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
|             //  don't do .add() here; old geoms get recycled with the same hash | ||||
|         } | ||||
| 
 | ||||
|         public override void RequestPhysicsterseUpdate() | ||||
|         { | ||||
|             if (PhysEngineToSceneConnectorModule.IsPhysEngineActor) | ||||
|             { | ||||
|                 PhysEngineToSceneConnectorModule.RouteUpdate(this); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 base.RequestPhysicsterseUpdate(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public override int PhysicsActorType | ||||
|         { | ||||
|             get { return (int) ActorTypes.Prim; } | ||||
|  | @ -2641,7 +2655,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
|                             _position = l_position; | ||||
|                             //_parent_scene.remActivePrim(this); | ||||
|                             if (_parent == null) | ||||
|                                 base.RequestPhysicsterseUpdate(); | ||||
|                                 RequestPhysicsterseUpdate(); | ||||
|                             return; | ||||
|                         } | ||||
|                         else | ||||
|  | @ -2676,7 +2690,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
|                         m_rotationalVelocity.Z = 0; | ||||
| 
 | ||||
|                         if (_parent == null) | ||||
|                             base.RequestPhysicsterseUpdate(); | ||||
|                             RequestPhysicsterseUpdate(); | ||||
| 
 | ||||
|                         m_throttleUpdates = false; | ||||
|                         throttleCounter = 0; | ||||
|  | @ -2729,7 +2743,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
| 
 | ||||
|                             if (_parent == null) | ||||
|                             { | ||||
|                                 base.RequestPhysicsterseUpdate(); | ||||
|                                 RequestPhysicsterseUpdate(); | ||||
|                             } | ||||
| 
 | ||||
|                             m_lastUpdateSent = true; | ||||
|  | @ -2741,7 +2755,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
|                         { | ||||
|                             if (_parent == null) | ||||
|                             { | ||||
|                                 base.RequestPhysicsterseUpdate(); | ||||
|                                 RequestPhysicsterseUpdate(); | ||||
|                             } | ||||
|                         } | ||||
| 
 | ||||
|  | @ -2776,7 +2790,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
|                         { | ||||
|                             if (_parent == null) | ||||
|                             { | ||||
|                                 base.RequestPhysicsterseUpdate(); | ||||
|                                 RequestPhysicsterseUpdate(); | ||||
|                             } | ||||
|                         } | ||||
|                         else | ||||
|  |  | |||
|  | @ -77,6 +77,8 @@ public class PECharacter : PhysicsActor | |||
|                     float capsule_radius, float tensor, float density, float height_fudge_factor,  | ||||
|                     float walk_divisor, float rundivisor) | ||||
|     { | ||||
|         _position = pos; | ||||
|         _size = size; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|  | @ -100,7 +102,7 @@ public class PECharacter : PhysicsActor | |||
|         set { _localID = value;  | ||||
|             m_log.Debug("[RPE] PEChar set LocalID"); | ||||
|             Prop.Set(_localID, PropType.LocalID, _localID); | ||||
|         } | ||||
|         } | ||||
|         get { return _localID; } | ||||
|     } | ||||
|     public override bool Grabbed {  | ||||
|  | @ -123,7 +125,7 @@ public class PECharacter : PhysicsActor | |||
|     public override Vector3 Position {  | ||||
|         get { return _position; }  | ||||
|         set { _position = value;  | ||||
|             // m_log.Debug("[RPE] PEChar set Position"); | ||||
|             // m_log.DebugFormat("[RPE] PEChar set Position: {0}", _position); | ||||
|             Prop.Set(_localID, PropType.Position, _position); | ||||
|         }  | ||||
|     } | ||||
|  | @ -155,6 +157,7 @@ public class PECharacter : PhysicsActor | |||
|     public override Vector3 Velocity {  | ||||
|         get { return _velocity; }  | ||||
|         set { _velocity = value;  | ||||
|             m_log.Debug("[RPE] PEChar set Velocity"); | ||||
|             Prop.Set(_localID, PropType.Velocity, _velocity); | ||||
|         }  | ||||
|     } | ||||
|  |  | |||
|  | @ -78,6 +78,9 @@ public sealed class PEPrim : PhysicsActor | |||
|     public PEPrim(String primName, PEScene parent_scene, Vector3 pos, Vector3 size, | ||||
|                        Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) | ||||
|     { | ||||
|         _position = pos; | ||||
|         _size = size; | ||||
|         _orientation = rotation; | ||||
|         // SendCreatePrim(primName, parent_scene, pos, size, rotation, mesh, pbs, pisPhysical, dode); | ||||
|     } | ||||
|      | ||||
|  |  | |||
|  | @ -30,6 +30,8 @@ using log4net; | |||
| using OpenSim.Framework; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| using OpenMetaverse; | ||||
| using OpenSim.Region.Framework; | ||||
| using OpenSim.Region.CoreModules.RegionSync.RegionSyncModule; | ||||
| 
 | ||||
| namespace OpenSim.Region.Physics.PEPlugin | ||||
| { | ||||
|  | @ -98,6 +100,29 @@ public class PEScene : PhysicsScene | |||
| 
 | ||||
|     public override float Simulate(float timeStep) | ||||
|     { | ||||
|         // if we are a physics engine server, send update information | ||||
|         if (SceneToPhysEngineSyncServer.IsPhysEngineScene2()) | ||||
|         { | ||||
|             if (SceneToPhysEngineSyncServer.IsActivePhysEngineScene2()) | ||||
|             { | ||||
|                 // m_log.DebugFormat("[RPE]: Simulate. p={0}, a={1}", m_prims.Count, m_avatars.Count); | ||||
|                 foreach (PEPrim prim in m_prims) | ||||
|                 { | ||||
|                     if (prim.lastValues.Changed(prim)) | ||||
|                     { | ||||
|                         SceneToPhysEngineSyncServer.RouteUpdate(prim); | ||||
|                     } | ||||
|                 } | ||||
|                 foreach (PECharacter actor in m_avatars) | ||||
|                 { | ||||
|                     m_log.DebugFormat("[RPE]: Simulate. p={0}, a={1}", m_prims.Count, m_avatars.Count); | ||||
|                     SceneToPhysEngineSyncServer.RouteUpdate(actor); | ||||
|                 } | ||||
|             } | ||||
|             return 60f; | ||||
|         } | ||||
|         /* | ||||
|         // code borrowed from BasicPhysics to do just avatar movement | ||||
|         foreach (PECharacter actor in m_avatars) | ||||
|         { | ||||
|             Vector3 actorPosition = actor.Position; | ||||
|  | @ -146,6 +171,7 @@ public class PEScene : PhysicsScene | |||
|             actor.Position = actorPosition; | ||||
|             actor.Velocity = actorVelocity; | ||||
|         } | ||||
|          */ | ||||
|         return 60f; // returns frames per second | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							|  | @ -534,6 +534,7 @@ | |||
|       <Reference name="Nini.dll" /> | ||||
|       <Reference name="OpenSim.Framework"/> | ||||
|       <Reference name="OpenSim.Region.CoreModules"/> | ||||
|       <Reference name="OpenSim.Region.Framework"/> | ||||
|       <Reference name="OpenSim.Framework.Console"/> | ||||
|       <Reference name="OpenSim.Region.Physics.Manager"/> | ||||
|       <Reference name="Ode.NET.dll" /> | ||||
|  | @ -565,6 +566,7 @@ | |||
|       <Reference name="OpenMetaverseTypes.dll"/> | ||||
|       <Reference name="Nini.dll" /> | ||||
|       <Reference name="OpenSim.Framework"/> | ||||
|       <Reference name="OpenSim.Region.Framework"/> | ||||
|       <Reference name="OpenSim.Region.CoreModules"/> | ||||
|       <Reference name="OpenSim.Framework.Console"/> | ||||
|       <Reference name="OpenSim.Region.Physics.Manager"/> | ||||
|  | @ -3180,6 +3182,8 @@ | |||
|       <Reference name="Nini.dll" /> | ||||
|       <Reference name="OpenSim.Framework"/> | ||||
|       <Reference name="OpenSim.Framework.Console"/> | ||||
|       <Reference name="OpenSim.Region.CoreModules"/> | ||||
|       <Reference name="OpenSim.Region.Framework"/> | ||||
|       <Reference name="OpenSim.Region.Physics.Manager"/> | ||||
|       <Reference name="Ode.NET.dll" /> | ||||
|       <Reference name="nunit.framework.dll" /> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Robert Adams
						Robert Adams