public void SetVertex(Vertex vertex)
        {
            var i = VertexBufferData.FindIndex(m => m.Position == vertex.Position);

            VertexBufferData[i] = vertex;

            var vbd = VertexBufferData.ToArray();

            VertexBuffer = SharpDX.Direct3D11.Buffer.Create(Video.GraphicDevice, BindFlags.VertexBuffer, vbd);
        }
        public virtual bool CompileShader(string filename, string prefix, string version = "4_0")
        {
            var tmpShaderSource = shaderSource;

            if ((VertexBufferData == null) || VertexBufferData.Count == 0)
            {
                throw new ArgumentNullException(string.Format("VertexBuffer: Tried to setup a" +
                                                              "Vertexbuffer for '[#PREFIX#]' without input data!", prefix));
            }

            var vbd = VertexBufferData.ToArray();

            VertexBuffer = SharpDX.Direct3D11.Buffer.Create(Video.GraphicDevice, BindFlags.VertexBuffer, vbd);
            if (IndexBufferData != null)
            {
                IndexBuffer = SharpDX.Direct3D11.Buffer.Create(Video.GraphicDevice, BindFlags.IndexBuffer, IndexBufferData);
            }

            var colorDataStart = 8;

            if (VertexBufferData[0].GetType() == typeof(Vector4))
            {
                tmpShaderSource = tmpShaderSource.Replace("[#TYPE#]", "float");
                colorDataStart  = 16;
            }
            else if (VertexBufferData[0].GetType() == typeof(Vertex))
            {
                tmpShaderSource = tmpShaderSource.Replace("[#TYPE#]", "float");
                colorDataStart  = 16;
            }
            else if (VertexBufferData[0].GetType() == typeof(Vector3))
            {
                tmpShaderSource = tmpShaderSource.Replace("[#TYPE#]", "float");
                colorDataStart  = 12;
            }
            else if (VertexBufferData[0].GetType() == typeof(Vector2))
            {
                colorDataStart  = 8;
                tmpShaderSource = tmpShaderSource.Replace("[#TYPE#]", "float");
            }
            else
            {
                throw new Exception("Invalid datatype passed to Shader");
            }

            var normalDataStart = colorDataStart + 16;

            tmpShaderSource = tmpShaderSource.Replace("[#PREFIX#]", prefix);
            using (var vertexShaderByteCode = ShaderBytecode.Compile(tmpShaderSource.Replace("[#PREFIX#]", prefix),
                                                                     string.Concat(prefix.ToUpper(), "_VS"), string.Concat("vs_", version)))
            {
                if (vertexShaderByteCode.Bytecode == null)
                {
                    Video.MessageBox(string.Format("VertexShader compilation for \"{0}\" failed!.", prefix) +
                                     "This is mostly related to syntax errors!", "Shader compiler");

                    return(false);
                }

                VertexShader = new VertexShader(Video.GraphicDevice, vertexShaderByteCode);
                using (var vertexShaderSignature = ShaderSignature.GetInputSignature(vertexShaderByteCode))
                {
                    using (var layout = new InputLayout(Video.GraphicDevice, vertexShaderSignature, new InputElement[]
                    {
                        new InputElement(string.Concat(prefix.ToUpper(), "_POSITION"), 0, Format.R32G32B32A32_Float, 0, 0),
                        new InputElement(string.Concat(prefix.ToUpper(), "_COLOR"), 0, Format.R32G32B32A32_Float, colorDataStart, 0),
                        new InputElement(string.Concat(prefix.ToUpper(), "_NORMAL"), 0, Format.R32G32B32A32_Float, normalDataStart, 0)
                    }))
                    {
                        cbWorldMatrix = new SharpDX.Direct3D11.Buffer(Video.GraphicDevice, Utilities.SizeOf <Matrix>(),
                                                                      ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);

                        cbSunInfo = SharpDX.Direct3D11.Buffer.Create(Video.GraphicDevice, BindFlags.ConstantBuffer,
                                                                     ref sun, Utilities.SizeOf <SunInfo>(), ResourceUsage.Default, CpuAccessFlags.None);

                        Video.DeviceContext.InputAssembler.InputLayout = layout;
                    }
                }
            }

            using (var pixelShaderByteCode = ShaderBytecode.Compile(tmpShaderSource.Replace("[#PREFIX#]", prefix),
                                                                    string.Concat(prefix.ToUpper(), "_PS"), string.Concat("ps_", version)))
            {
                if (pixelShaderByteCode.Bytecode == null)
                {
                    Video.MessageBox(string.Format("PixelShader compilation for \"{0}\" failed!", prefix) +
                                     "This is mostly related to syntax errors!", "Shader compiler");

                    return(false);
                }

                PixelShader = new PixelShader(Video.GraphicDevice, pixelShaderByteCode);
            }

            vertexBufferBinding = new VertexBufferBinding(VertexBuffer, Utilities.SizeOf <Vertex>(), 0);
            return(true);
        }