diff options
author | Rémi Verschelde <remi@verschelde.fr> | 2022-08-05 02:50:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-05 02:50:32 +0200 |
commit | e36f324bdf0ab805e747e281b2d9dfe2487e553f (patch) | |
tree | b189b245aaab4986993a5ed6404f2b8a8f3636d0 | |
parent | b1580ea334595fc0bd2b1c2d048e43ca1c5e7cbc (diff) | |
parent | 74f41f8560b12e373c33de4d1be2d1382fdced7e (diff) |
Merge pull request #63922 from rburing/fix_softbody_normals
-rw-r--r-- | scene/3d/soft_dynamic_body_3d.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/scene/3d/soft_dynamic_body_3d.cpp b/scene/3d/soft_dynamic_body_3d.cpp index d68e7fd527..15f050defb 100644 --- a/scene/3d/soft_dynamic_body_3d.cpp +++ b/scene/3d/soft_dynamic_body_3d.cpp @@ -83,7 +83,16 @@ void SoftDynamicBodyRenderingServerHandler::set_vertex(int p_vertex_id, const vo } void SoftDynamicBodyRenderingServerHandler::set_normal(int p_vertex_id, const void *p_vector3) { - memcpy(&write_buffer[p_vertex_id * stride + offset_normal], p_vector3, sizeof(float) * 3); + // Store normal vector in A2B10G10R10 format. + Vector3 n; + memcpy(&n, p_vector3, sizeof(Vector3)); + n *= Vector3(0.5, 0.5, 0.5); + n += Vector3(0.5, 0.5, 0.5); + uint32_t value = 0; + value |= CLAMP(int(n.x * 1023.0), 0, 1023); + value |= CLAMP(int(n.y * 1023.0), 0, 1023) << 10; + value |= CLAMP(int(n.z * 1023.0), 0, 1023) << 20; + memcpy(&write_buffer[p_vertex_id * stride + offset_normal], &value, sizeof(uint32_t)); } void SoftDynamicBodyRenderingServerHandler::set_aabb(const AABB &p_aabb) { |