diff --git a/Avalonia.sln b/Avalonia.sln
index cc166bc495..f12af02236 100644
--- a/Avalonia.sln
+++ b/Avalonia.sln
@@ -189,6 +189,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Linux", "Linux", "{86C53C40
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.LinuxFramebuffer", "src\Linux\Avalonia.LinuxFramebuffer\Avalonia.LinuxFramebuffer.csproj", "{854568D5-13D1-4B4F-B50D-534DC7EFD3C9}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Direct3DInteropSample", "samples\interop\Direct3DInteropSample\Direct3DInteropSample.csproj", "{638580B0-7910-40EF-B674-DCB34DA308CD}"
+EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
src\Skia\Avalonia.Skia\Avalonia.Skia.projitems*{2f59f3d0-748d-4652-b01e-e0d954756308}*SharedItemsImports = 13
@@ -2547,6 +2549,46 @@ Global
{854568D5-13D1-4B4F-B50D-534DC7EFD3C9}.Release|Mono.Build.0 = Release|Any CPU
{854568D5-13D1-4B4F-B50D-534DC7EFD3C9}.Release|x86.ActiveCfg = Release|Any CPU
{854568D5-13D1-4B4F-B50D-534DC7EFD3C9}.Release|x86.Build.0 = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|Mono.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|Mono.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|Mono.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|Mono.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|x86.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.AppStore|x86.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|Mono.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|Mono.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Debug|x86.Build.0 = Debug|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|iPhone.Build.0 = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|Mono.ActiveCfg = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|Mono.Build.0 = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|x86.ActiveCfg = Release|Any CPU
+ {638580B0-7910-40EF-B674-DCB34DA308CD}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -2606,5 +2648,6 @@ Global
{F3AC8BC1-27F5-4255-9AFC-04ABFD11683A} = {74487168-7D91-487E-BF93-055F2251461E}
{4D6FAF79-58B4-482F-9122-0668C346364C} = {74487168-7D91-487E-BF93-055F2251461E}
{854568D5-13D1-4B4F-B50D-534DC7EFD3C9} = {86C53C40-57AA-45B8-AD42-FAE0EFDF0F2B}
+ {638580B0-7910-40EF-B674-DCB34DA308CD} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9}
EndGlobalSection
EndGlobal
diff --git a/samples/interop/Direct3DInteropSample/App.paml b/samples/interop/Direct3DInteropSample/App.paml
new file mode 100644
index 0000000000..d9630eef58
--- /dev/null
+++ b/samples/interop/Direct3DInteropSample/App.paml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/interop/Direct3DInteropSample/App.paml.cs b/samples/interop/Direct3DInteropSample/App.paml.cs
new file mode 100644
index 0000000000..1b6d5fd39c
--- /dev/null
+++ b/samples/interop/Direct3DInteropSample/App.paml.cs
@@ -0,0 +1,13 @@
+using Avalonia;
+using Avalonia.Markup.Xaml;
+
+namespace Direct3DInteropSample
+{
+ public class App : Application
+ {
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
diff --git a/samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj b/samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj
new file mode 100644
index 0000000000..7084bbf44f
--- /dev/null
+++ b/samples/interop/Direct3DInteropSample/Direct3DInteropSample.csproj
@@ -0,0 +1,33 @@
+
+
+ Exe
+ net461
+
+
+
+
+
+ %(Filename)
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/interop/Direct3DInteropSample/MainWindow.cs b/samples/interop/Direct3DInteropSample/MainWindow.cs
new file mode 100644
index 0000000000..c107afbe4a
--- /dev/null
+++ b/samples/interop/Direct3DInteropSample/MainWindow.cs
@@ -0,0 +1,263 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Direct2D1.Media;
+using Avalonia.Markup.Xaml;
+using Avalonia.Platform;
+using Avalonia.Rendering;
+using SharpDX;
+using SharpDX.D3DCompiler;
+using SharpDX.Direct2D1;
+using SharpDX.Direct3D;
+using SharpDX.Direct3D11;
+using SharpDX.DXGI;
+using SharpDX.WIC;
+using SharpDX.Mathematics;
+using AlphaMode = SharpDX.Direct2D1.AlphaMode;
+using Buffer = SharpDX.Direct3D11.Buffer;
+using DeviceContext = SharpDX.Direct3D11.DeviceContext;
+using Factory1 = SharpDX.DXGI.Factory1;
+using InputElement = SharpDX.Direct3D11.InputElement;
+using Matrix = SharpDX.Matrix;
+using PixelFormat = SharpDX.Direct2D1.PixelFormat;
+
+namespace Direct3DInteropSample
+{
+ class MainWindow : Window
+ {
+ private SharpDX.Direct3D11.Device _d3dDevice;
+ private SharpDX.DXGI.Device _dxgiDevice;
+ Texture2D backBuffer = null;
+ RenderTargetView renderView = null;
+ Texture2D depthBuffer = null;
+ DepthStencilView depthView = null;
+ private readonly SwapChain _swapChain;
+ private SwapChainDescription _desc;
+ private Matrix _proj = Matrix.Identity;
+ private Matrix _view;
+ private Buffer _contantBuffer;
+ private SharpDX.Direct2D1.Device _d2dDevice;
+ private SharpDX.Direct2D1.DeviceContext _d2dContext;
+ private RenderTarget _d2dRenderTarget;
+ private MainWindowViewModel _model;
+
+ public MainWindow()
+ {
+ _dxgiDevice = AvaloniaLocator.Current.GetService();
+ _d3dDevice = _dxgiDevice.QueryInterface();
+ _d2dDevice = AvaloniaLocator.Current.GetService();
+ DataContext = _model = new MainWindowViewModel();
+ _desc = new SwapChainDescription()
+ {
+ BufferCount = 1,
+ ModeDescription =
+ new ModeDescription((int)ClientSize.Width, (int)ClientSize.Height,
+ new Rational(60, 1), Format.R8G8B8A8_UNorm),
+ IsWindowed = true,
+ OutputHandle = PlatformImpl.Handle.Handle,
+ SampleDescription = new SampleDescription(1, 0),
+ SwapEffect = SwapEffect.Discard,
+ Usage = Usage.RenderTargetOutput
+ };
+
+ _swapChain = new SwapChain(new Factory1(), _d3dDevice, _desc);
+
+ _d2dContext = new SharpDX.Direct2D1.DeviceContext(_d2dDevice, DeviceContextOptions.None)
+ {
+ DotsPerInch = new Size2F(96, 96)
+ };
+
+ CreateMesh();
+ _view = Matrix.LookAtLH(new Vector3(0, 0, -5), new Vector3(0, 0, 0), Vector3.UnitY);
+ this.GetObservable(ClientSizeProperty).Subscribe(Resize);
+ Resize(ClientSize);
+ AvaloniaXamlLoader.Load(this);
+ }
+
+
+ protected override void HandlePaint(Rect rect)
+ {
+ var viewProj = Matrix.Multiply(_view, _proj);
+ var context = _d3dDevice.ImmediateContext;
+ // Clear views
+ context.ClearDepthStencilView(depthView, DepthStencilClearFlags.Depth, 1.0f, 0);
+ context.ClearRenderTargetView(renderView, Color.White);
+
+ var time = 50;
+ // Update WorldViewProj Matrix
+ var worldViewProj = Matrix.RotationX((float) _model.RotationX) * Matrix.RotationY((float) _model.RotationY) *
+ Matrix.RotationZ((float) _model.RotationZ)
+ * Matrix.Scaling((float) _model.Zoom) * viewProj;
+ worldViewProj.Transpose();
+ context.UpdateSubresource(ref worldViewProj, _contantBuffer);
+
+ // Draw the cube
+ context.Draw(36, 0);
+ base.HandlePaint(rect);
+ // Present!
+ _swapChain.Present(0, PresentFlags.None);
+ }
+
+
+ void CreateMesh()
+ {
+ var device = _d3dDevice;
+ // Compile Vertex and Pixel shaders
+ var vertexShaderByteCode = ShaderBytecode.CompileFromFile("MiniCube.fx", "VS", "vs_4_0");
+ var vertexShader = new VertexShader(device, vertexShaderByteCode);
+
+ var pixelShaderByteCode = ShaderBytecode.CompileFromFile("MiniCube.fx", "PS", "ps_4_0");
+ var pixelShader = new PixelShader(device, pixelShaderByteCode);
+
+ var signature = ShaderSignature.GetInputSignature(vertexShaderByteCode);
+ // Layout from VertexShader input signature
+ var layout = new InputLayout(device, signature, new[]
+ {
+ new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
+ new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0)
+ });
+
+ // Instantiate Vertex buiffer from vertex data
+ var vertices = Buffer.Create(device, BindFlags.VertexBuffer, new[]
+ {
+ new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), // Front
+ new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
+ new Vector4( 1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
+ new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
+ new Vector4( 1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
+ new Vector4( 1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f),
+
+ new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), // BACK
+ new Vector4( 1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
+ new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
+ new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
+ new Vector4( 1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
+ new Vector4( 1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f),
+
+ new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), // Top
+ new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
+ new Vector4( 1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
+ new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
+ new Vector4( 1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
+ new Vector4( 1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f),
+
+ new Vector4(-1.0f,-1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f), // Bottom
+ new Vector4( 1.0f,-1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
+ new Vector4(-1.0f,-1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
+ new Vector4(-1.0f,-1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
+ new Vector4( 1.0f,-1.0f, -1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
+ new Vector4( 1.0f,-1.0f, 1.0f, 1.0f), new Vector4(1.0f, 1.0f, 0.0f, 1.0f),
+
+ new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f), // Left
+ new Vector4(-1.0f, -1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
+ new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
+ new Vector4(-1.0f, -1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
+ new Vector4(-1.0f, 1.0f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
+ new Vector4(-1.0f, 1.0f, -1.0f, 1.0f), new Vector4(1.0f, 0.0f, 1.0f, 1.0f),
+
+ new Vector4( 1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f), // Right
+ new Vector4( 1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
+ new Vector4( 1.0f, -1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
+ new Vector4( 1.0f, -1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
+ new Vector4( 1.0f, 1.0f, -1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
+ new Vector4( 1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 1.0f, 1.0f),
+ });
+
+ // Create Constant Buffer
+ _contantBuffer = new Buffer(device, Utilities.SizeOf(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
+
+ var context = _d3dDevice.ImmediateContext;
+
+ // Prepare All the stages
+ context.InputAssembler.InputLayout = layout;
+ context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
+ context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, Utilities.SizeOf() * 2, 0));
+ context.VertexShader.SetConstantBuffer(0, _contantBuffer);
+ context.VertexShader.Set(vertexShader);
+ context.PixelShader.Set(pixelShader);
+ }
+
+ void Resize(Size size)
+ {
+ Utilities.Dispose(ref _d2dRenderTarget);
+ Utilities.Dispose(ref backBuffer);
+ Utilities.Dispose(ref renderView);
+ Utilities.Dispose(ref depthBuffer);
+ Utilities.Dispose(ref depthView);
+ var context = _d3dDevice.ImmediateContext;
+ // Resize the backbuffer
+ _swapChain.ResizeBuffers(_desc.BufferCount, (int)size.Width, (int)size.Height, Format.Unknown, SwapChainFlags.None);
+
+ // Get the backbuffer from the swapchain
+ backBuffer = Texture2D.FromSwapChain(_swapChain, 0);
+
+ // Renderview on the backbuffer
+ renderView = new RenderTargetView(_d3dDevice, backBuffer);
+
+ // Create the depth buffer
+ depthBuffer = new Texture2D(_d3dDevice, new Texture2DDescription()
+ {
+ Format = Format.D32_Float_S8X24_UInt,
+ ArraySize = 1,
+ MipLevels = 1,
+ Width = (int)size.Width,
+ Height = (int)size.Height,
+ SampleDescription = new SampleDescription(1, 0),
+ Usage = ResourceUsage.Default,
+ BindFlags = BindFlags.DepthStencil,
+ CpuAccessFlags = CpuAccessFlags.None,
+ OptionFlags = ResourceOptionFlags.None
+ });
+
+ // Create the depth buffer view
+ depthView = new DepthStencilView(_d3dDevice, depthBuffer);
+
+ // Setup targets and viewport for rendering
+ context.Rasterizer.SetViewport(new Viewport(0, 0, (int)size.Width, (int)size.Height, 0.0f, 1.0f));
+ context.OutputMerger.SetTargets(depthView, renderView);
+
+ // Setup new projection matrix with correct aspect ratio
+ _proj = Matrix.PerspectiveFovLH((float)Math.PI / 4.0f, (float)(size.Width / size.Height), 0.1f, 100.0f);
+
+ using (var dxgiBackBuffer = _swapChain.GetBackBuffer(0))
+ {
+ _d2dRenderTarget = new RenderTarget(AvaloniaLocator.Current.GetService()
+ , dxgiBackBuffer, new RenderTargetProperties
+ {
+ DpiX = 96,
+ DpiY = 96,
+ Type = RenderTargetType.Default,
+ PixelFormat = new PixelFormat(Format.Unknown, AlphaMode.Premultiplied)
+ });
+ }
+
+ }
+
+ class D3DRenderTarget: IRenderTarget
+ {
+ private readonly MainWindow _window;
+
+ public D3DRenderTarget(MainWindow window)
+ {
+ _window = window;
+ }
+ public void Dispose()
+ {
+
+ }
+
+ public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer)
+ {
+ return new DrawingContextImpl(visualBrushRenderer, _window._d2dRenderTarget,
+ AvaloniaLocator.Current.GetService());
+ }
+ }
+
+
+ public override IRenderTarget CreateRenderTarget() => new D3DRenderTarget(this);
+ }
+}
diff --git a/samples/interop/Direct3DInteropSample/MainWindow.paml b/samples/interop/Direct3DInteropSample/MainWindow.paml
new file mode 100644
index 0000000000..0a689e8a22
--- /dev/null
+++ b/samples/interop/Direct3DInteropSample/MainWindow.paml
@@ -0,0 +1,14 @@
+
+
+
+ Rotation X
+
+ Rotation Y
+
+ Rotation Z
+
+ Zoom
+
+
+
+
\ No newline at end of file
diff --git a/samples/interop/Direct3DInteropSample/MainWindowViewModel.cs b/samples/interop/Direct3DInteropSample/MainWindowViewModel.cs
new file mode 100644
index 0000000000..d39a21cd07
--- /dev/null
+++ b/samples/interop/Direct3DInteropSample/MainWindowViewModel.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ReactiveUI;
+
+namespace Direct3DInteropSample
+{
+ public class MainWindowViewModel : ReactiveObject
+ {
+ private double _rotationX;
+
+ public double RotationX
+ {
+ get { return _rotationX; }
+ set { this.RaiseAndSetIfChanged(ref _rotationX, value); }
+ }
+
+ private double _rotationY = 1;
+
+ public double RotationY
+ {
+ get { return _rotationY; }
+ set { this.RaiseAndSetIfChanged(ref _rotationY, value); }
+ }
+
+ private double _rotationZ = 2;
+
+ public double RotationZ
+ {
+ get { return _rotationZ; }
+ set { this.RaiseAndSetIfChanged(ref _rotationZ, value); }
+ }
+
+
+ private double _zoom = 1;
+
+ public double Zoom
+ {
+ get { return _zoom; }
+ set { this.RaiseAndSetIfChanged(ref _zoom, value); }
+ }
+ }
+}
diff --git a/samples/interop/Direct3DInteropSample/MiniCube.fx b/samples/interop/Direct3DInteropSample/MiniCube.fx
new file mode 100644
index 0000000000..f246421f2d
--- /dev/null
+++ b/samples/interop/Direct3DInteropSample/MiniCube.fx
@@ -0,0 +1,47 @@
+// Copyright (c) 2010-2013 SharpDX - Alexandre Mutel
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+struct VS_IN
+{
+ float4 pos : POSITION;
+ float4 col : COLOR;
+};
+
+struct PS_IN
+{
+ float4 pos : SV_POSITION;
+ float4 col : COLOR;
+};
+
+float4x4 worldViewProj;
+
+PS_IN VS( VS_IN input )
+{
+ PS_IN output = (PS_IN)0;
+
+ output.pos = mul(input.pos, worldViewProj);
+ output.col = input.col;
+
+ return output;
+}
+
+float4 PS( PS_IN input ) : SV_Target
+{
+ return input.col;
+}
\ No newline at end of file
diff --git a/samples/interop/Direct3DInteropSample/Program.cs b/samples/interop/Direct3DInteropSample/Program.cs
new file mode 100644
index 0000000000..7fb650a7a8
--- /dev/null
+++ b/samples/interop/Direct3DInteropSample/Program.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Avalonia;
+
+namespace Direct3DInteropSample
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ AppBuilder.Configure().UseWin32().UseDirect2D1().Start();
+ }
+ }
+}
diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs
index 8549a98371..f7f74465fd 100644
--- a/src/Avalonia.Controls/TopLevel.cs
+++ b/src/Avalonia.Controls/TopLevel.cs
@@ -185,7 +185,7 @@ namespace Avalonia.Controls
}
///
- IRenderTarget IRenderRoot.CreateRenderTarget()
+ public virtual IRenderTarget CreateRenderTarget()
{
return _renderInterface.CreateRenderTarget(PlatformImpl.Surfaces);
}