summaryrefslogtreecommitdiff
path: root/core/math
diff options
context:
space:
mode:
authorOmar El Sheikh <techmanozmar@gmail.com>2022-02-22 18:10:09 -0500
committerOmar El Sheikh <techmanozmar@gmail.com>2022-08-13 08:09:32 -0700
commit78881b3cc3a389c21c1417ad05840e80a234e2d7 (patch)
treee5b11b00aee94987c1ce7415bafeff01d33b2a25 /core/math
parentf2a61684143af02a8cbe7002645af817607f9bd6 (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.cpp16
-rw-r--r--core/math/vector3.h2
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;