Files
2026-08-30 19:06:41 +01:00

57 lines
2.0 KiB
C++

#ifndef HYDRASTEPPHYSICSTASK
#define HYDRASTEPPHYSICSTASK
#include "../HydraTask.h"
#include "../../engine/HydraEngine.h"
#include "../../renderer/HydraRenderer.h"
#include <GLMIncludes.h>
#include "../../GlewIncludes.h"
#include "../../buffer/HydraTextureBufferManager.h"
#include "../../actor/HydraActorManager.h"
#include "HydraSetWorldTransformTask.hpp"
#include <box3d/box3d.h>
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();
std::vector<HydraID> tasks;
uint32_t job_count = 0;
for(uint32_t i = 0; i < events.moveCount; i ++)
{
HydraID task_id = task_scheduler->CreateTask<HydraSetWorldTransformTask>(HydraThreadAffinity::General);//, barrier_id);
HydraSetWorldTransformTask *set_task = static_cast<HydraSetWorldTransformTask *>(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<HydraID*>(events.moveEvents[i].userData);
set_task->Initialise(*entity_id, position, rotation);
task_scheduler->WaitForTask(task_id);
}
}
void Initialise(b3WorldId world_id, float delta_t_seconds)
{
m_world_id= world_id;
m_delta_t_seconds = delta_t_seconds;
}
};
#endif /* HYDRASTEPPHYSICSTASK */