Physics Fixes

This commit is contained in:
Isuru Samarathunga
2025-09-23 13:31:00 +05:30
parent 1573644c51
commit f5693ef0fa
5 changed files with 24 additions and 5 deletions

View File

@ -42,7 +42,7 @@ namespace ia::iae::game
0, 0,
0, 0,
g_player->DrawnSize().x, g_player->DrawnSize().x,
g_player->DrawnSize().y/2.0f, g_player->DrawnSize().y,
}; };
collider->IsDebugDrawEnabled() = true; collider->IsDebugDrawEnabled() = true;
} }

View File

@ -48,11 +48,15 @@ namespace ia::iae
{ {
if (other->HasTag(NODE_TAG_GROUND)) if (other->HasTag(NODE_TAG_GROUND))
m_body->IsGrounded() = true; m_body->IsGrounded() = true;
if(m_collisionEnterCallback)
m_collisionEnterCallback(other);
} }
VOID BoxCollider2DComponent::OnCollisionExit(IN Node *other) VOID BoxCollider2DComponent::OnCollisionExit(IN Node *other)
{ {
if (other->HasTag(NODE_TAG_GROUND)) if (other->HasTag(NODE_TAG_GROUND))
m_body->IsGrounded() = false; m_body->IsGrounded() = false;
if(m_collisionExitCallback)
m_collisionExitCallback(other);
} }
} // namespace ia::iae } // namespace ia::iae

View File

@ -104,12 +104,13 @@ namespace ia::iae
{ {
for (auto &b : g_bodies) for (auto &b : g_bodies)
{ {
const auto drawnSize = b.BodyComponent->GetNode()->DrawnSize();
const auto pos = b.BodyComponent->GetNode()->GetPosition(); const auto pos = b.BodyComponent->GetNode()->GetPosition();
auto bodyDef = b2DefaultBodyDef(); auto bodyDef = b2DefaultBodyDef();
if (b.BodyComponent->IsDynamic()) if (b.BodyComponent->IsDynamic())
bodyDef.type = b2_dynamicBody; bodyDef.type = b2_dynamicBody;
bodyDef.position = b2Vec2{pos.x, pos.y}; bodyDef.position = b2Vec2{pos.x + drawnSize.x/2.0f, pos.y + drawnSize.y/2.0f};
if (b.BodyId.world0 != 0xFFFF) if (b.BodyId.world0 != 0xFFFF)
b2DestroyBody(b.BodyId); b2DestroyBody(b.BodyId);
b.BodyId = b2CreateBody(g_worldId, &bodyDef); b.BodyId = b2CreateBody(g_worldId, &bodyDef);
@ -119,7 +120,7 @@ namespace ia::iae
const auto rect = c.ColliderComponent->Rect(); const auto rect = c.ColliderComponent->Rect();
const auto halfW = rect.z/2.0f; const auto halfW = rect.z/2.0f;
const auto halfH = rect.w/2.0f; const auto halfH = rect.w/2.0f;
const auto box = b2MakeOffsetBox(halfW, halfH, {rect.x, rect.y - halfH/2.0f}, b2MakeRot(0)); const auto box = b2MakeOffsetBox(halfW, halfH, {rect.x, rect.y}, b2MakeRot(0));
auto boxShapeDef = b2DefaultShapeDef(); auto boxShapeDef = b2DefaultShapeDef();
boxShapeDef.density = 1.0f; boxShapeDef.density = 1.0f;
boxShapeDef.isSensor = c.ColliderComponent->IsTrigger(); boxShapeDef.isSensor = c.ColliderComponent->IsTrigger();
@ -157,8 +158,9 @@ namespace ia::iae
glm::vec2 Physics::GetBodyPosition(IN Handle handle) glm::vec2 Physics::GetBodyPosition(IN Handle handle)
{ {
const auto &b = g_bodies[handle]; const auto &b = g_bodies[handle];
const auto drawnSize = b.BodyComponent->GetNode()->DrawnSize();
const auto v = b2Body_GetPosition(b.BodyId); const auto v = b2Body_GetPosition(b.BodyId);
return {v.x, v.y}; return {v.x - drawnSize.x/2.0f, v.y - drawnSize.y/2.0f};
} }
VOID Physics::ApplyBodyForce(IN Handle handle, IN glm::vec2 force) VOID Physics::ApplyBodyForce(IN Handle handle, IN glm::vec2 force)

View File

@ -31,6 +31,17 @@ namespace ia::iae
VOID OnCollisionEnter(IN Node *other); VOID OnCollisionEnter(IN Node *other);
VOID OnCollisionExit(IN Node *other); VOID OnCollisionExit(IN Node *other);
public:
VOID SetCollisionEnterCallback(IN std::function<VOID(IN Node *)> callback)
{
m_collisionEnterCallback = callback;
}
VOID SetCollisionExitCallback(IN std::function<VOID(IN Node *)> callback)
{
m_collisionExitCallback = callback;
}
public: public:
BOOL &IsDebugDrawEnabled() BOOL &IsDebugDrawEnabled()
{ {
@ -68,5 +79,7 @@ namespace ia::iae
BOOL m_collisionsEnabled{true}; BOOL m_collisionsEnabled{true};
Handle m_physicsHandle{INVALID_HANDLE}; Handle m_physicsHandle{INVALID_HANDLE};
PhysicsBody2DComponent *m_body{}; PhysicsBody2DComponent *m_body{};
std::function<VOID(IN Node *)> m_collisionEnterCallback{};
std::function<VOID(IN Node *)> m_collisionExitCallback{};
}; };
} // namespace ia::iae } // namespace ia::iae

View File

@ -60,7 +60,7 @@ namespace ia::iae
private: private:
BOOL m_isDynamic{}; BOOL m_isDynamic{};
BOOL m_isGrounded{}; BOOL m_isGrounded{};
BOOL m_isRotationLocked{}; BOOL m_isRotationLocked{true};
Handle m_physicsHandle{INVALID_HANDLE}; Handle m_physicsHandle{INVALID_HANDLE};
}; };
} // namespace ia::iae } // namespace ia::iae