コード例 #1
0
        public async Task Render_SimpleObject_D2D_Texture()
        {
            await TestUtilities.InitializeWithGraphicsAsync();

            using (var solidBrush = new SolidBrushResource(Color4.Gray))
                using (var textFormat = new TextFormatResource("Arial", 36))
                    using (var textBrush = new SolidBrushResource(Color4.RedColor))
                        using (var memRenderTarget = new MemoryRenderTarget(1024, 1024))
                        {
                            memRenderTarget.ClearColor = Color4.CornflowerBlue;

                            // Get and configure the camera
                            var camera = (PerspectiveCamera3D)memRenderTarget.Camera;
                            camera.Position = new Vector3(0f, 5f, -7f);
                            camera.Target   = new Vector3(0f, 0f, 0f);
                            camera.UpdateCamera();

                            // 2D rendering is made here
                            var d2dDrawingLayer = new Custom2DDrawingLayer(graphics =>
                            {
                                var d2dRectangle = new RectangleF(10, 10, 236, 236);
                                graphics.Clear(Color4.LightBlue);
                                graphics.FillRoundedRectangle(
                                    d2dRectangle, 30, 30,
                                    solidBrush);

                                d2dRectangle.Inflate(-10, -10);
                                graphics.DrawText("Hello Direct2D!", textFormat, d2dRectangle, textBrush);
                            });

                            // Define scene
                            await memRenderTarget.Scene.ManipulateSceneAsync(manipulator =>
                            {
                                var resD2DTexture = manipulator.AddResource(
                                    _ => new Direct2DTextureResource(d2dDrawingLayer, 256, 256));
                                var resD2DMaterial = manipulator.AddStandardMaterialResource(resD2DTexture);
                                var geoResource    = manipulator.AddResource(
                                    _ => new GeometryResource(new CubeGeometryFactory()));

                                var newMesh           = manipulator.AddMeshObject(geoResource, resD2DMaterial);
                                newMesh.RotationEuler = new Vector3(0f, EngineMath.RAD_90DEG / 2f, 0f);
                                newMesh.Scaling       = new Vector3(2f, 2f, 2f);
                            });

                            await memRenderTarget.AwaitRenderAsync();

                            // Take screenshot
                            var screenshot = await memRenderTarget.RenderLoop.GetScreenshotGdiAsync();

                            //TestUtilities.DumpToDesktop(screenshot, "Blub.png");

                            // Calculate and check difference
                            var isNearEqual = BitmapComparison.IsNearEqual(
                                screenshot, TestUtilities.LoadBitmapFromResource("Drawing2D", "SimpleObject_D2DTexture.png"));
                            Assert.IsTrue(isNearEqual, "Difference to reference image is to big!");
                        }

            // Finishing checks
            Assert.IsTrue(GraphicsCore.Current.MainLoop !.RegisteredRenderLoopCount == 0, "RenderLoops where not disposed correctly!");
        }
コード例 #2
0
        public async Task Render_SimpleText_SimpleSingleColor()
        {
            await TestUtilities.InitializeWithGraphicsAsync();

            using (var solidBrush = new SolidBrushResource(Color4.RedColor))
                using (var textFormat = new TextFormatResource("Arial", 70))
                    using (var memRenderTarget = new MemoryRenderTarget(1024, 1024))
                    {
                        // Perform rendering
                        memRenderTarget.ClearColor = Color4.CornflowerBlue;
                        await memRenderTarget.RenderLoop.Register2DDrawingLayerAsync(graphics =>
                        {
                            // 2D rendering is made here
                            graphics.DrawText(
                                $"Just a dummy text ;){Environment.NewLine}Just a dummy text ;)",
                                textFormat,
                                new RectangleF(10, 10, 512, 512),
                                solidBrush);
                        });

                        await memRenderTarget.AwaitRenderAsync();

                        // Take screenshot
                        var screenshot = await memRenderTarget.RenderLoop.GetScreenshotGdiAsync();

                        // TestUtilities.DumpToDesktop(screenshot, "Blub.png");

                        // Calculate and check difference
                        var diff = BitmapComparison.CalculatePercentageDifference(
                            screenshot, TestUtilities.LoadBitmapFromResource("Drawing2D", "SimpleText_SingleColor.png"));
                        Assert.IsTrue(diff < 0.2, "Difference to reference image is to big!");
                    }
        }
