diff options
author | Melanie | 2010-10-29 21:06:46 +0100 |
---|---|---|
committer | Melanie | 2010-10-29 21:06:46 +0100 |
commit | 934e53673856876762df27c7880df30df633ccd3 (patch) | |
tree | b50129669f9d7f725cf63db1df60c600b8da9f0c /OpenSim/Framework | |
parent | Add my work on top of cmickeyb's (diff) | |
parent | Clean up some cruft from the last commit. Re-add the initial update (diff) | |
download | opensim-SC-934e53673856876762df27c7880df30df633ccd3.zip opensim-SC-934e53673856876762df27c7880df30df633ccd3.tar.gz opensim-SC-934e53673856876762df27c7880df30df633ccd3.tar.bz2 opensim-SC-934e53673856876762df27c7880df30df633ccd3.tar.xz |
Merge commit 'cmickeyb/dev-appearance'
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r-- | OpenSim/Framework/AgentCircuitData.cs | 66 | ||||
-rw-r--r-- | OpenSim/Framework/AvatarAppearance.cs | 186 | ||||
-rw-r--r-- | OpenSim/Framework/Capabilities/Caps.cs | 14 | ||||
-rw-r--r-- | OpenSim/Framework/ChildAgentDataUpdate.cs | 98 |
4 files changed, 207 insertions, 157 deletions
diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index be98380..640a646 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs | |||
@@ -206,16 +206,18 @@ namespace OpenSim.Framework | |||
206 | 206 | ||
207 | args["service_session_id"] = OSD.FromString(ServiceSessionID); | 207 | args["service_session_id"] = OSD.FromString(ServiceSessionID); |
208 | args["start_pos"] = OSD.FromString(startpos.ToString()); | 208 | args["start_pos"] = OSD.FromString(startpos.ToString()); |
209 | args["appearance_serial"] = OSD.FromInteger(Appearance.Serial); | ||
210 | args["client_ip"] = OSD.FromString(IPAddress); | 209 | args["client_ip"] = OSD.FromString(IPAddress); |
211 | args["viewer"] = OSD.FromString(Viewer); | 210 | args["viewer"] = OSD.FromString(Viewer); |
212 | args["channel"] = OSD.FromString(Channel); | 211 | args["channel"] = OSD.FromString(Channel); |
213 | args["mac"] = OSD.FromString(Mac); | 212 | args["mac"] = OSD.FromString(Mac); |
214 | args["id0"] = OSD.FromString(Id0); | 213 | args["id0"] = OSD.FromString(Id0); |
215 | 214 | ||
216 | /* | 215 | // Eventually this code should be deprecated, use full appearance |
216 | // packing in packed_appearance | ||
217 | if (Appearance != null) | 217 | if (Appearance != null) |
218 | { | 218 | { |
219 | args["appearance_serial"] = OSD.FromInteger(Appearance.Serial); | ||
220 | |||
219 | //System.Console.WriteLine("XXX Before packing Wearables"); | 221 | //System.Console.WriteLine("XXX Before packing Wearables"); |
220 | if ((Appearance.Wearables != null) && (Appearance.Wearables.Length > 0)) | 222 | if ((Appearance.Wearables != null) && (Appearance.Wearables.Length > 0)) |
221 | { | 223 | { |
@@ -230,20 +232,19 @@ namespace OpenSim.Framework | |||
230 | } | 232 | } |
231 | 233 | ||
232 | //System.Console.WriteLine("XXX Before packing Attachments"); | 234 | //System.Console.WriteLine("XXX Before packing Attachments"); |
233 | Dictionary<int, AvatarAttachment> attachments = Appearance.Attachments; | 235 | List<AvatarAttachment> attachments = Appearance.GetAttachments(); |
234 | if ((attachments != null) && (attachments.Count > 0)) | 236 | if ((attachments != null) && (attachments.Count > 0)) |
235 | { | 237 | { |
236 | OSDArray attachs = new OSDArray(attachments.Count); | 238 | OSDArray attachs = new OSDArray(attachments.Count); |
237 | foreach (KeyValuePair<int, AvatarAttachment> kvp in attachments) | 239 | foreach (AvatarAttachment attach in attachments) |
238 | { | 240 | { |
239 | AvatarAttachment adata = new AvatarAttachment(kvp.Value); | 241 | attachs.Add(attach.Pack()); |
240 | attachs.Add(adata.Pack()); | ||
241 | //System.Console.WriteLine("XXX att.pt=" + kvp.Key + "; itemID=" + kvp.Value[0] + "; assetID=" + kvp.Value[1]); | 242 | //System.Console.WriteLine("XXX att.pt=" + kvp.Key + "; itemID=" + kvp.Value[0] + "; assetID=" + kvp.Value[1]); |
242 | } | 243 | } |
243 | args["attachments"] = attachs; | 244 | args["attachments"] = attachs; |
244 | } | 245 | } |
245 | } | 246 | } |
246 | */ | 247 | |
247 | if (Appearance != null) | 248 | if (Appearance != null) |
248 | { | 249 | { |
249 | OSDMap appmap = Appearance.Pack(); | 250 | OSDMap appmap = Appearance.Pack(); |
@@ -339,27 +340,9 @@ namespace OpenSim.Framework | |||
339 | try { | 340 | try { |
340 | // Unpack various appearance elements | 341 | // Unpack various appearance elements |
341 | Appearance = new AvatarAppearance(AgentID); | 342 | Appearance = new AvatarAppearance(AgentID); |
342 | if (args["packed_appearance"] != null) | 343 | |
343 | { | 344 | // Eventually this code should be deprecated, use full appearance |
344 | if (args["packed_appearance"].Type == OSDType.Map) | 345 | // packing in packed_appearance |
345 | { | ||
346 | Appearance.Unpack((OSDMap)args["packed_appearance"]); | ||
347 | m_log.WarnFormat("[AGENTCIRCUITDATA] unpacked appearance"); | ||
348 | } | ||
349 | else | ||
350 | m_log.WarnFormat("[AGENTCIRCUITDATA] packed_appearance is not a map:\n{0}",args["packed_appearance"].ToString()); | ||
351 | } | ||
352 | // DEBUG ON | ||
353 | else | ||
354 | m_log.Warn("[AGENTCIRCUITDATA] failed to find a valid packed_appearance"); | ||
355 | // DEBUG OFF | ||
356 | } catch (Exception e) | ||
357 | { | ||
358 | m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}",e.Message); | ||
359 | } | ||
360 | |||
361 | |||
362 | /* | ||
363 | if (args["appearance_serial"] != null) | 346 | if (args["appearance_serial"] != null) |
364 | Appearance.Serial = args["appearance_serial"].AsInteger(); | 347 | Appearance.Serial = args["appearance_serial"].AsInteger(); |
365 | 348 | ||
@@ -368,26 +351,39 @@ namespace OpenSim.Framework | |||
368 | OSDArray wears = (OSDArray)(args["wearables"]); | 351 | OSDArray wears = (OSDArray)(args["wearables"]); |
369 | for (int i = 0; i < wears.Count / 2; i++) | 352 | for (int i = 0; i < wears.Count / 2; i++) |
370 | { | 353 | { |
371 | Appearance.Wearables[i].ItemID = wears[i*2].AsUUID(); | 354 | AvatarWearable awear = new AvatarWearable(wears[i*2].AsUUID(),wears[(i*2)+1].AsUUID()); |
372 | Appearance.Wearables[i].AssetID = wears[(i*2)+1].AsUUID(); | 355 | Appearance.SetWearable(i,awear); |
373 | } | 356 | } |
374 | } | 357 | } |
375 | 358 | ||
376 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) | 359 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) |
377 | { | 360 | { |
378 | OSDArray attachs = (OSDArray)(args["attachments"]); | 361 | OSDArray attachs = (OSDArray)(args["attachments"]); |
379 | AvatarAttachment[] attachments = new AvatarAttachment[attachs.Count]; | ||
380 | int i = 0; | ||
381 | foreach (OSD o in attachs) | 362 | foreach (OSD o in attachs) |
382 | { | 363 | { |
383 | if (o.Type == OSDType.Map) | 364 | if (o.Type == OSDType.Map) |
384 | { | 365 | { |
385 | attachments[i++] = new AvatarAttachment((OSDMap)o); | 366 | Appearance.AppendAttachment(new AvatarAttachment((OSDMap)o)); |
386 | } | 367 | } |
387 | } | 368 | } |
388 | Appearance.SetAttachments(attachments); | ||
389 | } | 369 | } |
390 | */ | 370 | |
371 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map)) | ||
372 | { | ||
373 | Appearance.Unpack((OSDMap)args["packed_appearance"]); | ||
374 | // DEBUG ON | ||
375 | m_log.WarnFormat("[AGENTCIRCUITDATA] unpacked appearance"); | ||
376 | // DEBUG OFF | ||
377 | } | ||
378 | // DEBUG ON | ||
379 | else | ||
380 | m_log.Warn("[AGENTCIRCUITDATA] failed to find a valid packed_appearance"); | ||
381 | // DEBUG OFF | ||
382 | } catch (Exception e) | ||
383 | { | ||
384 | m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}",e.Message); | ||
385 | } | ||
386 | |||
391 | ServiceURLs = new Dictionary<string, object>(); | 387 | ServiceURLs = new Dictionary<string, object>(); |
392 | if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array) | 388 | if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array) |
393 | { | 389 | { |
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 4738d88..a4bb765 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs | |||
@@ -143,13 +143,14 @@ namespace OpenSim.Framework | |||
143 | public readonly static int VISUALPARAM_COUNT = 218; | 143 | public readonly static int VISUALPARAM_COUNT = 218; |
144 | 144 | ||
145 | public readonly static int TEXTURE_COUNT = 21; | 145 | public readonly static int TEXTURE_COUNT = 21; |
146 | public readonly static byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; | ||
146 | 147 | ||
147 | protected UUID m_owner; | 148 | protected UUID m_owner; |
148 | protected int m_serial = 1; | 149 | protected int m_serial = 1; |
149 | protected byte[] m_visualparams; | 150 | protected byte[] m_visualparams; |
150 | protected Primitive.TextureEntry m_texture; | 151 | protected Primitive.TextureEntry m_texture; |
151 | protected AvatarWearable[] m_wearables; | 152 | protected AvatarWearable[] m_wearables; |
152 | protected Dictionary<int, AvatarAttachment> m_attachments; | 153 | protected Dictionary<int, List<AvatarAttachment>> m_attachments; |
153 | protected float m_avatarHeight = 0; | 154 | protected float m_avatarHeight = 0; |
154 | protected float m_hipOffset = 0; | 155 | protected float m_hipOffset = 0; |
155 | 156 | ||
@@ -183,11 +184,6 @@ namespace OpenSim.Framework | |||
183 | set { m_wearables = value; } | 184 | set { m_wearables = value; } |
184 | } | 185 | } |
185 | 186 | ||
186 | public virtual Dictionary<int, AvatarAttachment> Attachments | ||
187 | { | ||
188 | get { return m_attachments; } | ||
189 | } | ||
190 | |||
191 | public virtual UUID BodyItem { | 187 | public virtual UUID BodyItem { |
192 | get { return m_wearables[AvatarWearable.BODY].ItemID; } | 188 | get { return m_wearables[AvatarWearable.BODY].ItemID; } |
193 | set { m_wearables[AvatarWearable.BODY].ItemID = value; } | 189 | set { m_wearables[AvatarWearable.BODY].ItemID = value; } |
@@ -336,7 +332,7 @@ namespace OpenSim.Framework | |||
336 | // DEBUG ON | 332 | // DEBUG ON |
337 | m_log.WarnFormat("[AVATAR APPEARANCE] create empty appearance for {0}",owner); | 333 | m_log.WarnFormat("[AVATAR APPEARANCE] create empty appearance for {0}",owner); |
338 | // DEBUG OFF | 334 | // DEBUG OFF |
339 | m_serial = 0; | 335 | m_serial = 1; |
340 | m_owner = owner; | 336 | m_owner = owner; |
341 | 337 | ||
342 | SetDefaultWearables(); | 338 | SetDefaultWearables(); |
@@ -344,7 +340,7 @@ namespace OpenSim.Framework | |||
344 | SetDefaultParams(); | 340 | SetDefaultParams(); |
345 | SetHeight(); | 341 | SetHeight(); |
346 | 342 | ||
347 | m_attachments = new Dictionary<int, AvatarAttachment>(); | 343 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); |
348 | } | 344 | } |
349 | 345 | ||
350 | public AvatarAppearance(UUID avatarID, OSDMap map) | 346 | public AvatarAppearance(UUID avatarID, OSDMap map) |
@@ -382,7 +378,7 @@ namespace OpenSim.Framework | |||
382 | 378 | ||
383 | SetHeight(); | 379 | SetHeight(); |
384 | 380 | ||
385 | m_attachments = new Dictionary<int, AvatarAttachment>(); | 381 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); |
386 | } | 382 | } |
387 | 383 | ||
388 | public AvatarAppearance(AvatarAppearance appearance) | 384 | public AvatarAppearance(AvatarAppearance appearance) |
@@ -392,7 +388,7 @@ namespace OpenSim.Framework | |||
392 | // DEBUG OFF | 388 | // DEBUG OFF |
393 | if (appearance == null) | 389 | if (appearance == null) |
394 | { | 390 | { |
395 | m_serial = 0; | 391 | m_serial = 1; |
396 | m_owner = UUID.Zero; | 392 | m_owner = UUID.Zero; |
397 | 393 | ||
398 | SetDefaultWearables(); | 394 | SetDefaultWearables(); |
@@ -400,7 +396,7 @@ namespace OpenSim.Framework | |||
400 | SetDefaultParams(); | 396 | SetDefaultParams(); |
401 | SetHeight(); | 397 | SetHeight(); |
402 | 398 | ||
403 | m_attachments = new Dictionary<int, AvatarAttachment>(); | 399 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); |
404 | 400 | ||
405 | return; | 401 | return; |
406 | } | 402 | } |
@@ -427,9 +423,10 @@ namespace OpenSim.Framework | |||
427 | if (appearance.VisualParams != null) | 423 | if (appearance.VisualParams != null) |
428 | m_visualparams = (byte[])appearance.VisualParams.Clone(); | 424 | m_visualparams = (byte[])appearance.VisualParams.Clone(); |
429 | 425 | ||
430 | m_attachments = new Dictionary<int, AvatarAttachment>(); | 426 | // Copy the attachment, force append mode since that ensures consistency |
431 | foreach (KeyValuePair<int, AvatarAttachment> kvp in appearance.Attachments) | 427 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); |
432 | m_attachments[kvp.Key] = new AvatarAttachment(kvp.Value); | 428 | foreach (AvatarAttachment attachment in appearance.GetAttachments()) |
429 | AppendAttachment(new AvatarAttachment(attachment)); | ||
433 | } | 430 | } |
434 | 431 | ||
435 | protected virtual void SetDefaultWearables() | 432 | protected virtual void SetDefaultWearables() |
@@ -449,14 +446,8 @@ namespace OpenSim.Framework | |||
449 | protected virtual void SetDefaultTexture() | 446 | protected virtual void SetDefaultTexture() |
450 | { | 447 | { |
451 | m_texture = new Primitive.TextureEntry(new UUID("C228D1CF-4B5D-4BA8-84F4-899A0796AA97")); | 448 | m_texture = new Primitive.TextureEntry(new UUID("C228D1CF-4B5D-4BA8-84F4-899A0796AA97")); |
452 | // The initialization of these seems to force a rebake regardless of whether it is needed | 449 | for (uint i = 0; i < TEXTURE_COUNT; i++) |
453 | // m_textures.CreateFace(0).TextureID = new UUID("00000000-0000-1111-9999-000000000012"); | 450 | m_texture.CreateFace(i).TextureID = new UUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE); |
454 | // m_textures.CreateFace(1).TextureID = Util.BLANK_TEXTURE_UUID; | ||
455 | // m_textures.CreateFace(2).TextureID = Util.BLANK_TEXTURE_UUID; | ||
456 | // m_textures.CreateFace(3).TextureID = new UUID("6522E74D-1660-4E7F-B601-6F48C1659A77"); | ||
457 | // m_textures.CreateFace(4).TextureID = new UUID("7CA39B4C-BD19-4699-AFF7-F93FD03D3E7B"); | ||
458 | // m_textures.CreateFace(5).TextureID = new UUID("00000000-0000-1111-9999-000000000010"); | ||
459 | // m_textures.CreateFace(6).TextureID = new UUID("00000000-0000-1111-9999-000000000011"); | ||
460 | } | 451 | } |
461 | 452 | ||
462 | /// <summary> | 453 | /// <summary> |
@@ -473,7 +464,7 @@ namespace OpenSim.Framework | |||
473 | // made. We determine if any of the textures actually | 464 | // made. We determine if any of the textures actually |
474 | // changed to know if the appearance should be saved later | 465 | // changed to know if the appearance should be saved later |
475 | bool changed = false; | 466 | bool changed = false; |
476 | for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++) | 467 | for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++) |
477 | { | 468 | { |
478 | Primitive.TextureEntryFace newface = textureEntry.FaceTextures[i]; | 469 | Primitive.TextureEntryFace newface = textureEntry.FaceTextures[i]; |
479 | Primitive.TextureEntryFace oldface = m_texture.FaceTextures[i]; | 470 | Primitive.TextureEntryFace oldface = m_texture.FaceTextures[i]; |
@@ -487,14 +478,14 @@ namespace OpenSim.Framework | |||
487 | if (oldface != null && oldface.TextureID == newface.TextureID) continue; | 478 | if (oldface != null && oldface.TextureID == newface.TextureID) continue; |
488 | } | 479 | } |
489 | 480 | ||
490 | m_texture.FaceTextures[i] = (newface != null) ? new Primitive.TextureEntryFace(newface) : null; | ||
491 | changed = true; | 481 | changed = true; |
492 | // DEBUG ON | 482 | // DEBUG ON |
493 | if (newface != null) | 483 | if (newface != null) |
494 | m_log.WarnFormat("[SCENEPRESENCE] index {0}, new texture id {1}",i,newface.TextureID); | 484 | m_log.WarnFormat("[AVATAR APPEARANCE] index {0}, new texture id {1}",i,newface.TextureID); |
495 | // DEBUG OFF | 485 | // DEBUG OFF |
496 | } | 486 | } |
497 | 487 | ||
488 | m_texture = textureEntry; | ||
498 | return changed; | 489 | return changed; |
499 | } | 490 | } |
500 | 491 | ||
@@ -517,8 +508,8 @@ namespace OpenSim.Framework | |||
517 | if (visualParams[i] != m_visualparams[i]) | 508 | if (visualParams[i] != m_visualparams[i]) |
518 | { | 509 | { |
519 | // DEBUG ON | 510 | // DEBUG ON |
520 | m_log.WarnFormat("[AVATARAPPEARANCE] vparams changed [{0}] {1} ==> {2}", | 511 | // m_log.WarnFormat("[AVATARAPPEARANCE] vparams changed [{0}] {1} ==> {2}", |
521 | i,m_visualparams[i],visualParams[i]); | 512 | // i,m_visualparams[i],visualParams[i]); |
522 | // DEBUG OFF | 513 | // DEBUG OFF |
523 | m_visualparams[i] = visualParams[i]; | 514 | m_visualparams[i] = visualParams[i]; |
524 | changed = true; | 515 | changed = true; |
@@ -569,6 +560,9 @@ namespace OpenSim.Framework | |||
569 | public override String ToString() | 560 | public override String ToString() |
570 | { | 561 | { |
571 | String s = ""; | 562 | String s = ""; |
563 | |||
564 | s += String.Format("Serial: {0}\n",m_serial); | ||
565 | |||
572 | for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++) | 566 | for (uint i = 0; i < AvatarAppearance.TEXTURE_COUNT; i++) |
573 | if (m_texture.FaceTextures[i] != null) | 567 | if (m_texture.FaceTextures[i] != null) |
574 | s += String.Format("Texture: {0} --> {1}\n",i,m_texture.FaceTextures[i].TextureID); | 568 | s += String.Format("Texture: {0} --> {1}\n",i,m_texture.FaceTextures[i].TextureID); |
@@ -585,12 +579,41 @@ namespace OpenSim.Framework | |||
585 | } | 579 | } |
586 | // DEBUG OFF | 580 | // DEBUG OFF |
587 | 581 | ||
588 | public void SetAttachments(AvatarAttachment[] data) | 582 | /// <summary> |
583 | /// Get a list of the attachments, note that there may be | ||
584 | /// duplicate attachpoints | ||
585 | /// </summary> | ||
586 | public List<AvatarAttachment> GetAttachments() | ||
587 | { | ||
588 | List<AvatarAttachment> alist = new List<AvatarAttachment>(); | ||
589 | foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) | ||
590 | { | ||
591 | foreach (AvatarAttachment attach in kvp.Value) | ||
592 | alist.Add(new AvatarAttachment(attach)); | ||
593 | } | ||
594 | |||
595 | return alist; | ||
596 | } | ||
597 | |||
598 | internal void AppendAttachment(AvatarAttachment attach) | ||
589 | { | 599 | { |
590 | foreach (AvatarAttachment attach in data) | 600 | if (! m_attachments.ContainsKey(attach.AttachPoint)) |
591 | m_attachments[attach.AttachPoint] = new AvatarAttachment(attach); | 601 | m_attachments[attach.AttachPoint] = new List<AvatarAttachment>(); |
602 | m_attachments[attach.AttachPoint].Add(attach); | ||
592 | } | 603 | } |
593 | 604 | ||
605 | internal void ReplaceAttachment(AvatarAttachment attach) | ||
606 | { | ||
607 | m_attachments[attach.AttachPoint] = new List<AvatarAttachment>(); | ||
608 | m_attachments[attach.AttachPoint].Add(attach); | ||
609 | } | ||
610 | |||
611 | /// <summary> | ||
612 | /// Add an attachment, if the attachpoint has the | ||
613 | /// 0x80 bit set then we assume this is an append | ||
614 | /// operation otherwise we replace whatever is | ||
615 | /// currently attached at the attachpoint | ||
616 | /// </summary> | ||
594 | public void SetAttachment(int attachpoint, UUID item, UUID asset) | 617 | public void SetAttachment(int attachpoint, UUID item, UUID asset) |
595 | { | 618 | { |
596 | if (attachpoint == 0) | 619 | if (attachpoint == 0) |
@@ -603,67 +626,47 @@ namespace OpenSim.Framework | |||
603 | return; | 626 | return; |
604 | } | 627 | } |
605 | 628 | ||
606 | m_attachments[attachpoint] = new AvatarAttachment(attachpoint,item,asset); | 629 | // check if this is an append or a replace, 0x80 marks it as an append |
607 | } | 630 | if ((attachpoint & 0x80) > 0) |
608 | |||
609 | public Hashtable GetAttachments() | ||
610 | { | ||
611 | if (m_attachments.Count == 0) | ||
612 | return null; | ||
613 | |||
614 | Hashtable ret = new Hashtable(); | ||
615 | |||
616 | foreach (KeyValuePair<int, AvatarAttachment> kvp in m_attachments) | ||
617 | { | 631 | { |
618 | Hashtable data = new Hashtable(); | 632 | // strip the append bit |
619 | data["item"] = kvp.Value.ItemID.ToString(); | 633 | int point = attachpoint & 0x7F; |
620 | data["asset"] = kvp.Value.AssetID.ToString(); | 634 | AppendAttachment(new AvatarAttachment(point, item, asset)); |
621 | 635 | } | |
622 | ret[kvp.Key] = data; | 636 | else |
637 | { | ||
638 | ReplaceAttachment(new AvatarAttachment(attachpoint,item,asset)); | ||
623 | } | 639 | } |
624 | |||
625 | return ret; | ||
626 | } | ||
627 | |||
628 | public List<int> GetAttachedPoints() | ||
629 | { | ||
630 | return new List<int>(m_attachments.Keys); | ||
631 | } | ||
632 | |||
633 | public UUID GetAttachedItem(int attachpoint) | ||
634 | { | ||
635 | if (!m_attachments.ContainsKey(attachpoint)) | ||
636 | return UUID.Zero; | ||
637 | |||
638 | return m_attachments[attachpoint].ItemID; | ||
639 | } | ||
640 | |||
641 | public UUID GetAttachedAsset(int attachpoint) | ||
642 | { | ||
643 | if (!m_attachments.ContainsKey(attachpoint)) | ||
644 | return UUID.Zero; | ||
645 | |||
646 | return m_attachments[attachpoint].AssetID; | ||
647 | } | 640 | } |
648 | 641 | ||
649 | public int GetAttachpoint(UUID itemID) | 642 | public int GetAttachpoint(UUID itemID) |
650 | { | 643 | { |
651 | foreach (KeyValuePair<int, AvatarAttachment> kvp in m_attachments) | 644 | foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) |
652 | { | 645 | { |
653 | if (kvp.Value.ItemID == itemID) | 646 | int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; }); |
654 | { | 647 | if (index >= 0) |
655 | return kvp.Key; | 648 | return kvp.Key; |
656 | } | ||
657 | } | 649 | } |
650 | |||
658 | return 0; | 651 | return 0; |
659 | } | 652 | } |
660 | 653 | ||
661 | public void DetachAttachment(UUID itemID) | 654 | public void DetachAttachment(UUID itemID) |
662 | { | 655 | { |
663 | int attachpoint = GetAttachpoint(itemID); | 656 | foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) |
657 | { | ||
658 | int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; }); | ||
659 | if (index >= 0) | ||
660 | { | ||
661 | // Remove it from the list of attachments at that attach point | ||
662 | m_attachments[kvp.Key].RemoveAt(index); | ||
664 | 663 | ||
665 | if (attachpoint > 0) | 664 | // And remove the list if there are no more attachments here |
666 | m_attachments.Remove(attachpoint); | 665 | if (m_attachments[kvp.Key].Count == 0) |
666 | m_attachments.Remove(kvp.Key); | ||
667 | return; | ||
668 | } | ||
669 | } | ||
667 | } | 670 | } |
668 | 671 | ||
669 | public void ClearAttachments() | 672 | public void ClearAttachments() |
@@ -671,6 +674,8 @@ namespace OpenSim.Framework | |||
671 | m_attachments.Clear(); | 674 | m_attachments.Clear(); |
672 | } | 675 | } |
673 | 676 | ||
677 | #region Packing Functions | ||
678 | |||
674 | /// <summary> | 679 | /// <summary> |
675 | /// Create an OSDMap from the appearance data | 680 | /// Create an OSDMap from the appearance data |
676 | /// </summary> | 681 | /// </summary> |
@@ -695,7 +700,7 @@ namespace OpenSim.Framework | |||
695 | if (m_texture.FaceTextures[i] != null) | 700 | if (m_texture.FaceTextures[i] != null) |
696 | textures.Add(OSD.FromUUID(m_texture.FaceTextures[i].TextureID)); | 701 | textures.Add(OSD.FromUUID(m_texture.FaceTextures[i].TextureID)); |
697 | else | 702 | else |
698 | textures.Add(OSD.FromUUID(UUID.Zero)); | 703 | textures.Add(OSD.FromUUID(AppearanceManager.DEFAULT_AVATAR_TEXTURE)); |
699 | } | 704 | } |
700 | data["textures"] = textures; | 705 | data["textures"] = textures; |
701 | 706 | ||
@@ -705,8 +710,8 @@ namespace OpenSim.Framework | |||
705 | 710 | ||
706 | // Attachments | 711 | // Attachments |
707 | OSDArray attachs = new OSDArray(m_attachments.Count); | 712 | OSDArray attachs = new OSDArray(m_attachments.Count); |
708 | foreach (KeyValuePair<int, AvatarAttachment> kvp in m_attachments) | 713 | foreach (AvatarAttachment attach in GetAttachments()) |
709 | attachs.Add(kvp.Value.Pack()); | 714 | attachs.Add(attach.Pack()); |
710 | data["attachments"] = attachs; | 715 | data["attachments"] = attachs; |
711 | 716 | ||
712 | return data; | 717 | return data; |
@@ -718,8 +723,8 @@ namespace OpenSim.Framework | |||
718 | /// </summary> | 723 | /// </summary> |
719 | public void Unpack(OSDMap data) | 724 | public void Unpack(OSDMap data) |
720 | { | 725 | { |
721 | if ((data != null) && (data["appearance_serial"] != null)) | 726 | if ((data != null) && (data["serial"] != null)) |
722 | m_serial = data["appearance_serial"].AsInteger(); | 727 | m_serial = data["serial"].AsInteger(); |
723 | if ((data != null) && (data["height"] != null)) | 728 | if ((data != null) && (data["height"] != null)) |
724 | m_avatarHeight = (float)data["height"].AsReal(); | 729 | m_avatarHeight = (float)data["height"].AsReal(); |
725 | if ((data != null) && (data["hipoffset"] != null)) | 730 | if ((data != null) && (data["hipoffset"] != null)) |
@@ -747,12 +752,10 @@ namespace OpenSim.Framework | |||
747 | OSDArray textures = (OSDArray)(data["textures"]); | 752 | OSDArray textures = (OSDArray)(data["textures"]); |
748 | for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++) | 753 | for (int i = 0; i < AvatarAppearance.TEXTURE_COUNT && i < textures.Count; i++) |
749 | { | 754 | { |
755 | UUID textureID = AppearanceManager.DEFAULT_AVATAR_TEXTURE; | ||
750 | if (textures[i] != null) | 756 | if (textures[i] != null) |
751 | { | 757 | textureID = textures[i].AsUUID(); |
752 | UUID textureID = textures[i].AsUUID(); | 758 | m_texture.CreateFace((uint)i).TextureID = new UUID(textureID); |
753 | if (textureID != UUID.Zero) | ||
754 | m_texture.CreateFace((uint)i).TextureID = textureID; | ||
755 | } | ||
756 | } | 759 | } |
757 | } | 760 | } |
758 | else | 761 | else |
@@ -773,15 +776,12 @@ namespace OpenSim.Framework | |||
773 | } | 776 | } |
774 | 777 | ||
775 | // Attachments | 778 | // Attachments |
776 | m_attachments = new Dictionary<int, AvatarAttachment>(); | 779 | m_attachments = new Dictionary<int, List<AvatarAttachment>>(); |
777 | if ((data != null) && (data["attachments"] != null) && (data["attachments"]).Type == OSDType.Array) | 780 | if ((data != null) && (data["attachments"] != null) && (data["attachments"]).Type == OSDType.Array) |
778 | { | 781 | { |
779 | OSDArray attachs = (OSDArray)(data["attachments"]); | 782 | OSDArray attachs = (OSDArray)(data["attachments"]); |
780 | for (int i = 0; i < attachs.Count; i++) | 783 | for (int i = 0; i < attachs.Count; i++) |
781 | { | 784 | AppendAttachment(new AvatarAttachment((OSDMap)attachs[i])); |
782 | AvatarAttachment attach = new AvatarAttachment((OSDMap)attachs[i]); | ||
783 | m_attachments[attach.AttachPoint] = attach; | ||
784 | } | ||
785 | } | 785 | } |
786 | } | 786 | } |
787 | catch (Exception e) | 787 | catch (Exception e) |
@@ -790,6 +790,9 @@ namespace OpenSim.Framework | |||
790 | } | 790 | } |
791 | } | 791 | } |
792 | 792 | ||
793 | #endregion | ||
794 | |||
795 | #region VPElement | ||
793 | 796 | ||
794 | /// <summary> | 797 | /// <summary> |
795 | /// Viewer Params Array Element for AgentSetAppearance | 798 | /// Viewer Params Array Element for AgentSetAppearance |
@@ -1553,5 +1556,6 @@ namespace OpenSim.Framework | |||
1553 | SKIRT_SKIRT_GREEN = 216, | 1556 | SKIRT_SKIRT_GREEN = 216, |
1554 | SKIRT_SKIRT_BLUE = 217 | 1557 | SKIRT_SKIRT_BLUE = 217 |
1555 | } | 1558 | } |
1559 | #endregion | ||
1556 | } | 1560 | } |
1557 | } | 1561 | } |
diff --git a/OpenSim/Framework/Capabilities/Caps.cs b/OpenSim/Framework/Capabilities/Caps.cs index 6b64e12..872de9a 100644 --- a/OpenSim/Framework/Capabilities/Caps.cs +++ b/OpenSim/Framework/Capabilities/Caps.cs | |||
@@ -31,6 +31,7 @@ using System.Collections.Generic; | |||
31 | using System.IO; | 31 | using System.IO; |
32 | using System.Reflection; | 32 | using System.Reflection; |
33 | using log4net; | 33 | using log4net; |
34 | using Nini.Config; | ||
34 | using OpenMetaverse; | 35 | using OpenMetaverse; |
35 | using OpenSim.Framework.Servers; | 36 | using OpenSim.Framework.Servers; |
36 | using OpenSim.Framework.Servers.HttpServer; | 37 | using OpenSim.Framework.Servers.HttpServer; |
@@ -112,6 +113,8 @@ namespace OpenSim.Framework.Capabilities | |||
112 | private string m_regionName; | 113 | private string m_regionName; |
113 | private object m_fetchLock = new Object(); | 114 | private object m_fetchLock = new Object(); |
114 | 115 | ||
116 | private bool m_persistBakedTextures = false; | ||
117 | |||
115 | public bool SSLCaps | 118 | public bool SSLCaps |
116 | { | 119 | { |
117 | get { return m_httpListener.UseSSL; } | 120 | get { return m_httpListener.UseSSL; } |
@@ -145,6 +148,15 @@ namespace OpenSim.Framework.Capabilities | |||
145 | 148 | ||
146 | m_httpListenPort = httpPort; | 149 | m_httpListenPort = httpPort; |
147 | 150 | ||
151 | m_persistBakedTextures = false; | ||
152 | IConfigSource config = m_Scene.Config; | ||
153 | if (config != null) | ||
154 | { | ||
155 | IConfig sconfig = config.Configs["Startup"]; | ||
156 | if (sconfig != null) | ||
157 | m_persistBakedTextures = sconfig.GetBoolean("PersistBakedTextures",m_persistBakedTextures); | ||
158 | } | ||
159 | |||
148 | if (httpServer != null && httpServer.UseSSL) | 160 | if (httpServer != null && httpServer.UseSSL) |
149 | { | 161 | { |
150 | m_httpListenPort = httpServer.SSLPort; | 162 | m_httpListenPort = httpServer.SSLPort; |
@@ -983,7 +995,7 @@ namespace OpenSim.Framework.Capabilities | |||
983 | asset = new AssetBase(assetID, "Baked Texture", (sbyte)AssetType.Texture, m_agentID.ToString()); | 995 | asset = new AssetBase(assetID, "Baked Texture", (sbyte)AssetType.Texture, m_agentID.ToString()); |
984 | asset.Data = data; | 996 | asset.Data = data; |
985 | asset.Temporary = true; | 997 | asset.Temporary = true; |
986 | asset.Local = true; | 998 | asset.Local = ! m_persistBakedTextures; // Local assets aren't persisted, non-local are |
987 | m_assetCache.Store(asset); | 999 | m_assetCache.Store(asset); |
988 | } | 1000 | } |
989 | 1001 | ||
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index fdebba3..66487f7 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs | |||
@@ -28,6 +28,8 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Reflection; | ||
32 | using log4net; | ||
31 | using OpenMetaverse; | 33 | using OpenMetaverse; |
32 | using OpenMetaverse.StructuredData; | 34 | using OpenMetaverse.StructuredData; |
33 | 35 | ||
@@ -310,6 +312,12 @@ namespace OpenSim.Framework | |||
310 | // Appearance | 312 | // Appearance |
311 | public AvatarAppearance Appearance; | 313 | public AvatarAppearance Appearance; |
312 | 314 | ||
315 | // DEBUG ON | ||
316 | private static readonly ILog m_log = | ||
317 | LogManager.GetLogger( | ||
318 | MethodBase.GetCurrentMethod().DeclaringType); | ||
319 | // DEBUG OFF | ||
320 | |||
313 | /* | 321 | /* |
314 | public byte[] AgentTextures; | 322 | public byte[] AgentTextures; |
315 | public byte[] VisualParams; | 323 | public byte[] VisualParams; |
@@ -323,6 +331,10 @@ namespace OpenSim.Framework | |||
323 | 331 | ||
324 | public virtual OSDMap Pack() | 332 | public virtual OSDMap Pack() |
325 | { | 333 | { |
334 | // DEBUG ON | ||
335 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] Pack data"); | ||
336 | // DEBUG OFF | ||
337 | |||
326 | OSDMap args = new OSDMap(); | 338 | OSDMap args = new OSDMap(); |
327 | args["message_type"] = OSD.FromString("AgentData"); | 339 | args["message_type"] = OSD.FromString("AgentData"); |
328 | 340 | ||
@@ -387,31 +399,40 @@ namespace OpenSim.Framework | |||
387 | // args["agent_textures"] = textures; | 399 | // args["agent_textures"] = textures; |
388 | //} | 400 | //} |
389 | 401 | ||
390 | /* | 402 | // The code to pack textures, visuals, wearables and attachments |
391 | if ((AgentTextures != null) && (AgentTextures.Length > 0)) | 403 | // should be removed; packed appearance contains the full appearance |
392 | args["texture_entry"] = OSD.FromBinary(AgentTextures); | 404 | // This is retained for backward compatibility only |
405 | if (Appearance.Texture != null) | ||
406 | { | ||
407 | byte[] rawtextures = Appearance.Texture.GetBytes(); | ||
408 | args["texture_entry"] = OSD.FromBinary(rawtextures); | ||
409 | } | ||
393 | 410 | ||
394 | if ((VisualParams != null) && (VisualParams.Length > 0)) | 411 | if ((Appearance.VisualParams != null) && (Appearance.VisualParams.Length > 0)) |
395 | args["visual_params"] = OSD.FromBinary(VisualParams); | 412 | args["visual_params"] = OSD.FromBinary(Appearance.VisualParams); |
396 | 413 | ||
397 | // We might not pass this in all cases... | 414 | // We might not pass this in all cases... |
398 | if ((Wearables != null) && (Wearables.Length > 0)) | 415 | if ((Appearance.Wearables != null) && (Appearance.Wearables.Length > 0)) |
399 | { | 416 | { |
400 | OSDArray wears = new OSDArray(Wearables.Length); | 417 | OSDArray wears = new OSDArray(Appearance.Wearables.Length * 2); |
401 | foreach (UUID uuid in Wearables) | 418 | foreach (AvatarWearable awear in Appearance.Wearables) |
402 | wears.Add(OSD.FromUUID(uuid)); | 419 | { |
420 | wears.Add(OSD.FromUUID(awear.ItemID)); | ||
421 | wears.Add(OSD.FromUUID(awear.AssetID)); | ||
422 | } | ||
403 | args["wearables"] = wears; | 423 | args["wearables"] = wears; |
404 | } | 424 | } |
405 | 425 | ||
406 | 426 | List<AvatarAttachment> attachments = Appearance.GetAttachments(); | |
407 | if ((Attachments != null) && (Attachments.Length > 0)) | 427 | if ((attachments != null) && (attachments.Count > 0)) |
408 | { | 428 | { |
409 | OSDArray attachs = new OSDArray(Attachments.Length); | 429 | OSDArray attachs = new OSDArray(attachments.Count); |
410 | foreach (AvatarAttachment att in Attachments) | 430 | foreach (AvatarAttachment att in attachments) |
411 | attachs.Add(att.Pack()); | 431 | attachs.Add(att.Pack()); |
412 | args["attachments"] = attachs; | 432 | args["attachments"] = attachs; |
413 | } | 433 | } |
414 | */ | 434 | // End of code to remove |
435 | |||
415 | if ((Controllers != null) && (Controllers.Length > 0)) | 436 | if ((Controllers != null) && (Controllers.Length > 0)) |
416 | { | 437 | { |
417 | OSDArray controls = new OSDArray(Controllers.Length); | 438 | OSDArray controls = new OSDArray(Controllers.Length); |
@@ -435,6 +456,10 @@ namespace OpenSim.Framework | |||
435 | /// <param name="hash"></param> | 456 | /// <param name="hash"></param> |
436 | public virtual void Unpack(OSDMap args) | 457 | public virtual void Unpack(OSDMap args) |
437 | { | 458 | { |
459 | // DEBUG ON | ||
460 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] Unpack data"); | ||
461 | // DEBUG OFF | ||
462 | |||
438 | if (args.ContainsKey("region_id")) | 463 | if (args.ContainsKey("region_id")) |
439 | UUID.TryParse(args["region_id"].AsString(), out RegionID); | 464 | UUID.TryParse(args["region_id"].AsString(), out RegionID); |
440 | 465 | ||
@@ -547,41 +572,54 @@ namespace OpenSim.Framework | |||
547 | // AgentTextures[i++] = o.AsUUID(); | 572 | // AgentTextures[i++] = o.AsUUID(); |
548 | //} | 573 | //} |
549 | 574 | ||
550 | if (args["packed_appearance"] != null) | 575 | Appearance = new AvatarAppearance(AgentID); |
551 | Appearance = new AvatarAppearance(AgentID,(OSDMap)args["packed_appearance"]); | 576 | |
552 | else | 577 | // The code to unpack textures, visuals, wearables and attachments |
553 | Appearance = new AvatarAppearance(AgentID); | 578 | // should be removed; packed appearance contains the full appearance |
554 | 579 | // This is retained for backward compatibility only | |
555 | /* | ||
556 | if (args["texture_entry"] != null) | 580 | if (args["texture_entry"] != null) |
557 | AgentTextures = args["texture_entry"].AsBinary(); | 581 | { |
582 | byte[] rawtextures = args["texture_entry"].AsBinary(); | ||
583 | Primitive.TextureEntry textures = new Primitive.TextureEntry(rawtextures,0,rawtextures.Length); | ||
584 | Appearance.SetTextureEntries(textures); | ||
585 | } | ||
558 | 586 | ||
559 | if (args["visual_params"] != null) | 587 | if (args["visual_params"] != null) |
560 | VisualParams = args["visual_params"].AsBinary(); | 588 | Appearance.SetVisualParams(args["visual_params"].AsBinary()); |
561 | 589 | ||
562 | if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) | 590 | if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) |
563 | { | 591 | { |
564 | OSDArray wears = (OSDArray)(args["wearables"]); | 592 | OSDArray wears = (OSDArray)(args["wearables"]); |
565 | Wearables = new UUID[wears.Count]; | 593 | for (int i = 0; i < wears.Count / 2; i++) |
566 | int i = 0; | 594 | { |
567 | foreach (OSD o in wears) | 595 | AvatarWearable awear = new AvatarWearable(wears[i*2].AsUUID(),wears[(i*2)+1].AsUUID()); |
568 | Wearables[i++] = o.AsUUID(); | 596 | Appearance.SetWearable(i,awear); |
597 | } | ||
569 | } | 598 | } |
570 | 599 | ||
571 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) | 600 | if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) |
572 | { | 601 | { |
573 | OSDArray attachs = (OSDArray)(args["attachments"]); | 602 | OSDArray attachs = (OSDArray)(args["attachments"]); |
574 | Attachments = new AvatarAttachment[attachs.Count]; | ||
575 | int i = 0; | ||
576 | foreach (OSD o in attachs) | 603 | foreach (OSD o in attachs) |
577 | { | 604 | { |
578 | if (o.Type == OSDType.Map) | 605 | if (o.Type == OSDType.Map) |
579 | { | 606 | { |
580 | Attachments[i++] = new AvatarAttachment((OSDMap)o); | 607 | // We know all of these must end up as attachments so we |
608 | // append rather than replace to ensure multiple attachments | ||
609 | // per point continues to work | ||
610 | Appearance.AppendAttachment(new AvatarAttachment((OSDMap)o)); | ||
581 | } | 611 | } |
582 | } | 612 | } |
583 | } | 613 | } |
584 | */ | 614 | // end of code to remove |
615 | |||
616 | if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) | ||
617 | Appearance = new AvatarAppearance(AgentID,(OSDMap)args["packed_appearance"]); | ||
618 | // DEBUG ON | ||
619 | else | ||
620 | m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance"); | ||
621 | // DEBUG OFF | ||
622 | |||
585 | if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) | 623 | if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) |
586 | { | 624 | { |
587 | OSDArray controls = (OSDArray)(args["controllers"]); | 625 | OSDArray controls = (OSDArray)(args["controllers"]); |