#include "PhysicsSystem.h" #include "src/Scene/Scene.h" #include "src/Scene/Components/BoxCollider.h" #include #include "src/Scene/Entities/Entity.h" #include #include #include PhysicsSystem::PhysicsSystem(Scene* scene) { m_Scene = scene; } void PhysicsSystem::Init() { // Create physic world. auto view = m_Scene->m_Registry.view(); for (auto e : view) { auto [transform, rigidbody] = view.get(e); Entity ent = Entity({ e, m_Scene }); if (ent.HasComponent()) { float mass = rigidbody.mass; BoxColliderComponent& boxComponent = ent.GetComponent(); Ref boxShape = CreateRef(boxComponent.Size); Ref btRigidbody = CreateRef(mass, transform.Translation, boxShape); rigidbody.m_Rigidbody = btRigidbody; btRigidbody->SetKinematic(rigidbody.IsKinematic); PhysicsManager::Get()->RegisterBody(btRigidbody); } } // character controllers auto ccview = m_Scene->m_Registry.view(); for (auto e : ccview) { auto [transform, cc] = ccview.get(e); cc.CharacterController = CreateRef(cc.Height, cc.Radius, cc.Mass, transform.Translation); Entity ent = Entity({ e, m_Scene }); PhysicsManager::Get()->RegisterCharacterController(cc.CharacterController); } auto quakeMapview = m_Scene->m_Registry.view(); for (auto e : quakeMapview) { auto [transform, quake] = quakeMapview.get(e); if (quake.HasCollisions) { for (auto m : quake.m_Meshes) { Ref meshShape = CreateRef(m); Ref btRigidbody = CreateRef(0.0f, transform.Translation, meshShape); PhysicsManager::Get()->RegisterBody(btRigidbody); } } } } void PhysicsSystem::Update(Timestep ts) { // Update rigidbodies PhysicsManager::Get()->Step(ts); auto physicGroup = m_Scene->m_Registry.view(); for (auto e : physicGroup) { auto [transform, rb] = physicGroup.get(e); rb.SyncTransformComponent(&m_Scene->m_Registry.get(e)); } auto ccGroup = m_Scene->m_Registry.view(); for (auto e : ccGroup) { auto [transform, rb] = ccGroup.get(e); rb.SyncWithTransform(m_Scene->m_Registry.get(e)); } } void PhysicsSystem::FixedUpdate(Timestep ts) { } void PhysicsSystem::Exit() { PhysicsManager::Get()->Reset(); }