private void DrawMesh(MeshRenderData data, BoxedValueStore <string> metadata) { var mesh = data.Mesh; device.SetVertexBuffer(mesh.VertexBuffer); device.Indices = mesh.IndexBuffer; var world = metadata.Get <Matrix>("world"); var view = metadata.Get <Matrix>("view"); var projection = metadata.Get <Matrix>("projection"); var worldView = metadata.Get <Matrix>("worldview"); var worldViewProjection = metadata.Get <Matrix>("worldviewprojection"); for (int i = 0; i < visibleInstances.Count; i++) { var instance = visibleInstances[i]; world.Value = instance.Instance.Transform; Matrix.Multiply(ref world.Value, ref view.Value, out worldView.Value); Matrix.Multiply(ref worldView.Value, ref projection.Value, out worldViewProjection.Value); foreach (var pass in data.Material.Begin(metadata)) { pass.Apply(); device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, mesh.VertexCount, 0, mesh.TriangleCount); #if PROFILE polysDrawnStat.Value += mesh.TriangleCount; drawsStat.Value++; #endif } } }
public void Draw(string phase, BoxedValueStore <string> metadata) { List <MeshRenderData> meshes; if (!phases.TryGetValue(phase, out meshes)) { return; } var viewFrustum = metadata.Get <BoundingFrustum>("viewfrustum").Value; bounds.Clear(); bounds.Add(viewFrustum); QueryVisible(bounds, buffer); foreach (var item in buffer) { item.IsVisible = true; } foreach (var mesh in meshes) { foreach (var instance in mesh.Instances) { if (instance.IsVisible) { visibleInstances.Add(instance); } } if (visibleInstances.Count > 0) { DrawMesh(mesh, metadata); visibleInstances.Clear(); } } foreach (var item in buffer) { item.IsVisible = false; } buffer.Clear(); }