#ifndef HYDRASTEPPHYSICSTASK #define HYDRASTEPPHYSICSTASK #include "../HydraTask.h" #include "../../engine/HydraEngine.h" #include "../../renderer/HydraRenderer.h" #include #include "../../GlewIncludes.h" #include "../../buffer/HydraTextureBufferManager.h" #include "../../actor/HydraActorManager.h" #include "HydraSetWorldTransformTask.hpp" #include class HydraStepPhysicsTask : public HydraTask { private: b3WorldId m_world_id; float m_delta_t_seconds= 0; protected: public: void Process() override { b3World_Step(m_world_id, m_delta_t_seconds, 1); b3BodyEvents events = b3World_GetBodyEvents(m_world_id); HydraTaskScheduler* task_scheduler = GetEngine()->TaskScheduler(); HydraID barrier_id = task_scheduler->CreateBarrier(); for(uint32_t i = 0; i < events.moveCount; i ++) { HydraID task_id = task_scheduler->CreateTask(HydraThreadAffinity::General, barrier_id); HydraSetWorldTransformTask *set_task = static_cast(task_scheduler->GetTask(task_id)); glm::dvec3 position = {events.moveEvents[i].transform.p.x, events.moveEvents[i].transform.p.y, events.moveEvents[i].transform.p.z}; glm::quat temp = glm::quat(events.moveEvents[i].transform.q.s, glm::vec3(events.moveEvents[i].transform.q.v.x, events.moveEvents[i].transform.q.v.y, events.moveEvents[i].transform.q.v.z)); glm::vec3 rotation = glm::eulerAngles(temp); HydraID* entity_id = reinterpret_cast(events.moveEvents[i].userData); set_task->Initialise(*entity_id, position, rotation); task_scheduler->StartTask(task_id); } task_scheduler->WaitForBarrier(barrier_id); } void Initialise(b3WorldId world_id, float delta_t_seconds) { m_world_id= world_id; m_delta_t_seconds = delta_t_seconds; } }; #endif /* HYDRASTEPPHYSICSTASK */