Пример #1
0
        public void FromGenMesh(GraphicsDevice _gd, GenMesh _mesh, bool _bComputeBounds)
        {
            //Clear GPU Buffers
            ClearGPUVBOBuffers();

            //Init
            m_npartsCount = 0;



            for (int i = 0; i < _mesh.m_genMeshParts.Count; i++)
            {
                GenMeshPart part    = _mesh.m_genMeshParts[i];
                MeshGPUPart partGPU = m_meshParts[i];

                //Vertices
                partGPU.m_gpuVertexBuffer = new VertexBuffer(_gd, typeof(VertexPosColorNorm), part.m_vertices.Count, BufferUsage.WriteOnly);
                partGPU.m_gpuVertexBuffer.SetData(part.m_vertices.ToArray(), 0, part.m_vertices.Count);

                //Indices
                partGPU.m_gpuIndexBuffer = new IndexBuffer(_gd, typeof(ushort), part.m_indices.Count, BufferUsage.WriteOnly);
                partGPU.m_gpuIndexBuffer.SetData(0, part.m_indices.ToArray(), 0, part.m_indices.Count);

                m_npartsCount++;
            }
        }
Пример #2
0
        public void Draw(Matrix view, Matrix proj)
        {
            if (m_genMesh.m_meshGPU == null)
            {
                return;
            }

            MeshGPU meshGPU = m_genMesh.m_meshGPU;

            if (meshGPU.m_npartsCount < 0)
            {
                return;
            }

            var effect = meshGPU.SingleEffect;

            effect.CurrentTechnique = effect.Techniques["Technique1"];
            effect.Parameters["xWorld"].SetValue(m_worldMtx);
            effect.Parameters["xView"].SetValue(view);
            effect.Parameters["xProjection"].SetValue(proj);


            effect.Parameters["xDirectionalLightDir"].SetValue(LightDir);

            if (m_tex2DBorder != null)
            {
                effect.Parameters["xTexSlot0"].SetValue(m_tex2DBorder);
            }

            if (ShowGridOnVoxel == true)
            {
                effect.Parameters["xGridPower"].SetValue(1.0f);
            }
            else
            {
                effect.Parameters["xGridPower"].SetValue(0.0f);
            }

            // Create a vertex buffer, and copy our vertex data into it.
            GraphicsDevice device = effect.GraphicsDevice;

            device.RasterizerState   = RasterizerState.CullCounterClockwise;// CullClockwise;
            device.DepthStencilState = DepthStencilState.Default;
            device.BlendState        = BlendState.Opaque;

            effect.CurrentTechnique.Passes[0].Apply();  //One pass

            //Draw Grouped by Effect Slot
            for (int i = 0; i < meshGPU.m_npartsCount; i++)
            {
                MeshGPUPart part = meshGPU.m_meshParts[i];

                device.SetVertexBuffer(part.m_gpuVertexBuffer);
                device.Indices = part.m_gpuIndexBuffer;

                device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, part.m_gpuIndexBuffer.IndexCount / 3);
            }
        }
Пример #3
0
        public MeshGPU()
        {
            m_meshParts = new MeshGPUPart[8]; //Default max ...

            for (int i = 0; i < m_meshParts.Length; i++)
            {
                m_meshParts[i] = new MeshGPUPart();
            }

            m_npartsCount = 0;
        }
Пример #4
0
        public void ClearGPUVBOBuffers()
        {
            for (int i = 0; i < m_meshParts.Length; i++)
            {
                MeshGPUPart partGPU = m_meshParts[i];

                if (partGPU.m_gpuVertexBuffer != null)
                {
                    partGPU.m_gpuVertexBuffer.Dispose();
                    partGPU.m_gpuVertexBuffer = null;
                }

                if (partGPU.m_gpuIndexBuffer != null)
                {
                    partGPU.m_gpuIndexBuffer.Dispose();
                    partGPU.m_gpuIndexBuffer = null;
                }
            }
        }