/* * BoneIndexer.cs * Copyright (c) 2006 David Astle * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ using System; using System.Collections.Generic; using System.Text; using System.Collections.ObjectModel; namespace Xclna.Xna.Animation.Content { /// /// Assists in creating palette indices for mesh bones. /// public sealed class BoneIndexer { private int currentIndex = 0; private Dictionary dict = new Dictionary(); private List skinnedBoneNames = new List(); /// /// The names of the skinned bones that have indices attached to this indexer. /// public ReadOnlyCollection SkinnedBoneNames { get { return skinnedBoneNames.AsReadOnly(); } } /// /// True if an index has been created for the given bone. /// /// The name of the bone. /// True if an index has been created for the given bone. public bool ContainsBone(string boneName) { return dict.ContainsKey(boneName); } /// /// Creates an index for a bone if one doesn't exist, and returns the palette /// index for the given bone. /// /// The name of the bone. /// The matrix palette index of the bone. public byte GetBoneIndex(string boneName) { if (!dict.ContainsKey(boneName)) { dict.Add(boneName, currentIndex); skinnedBoneNames.Add(boneName); currentIndex++; return (byte)(currentIndex - 1); } else return (byte)dict[boneName]; } } }