Character controller working better

Moved ECS systems to separate folders
better raycast normal result
This commit is contained in:
Antoine Pilote
2021-06-18 16:44:54 -04:00
parent 8f238cd4ca
commit 5b56e2ff9a
73 changed files with 1179 additions and 489 deletions

View File

@@ -0,0 +1,98 @@
#include "PhysicsSystem.h"
#include "src/Scene/Scene.h"
#include "src/Scene/Components/BoxCollider.h"
#include <src/Scene/Components/RigidbodyComponent.h>
#include "src/Scene/Entities/Entity.h"
#include <src/Core/Physics/PhysicsManager.h>
#include <src/Scene/Components/CharacterControllerComponent.h>
#include <src/Scene/Components/QuakeMap.h>
PhysicsSystem::PhysicsSystem(Scene* scene)
{
m_Scene = scene;
}
void PhysicsSystem::Init()
{
// Create physic world.
auto view = m_Scene->m_Registry.view<TransformComponent, RigidBodyComponent>();
for (auto e : view)
{
auto [transform, rigidbody] = view.get<TransformComponent, RigidBodyComponent>(e);
Entity ent = Entity({ e, m_Scene });
if (ent.HasComponent<BoxColliderComponent>())
{
float mass = rigidbody.mass;
BoxColliderComponent& boxComponent = ent.GetComponent<BoxColliderComponent>();
Ref<Physics::Box> boxShape = CreateRef<Physics::Box>(boxComponent.Size);
Ref<Physics::RigidBody> btRigidbody = CreateRef<Physics::RigidBody>(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<TransformComponent, CharacterControllerComponent>();
for (auto e : ccview)
{
auto [transform, cc] = ccview.get<TransformComponent, CharacterControllerComponent>(e);
cc.CharacterController = CreateRef<Physics::CharacterController>(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<TransformComponent, QuakeMapComponent>();
for (auto e : quakeMapview)
{
auto [transform, quake] = quakeMapview.get<TransformComponent, QuakeMapComponent>(e);
if (quake.HasCollisions)
{
for (auto m : quake.m_Meshes)
{
Ref<Physics::MeshShape> meshShape = CreateRef<Physics::MeshShape>(m);
Ref<Physics::RigidBody> btRigidbody = CreateRef<Physics::RigidBody>(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<TransformComponent, RigidBodyComponent>();
for (auto e : physicGroup) {
auto [transform, rb] = physicGroup.get<TransformComponent, RigidBodyComponent>(e);
rb.SyncTransformComponent(&m_Scene->m_Registry.get<TransformComponent>(e));
}
auto ccGroup = m_Scene->m_Registry.view<TransformComponent, CharacterControllerComponent>();
for (auto e : ccGroup) {
auto [transform, rb] = ccGroup.get<TransformComponent, CharacterControllerComponent>(e);
rb.SyncWithTransform(m_Scene->m_Registry.get<TransformComponent>(e));
}
}
void PhysicsSystem::FixedUpdate(Timestep ts)
{
}
void PhysicsSystem::Exit()
{
PhysicsManager::Get()->Reset();
}