Browse Source

Fix Rotate3DTransform for DeferredRenderer.

pull/7402/head
Jan-Peter Zurek 4 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" />
<PackageReference Include="Mono.Cecil" Version="0.11.2" />
<PackageReference Include="Microsoft.Build.Framework" Version="15.1.548" PrivateAssets="All" />
<PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />
</ItemGroup>
</Project>

2
src/Avalonia.Visuals/Matrix.cs

@ -357,7 +357,7 @@ namespace Avalonia
/// <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).
/// </summary>
private bool ContainsPerspective()
public bool ContainsPerspective()
{
// ReSharper disable CompareOfFloatsByEqualityOperator

17
src/Avalonia.Visuals/Point.cs

@ -1,5 +1,6 @@
using System;
using System.Globalization;
using System.Numerics;
#if !BUILDTASK
using Avalonia.Animation.Animators;
#endif
@ -244,6 +245,22 @@ namespace Avalonia
/// <returns>The transformed point.</returns>
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 y = Y;
var xadd = y * transform.M21 + transform.M31;

Loading…
Cancel
Save