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 void Dispose() { VertexBuffer.Dispose(); if (IndexBuffer != null) { IndexBuffer.Dispose(); } VertexBufferData.Clear(); VertexShader.Dispose(); PixelShader.Dispose(); cbWorldMatrix.Dispose(); cbSunInfo.Dispose(); }
public static IntPtr GetOrCacheVertexBufferPtrFromMesh(Mesh mesh) { InitIFN(); VertexBufferData vertexBufferData; if (!vertexBuffersMap.TryGetValue(mesh, out vertexBufferData)) { vertexBufferData = new VertexBufferData() { vertices = mesh.vertices }; vertexBuffersMap.Add(mesh, vertexBufferData); } return(Marshal.UnsafeAddrOfPinnedArrayElement(vertexBufferData.vertices, 0)); }
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); }
/// <summary> /// Setup constructor /// </summary> public GridCell( VertexBufferData vertices ) { m_Vertices = vertices; }
/// <summary> /// Creates a vertex buffer from the data added so far /// </summary> public IVertexBuffer Build( ) { int numVertices = -1; foreach ( KeyValuePair<VertexFieldSemantic, List<float>> kvp in m_Streams ) { int streamVertexCount = kvp.Value.Count / m_Format.GetDescriptor( kvp.Key ).NumElements; if ( numVertices == -1 ) { numVertices = streamVertexCount; continue; } if ( numVertices != streamVertexCount ) { throw new InvalidOperationException( string.Format( "Expected stream for field \"{0}\" to contain {1} vertices, not {2}", kvp.Key, numVertices, streamVertexCount ) ); } } VertexBufferData data = new VertexBufferData( m_Format, numVertices ); foreach ( KeyValuePair<VertexFieldSemantic, List<float>> kvp in m_Streams ) { float[] elements = data.Add<float>( kvp.Key, m_Format.GetDescriptor( kvp.Key ).NumElements ); Debug.Assert( elements.Length == kvp.Value.Count ); for ( int elementIndex = 0; elementIndex < elements.Length; ++elementIndex ) { elements[ elementIndex ] = kvp.Value[ elementIndex ]; } } IVertexBuffer vb = Graphics.Factory.CreateVertexBuffer( ); vb.Create( data ); return vb; }