File jolt_broad_phase.hpp
File List > atlas > physics > physics_3d > jolt > interface > jolt_broad_phase.hpp
Go to the documentation of this file
#pragma once
#include <physics/jolt-cpp/jolt-imports.hpp>
namespace atlas::physics {
// This should eventually have a pipeline for the user to create masks.
enum class ObjectLayer : std::uint8_t {
NonMoving = 0,
Moving = 1,
NumLayers
};
enum class BroadPhaseLayers : std::uint8_t {
NonMoving = 0,
Moving = 1,
NumLayers
};
class broad_phase_layer_interface final
: public JPH::BroadPhaseLayerInterface {
public:
broad_phase_layer_interface() = default;
[[nodiscard]] uint32_t GetNumBroadPhaseLayers() const override {
return (uint32_t)(BroadPhaseLayers::NumLayers);
}
[[nodiscard]] JPH::BroadPhaseLayer GetBroadPhaseLayer(
JPH::ObjectLayer p_in_layer) const override {
JPH_ASSERT(p_in_layer < (JPH::ObjectLayer)ObjectLayer::NumLayers);
return m_object_to_broadphase[p_in_layer];
}
#if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
[[nodiscard]] const char* GetBroadPhaseLayerName(
JPH::BroadPhaseLayer p_in_layer) const override {
switch (p_in_layer.GetValue()) {
case (JPH::BroadPhaseLayer::Type)(BroadPhaseLayers::NonMoving):
return "NonMoving";
case (JPH::BroadPhaseLayer::Type)(BroadPhaseLayers::Moving):
return "Moving";
default:
JPH_ASSERT(false);
return "Unknown";
}
}
#endif
private:
// The list of organizational layers
std::vector<JPH::BroadPhaseLayer> m_object_to_broadphase{
JPH::BroadPhaseLayer((uint8_t)(BroadPhaseLayers::NonMoving)),
JPH::BroadPhaseLayer((uint8_t)(BroadPhaseLayers::Moving))
};
};
class object_vs_broadphase_layer final
: public JPH::ObjectVsBroadPhaseLayerFilter {
public:
[[nodiscard]] bool ShouldCollide(
JPH::ObjectLayer p_in_layer1,
JPH::BroadPhaseLayer p_in_layer2) const override {
switch (p_in_layer1) {
case (int)(ObjectLayer::NonMoving):
return p_in_layer2 ==
JPH::BroadPhaseLayer((JPH::BroadPhaseLayer::Type)(
BroadPhaseLayers::Moving));
case (int)ObjectLayer::Moving:
return true;
default:
JPH_ASSERT(false);
return false;
}
}
};
class object_layer_pair_filter final : public JPH::ObjectLayerPairFilter {
public:
[[nodiscard]] bool ShouldCollide(
JPH::ObjectLayer p_in_object1,
JPH::ObjectLayer p_in_object2) const override {
switch (p_in_object1) {
case (int)(ObjectLayer::NonMoving):
return p_in_object2 == (int)(ObjectLayer::Moving);
case (int)(ObjectLayer::Moving):
return true;
default:
JPH_ASSERT(false);
return false;
}
}
};
}