示例#1
0
            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
                    }
                }
            }
示例#2
0
            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();
            }