NarrowPhaseQuery.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. #include <Jolt/Physics/Body/BodyFilter.h>
  5. #include <Jolt/Physics/Body/BodyLock.h>
  6. #include <Jolt/Physics/Body/BodyLockInterface.h>
  7. #include <Jolt/Physics/Collision/ShapeFilter.h>
  8. #include <Jolt/Physics/Collision/BroadPhase/BroadPhase.h>
  9. #include <Jolt/Physics/Collision/BackFaceMode.h>
  10. JPH_NAMESPACE_BEGIN
  11. class Shape;
  12. class CollideShapeSettings;
  13. class RayCastResult;
  14. /// Class that provides an interface for doing precise collision detection against the broad and then the narrow phase
  15. class NarrowPhaseQuery : public NonCopyable
  16. {
  17. public:
  18. /// Initialize the interface (should only be called by PhysicsSystem)
  19. void Init(BodyLockInterface &inBodyLockInterface, BroadPhase &inBroadPhase) { mBodyLockInterface = &inBodyLockInterface; mBroadPhase = &inBroadPhase; }
  20. /// Cast a ray and find the closest hit. Returns true if it finds a hit. Hits further than ioHit.mFraction will not be considered and in this case ioHit will remain unmodified (and the function will return false).
  21. /// Convex objects will be treated as solid (meaning if the ray starts inside, you'll get a hit fraction of 0) and back face hits against triangles are returned.
  22. /// If you want the surface normal of the hit use Body::GetWorldSpaceSurfaceNormal(ioHit.mSubShapeID2, inRay.GetPointOnRay(ioHit.mFraction)) on body with ID ioHit.mBodyID.
  23. bool CastRay(const RayCast &inRay, RayCastResult &ioHit, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter = { }, const ObjectLayerFilter &inObjectLayerFilter = { }, const BodyFilter &inBodyFilter = { }) const;
  24. /// Cast a ray, allows collecting multiple hits. Note that this version is more flexible but also slightly slower than the CastRay function that returns only a single hit.
  25. /// If you want the surface normal of the hit use Body::GetWorldSpaceSurfaceNormal(collected sub shape ID, inRay.GetPointOnRay(collected fraction)) on body with collected body ID.
  26. void CastRay(const RayCast &inRay, const RayCastSettings &inRayCastSettings, CastRayCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter = { }, const ObjectLayerFilter &inObjectLayerFilter = { }, const BodyFilter &inBodyFilter = { }, const ShapeFilter &inShapeFilter = { }) const;
  27. /// Check if inPoint is inside any shapes. For this tests all shapes are treated as if they were solid.
  28. /// For a mesh shape, this test will only provide sensible information if the mesh is a closed manifold.
  29. /// For each shape that collides, ioCollector will receive a hit
  30. void CollidePoint(Vec3Arg inPoint, CollidePointCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter = { }, const ObjectLayerFilter &inObjectLayerFilter = { }, const BodyFilter &inBodyFilter = { }, const ShapeFilter &inShapeFilter = { }) const;
  31. /// Collide a shape with the system
  32. void CollideShape(const Shape *inShape, Vec3Arg inShapeScale, Mat44Arg inCenterOfMassTransform, const CollideShapeSettings &inCollideShapeSettings, CollideShapeCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter = { }, const ObjectLayerFilter &inObjectLayerFilter = { }, const BodyFilter &inBodyFilter = { }, const ShapeFilter &inShapeFilter = { }) const;
  33. /// Cast a shape and report any hits to ioCollector
  34. void CastShape(const ShapeCast &inShapeCast, const ShapeCastSettings &inShapeCastSettings, CastShapeCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter = { }, const ObjectLayerFilter &inObjectLayerFilter = { }, const BodyFilter &inBodyFilter = { }, const ShapeFilter &inShapeFilter = { }) const;
  35. /// Collect all leaf transformed shapes that fall inside world space box inBox
  36. void CollectTransformedShapes(const AABox &inBox, TransformedShapeCollector &ioCollector, const BroadPhaseLayerFilter &inBroadPhaseLayerFilter = { }, const ObjectLayerFilter &inObjectLayerFilter = { }, const BodyFilter &inBodyFilter = { }, const ShapeFilter &inShapeFilter = { }) const;
  37. private:
  38. BodyLockInterface * mBodyLockInterface = nullptr;
  39. BroadPhase * mBroadPhase = nullptr;
  40. };
  41. JPH_NAMESPACE_END