From dc9bd881d01b32f0e3fef287e0025681a50dcbc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Thu, 11 Dec 2025 08:02:27 +0100 Subject: [PATCH] local water body buoyancy support (#1357) --- Content/models/buoyancy_test.wiscene | Bin 0 -> 49776 bytes WickedEngine/wiPhysics_Jolt.cpp | 95 +++++++++++++++++++++++---- 2 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 Content/models/buoyancy_test.wiscene diff --git a/Content/models/buoyancy_test.wiscene b/Content/models/buoyancy_test.wiscene new file mode 100644 index 0000000000000000000000000000000000000000..a6ce01a5a89e009e4670a54b065c2c44f52b56b4 GIT binary patch literal 49776 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 pos.y) + { + body_interface.ApplyBuoyancyImpulse( + physicsobject.bodyID, + cast(result.position), + cast(result.normal), + physicscomponent.buoyancy, + 0.8f, + 0.6f, + Vec3::sZero(), + physics_scene.physics_system.GetGravity(), + scene.dt + ); + + if (!physicsobject.was_underwater) + { + physicsobject.was_underwater = true; + is_underwater = true; + scene.PutWaterRipple(result.position); + } + } + } + + if (!is_underwater) + { + physicsobject.was_underwater = false; + } } if (physicsobject.teleporting) @@ -2609,16 +2646,18 @@ namespace wi::physics if (humanoid.IsRagdollPhysicsEnabled()) { // Apply effects on dynamics if needed: - if (scene.weather.IsOceanEnabled()) + static const Ragdoll::BODYPART floating_bodyparts[] = { + Ragdoll::BODYPART_PELVIS, + Ragdoll::BODYPART_SPINE, + }; + for (auto& bodypart : floating_bodyparts) { - static const Ragdoll::BODYPART floating_bodyparts[] = { - Ragdoll::BODYPART_PELVIS, - Ragdoll::BODYPART_SPINE, - }; - for (auto& bodypart : floating_bodyparts) + auto& rb = ragdoll.rigidbodies[bodypart]; + const Vec3 com = body_interface.GetCenterOfMassPosition(rb.bodyID); + bool is_underwater = false; + + if (scene.weather.IsOceanEnabled()) { - auto& rb = ragdoll.rigidbodies[bodypart]; - const Vec3 com = body_interface.GetCenterOfMassPosition(rb.bodyID); const Vec3 surface_position = cast(scene.GetOceanPosAt(cast(com))); const float diff = com.GetY() - surface_position.GetY(); if (diff < 0) @@ -2647,9 +2686,43 @@ namespace wi::physics } else { - rb.was_underwater = false; + is_underwater = false; } } + + if (!is_underwater) + { + // Check for water volumes (non-ocean water bodies) + XMFLOAT3 pos = cast(com); + wi::primitive::Ray ray_down(XMFLOAT3(pos.x, pos.y + 10.0f, pos.z), XMFLOAT3(0, -1, 0), 0, 100); + wi::scene::Scene::RayIntersectionResult result = scene.Intersects(ray_down, wi::enums::FILTER_WATER); + if (result.entity != INVALID_ENTITY && result.position.y > pos.y) + { + body_interface.ApplyBuoyancyImpulse( + rb.bodyID, + cast(result.position), + cast(result.normal), + 6.0f, + 0.8f, + 0.6f, + Vec3::sZero(), + physics_scene.physics_system.GetGravity(), + scene.dt + ); + + if (!rb.was_underwater) + { + rb.was_underwater = true; + is_underwater = true; + scene.PutWaterRipple(result.position); + } + } + } + + if (!is_underwater) + { + rb.was_underwater = false; + } } } else