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); }
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); } }
public MdxInstanceData GetInstanceById(uint id) { lock (mInstLock) { var sel = from file in WaitingInstances.Union(ActiveInstances).Union(InvisibleInstances) where file.InstanceId == id select file; if (sel.Count() == 0) { throw new Exception(); } return(sel.First()); } }
public uint PushInstance(Vector3 Position, float scale, Vector3 rotation) { Matrix matRot = Matrix.Identity; matRot *= Matrix.RotationX(rotation.X); matRot *= Matrix.RotationY(rotation.Y); matRot *= Matrix.RotationZ(rotation.Z); Matrix matTrans = Matrix.Translation(Position); Matrix matScale = Matrix.Scaling(scale, scale, scale); Models.MDX.MdxInstanceData inst = new Models.MDX.MdxInstanceData() { ModelMatrix = matRot * matScale * matTrans, IsSelected = 0xFFFFFFFF, }; uint id = 0; lock (mInstLock) { id = RequestInstanceId(); inst.InstanceId = id; WaitingInstances.Add(inst); } Game.GameManager.GraphicsThread.CallOnThread( () => { ExecuteTask(); }, true ); return(id); }