Physics stuff
This commit is contained in:
@@ -13,13 +13,14 @@ class HydraSystem : public HydraObject
|
||||
|
||||
void Update(float delta_t_seconds);
|
||||
void InitialiseComponents();
|
||||
virtual void InitialiseComponent(HydraID actor_id) {};
|
||||
void DestroyComponents(HydraID actor_id);
|
||||
virtual void Shutdown();
|
||||
virtual void Initialise(){};
|
||||
protected:
|
||||
|
||||
virtual void UpdateSystem(float delta_t_seconds) = 0;
|
||||
virtual void InitialiseComponent(HydraID actor_id) {};
|
||||
|
||||
virtual void DestroyComponent(HydraID actor_id) {};
|
||||
virtual void FreeSystemResources(){};
|
||||
};
|
||||
|
||||
@@ -54,6 +54,7 @@ public:
|
||||
}
|
||||
void EntitySignatureChanged(HydraID entity_id, HydraSignature signature)
|
||||
{
|
||||
|
||||
// Notify each system that an entity's signature changed
|
||||
for (auto const& pair : m_systems)
|
||||
{
|
||||
@@ -68,6 +69,8 @@ public:
|
||||
{
|
||||
system->EntitiesToCreate.insert(entity_id);
|
||||
system->Entities.insert(entity_id);
|
||||
//system->InitialiseComponent(entity_id);
|
||||
|
||||
}
|
||||
// Entity signature does not match system signature - erase from set
|
||||
else
|
||||
@@ -77,6 +80,7 @@ public:
|
||||
system->EntitiesToCreate.erase(entity_id);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
void EntityDeleted(HydraID entity_id)
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define HYDRAECSPOSITIONCOMPONENT
|
||||
|
||||
|
||||
#include "../../engine/HydraEngine.h"
|
||||
struct HydraPositionComponent
|
||||
{
|
||||
glm::dvec3 position = {};
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
#ifndef HYDRAFIXEDTICKCOMPONENT
|
||||
#define HYDRAFIXEDTICKCOMPONENT
|
||||
|
||||
#include "../../engine/HydraEngine.h"
|
||||
|
||||
struct HydraTickComponent
|
||||
{
|
||||
HydraID entity_id;
|
||||
bool fixed = false;
|
||||
bool every_frame = false;
|
||||
};
|
||||
#endif /* HYDRAFIXEDTICKCOMPONENT */
|
||||
@@ -12,8 +12,9 @@ class HydraDirectionalShadowSourceSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
virtual void Initialise() override;
|
||||
protected:
|
||||
void InitialiseComponent(HydraID entity_id) override;
|
||||
protected:
|
||||
|
||||
void DestroyComponent(HydraID entity_id) override;
|
||||
void UpdateSystem(float delta_t_seconds) override;
|
||||
private:
|
||||
|
||||
@@ -14,9 +14,9 @@ class HydraLightSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
void Initialise() override;
|
||||
//uint32_t GetLightCount();
|
||||
protected:
|
||||
void InitialiseComponent(HydraID entity_id) override;
|
||||
protected:
|
||||
|
||||
void DestroyComponent(HydraID actor_id) override;
|
||||
virtual void UpdateSystem(float delta_t_seconds);
|
||||
private:
|
||||
|
||||
@@ -13,12 +13,10 @@ class HydraMaterialSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
void Initialise() override;
|
||||
protected:
|
||||
void InitialiseComponent(HydraID entity_id) override;
|
||||
protected:
|
||||
void FreeSystemResources() override;
|
||||
virtual void UpdateSystem(float delta_t_seconds);
|
||||
|
||||
|
||||
private:
|
||||
void _WriteToGPU();
|
||||
HydraID m_material_buffer_id = INVALID_HYDRA_ID;
|
||||
|
||||
@@ -9,13 +9,10 @@
|
||||
class HydraMeshSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
|
||||
void Initialise() override;
|
||||
|
||||
protected:
|
||||
void InitialiseComponent(HydraID entity_id) override;
|
||||
protected:
|
||||
void DestroyComponent(HydraID entity_id) override;
|
||||
|
||||
virtual void UpdateSystem(float delta_t_seconds){}
|
||||
};
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "../../task/physics/HydraSetPhysicsTransform.hpp"
|
||||
#include "../../task/physics/HydraGetPhysicsUpdatesTask.hpp"
|
||||
#include "../../task/physics/HydraStepPhysicsTask.h"
|
||||
#include "../../task/physics/HydraSetPhysicsLinearVelocity.hpp"
|
||||
#include "../../ecs/HydraECS.h"
|
||||
#include "../../ecs/components/HydraPhysicsComponent.h"
|
||||
#include "../../ecs/components/HydraPositionComponent.h"
|
||||
@@ -40,14 +41,35 @@ 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);
|
||||
m_bodies_to_set_transform.push(entity_id);
|
||||
phys_comp.needs_update = true;
|
||||
}
|
||||
// HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
||||
// 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::SetLinearVelocity(HydraID entity_id, glm::vec3 velocity)
|
||||
{
|
||||
PhysicsVelocity vel = {entity_id, velocity};
|
||||
m_bodies_to_set_velocity.push(vel);
|
||||
// HydraPhysicsComponent& phys_comp = GetEngine()->ECS()->GetComponent<HydraPhysicsComponent>(entity_id);
|
||||
// HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
|
||||
// HydraID task_id = task_scheduler->CreateTask<HydraSetPhysicsLinearVelocity>(HydraThreadAffinity::Physics);
|
||||
// HydraSetPhysicsLinearVelocity *set_task = static_cast<HydraSetPhysicsLinearVelocity *>(task_scheduler->GetTask(task_id));
|
||||
// set_task->Initialise(phys_comp.body_id, velocity);
|
||||
// task_scheduler->WaitForTask(task_id);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
@@ -69,15 +91,16 @@ void HydraPhysicsSystem::InitialiseComponent(HydraID entity_id)
|
||||
|
||||
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)
|
||||
while(m_bodies_to_set_transform.size() >0)
|
||||
{
|
||||
HydraID entity_id = m_bodies_to_set.front();
|
||||
m_bodies_to_set.pop();
|
||||
HydraID entity_id = m_bodies_to_set_transform.front();
|
||||
m_bodies_to_set_transform.pop();
|
||||
HydraPhysicsComponent& phys_comp = GetEngine()->ECS()->GetComponent<HydraPhysicsComponent>(entity_id);
|
||||
HydraPositionComponent& pos_comp = GetEngine()->ECS()->GetComponent<HydraPositionComponent>(entity_id);
|
||||
|
||||
@@ -86,7 +109,17 @@ void HydraPhysicsSystem::UpdateSystem(float delta_t_seconds)
|
||||
set_task->Initialise(phys_comp.body_id, pos_comp.position, glm::quat(pos_comp.orientation));
|
||||
task_scheduler->WaitForTask(task_id);
|
||||
}
|
||||
|
||||
while(m_bodies_to_set_velocity.size() >0)
|
||||
{
|
||||
PhysicsVelocity vel = m_bodies_to_set_velocity.front();
|
||||
m_bodies_to_set_velocity.pop();
|
||||
HydraPhysicsComponent& phys_comp = GetEngine()->ECS()->GetComponent<HydraPhysicsComponent>(vel.entity_id);
|
||||
|
||||
HydraID task_id = task_scheduler->CreateTask<HydraSetPhysicsLinearVelocity>(HydraThreadAffinity::Physics);
|
||||
HydraSetPhysicsLinearVelocity *set_task = static_cast<HydraSetPhysicsLinearVelocity *>(task_scheduler->GetTask(task_id));
|
||||
set_task->Initialise(phys_comp.body_id, vel.velocity);
|
||||
task_scheduler->WaitForTask(task_id);
|
||||
}
|
||||
}
|
||||
|
||||
void HydraPhysicsSystem::StepPhysics(float delta_t)
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
|
||||
#include <box3d/box3d.h>
|
||||
|
||||
struct PhysicsVelocity
|
||||
{
|
||||
HydraID entity_id;
|
||||
glm::vec3 velocity;
|
||||
};
|
||||
|
||||
class HydraPhysicsSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
@@ -15,15 +21,17 @@ class HydraPhysicsSystem : public HydraSystem
|
||||
void Initialise() override;
|
||||
void Shutdown() override;
|
||||
void SetTransform(HydraID entity_id);
|
||||
void SetLinearVelocity(HydraID entity_id, glm::vec3 velocity);
|
||||
void StepPhysics(float delta_t);
|
||||
protected:
|
||||
void InitialiseComponent(HydraID entity_id) override;
|
||||
protected:
|
||||
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;
|
||||
std::queue<HydraID> m_bodies_to_set_transform;
|
||||
std::queue<PhysicsVelocity> m_bodies_to_set_velocity;
|
||||
|
||||
};
|
||||
|
||||
#endif /* HYDRAPHYSICSSYSTEM */
|
||||
|
||||
@@ -13,8 +13,8 @@ class HydraPointShadowSourceSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
virtual void Initialise() override;
|
||||
protected:
|
||||
void InitialiseComponent(HydraID entity_id) override;
|
||||
protected:
|
||||
void UpdateSystem(float delta_t_seconds) override;
|
||||
void DestroyComponent(HydraID entity_id) override;
|
||||
private:
|
||||
|
||||
@@ -14,8 +14,9 @@ class HydraSpotShadowSourceSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
virtual void Initialise() override;
|
||||
protected:
|
||||
void InitialiseComponent(HydraID entity_id) override;
|
||||
protected:
|
||||
|
||||
void UpdateSystem(float delta_t_seconds) override;
|
||||
void DestroyComponent(HydraID entity_id) override;
|
||||
private:
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#include "HydraTickActorsSystem.h"
|
||||
#include "../../actor/HydraActorManager.h"
|
||||
#include "../components/HydraTickComponent.h"
|
||||
#include "../HydraECS.h"
|
||||
|
||||
void HydraTickActorsSystem::FixedUpdate(float delta_t_seconds)
|
||||
{
|
||||
HydraActorManager* actor_manager = GetEngine()->ActorManager();
|
||||
HydraECS* ecs = GetEngine()->ECS();
|
||||
|
||||
|
||||
for(HydraID entity_id:Entities)
|
||||
{
|
||||
HydraTickComponent tick_comp = ecs->GetComponent<HydraTickComponent>(entity_id);
|
||||
if(tick_comp.fixed)
|
||||
{
|
||||
actor_manager->FixedTickActor(entity_id, delta_t_seconds);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HydraTickActorsSystem::UpdateSystem(float delta_t_seconds)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
#ifndef HYDRATICKACTORSSYSTEM
|
||||
#define HYDRATICKACTORSSYSTEM
|
||||
|
||||
#include "../../engine/HydraObject.h"
|
||||
#include "../HydraSystem.h"
|
||||
#include "../components/HydraLightComponent.h"
|
||||
#include <GLMIncludes.h>
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
|
||||
|
||||
|
||||
class HydraTickActorsSystem : public HydraSystem
|
||||
{
|
||||
public:
|
||||
void FixedUpdate(float delta_t_seconds);
|
||||
protected:
|
||||
void UpdateSystem(float delta_t_seconds) override;
|
||||
private:
|
||||
|
||||
|
||||
};
|
||||
#endif /* HYDRAFIXEDTICKACTORSSYSTEM */
|
||||
@@ -13,7 +13,6 @@
|
||||
|
||||
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;
|
||||
|
||||
@@ -10,11 +10,9 @@ class HydraTransformSystem : public HydraSystem
|
||||
|
||||
void UpdateTransform(HydraID actor_id, bool ignore_physics = false);
|
||||
void Initialise() override;
|
||||
|
||||
protected:
|
||||
|
||||
virtual void UpdateSystem(float delta_t_seconds) override;
|
||||
void InitialiseComponent(HydraID actor_id) override;
|
||||
protected:
|
||||
virtual void UpdateSystem(float delta_t_seconds) override;
|
||||
void FreeSystemResources() override;
|
||||
private:
|
||||
void _UpdateChild(HydraID parent_id, HydraID actor_id, glm::mat4 parent_transform);
|
||||
|
||||
Reference in New Issue
Block a user