/// <summary> /// Registers the specified model unique identifier. /// </summary> /// <typeparam name="T">Geometry Buffer Type</typeparam> /// <param name="modelGuid">The model unique identifier.</param> /// <param name="geometry">The geometry.</param> /// <returns></returns> public IGeometryBufferProxy Register <T>(Guid modelGuid, Geometry3D geometry) where T : class, IGeometryBufferModel, new() { if (geometry == null || modelGuid == Guid.Empty) { return(GeometryBufferProxy <T> .Empty); } lock (bufferDictionary) { GeometryBufferContainer container = null; if (bufferDictionary.TryGetValue(typeof(T), geometry.GUID, out container)) { #if DEBUGDETAIL Debug.WriteLine("Existing buffer found, GeomoetryGUID = " + geometry.GUID); #endif container.Attach(modelGuid); } else { #if DEBUGDETAIL Debug.WriteLine("Buffer not found, create new buffer. GeomoetryGUID = " + geometry.GUID); #endif container = GeometryBufferContainer.Create <T>(); var id = geometry.GUID; container.Disposed += (s, e) => { lock (bufferDictionary) { bufferDictionary.Remove(typeof(T), id); } }; container.Buffer.Geometry = geometry; container.Attach(modelGuid); bufferDictionary.Add(typeof(T), geometry.GUID, container); } return(new GeometryBufferProxy <T>(modelGuid, geometry.GUID, container.Buffer, this)); } }
/// <summary> /// Unregisters the specified model unique identifier. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="proxy">Buffer Proxy</param> /// <returns></returns> public bool Unregister <T>(IGeometryBufferProxy proxy) where T : class, IGeometryBufferModel { if (proxy.GeometryGuid == Guid.Empty || proxy.ModelGuid == Guid.Empty) { return(false); } lock (bufferDictionary) { GeometryBufferContainer container = null; if (bufferDictionary.TryGetValue(typeof(T), proxy.GeometryGuid, out container)) { #if DEBUGDETAIL Debug.WriteLine("Existing buffer found, Detach model from buffer. ModelGUID = " + proxy.ModelGuid); #endif container.Detach(proxy.ModelGuid); return(true); } else { Debug.WriteLine("Unregister geometry buffer, buffer is not found."); return(false); } } }