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!"); }
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!"); } }
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!"); } }
/// <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); }
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); }
/// <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; }
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!"); }
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!"); }
/// <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(); }
/// <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(); }