コード例 #3
0
        public async Task Render_SimpleText_SimpleSingleColor()
        {
            await UnitTestHelper.InitializeWithGrahicsAsync();

            using (SolidBrushResource solidBrush = new SolidBrushResource(Color4.RedColor))
                using (TextFormatResource textFormat = new TextFormatResource("Arial", 70))
                    using (MemoryRenderTarget memRenderTarget = new MemoryRenderTarget(1024, 1024))
                    {
                        // Perform rendering
                        memRenderTarget.ClearColor = Color4.CornflowerBlue;
                        await memRenderTarget.RenderLoop.Register2DDrawingLayerAsync((graphics) =>
                        {
                            // 2D rendering is made here
                            graphics.DrawText(
                                string.Format("Just a dummy text ;){0}Just a dummy text ;)", Environment.NewLine),
                                textFormat,
                                new RectangleF(10, 10, 512, 512),
                                solidBrush);
                        });

                        await memRenderTarget.AwaitRenderAsync();

                        // Take screenshot
                        GDI.Bitmap screenshot = await memRenderTarget.RenderLoop.GetScreenshotGdiAsync();

                        //screenshot.DumpToDesktop("Blub.png");

                        // Calculate and check difference
                        float diff = BitmapComparison.CalculatePercentageDifference(
                            screenshot, Properties.Resources.ReferenceImage_SimpleText_SingleColor);
                        Assert.True(diff < 0.2, "Difference to reference image is to big!");
                    }
        }
コード例 #4
0
        /// <summary>
        /// Draws the given text on the screen.
        /// </summary>
        /// <param name="textToDraw">The text to draw.</param>
        /// <param name="textFormat">The TextFormat to be used.</param>
        /// <param name="targetRectangle">The target rectangle.</param>
        /// <param name="brush">The brush.</param>
        /// <param name="drawOptions">Some draw options to be passed to Direct2D.</param>
        /// <param name="measuringMode">Sets the measuring mode to be passed to Direct2D.</param>
        public void DrawText(
            string textToDraw, TextFormatResource textFormat, RectangleF targetRectangle, BrushResource brush,
            DrawTextOptions drawOptions = DrawTextOptions.None,
            MeasuringMode measuringMode = MeasuringMode.Natural)
        {
            if (_renderTarget == null)
            {
                return;
            }

            textToDraw.EnsureNotNull(nameof(textToDraw));
            targetRectangle.EnsureNotEmpty(nameof(targetRectangle));
            brush.EnsureNotNull(nameof(brush));

            _renderTarget.DrawText(
                textToDraw,
                textFormat.GetTextFormat(this.Device),
                targetRectangle,
                brush.GetBrush(this.Device),
                (D2D.DrawTextOptions)drawOptions, (Vortice.DCommon.MeasuringMode)measuringMode);
        }
コード例 #5
0
        public PerformanceMeasureDrawingLayer(float verticalPadding, ViewInformation view)
        {
            _view            = view;
            _verticalPadding = verticalPadding;

            _lastTimeSpans = new List <TimeSpan>();
            _lastRender    = DateTime.UtcNow;

            // Define drawing resources
            _textFormatCentered = new TextFormatResource("Arial", 18f);
            _textFormatCentered.TextAlignment    = TextAlignment.Center;
            _textFormatLeftAligned               = new TextFormatResource("Arial", 18f);
            _textFormatLeftAligned.TextAlignment = TextAlignment.Leading;

            _backBrush   = new SolidBrushResource(Color4.LightGray);
            _foreBrush   = new SolidBrushResource(Color4.Black);
            _borderBrush = new SolidBrushResource(Color4.DarkGray);

            _enabled     = true;
            _currentType = PerformanceDrawingLayerType.FramesPerSecond;
            _keysDown    = new List <WinVirtualKey>(12);
        }
コード例 #6
0
            /// <summary>
            /// Initializes a new instance of the <see cref="ImageDataFlowHelper"/> class.
            /// </summary>
            /// <param name="width">The width of the image.</param>
            /// <param name="height">The height of the image.</param>
            public ImageDataFlowHelper(string streamName)
            {
                this.StreamName = streamName;
                this.TextFormat = new TextFormatResource("Arial", 18f, FontWeight.Bold);
                this.TextFormat.TextAlignment = TextAlignment.Center;
                this.TextFormat.ParagraphAlignment = ParagraphAlignment.Center;
                this.TextBackground = new SolidBrushResource(Color4.LightGray.ChangeAlphaTo(0.7f));
                this.TextForeground = new SolidBrushResource(Color4.DarkBlue);

                // Initialize scene(s)
                this.Scene = new Scene();
                this.Scene.ManipulateSceneAsync((manipulator) =>
                {
                    manipulator.AddDrawingLayer(OnDraw);
                }).FireAndForget();

                // Initialize members for Direct2D rendering
                this.Bitmap = null;
                this.BitmapSize = new Size2(0, 0);

                // Initialize members for synchronization
                this.SyncBufferSize = new Size2(0, 0);
                this.SyncBuffer = null;
                this.SyncBufferLock = new object();
                this.SyncBufferChanged = false;
            }
