committed by
GitHub
622 changed files with 8360 additions and 4173 deletions
@ -1,6 +1,7 @@ |
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<ItemGroup> |
|||
<ItemGroup Condition="'$(TargetFramework)' != 'net6'"> |
|||
<PackageReference Include="System.ValueTuple" Version="4.5.0" /> |
|||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" /> |
|||
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.6.0" /> |
|||
</ItemGroup> |
|||
</Project> |
|||
|
|||
@ -1,5 +0,0 @@ |
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<ItemGroup> |
|||
<PackageReference Include="JetBrains.Annotations" Version="10.3.0" /> |
|||
</ItemGroup> |
|||
</Project> |
|||
@ -1,5 +1,5 @@ |
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
|||
<ItemGroup> |
|||
<ItemGroup Condition="'$(TargetFramework)' != 'net6'"> |
|||
<PackageReference Include="System.Memory" Version="4.5.3" /> |
|||
</ItemGroup> |
|||
</Project> |
|||
|
|||
@ -1,11 +1,9 @@ |
|||
{ |
|||
"sdk": { |
|||
"version": "7.0.100", |
|||
"version": "7.0.101", |
|||
"rollForward": "latestFeature" |
|||
}, |
|||
"msbuild-sdks": { |
|||
"Microsoft.Build.Traversal": "1.0.43", |
|||
"MSBuild.Sdk.Extras": "3.0.22", |
|||
"AggregatePackage.NuGet.Sdk" : "0.1.12" |
|||
"Microsoft.Build.Traversal": "3.2.0" |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,13 @@ |
|||
{ |
|||
"profiles": { |
|||
"ControlCatalog.Browser": { |
|||
"commandName": "Project", |
|||
"launchBrowser": true, |
|||
"environmentVariables": { |
|||
"ASPNETCORE_ENVIRONMENT": "Development" |
|||
}, |
|||
"applicationUrl": "https://localhost:5001;http://localhost:5000", |
|||
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/debug?browser={browserInspectUri}" |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,212 @@ |
|||
using System; |
|||
using System.Numerics; |
|||
using Avalonia; |
|||
using Avalonia.Controls; |
|||
using Avalonia.Input; |
|||
using Avalonia.LogicalTree; |
|||
using Avalonia.Markup.Xaml; |
|||
using Avalonia.Rendering.Composition; |
|||
|
|||
namespace ControlCatalog.Pages |
|||
{ |
|||
public class GesturePage : UserControl |
|||
{ |
|||
private bool _isInit; |
|||
private float _currentScale; |
|||
|
|||
public GesturePage() |
|||
{ |
|||
this.InitializeComponent(); |
|||
} |
|||
|
|||
private void InitializeComponent() |
|||
{ |
|||
AvaloniaXamlLoader.Load(this); |
|||
} |
|||
|
|||
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) |
|||
{ |
|||
base.OnAttachedToVisualTree(e); |
|||
|
|||
if(_isInit) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
_isInit = true; |
|||
|
|||
SetPullHandlers(this.Find<Border>("TopPullZone"), false); |
|||
SetPullHandlers(this.Find<Border>("BottomPullZone"), true); |
|||
SetPullHandlers(this.Find<Border>("RightPullZone"), true); |
|||
SetPullHandlers(this.Find<Border>("LeftPullZone"), false); |
|||
|
|||
var image = this.Find<Image>("PinchImage"); |
|||
SetPinchHandlers(image); |
|||
|
|||
var reset = this.Find<Button>("ResetButton"); |
|||
|
|||
reset!.Click += (s, e) => |
|||
{ |
|||
var compositionVisual = ElementComposition.GetElementVisual(image); |
|||
|
|||
if(compositionVisual!= null) |
|||
{ |
|||
_currentScale = 1; |
|||
compositionVisual.Scale = new Vector3(1,1,1); |
|||
image.InvalidateMeasure(); |
|||
} |
|||
}; |
|||
|
|||
} |
|||
|
|||
private void SetPinchHandlers(Control? control) |
|||
{ |
|||
if (control == null) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
_currentScale = 1; |
|||
Vector3 currentOffset = default; |
|||
bool isZooming = false; |
|||
|
|||
CompositionVisual? compositionVisual = null; |
|||
|
|||
void InitComposition(Control visual) |
|||
{ |
|||
if (compositionVisual != null) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
compositionVisual = ElementComposition.GetElementVisual(visual); |
|||
} |
|||
|
|||
control.LayoutUpdated += (s, e) => |
|||
{ |
|||
InitComposition(control!); |
|||
if (compositionVisual != null) |
|||
{ |
|||
compositionVisual.Scale = new(_currentScale, _currentScale, 1); |
|||
|
|||
if(currentOffset == default) |
|||
{ |
|||
currentOffset = compositionVisual.Offset; |
|||
} |
|||
} |
|||
}; |
|||
|
|||
control.AddHandler(Gestures.PinchEvent, (s, e) => |
|||
{ |
|||
InitComposition(control!); |
|||
|
|||
isZooming = true; |
|||
|
|||
if(compositionVisual != null) |
|||
{ |
|||
var scale = _currentScale * (float)e.Scale; |
|||
|
|||
compositionVisual.Scale = new(scale, scale, 1); |
|||
} |
|||
}); |
|||
|
|||
control.AddHandler(Gestures.PinchEndedEvent, (s, e) => |
|||
{ |
|||
InitComposition(control!); |
|||
|
|||
isZooming = false; |
|||
|
|||
if (compositionVisual != null) |
|||
{ |
|||
_currentScale = compositionVisual.Scale.X; |
|||
} |
|||
}); |
|||
|
|||
control.AddHandler(Gestures.ScrollGestureEvent, (s, e) => |
|||
{ |
|||
InitComposition(control!); |
|||
|
|||
if (compositionVisual != null && !isZooming) |
|||
{ |
|||
currentOffset -= new Vector3((float)e.Delta.X, (float)e.Delta.Y, 0); |
|||
|
|||
compositionVisual.Offset = currentOffset; |
|||
} |
|||
}); |
|||
} |
|||
|
|||
private void SetPullHandlers(Control? control, bool inverse) |
|||
{ |
|||
if (control == null) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
var ball = control.FindLogicalDescendantOfType<Border>(); |
|||
|
|||
Vector3 defaultOffset = default; |
|||
|
|||
CompositionVisual? ballCompositionVisual = null; |
|||
|
|||
if (ball != null) |
|||
{ |
|||
InitComposition(ball); |
|||
} |
|||
else |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
control.LayoutUpdated += (s, e) => |
|||
{ |
|||
InitComposition(ball!); |
|||
if (ballCompositionVisual != null) |
|||
{ |
|||
defaultOffset = ballCompositionVisual.Offset; |
|||
} |
|||
}; |
|||
|
|||
control.AddHandler(Gestures.PullGestureEvent, (s, e) => |
|||
{ |
|||
Vector3 center = new((float)control.Bounds.Center.X, (float)control.Bounds.Center.Y, 0); |
|||
InitComposition(ball!); |
|||
if (ballCompositionVisual != null) |
|||
{ |
|||
ballCompositionVisual.Offset = defaultOffset + new System.Numerics.Vector3((float)e.Delta.X * 0.4f, (float)e.Delta.Y * 0.4f, 0) * (inverse ? -1 : 1); |
|||
} |
|||
}); |
|||
|
|||
control.AddHandler(Gestures.PullGestureEndedEvent, (s, e) => |
|||
{ |
|||
InitComposition(ball!); |
|||
if (ballCompositionVisual != null) |
|||
{ |
|||
ballCompositionVisual.Offset = defaultOffset; |
|||
} |
|||
}); |
|||
|
|||
void InitComposition(Control control) |
|||
{ |
|||
if (ballCompositionVisual != null) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
ballCompositionVisual = ElementComposition.GetElementVisual(ball); |
|||
|
|||
if (ballCompositionVisual != null) |
|||
{ |
|||
var offsetAnimation = ballCompositionVisual.Compositor.CreateVector3KeyFrameAnimation(); |
|||
offsetAnimation.Target = "Offset"; |
|||
offsetAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue"); |
|||
offsetAnimation.Duration = TimeSpan.FromMilliseconds(100); |
|||
|
|||
var implicitAnimations = ballCompositionVisual.Compositor.CreateImplicitAnimationCollection(); |
|||
implicitAnimations["Offset"] = offsetAnimation; |
|||
|
|||
ballCompositionVisual.ImplicitAnimations = implicitAnimations; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,117 @@ |
|||
<UserControl xmlns="https://github.com/avaloniaui" |
|||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
|||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
|||
d:DesignHeight="800" |
|||
d:DesignWidth="400" |
|||
x:Class="ControlCatalog.Pages.GesturePage"> |
|||
<StackPanel Orientation="Vertical" |
|||
Spacing="4"> |
|||
<TextBlock FontWeight="Bold" |
|||
FontSize="18" |
|||
Margin="5">Pull Gexture (Touch / Pen)</TextBlock> |
|||
<TextBlock Margin="5">Pull from colored rectangles</TextBlock> |
|||
<Border> |
|||
<DockPanel HorizontalAlignment="Stretch" |
|||
ClipToBounds="True" |
|||
Margin="5" |
|||
Height="200"> |
|||
<Border DockPanel.Dock="Top" |
|||
Margin="2" |
|||
Name="TopPullZone" |
|||
Background="Transparent" |
|||
BorderBrush="Red" |
|||
HorizontalAlignment="Stretch" |
|||
Height="50" |
|||
BorderThickness="1"> |
|||
<Border.GestureRecognizers> |
|||
<PullGestureRecognizer PullDirection="TopToBottom"/> |
|||
</Border.GestureRecognizers> |
|||
<Border Width="10" |
|||
Height="10" |
|||
HorizontalAlignment="Center" |
|||
VerticalAlignment="Center" |
|||
CornerRadius="5" |
|||
Name="TopBall" |
|||
Background="Green"/> |
|||
</Border> |
|||
<Border DockPanel.Dock="Bottom" |
|||
BorderBrush="Green" |
|||
Margin="2" |
|||
Background="Transparent" |
|||
Name="BottomPullZone" |
|||
HorizontalAlignment="Stretch" |
|||
Height="50" |
|||
BorderThickness="1"> |
|||
<Border.GestureRecognizers> |
|||
<PullGestureRecognizer PullDirection="BottomToTop"/> |
|||
</Border.GestureRecognizers> |
|||
<Border Width="10" |
|||
Name="BottomBall" |
|||
HorizontalAlignment="Center" |
|||
VerticalAlignment="Center" |
|||
Height="10" |
|||
CornerRadius="5" |
|||
Background="Green"/> |
|||
</Border> |
|||
<Border DockPanel.Dock="Right" |
|||
Margin="2" |
|||
Background="Transparent" |
|||
Name="RightPullZone" |
|||
BorderBrush="Blue" |
|||
HorizontalAlignment="Right" |
|||
VerticalAlignment="Stretch" |
|||
Width="50" |
|||
BorderThickness="1"> |
|||
<Border.GestureRecognizers> |
|||
<PullGestureRecognizer PullDirection="RightToLeft"/> |
|||
</Border.GestureRecognizers> |
|||
<Border Width="10" |
|||
Height="10" |
|||
Name="RightBall" |
|||
HorizontalAlignment="Center" |
|||
VerticalAlignment="Center" |
|||
CornerRadius="5" |
|||
Background="Green"/> |
|||
|
|||
</Border> |
|||
<Border DockPanel.Dock="Left" |
|||
Margin="2" |
|||
Background="Transparent" |
|||
Name="LeftPullZone" |
|||
BorderBrush="Orange" |
|||
HorizontalAlignment="Left" |
|||
VerticalAlignment="Stretch" |
|||
Width="50" |
|||
BorderThickness="1"> |
|||
<Border.GestureRecognizers> |
|||
<PullGestureRecognizer PullDirection="LeftToRight"/> |
|||
</Border.GestureRecognizers> |
|||
<Border Width="10" |
|||
Height="10" |
|||
Name="LeftBall" |
|||
HorizontalAlignment="Center" |
|||
VerticalAlignment="Center" |
|||
CornerRadius="5" |
|||
Background="Green"/> |
|||
|
|||
</Border> |
|||
</DockPanel> |
|||
</Border> |
|||
|
|||
<TextBlock FontWeight="Bold" |
|||
FontSize="18" |
|||
Margin="5">Pinch/Zoom Gexture (Multi Touch)</TextBlock> |
|||
<Border ClipToBounds="True"> |
|||
<Image Stretch="UniformToFill" |
|||
Margin="5" |
|||
Name="PinchImage" |
|||
Source="/Assets/delicate-arch-896885_640.jpg"> |
|||
<Image.GestureRecognizers> |
|||
<PinchGestureRecognizer/> |
|||
<ScrollGestureRecognizer CanHorizontallyScroll="True" CanVerticallyScroll="True"/> |
|||
</Image.GestureRecognizers> |
|||
</Image> |
|||
</Border> |
|||
<Button HorizontalAlignment="Center" Name="ResetButton">Reset</Button> |
|||
</StackPanel> |
|||
</UserControl> |
|||
@ -1,5 +0,0 @@ |
|||
<Application xmlns="https://github.com/avaloniaui"> |
|||
<Application.Styles> |
|||
<SimpleTheme Mode="Light" /> |
|||
</Application.Styles> |
|||
</Application> |
|||
@ -1,21 +0,0 @@ |
|||
using Avalonia; |
|||
using Avalonia.Controls.ApplicationLifetimes; |
|||
using Avalonia.Markup.Xaml; |
|||
|
|||
namespace Direct3DInteropSample |
|||
{ |
|||
public class App : Application |
|||
{ |
|||
public override void Initialize() |
|||
{ |
|||
AvaloniaXamlLoader.Load(this); |
|||
} |
|||
|
|||
public override void OnFrameworkInitializationCompleted() |
|||
{ |
|||
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) |
|||
desktop.MainWindow = new MainWindow(); |
|||
base.OnFrameworkInitializationCompleted(); |
|||
} |
|||
} |
|||
} |
|||
@ -1,32 +0,0 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
<PropertyGroup> |
|||
<OutputType>Exe</OutputType> |
|||
<TargetFramework>net461</TargetFramework> |
|||
</PropertyGroup> |
|||
<ItemGroup> |
|||
<PackageReference Include="SharpDX.Mathematics" Version="4.0.1" /> |
|||
<PackageReference Include="SharpDX.D3DCompiler" Version="4.0.1" /> |
|||
<Compile Update="**\*.paml.cs"> |
|||
<DependentUpon>%(Filename)</DependentUpon> |
|||
</Compile> |
|||
<EmbeddedResource Include="**\*.paml"> |
|||
<SubType>Designer</SubType> |
|||
</EmbeddedResource> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<None Remove="MiniCube.fx" /> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<EmbeddedResource Include="MiniCube.fx"> |
|||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> |
|||
</EmbeddedResource> |
|||
</ItemGroup> |
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\..\src\Avalonia.Themes.Simple\Avalonia.Themes.Simple.csproj" /> |
|||
<ProjectReference Include="..\..\..\src\Windows\Avalonia.Direct2D1\Avalonia.Direct2D1.csproj" /> |
|||
<ProjectReference Include="..\..\..\src\Windows\Avalonia.Win32\Avalonia.Win32.csproj" /> |
|||
<ProjectReference Include="..\..\MiniMvvm\MiniMvvm.csproj" /> |
|||
</ItemGroup> |
|||
<Import Project="..\..\..\build\Rx.props" /> |
|||
<Import Project="..\..\..\build\ReferenceCoreLibraries.props" /> |
|||
</Project> |
|||
@ -1,283 +0,0 @@ |
|||
using System; |
|||
|
|||
using Avalonia; |
|||
using Avalonia.Controls; |
|||
using Avalonia.Direct2D1; |
|||
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 AlphaMode = SharpDX.Direct2D1.AlphaMode; |
|||
using Buffer = SharpDX.Direct3D11.Buffer; |
|||
using DeviceContext = SharpDX.Direct2D1.DeviceContext; |
|||
using Factory2 = SharpDX.DXGI.Factory2; |
|||
using InputElement = SharpDX.Direct3D11.InputElement; |
|||
using Matrix = SharpDX.Matrix; |
|||
using PixelFormat = SharpDX.Direct2D1.PixelFormat; |
|||
using Resource = SharpDX.Direct3D11.Resource; |
|||
|
|||
namespace Direct3DInteropSample |
|||
{ |
|||
public class MainWindow : Window |
|||
{ |
|||
Texture2D _backBuffer; |
|||
RenderTargetView _renderView; |
|||
Texture2D _depthBuffer; |
|||
DepthStencilView _depthView; |
|||
private readonly SwapChain _swapChain; |
|||
private SwapChainDescription1 _desc; |
|||
private Matrix _proj = Matrix.Identity; |
|||
private readonly Matrix _view; |
|||
private Buffer _contantBuffer; |
|||
private DeviceContext _deviceContext; |
|||
private readonly MainWindowViewModel _model; |
|||
|
|||
public MainWindow() |
|||
{ |
|||
DataContext = _model = new MainWindowViewModel(); |
|||
|
|||
_desc = new SwapChainDescription1() |
|||
{ |
|||
BufferCount = 1, |
|||
Width = (int)ClientSize.Width, |
|||
Height = (int)ClientSize.Height, |
|||
Format = Format.R8G8B8A8_UNorm, |
|||
SampleDescription = new SampleDescription(1, 0), |
|||
SwapEffect = SwapEffect.Discard, |
|||
Usage = Usage.RenderTargetOutput |
|||
}; |
|||
|
|||
using (var factory = Direct2D1Platform.DxgiDevice.Adapter.GetParent<Factory2>()) |
|||
{ |
|||
_swapChain = new SwapChain1(factory, Direct2D1Platform.DxgiDevice, PlatformImpl?.Handle.Handle ?? IntPtr.Zero, ref _desc); |
|||
} |
|||
|
|||
_deviceContext = new DeviceContext(Direct2D1Platform.Direct2D1Device, 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); |
|||
|
|||
Background = Avalonia.Media.Brushes.Transparent; |
|||
} |
|||
|
|||
|
|||
protected override void HandlePaint(Rect rect) |
|||
{ |
|||
var viewProj = Matrix.Multiply(_view, _proj); |
|||
var context = Direct2D1Platform.Direct3D11Device.ImmediateContext; |
|||
|
|||
// Clear views
|
|||
context.ClearDepthStencilView(_depthView, DepthStencilClearFlags.Depth, 1.0f, 0); |
|||
context.ClearRenderTargetView(_renderView, Color.White); |
|||
|
|||
// 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); |
|||
} |
|||
|
|||
private void CreateMesh() |
|||
{ |
|||
var device = Direct2D1Platform.Direct3D11Device; |
|||
|
|||
// 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); |
|||
|
|||
var inputElements = new[] |
|||
{ |
|||
new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0), |
|||
new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0) |
|||
}; |
|||
|
|||
// Layout from VertexShader input signature
|
|||
var layout = new InputLayout( |
|||
device, |
|||
signature, |
|||
inputElements); |
|||
|
|||
// Instantiate Vertex buffer 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<Matrix>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0); |
|||
|
|||
var context = Direct2D1Platform.Direct3D11Device.ImmediateContext; |
|||
|
|||
// Prepare All the stages
|
|||
context.InputAssembler.InputLayout = layout; |
|||
context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; |
|||
context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, Utilities.SizeOf<Vector4>() * 2, 0)); |
|||
context.VertexShader.SetConstantBuffer(0, _contantBuffer); |
|||
context.VertexShader.Set(vertexShader); |
|||
context.PixelShader.Set(pixelShader); |
|||
} |
|||
|
|||
private void Resize(Size size) |
|||
{ |
|||
Utilities.Dispose(ref _deviceContext); |
|||
Utilities.Dispose(ref _backBuffer); |
|||
Utilities.Dispose(ref _renderView); |
|||
Utilities.Dispose(ref _depthBuffer); |
|||
Utilities.Dispose(ref _depthView); |
|||
var context = Direct2D1Platform.Direct3D11Device.ImmediateContext; |
|||
|
|||
// Resize the backbuffer
|
|||
_swapChain.ResizeBuffers(0, 0, 0, Format.Unknown, SwapChainFlags.None); |
|||
|
|||
// Get the backbuffer from the swapchain
|
|||
_backBuffer = Resource.FromSwapChain<Texture2D>(_swapChain, 0); |
|||
|
|||
// Renderview on the backbuffer
|
|||
_renderView = new RenderTargetView(Direct2D1Platform.Direct3D11Device, _backBuffer); |
|||
|
|||
// Create the depth buffer
|
|||
_depthBuffer = new Texture2D( |
|||
Direct2D1Platform.Direct3D11Device, |
|||
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(Direct2D1Platform.Direct3D11Device, _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<Surface>(0)) |
|||
{ |
|||
var renderTarget = new SharpDX.Direct2D1.RenderTarget( |
|||
Direct2D1Platform.Direct2D1Factory, |
|||
dxgiBackBuffer, |
|||
new RenderTargetProperties |
|||
{ |
|||
DpiX = 96, |
|||
DpiY = 96, |
|||
Type = RenderTargetType.Default, |
|||
PixelFormat = new PixelFormat( |
|||
Format.Unknown, |
|||
AlphaMode.Premultiplied) |
|||
}); |
|||
|
|||
_deviceContext = renderTarget.QueryInterface<DeviceContext>(); |
|||
|
|||
renderTarget.Dispose(); |
|||
} |
|||
} |
|||
|
|||
private 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, null, _window._deviceContext); |
|||
} |
|||
} |
|||
|
|||
|
|||
protected override IRenderTarget CreateRenderTarget() => new D3DRenderTarget(this); |
|||
} |
|||
} |
|||
@ -1,14 +0,0 @@ |
|||
<Window xmlns="https://github.com/avaloniaui" Background="White" Title="Avalonia Direct3D Demo"> |
|||
<Grid ColumnDefinitions="*,Auto" Margin="20"> |
|||
<StackPanel Grid.Column="1" MinWidth="200"> |
|||
<TextBlock>Rotation X</TextBlock> |
|||
<Slider Value="{Binding RotationX, Mode=TwoWay}" Maximum="10"/> |
|||
<TextBlock>Rotation Y</TextBlock> |
|||
<Slider Value="{Binding RotationY, Mode=TwoWay}" Maximum="10"/> |
|||
<TextBlock>Rotation Z</TextBlock> |
|||
<Slider Value="{Binding RotationZ, Mode=TwoWay}" Maximum="10"/> |
|||
<TextBlock>Zoom</TextBlock> |
|||
<Slider Value="{Binding Zoom, Mode=TwoWay}" Maximum="3" Minimum="0.5"/> |
|||
</StackPanel> |
|||
</Grid> |
|||
</Window> |
|||
@ -1,45 +0,0 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using MiniMvvm; |
|||
|
|||
namespace Direct3DInteropSample |
|||
{ |
|||
public class MainWindowViewModel : ViewModelBase |
|||
{ |
|||
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); } |
|||
} |
|||
} |
|||
} |
|||
@ -1,47 +0,0 @@ |
|||
// 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; |
|||
} |
|||
@ -1,16 +0,0 @@ |
|||
using Avalonia; |
|||
|
|||
namespace Direct3DInteropSample |
|||
{ |
|||
class Program |
|||
{ |
|||
public static AppBuilder BuildAvaloniaApp() |
|||
=> AppBuilder.Configure<App>() |
|||
.With(new Win32PlatformOptions { UseDeferredRendering = false }) |
|||
.UseWin32() |
|||
.UseDirect2D1(); |
|||
|
|||
public static int Main(string[] args) |
|||
=> BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
using System; |
|||
using System.Runtime.InteropServices; |
|||
|
|||
namespace Avalonia.Compatibility |
|||
{ |
|||
internal sealed class OperatingSystemEx |
|||
{ |
|||
#if NET6_0_OR_GREATER
|
|||
public static bool IsWindows() => OperatingSystem.IsWindows(); |
|||
public static bool IsMacOS() => OperatingSystem.IsMacOS(); |
|||
public static bool IsLinux() => OperatingSystem.IsLinux(); |
|||
public static bool IsAndroid() => OperatingSystem.IsAndroid(); |
|||
public static bool IsIOS() => OperatingSystem.IsIOS(); |
|||
public static bool IsBrowser() => OperatingSystem.IsBrowser(); |
|||
public static bool IsOSPlatform(string platform) => OperatingSystem.IsOSPlatform(platform); |
|||
#else
|
|||
public static bool IsWindows() => RuntimeInformation.IsOSPlatform(OSPlatform.Windows); |
|||
public static bool IsMacOS() => RuntimeInformation.IsOSPlatform(OSPlatform.OSX); |
|||
public static bool IsLinux() => RuntimeInformation.IsOSPlatform(OSPlatform.Linux); |
|||
public static bool IsAndroid() => IsOSPlatform("ANDROID"); |
|||
public static bool IsIOS() => IsOSPlatform("IOS"); |
|||
public static bool IsBrowser() => IsOSPlatform("BROWSER"); |
|||
public static bool IsOSPlatform(string platform) => RuntimeInformation.IsOSPlatform(OSPlatform.Create(platform)); |
|||
#endif
|
|||
} |
|||
} |
|||
@ -1,34 +0,0 @@ |
|||
using System; |
|||
using System.Runtime.CompilerServices; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Avalonia |
|||
{ |
|||
/// <summary>
|
|||
/// A stub of Code Contract's Contract class.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// It would be nice to use Code Contracts on Avalonia but last time I tried it slowed things
|
|||
/// to a crawl and often crashed. Instead use the same signature for checking preconditions
|
|||
/// in the hope that it might become usable at some point.
|
|||
/// </remarks>
|
|||
public static class Contract |
|||
{ |
|||
/// <summary>
|
|||
/// Specifies a precondition.
|
|||
/// </summary>
|
|||
/// <typeparam name="TException">
|
|||
/// The exception to throw if <paramref name="condition"/> is false.
|
|||
/// </typeparam>
|
|||
/// <param name="condition">The precondition.</param>
|
|||
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|||
[ContractAnnotation("condition:false=>stop")] |
|||
public static void Requires<TException>(bool condition) where TException : Exception, new() |
|||
{ |
|||
if (!condition) |
|||
{ |
|||
throw new TException(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue