Details about object resource usage
        /// <summary>
        /// Deserializes object from OSD
        /// </summary>
        /// <param name="osd">An <see cref="OSDMap"/> containing the data</param>
        public override void Deserialize(OSDMap osd)
        {
            base.Deserialize(osd);
            OSDArray attachments = (OSDArray)((OSDMap)osd)["attachments"];
            Attachments = new Dictionary<AttachmentPoint, ObjectResourcesDetail[]>();

            for (int i = 0; i < attachments.Count; i++)
            {
                OSDMap attachment = (OSDMap)attachments[i];
                AttachmentPoint pt = Utils.StringToAttachmentPoint(attachment["location"].AsString());

                OSDArray objectsOSD = (OSDArray)attachment["objects"];
                ObjectResourcesDetail[] objects = new ObjectResourcesDetail[objectsOSD.Count];

                for (int j = 0; j < objects.Length; j++)
                {
                    objects[j] = ObjectResourcesDetail.FromOSD(objectsOSD[j]);
                }

                Attachments.Add(pt, objects);
            }
        }
 /// <summary>
 /// Makes an instance based on deserialized data
 /// </summary>
 /// <param name="osd"><see cref="OSD"/> serialized data</param>
 /// <returns>Instance containg deserialized data</returns>
 public static ObjectResourcesDetail FromOSD(OSD osd)
 {
     ObjectResourcesDetail res = new ObjectResourcesDetail();
     res.Deserialize((OSDMap)osd);
     return res;
 }