Example #1
0
        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);
        }
Example #2
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);
            }
        }
Example #3
0
        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());
            }
        }
Example #4
0
        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);
        }