From 351d11449b8d0fba2940a0a2c237312527eac50d Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Thu, 11 Mar 2021 23:27:42 +0000 Subject: [PATCH] Avoid heightfield conversion in newer Bullet Takes advantage of the direct `float` support implemented in https://github.com/bulletphysics/bullet3/pull/3293 --- apps/openmw/mwphysics/heightfield.cpp | 14 ++++++++++++++ apps/openmw/mwphysics/heightfield.hpp | 2 ++ 2 files changed, 16 insertions(+) diff --git a/apps/openmw/mwphysics/heightfield.cpp b/apps/openmw/mwphysics/heightfield.cpp index 34127fe3a..e210bc390 100644 --- a/apps/openmw/mwphysics/heightfield.cpp +++ b/apps/openmw/mwphysics/heightfield.cpp @@ -10,6 +10,12 @@ #include +#if BT_BULLET_VERSION < 310 +// Older Bullet versions only support `btScalar` heightfields. +// Our heightfield data is `float`. +// +// These functions handle conversion from `float` to `double` when +// `btScalar` is `double` (`BT_USE_DOUBLE_PRECISION`). namespace { template @@ -40,14 +46,18 @@ namespace return btScalarHeights.data(); } } +#endif namespace MWPhysics { HeightField::HeightField(const float* heights, int x, int y, float triSize, float sqrtVerts, float minH, float maxH, const osg::Object* holdObject, PhysicsTaskScheduler* scheduler) : mHoldObject(holdObject) +#if BT_BULLET_VERSION < 310 , mHeights(makeHeights(heights, sqrtVerts)) +#endif , mTaskScheduler(scheduler) { +#if BT_BULLET_VERSION < 310 mShape = std::make_unique( sqrtVerts, sqrtVerts, getHeights(heights, mHeights), @@ -55,6 +65,10 @@ namespace MWPhysics minH, maxH, 2, PHY_FLOAT, false ); +#else + mShape = std::make_unique( + sqrtVerts, sqrtVerts, heights, minH, maxH, 2, false); +#endif mShape->setUseDiamondSubdivision(true); mShape->setLocalScaling(btVector3(triSize, triSize, 1)); diff --git a/apps/openmw/mwphysics/heightfield.hpp b/apps/openmw/mwphysics/heightfield.hpp index c76f8b943..93b2733f3 100644 --- a/apps/openmw/mwphysics/heightfield.hpp +++ b/apps/openmw/mwphysics/heightfield.hpp @@ -34,7 +34,9 @@ namespace MWPhysics std::unique_ptr mShape; std::unique_ptr mCollisionObject; osg::ref_ptr mHoldObject; +#if BT_BULLET_VERSION < 310 std::vector mHeights; +#endif PhysicsTaskScheduler* mTaskScheduler;