Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Collision/BroadPhase/BroadPhaseLayerInterfaceMask.h
9918 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2023 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Physics/Collision/BroadPhase/BroadPhaseLayer.h>7#include <Jolt/Physics/Collision/ObjectLayerPairFilterMask.h>89JPH_NAMESPACE_BEGIN1011/// BroadPhaseLayerInterface implementation.12/// This defines a mapping between object and broadphase layers.13/// This implementation works together with ObjectLayerPairFilterMask and ObjectVsBroadPhaseLayerFilterMask.14/// A broadphase layer is suitable for an object if its group & inGroupsToInclude is not zero and its group & inGroupsToExclude is zero.15/// The broadphase layers are iterated from lowest to highest value and the first one that matches is taken. If none match then it takes the last layer.16class BroadPhaseLayerInterfaceMask : public BroadPhaseLayerInterface17{18public:19JPH_OVERRIDE_NEW_DELETE2021explicit BroadPhaseLayerInterfaceMask(uint inNumBroadPhaseLayers)22{23JPH_ASSERT(inNumBroadPhaseLayers > 0);24mMapping.resize(inNumBroadPhaseLayers);2526#if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)27mBroadPhaseLayerNames.resize(inNumBroadPhaseLayers, "Undefined");28#endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED29}3031// Configures a broadphase layer.32void ConfigureLayer(BroadPhaseLayer inBroadPhaseLayer, uint32 inGroupsToInclude, uint32 inGroupsToExclude)33{34JPH_ASSERT((BroadPhaseLayer::Type)inBroadPhaseLayer < (uint)mMapping.size());35Mapping &m = mMapping[(BroadPhaseLayer::Type)inBroadPhaseLayer];36m.mGroupsToInclude = inGroupsToInclude;37m.mGroupsToExclude = inGroupsToExclude;38}3940virtual uint GetNumBroadPhaseLayers() const override41{42return (uint)mMapping.size();43}4445virtual BroadPhaseLayer GetBroadPhaseLayer(ObjectLayer inLayer) const override46{47// Try to find the first broadphase layer that matches48uint32 group = ObjectLayerPairFilterMask::sGetGroup(inLayer);49for (const Mapping &m : mMapping)50if ((group & m.mGroupsToInclude) != 0 && (group & m.mGroupsToExclude) == 0)51return BroadPhaseLayer(BroadPhaseLayer::Type(&m - mMapping.data()));5253// Fall back to the last broadphase layer54return BroadPhaseLayer(BroadPhaseLayer::Type(mMapping.size() - 1));55}5657/// Returns true if an object layer should collide with a broadphase layer, this function is being called from ObjectVsBroadPhaseLayerFilterMask58inline bool ShouldCollide(ObjectLayer inLayer1, BroadPhaseLayer inLayer2) const59{60uint32 mask = ObjectLayerPairFilterMask::sGetMask(inLayer1);61const Mapping &m = mMapping[(BroadPhaseLayer::Type)inLayer2];62return &m == &mMapping.back() // Last layer may collide with anything63|| (m.mGroupsToInclude & mask) != 0; // Mask allows it to collide with objects that could reside in this layer64}6566#if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)67void SetBroadPhaseLayerName(BroadPhaseLayer inLayer, const char *inName)68{69mBroadPhaseLayerNames[(BroadPhaseLayer::Type)inLayer] = inName;70}7172virtual const char * GetBroadPhaseLayerName(BroadPhaseLayer inLayer) const override73{74return mBroadPhaseLayerNames[(BroadPhaseLayer::Type)inLayer];75}76#endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED7778private:79struct Mapping80{81uint32 mGroupsToInclude = 0;82uint32 mGroupsToExclude = ~uint32(0);83};84Array<Mapping> mMapping;8586#if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)87Array<const char *> mBroadPhaseLayerNames;88#endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED89};9091JPH_NAMESPACE_END929394