#include "PhysicsSystem.h" #include "src/Scene/Scene.h" #include "src/Scene/Components/BoxCollider.h" #include #include "src/Scene/Entities/Entity.h" #include #include #include #include #include namespace Nuake { PhysicsSystem::PhysicsSystem(Scene* scene) { m_Scene = scene; } bool 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 }); cc.CharacterController->SetEntity(ent); PhysicsManager::Get()->RegisterCharacterController(cc.CharacterController); } auto bspView = m_Scene->m_Registry.view(); for (auto e : bspView) { auto [transform, brush] = bspView.get(e); if (brush.IsSolid) { for (auto m : brush.Meshes) { Ref meshShape = CreateRef(m); Ref btRigidbody = CreateRef(0.0f, transform.GlobalTranslation, meshShape); btRigidbody->SetEntityID(Entity{ e, m_Scene }); brush.Rigidbody.push_back(btRigidbody); PhysicsManager::Get()->RegisterBody(btRigidbody); } } } auto bspTriggerView = m_Scene->m_Registry.view(); for (auto e : bspTriggerView) { auto [transform, brush, trigger] = bspTriggerView.get(e); Ref meshShape = CreateRef(brush.Meshes[0]); Ref ghostBody = CreateRef(transform.GlobalTranslation, meshShape); trigger.GhostObject = ghostBody; PhysicsManager::Get()->RegisterGhostBody(ghostBody); } return true; } void PhysicsSystem::Update(Timestep ts) { PhysicsManager::Get()->Step(ts); auto brushes = m_Scene->m_Registry.view(); for (auto e : brushes) { auto [transform, brush] = brushes.get(e); for (auto& r : brush.Rigidbody) { r->m_Transform->setOrigin(btVector3(transform.GlobalTranslation.x, transform.GlobalTranslation.y, transform.GlobalTranslation.z)); r->UpdateTransform(*r->m_Transform); } if (!brush.IsFunc) continue; brush.Targets.clear(); auto targetnameView = m_Scene->m_Registry.view(); for (auto e2 : targetnameView) { auto [ttransform, name] = targetnameView.get(e2); if (name.Name == brush.target) { brush.Targets.push_back(Entity{ e2, m_Scene }); } } } auto bspTriggerView = m_Scene->m_Registry.view(); for (auto e : bspTriggerView) { auto [transform, brush, trigger] = bspTriggerView.get(e); trigger.GhostObject->ScanOverlap(); brush.Targets.clear(); auto targetnameView = m_Scene->m_Registry.view(); for (auto e2 : targetnameView) { auto [ttransform, name] = targetnameView.get(e2); if (name.Name == brush.target) { brush.Targets.push_back(Entity{ e2, m_Scene }); } } } 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(); } }