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