123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
- // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
- // SPDX-License-Identifier: MIT
- #pragma once
- #include <Jolt/Physics/Collision/ObjectLayer.h>
- #include <Jolt/Physics/Collision/BroadPhase/BroadPhaseLayer.h>
- /// Layer that objects can be in, determines which other objects it can collide with
- namespace Layers
- {
- static constexpr ObjectLayer NON_MOVING = 0;
- static constexpr ObjectLayer MOVING = 1;
- static constexpr ObjectLayer NUM_LAYERS = 2;
- };
- /// Class that determines if two object layers can collide
- class ObjectLayerPairFilterImpl : public ObjectLayerPairFilter
- {
- public:
- virtual bool ShouldCollide(ObjectLayer inObject1, ObjectLayer inObject2) const override
- {
- switch (inObject1)
- {
- case Layers::NON_MOVING:
- return inObject2 == Layers::MOVING; // Non moving only collides with moving
- case Layers::MOVING:
- return true; // Moving collides with everything
- default:
- JPH_ASSERT(false);
- return false;
- }
- }
- };
- /// Broadphase layers
- namespace BroadPhaseLayers
- {
- static constexpr BroadPhaseLayer NON_MOVING(0);
- static constexpr BroadPhaseLayer MOVING(1);
- static constexpr uint NUM_LAYERS(2);
- };
- /// BroadPhaseLayerInterface implementation
- class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface
- {
- public:
- BPLayerInterfaceImpl()
- {
- // Create a mapping table from object to broad phase layer
- mObjectToBroadPhase[Layers::NON_MOVING] = BroadPhaseLayers::NON_MOVING;
- mObjectToBroadPhase[Layers::MOVING] = BroadPhaseLayers::MOVING;
- }
- virtual uint GetNumBroadPhaseLayers() const override
- {
- return BroadPhaseLayers::NUM_LAYERS;
- }
- virtual BroadPhaseLayer GetBroadPhaseLayer(ObjectLayer inLayer) const override
- {
- JPH_ASSERT(inLayer < Layers::NUM_LAYERS);
- return mObjectToBroadPhase[inLayer];
- }
- #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
- virtual const char * GetBroadPhaseLayerName(BroadPhaseLayer inLayer) const override
- {
- switch ((BroadPhaseLayer::Type)inLayer)
- {
- case (BroadPhaseLayer::Type)BroadPhaseLayers::NON_MOVING: return "NON_MOVING";
- case (BroadPhaseLayer::Type)BroadPhaseLayers::MOVING: return "MOVING";
- default: JPH_ASSERT(false); return "INVALID";
- }
- }
- #endif // JPH_EXTERNAL_PROFILE || JPH_PROFILE_ENABLED
- private:
- BroadPhaseLayer mObjectToBroadPhase[Layers::NUM_LAYERS];
- };
- /// Class that determines if an object layer can collide with a broadphase layer
- class ObjectVsBroadPhaseLayerFilterImpl : public ObjectVsBroadPhaseLayerFilter
- {
- public:
- virtual bool ShouldCollide(ObjectLayer inLayer1, BroadPhaseLayer inLayer2) const override
- {
- switch (inLayer1)
- {
- case Layers::NON_MOVING:
- return inLayer2 == BroadPhaseLayers::MOVING;
- case Layers::MOVING:
- return true;
- default:
- JPH_ASSERT(false);
- return false;
- }
- }
- };
|