using System; using System.Collections.Generic; using System.Linq; using System.Text; using Xenki.Framework; using System.Windows.Media.Media3D; using OpenMetaverse; using OpenMetaverse.Rendering; using Quaternion = System.Windows.Media.Media3D.Quaternion; using Material = System.Windows.Media.Media3D.Material; namespace Xenki.DefaultRenderer { public delegate void OnNewPrimitive(Visual3D visualPrim); public class DefaultDataControl { public static int ModelsCount = 10000; public static int ActivePrimCount = 1000; public static int TextureCachedCount = 1000; //primitives in the scene with visual format private readonly Dictionary m_models = new Dictionary(); //primitives in scene with original data format private readonly Dictionary m_PrimModelsInScene = new Dictionary(); //primitives and their parent. key:childlocalid value:parentlocalid private readonly Dictionary primitiveParent = new Dictionary(); private readonly Dictionary m_modelsWatingParent = new Dictionary(); private readonly Dictionary m_VisualNeedTextures = new Dictionary(); //texture materials. private readonly Dictionary m_materials = new Dictionary(); //used for store the models around the first person avatar within a certain distance. private readonly Dictionary m_ActivedModels = new Dictionary(); //temp variable store the search result of certain models in scene. public Dictionary workingDictionary_ModelsInscene = new Dictionary(); public Dictionary workingDic_ActivedModels = new Dictionary(); public Dictionary.Enumerator ModelsInScene { get { workingDictionary_ModelsInscene.Clear(); workingDictionary_ModelsInscene = null; lock (m_models) { workingDictionary_ModelsInscene = m_models.ToDictionary(p => p.Key, v => v.Value); } return workingDictionary_ModelsInscene.GetEnumerator(); } } public Dictionary.Enumerator PrimModelsInScene { get { return m_PrimModelsInScene.GetEnumerator(); } } public IEnumerator ModelsWaitingParent { get { return m_modelsWatingParent.Values.GetEnumerator(); } } public IEnumerator ModelsNeedTextures { get { return m_VisualNeedTextures.Keys.GetEnumerator(); } } private static readonly DefaultDataControl singleton = new DefaultDataControl(); public static DefaultDataControl SingleSceneDataManager() { return singleton; } private DefaultDataControl() { } public void AddNewPrimitive(uint id, Visual3D visual, uint parentID) { lock (m_models) { m_models[id] = visual; primitiveParent[id] = parentID; } } public bool SceneContainVisual(uint modelid) { bool b = false; lock (m_models) { b = m_models.ContainsKey(modelid); } return b; } public Visual3D GetVisualInScene(uint id) { Visual3D v = null; lock (m_models) if (m_models.ContainsKey(id)) v = m_models[id]; return v; } public void RemoveVisualInScene(uint id) { lock (m_models) { m_models.Remove(id); } } public void AddNewPrimitivePrimData(Primitive data) { lock (m_PrimModelsInScene) { m_PrimModelsInScene[data.LocalID] = data; } } public void RemovePrimtivePrimData(uint id) { lock (m_PrimModelsInScene) m_PrimModelsInScene.Remove(id); } public void AddWaitingParentPrimitive(uint id, Primitive data) { lock (m_modelsWatingParent) { if (m_modelsWatingParent.ContainsKey(id)) m_modelsWatingParent.Remove(id); m_modelsWatingParent.Add(id, data); } } public void RemoveWaitingParentPrimitive(uint id) { lock (m_modelsWatingParent) { m_modelsWatingParent.Remove(id); } } public IEnumerator GetModelsWaitingParent(uint parentID) { List list = new List(); lock (m_modelsWatingParent) { foreach (Primitive child in m_modelsWatingParent.Values) { if (child.ParentID == parentID) list.Add(child); } } return list.GetEnumerator(); } private uint? FindKeyByValue(Visual3D value) { uint? returnValue = null; object obj = value.GetValue(DefaultRenderer.depIdentity); if (obj != null) { returnValue = (uint)obj; return returnValue; } //lock (m_models) //{ // foreach (KeyValuePair pair in m_models) // { // if (pair.Value.Equals(value)) // returnValue = pair.Key; // } //} return returnValue; } public uint? GetKeyInSceneByValue(Visual3D visual) { return FindKeyByValue(visual); } public IEnumerator GetChildrenByVisual3D(Visual3D parent) { uint? key = FindKeyByValue(parent); if (key.HasValue == false) return new List.Enumerator(); List children = new List(); foreach (KeyValuePair child in primitiveParent) { if (child.Value == key.Value) children.Add(m_models[child.Key]); } return children.GetEnumerator(); } public void AddNeedTextureModel(uint model, UUID textureID) { lock (m_VisualNeedTextures) { if (m_VisualNeedTextures.ContainsKey(model) == true) m_VisualNeedTextures.Remove(model); m_VisualNeedTextures.Add(model, textureID); } } public void RemoveUnAttachedTexture(uint model) { lock (m_VisualNeedTextures) { if (m_VisualNeedTextures.ContainsKey(model)) m_VisualNeedTextures.Remove(model); } } public IEnumerator GetVisualByTextureID(UUID textureID) { List list = new List(); lock (m_VisualNeedTextures) { foreach (KeyValuePair pair in m_VisualNeedTextures) { if (pair.Value == textureID) { if (m_modelsWatingParent.ContainsKey(pair.Key) == true) continue; lock (m_PrimModelsInScene) { if (m_PrimModelsInScene.ContainsKey(pair.Key) == false) continue; list.Add(m_PrimModelsInScene[pair.Key]); } } } } return list.GetEnumerator(); } //public void AddModelsParentPositions(uint id, Vector3 pos) //{ // lock (m_parentPositions) // { // if (m_parentPositions.ContainsKey(id)) // m_parentPositions[id] = pos; // else // m_parentPositions.Add(id, pos); // } //} //public Vector3 GetModelsParentPosition(uint id) //{ // Vector3 vec = new Vector3(); // lock (m_parentPositions) // { // if (m_parentPositions.ContainsKey(id)) // vec = m_parentPositions[id]; // } // return vec; //} public Primitive GetParentRotation(uint parentid) { uint temp = parentid; lock (m_PrimModelsInScene) while (m_PrimModelsInScene.ContainsKey(parentid)) { temp = parentid; parentid = m_PrimModelsInScene[parentid].ParentID; } return m_PrimModelsInScene[temp]; } public void AddNewMaterial2Cache(UUID textureID, System.Windows.Media.Media3D.Material material) { lock (m_materials) { if (m_materials.ContainsKey(textureID) == false) { m_materials.Add(textureID, material); } } } public Material GetMaterialFromCache(UUID textureID) { Material m = null; lock (m_materials) if (m_materials.ContainsKey(textureID)) m = m_materials[textureID]; return m; } public void RemoveMaterialFromCache(UUID textureID) { lock (m_materials) { m_materials.Remove(textureID); } } public void AddActiveModel(Visual3D v) { uint? key = FindKeyByValue(v); if (key.HasValue) { lock (m_ActivedModels) { if (m_ActivedModels.ContainsKey(key.Value)) m_ActivedModels.Remove(key.Value); m_ActivedModels.Add(key.Value, v); } } } public void RemoveActiveModel(Visual3D v) { uint? key = FindKeyByValue(v); if (key.HasValue) { lock (m_ActivedModels) { m_ActivedModels.Remove(key.Value); } } } public Dictionary.Enumerator GetActivedModelList() { workingDic_ActivedModels.Clear(); lock (m_ActivedModels) workingDic_ActivedModels = m_ActivedModels.ToDictionary(p => p.Key, v => v.Value); return workingDic_ActivedModels.GetEnumerator(); } public Visual3D GetActivedModel(uint localid) { lock (m_ActivedModels) if (m_ActivedModels.ContainsKey(localid)) return m_ActivedModels[localid]; return null; } public Primitive GetPrimInScene(uint localid) { lock (m_PrimModelsInScene) { if (m_PrimModelsInScene.ContainsKey(localid) == false) return null; } return m_PrimModelsInScene[localid]; } public void RemovePrimInScene(uint localid) { lock (m_PrimModelsInScene) m_PrimModelsInScene.Remove(localid); } public Dictionary.Enumerator GetPrimChildrenInScene(uint parentid) { Dictionary result = new Dictionary(); foreach (KeyValuePair value in primitiveParent) if (value.Value == parentid) { lock (m_PrimModelsInScene) { result.Add(value.Key, m_PrimModelsInScene[value.Key]); } } return result.GetEnumerator(); } #region Friends private Dictionary FriendList = new Dictionary(); #endregion } }