Implemented a custom physics engine #316
|
@ -36,12 +36,13 @@ namespace SHADE
|
|||
auto* physicsSystem = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||
|
||||
// Get all physics objects & sync transforms
|
||||
for (auto& [entityID, physicsObject] : physicsSystem->physicsObjectManager.GetPhysicsObjects())
|
||||
auto& physicsObjects = physicsSystem->physicsObjectManager.GetPhysicsObjects();
|
||||
for (auto& [entityID, physicsObject] : physicsObjects)
|
||||
{
|
||||
const auto* TRANSFORM_COMPONENT = SHComponentManager::GetComponent_s<SHTransformComponent>(entityID);
|
||||
|
||||
if (!TRANSFORM_COMPONENT || !TRANSFORM_COMPONENT->HasChanged())
|
||||
return;
|
||||
continue;
|
||||
|
||||
const SHVec3& WORLD_POS = TRANSFORM_COMPONENT->GetWorldPosition();
|
||||
const SHQuaternion& WORLD_ROT = TRANSFORM_COMPONENT->GetWorldOrientation();
|
||||
|
|
|
@ -93,6 +93,7 @@ namespace SHADE
|
|||
{
|
||||
const auto& EVENT_DATA = reinterpret_cast<const SHEventSpec<SHColliderOnDebugDrawEvent>*>(onColliderDrawEvent.get())->data;
|
||||
|
||||
// Add to the container to draw all colliders
|
||||
if (EVENT_DATA->debugDrawState)
|
||||
{
|
||||
if (collidersToDraw.empty())
|
||||
|
@ -115,15 +116,23 @@ namespace SHADE
|
|||
{
|
||||
for (const auto* SHAPE : collider.GetCollisionShapes())
|
||||
{
|
||||
const SHColour& DRAW_COLOUR = DEBUG_DRAW_COLOURS[SHUtilities::ConvertEnum(SHAPE->IsTrigger() ? Colours::TRIGGER : Colours::COLLIDER)];
|
||||
|
||||
switch (SHAPE->GetType())
|
||||
{
|
||||
case SHCollisionShape::Type::SPHERE:
|
||||
{
|
||||
const SHSphereCollisionShape* SPHERE = dynamic_cast<const SHSphereCollisionShape*>(SHAPE);
|
||||
|
||||
// Compute rotation of sphere
|
||||
// Compute transforms of sphere
|
||||
const SHVec3 POSITION = SPHERE->GetCenter(); // Position offset is already computed here
|
||||
const SHVec3 ROTATION = collider.GetOrientation().ToEuler() + SPHERE->GetRotationOffset();
|
||||
drawSphere(debugDrawSystem, *SPHERE, ROTATION);
|
||||
const SHVec3 SCALE { SPHERE->GetWorldRadius() };
|
||||
|
||||
// Compute TRS for the sphere
|
||||
const SHMatrix TRS = SHMatrix::Transform(POSITION, ROTATION, SCALE);
|
||||
|
||||
debugDrawSystem->DrawWireSphere(TRS, DRAW_COLOUR, true);
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -140,12 +149,6 @@ namespace SHADE
|
|||
}
|
||||
}
|
||||
|
||||
void SHPhysicsDebugDrawSystem::drawSphere(SHDebugDrawSystem* debugDrawSystem, const SHSphereCollisionShape& sphere, const SHVec3& rotation) noexcept
|
||||
{
|
||||
const SHColour& DRAW_COLOUR = DEBUG_DRAW_COLOURS[SHUtilities::ConvertEnum(sphere.IsTrigger() ? Colours::TRIGGER : Colours::COLLIDER)];
|
||||
debugDrawSystem->DrawSphere(DRAW_COLOUR, sphere.GetCenter(), rotation, sphere.GetWorldRadius());
|
||||
}
|
||||
|
||||
void SHPhysicsDebugDrawSystem::drawContact(SHDebugDrawSystem* debugDrawSystem, const DebugDrawInfo::Contact& contactInfo) noexcept
|
||||
{
|
||||
static const SHColour& DRAW_COLOUR = DEBUG_DRAW_COLOURS[SHUtilities::ConvertEnum(Colours::CONTACT)];
|
||||
|
|
|
@ -138,9 +138,7 @@ namespace SHADE
|
|||
|
||||
SHEventHandle onColliderDraw(SHEventPtr onColliderDrawEvent);
|
||||
|
||||
static void drawCollider (SHDebugDrawSystem* debugDrawSystem, const SHCollider& collider) noexcept;
|
||||
static void drawSphere (SHDebugDrawSystem* debugDrawSystem, const SHSphereCollisionShape& sphere, const SHVec3& rotation) noexcept;
|
||||
|
||||
static void drawCollider (SHDebugDrawSystem* debugDrawSystem, const SHCollider& collider) noexcept;
|
||||
static void drawContact (SHDebugDrawSystem* debugDrawSystem, const DebugDrawInfo::Contact& contactInfo) noexcept;
|
||||
static void drawRaycast (SHDebugDrawSystem* debugDrawSystem, const DebugDrawInfo::Raycast& raycastInfo) noexcept;
|
||||
|
||||
|
|
Loading…
Reference in New Issue