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