コード例 #7
0
        public async Task MemoryRenderTarget_2DInitError()
        {
            await UnitTestHelper.InitializeWithGrahicsAsync();

            GDI.Bitmap screenshot = null;
            using (UnitTestHelper.FailTestOnInternalExceptions())
                using (GraphicsCore.AutomatedTest_NewTestEnviornment())
                    using (GraphicsCore.AutomatedTest_ForceD2DInitError())
                    {
                        GraphicsCore.Initialize();
                        Assert.True(GraphicsCore.IsInitialized);
                        Assert.False(GraphicsCore.Current.DefaultDevice.Supports2D);

                        using (SolidBrushResource solidBrush = new SolidBrushResource(Color4.Gray))
                            using (TextFormatResource textFormat = new TextFormatResource("Arial", 36))
                                using (SolidBrushResource textBrush = new SolidBrushResource(Color4.RedColor))
                                    using (MemoryRenderTarget memRenderTarget = new MemoryRenderTarget(1024, 1024))
                                    {
                                        memRenderTarget.ClearColor = Color4.CornflowerBlue;

                                        // Get and configure the camera
                                        PerspectiveCamera3D camera = memRenderTarget.Camera as PerspectiveCamera3D;
                                        camera.Position = new Vector3(0f, 5f, -7f);
                                        camera.Target   = new Vector3(0f, 0f, 0f);
                                        camera.UpdateCamera();

                                        // 2D rendering is made here
                                        Custom2DDrawingLayer d2dDrawingLayer = new Custom2DDrawingLayer((graphics) =>
                                        {
                                            RectangleF d2dRectangle = new RectangleF(10, 10, 236, 236);
                                            graphics.Clear(Color4.LightBlue);
                                            graphics.FillRoundedRectangle(
                                                d2dRectangle, 30, 30,
                                                solidBrush);

                                            d2dRectangle.Inflate(-10, -10);
                                            graphics.DrawText("Hello Direct2D!", textFormat, d2dRectangle, textBrush);
                                        });

                                        // Define scene
                                        await memRenderTarget.Scene.ManipulateSceneAsync((manipulator) =>
                                        {
                                            var resD2DTexture = manipulator.AddResource <Direct2DTextureResource>(
                                                () => new Direct2DTextureResource(d2dDrawingLayer, 256, 256));
                                            var resD2DMaterial = manipulator.AddSimpleColoredMaterial(resD2DTexture);
                                            var geoResource    = manipulator.AddResource <GeometryResource>(
                                                () => new GeometryResource(new PalletType(
                                                                               palletMaterial: NamedOrGenericKey.Empty,
                                                                               contentMaterial: resD2DMaterial)));

                                            GenericObject newObject = manipulator.AddGeneric(geoResource);
                                            newObject.RotationEuler = new Vector3(0f, EngineMath.RAD_90DEG / 2f, 0f);
                                            newObject.Scaling       = new Vector3(2f, 2f, 2f);
                                        });

                                        // Take screenshot
                                        await memRenderTarget.AwaitRenderAsync();

                                        screenshot = await memRenderTarget.RenderLoop.GetScreenshotGdiAsync();

                                        //screenshot.DumpToDesktop("Blub.png");
                                    }
                    }

            // Calculate and check difference
            Assert.NotNull(screenshot);
            bool isNearEqual = BitmapComparison.IsNearEqual(
                screenshot, Properties.Resources.ReferenceImage_SimpleObject);

            Assert.True(isNearEqual, "Difference to reference image is to big!");
        }
