Appearance Formats

From OpenSimulator

Revision as of 19:46, 25 October 2012 by Justincc (Talk | contribs)

Jump to: navigation, search

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

<llsd>
  <map>
    <key>serial</key>
    <integer>0</integer>
    <key>height</key>
    <real>1.6909986734390259</real>
    <key>wearables</key>
    <array>
      <array>
        <map>
          <key>item</key>
          <uuid>0718fafa-e67a-438e-9431-cd93e83accab</uuid>
          <key>asset</key>
          <uuid>66c41e39-38f9-f75a-024e-585989bfab73</uuid>
        </map>
      </array>
      <array>
        <map>
          <key>item</key>
          <uuid>a394cb67-6d51-4211-b540-939531e558c0</uuid>
          <key>asset</key>
          <uuid>77c41e39-38f9-f75a-024e-585989bbabbb</uuid>
        </map>
      </array>
      <array>
        <map>
          <key>item</key>
          <uuid>63317a84-cebe-4337-b99c-fe8c24286eda</uuid>
          <key>asset</key>
          <uuid>d342e6c0-b9d2-11dc-95ff-0800200c9a66</uuid>
        </map>
      </array>
      <array>
        <map>
          <key>item</key>
          <uuid>2edbb0f7-51ed-47ef-a5ec-0bb16f9fa638</uuid>
          <key>asset</key>
          <uuid>4bb6fa4d-1cd2-498a-a84c-95c1a0e745a7</uuid>
        </map>
      </array>
      <array>
        <map>
          <key>item</key>
          <uuid>9ca33379-159d-4015-bad9-9bedb62033d2</uuid>
          <key>asset</key>
          <uuid>a2d3568a-c1b0-9caf-dd2f-4d3e4d2691e5</uuid>
        </map>
      </array>
      <array>
        <map>
          <key>item</key>
          <uuid>7e152cf6-3103-4be2-a2b6-e4e0bc56f840</uuid>
          <key>asset</key>
          <uuid>00000000-38f9-1111-024e-222222111120</uuid>
        </map>
      </array>
      <array />
      <array />
      <array />
      <array />
      <array />
      <array />
      <array />
      <array />
      <array />
    </array>
    <key>textures</key>
    <array>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>fb4535ad-e21a-482e-a020-b07fb3255214</uuid>
      <uuid>2ed9d686-120d-4e41-82b2-8d469e4658b6</uuid>
      <uuid>bf61d86d-fb38-4b06-a43c-a9451a38c5a6</uuid>
      <uuid>db27d46d-0831-4fa7-b413-8730ed530d9b</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>c228d1cf-4b5d-4ba8-84f4-899a0796aa97</uuid>
      <uuid>93f7702c-e200-4b0b-8942-b77c1872c0a0</uuid>
    </array>
    <key>visualparams</key>
    <binary encoding="base64">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=</binary>
    <key>attachments</key>
    <array>
      <map>
        <key>point</key>
        <integer>2</integer>
        <key>item</key>
        <uuid>322a42e2-4fd4-427d-bee8-bc6ed66ec0f0</uuid>
        <key>asset</key>
        <uuid>a55466ff-6ed4-4277-bfb4-326859494b3f</uuid>
      </map>
    </array>
  </map>
</llsd>

This data is in LLSD format where there are <key> entries followed by various data entries, such as <array>, <binary>, etc. This is all generated by OpenSimulator's OpenSim.Framework.AvatarAppearance.Pack() method.

  • 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 <uuid> 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.
Personal tools
General
About This Wiki