public CharacterModel Read(XDocument input, CharacterModel model, ContentManager content, GraphicsDevice graphics) { CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; model = new CharacterModel(); SpriterProcessor processor = new SpriterProcessor(); // pitäs lukea xml:stä yhen filun koko helevetti SpriterShadowData data = processor.Process(input, content, graphics); Dictionary <int, Dictionary <int, Vector2> > l_defaultPivot = new Dictionary <int, Dictionary <int, Vector2> >(); foreach (XElement l_folder in data.XML.Root.Descendants("folder")) { int l_folderId = ReadInt(l_folder, "id", -1); foreach (XElement l_file in l_folder.Descendants("file")) { int l_fileId = ReadInt(l_file, "id", -1); float l_tmpX = ReadFloat(l_file, "pivot_x", 0); float l_tmpY = ReadFloat(l_file, "pivot_y", 1); l_defaultPivot.GetOrCreate(l_folderId).Add(l_fileId, new Vector2(l_tmpX, l_tmpY)); } } model.Textures = data.Textures; model.Rectangles = data.Rectangles; #region Entities // ----------------------Entityt --------------------- foreach (var xEntity in input.Root.Elements("entity")) { Entity entity = new Entity(); entity.Name = xEntity.Attribute("name").Value; #region Animations // --------------- Animaatiot --------------------- foreach (var xAnimation in xEntity.Elements("animation")) { var animation = ParseAnimation(xAnimation); #region Mainline // --------------- Mainline ----------------------- foreach (var xMainlinekey in xAnimation.Element("mainline").Elements("key")) { var key = ParseMainlineKey(xMainlinekey); // ---------------- object refs ----------------------- foreach (var xObjectRef in xMainlinekey.Elements("object_ref")) { var body = ParseObjectRef(xObjectRef); key.Body.Add(body); } // ----------------- bone refs ---------------------- int i = 0; foreach (var xBoneRef in xMainlinekey.Elements("bone_ref")) { var bone = ParseBoneRef(xBoneRef, ref i); key.Bones.Add(bone); } animation.MainLine.Add(key); } // mainline end #endregion #region Timeline int vittu = 0; // ------------------ timeline ----------------------------- foreach (var xTimeline in xAnimation.Elements("timeline")) { var timeline = ParseTimeline(xTimeline); // ----------------------- frame ------------------ #region Frame float minw, maxw, minh, maxh; minh = maxh = minw = maxw = 0; foreach (var xTimelineKey in xTimeline.Elements("key")) { var key = ParseTimelineKey(model, xTimelineKey, l_defaultPivot); if (key.Type != TimelineType.Bone) { Rectangle r = model.Rectangles[key.Folder][key.File]; maxw = Math.Max(maxw, key.Location.X + r.Width); minw = Math.Min(minw, key.Location.X); maxh = Math.Max(maxh, key.Location.Y + r.Height); minh = Math.Min(minh, key.Location.Y); } timeline.Keys.Add(key); } #endregion Size size = new Size((int)(maxw - minw), (int)(maxh - minh)); timeline.Size = size; animation.TimeLines.Add(timeline); } #endregion entity.Add(animation); } #endregion model.Add(entity); } #endregion Thread.CurrentThread.CurrentCulture = currentCulture; return(model); }