Physics working
This commit is contained in:
@@ -1,15 +1,20 @@
|
||||
#ifndef HYDRAECSPHYSICSCOMPONENT
|
||||
#define HYDRAECSPHYSICSCOMPONENT
|
||||
|
||||
#include "../engine/HydraEngine.h"
|
||||
#include "../../engine/HydraEngine.h"
|
||||
//#include "../physics/HydraPhysicsDefinition.h"
|
||||
|
||||
#include <box3d/box3d.h>
|
||||
struct HydraPhysicsComponent
|
||||
{
|
||||
//
|
||||
HYDRA_STATE physics_state = HYDRA_STATE::Empty;
|
||||
// HydraPhysicsDefinitionStruct physics_definition;
|
||||
|
||||
HYDRA_PHYSICS_TYPE phyics_type = HYDRA_PHYSICS_TYPE::HYDRA_INVALID_PHYSICS_TYPE;
|
||||
HYDRA_PHYSICS_SHAPE physics_shape = HYDRA_PHYSICS_SHAPE::HYDRA_INVALID_PHYSICS_TYPE;
|
||||
float mass = 0;
|
||||
float height = 0;
|
||||
float width = 0;
|
||||
float depth = 0;
|
||||
b3BodyId body_id = {};
|
||||
bool initialised = false;
|
||||
bool needs_update = false;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
#include "HydraPhysicsSystem.h"
|
||||
#include "../../engine/HydraEngine.h"
|
||||
#include "../../scheduler/HydraTaskScheduler.h"
|
||||
#include "../../task/physics/HydraInitialisePhysicsWorldTask.hpp"
|
||||
#include "../../task/physics/HydraDestroyPhysicsWorldTask.hpp"
|
||||
#include "../../task/physics/HydraCreatePhysicsObjectTask.hpp"
|
||||
#include "../../task/physics/HydraSetPhysicsTransform.hpp"
|
||||
#include "../../task/physics/HydraGetPhysicsUpdatesTask.hpp"
|
||||
#include "../../task/physics/HydraStepPhysicsTask.h"
|
||||
#include "../../ecs/HydraECS.h"
|
||||
#include "../../ecs/components/HydraPhysicsComponent.h"
|
||||
#include "../../ecs/components/HydraPositionComponent.h"
|
||||
|
||||
|
||||
void HydraPhysicsSystem::Initialise()
|
||||
{
|
||||
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
||||
|
||||
HydraID task_id = task_scheduler->CreateTask<HydraInitialisePhysicsWorldTask>(HydraThreadAffinity::Physics);
|
||||
HydraInitialisePhysicsWorldTask *task = static_cast<HydraInitialisePhysicsWorldTask *>(task_scheduler->GetTask(task_id));
|
||||
task->Initialise(&m_world_id);
|
||||
task_scheduler->WaitForTask(task_id);
|
||||
}
|
||||
|
||||
void HydraPhysicsSystem::Shutdown()
|
||||
{
|
||||
//TODO destroy all objects here then
|
||||
|
||||
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
||||
|
||||
HydraID task_id = task_scheduler->CreateTask<HydraDestroyPhysicsWorldTask>(HydraThreadAffinity::Physics);
|
||||
HydraDestroyPhysicsWorldTask *task = static_cast<HydraDestroyPhysicsWorldTask *>(task_scheduler->GetTask(task_id));
|
||||
task->Initialise(m_world_id);
|
||||
task_scheduler->WaitForTask(task_id);
|
||||
|
||||
}
|
||||
|
||||
void HydraPhysicsSystem::SetTransform(HydraID entity_id)
|
||||
{
|
||||
HydraPhysicsComponent &phys_comp = GetEngine()->ECS()->GetComponent<HydraPhysicsComponent>(entity_id);
|
||||
if(!phys_comp.needs_update)
|
||||
{
|
||||
m_bodies_to_set.push(entity_id);
|
||||
phys_comp.needs_update = true;
|
||||
}
|
||||
}
|
||||
|
||||
void HydraPhysicsSystem::InitialiseComponent(HydraID entity_id)
|
||||
{
|
||||
b3BodyId body_id = {};
|
||||
HydraPhysicsComponent& phys_comp = GetEngine()->ECS()->GetComponent<HydraPhysicsComponent>(entity_id);
|
||||
HydraPositionComponent& pos_comp = GetEngine()->ECS()->GetComponent<HydraPositionComponent>(entity_id);
|
||||
|
||||
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
||||
|
||||
HydraID task_id = task_scheduler->CreateTask<HydraCreatePhysicsObjectTask>(HydraThreadAffinity::Physics);
|
||||
HydraCreatePhysicsObjectTask *task = static_cast<HydraCreatePhysicsObjectTask *>(task_scheduler->GetTask(task_id));
|
||||
task->Initialise(m_world_id, phys_comp, &body_id, entity_id);
|
||||
task_scheduler->WaitForTask(task_id);
|
||||
phys_comp.body_id = body_id;
|
||||
|
||||
task_id = task_scheduler->CreateTask<HydraSetPhysicsTransform>(HydraThreadAffinity::Physics);
|
||||
HydraSetPhysicsTransform *set_task = static_cast<HydraSetPhysicsTransform *>(task_scheduler->GetTask(task_id));
|
||||
set_task->Initialise(body_id, pos_comp.position, glm::quat(pos_comp.orientation));
|
||||
task_scheduler->WaitForTask(task_id);
|
||||
phys_comp.initialised = true;
|
||||
|
||||
}
|
||||
|
||||
void HydraPhysicsSystem::DestroyComponent(HydraID entity_id)
|
||||
{
|
||||
}
|
||||
|
||||
void HydraPhysicsSystem::UpdateSystem(float delta_t_seconds)
|
||||
{
|
||||
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
||||
while(m_bodies_to_set.size() >0)
|
||||
{
|
||||
HydraID entity_id = m_bodies_to_set.front();
|
||||
m_bodies_to_set.pop();
|
||||
HydraPhysicsComponent& phys_comp = GetEngine()->ECS()->GetComponent<HydraPhysicsComponent>(entity_id);
|
||||
HydraPositionComponent& pos_comp = GetEngine()->ECS()->GetComponent<HydraPositionComponent>(entity_id);
|
||||
|
||||
HydraID task_id = task_scheduler->CreateTask<HydraSetPhysicsTransform>(HydraThreadAffinity::Physics);
|
||||
HydraSetPhysicsTransform *set_task = static_cast<HydraSetPhysicsTransform *>(task_scheduler->GetTask(task_id));
|
||||
set_task->Initialise(phys_comp.body_id, pos_comp.position, glm::quat(pos_comp.orientation));
|
||||
task_scheduler->WaitForTask(task_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void HydraPhysicsSystem::StepPhysics(float delta_t)
|
||||
{
|
||||
HydraID physics_step_task_id = GetEngine()->TaskScheduler()->CreateTask<HydraStepPhysicsTask>(HydraThreadAffinity::Physics);
|
||||
HydraStepPhysicsTask* physics_task = static_cast<HydraStepPhysicsTask*>(GetEngine()->TaskScheduler()->GetTask(physics_step_task_id));
|
||||
physics_task->Initialise(m_world_id, delta_t);
|
||||
GetEngine()->TaskScheduler()->WaitForTask(physics_step_task_id);
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef HYDRAPHYSICSSYSTEM
|
||||
#define HYDRAPHYSICSSYSTEM
|
||||
|
||||
#include "../../engine/HydraObject.h"
|
||||
#include "../HydraSystem.h"
|
||||
#include <GLMIncludes.h>
|
||||
#include <queue>
|
||||
|
||||
#include <box3d/box3d.h>
|
||||
|
||||
class HydraPhysicsSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
|
||||
void Initialise() override;
|
||||
void Shutdown() override;
|
||||
void SetTransform(HydraID entity_id);
|
||||
void StepPhysics(float delta_t);
|
||||
protected:
|
||||
void InitialiseComponent(HydraID entity_id) override;
|
||||
void DestroyComponent(HydraID entity_id) override;
|
||||
|
||||
virtual void UpdateSystem(float delta_t_seconds);
|
||||
private:
|
||||
b3WorldId m_world_id;
|
||||
std::queue<HydraID> m_bodies_to_set;
|
||||
};
|
||||
|
||||
#endif /* HYDRAPHYSICSSYSTEM */
|
||||
@@ -1,20 +1,31 @@
|
||||
#include "HydraTransformSystem.h"
|
||||
#include "../../engine/HydraEngine.h"
|
||||
#include "../HydraECS.h"
|
||||
#include "HydraPhysicsSystem.h"
|
||||
#include "../components/HydraPositionComponent.h"
|
||||
#include "../../scheduler/HydraTaskScheduler.h"
|
||||
#include "../../task/buffer/HydraCreateGPUBufferTask.hpp"
|
||||
#include "../../task/buffer/HydraDeleteGPUBufferTask.hpp"
|
||||
#include "../../task/buffer/HydraUpdateWholeGPUBufferTask.hpp"
|
||||
#include "../../task/physics/HydraSetPhysicsTransform.hpp"
|
||||
#include "../../actor/HydraActorManager.h"
|
||||
#include "../components/HydraPhysicsComponent.h"
|
||||
|
||||
void HydraTransformSystem::UpdateTransform(HydraID actor_id)
|
||||
void HydraTransformSystem::UpdateTransform(HydraID actor_id, bool ignore_physics)
|
||||
{
|
||||
|
||||
|
||||
HydraECS *ecs = GetEngine()->ECS();
|
||||
HydraPositionComponent &pos_comp = ecs->GetComponent<HydraPositionComponent>(actor_id);
|
||||
pos_comp.needs_update = true;
|
||||
m_entities_to_update.push(actor_id);
|
||||
pos_comp.needs_update = true;
|
||||
m_entities_to_update.push(actor_id);
|
||||
if (!ignore_physics)
|
||||
{
|
||||
if (ecs->HasComponent<HydraPhysicsComponent>(actor_id))
|
||||
{
|
||||
std::shared_ptr<HydraPhysicsSystem> phys_sys = GetEngine()->ECS()->GetSystem<HydraPhysicsSystem>();
|
||||
phys_sys->SetTransform(actor_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HydraTransformSystem::Initialise()
|
||||
@@ -23,7 +34,7 @@ void HydraTransformSystem::Initialise()
|
||||
HydraID create_gpu_buffer_task_id = task_scheduler->CreateTask<HydraCreateGPUBufferTask>(HydraThreadAffinity::Render);
|
||||
HydraCreateGPUBufferTask *task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
|
||||
task->Intialise("PositionsBuffer", 1, MAX_ACTORS * sizeof(glm::mat4),
|
||||
&m_transform_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
||||
&m_transform_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
||||
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
|
||||
m_model_matrix.resize(MAX_ACTORS);
|
||||
}
|
||||
@@ -35,22 +46,22 @@ void HydraTransformSystem::FreeSystemResources()
|
||||
HydraID delete_gpu_buffer_task_id = task_scheduler->CreateTask<HydraDeleteGPUBufferTask>(HydraThreadAffinity::Render);
|
||||
HydraDeleteGPUBufferTask *task = static_cast<HydraDeleteGPUBufferTask *>(task_scheduler->GetTask(delete_gpu_buffer_task_id));
|
||||
task->Intialise(m_transform_buffer_id);
|
||||
task_scheduler->WaitForTask(delete_gpu_buffer_task_id);
|
||||
task_scheduler->WaitForTask(delete_gpu_buffer_task_id);
|
||||
}
|
||||
|
||||
void HydraTransformSystem::UpdateSystem(float delta_t_seconds)
|
||||
{
|
||||
HydraECS *ecs = GetEngine()->ECS();
|
||||
|
||||
while(m_entities_to_update.size() > 0)
|
||||
|
||||
while (m_entities_to_update.size() > 0)
|
||||
{
|
||||
HydraID actor_id = m_entities_to_update.front();
|
||||
m_entities_to_update.pop();
|
||||
HydraPositionComponent &pos_comp = ecs->GetComponent<HydraPositionComponent>(actor_id);
|
||||
if(pos_comp.needs_update)
|
||||
if (pos_comp.needs_update)
|
||||
{
|
||||
HydraID parent_id = GetEngine()->ActorManager()->GetRoot(actor_id);
|
||||
glm::mat4 identity = glm::mat4(1);
|
||||
glm::mat4 identity = glm::mat4(1);
|
||||
_UpdateChild(INVALID_HYDRA_ID, parent_id, identity);
|
||||
}
|
||||
}
|
||||
@@ -83,10 +94,26 @@ void HydraTransformSystem::_UpdateChild(HydraID parent_id, HydraID actor_id, glm
|
||||
glm::mat4 scale_matrix = glm::scale(pos_comp.scale);
|
||||
glm::mat4 model_matrix = trans_matrix * rot_matrix * scale_matrix;
|
||||
|
||||
pos_comp.transform = trans * model_matrix;
|
||||
pos_comp.transform = trans * model_matrix;
|
||||
pos_comp.needs_update = false;
|
||||
m_model_matrix[actor_id] = pos_comp.transform;
|
||||
trans = pos_comp.transform;
|
||||
if (ecs->HasComponent<HydraPhysicsComponent>(actor_id))
|
||||
{
|
||||
HydraPhysicsComponent phys_comp = ecs->GetComponent<HydraPhysicsComponent>(actor_id);
|
||||
if (phys_comp.initialised)
|
||||
{
|
||||
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
||||
|
||||
HydraID task_id = task_scheduler->CreateTask<HydraSetPhysicsTransform>(HydraThreadAffinity::Render);
|
||||
HydraSetPhysicsTransform *task = static_cast<HydraSetPhysicsTransform *>(task_scheduler->GetTask(task_id));
|
||||
task->Initialise(phys_comp.body_id,
|
||||
glm::vec3(pos_comp.position.x, pos_comp.position.y, pos_comp.position.z),
|
||||
glm::quat(pos_comp.orientation));
|
||||
task_scheduler->WaitForTask(task_id);
|
||||
}
|
||||
}
|
||||
|
||||
trans = pos_comp.transform;
|
||||
}
|
||||
for (uint32_t child_idx = 0; child_idx < child_ids.size(); child_idx++)
|
||||
{
|
||||
|
||||
@@ -8,7 +8,7 @@ class HydraTransformSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
|
||||
void UpdateTransform(HydraID actor_id);
|
||||
void UpdateTransform(HydraID actor_id, bool ignore_physics = false);
|
||||
void Initialise() override;
|
||||
|
||||
protected:
|
||||
|
||||
Reference in New Issue
Block a user