Appearance Formats

=Introduction=

The appearance format detailed here is used primarily to transfer appearance information between simulators and backend services, before the simulator uses various components in its own operations (e.g. to send information to viewers as to which attachments are being worn, etc.).

It is also used to store appearance information for NPCs. Unfortunately, in this role it is less than ideal since it wasn't designed to be changed by humans.

= Example = Here's is an example appearance serialization for a user wearing skin, eyes, hair and shape body parts, pants and shirt clothing items and a single skull attachment

 serial 0    height 1.6909986734390259    wearables item 0718fafa-e67a-438e-9431-cd93e83accab asset 66c41e39-38f9-f75a-024e-585989bfab73 item a394cb67-6d51-4211-b540-939531e558c0 asset 77c41e39-38f9-f75a-024e-585989bbabbb item 63317a84-cebe-4337-b99c-fe8c24286eda asset d342e6c0-b9d2-11dc-95ff-0800200c9a66 item 2edbb0f7-51ed-47ef-a5ec-0bb16f9fa638 asset 4bb6fa4d-1cd2-498a-a84c-95c1a0e745a7 item 9ca33379-159d-4015-bad9-9bedb62033d2 asset a2d3568a-c1b0-9caf-dd2f-4d3e4d2691e5 item 7e152cf6-3103-4be2-a2b6-e4e0bc56f840 asset 00000000-38f9-1111-024e-222222111120 textures c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 fb4535ad-e21a-482e-a020-b07fb3255214 2ed9d686-120d-4e41-82b2-8d469e4658b6 bf61d86d-fb38-4b06-a43c-a9451a38c5a6 db27d46d-0831-4fa7-b413-8730ed530d9b c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 c228d1cf-4b5d-4ba8-84f4-899a0796aa97 93f7702c-e200-4b0b-8942-b77c1872c0a0 visualparams IT1VFzp/P1U/KgBVPyRVX5k/IgA/bViEP4hRVWeIfwDLAAB/AAAAAAB/AAD/f3J/Yz9/jH9/AAAAvwBoAAAAAAAAAAAAkdiFAH8Af6oAAH9/bVV/fz9VKmTY1szMzDMZWUzMAH8AAJBVf4R/VQB/f39/f387f1V/f2ovT39/zAKNQgAAf38AAAAAfwCfAACyfyRVg39/f5lfAIxKG39/ANbMxgAAPx5/4v/G////zDMz////zAD//////////////wD//////wB/f/8ZZP////9UAAAAM4T///8= attachments point 2        item 322a42e2-4fd4-427d-bee8-bc6ed66ec0f0 asset a55466ff-6ed4-4277-bfb4-326859494b3f

This data is in LLSD xml format where there are entries followed by various data entries, such as, , etc. This is all generated by OpenSimulator's OpenSim.Framework.AvatarAppearance.Pack method. It can be turned back into a C# object via AvatarAppearance.Unpack.


 * serial - Appearance serial number, to keep track of appearance changes. For NPC purposes probably unimportant, though best to set this to zero.
 * height - Avatar height in meters.
 * wearables - An array of the clothing and body parts that the avatar is wearing. These are slotted according to the enum OpenMetaverse.WearableType.  So, for instance, the second entry (index 1) is skin.  Each entry then references an inventory item UUID and an asset UUID.  For NPCs, neither of these are actually relevant - the inventory UUID can be ignored since NPCs do not have inventory.  Whilst the asset UUID does point towards the relevant asset data (in this example, for the skin asset), it's actually baked textures in the textures entry that are used to display the avatars clothing/bodypart appearance.
 * textures - These entries reference avatar baked appearance textures that are sent to users. The index numbers of the slots come from OpenMetaverse.AvatarTextureIndex (e.g. slot index 1 is UpperShirt).  c228d1cf-4b5d-4ba8-84f4-899a0796aa97 (OpenMetaverse.AppearanceManager.DEFAULT_AVATAR_TEXTURE) is the default avatar texture and occupies slots which are not actually set.  The other UUIDs reference actual stored baked texture assets.  In this case, for instance, index 8, fb4535ad-e21a-482e-a020-b07fb3255214, corresponds to AvatarTextureIndex.HeadBaked.
 * visualparams - These are all the visual parameters used to determine the basic appearance of the avatar shape (the parameters you see when you "edit shape" in a viewer, such as Lip Width in the Mouth section). There is probably redundancy with the data stored in the shape asset.  Unfortunately, since this format derives from the wire format, the parameters are encoded as a binary blob.  They can be decoded (and encoded) using OpenMetaverse.StructuredData.OSDBinary (see AvatarAppearance.Pack and Unpack for examples).  Not all visual params are currently added - some extra ones have been added by Linden Lab that are not yet handled.
 * attachments - Attachment data. These are the attachments for this appearance.  The point key on each entry refers to the attachment point as detailed by OpenMetaverse.AttachmentPoint.  In this case, 2 is AttachmentPoint.Skull.  Like wearable entries, the clothing item UUID refers to a clothing item that is not used for NPCs.  However, in this case the asset UUID is important since attachments are proper objects and not part of the baked texture.  The asset UUID refers to the serialized object.  This serialization contains the information that govern exact attachment position, rotation, etc.

= Database =

This data actually originates from the Avatars table in the OpenSimulator database. This is used by the ROBUST AvatarService.

In the Avatars table, data is stored in key:value from for each agent ID. For instance, VisualParams is a comma separated list of all the Avatar visual parameters (height, nose length, etc.). Wearable : lists item and agent IDs for each wearable the avatar has on. _ap_ shows the item equipped at each attachment point where applicable.