コード例 #8
0
        public async Task MemoryRenderTarget_2DInitError()
        {
            await TestUtilities.InitializeWithGraphicsAsync();

            // Ensure that any async disposal is  done before we create a new GraphicsCore
            await GraphicsCore.Current.MainLoop !.WaitForNextPassedLoopAsync();
            await GraphicsCore.Current.MainLoop !.WaitForNextPassedLoopAsync();

            GDI.Bitmap?screenshot = null;
            using (TestUtilities.FailTestOnInternalExceptions())
                using (GraphicsCore.AutomatedTest_NewTestEnvironment())
                {
                    await GraphicsCore.Loader
                    .ConfigureLoading(settings => settings.ThrowD2DInitDeviceError = true)
                    .LoadAsync();

                    Assert.IsTrue(GraphicsCore.IsLoaded);
                    Assert.IsFalse(GraphicsCore.Current.DefaultDevice !.Supports2D);

                    using (var solidBrush = new SolidBrushResource(Color4.Gray))
                        using (var textFormat = new TextFormatResource("Arial", 36))
                            using (var textBrush = new SolidBrushResource(Color4.RedColor))

                                using (var memRenderTarget = new MemoryRenderTarget(1024, 1024))
                                {
                                    memRenderTarget.ClearColor = Color4.CornflowerBlue;

                                    // Get and configure the camera
                                    var camera = (PerspectiveCamera3D)memRenderTarget.Camera;
                                    camera.Position = new Vector3(0f, 5f, -7f);
                                    camera.Target   = new Vector3(0f, 0f, 0f);
                                    camera.UpdateCamera();

                                    // 2D rendering is made here
                                    var d2dDrawingLayer = new Custom2DDrawingLayer(graphics =>
                                    {
                                        var d2dRectangle = new GDI.RectangleF(10, 10, 236, 236);
                                        graphics.Clear(Color4.LightBlue);
                                        graphics.FillRoundedRectangle(
                                            d2dRectangle, 30, 30,
                                            solidBrush);

                                        d2dRectangle.Inflate(-10, -10);
                                        graphics.DrawText("Hello Direct2D!", textFormat, d2dRectangle, textBrush);
                                    });

                                    // Define scene
                                    await memRenderTarget.Scene.ManipulateSceneAsync(manipulator =>
                                    {
                                        var resD2DTexture = manipulator.AddResource(
                                            _ => new Direct2DTextureResource(d2dDrawingLayer, 256, 256));
                                        var resD2DMaterial = manipulator.AddStandardMaterialResource(resD2DTexture);
                                        var resGeometry    = manipulator.AddResource(
                                            _ => new GeometryResource(new CubeGeometryFactory()));

                                        var newMesh           = manipulator.AddMeshObject(resGeometry, resD2DMaterial);
                                        newMesh.RotationEuler = new Vector3(0f, EngineMath.RAD_90DEG / 2f, 0f);
                                        newMesh.Scaling       = new Vector3(2f, 2f, 2f);
                                    });

                                    // Take screenshot
                                    await memRenderTarget.AwaitRenderAsync();

                                    screenshot = await memRenderTarget.RenderLoop.GetScreenshotGdiAsync();

                                    // TestUtilities.DumpToDesktop(screenshot, "Blub.png");
                                }
                }

            // Calculate and check difference
            Assert.IsNotNull(screenshot);
            var isNearEqual = BitmapComparison.IsNearEqual(
                screenshot, TestUtilities.LoadBitmapFromResource("ErrorHandling", "SimpleObject.png"));

            Assert.IsTrue(isNearEqual, "Difference to reference image is to big!");
        }
