Ajout de Jolt Physics + 1ere version des factory entitecomposants - camera, transform, rigidbody, collider, renderer

This commit is contained in:
Tom Ray
2026-03-22 00:28:03 +01:00
parent 6695d46bcd
commit 48348936a8
1147 changed files with 214331 additions and 353 deletions

View File

@@ -0,0 +1,135 @@
// 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 UNUSED1 = 0; // 4 unused values so that broadphase layers values don't match with object layer values (for testing purposes)
static constexpr ObjectLayer UNUSED2 = 1;
static constexpr ObjectLayer UNUSED3 = 2;
static constexpr ObjectLayer UNUSED4 = 3;
static constexpr ObjectLayer NON_MOVING = 4;
static constexpr ObjectLayer MOVING = 5;
static constexpr ObjectLayer DEBRIS = 6; // Example: Debris collides only with NON_MOVING
static constexpr ObjectLayer SENSOR = 7; // Sensors only collide with MOVING objects
static constexpr ObjectLayer NUM_LAYERS = 8;
};
/// 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::UNUSED1:
case Layers::UNUSED2:
case Layers::UNUSED3:
case Layers::UNUSED4:
return false;
case Layers::NON_MOVING:
return inObject2 == Layers::MOVING || inObject2 == Layers::DEBRIS;
case Layers::MOVING:
return inObject2 == Layers::NON_MOVING || inObject2 == Layers::MOVING || inObject2 == Layers::SENSOR;
case Layers::DEBRIS:
return inObject2 == Layers::NON_MOVING;
case Layers::SENSOR:
return inObject2 == Layers::MOVING;
default:
JPH_ASSERT(false);
return false;
}
}
};
/// Broadphase layers
namespace BroadPhaseLayers
{
static constexpr BroadPhaseLayer NON_MOVING(0);
static constexpr BroadPhaseLayer MOVING(1);
static constexpr BroadPhaseLayer DEBRIS(2);
static constexpr BroadPhaseLayer SENSOR(3);
static constexpr BroadPhaseLayer UNUSED(4);
static constexpr uint NUM_LAYERS(5);
};
/// BroadPhaseLayerInterface implementation
class BPLayerInterfaceImpl final : public BroadPhaseLayerInterface
{
public:
BPLayerInterfaceImpl()
{
// Create a mapping table from object to broad phase layer
mObjectToBroadPhase[Layers::UNUSED1] = BroadPhaseLayers::UNUSED;
mObjectToBroadPhase[Layers::UNUSED2] = BroadPhaseLayers::UNUSED;
mObjectToBroadPhase[Layers::UNUSED3] = BroadPhaseLayers::UNUSED;
mObjectToBroadPhase[Layers::UNUSED4] = BroadPhaseLayers::UNUSED;
mObjectToBroadPhase[Layers::NON_MOVING] = BroadPhaseLayers::NON_MOVING;
mObjectToBroadPhase[Layers::MOVING] = BroadPhaseLayers::MOVING;
mObjectToBroadPhase[Layers::DEBRIS] = BroadPhaseLayers::DEBRIS;
mObjectToBroadPhase[Layers::SENSOR] = BroadPhaseLayers::SENSOR;
}
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";
case (BroadPhaseLayer::Type)BroadPhaseLayers::DEBRIS: return "DEBRIS";
case (BroadPhaseLayer::Type)BroadPhaseLayers::SENSOR: return "SENSOR";
case (BroadPhaseLayer::Type)BroadPhaseLayers::UNUSED: return "UNUSED";
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 || inLayer2 == BroadPhaseLayers::DEBRIS;
case Layers::MOVING:
return inLayer2 == BroadPhaseLayers::NON_MOVING || inLayer2 == BroadPhaseLayers::MOVING || inLayer2 == BroadPhaseLayers::SENSOR;
case Layers::DEBRIS:
return inLayer2 == BroadPhaseLayers::NON_MOVING;
case Layers::SENSOR:
return inLayer2 == BroadPhaseLayers::MOVING;
case Layers::UNUSED1:
case Layers::UNUSED2:
case Layers::UNUSED3:
return false;
default:
JPH_ASSERT(false);
return false;
}
}
};