From 7cc906213795fbe4878c0cfb8351272e847617e9 Mon Sep 17 00:00:00 2001 From: diva Date: Tue, 17 Feb 2009 00:35:52 +0000 Subject: [PATCH] Major change to how appearance is managed, including changes in login and user service/server. Appearance is now sent by the user service/server along with all other loginparams. Regions don't query the user service for appearance anymore. The appearance is passed along from region to region as the avie moves around. And, as before, it's stored back with the user service as the client changes the avie's appearance. Child agents have default appearances that are set to the actual appearance when the avie moves to that region. (as before, child agents are invisible and non-physical). --- OpenSim/Framework/AgentCircuitData.cs | 1 + OpenSim/Framework/AgentCircuitManager.cs | 7 ++ OpenSim/Framework/AvatarAppearance.cs | 2 +- OpenSim/Framework/Login.cs | 1 + OpenSim/Grid/UserServer/UserLoginService.cs | 10 +++ .../Local/LocalBackEndServices.cs | 7 ++ .../Communications/Local/LocalLoginService.cs | 3 + .../Communications/OGS1/OGS1GridServices.cs | 6 +- OpenSim/Region/Framework/Scenes/Scene.cs | 38 ++++++---- .../Region/Framework/Scenes/ScenePresence.cs | 75 ++++++++++++++++--- 10 files changed, 121 insertions(+), 29 deletions(-) diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index 1c37601524..bcd4c096fd 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs @@ -35,6 +35,7 @@ namespace OpenSim.Framework public class AgentCircuitData { public UUID AgentID; + public AvatarAppearance Appearance; public UUID BaseFolder; public string CapsPath = String.Empty; public Dictionary ChildrenCapSeeds; diff --git a/OpenSim/Framework/AgentCircuitManager.cs b/OpenSim/Framework/AgentCircuitManager.cs index 56b40bdad3..cf333afbbf 100644 --- a/OpenSim/Framework/AgentCircuitManager.cs +++ b/OpenSim/Framework/AgentCircuitManager.cs @@ -103,6 +103,13 @@ namespace OpenSim.Framework } } + public AgentCircuitData GetAgentCircuitData(uint circuitCode) + { + AgentCircuitData agentCircuit = null; + AgentCircuits.TryGetValue(circuitCode, out agentCircuit); + return agentCircuit; + } + public void UpdateAgentData(AgentCircuitData agentData) { if (AgentCircuits.ContainsKey((uint) agentData.circuitcode)) diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index ad95f78cc6..52041bbf01 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -286,7 +286,7 @@ namespace OpenSim.Framework + 0.07f * (float)m_visualparams[78] / 255.0f // Shoe platform height + 0.3836f * (float)m_visualparams[125] / 255.0f // Leg length - m_avatarHeight / 2) * 0.3f - 0.04f; - //System.Console.WriteLine("Height {0} Hip offset {1}", m_avatarHeight, m_hipOffset); + //System.Console.WriteLine("[APPEARANCE]: Height {0} Hip offset {1}", m_avatarHeight, m_hipOffset); } public virtual void SetWearable(int wearableId, AvatarWearable wearable) diff --git a/OpenSim/Framework/Login.cs b/OpenSim/Framework/Login.cs index 61fffd2bd3..5913c4b900 100644 --- a/OpenSim/Framework/Login.cs +++ b/OpenSim/Framework/Login.cs @@ -42,6 +42,7 @@ namespace OpenSim.Framework public UUID SecureSession = UUID.Zero; public UUID Session; public Vector3 StartPos; + public AvatarAppearance Appearance; public Login() { diff --git a/OpenSim/Grid/UserServer/UserLoginService.cs b/OpenSim/Grid/UserServer/UserLoginService.cs index d069e1a68b..4878c03005 100644 --- a/OpenSim/Grid/UserServer/UserLoginService.cs +++ b/OpenSim/Grid/UserServer/UserLoginService.cs @@ -396,6 +396,16 @@ namespace OpenSim.Grid.UserServer loginParams["regionhandle"] = user.CurrentAgent.Handle.ToString(); loginParams["caps_path"] = capsPath; + // Get appearance + AvatarAppearance appearance = m_userManager.GetUserAppearance(user.ID); + if (appearance != null) + { + loginParams["appearance"] = appearance.ToHashTable(); + m_log.DebugFormat("[LOGIN]: Found appearance for {0}, {1}", user.FirstName, user.SurName); + } + else + m_log.DebugFormat("[LOGIN]: Appearance not for {0}, {1}", user.FirstName, user.SurName); + ArrayList SendParams = new ArrayList(); SendParams.Add(loginParams); diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs index 5df3c34c9e..7ca29ca3a6 100644 --- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs @@ -441,6 +441,13 @@ namespace OpenSim.Region.Communications.Local agent.InventoryFolder = loginData.InventoryFolder; agent.startpos = loginData.StartPos; agent.CapsPath = loginData.CapsPath; + if (agent.Appearance != null) + agent.Appearance = loginData.Appearance; + else + { + m_log.WarnFormat("[INTER]: Appearance not found for {0} {1}. Creating default.", agent.firstname, agent.lastname); + agent.Appearance = new AvatarAppearance(); + } TriggerExpectUser(regionHandle, agent); } diff --git a/OpenSim/Region/Communications/Local/LocalLoginService.cs b/OpenSim/Region/Communications/Local/LocalLoginService.cs index 5de812cdfa..4e0ed13393 100644 --- a/OpenSim/Region/Communications/Local/LocalLoginService.cs +++ b/OpenSim/Region/Communications/Local/LocalLoginService.cs @@ -359,6 +359,9 @@ namespace OpenSim.Region.Communications.Local loginParams.StartPos = user.CurrentAgent.Position; loginParams.CapsPath = capsPath; + // Appearance + loginParams.Appearance = m_userManager.GetUserAppearance(user.ID); + if (m_gridService.RegionLoginsEnabled) { handlerLoginToRegion = OnLoginToRegion; diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index 0ec19a881d..1da76210c0 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -610,9 +610,13 @@ namespace OpenSim.Region.Communications.OGS1 agentData.lastname = (string) requestData["lastname"]; agentData.AgentID = new UUID((string) requestData["agent_id"]); agentData.circuitcode = Convert.ToUInt32(requestData["circuit_code"]); - agentData.CapsPath = (string) requestData["caps_path"]; + agentData.CapsPath = (string)requestData["caps_path"]; ulong regionHandle = Convert.ToUInt64((string) requestData["regionhandle"]); + // Appearance + if (requestData["appearance"] != null) + agentData.Appearance = new AvatarAppearance((Hashtable)requestData["appearance"]); + m_log.DebugFormat( "[CLIENT]: Told by user service to prepare for a connection from {0} {1} {2}, circuit {3}", agentData.firstname, agentData.lastname, agentData.AgentID, agentData.circuitcode); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index c3ab5e9839..5badd2d897 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2089,8 +2089,8 @@ namespace OpenSim.Region.Framework.Scenes /// protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client) { - AvatarAppearance appearance = new AvatarAppearance(); - //GetAvatarAppearance(client, out appearance); + AvatarAppearance appearance = null; + GetAvatarAppearance(client, out appearance); ScenePresence avatar = m_sceneGraph.CreateAndAddChildScenePresence(client, appearance); //avatar.KnownRegions = GetChildrenSeeds(avatar.UUID); @@ -2104,23 +2104,29 @@ namespace OpenSim.Region.Framework.Scenes /// public void GetAvatarAppearance(IClientAPI client, out AvatarAppearance appearance) { - appearance = new AvatarAppearance(); - - try + AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); + appearance = aCircuit.Appearance; + if (appearance == null) { - if (m_AvatarFactory != null) - { - if (m_AvatarFactory.TryGetAvatarAppearance(client.AgentId, out appearance)) - return; - } - } - catch (Exception e) - { - m_log.ErrorFormat("[APPEARANCE]: Problem fetching appearance for avatar {0}, {1}", - client.Name, e); + m_log.DebugFormat("[APPEARANCE]: Appearance not found in {0}, returning default", RegionInfo.RegionName); + appearance = new AvatarAppearance(); } + + //try + //{ + // if (m_AvatarFactory != null) + // { + // if (m_AvatarFactory.TryGetAvatarAppearance(client.AgentId, out appearance)) + // return; + // } + //} + //catch (Exception e) + //{ + // m_log.ErrorFormat("[APPEARANCE]: Problem fetching appearance for avatar {0}, {1}", + // client.Name, e); + //} - m_log.Warn("[APPEARANCE]: Appearance not found, returning default"); + //m_log.Warn("[APPEARANCE]: Appearance not found, returning default"); } /// diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 42a429d3f9..f06afc01d9 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -816,14 +816,14 @@ namespace OpenSim.Region.Framework.Scenes // Moved this from SendInitialData to ensure that m_appearance is initialized // before the inventory is processed in MakeRootAgent. This fixes a race condition // related to the handling of attachments - m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); + //m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); if (pos.X < 0 || pos.X > Constants.RegionSize || pos.Y < 0 || pos.Y > Constants.RegionSize || pos.Z < 0) { Vector3 emergencyPos = new Vector3(128, 128, 128); m_log.WarnFormat( - "[SCENE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", + "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}", pos, Name, UUID, emergencyPos); pos = emergencyPos; @@ -845,8 +845,17 @@ namespace OpenSim.Region.Framework.Scenes AbsolutePosition = pos; AddToPhysicalScene(isFlying); - if ((m_appearance != null) && (m_appearance.AvatarHeight > 0)) - SetHeight(m_appearance.AvatarHeight); + if (m_appearance != null) + { + if (m_appearance.AvatarHeight > 0) + SetHeight(m_appearance.AvatarHeight); + } + else + { + m_log.ErrorFormat("[SCENE PRESENCE]: null appearance in MakeRoot in {0}", Scene.RegionInfo.RegionName); + // emergency; this really shouldn't happen + m_appearance = new AvatarAppearance(); + } // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying // avatar to return to the standing position in mid-air. On login it looks like this is being sent @@ -2573,7 +2582,8 @@ namespace OpenSim.Region.Framework.Scenes cAgent.Position = m_pos; cAgent.Velocity = m_velocity; cAgent.Center = m_CameraCenter; - cAgent.Size = new Vector3(0, 0, m_avHeight); + // Don't copy the size; it is inferred from apearance parameters + //cAgent.Size = new Vector3(0, 0, m_avHeight); cAgent.AtAxis = m_CameraAtAxis; cAgent.LeftAxis = m_CameraLeftAxis; cAgent.UpAxis = m_CameraUpAxis; @@ -2605,13 +2615,37 @@ namespace OpenSim.Region.Framework.Scenes cAgent.AlwaysRun = m_setAlwaysRun; - //cAgent.AgentTextures = ??? //cAgent.GroupID = ?? // Groups??? // Animations??? - cAgent.VisualParams = m_appearance.VisualParams; + try + { + int i = 0; + UUID[] textures = new UUID[m_appearance.Wearables.Length * 2]; + foreach (AvatarWearable aw in m_appearance.Wearables) + { + if (aw != null) + { + textures[i++] = aw.ItemID; + textures[i++] = aw.AssetID; + } + else + m_log.DebugFormat("[SCENE PRESENCE]: Null wearable in CopyTo"); + } + cAgent.AgentTextures = textures; + cAgent.VisualParams = m_appearance.VisualParams; + } + catch (Exception e) + { + m_log.Warn("[SCENE PRESENCE]: exception in CopyTo " + e.Message); + } + //cAgent.GroupID = ?? + // Groups??? + + // Animations??? + } public void CopyFrom(AgentData cAgent) @@ -2622,7 +2656,7 @@ namespace OpenSim.Region.Framework.Scenes m_pos = cAgent.Position; m_velocity = cAgent.Velocity; m_CameraCenter = cAgent.Center; - m_avHeight = cAgent.Size.Z; + //m_avHeight = cAgent.Size.Z; m_CameraAtAxis = cAgent.AtAxis; m_CameraLeftAxis = cAgent.LeftAxis; m_CameraUpAxis = cAgent.UpAxis; @@ -2634,20 +2668,39 @@ namespace OpenSim.Region.Framework.Scenes m_headrotation = cAgent.HeadRotation; m_bodyRot = cAgent.BodyRotation; - m_AgentControlFlags = cAgent.ControlFlags; // We need more flags! + m_AgentControlFlags = cAgent.ControlFlags; if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) m_godlevel = cAgent.GodLevel; m_setAlwaysRun = cAgent.AlwaysRun; - //cAgent.AgentTextures = ??? + uint i = 0; + AvatarWearable[] wearables = new AvatarWearable[cAgent.AgentTextures.Length / 2]; + Primitive.TextureEntry te = new Primitive.TextureEntry(UUID.Random()); + try + { + for (uint n = 0; n < cAgent.AgentTextures.Length; n += 2) + { + UUID itemId = cAgent.AgentTextures[n]; + UUID assetId = cAgent.AgentTextures[n + 1]; + wearables[i] = new AvatarWearable(itemId, assetId); + te.CreateFace(i++).TextureID = assetId; + } + } + catch (Exception e) + { + m_log.Warn("[SCENE PRESENCE]: exception in CopyFrom " + e.Message); + } + //m_appearance.Texture = te; + m_appearance.Wearables = wearables; + //m_appearance.VisualParams = cAgent.VisualParams; + m_appearance.SetAppearance(te.ToBytes(), new List(cAgent.VisualParams)); //cAgent.GroupID = ?? //Groups??? // Animations??? - m_appearance.VisualParams = cAgent.VisualParams; } #endregion Child Agent Updates