コード例 #9
0
        /// <summary>
        /// Called when the sample has to startup.
        /// </summary>
        /// <param name="targetRenderLoop">The target render loop.</param>
        public override async Task OnStartupAsync(RenderLoop targetRenderLoop)
        {
            targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop));

            // Build dummy scene
            Scene        scene  = targetRenderLoop.Scene;
            Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase;

            // 2D rendering is made here
            m_solidBrush = new SolidBrushResource(Color4.Gray);
            m_textFormat = new TextFormatResource("Arial", 36);
            m_textBrush  = new SolidBrushResource(Color4.RedColor);
            Custom2DDrawingLayer d2dDrawingLayer = new Custom2DDrawingLayer((graphics) =>
            {
                RectangleF d2dRectangle = new RectangleF(10, 10, 236, 236);
                graphics.Clear(Color4.LightBlue);
                graphics.FillRoundedRectangle(
                    d2dRectangle, 30, 30,
                    m_solidBrush);

                d2dRectangle.Inflate(-10, -10);
                graphics.DrawText("Hello Direct2D!", m_textFormat, d2dRectangle, m_textBrush);
            });

            // Build 3D scene
            await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) =>
            {
                // Create floor
                SampleSceneBuilder.BuildStandardFloor(
                    manipulator, Scene.DEFAULT_LAYER_NAME);

                // Define Direct2D texture resource
                var resD2DTexture = manipulator.AddResource <Direct2DTextureResource>(
                    () => new Direct2DTextureResource(d2dDrawingLayer, 256, 256));
                var resD2DMaterial = manipulator.AddSimpleColoredMaterial(resD2DTexture);

                // Create pallet geometry resource
                PalletType pType      = new PalletType();
                pType.PalletMaterial  = NamedOrGenericKey.Empty;
                pType.ContentMaterial = resD2DMaterial;
                var resPalletGeometry = manipulator.AddResource <GeometryResource>(
                    () => new GeometryResource(pType));

                // Create pallet object
                GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry);
                palletObject.Color         = Color4.GreenColor;
                palletObject.EnableShaderGeneratedBorder();
                palletObject.BuildAnimationSequence()
                .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0))
                .WaitFinished()
                .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0))
                .WaitFinished()
                .CallAction(() => palletObject.RotationEuler = Vector3.Zero)
                .ApplyAndRewind();
            });

            // Configure camera
            camera.Position = new Vector3(2f, 2f, 2f);
            camera.Target   = new Vector3(0f, 0.5f, 0f);
            camera.UpdateCamera();
        }
コード例 #10
0
        /// <summary>
        /// Called when the sample has to startup.
        /// </summary>
        /// <param name="targetRenderLoop">The target render loop.</param>
        public override async Task OnStartupAsync(RenderLoop targetRenderLoop)
        {
            targetRenderLoop.EnsureNotNull(nameof(targetRenderLoop));

            // Build dummy scene
            Scene        scene  = targetRenderLoop.Scene;
            Camera3DBase camera = targetRenderLoop.Camera as Camera3DBase;

            // Define 2D overlay
            m_solidBrush = new SolidBrushResource(Color4.LightSteelBlue.ChangeAlphaTo(0.7f));
            m_textFormat = new TextFormatResource("Arial", 36);
            m_textBrush  = new SolidBrushResource(Color4.RedColor);
            Action <Graphics2D> draw2DAction = (graphics) =>
            {
                // 2D rendering is made here
                RectangleF d2dRectangle = new RectangleF(
                    10, 10,
                    graphics.ScreenSize.Width - 20,
                    graphics.ScreenSize.Height - 20);
                if (d2dRectangle.Width < 100)
                {
                    return;
                }
                if (d2dRectangle.Height < 100)
                {
                    return;
                }

                // Draw background rectangle
                graphics.FillRoundedRectangle(
                    d2dRectangle,
                    30, 30,
                    m_solidBrush);

                // Draw the text
                d2dRectangle.Inflate(-10, -10);
                d2dRectangle.Y = d2dRectangle.Y + 15f;
                graphics.DrawText("Hello Direct2D!", m_textFormat, d2dRectangle, m_textBrush);
            };

            await targetRenderLoop.Scene.ManipulateSceneAsync((manipulator) =>
            {
                // Add the 2D layer to the scene
                manipulator.AddDrawingLayer(draw2DAction);

                // Create floor
                SampleSceneBuilder.BuildStandardFloor(
                    manipulator, Scene.DEFAULT_LAYER_NAME);

                // Create pallet geometry resource
                PalletType pType      = new PalletType();
                pType.ContentColor    = Color4.Transparent;
                var resPalletGeometry = manipulator.AddResource <GeometryResource>(
                    () => new GeometryResource(pType));

                // Create pallet object
                GenericObject palletObject = manipulator.AddGeneric(resPalletGeometry);
                palletObject.Color         = Color4.GreenColor;
                palletObject.EnableShaderGeneratedBorder();
                palletObject.BuildAnimationSequence()
                .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_180DEG, 0f), TimeSpan.FromSeconds(2.0))
                .WaitFinished()
                .RotateEulerAnglesTo(new Vector3(0f, EngineMath.RAD_360DEG, 0f), TimeSpan.FromSeconds(2.0))
                .WaitFinished()
                .CallAction(() => palletObject.RotationEuler = Vector3.Zero)
                .ApplyAndRewind();
            });

            // Configure camera
            camera.Position = new Vector3(2f, 2f, 2f);
            camera.Target   = new Vector3(0f, 0.5f, 0f);
            camera.UpdateCamera();
        }