PhysActor update messages working. Avatar and prim neither move nor position correctly

dsg
Robert Adams 2010-12-08 17:19:06 -08:00
parent 5c6f0878a1
commit a036426f18
18 changed files with 555 additions and 147 deletions

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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

View File

@ -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
@ -258,6 +260,26 @@ 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)

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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.

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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; }

View File

@ -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; }

View File

@ -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

View File

@ -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;
}
@ -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);
}
}

View File

@ -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);
}

View File

@ -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.

View File

@ -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" />