Merge branch 'master' into mantis5110
Conflicts: OpenSim/Region/Framework/Scenes/ScenePresence.csviewer-2-initial-appearance
commit
c8d65c359f
|
@ -35,6 +35,104 @@ using log4net;
|
||||||
|
|
||||||
namespace OpenSim.Framework
|
namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
|
// A special dictionary for avatar appearance
|
||||||
|
public struct LayerItem
|
||||||
|
{
|
||||||
|
public UUID ItemID;
|
||||||
|
public UUID AssetID;
|
||||||
|
|
||||||
|
public LayerItem(UUID itemID, UUID assetID)
|
||||||
|
{
|
||||||
|
ItemID = itemID;
|
||||||
|
AssetID = assetID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Layer
|
||||||
|
{
|
||||||
|
protected int m_layerType;
|
||||||
|
protected Dictionary<UUID, UUID> m_items = new Dictionary<UUID, UUID>();
|
||||||
|
protected List<UUID> m_ids = new List<UUID>();
|
||||||
|
|
||||||
|
public Layer(int type)
|
||||||
|
{
|
||||||
|
m_layerType = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int LayerType
|
||||||
|
{
|
||||||
|
get { return m_layerType; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Count
|
||||||
|
{
|
||||||
|
get { return m_ids.Count; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(UUID itemID, UUID assetID)
|
||||||
|
{
|
||||||
|
if (m_items.ContainsKey(itemID))
|
||||||
|
return;
|
||||||
|
if (m_ids.Count >= 5)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_ids.Add(itemID);
|
||||||
|
m_items[itemID] = assetID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Wear(UUID itemID, UUID assetID)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
Add(itemID, assetID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
m_ids.Clear();
|
||||||
|
m_items.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveItem(UUID itemID)
|
||||||
|
{
|
||||||
|
if (m_items.ContainsKey(itemID))
|
||||||
|
{
|
||||||
|
m_ids.Remove(itemID);
|
||||||
|
m_items.Remove(itemID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveAsset(UUID assetID)
|
||||||
|
{
|
||||||
|
UUID itemID = UUID.Zero;
|
||||||
|
|
||||||
|
foreach (KeyValuePair<UUID, UUID> kvp in m_items)
|
||||||
|
{
|
||||||
|
if (kvp.Value == assetID)
|
||||||
|
{
|
||||||
|
itemID = kvp.Key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemID != UUID.Zero)
|
||||||
|
{
|
||||||
|
m_ids.Remove(itemID);
|
||||||
|
m_items.Remove(itemID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public LayerItem this [int idx]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (idx >= m_ids.Count || idx < 0)
|
||||||
|
return new LayerItem(UUID.Zero, UUID.Zero);
|
||||||
|
|
||||||
|
return new LayerItem(m_ids[idx], m_items[m_ids[idx]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Contains the Avatar's Appearance and methods to manipulate the appearance.
|
/// Contains the Avatar's Appearance and methods to manipulate the appearance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -45,6 +143,7 @@ namespace OpenSim.Framework
|
||||||
public readonly static int VISUALPARAM_COUNT = 218;
|
public readonly static int VISUALPARAM_COUNT = 218;
|
||||||
|
|
||||||
public readonly static int TEXTURE_COUNT = 21;
|
public readonly static int TEXTURE_COUNT = 21;
|
||||||
|
public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
|
||||||
|
|
||||||
protected UUID m_owner;
|
protected UUID m_owner;
|
||||||
protected int m_serial = 1;
|
protected int m_serial = 1;
|
||||||
|
@ -347,14 +446,8 @@ namespace OpenSim.Framework
|
||||||
protected virtual void SetDefaultTexture()
|
protected virtual void SetDefaultTexture()
|
||||||
{
|
{
|
||||||
m_texture = new Primitive.TextureEntry(new UUID("C228D1CF-4B5D-4BA8-84F4-899A0796AA97"));
|
m_texture = new Primitive.TextureEntry(new UUID("C228D1CF-4B5D-4BA8-84F4-899A0796AA97"));
|
||||||
// The initialization of these seems to force a rebake regardless of whether it is needed
|
for (uint i = 0; i < TEXTURE_COUNT; i++)
|
||||||
// m_textures.CreateFace(0).TextureID = new UUID("00000000-0000-1111-9999-000000000012");
|
m_texture.CreateFace(i).TextureID = new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE);
|
||||||
// m_textures.CreateFace(1).TextureID = Util.BLANK_TEXTURE_UUID;
|
|
||||||
// m_textures.CreateFace(2).TextureID = Util.BLANK_TEXTURE_UUID;
|
|
||||||
// m_textures.CreateFace(3).TextureID = new UUID("6522E74D-1660-4E7F-B601-6F48C1659A77");
|
|
||||||
// m_textures.CreateFace(4).TextureID = new UUID("7CA39B4C-BD19-4699-AFF7-F93FD03D3E7B");
|
|
||||||
// m_textures.CreateFace(5).TextureID = new UUID("00000000-0000-1111-9999-000000000010");
|
|
||||||
// m_textures.CreateFace(6).TextureID = new UUID("00000000-0000-1111-9999-000000000011");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -371,7 +464,7 @@ namespace OpenSim.Framework
|
||||||
// made. We determine if any of the textures actually
|
// made. We determine if any of the textures actually
|
||||||
// changed to know if the appearance should be saved later
|
// changed to know if the appearance should be saved later
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
|
for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++)
|
||||||
{
|
{
|
||||||
Primitive.TextureEntryFace newface = textureEntry.FaceTextures[i];
|
Primitive.TextureEntryFace newface = textureEntry.FaceTextures[i];
|
||||||
Primitive.TextureEntryFace oldface = m_texture.FaceTextures[i];
|
Primitive.TextureEntryFace oldface = m_texture.FaceTextures[i];
|
||||||
|
@ -385,7 +478,6 @@ namespace OpenSim.Framework
|
||||||
if (oldface != null && oldface.TextureID == newface.TextureID) continue;
|
if (oldface != null && oldface.TextureID == newface.TextureID) continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_texture.FaceTextures[i] = (newface != null) ? new Primitive.TextureEntryFace(newface) : null;
|
|
||||||
changed = true;
|
changed = true;
|
||||||
// DEBUG ON
|
// DEBUG ON
|
||||||
if (newface != null)
|
if (newface != null)
|
||||||
|
@ -393,6 +485,7 @@ namespace OpenSim.Framework
|
||||||
// DEBUG OFF
|
// DEBUG OFF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_texture = textureEntry;
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -415,8 +508,8 @@ namespace OpenSim.Framework
|
||||||
if (visualParams[i] != m_visualparams[i])
|
if (visualParams[i] != m_visualparams[i])
|
||||||
{
|
{
|
||||||
// DEBUG ON
|
// DEBUG ON
|
||||||
m_log.WarnFormat("[AVATARAPPEARANCE] vparams changed [{0}] {1} ==> {2}",
|
// m_log.WarnFormat("[AVATARAPPEARANCE] vparams changed [{0}] {1} ==> {2}",
|
||||||
i,m_visualparams[i],visualParams[i]);
|
// i,m_visualparams[i],visualParams[i]);
|
||||||
// DEBUG OFF
|
// DEBUG OFF
|
||||||
m_visualparams[i] = visualParams[i];
|
m_visualparams[i] = visualParams[i];
|
||||||
changed = true;
|
changed = true;
|
||||||
|
@ -581,6 +674,8 @@ namespace OpenSim.Framework
|
||||||
m_attachments.Clear();
|
m_attachments.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Packing Functions
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create an OSDMap from the appearance data
|
/// Create an OSDMap from the appearance data
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -605,7 +700,7 @@ namespace OpenSim.Framework
|
||||||
if (m_texture.FaceTextures[i] != null)
|
if (m_texture.FaceTextures[i] != null)
|
||||||
textures.Add(OSD.FromUUID(m_texture.FaceTextures[i].TextureID));
|
textures.Add(OSD.FromUUID(m_texture.FaceTextures[i].TextureID));
|
||||||
else
|
else
|
||||||
textures.Add(OSD.FromUUID(UUID.Zero));
|
textures.Add(OSD.FromUUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE));
|
||||||
}
|
}
|
||||||
data["textures"] = textures;
|
data["textures"] = textures;
|
||||||
|
|
||||||
|
@ -657,12 +752,10 @@ namespace OpenSim.Framework
|
||||||
OSDArray textures = (OSDArray)(data["textures"]);
|
OSDArray textures = (OSDArray)(data["textures"]);
|
||||||
for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++)
|
for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++)
|
||||||
{
|
{
|
||||||
|
UUID textureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE;
|
||||||
if (textures[i] != null)
|
if (textures[i] != null)
|
||||||
{
|
textureID = textures[i].AsUUID();
|
||||||
UUID textureID = textures[i].AsUUID();
|
m_texture.CreateFace((uint)i).TextureID = new UUID(textureID);
|
||||||
if (textureID != UUID.Zero)
|
|
||||||
m_texture.CreateFace((uint)i).TextureID = textureID;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -697,6 +790,9 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region VPElement
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Viewer Params Array Element for AgentSetAppearance
|
/// Viewer Params Array Element for AgentSetAppearance
|
||||||
|
@ -1460,5 +1556,6 @@ namespace OpenSim.Framework
|
||||||
SKIRT_SKIRT_GREEN = 216,
|
SKIRT_SKIRT_GREEN = 216,
|
||||||
SKIRT_SKIRT_BLUE = 217
|
SKIRT_SKIRT_BLUE = 217
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -123,15 +123,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
|
m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
|
||||||
|
|
||||||
// Save avatar attachment information
|
// Save avatar attachment information
|
||||||
ScenePresence presence;
|
m_log.Info(
|
||||||
if (m_scene.AvatarService != null && m_scene.TryGetScenePresence(remoteClient.AgentId, out presence))
|
"[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId
|
||||||
{
|
+ ", AttachmentPoint: " + AttachmentPt);
|
||||||
m_log.Info(
|
|
||||||
"[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId
|
|
||||||
+ ", AttachmentPoint: " + AttachmentPt);
|
|
||||||
|
|
||||||
m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance);
|
if (m_scene.AvatarFactory != null)
|
||||||
}
|
m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@ -382,8 +379,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
item = m_scene.InventoryService.GetItem(item);
|
item = m_scene.InventoryService.GetItem(item);
|
||||||
presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */);
|
presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */);
|
||||||
|
|
||||||
if (m_scene.AvatarService != null)
|
if (m_scene.AvatarFactory != null)
|
||||||
m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance);
|
m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,11 +402,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
presence.Appearance.DetachAttachment(itemID);
|
presence.Appearance.DetachAttachment(itemID);
|
||||||
|
|
||||||
// Save avatar attachment information
|
// Save avatar attachment information
|
||||||
if (m_scene.AvatarService != null)
|
m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID);
|
||||||
{
|
if (m_scene.AvatarFactory != null)
|
||||||
m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID);
|
m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId);
|
||||||
m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DetachSingleAttachmentToInv(itemID, remoteClient);
|
DetachSingleAttachmentToInv(itemID, remoteClient);
|
||||||
|
@ -435,10 +430,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
|
|
||||||
presence.Appearance.DetachAttachment(itemID);
|
presence.Appearance.DetachAttachment(itemID);
|
||||||
|
|
||||||
if (m_scene.AvatarService != null)
|
if (m_scene.AvatarFactory != null)
|
||||||
{
|
m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId);
|
||||||
m_scene.AvatarService.SetAppearance(remoteClient.AgentId, presence.Appearance);
|
|
||||||
}
|
|
||||||
part.ParentGroup.DetachToGround();
|
part.ParentGroup.DetachToGround();
|
||||||
|
|
||||||
List<UUID> uuids = new List<UUID>();
|
List<UUID> uuids = new List<UUID>();
|
||||||
|
|
|
@ -42,10 +42,9 @@ using OpenSim.Services.Interfaces;
|
||||||
|
|
||||||
namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
{
|
{
|
||||||
public class AvatarFactoryModule : IRegionModule
|
public class AvatarFactoryModule : IAvatarFactory, IRegionModule
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
|
|
||||||
private Scene m_scene = null;
|
private Scene m_scene = null;
|
||||||
|
|
||||||
private int m_savetime = 5; // seconds to wait before saving changed appearance
|
private int m_savetime = 5; // seconds to wait before saving changed appearance
|
||||||
|
@ -60,6 +59,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
|
|
||||||
public void Initialise(Scene scene, IConfigSource config)
|
public void Initialise(Scene scene, IConfigSource config)
|
||||||
{
|
{
|
||||||
|
scene.RegisterModuleInterface<IAvatarFactory>(this);
|
||||||
scene.EventManager.OnNewClient += NewClient;
|
scene.EventManager.OnNewClient += NewClient;
|
||||||
|
|
||||||
if (config != null)
|
if (config != null)
|
||||||
|
@ -112,6 +112,34 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public bool ValidateBakedTextureCache(IClientAPI client)
|
||||||
|
{
|
||||||
|
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
|
||||||
|
if (sp == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[AVFACTORY] SetAppearance unable to find presence for {0}",client.AgentId);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cached = true;
|
||||||
|
|
||||||
|
// Process the texture entry
|
||||||
|
for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++)
|
||||||
|
{
|
||||||
|
int idx = AvatarAppearance.BAKE_INDICES[i];
|
||||||
|
Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx];
|
||||||
|
if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
|
||||||
|
if (! CheckBakedTextureAsset(client,face.TextureID,idx))
|
||||||
|
{
|
||||||
|
sp.Appearance.Texture.FaceTextures[idx] = null;
|
||||||
|
cached = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cached;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set appearance data (textureentry and slider settings) received from the client
|
/// Set appearance data (textureentry and slider settings) received from the client
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -137,12 +165,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
{
|
{
|
||||||
changed = sp.Appearance.SetTextureEntries(textureEntry);
|
changed = sp.Appearance.SetTextureEntries(textureEntry);
|
||||||
|
|
||||||
for (int i = 0; i < BAKE_INDICES.Length; i++)
|
for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++)
|
||||||
{
|
{
|
||||||
int idx = BAKE_INDICES[i];
|
int idx = AvatarAppearance.BAKE_INDICES[i];
|
||||||
Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx];
|
Primitive.TextureEntryFace face = sp.Appearance.Texture.FaceTextures[idx];
|
||||||
if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
|
if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
|
||||||
Util.FireAndForget(delegate(object o) { CheckBakedTextureAssets(client,face.TextureID,idx); });
|
Util.FireAndForget(delegate(object o) {
|
||||||
|
if (! CheckBakedTextureAsset(client,face.TextureID,idx))
|
||||||
|
client.SendRebakeAvatarTextures(face.TextureID);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,9 +196,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
QueueAppearanceSend(client.AgentId);
|
QueueAppearanceSend(client.AgentId);
|
||||||
|
|
||||||
// Send the appearance back to the avatar
|
// Send the appearance back to the avatar
|
||||||
AvatarAppearance avp = sp.Appearance;
|
// AvatarAppearance avp = sp.Appearance;
|
||||||
sp.ControllingClient.SendAvatarDataImmediate(sp);
|
// sp.ControllingClient.SendAvatarDataImmediate(sp);
|
||||||
sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes());
|
// sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -177,14 +208,15 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
/// <param name="client"></param>
|
/// <param name="client"></param>
|
||||||
/// <param name="textureID"></param>
|
/// <param name="textureID"></param>
|
||||||
/// <param name="idx"></param>
|
/// <param name="idx"></param>
|
||||||
private void CheckBakedTextureAssets(IClientAPI client, UUID textureID, int idx)
|
private bool CheckBakedTextureAsset(IClientAPI client, UUID textureID, int idx)
|
||||||
{
|
{
|
||||||
if (m_scene.AssetService.Get(textureID.ToString()) == null)
|
if (m_scene.AssetService.Get(textureID.ToString()) == null)
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[AVFACTORY]: Missing baked texture {0} ({1}) for avatar {2}",
|
m_log.WarnFormat("[AVFACTORY]: Missing baked texture {0} ({1}) for avatar {2}",
|
||||||
textureID,idx,client.Name);
|
textureID,idx,client.Name);
|
||||||
client.SendRebakeAvatarTextures(textureID);
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region UpdateAppearanceTimer
|
#region UpdateAppearanceTimer
|
||||||
|
@ -229,16 +261,16 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEBUG ON
|
// DEBUG ON
|
||||||
m_log.WarnFormat("[AVFACTORY] Handle appearance send for {0}\n{1}",agentid,sp.Appearance.ToString());
|
m_log.WarnFormat("[AVFACTORY] Handle appearance send for {0}",agentid);
|
||||||
// DEBUG OFF
|
// DEBUG OFF
|
||||||
|
|
||||||
// Send the appearance to everyone in the scene
|
// Send the appearance to everyone in the scene
|
||||||
sp.SendAppearanceToAllOtherAgents();
|
sp.SendAppearanceToAllOtherAgents();
|
||||||
|
sp.ControllingClient.SendAvatarDataImmediate(sp);
|
||||||
|
|
||||||
// Send the appearance back to the avatar
|
// Send the appearance back to the avatar
|
||||||
AvatarAppearance avp = sp.Appearance;
|
// AvatarAppearance avp = sp.Appearance;
|
||||||
sp.ControllingClient.SendAvatarDataImmediate(sp);
|
// sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes());
|
||||||
sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes());
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// this needs to be fixed, the flag should be on scene presence not the region module
|
// this needs to be fixed, the flag should be on scene presence not the region module
|
||||||
|
@ -337,14 +369,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
|
|
||||||
AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance);
|
AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance);
|
||||||
|
|
||||||
//if (!TryGetAvatarAppearance(client.AgentId, out avatAppearance))
|
|
||||||
//{
|
|
||||||
// m_log.Warn("[AVFACTORY]: We didn't seem to find the appearance, falling back to ScenePresence");
|
|
||||||
// avatAppearance = sp.Appearance;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//m_log.DebugFormat("[AVFACTORY]: Received wearables for {0}", client.Name);
|
|
||||||
|
|
||||||
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
|
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
|
||||||
{
|
{
|
||||||
if (wear.Type < AvatarWearable.MAX_WEARABLES)
|
if (wear.Type < AvatarWearable.MAX_WEARABLES)
|
||||||
|
@ -354,10 +378,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This could take awhile since it needs to pull inventory
|
||||||
SetAppearanceAssets(sp.UUID, ref avatAppearance);
|
SetAppearanceAssets(sp.UUID, ref avatAppearance);
|
||||||
|
|
||||||
m_scene.AvatarService.SetAppearance(client.AgentId, avatAppearance);
|
|
||||||
sp.Appearance = avatAppearance;
|
sp.Appearance = avatAppearance;
|
||||||
|
m_scene.AvatarService.SetAppearance(client.AgentId, sp.Appearance);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)
|
private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Framework.Interfaces
|
||||||
|
{
|
||||||
|
public interface IAvatarFactory
|
||||||
|
{
|
||||||
|
bool ValidateBakedTextureCache(IClientAPI client);
|
||||||
|
void QueueAppearanceSend(UUID agentid);
|
||||||
|
void QueueAppearanceSave(UUID agentid);
|
||||||
|
}
|
||||||
|
}
|
|
@ -119,6 +119,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
protected IXMLRPC m_xmlrpcModule;
|
protected IXMLRPC m_xmlrpcModule;
|
||||||
protected IWorldComm m_worldCommModule;
|
protected IWorldComm m_worldCommModule;
|
||||||
|
protected IAvatarFactory m_AvatarFactory;
|
||||||
protected IConfigSource m_config;
|
protected IConfigSource m_config;
|
||||||
protected IRegionSerialiserModule m_serialiser;
|
protected IRegionSerialiserModule m_serialiser;
|
||||||
protected IDialogModule m_dialogModule;
|
protected IDialogModule m_dialogModule;
|
||||||
|
@ -398,6 +399,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public IAttachmentsModule AttachmentsModule { get; set; }
|
public IAttachmentsModule AttachmentsModule { get; set; }
|
||||||
|
|
||||||
|
public IAvatarFactory AvatarFactory
|
||||||
|
{
|
||||||
|
get { return m_AvatarFactory; }
|
||||||
|
}
|
||||||
|
|
||||||
public ICapabilitiesModule CapsModule
|
public ICapabilitiesModule CapsModule
|
||||||
{
|
{
|
||||||
get { return m_capsModule; }
|
get { return m_capsModule; }
|
||||||
|
@ -1153,6 +1159,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_xmlrpcModule = RequestModuleInterface<IXMLRPC>();
|
m_xmlrpcModule = RequestModuleInterface<IXMLRPC>();
|
||||||
m_worldCommModule = RequestModuleInterface<IWorldComm>();
|
m_worldCommModule = RequestModuleInterface<IWorldComm>();
|
||||||
XferManager = RequestModuleInterface<IXfer>();
|
XferManager = RequestModuleInterface<IXfer>();
|
||||||
|
m_AvatarFactory = RequestModuleInterface<IAvatarFactory>();
|
||||||
AttachmentsModule = RequestModuleInterface<IAttachmentsModule>();
|
AttachmentsModule = RequestModuleInterface<IAttachmentsModule>();
|
||||||
m_serialiser = RequestModuleInterface<IRegionSerialiserModule>();
|
m_serialiser = RequestModuleInterface<IRegionSerialiserModule>();
|
||||||
m_dialogModule = RequestModuleInterface<IDialogModule>();
|
m_dialogModule = RequestModuleInterface<IDialogModule>();
|
||||||
|
|
|
@ -704,20 +704,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// we created a new ScenePresence (a new child agent) in a fresh region.
|
// we created a new ScenePresence (a new child agent) in a fresh region.
|
||||||
// Request info about all the (root) agents in this region
|
// Request info about all the (root) agents in this region
|
||||||
// Note: This won't send data *to* other clients in that region (children don't send)
|
// Note: This won't send data *to* other clients in that region (children don't send)
|
||||||
|
|
||||||
|
// MIC: This gets called again in CompleteMovement
|
||||||
SendInitialFullUpdateToAllClients();
|
SendInitialFullUpdateToAllClients();
|
||||||
|
|
||||||
RegisterToEvents();
|
RegisterToEvents();
|
||||||
SetDirectionVectors();
|
SetDirectionVectors();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
|
|
||||||
AvatarWearable[] wearables)
|
|
||||||
: this(client, world, reginfo)
|
|
||||||
{
|
|
||||||
m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
|
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
|
||||||
: this(client, world, reginfo)
|
: this(client, world, reginfo)
|
||||||
{
|
{
|
||||||
|
@ -1081,7 +1075,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void CompleteMovement(IClientAPI client)
|
public void CompleteMovement(IClientAPI client)
|
||||||
{
|
{
|
||||||
//m_log.Debug("[SCENE PRESENCE]: CompleteMovement");
|
// DEBUG ON
|
||||||
|
m_log.WarnFormat("[SCENE PRESENCE]: CompleteMovement for {0}",UUID);
|
||||||
|
// DEBUG OFF
|
||||||
|
|
||||||
Vector3 look = Velocity;
|
Vector3 look = Velocity;
|
||||||
if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
|
if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
|
||||||
|
@ -2381,12 +2377,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// 2 stage check is needed.
|
// 2 stage check is needed.
|
||||||
if (remoteAvatar == null)
|
if (remoteAvatar == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
IClientAPI cl=remoteAvatar.ControllingClient;
|
IClientAPI cl=remoteAvatar.ControllingClient;
|
||||||
if (cl == null)
|
if (cl == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_appearance.Texture == null)
|
if (m_appearance.Texture == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (LocalId == remoteAvatar.LocalId)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[SP] An agent is attempting to send data to itself; {0}",UUID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (IsChildAgent)
|
if (IsChildAgent)
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[SCENEPRESENCE] A child agent is attempting to send out avatar data");
|
m_log.WarnFormat("[SCENEPRESENCE] A child agent is attempting to send out avatar data");
|
||||||
|
@ -2407,20 +2411,23 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_scene.ForEachScenePresence(delegate(ScenePresence avatar)
|
m_scene.ForEachScenePresence(delegate(ScenePresence avatar)
|
||||||
{
|
{
|
||||||
++avUpdates;
|
++avUpdates;
|
||||||
// only send if this is the root (children are only "listening posts" in a foreign region)
|
|
||||||
|
// Don't update ourselves
|
||||||
|
if (avatar.LocalId == LocalId)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If this is a root agent, then get info about the avatar
|
||||||
if (!IsChildAgent)
|
if (!IsChildAgent)
|
||||||
{
|
{
|
||||||
SendFullUpdateToOtherClient(avatar);
|
SendFullUpdateToOtherClient(avatar);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (avatar.LocalId != LocalId)
|
// If the other avatar is a root
|
||||||
|
if (!avatar.IsChildAgent)
|
||||||
{
|
{
|
||||||
if (!avatar.IsChildAgent)
|
avatar.SendFullUpdateToOtherClient(this);
|
||||||
{
|
avatar.SendAppearanceToOtherAgent(this);
|
||||||
avatar.SendFullUpdateToOtherClient(this);
|
avatar.Animator.SendAnimPackToClient(ControllingClient);
|
||||||
avatar.SendAppearanceToOtherAgent(this);
|
|
||||||
avatar.Animator.SendAnimPackToClient(ControllingClient);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -2465,7 +2472,19 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
|
// m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
|
||||||
|
|
||||||
m_controllingClient.SendAvatarDataImmediate(this);
|
m_controllingClient.SendAvatarDataImmediate(this);
|
||||||
m_controllingClient.SendAppearance(m_appearance.Owner,m_appearance.VisualParams,m_appearance.Texture.GetBytes());
|
if (m_scene.AvatarFactory != null)
|
||||||
|
{
|
||||||
|
if (m_scene.AvatarFactory.ValidateBakedTextureCache(m_controllingClient))
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[SP] baked textures are in the ache for {0}",Name);
|
||||||
|
m_controllingClient.SendAppearance(
|
||||||
|
m_appearance.Owner,m_appearance.VisualParams,m_appearance.Texture.GetBytes());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[SP] AvatarFactory not set");
|
||||||
|
}
|
||||||
|
|
||||||
SendInitialFullUpdateToAllClients();
|
SendInitialFullUpdateToAllClients();
|
||||||
}
|
}
|
||||||
|
@ -2497,9 +2516,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="avatar"></param>
|
/// <param name="avatar"></param>
|
||||||
public void SendAppearanceToOtherAgent(ScenePresence avatar)
|
public void SendAppearanceToOtherAgent(ScenePresence avatar)
|
||||||
{
|
{
|
||||||
|
if (LocalId == avatar.LocalId)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[SP] An agent is attempting to send data to itself; {0}",UUID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// DEBUG ON
|
// DEBUG ON
|
||||||
m_log.WarnFormat("[SP] Send appearance from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
|
// m_log.WarnFormat("[SP] Send appearance from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
|
||||||
// DEBUG OFF
|
// DEBUG OFF
|
||||||
|
|
||||||
avatar.ControllingClient.SendAppearance(
|
avatar.ControllingClient.SendAppearance(
|
||||||
m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
|
m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
<Nini>
|
<Nini>
|
||||||
|
<Section Name="Default Alpha">
|
||||||
|
<Key Name="assetID" Value="1578a2b1-5179-4b53-b618-fe00ca5a5594" />
|
||||||
|
<Key Name="name" Value="alpha" />
|
||||||
|
<Key Name="assetType" Value="0" />
|
||||||
|
<Key Name="fileName" Value="default_alpha.jp2" />
|
||||||
|
</Section>
|
||||||
<Section Name="texture1">
|
<Section Name="texture1">
|
||||||
<Key Name="assetID" Value="00000000-0000-2222-3333-000000000099" />
|
<Key Name="assetID" Value="00000000-0000-2222-3333-000000000099" />
|
||||||
<Key Name="name" Value="femface" />
|
<Key Name="name" Value="femface" />
|
||||||
|
|
Binary file not shown.
|
@ -16,6 +16,34 @@
|
||||||
</Section>
|
</Section>
|
||||||
-->
|
-->
|
||||||
<!--
|
<!--
|
||||||
|
<Section Name="Tattoo">
|
||||||
|
<Key Name="inventoryID" Value="c47e22bd-3021-4ba4-82aa-2b5cb34d35e1" />
|
||||||
|
<Key Name="assetID" Value="00000000-0000-2222-3333-100000001007" />
|
||||||
|
<Key Name="folderID" Value="d499e5e0-b9bf-11dc-95ff-0800200c9a66"/>
|
||||||
|
<Key Name="description" Value="Tattoo" />
|
||||||
|
<Key Name="name" Value="Tattoo" />
|
||||||
|
<Key Name="assetType" Value="13" />
|
||||||
|
<Key Name="inventoryType" Value="18" />
|
||||||
|
<Key Name="currentPermissions" Value="2147483647" />
|
||||||
|
<Key Name="nextPermissions" Value="2147483647" />
|
||||||
|
<Key Name="everyonePermissions" Value="2147483647" />
|
||||||
|
<Key Name="basePermissions" Value="2147483647" />
|
||||||
|
</Section>
|
||||||
|
|
||||||
|
<Section Name="Alpha">
|
||||||
|
<Key Name="inventoryID" Value="bfb9923c-4838-4d2d-bf07-608c5b1165c8" />
|
||||||
|
<Key Name="assetID" Value="1578a2b1-5179-4b53-b618-fe00ca5a5594" />
|
||||||
|
<Key Name="folderID" Value="d499e5e0-b9bf-11dc-95ff-0800200c9a66"/>
|
||||||
|
<Key Name="description" Value="Hair" />
|
||||||
|
<Key Name="name" Value="Hair" />
|
||||||
|
<Key Name="assetType" Value="13" />
|
||||||
|
<Key Name="inventoryType" Value="18" />
|
||||||
|
<Key Name="currentPermissions" Value="2147483647" />
|
||||||
|
<Key Name="nextPermissions" Value="2147483647" />
|
||||||
|
<Key Name="everyonePermissions" Value="2147483647" />
|
||||||
|
<Key Name="basePermissions" Value="2147483647" />
|
||||||
|
</Section>
|
||||||
|
|
||||||
<Section Name="Hair">
|
<Section Name="Hair">
|
||||||
<Key Name="inventoryID" Value="d342e6c1-b9d2-11dc-95ff-0800200c9a66" />
|
<Key Name="inventoryID" Value="d342e6c1-b9d2-11dc-95ff-0800200c9a66" />
|
||||||
<Key Name="assetID" Value="d342e6c0-b9d2-11dc-95ff-0800200c9a66" />
|
<Key Name="assetID" Value="d342e6c0-b9d2-11dc-95ff-0800200c9a66" />
|
||||||
|
|
Loading…
Reference in New Issue