Merge pull request #79082 from geowarin/master
Add missing useModelFront parameter to GodotSharp Basis and Transform
This commit is contained in:
commit
9c74f3408b
3 changed files with 71 additions and 8 deletions
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace Godot
|
namespace Godot
|
||||||
{
|
{
|
||||||
|
@ -623,21 +624,31 @@ namespace Godot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="target">The position to look at.</param>
|
/// <param name="target">The position to look at.</param>
|
||||||
/// <param name="up">The relative up direction.</param>
|
/// <param name="up">The relative up direction.</param>
|
||||||
|
/// <param name="useModelFront">
|
||||||
|
/// If true, then the model is oriented in reverse,
|
||||||
|
/// towards the model front axis (+Z, Vector3.ModelFront),
|
||||||
|
/// which is more useful for orienting 3D models.
|
||||||
|
/// </param>
|
||||||
/// <returns>The resulting basis matrix.</returns>
|
/// <returns>The resulting basis matrix.</returns>
|
||||||
public static Basis LookingAt(Vector3 target, Vector3 up)
|
public static Basis LookingAt(Vector3 target, Vector3? up = null, bool useModelFront = false)
|
||||||
{
|
{
|
||||||
|
up ??= Vector3.Up;
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
if (target.IsZeroApprox())
|
if (target.IsZeroApprox())
|
||||||
{
|
{
|
||||||
throw new ArgumentException("The vector can't be zero.", nameof(target));
|
throw new ArgumentException("The vector can't be zero.", nameof(target));
|
||||||
}
|
}
|
||||||
if (up.IsZeroApprox())
|
if (up.Value.IsZeroApprox())
|
||||||
{
|
{
|
||||||
throw new ArgumentException("The vector can't be zero.", nameof(up));
|
throw new ArgumentException("The vector can't be zero.", nameof(up));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
Vector3 column2 = -target.Normalized();
|
Vector3 column2 = target.Normalized();
|
||||||
Vector3 column0 = up.Cross(column2);
|
if (!useModelFront)
|
||||||
|
{
|
||||||
|
column2 = -column2;
|
||||||
|
}
|
||||||
|
Vector3 column0 = up.Value.Cross(column2);
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
if (column0.IsZeroApprox())
|
if (column0.IsZeroApprox())
|
||||||
{
|
{
|
||||||
|
@ -649,6 +660,13 @@ namespace Godot
|
||||||
return new Basis(column0, column1, column2);
|
return new Basis(column0, column1, column2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc cref="LookingAt(Vector3, Nullable{Vector3}, bool)"/>
|
||||||
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||||
|
public static Basis LookingAt(Vector3 target, Vector3 up)
|
||||||
|
{
|
||||||
|
return LookingAt(target, up, false);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the orthonormalized version of the basis matrix (useful to
|
/// Returns the orthonormalized version of the basis matrix (useful to
|
||||||
/// call occasionally to avoid rounding errors for orthogonal matrices).
|
/// call occasionally to avoid rounding errors for orthogonal matrices).
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace Godot
|
namespace Godot
|
||||||
{
|
{
|
||||||
|
@ -175,14 +176,26 @@ namespace Godot
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="target">The object to look at.</param>
|
/// <param name="target">The object to look at.</param>
|
||||||
/// <param name="up">The relative up direction.</param>
|
/// <param name="up">The relative up direction.</param>
|
||||||
|
/// <param name="useModelFront">
|
||||||
|
/// If true, then the model is oriented in reverse,
|
||||||
|
/// towards the model front axis (+Z, Vector3.ModelFront),
|
||||||
|
/// which is more useful for orienting 3D models.
|
||||||
|
/// </param>
|
||||||
/// <returns>The resulting transform.</returns>
|
/// <returns>The resulting transform.</returns>
|
||||||
public readonly Transform3D LookingAt(Vector3 target, Vector3 up)
|
public readonly Transform3D LookingAt(Vector3 target, Vector3? up = null, bool useModelFront = false)
|
||||||
{
|
{
|
||||||
Transform3D t = this;
|
Transform3D t = this;
|
||||||
t.SetLookAt(Origin, target, up);
|
t.SetLookAt(Origin, target, up ?? Vector3.Up, useModelFront);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc cref="LookingAt(Vector3, Nullable{Vector3}, bool)"/>
|
||||||
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||||
|
public readonly Transform3D LookingAt(Vector3 target, Vector3 up)
|
||||||
|
{
|
||||||
|
return LookingAt(target, up, false);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the transform with the basis orthogonal (90 degrees),
|
/// Returns the transform with the basis orthogonal (90 degrees),
|
||||||
/// and normalized axis vectors (scale of 1 or -1).
|
/// and normalized axis vectors (scale of 1 or -1).
|
||||||
|
@ -247,9 +260,9 @@ namespace Godot
|
||||||
return new Transform3D(Basis * tmpBasis, Origin);
|
return new Transform3D(Basis * tmpBasis, Origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetLookAt(Vector3 eye, Vector3 target, Vector3 up)
|
private void SetLookAt(Vector3 eye, Vector3 target, Vector3 up, bool useModelFront = false)
|
||||||
{
|
{
|
||||||
Basis = Basis.LookingAt(target - eye, up);
|
Basis = Basis.LookingAt(target - eye, up, useModelFront);
|
||||||
Origin = eye;
|
Origin = eye;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -660,6 +660,13 @@ namespace Godot
|
||||||
private static readonly Vector3 _forward = new Vector3(0, 0, -1);
|
private static readonly Vector3 _forward = new Vector3(0, 0, -1);
|
||||||
private static readonly Vector3 _back = new Vector3(0, 0, 1);
|
private static readonly Vector3 _back = new Vector3(0, 0, 1);
|
||||||
|
|
||||||
|
private static readonly Vector3 _modelLeft = new Vector3(1, 0, 0);
|
||||||
|
private static readonly Vector3 _modelRight = new Vector3(-1, 0, 0);
|
||||||
|
private static readonly Vector3 _modelTop = new Vector3(0, 1, 0);
|
||||||
|
private static readonly Vector3 _modelBottom = new Vector3(0, -1, 0);
|
||||||
|
private static readonly Vector3 _modelFront = new Vector3(0, 0, 1);
|
||||||
|
private static readonly Vector3 _modelRear = new Vector3(0, 0, -1);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Zero vector, a vector with all components set to <c>0</c>.
|
/// Zero vector, a vector with all components set to <c>0</c>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -711,6 +718,31 @@ namespace Godot
|
||||||
/// <value>Equivalent to <c>new Vector3(0, 0, 1)</c>.</value>
|
/// <value>Equivalent to <c>new Vector3(0, 0, 1)</c>.</value>
|
||||||
public static Vector3 Back { get { return _back; } }
|
public static Vector3 Back { get { return _back; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unit vector pointing towards the left side of imported 3D assets.
|
||||||
|
/// </summary>
|
||||||
|
public static Vector3 ModelLeft { get { return _modelLeft; } }
|
||||||
|
/// <summary>
|
||||||
|
/// Unit vector pointing towards the right side of imported 3D assets.
|
||||||
|
/// </summary>
|
||||||
|
public static Vector3 ModelRight { get { return _modelRight; } }
|
||||||
|
/// <summary>
|
||||||
|
/// Unit vector pointing towards the top side (up) of imported 3D assets.
|
||||||
|
/// </summary>
|
||||||
|
public static Vector3 ModelTop { get { return _modelTop; } }
|
||||||
|
/// <summary>
|
||||||
|
/// Unit vector pointing towards the bottom side (down) of imported 3D assets.
|
||||||
|
/// </summary>
|
||||||
|
public static Vector3 ModelBottom { get { return _modelBottom; } }
|
||||||
|
/// <summary>
|
||||||
|
/// Unit vector pointing towards the front side (facing forward) of imported 3D assets.
|
||||||
|
/// </summary>
|
||||||
|
public static Vector3 ModelFront { get { return _modelFront; } }
|
||||||
|
/// <summary>
|
||||||
|
/// Unit vector pointing towards the rear side (back) of imported 3D assets.
|
||||||
|
/// </summary>
|
||||||
|
public static Vector3 ModelRear { get { return _modelRear; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructs a new <see cref="Vector3"/> with the given components.
|
/// Constructs a new <see cref="Vector3"/> with the given components.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in a new issue