private static void Draw(WritableTexture screen, Func <Shader> shaderFactory, FaceDrawer faceDrawer, int startY, int endY, World world) { var shaderState = new ShaderState(30, world); var shader = shaderFactory(); shader.World(world); for (var i = 0; i < world.WorldObject.Model.Geometry.Faces.Count; i++) { faceDrawer.Draw(i, screen, shader, shaderState, startY, endY); } }
private async Task TwoPhaseDraw(World world, Tuple <int, int>[] regions, WritableTexture screen) { _firstPhaseScreen.Clear(); _faceDrawer.Init(RenderMode.Fill); var firstPhaseTasks = regions.Select( region => new Task( () => Draw(_firstPhaseScreen, world.WorldObject.FirstPhaseShaderFactory, _faceDrawer, region.Item1, region.Item2, world))) .ToArray(); foreach (var task in firstPhaseTasks) { task.Start(); } await Task.WhenAll(firstPhaseTasks).ConfigureAwait(false); _faceDrawer.Init(world.RenderMode); var secondPhaseTasks = regions.Select( region => new Task(() => { var shaderState = new ShaderState(30, world); var shader = world.WorldObject.ShaderFactory(); shader.World(world, _firstPhaseScreen); for (var i = 0; i < world.WorldObject.Model.Geometry.Faces.Count; i++) { _faceDrawer.Draw(i, screen, shader, shaderState, region.Item1, region.Item2); } })) .ToArray(); foreach (var task in secondPhaseTasks) { task.Start(); } await Task.WhenAll(secondPhaseTasks).ConfigureAwait(false); }