コード例 #1
0
        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);
        }
コード例 #2
0
        public void Dispose()
        {
            VertexBuffer.Dispose();

            if (IndexBuffer != null)
            {
                IndexBuffer.Dispose();
            }

            VertexBufferData.Clear();
            VertexShader.Dispose();
            PixelShader.Dispose();

            cbWorldMatrix.Dispose();
            cbSunInfo.Dispose();
        }
コード例 #3
0
    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));
    }
コード例 #4
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);
        }
コード例 #5
0
 /// <summary>
 /// Setup constructor
 /// </summary>
 public GridCell( VertexBufferData vertices )
 {
     m_Vertices = vertices;
 }
コード例 #6
0
        /// <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;
        }