public bool ExecuteTask() { lock (mInstLock) { if (mIsHalted) { return(true); } if (WaitingInstances.Count > 0) { for (int i = 0; WaitingInstances.Count > 0; ++i) { var data = WaitingInstances.First(); ActiveInstances.Add(data); WaitingInstances.Remove(data); } if (Renderer.InstanceDataBuffer != null) { Renderer.InstanceDataBuffer.Dispose(); } int size = Marshal.SizeOf(typeof(Models.MDX.MdxInstanceData)); Renderer.InstanceDataBuffer = new VertexBuffer(Game.GameManager.GraphicsThread.GraphicsManager.Device, ActiveInstances.Count * size, Usage.WriteOnly, VertexFormat.Diffuse, Pool.Managed); DataStream strm = Renderer.InstanceDataBuffer.Lock(0, 0, LockFlags.None); Models.MDX.MdxInstanceData[] InstData = ActiveInstances.ToArray(); strm.WriteRange(InstData); Renderer.InstanceDataBuffer.Unlock(); Renderer.numInstances = ActiveInstances.Count; } } return(WaitingInstances.Count == 0); }
override public void ForgetInstance(MudObject Object) { var instanceName = Object.Path + "@" + Object.Instance; if (ActiveInstances.ContainsKey(instanceName)) { ActiveInstances.Remove(instanceName); } Object.IsPersistent = false; }
override public RMUD.MudObject GetObject(string Path) { Path = Path.Replace('\\', '/'); String BasePath, InstanceName; SplitObjectName(Path, out BasePath, out InstanceName); if (!String.IsNullOrEmpty(InstanceName)) { MudObject activeInstance = null; if (ActiveInstances.TryGetValue(Path, out activeInstance)) { return(activeInstance); } else { return(CreateInstance(Path)); } } else { MudObject r = null; if (NamedObjects.ContainsKey(BasePath)) { r = NamedObjects[BasePath]; } else { var typeName = BaseObjectName + "." + Path.Replace("/", "."); var type = SourceAssembly.GetType(typeName); if (type == null) { return(null); } r = Activator.CreateInstance(type) as MudObject; if (r != null) { r.Path = Path; r.State = ObjectState.Unitialized; NamedObjects.Upsert(BasePath, r); } } if (r != null && r.State == ObjectState.Unitialized) { MudObject.InitializeObject(r); } return(r); } }
public void RemoveInstance(uint instanceId) { lock (mInstLock) { WaitingInstances.RemoveAll((inst) => inst.InstanceId == instanceId); ActiveInstances.RemoveAll((inst) => inst.InstanceId == instanceId); InvisibleInstances.RemoveAll((inst) => inst.InstanceId == instanceId); } lock (mIdLock) { mUsedInstances.Remove(instanceId); mFreeInstances.Add(instanceId); } }
override public MudObject GetObject(String Path) { Path = Path.Replace('\\', '/'); String BasePath, InstanceName; SplitObjectName(Path, out BasePath, out InstanceName); if (!String.IsNullOrEmpty(InstanceName)) { MudObject activeInstance = null; if (ActiveInstances.TryGetValue(Path, out activeInstance)) { return(activeInstance); } else { return(CreateInstance(Path)); } } else { MudObject r = null; if (NamedObjects.ContainsKey(BasePath)) { r = NamedObjects[BasePath]; } else { r = CompileObject(BasePath); if (r != null) { NamedObjects.Upsert(BasePath, r); } } if (r != null && r.State == ObjectState.Unitialized) { Core.InitializeObject(r); } return(r); } }
public GameObject Pop() { if (ReservedInstances.Count == 0) { Generate(); } var instance = ReservedInstances.Dequeue(); ActiveInstances.Add(instance); if (EventPop != null) { EventPop(this, instance); } return(instance); }
public void Clear() { var listActive = new Queue <GameObject>(ActiveInstances.ToList()); while (listActive.Count > 0) { GameObject.DestroyImmediate(listActive.Dequeue()); } var listReserv = new Queue <GameObject>(ReservedInstances.ToList()); while (listReserv.Count > 0) { GameObject.DestroyImmediate(listReserv.Dequeue()); } ReservedInstances = null; ActiveInstances = null; }
override public void PersistInstance(MudObject Object) { if (Object.IsPersistent) { return; //The object is already persistent. } if (ActiveInstances.ContainsKey(Object.GetFullName())) { throw new InvalidOperationException("An instance with this name is already persisted."); } if (Object.IsNamedObject) { Object.IsPersistent = true; ActiveInstances.Upsert(Object.GetFullName(), Object); ReadPersistentObject(Object); } else { throw new InvalidOperationException("Anonymous objects cannot be persisted."); } }
internal void UpdateVisibility() { lock (mInstLock) { if (mIsHalted) { return; } List <Models.MDX.MdxInstanceData> VisibleInstances = new List <Models.MDX.MdxInstanceData>(); List <Models.MDX.MdxInstanceData> TmpInvis = new List <Models.MDX.MdxInstanceData>(); bool changed = false; foreach (var inst in InvisibleInstances) { if (IsInstanceVisible(new Vector3(inst.ModelMatrix.M41, inst.ModelMatrix.M42, inst.ModelMatrix.M43))) { changed = true; VisibleInstances.Add(inst); } else { TmpInvis.Add(inst); } } foreach (var inst in ActiveInstances) { if (IsInstanceVisible(new Vector3(inst.ModelMatrix.M41, inst.ModelMatrix.M42, inst.ModelMatrix.M43))) { VisibleInstances.Add(inst); } else { changed = true; TmpInvis.Add(inst); } } ActiveInstances = VisibleInstances; InvisibleInstances = TmpInvis; Renderer.numInstances = ActiveInstances.Count; if (ActiveInstances.Count == 0) { return; } if (changed == false && mUpdateLists == false) { return; } if (Renderer.InstanceDataBuffer != null) { Renderer.InstanceDataBuffer.Dispose(); } int size = Marshal.SizeOf(typeof(Models.MDX.MdxInstanceData)); Renderer.InstanceDataBuffer = new VertexBuffer(Game.GameManager.GraphicsThread.GraphicsManager.Device, ActiveInstances.Count * size, Usage.WriteOnly, VertexFormat.Diffuse, Pool.Managed); DataStream strm = Renderer.InstanceDataBuffer.Lock(0, 0, LockFlags.None); Models.MDX.MdxInstanceData[] InstData = ActiveInstances.ToArray(); strm.WriteRange(InstData); Renderer.InstanceDataBuffer.Unlock(); Renderer.numInstances = ActiveInstances.Count; mUpdateLists = false; } }
public GRendererResourceManager() { billboardMeshes = new Dictionary <BillboardAsset, Mesh>(); ActiveInstances.Add(this); }