Create full updates for making sit complete

dsg
Robert Adams 2010-10-25 13:32:53 -07:00
parent 5eca61585d
commit 838ffc27ed
5 changed files with 74 additions and 18 deletions

View File

@ -335,7 +335,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
//m_scene.EventManager.OnFrame += Update; //m_scene.EventManager.OnFrame += Update;
} }
public RegionSyncAvatar(Scene scene, UUID agentID, string first, string last, Vector3 startPos, RegionSyncClientView view) public RegionSyncAvatar(Scene scene, UUID agentID, string first, string last, Vector3 startPos,
RegionSyncClientView view)
{ {
m_scene = scene; m_scene = scene;
m_agentID = agentID; m_agentID = agentID;
@ -493,23 +494,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs) public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
{ {
m_log.Debug("[REGION SYNC AVATAR] SendAnimations");
if (m_clientView != null) if (m_clientView != null)
{ {
OSDMap data = new OSDMap(); // m_log.Debug("[REGION SYNC AVATAR] SendAnimations");
data["agentID"] = OSD.FromUUID(m_agentID); m_scene.RegionSyncServerModule.SendAnimations(m_agentID, animations, seqs, sourceAgentId, objectIDs);
OSDArray animatA = new OSDArray();
foreach (UUID uu in animations) animatA.Add(OSD.FromUUID(uu));
data["animations"] = animatA;
OSDArray seqsA = new OSDArray();
foreach (int ss in seqs) seqsA.Add(OSD.FromInteger(ss));
data["seqs"] = seqsA;
data["sourceAgentID"] = OSD.FromUUID(sourceAgentId);
OSDArray obIDA = new OSDArray();
foreach (UUID ii in objectIDs) obIDA.Add(OSD.FromUUID(ii));
data["objectIDs"] = obIDA;
RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.SendAnimations, OSDParser.SerializeJsonString(data));
m_clientView.Send(rsm);
} }
} }

View File

@ -408,6 +408,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
bool flying = false; bool flying = false;
string anim = ""; string anim = "";
uint flags = 0; uint flags = 0;
Vector4 collisionPlane = Vector4.Zero;
Vector3 offsetPosition = Vector3.Zero;
uint parentID = 0;
bool doFullUpdate = false;
try try
{ {
@ -418,6 +422,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
flying = data["fly"].AsBoolean(); flying = data["fly"].AsBoolean();
anim = data["anim"].AsString(); anim = data["anim"].AsString();
flags = data["flags"].AsUInteger(); flags = data["flags"].AsUInteger();
// do we have the data for a full update?
OSD valTemp = null;
data.TryGetValue("coll", out valTemp);
if (valTemp != null)
{
collisionPlane = valTemp.AsVector4();
offsetPosition = data["off"].AsVector3();
parentID = data["pID"].AsUInteger();
doFullUpdate = true;
}
} }
catch (Exception e) catch (Exception e)
{ {
@ -476,15 +490,28 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
presence.PhysicsActor.Flying = flying; presence.PhysicsActor.Flying = flying;
presence.PhysicsActor.CollidingGround = !flying; presence.PhysicsActor.CollidingGround = !flying;
} }
if (doFullUpdate)
{
presence.CollisionPlane = collisionPlane;
presence.OffsetPosition = offsetPosition;
presence.ParentID = parentID;
}
} }
catch(Exception e) catch(Exception e)
{ {
m_log.ErrorFormat("{0} Caught exception in UpdatedAvatar handler (setting presence values) for {1}: {2}", LogHeader, presence.Name, e.Message); m_log.ErrorFormat("{0} Caught exception in UpdatedAvatar handler (setting presence values) for {1}: {2}", LogHeader, presence.Name, e.Message);
} }
try try
{
if (doFullUpdate)
{
presence.SendFullUpdateToAllClients();
}
else
{ {
presence.SendTerseUpdateToAllClients(); presence.SendTerseUpdateToAllClients();
} }
}
catch (Exception e) catch (Exception e)
{ {
m_log.ErrorFormat("{0} Caught exception in UpdatedAvatar handler (SendTerseUpdateToAllClients): {1}", LogHeader, e.Message); m_log.ErrorFormat("{0} Caught exception in UpdatedAvatar handler (SendTerseUpdateToAllClients): {1}", LogHeader, e.Message);
@ -720,6 +747,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
} }
UUID agentID = data["agentID"].AsUUID(); UUID agentID = data["agentID"].AsUUID();
// m_log.DebugFormat("{0} SendAnimations for {1}", LogHeader, agentID.ToString());
OSDArray animatA = (OSDArray)data["animations"]; OSDArray animatA = (OSDArray)data["animations"];
UUID[] animIDs = new UUID[animatA.Count]; UUID[] animIDs = new UUID[animatA.Count];
@ -741,6 +769,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
{ {
sp.ControllingClient.SendAnimations(animIDs, seqs, sourceAgentID, objectIDs); sp.ControllingClient.SendAnimations(animIDs, seqs, sourceAgentID, objectIDs);
} }
else
{
m_log.WarnFormat("{0} Could not send animation for {1} because scene presence not found",
LogHeader, agentID.ToString());
}
return; return;
} }
case RegionSyncMessage.MsgType.BalanceClientLoad: case RegionSyncMessage.MsgType.BalanceClientLoad:

