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); }