Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }