Browse Source

Fix Rotate3DTransform for DeferredRenderer.

pull/7402/head
Jan-Peter Zurek 5 years ago
parent
commit
9078ca7dc8
  1. 1
      src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
  2. 2
      src/Avalonia.Visuals/Matrix.cs
  3. 17
      src/Avalonia.Visuals/Point.cs

1
src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj

@ -94,5 +94,6 @@
<Compile Remove="../Markup/Avalonia.Markup.Xaml.Loader\xamlil.github\src\XamlX\IL\SreTypeSystem.cs" /> <Compile Remove="../Markup/Avalonia.Markup.Xaml.Loader\xamlil.github\src\XamlX\IL\SreTypeSystem.cs" />
<PackageReference Include="Mono.Cecil" Version="0.11.2" /> <PackageReference Include="Mono.Cecil" Version="0.11.2" />
<PackageReference Include="Microsoft.Build.Framework" Version="15.1.548" PrivateAssets="All" /> <PackageReference Include="Microsoft.Build.Framework" Version="15.1.548" PrivateAssets="All" />
<PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

2
src/Avalonia.Visuals/Matrix.cs

@ -357,7 +357,7 @@ namespace Avalonia
/// <summary> /// <summary>
/// Determines if the current matrix contains perspective (non-affine) transforms (true) or only (affine) transforms that could be mapped into an 2x3 matrix (false). /// Determines if the current matrix contains perspective (non-affine) transforms (true) or only (affine) transforms that could be mapped into an 2x3 matrix (false).
/// </summary> /// </summary>
private bool ContainsPerspective() public bool ContainsPerspective()
{ {
// ReSharper disable CompareOfFloatsByEqualityOperator // ReSharper disable CompareOfFloatsByEqualityOperator

17
src/Avalonia.Visuals/Point.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Globalization; using System.Globalization;
using System.Numerics;
#if !BUILDTASK #if !BUILDTASK
using Avalonia.Animation.Animators; using Avalonia.Animation.Animators;
#endif #endif
@ -244,6 +245,22 @@ namespace Avalonia
/// <returns>The transformed point.</returns> /// <returns>The transformed point.</returns>
public Point Transform(Matrix transform) public Point Transform(Matrix transform)
{ {
if (transform.ContainsPerspective())
{
var m44 = new Matrix4x4(
(float)transform.M11, (float)transform.M12, (float)transform.M13, 0,
(float)transform.M21, (float)transform.M22, (float)transform.M23, 0,
(float)transform.M31, (float)transform.M32, (float)transform.M33, 0,
0, 0, 0, 1
);
var vector = new Vector3((float)X, (float)Y, 1);
var transformedVector = Vector3.Transform(vector, m44);
var z = 1 / transformedVector.Z;
return new Point(transformedVector.X * z, transformedVector.Y * z);
}
var x = X; var x = X;
var y = Y; var y = Y;
var xadd = y * transform.M21 + transform.M31; var xadd = y * transform.M21 + transform.M31;

Loading…
Cancel
Save