From 0e00d3a6fa246bfa508c2861851c52a43591a8c5 Mon Sep 17 00:00:00 2001 From: David Steele Date: Thu, 7 Sep 2023 14:47:09 +0100 Subject: [PATCH] Changing hit test to pass in optional filter Change-Id: I6b908dda86596a70a001d1a2be307ce9c5f1b231 --- automated-tests/src/dali-physics2d/utc-Dali-PhysicsAdaptor.cpp | 6 +++++- automated-tests/src/dali-physics3d/utc-Dali-PhysicsAdaptor.cpp | 9 +++++---- dali-physics/internal/bullet-impl/bullet-physics-world-impl.cpp | 2 +- dali-physics/internal/bullet-impl/bullet-physics-world-impl.h | 3 ++- .../internal/chipmunk-impl/chipmunk-physics-world-impl.cpp | 8 +++----- .../internal/chipmunk-impl/chipmunk-physics-world-impl.h | 2 +- dali-physics/internal/physics-world-impl.h | 3 ++- dali-physics/public-api/physics-adaptor.h | 6 ++++-- dali-physics/public-api/scoped-physics-accessor.cpp | 4 ++-- 9 files changed, 25 insertions(+), 18 deletions(-) diff --git a/automated-tests/src/dali-physics2d/utc-Dali-PhysicsAdaptor.cpp b/automated-tests/src/dali-physics2d/utc-Dali-PhysicsAdaptor.cpp index 92e5d22..b2d033a 100644 --- a/automated-tests/src/dali-physics2d/utc-Dali-PhysicsAdaptor.cpp +++ b/automated-tests/src/dali-physics2d/utc-Dali-PhysicsAdaptor.cpp @@ -891,7 +891,11 @@ int UtcDaliPhysics2DAdaptorHitTestP(void) auto accessor = adaptor.GetPhysicsAccessor(); Vector3 localPivot; float distanceFromCamera; - auto body = accessor->HitTest(from, from, localPivot, distanceFromCamera); + + cpShapeFilter GRAB_FILTER = {CP_NO_GROUP, 1u << 31, 1u << 31}; + Dali::Any nativeFilter{GRAB_FILTER}; + + auto body = accessor->HitTest(from, from, nativeFilter, localPivot, distanceFromCamera); DALI_TEST_CHECK(!body.Empty()); } diff --git a/automated-tests/src/dali-physics3d/utc-Dali-PhysicsAdaptor.cpp b/automated-tests/src/dali-physics3d/utc-Dali-PhysicsAdaptor.cpp index b09c8fc..1315a55 100644 --- a/automated-tests/src/dali-physics3d/utc-Dali-PhysicsAdaptor.cpp +++ b/automated-tests/src/dali-physics3d/utc-Dali-PhysicsAdaptor.cpp @@ -947,10 +947,11 @@ int UtcDaliPhysics3DAdaptorHitTestP(void) adaptor.BuildPickingRay(origin, direction, from, to); // Hit test centre of screen { - auto accessor = adaptor.GetPhysicsAccessor(); - Vector3 localPivot; - float distanceFromCamera; - auto body = accessor->HitTest(from, to, localPivot, distanceFromCamera); + auto accessor = adaptor.GetPhysicsAccessor(); + Vector3 localPivot; + float distanceFromCamera; + Dali::Any nullFilter; + auto body = accessor->HitTest(from, to, nullFilter, localPivot, distanceFromCamera); DALI_TEST_CHECK(!body.Empty()); } diff --git a/dali-physics/internal/bullet-impl/bullet-physics-world-impl.cpp b/dali-physics/internal/bullet-impl/bullet-physics-world-impl.cpp index 79d97de..920d015 100644 --- a/dali-physics/internal/bullet-impl/bullet-physics-world-impl.cpp +++ b/dali-physics/internal/bullet-impl/bullet-physics-world-impl.cpp @@ -114,7 +114,7 @@ inline btVector3 ConvertVector(Dali::Vector3 vector) return btVector3(vector.x, vector.y, vector.z); } -Dali::Any BulletPhysicsWorld::HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Vector3& localPivot, float& distanceFromCamera) +Dali::Any BulletPhysicsWorld::HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Any nativeFilter, Dali::Vector3& localPivot, float& distanceFromCamera) { btRigidBody* hitBody{nullptr}; diff --git a/dali-physics/internal/bullet-impl/bullet-physics-world-impl.h b/dali-physics/internal/bullet-impl/bullet-physics-world-impl.h index 2a5ff55..5f9f193 100644 --- a/dali-physics/internal/bullet-impl/bullet-physics-world-impl.h +++ b/dali-physics/internal/bullet-impl/bullet-physics-world-impl.h @@ -48,11 +48,12 @@ public: * * @param[in] rayFromWorld The origin in physics world space * @param[in] rayToWorld A point along the direction on the far side of the physics world + * @param[in] nativeFilter A native shape/body filter * @param[out] localPivot The hit point local to the body * @param[out] distanceFromCamera The distance of the pick point from the camera * @return Empty value if no dynamic body found, otherwise a valid ptr to the hit body. */ - Dali::Any HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Vector3& localPivot, float& distanceFromCamera) override; + Dali::Any HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Any nativeFilter, Dali::Vector3& localPivot, float& distanceFromCamera) override; void Integrate(float timestep) override; diff --git a/dali-physics/internal/chipmunk-impl/chipmunk-physics-world-impl.cpp b/dali-physics/internal/chipmunk-impl/chipmunk-physics-world-impl.cpp index 6157780..c909474 100644 --- a/dali-physics/internal/chipmunk-impl/chipmunk-physics-world-impl.cpp +++ b/dali-physics/internal/chipmunk-impl/chipmunk-physics-world-impl.cpp @@ -26,9 +26,6 @@ namespace { -#define GRABBABLE_MASK_BIT (1u << 31) -cpShapeFilter GRAB_FILTER = {CP_NO_GROUP, GRABBABLE_MASK_BIT, GRABBABLE_MASK_BIT}; - inline cpVect ConvertVector(Dali::Vector3 vector) { return cpv(vector.x, vector.y); @@ -117,12 +114,13 @@ void ChipmunkPhysicsWorld::Integrate(float timestep) } } -Dali::Any ChipmunkPhysicsWorld::HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Vector3& localPivot, float& distanceFromCamera) +Dali::Any ChipmunkPhysicsWorld::HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Any nativeFilter, Dali::Vector3& localPivot, float& distanceFromCamera) { cpVect spacePosition = cpv(rayFromWorld.x, rayFromWorld.y); cpFloat radius = 5.0f; cpPointQueryInfo info = {0}; - cpShape* shape = cpSpacePointQueryNearest(mSpace, spacePosition, radius, GRAB_FILTER, &info); + cpShapeFilter filter = nativeFilter.Get(); + cpShape* shape = cpSpacePointQueryNearest(mSpace, spacePosition, radius, filter, &info); cpBody* hitBody{nullptr}; if(shape && cpBodyGetMass(cpShapeGetBody(shape)) < INFINITY) diff --git a/dali-physics/internal/chipmunk-impl/chipmunk-physics-world-impl.h b/dali-physics/internal/chipmunk-impl/chipmunk-physics-world-impl.h index fbb2e03..39918d2 100644 --- a/dali-physics/internal/chipmunk-impl/chipmunk-physics-world-impl.h +++ b/dali-physics/internal/chipmunk-impl/chipmunk-physics-world-impl.h @@ -37,7 +37,7 @@ public: void Integrate(float timestep) override; - Dali::Any HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Vector3& localPivot, float& distanceFromCamera) override; + Dali::Any HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Any nativeFilter, Dali::Vector3& localPivot, float& distanceFromCamera) override; private: cpSpace* mSpace{nullptr}; diff --git a/dali-physics/internal/physics-world-impl.h b/dali-physics/internal/physics-world-impl.h index d6e1097..b1c9460 100644 --- a/dali-physics/internal/physics-world-impl.h +++ b/dali-physics/internal/physics-world-impl.h @@ -111,11 +111,12 @@ public: * * @param[in] rayFromWorld The origin in physics world space * @param[in] rayToWorld A point along the direction on the far side of the physics world + * @param[in] nativeFilter a native body / shape filter * @param[out] localPivot The hit point local to the body * @param[out] distanceFromCamera The distance of the pick point from the camera * @return Empty value if no dynamic body found, otherwise a valid ptr to the hit body. */ - virtual Dali::Any HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Vector3& localPivot, float& distanceFromCamera) = 0; + virtual Dali::Any HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Any nativeFilter, Dali::Vector3& localPivot, float& distanceFromCamera) = 0; /** * @copydoc Dali::Toolkit::Physics::PhysicsAdaptor::SetIntegrationState diff --git a/dali-physics/public-api/physics-adaptor.h b/dali-physics/public-api/physics-adaptor.h index 41c7da7..0bdd0c0 100644 --- a/dali-physics/public-api/physics-adaptor.h +++ b/dali-physics/public-api/physics-adaptor.h @@ -98,11 +98,12 @@ public: * @SINCE_2_2.43 * @param[in] rayFromWorld The origin in physics world space * @param[in] rayToWorld A point along the direction on the far side of the physics world + * @param[in] nativeFilter a native body / shape filter * @param[out] localPivot The hit point local to the body * @param[out] distanceFromCamera The distance of the pick point from the camera * @return Empty value if no dynamic body found, otherwise a valid ptr to the hit body. */ - Dali::Any HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Vector3& localPivot, float& distanceFromCamera); + Dali::Any HitTest(Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Any nativeFilter, Dali::Vector3& localPivot, float& distanceFromCamera); // Not copyable ScopedPhysicsAccessor(ScopedPhysicsAccessor&) = delete; @@ -418,7 +419,8 @@ public: * btVector3 rayFromWorld, rayToWorld; * physicsAdaptor.BuildPickingRay(origin, direction, rayFromWorld, rayToWorld); * auto scopedAccessor = physicsAdaptor.GetPhysicsAccessor(); - * body = scopedAccessor->Get().HitTest(rayFromWorld, rayToWorld, ..); + * Dali::Any nativeFilter; + * body = scopedAccessor->Get().HitTest(rayFromWorld, rayToWorld, nativeFilter, ..); * } */ void BuildPickingRay(Dali::Vector3 origin, Dali::Vector3 direction, Dali::Vector3& rayFromWorld, Dali::Vector3& rayToWorld); diff --git a/dali-physics/public-api/scoped-physics-accessor.cpp b/dali-physics/public-api/scoped-physics-accessor.cpp index 1f4b6e8..1fad04c 100644 --- a/dali-physics/public-api/scoped-physics-accessor.cpp +++ b/dali-physics/public-api/scoped-physics-accessor.cpp @@ -52,9 +52,9 @@ Dali::Any PhysicsAdaptor::ScopedPhysicsAccessor::GetNative() } Dali::Any PhysicsAdaptor::ScopedPhysicsAccessor::HitTest( - Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Vector3& localPivot, float& distanceFromCamera) + Dali::Vector3 rayFromWorld, Dali::Vector3 rayToWorld, Dali::Any nativeFilter, Dali::Vector3& localPivot, float& distanceFromCamera) { - return mImpl->mPhysicsWorld.HitTest(rayFromWorld, rayToWorld, localPivot, distanceFromCamera); + return mImpl->mPhysicsWorld.HitTest(rayFromWorld, rayToWorld, nativeFilter, localPivot, distanceFromCamera); } } // namespace Dali::Toolkit::Physics -- 2.7.4