diff options
author | Omar El Sheikh <techmanozmar@gmail.com> | 2022-02-22 18:10:09 -0500 |
---|---|---|
committer | Omar El Sheikh <techmanozmar@gmail.com> | 2022-08-13 08:09:32 -0700 |
commit | 78881b3cc3a389c21c1417ad05840e80a234e2d7 (patch) | |
tree | e5b11b00aee94987c1ce7415bafeff01d33b2a25 /core/math | |
parent | f2a61684143af02a8cbe7002645af817607f9bd6 (diff) |
Octahedral Normal/Tangent Compression
Implementation of Octahedral normal compression into Godot 4.0
Diffstat (limited to 'core/math')
-rw-r--r-- | core/math/vector3.cpp | 16 | ||||
-rw-r--r-- | core/math/vector3.h | 2 |
2 files changed, 18 insertions, 0 deletions
diff --git a/core/math/vector3.cpp b/core/math/vector3.cpp index d71d365053..fdbbb8cb5c 100644 --- a/core/math/vector3.cpp +++ b/core/math/vector3.cpp @@ -117,6 +117,22 @@ Vector3 Vector3::octahedron_decode(const Vector2 &p_oct) { return n.normalized(); } +Vector2 Vector3::octahedron_tangent_encode(const float sign) const { + Vector2 res = this->octahedron_encode(); + res.y = res.y * 0.5f + 0.5f; + res.y = sign >= 0.0f ? res.y : 1 - res.y; + return res; +} + +Vector3 Vector3::octahedron_tangent_decode(const Vector2 &p_oct, float *sign) { + Vector2 oct_compressed = p_oct; + oct_compressed.y = oct_compressed.y * 2 - 1; + *sign = oct_compressed.y >= 0.0f ? 1.0f : -1.0f; + oct_compressed.y = Math::abs(oct_compressed.y); + Vector3 res = Vector3::octahedron_decode(oct_compressed); + return res; +} + Basis Vector3::outer(const Vector3 &p_with) const { Vector3 row0(x * p_with.x, x * p_with.y, x * p_with.z); Vector3 row1(y * p_with.x, y * p_with.y, y * p_with.z); diff --git a/core/math/vector3.h b/core/math/vector3.h index 4ce01da60e..890aeeeed8 100644 --- a/core/math/vector3.h +++ b/core/math/vector3.h @@ -111,6 +111,8 @@ struct _NO_DISCARD_ Vector3 { Vector2 octahedron_encode() const; static Vector3 octahedron_decode(const Vector2 &p_oct); + Vector2 octahedron_tangent_encode(const float sign) const; + static Vector3 octahedron_tangent_decode(const Vector2 &p_oct, float *sign); _FORCE_INLINE_ Vector3 cross(const Vector3 &p_with) const; _FORCE_INLINE_ real_t dot(const Vector3 &p_with) const; |