Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Collision/ObjectLayer.h
9913 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Core/NonCopyable.h>78JPH_NAMESPACE_BEGIN910/// Layer that objects can be in, determines which other objects it can collide with11#ifndef JPH_OBJECT_LAYER_BITS12#define JPH_OBJECT_LAYER_BITS 1613#endif // JPH_OBJECT_LAYER_BITS14#if JPH_OBJECT_LAYER_BITS == 1615using ObjectLayer = uint16;16#elif JPH_OBJECT_LAYER_BITS == 3217using ObjectLayer = uint32;18#else19#error "JPH_OBJECT_LAYER_BITS must be 16 or 32"20#endif2122/// Constant value used to indicate an invalid object layer23static constexpr ObjectLayer cObjectLayerInvalid = ObjectLayer(~ObjectLayer(0U));2425/// Filter class for object layers26class JPH_EXPORT ObjectLayerFilter : public NonCopyable27{28public:29/// Destructor30virtual ~ObjectLayerFilter() = default;3132/// Function to filter out object layers when doing collision query test (return true to allow testing against objects with this layer)33virtual bool ShouldCollide([[maybe_unused]] ObjectLayer inLayer) const34{35return true;36}3738#ifdef JPH_TRACK_BROADPHASE_STATS39/// Get a string that describes this filter for stat tracking purposes40virtual String GetDescription() const41{42return "No Description";43}44#endif // JPH_TRACK_BROADPHASE_STATS45};4647/// Filter class to test if two objects can collide based on their object layer. Used while finding collision pairs.48class JPH_EXPORT ObjectLayerPairFilter : public NonCopyable49{50public:51/// Destructor52virtual ~ObjectLayerPairFilter() = default;5354/// Returns true if two layers can collide55virtual bool ShouldCollide([[maybe_unused]] ObjectLayer inLayer1, [[maybe_unused]] ObjectLayer inLayer2) const56{57return true;58}59};6061/// Default filter class that uses the pair filter in combination with a specified layer to filter layers62class JPH_EXPORT DefaultObjectLayerFilter : public ObjectLayerFilter63{64public:65/// Constructor66DefaultObjectLayerFilter(const ObjectLayerPairFilter &inObjectLayerPairFilter, ObjectLayer inLayer) :67mObjectLayerPairFilter(inObjectLayerPairFilter),68mLayer(inLayer)69{70}7172/// Copy constructor73DefaultObjectLayerFilter(const DefaultObjectLayerFilter &inRHS) :74mObjectLayerPairFilter(inRHS.mObjectLayerPairFilter),75mLayer(inRHS.mLayer)76{77}7879// See ObjectLayerFilter::ShouldCollide80virtual bool ShouldCollide(ObjectLayer inLayer) const override81{82return mObjectLayerPairFilter.ShouldCollide(mLayer, inLayer);83}8485private:86const ObjectLayerPairFilter & mObjectLayerPairFilter;87ObjectLayer mLayer;88};8990/// Allows objects from a specific layer only91class JPH_EXPORT SpecifiedObjectLayerFilter : public ObjectLayerFilter92{93public:94/// Constructor95explicit SpecifiedObjectLayerFilter(ObjectLayer inLayer) :96mLayer(inLayer)97{98}99100// See ObjectLayerFilter::ShouldCollide101virtual bool ShouldCollide(ObjectLayer inLayer) const override102{103return mLayer == inLayer;104}105106private:107ObjectLayer mLayer;108};109110JPH_NAMESPACE_END111112113