View File

@ -283,7 +283,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
{ {
if (!presence.IsDeleted) if (!presence.IsDeleted)
{ {
OSDMap data = new OSDMap(7); OSDMap data = new OSDMap(10);
data["id"] = OSD.FromUUID(presence.UUID); data["id"] = OSD.FromUUID(presence.UUID);
// Do not include offset for appearance height. That will be handled by RegionSyncClient before sending to viewers // Do not include offset for appearance height. That will be handled by RegionSyncClient before sending to viewers
if(presence.AbsolutePosition.IsFinite()) if(presence.AbsolutePosition.IsFinite())
@ -298,6 +298,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
data["fly"] = OSD.FromBoolean(presence.Flying); data["fly"] = OSD.FromBoolean(presence.Flying);
data["flags"] = OSD.FromUInteger((uint)presence.AgentControlFlags); data["flags"] = OSD.FromUInteger((uint)presence.AgentControlFlags);
data["anim"] = OSD.FromString(presence.Animator.CurrentMovementAnimation); data["anim"] = OSD.FromString(presence.Animator.CurrentMovementAnimation);
// needed for a full update
if (presence.ParentID != presence.lastSentParentID)
{
data["coll"] = OSD.FromVector4(presence.CollisionPlane);
data["off"] = OSD.FromVector3(presence.OffsetPosition);
data["pID"] = OSD.FromUInteger(presence.ParentID);
presence.lastSentParentID = presence.ParentID;
}
RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.UpdatedAvatar, OSDParser.SerializeJsonString(data)); RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.UpdatedAvatar, OSDParser.SerializeJsonString(data));
m_server.EnqueuePresenceUpdate(presence.UUID, rsm.ToBytes()); m_server.EnqueuePresenceUpdate(presence.UUID, rsm.ToBytes());
@ -344,6 +353,25 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
m_appearanceTimers[agentID] = appearanceSetter; m_appearanceTimers[agentID] = appearanceSetter;
} }
public void SendAnimations(UUID agentID, UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
{
OSDMap data = new OSDMap();
data["agentID"] = OSD.FromUUID(agentID);
OSDArray animatA = new OSDArray();
foreach (UUID uu in animations) animatA.Add(OSD.FromUUID(uu));
data["animations"] = animatA;
OSDArray seqsA = new OSDArray();
foreach (int ss in seqs) seqsA.Add(OSD.FromInteger(ss));
data["seqs"] = seqsA;
data["sourceAgentID"] = OSD.FromUUID(sourceAgentId);
OSDArray obIDA = new OSDArray();
foreach (UUID ii in objectIDs) obIDA.Add(OSD.FromUUID(ii));
data["objectIDs"] = obIDA;
RegionSyncMessage rsm = new RegionSyncMessage(RegionSyncMessage.MsgType.SendAnimations, OSDParser.SerializeJsonString(data));
m_server.Broadcast(rsm);
// m_clientView.Send(rsm);
}
public void DeleteObject(ulong regionHandle, uint localID, SceneObjectPart part) public void DeleteObject(ulong regionHandle, uint localID, SceneObjectPart part)
{ {
if (!Active || !Synced) if (!Active || !Synced)

View File

@ -44,6 +44,7 @@ namespace OpenSim.Region.Framework.Interfaces
//void DeleteObject(ulong regionHandle, uint localID); //void DeleteObject(ulong regionHandle, uint localID);
void DeleteObject(ulong regionHandle, uint localID, SceneObjectPart part); void DeleteObject(ulong regionHandle, uint localID, SceneObjectPart part);
void SendAppearance(UUID agentID, byte[] vp, Primitive.TextureEntry te); void SendAppearance(UUID agentID, byte[] vp, Primitive.TextureEntry te);
void SendAnimations(UUID agentID, UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs);
//KittyL: added to support remote script engine actor //KittyL: added to support remote script engine actor
//void SendRezScript(SceneObjectGroup sog); //void SendRezScript(SceneObjectGroup sog);

View File

@ -126,6 +126,9 @@ namespace OpenSim.Region.Framework.Scenes
private Vector3 m_lastPosition; private Vector3 m_lastPosition;
private Quaternion m_lastRotation; private Quaternion m_lastRotation;
private Vector3 m_lastVelocity; private Vector3 m_lastVelocity;
// RA: following kludge lets us remember if we need to send a full update
// Used in RegionSyncServerModule
public uint lastSentParentID;
//private int m_lastTerseSent; //private int m_lastTerseSent;
private bool m_updateflag; private bool m_updateflag;
@ -2525,7 +2528,10 @@ namespace OpenSim.Region.Framework.Scenes
// REGION SYNC // REGION SYNC
// The server should not be doing anything via the ForEachScenePresence method // The server should not be doing anything via the ForEachScenePresence method
if (m_scene.IsSyncedServer()) if (m_scene.IsSyncedServer())
{
m_scene.RegionSyncServerModule.QueuePresenceForTerseUpdate(this);
return; return;
}
m_perfMonMS = Util.EnvironmentTickCount(); m_perfMonMS = Util.EnvironmentTickCount();
// only send update from root agents to other clients; children are only "listening posts" // only send update from root agents to other clients; children are only "listening posts"