public new static bool Equals(object objA, object objB)
            {
                MeshInstRange lhs = objA as MeshInstRange;
                MeshInstRange rhs = objB as MeshInstRange;

                return(lhs.inst.Equals(rhs.inst) && lhs.range == rhs.range);
            }
        //--------------------------------
        private void RemoveUberizeItem(TreeNodeAdv node)
        {
            // update the uberize item dictionary.
            MeshInstRange curKey = node.Tag as MeshInstRange;

            if (curKey != null)
            {
                int refCount = (_uberizeItems[curKey] -= 1);
                if (refCount == 0)
                {
                    _uberizeItems.Remove(curKey);
                }
            }

            // remove the model if necessary.
            string curModel = node.Tag as string;

            if (curModel != null)
            {
                if (_models.ContainsKey(curModel))
                {
                    _models.Remove(curModel);
                }
            }

            // recurse children.
            while (node.Nodes.Count > 0)
            {
                RemoveUberizeItem(node.Nodes[0]);
            }

            // remove the node.
            node.Remove();
        }
        private void GetUniqueNodes(Dictionary <MeshInstRange, int> items, TreeNodeAdv node)
        {
            // add the current node's key.
            MeshInstRange key = node.Tag as MeshInstRange;

            if (key != null)
            {
                items.Add(key, 0);
            }

            // recurse.
            foreach (TreeNodeAdv child in node.Nodes)
            {
                GetUniqueNodes(items, child);
            }
        }
        //--------------------------------
        private void AddUberizeItem(TreeNodeAdv parent, MeshInst inst)
        {
            TreeNodeAdv meshNode = new TreeNodeAdv(inst.Mesh.Name);

            parent.Nodes.Add(meshNode);

            // iterate through mesh instance's ranges.
            int  rangeIndex = 0;
            Mesh mesh       = inst.Mesh;

            for (int i = 0; i < inst.RangeCount; ++i)
            {
                // get the range info.
                RangeInfo range;
                if (!mesh.GetRange(out range, i))
                {
                    continue;
                }

                TreeNodeAdv rangeNode = new TreeNodeAdv(range.Name);
                meshNode.Nodes.Add(rangeNode);

                // fill out a new key.
                MeshInstRange key = new MeshInstRange();
                key.inst  = inst;
                key.range = rangeIndex;

                // check for the current mesh instance/range pair.
                if (_uberizeItems.ContainsKey(key))
                {
                    // increment the reference count if necessary.
                    _uberizeItems[key] += 1;
                }
                else
                {
                    // TODO: Calculate a valid default matrix.
                    _uberizeItems.Add(key, 1);
                    rangeNode.Tag = key;
                }
            }
        }
            public override bool Equals(object obj)
            {
                MeshInstRange rhs = obj as MeshInstRange;

                return(inst.Equals(rhs.inst) && range == rhs.range);
            }