From e3d37e3f8a06ecada5adb0839cbd36970ae79081 Mon Sep 17 00:00:00 2001 From: Confideo-IOM Date: Fri, 28 Aug 2026 16:36:25 +0100 Subject: [PATCH] Point lights --- HydraClient/source/HydraGame.cpp | 6 +- HydraEngine/source/HydraDefines.h | 4 +- .../ShaderFiles/deferred_output_shader.frag | 55 +++++++++++---- .../source/ShaderFiles/deferred_shader.frag | 2 +- HydraEngine/source/actor/HydraActor.cpp | 5 -- HydraEngine/source/actor/HydraActor.h | 2 +- .../source/actor/HydraActorManager.cpp | 23 ++++--- .../actor/HydraDirectionalLightActor.cpp | 4 +- HydraEngine/source/actor/HydraPlaneActor.cpp | 2 +- HydraEngine/source/actor/HydraPlayerActor.cpp | 2 +- .../source/actor/HydraTestCubeActor.cpp | 22 +++++- HydraEngine/source/actor/HydraTestCubeActor.h | 1 + .../source/actor/HydraTestLightActor.cpp | 6 +- .../source/actor/HydraTestLightActor.h | 1 + .../LightSpawner/HydraLightSpawnerActor.cpp | 21 +++++- .../LightSpawner/HydraLightSpawnerActor.h | 9 ++- .../LightSpawner/HydraSpawnedLightActor.cpp | 47 +++++++++---- .../LightSpawner/HydraSpawnedLightActor.h | 1 + .../actor/PlanetActor/HydraPlanetActor.cpp | 2 +- .../PlanetActor/HydraPlanetQuadActor.cpp | 2 +- .../source/buffer/HydraLightBufferManager.cpp | 1 - .../source/buffer/HydraMaterialBuffer.h | 2 +- .../buffer/HydraMaterialBufferManager.cpp | 64 ++++++++++++++++- .../buffer/HydraMaterialBufferManager.h | 5 +- HydraEngine/source/ecs/HydraComponentArray.h | 21 ++++-- .../source/ecs/HydraComponentManager.h | 14 +++- HydraEngine/source/ecs/HydraECS.h | 11 ++- HydraEngine/source/ecs/HydraSystem.cpp | 22 ++++-- HydraEngine/source/ecs/HydraSystem.h | 10 +-- HydraEngine/source/ecs/HydraSystemManager.h | 14 +++- .../components/HydraShadowCasterComponent.h | 9 +++ .../ecs/systems/HydraMaterialSystem.cpp | 46 ++----------- .../source/ecs/systems/HydraMaterialSystem.h | 4 +- .../source/ecs/systems/HydraPhysicsSystem.cpp | 19 ++++- .../systems/HydraPointShadowSourceSystem.cpp | 1 - .../ecs/systems/HydraShadowCasterSystem.h | 16 +++++ HydraEngine/source/engine/HydraEngine.cpp | 26 +++++-- HydraEngine/source/engine/HydraEngine.h | 4 +- HydraEngine/source/engine/HydraObject.cpp | 9 ++- .../source/pipeline/HydraShadowPipeline.cpp | 65 +++++++++--------- HydraEngine/source/renderer/HydraRenderer.cpp | 4 +- .../task/ecs/HydraDeleteComponentsTask.hpp | 27 ++++++++ .../ecs/HydraInitialiseComponentsTask.hpp | 1 + .../physics/HydraCreatePhysicsObjectTask.hpp | 3 +- .../physics/HydraDeletePhysicsObjectTask.h | 1 + .../HydraInitialisePhysicsWorldTask.hpp | 4 +- .../task/physics/HydraStepPhysicsTask.h | 11 +-- ...on => index-2026-08-28T07-59-00-0219.json} | 0 build/Debug/HydraClient.pdb | Bin 4517888 -> 6451200 bytes build/HydraClient.dir/Debug/HydraClient.ilk | Bin 1818032 -> 995191 bytes .../Debug/HydraClient.tlog/unsuccessfulbuild | 0 build/HydraClient.dir/Debug/vc143.pdb | Bin 798720 -> 831488 bytes build/HydraEngine/Debug/HydraEngine.exp | Bin 65477 -> 65791 bytes build/HydraEngine/Debug/HydraEngine.pdb | Bin 27455488 -> 40857600 bytes .../HydraEngine.dir/Debug/HydraEngine.ilk | Bin 29734846 -> 31390571 bytes .../Debug/HydraEngine.tlog/CL.command.1.tlog | Bin 98006 -> 98006 bytes .../Debug/HydraEngine.tlog/CL.read.1.tlog | Bin 3664498 -> 3670942 bytes .../Debug/HydraEngine.tlog/CL.write.1.tlog | Bin 149614 -> 247522 bytes .../HydraEngine.dir/Debug/vc143.pdb | Bin 3354624 -> 3493888 bytes build/linkerrors.txt | 11 +-- 60 files changed, 458 insertions(+), 184 deletions(-) create mode 100644 HydraEngine/source/ecs/components/HydraShadowCasterComponent.h create mode 100644 HydraEngine/source/ecs/systems/HydraShadowCasterSystem.h create mode 100644 HydraEngine/source/task/ecs/HydraDeleteComponentsTask.hpp rename build/.cmake/api/v1/reply/{index-2026-08-25T16-46-16-0515.json => index-2026-08-28T07-59-00-0219.json} (100%) create mode 100644 build/HydraClient.dir/Debug/HydraClient.tlog/unsuccessfulbuild diff --git a/HydraClient/source/HydraGame.cpp b/HydraClient/source/HydraGame.cpp index 4770b31..aa058e0 100644 --- a/HydraClient/source/HydraGame.cpp +++ b/HydraClient/source/HydraGame.cpp @@ -12,7 +12,7 @@ bool HydraGame::Initialise() GetEngine()->ActorManager()->InitialiseActor(m_spawner_id); GetEngine()->ActorManager()->SetPosition(m_spawner_id, glm::dvec3(0, 1.0, 0)); HydraLightSpawnerActor* actor = static_cast(GetEngine()->ActorManager()->GetActor(m_spawner_id)); - actor->SpawnSettings(2.0f, glm::vec3(0.0f, 2.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f), 10.0f, 0.0f, 20.0f); + actor->SpawnSettings(3.0f, glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f), 15.0f, 0.0f, 50.0f); actor->SetEnabled(true); @@ -35,12 +35,12 @@ bool HydraGame::Initialise() // m_cube_actor_id = GetEngine()->ActorManager()->CreateActor(); // GetEngine()->ActorManager()->InitialiseActor(m_cube_actor_id); // GetEngine()->ActorManager()->SetPosition(m_cube_actor_id, glm::dvec3(0, 1.0, 0)); - // GetEngine()->ActorManager()->SetLinearVelocity(m_cube_actor_id, glm::dvec3(0, 10.0, 0)); + // GetEngine()->ActorManager()->SetLinearVelocity(m_cube_actor_id, glm::vec3(0,20,0)); m_plane_actor_id = GetEngine()->ActorManager()->CreateActor(); GetEngine()->ActorManager()->InitialiseActor(m_plane_actor_id); GetEngine()->ActorManager()->SetPosition(m_plane_actor_id, glm::dvec3(0, 0, 0)); - GetEngine()->ActorManager()->SetOrientation(m_plane_actor_id, 0.0f, 0.0f, 0.2f); + GetEngine()->ActorManager()->SetOrientation(m_plane_actor_id, 0.0f, 0.0f, 0.0f); // m_plane_actor_id1 = GetEngine()->ActorManager()->CreateActor(); diff --git a/HydraEngine/source/HydraDefines.h b/HydraEngine/source/HydraDefines.h index e603018..2e8c260 100644 --- a/HydraEngine/source/HydraDefines.h +++ b/HydraEngine/source/HydraDefines.h @@ -45,7 +45,7 @@ const uint32_t MAX_DIRECTIONAL_SHADOWS = 10; const uint32_t MAX_SPOT_SHADOWS = 10; const uint32_t MAX_POINT_SHADOWS = 10; //const uint32_t SHADOW_MAP_SIZE = 1024; -const uint32_t DIRECTIONAL_SHADOW_MAP_SIZE = 4096; +const uint32_t DIRECTIONAL_SHADOW_MAP_SIZE = 2048; const uint32_t SPOT_SHADOW_MAP_SIZE = 1024; const uint32_t POINT_SHADOW_MAP_SIZE = 2048; @@ -65,7 +65,7 @@ enum class HYDRA_PHYSICS_SHAPE enum class HYDRA_RENDERABLE_TYPE { HYDRA_COLOUR = 1, - HYDRA_SHADOW, + HYDRA_SHADOW_CASTER, HYDRA_TRANSPARENT, HYDRA_LIGHTING, HYDRA_OUTPUT, diff --git a/HydraEngine/source/ShaderFiles/deferred_output_shader.frag b/HydraEngine/source/ShaderFiles/deferred_output_shader.frag index 4e09eb3..adb285e 100644 --- a/HydraEngine/source/ShaderFiles/deferred_output_shader.frag +++ b/HydraEngine/source/ShaderFiles/deferred_output_shader.frag @@ -232,7 +232,7 @@ vec3 DirectionalShading(vec3 normal, { float distance = length(light_pos - world_pos); - float attenuation = 1.0; + float attenuation = 3.5; vec3 radiance = diffuse * attenuation; @@ -251,10 +251,12 @@ vec3 PointShading(vec3 normal, float light_constant, float light_linear, float light_quadratic, + vec3 light_colour, vec3 world_pos, vec3 view_pos, float shadow_val) { + float distance = length(light_pos - world_pos); float attenuation = 1.0; @@ -263,7 +265,7 @@ vec3 PointShading(vec3 normal, vec3 light_dir = normalize(light_pos - world_pos); vec3 Lo = CalculatePBR(normal, view_pos, world_pos, light_dir, diffuse, radiance, roughness, metallic); - + Lo = Lo * light_colour; return Lo; } vec3 SpotShading(vec3 normal, @@ -339,9 +341,17 @@ float SampleCascadeShadow(vec4 frag_clip_space, sampler2DArray sampler_shadow_ma // check whether current frag pos is in shadow // float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0; // PCF - if(shadow_trans_idx < 3) + if(shadow_trans_idx < 1) { - bias = 0.00001; + bias = 0.0000005; + } + if(shadow_trans_idx < 2) + { + bias = 0.00005; + } + else if(shadow_trans_idx < 3) + { + bias = 0.00005; } else if(shadow_trans_idx == 3) { @@ -351,9 +361,6 @@ float SampleCascadeShadow(vec4 frag_clip_space, sampler2DArray sampler_shadow_ma { bias = 0.0005; } - - - float shadow = 0.0; vec2 texel_size = 1.0 / textureSize(sampler_shadow_map, 0).xy; if((frag_light_space.x >= 0.0)&&(frag_light_space.y >= 0.0) @@ -418,6 +425,12 @@ vec3 CalculateDirectionalShadow(vec4 world_pos, uint shadow_idx, vec3 normal, ve //measure the distance of the fragment from the light float frag_distance = abs(length(viewer_pos - world_pos.xyz)); + float back_face = dot(normal, light_dir); + if(back_face < 0) + { + return vec3(1); + } + uint shadow_trans_idx = 5; uint ignore_shadow = 0; //Work out which shadowmap is appropriate for this distance @@ -548,14 +561,22 @@ void main() float ao = 1; vec3 ambient = vec3(0.05) * diffuse.xyz * ao; vec3 Lo = ambient; + if(metal_rough[0] > 0) + { + uFragColor = vec4(diffuse.xyz * metal_rough[0], diffuse.a); + } + else + { for(int i = 0; i < ubo_per_frame.light_count; i ++) { mat4 model = model_matrix[lights[i].entity_id]; mat3 rot_mat = GetRotationOnlyMatrix(model); vec3 light_direction = normalize(rot_mat * vec3(0,0,1)); - - vec3 light_pos = GetPositionFromView(model); - light_pos = model[3].xyx; + vec4 light_pos_model_space = vec4(0,0,0,1); + light_pos_model_space = model * light_pos_model_space; + vec3 light_pos = light_pos_model_space.xyz; + //vec3 light_pos = GetPositionFromView(model); + //light_pos = model[3].xyx; if(lights[i].light_type == HYDRA_LIGHT_DIRECTIONAL) { Lo += DirectionalShading(normal, diffuse.xyz, rough, metal, lights[i].intensity, light_direction, light_pos, world_pos, ubo_per_frame.viewer_pos); @@ -563,6 +584,7 @@ void main() if(lights[i].shadow_caster == 1) { vec3 shadow = CalculateDirectionalShadow(vec4(world_pos, 1.0), lights[i].shadow_map_id, normal, light_direction, ubo_per_frame.viewer_pos); + Lo = Lo * shadow; } @@ -586,6 +608,7 @@ void main() lights[i].constant, lights[i].linear, lights[i].quadratic, + lights[i].diffuse.xyz, world_pos, ubo_per_frame.viewer_pos, shadow); @@ -626,11 +649,13 @@ void main() vec3 output_color = Lo; // HDR tonemapping - output_color = output_color / (output_color + vec3(1.0)); - // gamma correct - output_color = pow(output_color, vec3(1.0/2.1)); - - uFragColor = vec4(output_color, 1.0); + output_color = output_color / (output_color + vec3(1.0)); + // gamma correct + output_color = pow(output_color, vec3(1.0/2.1)); + uFragColor = vec4(output_color, 1.0); + } + + // float light = dot(lights[0].light_direction, normal); // uFragColor = vec4(diffuse.xyz * light,1); diff --git a/HydraEngine/source/ShaderFiles/deferred_shader.frag b/HydraEngine/source/ShaderFiles/deferred_shader.frag index 1194fe9..a698216 100644 --- a/HydraEngine/source/ShaderFiles/deferred_shader.frag +++ b/HydraEngine/source/ShaderFiles/deferred_shader.frag @@ -73,7 +73,7 @@ void main() } diffuse_out = diffuse_val; - metalic_rough_out = mat_rough_val; + metalic_rough_out = mat_rough_val; normal_out = vec4(normal_val,1); position_out = vs_out.vsWorldPos; } \ No newline at end of file diff --git a/HydraEngine/source/actor/HydraActor.cpp b/HydraEngine/source/actor/HydraActor.cpp index 094ad03..978dd74 100644 --- a/HydraEngine/source/actor/HydraActor.cpp +++ b/HydraEngine/source/actor/HydraActor.cpp @@ -2,8 +2,3 @@ #include "HydraActorManager.h" #include "../engine/HydraEngine.h" #include "../ecs/HydraECS.h" -void HydraActor::Delete() -{ - GetEngine()->ECS()->DestroyEntity(GetID()); - -} diff --git a/HydraEngine/source/actor/HydraActor.h b/HydraEngine/source/actor/HydraActor.h index dabae14..91f36ce 100644 --- a/HydraEngine/source/actor/HydraActor.h +++ b/HydraEngine/source/actor/HydraActor.h @@ -16,7 +16,7 @@ class CLASS_DEFINE HydraActor : public HydraObject std::vector m_children; std::vector m_component_types; uint32_t m_components_waiting = 0; - void Delete(); + friend class HydraActorManager; friend class HydraDeleteActorTask; protected: diff --git a/HydraEngine/source/actor/HydraActorManager.cpp b/HydraEngine/source/actor/HydraActorManager.cpp index 7339a53..92ce924 100644 --- a/HydraEngine/source/actor/HydraActorManager.cpp +++ b/HydraEngine/source/actor/HydraActorManager.cpp @@ -35,7 +35,7 @@ void HydraActorManager::DeleteActor(HydraID actorID) if(m_actors[actorID] != nullptr) { - m_actors[actorID]->Delete(); + GetEngine()->ECS()->DestroyEntity(actorID); _SetActorDeleted(actorID); } @@ -194,15 +194,22 @@ void HydraActorManager::SetLinearVelocity(HydraID actor_id, glm::vec3 velocity) void HydraActorManager::SetPositionAndOrientation(HydraID actorID, glm::dvec3 position, glm::vec3 euler_angles, bool ignore_physics) { HydraECS *ecs = GetEngine()->ECS(); - - HydraPositionComponent &pos_comp = ecs->GetComponent(actorID); - pos_comp.position = position; - pos_comp.orientation = glm::vec3(euler_angles.x,euler_angles.y,euler_angles.z); - - if(!pos_comp.needs_update) + if(ecs->HasComponent(actorID)) { - ecs->GetSystem()->UpdateTransform(actorID, ignore_physics); + HydraPositionComponent &pos_comp = ecs->GetComponent(actorID); + pos_comp.position = position; + pos_comp.orientation = glm::vec3(euler_angles.x,euler_angles.y,euler_angles.z); + + if(!pos_comp.needs_update) + { + ecs->GetSystem()->UpdateTransform(actorID, ignore_physics); + } } + else + { + std::cout << "HERE"; + } + } void HydraActorManager::SetScale(HydraID actor_id, glm::dvec3 scaling) diff --git a/HydraEngine/source/actor/HydraDirectionalLightActor.cpp b/HydraEngine/source/actor/HydraDirectionalLightActor.cpp index 5585387..c295f93 100644 --- a/HydraEngine/source/actor/HydraDirectionalLightActor.cpp +++ b/HydraEngine/source/actor/HydraDirectionalLightActor.cpp @@ -21,8 +21,8 @@ void HydraDirectionalLightActor::InitialiseComponents() HydraLightComponent light_comp = {}; HydraECS *ecs = GetEngine()->ECS(); - light_comp.diffuse = glm::vec4(1.0,0.8,0.6,1); - light_comp.intensity = 100000.0f; + light_comp.diffuse = glm::vec4(1.0f, 1.0f, 1.0f ,1.0f); + light_comp.intensity = 1000.0f; light_comp.light_type = static_cast(HYDRA_LIGHT_TYPE::HYDRA_LIGHT_DIRECTIONAL); light_comp.entity_id = GetID(); light_comp.shadow_caster =1; diff --git a/HydraEngine/source/actor/HydraPlaneActor.cpp b/HydraEngine/source/actor/HydraPlaneActor.cpp index f36e7e9..1f9d2d3 100644 --- a/HydraEngine/source/actor/HydraPlaneActor.cpp +++ b/HydraEngine/source/actor/HydraPlaneActor.cpp @@ -175,7 +175,7 @@ void HydraPlaneActor::_CreateMaterial() material.diffuse_texture_id = tex_id; material.diffuse_colour = glm::vec4(1, 1, 1, 1); - material.metalic_rough = glm::vec4(0, 0.5, 0.3, 1); + material.emmissive_metalic_rough = glm::vec4(0, 0.5, 0.3, 1); HydraID mat_id = engine->MaterialBufferManager()->CreateMaterial(material); HydraMaterialComponent mat_comp = {}; diff --git a/HydraEngine/source/actor/HydraPlayerActor.cpp b/HydraEngine/source/actor/HydraPlayerActor.cpp index 0db88b0..7e4337b 100644 --- a/HydraEngine/source/actor/HydraPlayerActor.cpp +++ b/HydraEngine/source/actor/HydraPlayerActor.cpp @@ -47,7 +47,7 @@ void HydraPlayerActor::HandleInput(float delta_t) bool move_right = GetEngine()->KeyPressed(HYDRA_KEY_CODES::HYDRA_KEY_D); HydraRenderSettings render_settings = GetEngine()->RenderSettings(); - float scale = 0.2f; + float scale = 1.0f; float x_angle = (change.x / render_settings.DisplayWidth) * -500 * delta_t * scale; float y_angle = (change.y / render_settings.DisplayHeight) * -500 * delta_t * scale; diff --git a/HydraEngine/source/actor/HydraTestCubeActor.cpp b/HydraEngine/source/actor/HydraTestCubeActor.cpp index ffbb4c3..c9672c0 100644 --- a/HydraEngine/source/actor/HydraTestCubeActor.cpp +++ b/HydraEngine/source/actor/HydraTestCubeActor.cpp @@ -8,6 +8,8 @@ #include "../ecs/components/HydraRenderableComponent.h" #include "../ecs/components/HydraMaterialComponent.h" #include "../ecs/components/HydraPhysicsComponent.h" +#include "../ecs/components/HydraShadowCasterComponent.h" +#include "../ecs/components/HydraLightComponent.h" #include "../buffer/HydraMaterialBufferManager.h" #include "../buffer/HydraTextureBufferManager.h" #include "../buffer/HydraMaterialBuffer.h" @@ -24,6 +26,7 @@ void HydraTestCubeActor::InitialiseComponents() _CreateMaterial(); _CreateMesh(); _CreateRenderableComponent(); + _CreateLightComponent(); } void HydraTestCubeActor::DeferredInitialiseComponents() @@ -174,7 +177,8 @@ void HydraTestCubeActor::_CreateMaterial() material.diffuse_texture_id = tex_id; material.diffuse_colour = glm::vec4(1, 1, 1, 1); - material.metalic_rough = glm::vec4(0, 0.5, 0.3, 1); + material.emmissive_metalic_rough = glm::vec4(0.0f, 0.5f, 0.3f, 1.0f); + HydraID mat_id = engine->MaterialBufferManager()->CreateMaterial(material); HydraMaterialComponent mat_comp = {}; @@ -199,7 +203,23 @@ void HydraTestCubeActor::_CreatePhysics() void HydraTestCubeActor::_CreateRenderableComponent() { HydraRenderableComponent render_comp; + HydraShadowCasterComponent shad_caster; HydraECS *ecs = GetEngine()->ECS(); render_comp.renderable_types.set((uint32_t)HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR, true); + render_comp.renderable_types.set((uint32_t)HYDRA_RENDERABLE_TYPE::HYDRA_SHADOW_CASTER, true); ecs->AddComponent(GetID(), render_comp); + ecs->AddComponent(GetID(), shad_caster); + } +void HydraTestCubeActor::_CreateLightComponent() +{ + HydraLightComponent light_comp = {}; + HydraECS *ecs = GetEngine()->ECS(); + + light_comp.diffuse = glm::vec4(1,1,1,1); + light_comp.intensity = 1000.0f; + light_comp.light_type = static_cast(HYDRA_LIGHT_TYPE::HYDRA_LIGHT_POINT); + light_comp.entity_id = GetID(); + + ecs->AddComponent(GetID(), light_comp); +} \ No newline at end of file diff --git a/HydraEngine/source/actor/HydraTestCubeActor.h b/HydraEngine/source/actor/HydraTestCubeActor.h index c2bba56..a77b277 100644 --- a/HydraEngine/source/actor/HydraTestCubeActor.h +++ b/HydraEngine/source/actor/HydraTestCubeActor.h @@ -18,6 +18,7 @@ class CLASS_DEFINE HydraTestCubeActor : public HydraActor void _CreateMaterial(); void _CreatePhysics(); void _CreateRenderableComponent(); + void _CreateLightComponent(); public: virtual void InitialiseComponents(); virtual void DeferredInitialiseComponents(); diff --git a/HydraEngine/source/actor/HydraTestLightActor.cpp b/HydraEngine/source/actor/HydraTestLightActor.cpp index f109ff1..906b579 100644 --- a/HydraEngine/source/actor/HydraTestLightActor.cpp +++ b/HydraEngine/source/actor/HydraTestLightActor.cpp @@ -7,6 +7,7 @@ #include "../ecs/components/HydraMeshComponent.h" #include "../ecs/components/HydraRenderableComponent.h" #include "../ecs/components/HydraMaterialComponent.h" +#include "../ecs/components/HydraLightComponent.h" #include "../buffer/HydraMaterialBufferManager.h" #include "../buffer/HydraTextureBufferManager.h" #include "../buffer/HydraMaterialBuffer.h" @@ -23,6 +24,7 @@ void HydraTestLightActor::InitialiseComponents() _CreateMaterial(); _CreateMesh(); _CreateRenderableComponent(); + } void HydraTestLightActor::DeferredInitialiseComponents() @@ -173,7 +175,7 @@ void HydraTestLightActor::_CreateMaterial() material.diffuse_texture_id = tex_id; material.diffuse_colour = glm::vec4(1, 1, 1, 1); - material.metalic_rough = glm::vec4(0, 0.5, 0.3, 1); + material.emmissive_metalic_rough = glm::vec4(0, 0.5, 0.3, 1); HydraID mat_id = engine->MaterialBufferManager()->CreateMaterial(material); HydraMaterialComponent mat_comp = {}; @@ -181,7 +183,6 @@ void HydraTestLightActor::_CreateMaterial() engine->ECS()->AddComponent(GetID(), mat_comp); } - void HydraTestLightActor::_CreateRenderableComponent() { HydraRenderableComponent render_comp; @@ -189,3 +190,4 @@ void HydraTestLightActor::_CreateRenderableComponent() render_comp.renderable_types.set((uint32_t)HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR, true); ecs->AddComponent(GetID(), render_comp); } + diff --git a/HydraEngine/source/actor/HydraTestLightActor.h b/HydraEngine/source/actor/HydraTestLightActor.h index 97a2ab1..3a89e9d 100644 --- a/HydraEngine/source/actor/HydraTestLightActor.h +++ b/HydraEngine/source/actor/HydraTestLightActor.h @@ -18,6 +18,7 @@ class CLASS_DEFINE HydraTestLightActor : public HydraActor void _CreateMesh(); void _CreateMaterial(); void _CreateRenderableComponent(); + public: virtual void InitialiseComponents(); virtual void DeferredInitialiseComponents(); diff --git a/HydraEngine/source/actor/LightSpawner/HydraLightSpawnerActor.cpp b/HydraEngine/source/actor/LightSpawner/HydraLightSpawnerActor.cpp index 2305943..e034ef2 100644 --- a/HydraEngine/source/actor/LightSpawner/HydraLightSpawnerActor.cpp +++ b/HydraEngine/source/actor/LightSpawner/HydraLightSpawnerActor.cpp @@ -24,11 +24,26 @@ void HydraLightSpawnerActor::FixedTick(float delta_t) actor_manager->InitialiseActor(actor_id); actor_manager->SetPosition(actor_id, pos_comp.position); actor_manager->SetLinearVelocity(actor_id, m_spawn_direction * m_spawn_velocity); - m_last_tick = current_tick; - + SpawnedActor actor = {}; + actor.actor_id = actor_id; + actor.spawned_time = current_tick; + m_spawned_actors.push(actor); + m_last_tick = current_tick; + + } + if(m_spawned_actors.size() > 0) + { + SpawnedActor actor = m_spawned_actors.front(); + long actor_spawned_time_ms = std::chrono::duration_cast(current_tick - actor.spawned_time).count(); + if(actor_spawned_time_ms > (m_spawn_duration * 1000.0f )) + { + GetEngine()->ActorManager()->DeleteActor(actor.actor_id); + m_spawned_actors.pop(); + } } - } + + } void HydraLightSpawnerActor::_CreatePosition() diff --git a/HydraEngine/source/actor/LightSpawner/HydraLightSpawnerActor.h b/HydraEngine/source/actor/LightSpawner/HydraLightSpawnerActor.h index 86de710..35b1a30 100644 --- a/HydraEngine/source/actor/LightSpawner/HydraLightSpawnerActor.h +++ b/HydraEngine/source/actor/LightSpawner/HydraLightSpawnerActor.h @@ -5,6 +5,13 @@ #include #include #include + +struct SpawnedActor +{ + HydraID actor_id; + std::chrono::time_point spawned_time; +}; + class CLASS_DEFINE HydraLightSpawnerActor : public HydraActor { public: @@ -30,7 +37,7 @@ class CLASS_DEFINE HydraLightSpawnerActor : public HydraActor float m_interval = 0.0f; bool m_enabled = false; std::chrono::time_point m_last_tick; - std::queue m_spawned_actors; + std::queue m_spawned_actors; }; diff --git a/HydraEngine/source/actor/LightSpawner/HydraSpawnedLightActor.cpp b/HydraEngine/source/actor/LightSpawner/HydraSpawnedLightActor.cpp index a4391ff..1d55cac 100644 --- a/HydraEngine/source/actor/LightSpawner/HydraSpawnedLightActor.cpp +++ b/HydraEngine/source/actor/LightSpawner/HydraSpawnedLightActor.cpp @@ -8,6 +8,7 @@ #include "../../ecs/components/HydraRenderableComponent.h" #include "../../ecs/components/HydraMaterialComponent.h" #include "../../ecs/components/HydraPhysicsComponent.h" +#include "../../ecs/components/HydraLightComponent.h" #include "../../buffer/HydraMaterialBufferManager.h" #include "../../buffer/HydraTextureBufferManager.h" #include "../../buffer/HydraMaterialBuffer.h" @@ -22,6 +23,7 @@ void HydraSpawnedLightActor::InitialiseComponents() _CreateMaterial(); _CreateMesh(); _CreateRenderableComponent(); + _CreateLightComponent(); } void HydraSpawnedLightActor::DeferredInitialiseComponents() @@ -46,9 +48,9 @@ void HydraSpawnedLightActor::_CreateMesh() mesh->vertexes.resize(24); mesh->indexes.resize(36); - float scale_x = 0.3f; - float scale_y = 0.3f; - float scale_z = 0.3f; + float scale_x = 0.1f; + float scale_y = 0.1f; + float scale_z = 0.1f; float min_x = -0.5f * scale_x; float min_y = -0.5f * scale_y; @@ -158,26 +160,41 @@ void HydraSpawnedLightActor::_CreateMesh() mesh_comp.mesh_state = HYDRA_STATE::Waiting; ecs->AddComponent(GetID(), mesh_comp); + } void HydraSpawnedLightActor::_CreateMaterial() { HydraEngine *engine = GetEngine(); - std::string filename = std::string(texture_base) + std::string("/DesignArea/DesignArea_Albedo.png"); + //std::string filename = std::string(texture_base) + std::string("/DesignArea/DesignArea_Albedo.png"); - HydraID tex_id = engine->TextureBufferManager()->LoadTexture(filename); + //HydraID tex_id = engine->TextureBufferManager()->LoadTexture(filename); HydraMaterialBuffer material = {}; + std::srand(std::time({})); // use current time as seed for random generator + const float red = static_cast(std::rand() % 2) + 0.1f; + const float green = static_cast(std::rand() % 2)+ 0.1f; + const float blue = static_cast(std::rand() % 2)+ 0.1f; - material.diffuse_texture_id = tex_id; - material.diffuse_colour = glm::vec4(1, 1, 1, 1); - material.metalic_rough = glm::vec4(0, 0.5, 0.3, 1); + + //material.diffuse_texture_id = tex_id; + material.diffuse_colour = glm::vec4(glm::normalize(glm::vec3(red, green, blue)), 1) * 10.0f; + material.emmissive_metalic_rough = glm::vec4(10.0f, 0.5f, 0.2f, 1.0f); HydraID mat_id = engine->MaterialBufferManager()->CreateMaterial(material); HydraMaterialComponent mat_comp = {}; mat_comp.material_id = mat_id; engine->ECS()->AddComponent(GetID(), mat_comp); + HydraLightComponent light_comp = {}; + HydraECS *ecs = GetEngine()->ECS(); + + light_comp.diffuse = glm::vec4(glm::normalize(glm::vec3(red, green, blue)), 1); + light_comp.intensity = 100.0f; + light_comp.light_type = static_cast(HYDRA_LIGHT_TYPE::HYDRA_LIGHT_POINT); + light_comp.entity_id = GetID(); + + ecs->AddComponent(GetID(), light_comp); } void HydraSpawnedLightActor::_CreatePhysics() @@ -188,9 +205,9 @@ void HydraSpawnedLightActor::_CreatePhysics() phys_comp.phyics_type = HYDRA_PHYSICS_TYPE::HYDRA_RIGID_BODY; phys_comp.physics_shape = HYDRA_PHYSICS_SHAPE::HYDRA_PHYSICS_BOX; - phys_comp.depth = 0.3f; - phys_comp.height = 0.3f; - phys_comp.width = 0.3f; + phys_comp.depth = 0.1f; + phys_comp.height = 0.1f; + phys_comp.width = 0.1f; engine->ECS()->AddComponent(GetID(), phys_comp); } @@ -198,6 +215,12 @@ void HydraSpawnedLightActor::_CreateRenderableComponent() { HydraRenderableComponent render_comp; HydraECS *ecs = GetEngine()->ECS(); - render_comp.renderable_types.set((uint32_t)HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR, true); + render_comp.renderable_types.set((uint32_t)HYDRA_RENDERABLE_TYPE::HYDRA_COLOUR, true); ecs->AddComponent(GetID(), render_comp); } + +void HydraSpawnedLightActor::_CreateLightComponent() +{ + +} + diff --git a/HydraEngine/source/actor/LightSpawner/HydraSpawnedLightActor.h b/HydraEngine/source/actor/LightSpawner/HydraSpawnedLightActor.h index 3f59c0b..4925db2 100644 --- a/HydraEngine/source/actor/LightSpawner/HydraSpawnedLightActor.h +++ b/HydraEngine/source/actor/LightSpawner/HydraSpawnedLightActor.h @@ -16,6 +16,7 @@ class CLASS_DEFINE HydraSpawnedLightActor : public HydraActor void _CreateMaterial(); void _CreatePhysics(); void _CreateRenderableComponent(); + void _CreateLightComponent(); public: void InitialiseComponents() override; void DeferredInitialiseComponents() override; diff --git a/HydraEngine/source/actor/PlanetActor/HydraPlanetActor.cpp b/HydraEngine/source/actor/PlanetActor/HydraPlanetActor.cpp index 8a41851..5afb400 100644 --- a/HydraEngine/source/actor/PlanetActor/HydraPlanetActor.cpp +++ b/HydraEngine/source/actor/PlanetActor/HydraPlanetActor.cpp @@ -174,7 +174,7 @@ void HydraPlanetActor::_CreateMaterial() material.diffuse_texture_id = tex_id; material.diffuse_colour = glm::vec4(1, 1, 1, 1); - material.metalic_rough = glm::vec4(0, 0.5, 0.3, 1); + material.emmissive_metalic_rough = glm::vec4(0, 0.5, 0.3, 1); HydraID mat_id = engine->MaterialBufferManager()->CreateMaterial(material); HydraMaterialComponent mat_comp = {}; diff --git a/HydraEngine/source/actor/PlanetActor/HydraPlanetQuadActor.cpp b/HydraEngine/source/actor/PlanetActor/HydraPlanetQuadActor.cpp index a5c7657..8803b18 100644 --- a/HydraEngine/source/actor/PlanetActor/HydraPlanetQuadActor.cpp +++ b/HydraEngine/source/actor/PlanetActor/HydraPlanetQuadActor.cpp @@ -173,7 +173,7 @@ void HydraPlanetQuadActor::_CreateMaterial() material.diffuse_texture_id = tex_id; material.diffuse_colour = glm::vec4(1, 1, 1, 1); - material.metalic_rough = glm::vec4(0, 0.5, 0.3, 1); + material.emmissive_metalic_rough = glm::vec4(0, 0.5, 0.3, 1); HydraID mat_id = engine->MaterialBufferManager()->CreateMaterial(material); HydraMaterialComponent mat_comp = {}; diff --git a/HydraEngine/source/buffer/HydraLightBufferManager.cpp b/HydraEngine/source/buffer/HydraLightBufferManager.cpp index 0ea2da4..70ebf13 100644 --- a/HydraEngine/source/buffer/HydraLightBufferManager.cpp +++ b/HydraEngine/source/buffer/HydraLightBufferManager.cpp @@ -50,7 +50,6 @@ void HydraLightBufferManager::AddLight(HydraLightComponent light) { return; } - auto it = std::find(m_light_lookup.begin(), m_light_lookup.end(), light.entity_id); if(it == m_light_lookup.end()) diff --git a/HydraEngine/source/buffer/HydraMaterialBuffer.h b/HydraEngine/source/buffer/HydraMaterialBuffer.h index e8f5911..f845de3 100644 --- a/HydraEngine/source/buffer/HydraMaterialBuffer.h +++ b/HydraEngine/source/buffer/HydraMaterialBuffer.h @@ -7,7 +7,7 @@ struct HydraMaterialBuffer { glm::vec4 diffuse_colour = {0, 0, 0, 0}; //0 - 16 - glm::vec4 metalic_rough = {0, 0, 0, 0}; //28 - 12 + glm::vec4 emmissive_metalic_rough = {0, 0, 0, 0}; //28 - 12 uint32_t diffuse_texture_id = INVALID_HYDRA_ID; //32 - 4 uint32_t metallic_rough_texture_id = INVALID_HYDRA_ID; //36 - 4 uint32_t normal_texture_id = INVALID_HYDRA_ID; //40 - 4 diff --git a/HydraEngine/source/buffer/HydraMaterialBufferManager.cpp b/HydraEngine/source/buffer/HydraMaterialBufferManager.cpp index 069af1d..c7b1bc1 100644 --- a/HydraEngine/source/buffer/HydraMaterialBufferManager.cpp +++ b/HydraEngine/source/buffer/HydraMaterialBufferManager.cpp @@ -1,4 +1,16 @@ #include "HydraMaterialBufferManager.h" +#include "../engine/HydraEngine.h" +#include "../ecs/HydraECS.h" +#include "../ecs/components/HydraMaterialComponent.h" + +#include "../buffer/HydraMaterialBufferManager.h" +#include "../buffer/HydraTextureBufferManager.h" + +#include "../scheduler/HydraTaskScheduler.h" +#include "../task/buffer/HydraCreateGPUBufferTask.hpp" +#include "../task/buffer/HydraDeleteGPUBufferTask.hpp" +#include "../task/buffer/HydraUpdateWholeGPUBufferTask.hpp" +#include "../actor/HydraActorManager.h" void HydraMaterialBufferManager::Intialise() { @@ -7,10 +19,33 @@ void HydraMaterialBufferManager::Intialise() { m_available_material_ids.push(mat_idx); } + + HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); + + HydraID create_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); + HydraCreateGPUBufferTask *task = static_cast(task_scheduler->GetTask(create_gpu_buffer_task_id)); + task->Intialise("MaterialBuffer", 1, MAX_MATERIALS * sizeof(HydraMaterialBuffer), &m_material_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER); + task_scheduler->WaitForTask(create_gpu_buffer_task_id); + + create_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); + task = static_cast(task_scheduler->GetTask(create_gpu_buffer_task_id)); + task->Intialise("TextureBuffer", 1, MAX_TEXTURES * sizeof(uint64_t), &m_texture_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER); + task_scheduler->WaitForTask(create_gpu_buffer_task_id); } void HydraMaterialBufferManager::Shutdown() { + HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); + + HydraID delete_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); + HydraDeleteGPUBufferTask *task = static_cast(task_scheduler->GetTask(delete_gpu_buffer_task_id)); + task->Intialise(m_material_buffer_id); + task_scheduler->WaitForTask(delete_gpu_buffer_task_id); + + delete_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); + task = static_cast(task_scheduler->GetTask(delete_gpu_buffer_task_id)); + task->Intialise(m_texture_buffer_id); + task_scheduler->WaitForTask(delete_gpu_buffer_task_id); } HydraID HydraMaterialBufferManager::CreateMaterial(const HydraMaterialBuffer &material) @@ -26,10 +61,35 @@ HydraID HydraMaterialBufferManager::CreateMaterial(const HydraMaterialBuffer &ma return mat_id; } - - +void HydraMaterialBufferManager::DeleteMaterial(HydraID material_id) +{ + std::lock_guard lock(m_mutex); + if(material_id < MAX_MATERIALS) + { + m_material[material_id] = {}; + m_available_material_ids.push(material_id); + } +} void *HydraMaterialBufferManager::GetMaterialBuffer() { return &m_material[0]; } + +void HydraMaterialBufferManager::UpdateBuffer() +{ + void* buffer = GetEngine()->MaterialBufferManager()->GetMaterialBuffer(); + + HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); + + HydraID update_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); + HydraUpdateWholeGPUBufferTask *task = static_cast(task_scheduler->GetTask(update_buffer_task_id)); + task->Intialise(m_material_buffer_id, buffer); + task_scheduler->WaitForTask(update_buffer_task_id); + + buffer = GetEngine()->TextureBufferManager()->GetTextureBuffer(); + update_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); + task = static_cast(task_scheduler->GetTask(update_buffer_task_id)); + task->Intialise(m_texture_buffer_id, buffer); + task_scheduler->WaitForTask(update_buffer_task_id); +} diff --git a/HydraEngine/source/buffer/HydraMaterialBufferManager.h b/HydraEngine/source/buffer/HydraMaterialBufferManager.h index edd7cd5..f856e10 100644 --- a/HydraEngine/source/buffer/HydraMaterialBufferManager.h +++ b/HydraEngine/source/buffer/HydraMaterialBufferManager.h @@ -19,9 +19,12 @@ class HydraMaterialBufferManager : public HydraObject void Intialise(); void Shutdown(); HydraID CreateMaterial(const HydraMaterialBuffer& material); + void DeleteMaterial(HydraID material_id); void* GetMaterialBuffer(); - + void UpdateBuffer(); private: + uint32_t m_material_buffer_id =0; + uint32_t m_texture_buffer_id =0; std::mutex m_mutex; std::queue m_available_material_ids; std::vector m_material; diff --git a/HydraEngine/source/ecs/HydraComponentArray.h b/HydraEngine/source/ecs/HydraComponentArray.h index 0280117..0a750a5 100644 --- a/HydraEngine/source/ecs/HydraComponentArray.h +++ b/HydraEngine/source/ecs/HydraComponentArray.h @@ -15,7 +15,7 @@ class IHydraComponentArray }; template -class HydraComponentArray : public IHydraComponentArray +class HydraComponentArray : public IHydraComponentArray, HydraObject { private: std::array m_components; @@ -28,11 +28,12 @@ class HydraComponentArray : public IHydraComponentArray void RemoveComponent(HydraID entity_id) { std::lock_guard lock(m_mutex); + if(m_entity_to_component.find(entity_id) == m_entity_to_component.end()) { return; } - + DebugLog("COMPONENT DELETED:" + std::to_string(entity_id) + "\n"); HydraID component_index = m_entity_to_component[entity_id]; HydraID last_component_index = m_component_count -1; HydraID last_entity_id = m_component_to_entity[last_component_index]; @@ -41,15 +42,21 @@ class HydraComponentArray : public IHydraComponentArray { m_components[component_index] = m_components[last_component_index]; m_entity_to_component[last_entity_id] = component_index; + m_component_to_entity.erase(last_component_index); + m_component_to_entity[component_index] = last_entity_id; m_components[last_component_index] = {}; + DebugLog("COMPONENT MOVED:" + std::to_string(last_entity_id) + "\n"); } else { - m_components[component_index] = {}; + m_components[last_component_index] = {}; + m_entity_to_component.erase(entity_id); + m_component_to_entity.erase(last_component_index); } - m_entity_to_component.erase(entity_id); - m_component_to_entity.erase(component_index); + + + m_component_count--; } @@ -85,6 +92,10 @@ class HydraComponentArray : public IHydraComponentArray { RemoveComponent(entity_id); } + T const * const GetComponents() + { + return &m_components[0]; + } }; #endif /* HYDRACOMPONENTARRAY */ diff --git a/HydraEngine/source/ecs/HydraComponentManager.h b/HydraEngine/source/ecs/HydraComponentManager.h index ebc404b..1e8cfd6 100644 --- a/HydraEngine/source/ecs/HydraComponentManager.h +++ b/HydraEngine/source/ecs/HydraComponentManager.h @@ -19,12 +19,14 @@ class HydraComponentManager :public HydraObject std::shared_ptr> _GetComponentArray() { std::string type_name = std::string(typeid(T).name()); - + if(m_component_types.find(type_name) == m_component_types.end()) + { + std::cout << "Error"; + } assert(m_component_types.find(type_name) != m_component_types.end() && "Component type does not exist"); return std::static_pointer_cast>(m_component_arrays[type_name]); } public: - template ComponentTypeID RegisterComponentType() { @@ -58,7 +60,13 @@ class HydraComponentManager :public HydraObject { return _GetComponentArray()->GetComponent(entity_id); } - + template + T const * const GetComponents() + { + return _GetComponentArray()->GetComponents(); + } + + template bool HasComponent(HydraID entity_id) { diff --git a/HydraEngine/source/ecs/HydraECS.h b/HydraEngine/source/ecs/HydraECS.h index 9fe5fd6..f99b920 100644 --- a/HydraEngine/source/ecs/HydraECS.h +++ b/HydraEngine/source/ecs/HydraECS.h @@ -59,7 +59,7 @@ public: { // Remove the component from the entity m_component_manager->RemoveComponent(entity_id); - + std::string(typeid(T).name()); // Get the current signature, remove the component from it and update auto signature = m_entity_manager->GetSignature(entity_id); signature.set(m_component_manager->GetComponentTypeID(), false); @@ -79,6 +79,11 @@ public: { return m_component_manager->GetComponent(entity_id); } + template + T &GetComponents() + { + return m_component_manager->GetComponents(); + } template std::shared_ptr RegisterSystem() @@ -100,6 +105,10 @@ public: { m_system_manager->InitialiseComponents(); } + void DeleteComponents() + { + m_system_manager->DeleteComponents(); + } }; #endif /* HYDRAECS */ diff --git a/HydraEngine/source/ecs/HydraSystem.cpp b/HydraEngine/source/ecs/HydraSystem.cpp index 7889904..4fc950e 100644 --- a/HydraEngine/source/ecs/HydraSystem.cpp +++ b/HydraEngine/source/ecs/HydraSystem.cpp @@ -6,11 +6,12 @@ void HydraSystem::Update(float delta_t_seconds) UpdateSystem(delta_t_seconds); } + void HydraSystem::Shutdown() { for(HydraID entity_id : Entities) { - DestroyComponents(entity_id); + DestroyComponent(entity_id); } FreeSystemResources(); } @@ -23,13 +24,20 @@ void HydraSystem::InitialiseComponents() } EntitiesToCreate.clear(); } - -void HydraSystem::DestroyComponents(HydraID actor_id) +void HydraSystem::DeleteComponents() { - auto it = std::find(Entities.begin(), Entities.end(), actor_id); - if(it == Entities.end()) + for(auto it = EntitiesToDelete.begin(); it != EntitiesToDelete.end(); ++it) { - return; + HydraID actor_id = *it; + DestroyComponent(actor_id); + } + EntitiesToDelete.clear(); +} + +void HydraSystem::DeleteComponent(HydraID actor_id) +{ + if(std::find(Entities.begin(), Entities.end(), actor_id)!= Entities.end()) + { + DestroyComponent(actor_id); } - DestroyComponent(actor_id); } diff --git a/HydraEngine/source/ecs/HydraSystem.h b/HydraEngine/source/ecs/HydraSystem.h index f2381a3..e31a8aa 100644 --- a/HydraEngine/source/ecs/HydraSystem.h +++ b/HydraEngine/source/ecs/HydraSystem.h @@ -10,17 +10,19 @@ class HydraSystem : public HydraObject public: std::set Entities; std::set EntitiesToCreate; + std::set EntitiesToDelete; void Update(float delta_t_seconds); - void InitialiseComponents(); + void InitialiseComponents(); + void DeleteComponents(); + void DeleteComponent(HydraID actor_id); 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 UpdateSystem(float delta_t_seconds) = 0; virtual void DestroyComponent(HydraID actor_id) {}; virtual void FreeSystemResources(){}; }; diff --git a/HydraEngine/source/ecs/HydraSystemManager.h b/HydraEngine/source/ecs/HydraSystemManager.h index defd7b2..dc5a32b 100644 --- a/HydraEngine/source/ecs/HydraSystemManager.h +++ b/HydraEngine/source/ecs/HydraSystemManager.h @@ -75,7 +75,8 @@ public: // Entity signature does not match system signature - erase from set else { - system->DestroyComponents(entity_id); + //system->DestroyComponents(entity_id); + //system->DeleteComponent(entity_id); system->Entities.erase(entity_id); system->EntitiesToCreate.erase(entity_id); } @@ -87,11 +88,20 @@ public: for (auto const& pair : m_systems) { auto const& system = pair.second; - system->DestroyComponents(entity_id); + system->DeleteComponent(entity_id); + //system->EntitiesToDelete.insert(entity_id); system->Entities.erase(entity_id); system->EntitiesToCreate.erase(entity_id); } } + void DeleteComponents() + { + for (auto const& pair : m_systems) + { + auto const& system = pair.second; + system->DeleteComponents(); + } + } void InitialiseComponents() { for (auto const& pair : m_systems) diff --git a/HydraEngine/source/ecs/components/HydraShadowCasterComponent.h b/HydraEngine/source/ecs/components/HydraShadowCasterComponent.h new file mode 100644 index 0000000..e1273c2 --- /dev/null +++ b/HydraEngine/source/ecs/components/HydraShadowCasterComponent.h @@ -0,0 +1,9 @@ +#ifndef HYDRASHADOWCASTERCOMPONENT +#define HYDRASHADOWCASTERCOMPONENT +#include "../../engine/HydraEngine.h" + +struct HydraShadowCasterComponent +{ + +}; +#endif /* HYDRASHADOWCASTERCOMPONENT */ diff --git a/HydraEngine/source/ecs/systems/HydraMaterialSystem.cpp b/HydraEngine/source/ecs/systems/HydraMaterialSystem.cpp index c213900..0235aae 100644 --- a/HydraEngine/source/ecs/systems/HydraMaterialSystem.cpp +++ b/HydraEngine/source/ecs/systems/HydraMaterialSystem.cpp @@ -16,58 +16,22 @@ void HydraMaterialSystem::Initialise() { - HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); - HydraID create_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); - HydraCreateGPUBufferTask *task = static_cast(task_scheduler->GetTask(create_gpu_buffer_task_id)); - task->Intialise("MaterialBuffer", 1, MAX_MATERIALS * sizeof(HydraMaterialBuffer), &m_material_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER); - task_scheduler->WaitForTask(create_gpu_buffer_task_id); - - create_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); - task = static_cast(task_scheduler->GetTask(create_gpu_buffer_task_id)); - task->Intialise("TextureBuffer", 1, MAX_TEXTURES * sizeof(uint64_t), &m_texture_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER); - task_scheduler->WaitForTask(create_gpu_buffer_task_id); } void HydraMaterialSystem::InitialiseComponent(HydraID entity_id) { } -void HydraMaterialSystem::FreeSystemResources() -{ - HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); - - HydraID delete_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); - HydraDeleteGPUBufferTask *task = static_cast(task_scheduler->GetTask(delete_gpu_buffer_task_id)); - task->Intialise(m_material_buffer_id); - task_scheduler->WaitForTask(delete_gpu_buffer_task_id); - - delete_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); - task = static_cast(task_scheduler->GetTask(delete_gpu_buffer_task_id)); - task->Intialise(m_texture_buffer_id); - task_scheduler->WaitForTask(delete_gpu_buffer_task_id); -} void HydraMaterialSystem::UpdateSystem(float delta_t_seconds) { - _WriteToGPU(); + GetEngine()->MaterialBufferManager()->UpdateBuffer(); } - -void HydraMaterialSystem::_WriteToGPU() +void HydraMaterialSystem::DestroyComponent(HydraID entity_id) { - void* buffer = GetEngine()->MaterialBufferManager()->GetMaterialBuffer(); - - HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); - - HydraID update_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); - HydraUpdateWholeGPUBufferTask *task = static_cast(task_scheduler->GetTask(update_buffer_task_id)); - task->Intialise(m_material_buffer_id, buffer); - task_scheduler->WaitForTask(update_buffer_task_id); - - buffer = GetEngine()->TextureBufferManager()->GetTextureBuffer(); - update_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); - task = static_cast(task_scheduler->GetTask(update_buffer_task_id)); - task->Intialise(m_texture_buffer_id, buffer); - task_scheduler->WaitForTask(update_buffer_task_id); + HydraMaterialComponent mat_comp = GetEngine()->ECS()->GetComponent(entity_id); + GetEngine()->MaterialBufferManager()->DeleteMaterial(mat_comp.material_id); } + diff --git a/HydraEngine/source/ecs/systems/HydraMaterialSystem.h b/HydraEngine/source/ecs/systems/HydraMaterialSystem.h index 99b39f4..fa8030a 100644 --- a/HydraEngine/source/ecs/systems/HydraMaterialSystem.h +++ b/HydraEngine/source/ecs/systems/HydraMaterialSystem.h @@ -14,9 +14,11 @@ class HydraMaterialSystem : public HydraSystem public: void Initialise() override; void InitialiseComponent(HydraID entity_id) override; + protected: - void FreeSystemResources() override; + virtual void UpdateSystem(float delta_t_seconds); + void DestroyComponent(HydraID entity_id) override; private: void _WriteToGPU(); HydraID m_material_buffer_id = INVALID_HYDRA_ID; diff --git a/HydraEngine/source/ecs/systems/HydraPhysicsSystem.cpp b/HydraEngine/source/ecs/systems/HydraPhysicsSystem.cpp index cd923fe..b55fcdd 100644 --- a/HydraEngine/source/ecs/systems/HydraPhysicsSystem.cpp +++ b/HydraEngine/source/ecs/systems/HydraPhysicsSystem.cpp @@ -8,6 +8,7 @@ #include "../../task/physics/HydraGetPhysicsUpdatesTask.hpp" #include "../../task/physics/HydraStepPhysicsTask.h" #include "../../task/physics/HydraSetPhysicsLinearVelocity.hpp" +#include "../../task/physics/HydraDeletePhysicsObjectTask.h" #include "../../ecs/HydraECS.h" #include "../../ecs/components/HydraPhysicsComponent.h" #include "../../ecs/components/HydraPositionComponent.h" @@ -86,12 +87,27 @@ void HydraPhysicsSystem::InitialiseComponent(HydraID entity_id) set_task->Initialise(body_id, pos_comp.position, glm::quat(pos_comp.orientation)); task_scheduler->WaitForTask(task_id); phys_comp.initialised = true; + DebugLog("PHYSICS CREATED:" + std::to_string(entity_id) + "\n"); } void HydraPhysicsSystem::DestroyComponent(HydraID entity_id) { - + HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); + HydraPhysicsComponent& phys_comp = GetEngine()->ECS()->GetComponent(entity_id); + + if(phys_comp.initialised) + { + HydraID task_id = task_scheduler->CreateTask(HydraThreadAffinity::Physics); + HydraDeletePhysicsObjectTask *task = static_cast(task_scheduler->GetTask(task_id)); + task->Initialise(phys_comp.body_id); + task_scheduler->WaitForTask(task_id); + } + else + { + std::cout << "here"; + } + DebugLog("PHYSICS DELETED:" + std::to_string(entity_id) + "\n"); } void HydraPhysicsSystem::UpdateSystem(float delta_t_seconds) @@ -101,6 +117,7 @@ void HydraPhysicsSystem::UpdateSystem(float delta_t_seconds) { HydraID entity_id = m_bodies_to_set_transform.front(); m_bodies_to_set_transform.pop(); + HydraPhysicsComponent& phys_comp = GetEngine()->ECS()->GetComponent(entity_id); HydraPositionComponent& pos_comp = GetEngine()->ECS()->GetComponent(entity_id); diff --git a/HydraEngine/source/ecs/systems/HydraPointShadowSourceSystem.cpp b/HydraEngine/source/ecs/systems/HydraPointShadowSourceSystem.cpp index 54f3d6f..7ed5f0f 100644 --- a/HydraEngine/source/ecs/systems/HydraPointShadowSourceSystem.cpp +++ b/HydraEngine/source/ecs/systems/HydraPointShadowSourceSystem.cpp @@ -68,7 +68,6 @@ void HydraPointShadowSourceSystem::_UpdateShadowMap(HydraID entity_id) float view_size = 4.0f; float view_near = 0.1f; float view_far = 100.0f; - glm::vec3 camera_pos = GetEngine()->Camera()->GetPosition(); diff --git a/HydraEngine/source/ecs/systems/HydraShadowCasterSystem.h b/HydraEngine/source/ecs/systems/HydraShadowCasterSystem.h new file mode 100644 index 0000000..ece0b35 --- /dev/null +++ b/HydraEngine/source/ecs/systems/HydraShadowCasterSystem.h @@ -0,0 +1,16 @@ +#ifndef HYDRASHADOWCASTERSYSTEM +#define HYDRASHADOWCASTERSYSTEM + +#include "../../engine/HydraObject.h" +#include "../HydraSystem.h" +#include +#include + +class HydraShadowCasterSystem : public HydraSystem +{ + public: + + protected: + void UpdateSystem(float delta_t_seconds) override {} +}; +#endif /* HYDRASHADOWCASTERSYSTEM */ diff --git a/HydraEngine/source/engine/HydraEngine.cpp b/HydraEngine/source/engine/HydraEngine.cpp index f1adb32..18f7421 100644 --- a/HydraEngine/source/engine/HydraEngine.cpp +++ b/HydraEngine/source/engine/HydraEngine.cpp @@ -26,6 +26,7 @@ #include "../ecs/systems/HydraPointShadowSourceSystem.h" #include "../ecs/systems/HydraPhysicsSystem.h" #include "../ecs/systems/HydraTickActorsSystem.h" +#include "../ecs/systems/HydraShadowCasterSystem.h" #include "../ecs/components/HydraPositionComponent.h" #include "../ecs/components/HydraMeshComponent.h" @@ -38,6 +39,7 @@ #include "../ecs/components/HydraPointShadowSourceComponent.h" #include "../ecs/components/HydraPhysicsComponent.h" #include "../ecs/components/HydraTickComponent.h" +#include "../ecs/components/HydraShadowCasterComponent.h" #include "../camera/HydraCamera.h" #include "../actor/HydraActorManager.h" @@ -58,6 +60,7 @@ #include "../task/ecs/HydraUpdateSystemTask.hpp" #include "../task/ecs/HydraInitialiseComponentsTask.hpp" +#include "../task/ecs/HydraDeleteComponentsTask.hpp" #include "../task/buffer/HydraShutdownBufferManagerTask.hpp" #include "../task/buffer/HydraInitialiseTextureManagerTask.hpp" #include "../task/buffer/HydraInitialiseShadowBufferTask.hpp" @@ -210,7 +213,7 @@ void HydraEngine::_CreateManagers() void HydraEngine::_InitialiseManagers() { - m_task_scheduler->Initialise(1); + m_task_scheduler->Initialise(4); HydraID create_window_task_id = m_task_scheduler->CreateTask(HydraThreadAffinity::Render); m_task_scheduler->WaitForTask(create_window_task_id); @@ -245,6 +248,7 @@ void HydraEngine::_InitialiseSystems() m_ecs->RegisterComponentType(); m_ecs->RegisterComponentType(); m_ecs->RegisterComponentType(); + m_ecs->RegisterComponentType(); m_mesh_system = m_ecs->RegisterSystem(); m_transform_system = m_ecs->RegisterSystem(); @@ -256,6 +260,7 @@ void HydraEngine::_InitialiseSystems() m_point_shadow_system = m_ecs->RegisterSystem(); m_physics_system = m_ecs->RegisterSystem(); m_tick_system = m_ecs->RegisterSystem(); + m_shadow_caster_system = m_ecs->RegisterSystem(); HydraSignature mesh_sig; HydraSignature trans_sig; @@ -267,6 +272,7 @@ void HydraEngine::_InitialiseSystems() HydraSignature point_shadow_sig; HydraSignature physics_sig; HydraSignature tick_sig; + HydraSignature shadow_caster_sig; mesh_sig.set(m_ecs->GetComponentType(),true); trans_sig.set(m_ecs->GetComponentType(),true); @@ -293,6 +299,8 @@ void HydraEngine::_InitialiseSystems() tick_sig.set(m_ecs->GetComponentType(), true); + shadow_caster_sig.set(m_ecs->GetComponentType(), true); + m_ecs->SetSystemSignature(mesh_sig); m_ecs->SetSystemSignature(trans_sig); m_ecs->SetSystemSignature(render_sig); @@ -303,9 +311,10 @@ void HydraEngine::_InitialiseSystems() m_ecs->SetSystemSignature(point_shadow_sig); m_ecs->SetSystemSignature(physics_sig); m_ecs->SetSystemSignature(tick_sig); + m_ecs->SetSystemSignature(shadow_caster_sig); } - void HydraEngine::_UpdateSystems() + void HydraEngine::_UpdateSystems(bool fixed_update) { //Update physics system with any changes from the transform system @@ -350,8 +359,10 @@ void HydraEngine::_InitialiseSystems() m_task_scheduler->StartTask(update_spot_shadow_id); m_task_scheduler->StartTask(update_point_shadow_id); m_task_scheduler->WaitForBarrier(shadow_barrier); - - m_tick_system->FixedUpdate(m_fixed_delta_t); + if(fixed_update) + { + m_tick_system->FixedUpdate(m_fixed_delta_t); + } m_shadow_buffer_manager->UpdateShadowBuffer(); } @@ -426,6 +437,9 @@ void HydraEngine::_GameLoop() fpsFrameCount++; + HydraID delete_components_id = m_task_scheduler->CreateTask(HydraThreadAffinity::General); + m_task_scheduler->WaitForTask(delete_components_id); + HydraID processInputID = m_task_scheduler->CreateTask(HydraThreadAffinity::Render, barrierID); HydraProcessInputTask* m_input_task = static_cast(m_task_scheduler->GetTask(processInputID)); m_input_task->Initialise(fixed_tick); @@ -441,11 +455,13 @@ void HydraEngine::_GameLoop() if(fixed_tick) { + m_game->FixedUpdate(m_delta_t); + } m_game->Update(m_delta_t); - _UpdateSystems(); + _UpdateSystems(fixed_tick); diff --git a/HydraEngine/source/engine/HydraEngine.h b/HydraEngine/source/engine/HydraEngine.h index be490b2..ab57a53 100644 --- a/HydraEngine/source/engine/HydraEngine.h +++ b/HydraEngine/source/engine/HydraEngine.h @@ -31,6 +31,7 @@ class HydraShadowBufferManager; class HydraPointShadowSourceSystem; class HydraPhysicsSystem; class HydraTickActorsSystem; +class HydraShadowCasterSystem; class CLASS_DEFINE HydraEngine : public HydraObject { @@ -74,7 +75,7 @@ private: void _CreateManagers(); void _InitialiseManagers(); void _InitialiseSystems(); - void _UpdateSystems(); + void _UpdateSystems(bool fixed_update); void _GameLoop(); void _Shutdown(); @@ -108,6 +109,7 @@ private: std::shared_ptr m_point_shadow_system; std::shared_ptr m_physics_system; std::shared_ptr m_tick_system; + std::shared_ptr m_shadow_caster_system; bool m_running = true; float m_delta_t = 0.0f; float m_fixed_delta_t = 0.0f; diff --git a/HydraEngine/source/engine/HydraObject.cpp b/HydraEngine/source/engine/HydraObject.cpp index 7fc1a5e..7369e0e 100644 --- a/HydraEngine/source/engine/HydraObject.cpp +++ b/HydraEngine/source/engine/HydraObject.cpp @@ -8,7 +8,14 @@ HydraEngine *const HydraObject::GetEngine() void HydraObject::DebugLog(std::string log_entry) { - std::cout << log_entry + "\r\n"; + + +#ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */ + std::cout << log_entry + "\r\n"; +#elif defined(_WIN32) || defined(WIN32) /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems */ + OutputDebugString(log_entry.c_str()); +#endif + } void HydraObject::ClearLog() diff --git a/HydraEngine/source/pipeline/HydraShadowPipeline.cpp b/HydraEngine/source/pipeline/HydraShadowPipeline.cpp index 401f157..d387cc5 100644 --- a/HydraEngine/source/pipeline/HydraShadowPipeline.cpp +++ b/HydraEngine/source/pipeline/HydraShadowPipeline.cpp @@ -14,7 +14,9 @@ #include "../ecs/systems/HydraDirectionalShadowSourceSystem.h" #include "../ecs/systems/HydraSpotShadowSourceSystem.h" #include "../ecs/systems/HydraPointShadowSourceSystem.h" +#include "../ecs/systems/HydraShadowCasterSystem.h" #include "../ecs/components/HydraLightComponent.h" +#include "../ecs/components/HydraRenderableComponent.h" #include "../mesh/StandardVertex.h" #include "../actor/HydraActorManager.h" #include "../actor/HydraOutputActor.h" @@ -34,74 +36,75 @@ void HydraShadowPipeline::Shutdown() void HydraShadowPipeline::Render() { - - + glEnable(GL_DEPTH_TEST); // Depth testing must be active glDepthMask(GL_TRUE); // Depth buffer must be writable glDepthFunc(GL_LESS); - + _RenderDirectionalShadowMaps(); _RenderSpotShadowMaps(); _RenderPointShadowMaps(); - } void HydraShadowPipeline::_RenderPointShadowMaps() { - HydraECS *ecs = GetEngine()->ECS(); - std::shared_ptr render_system = ecs->GetSystem(); + HydraECS *ecs = GetEngine()->ECS(); + std::shared_ptr render_system = ecs->GetSystem(); std::shared_ptr shadow_system = ecs->GetSystem(); glViewport(0, 0, POINT_SHADOW_MAP_SIZE, POINT_SHADOW_MAP_SIZE); + for (HydraID entity_id : shadow_system->Entities) { - HydraPointShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent(entity_id); - HydraLightComponent light_comp = GetEngine()->ECS()->GetComponent(entity_id); - - _UpdateUBO(light_comp.shadow_map_id); - glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id); + HydraPointShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent(entity_id); + HydraLightComponent light_comp = GetEngine()->ECS()->GetComponent(entity_id); - float depth_value = 1.0f; - glClear(GL_DEPTH_BUFFER_BIT); + _UpdateUBO(light_comp.shadow_map_id); + glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id); - m_render_stages[POINT_RENDER_STAGE]->Render(render_system->Entities, INVALID_HYDRA_ID); - glBindFramebuffer(GL_FRAMEBUFFER, 0); + float depth_value = 1.0f; + glClear(GL_DEPTH_BUFFER_BIT); + + m_render_stages[POINT_RENDER_STAGE]->Render(render_system->Entities, INVALID_HYDRA_ID); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } } - void HydraShadowPipeline::_RenderDirectionalShadowMaps() { - HydraECS *ecs = GetEngine()->ECS(); - std::shared_ptr render_system = ecs->GetSystem(); + HydraECS *ecs = GetEngine()->ECS(); + std::shared_ptr render_system = ecs->GetSystem(); std::shared_ptr shadow_system = ecs->GetSystem(); glViewport(0, 0, DIRECTIONAL_SHADOW_MAP_SIZE, DIRECTIONAL_SHADOW_MAP_SIZE); + for (HydraID entity_id : shadow_system->Entities) { - HydraDirectionalShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent(entity_id); - HydraLightComponent light_comp = GetEngine()->ECS()->GetComponent(entity_id); - _UpdateUBO(light_comp.shadow_map_id); - - glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id); + HydraDirectionalShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent(entity_id); + HydraLightComponent light_comp = GetEngine()->ECS()->GetComponent(entity_id); + _UpdateUBO(light_comp.shadow_map_id); - float depth_value = 1.0f; - glClearNamedFramebufferfv(shad_comp.frame_buffer_id, GL_DEPTH, 0, &depth_value); - m_render_stages[DIRECTIONAL_RENDER_STAGE]->Render(render_system->Entities, INVALID_HYDRA_ID); - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id); + + float depth_value = 1.0f; + glClearNamedFramebufferfv(shad_comp.frame_buffer_id, GL_DEPTH, 0, &depth_value); + + m_render_stages[DIRECTIONAL_RENDER_STAGE]->Render(render_system->Entities, INVALID_HYDRA_ID); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } } void HydraShadowPipeline::_RenderSpotShadowMaps() { - HydraECS *ecs = GetEngine()->ECS(); - std::shared_ptr render_system = ecs->GetSystem(); + HydraECS *ecs = GetEngine()->ECS(); + std::shared_ptr render_system = ecs->GetSystem(); std::shared_ptr shadow_system = ecs->GetSystem(); glViewport(0, 0, SPOT_SHADOW_MAP_SIZE, SPOT_SHADOW_MAP_SIZE); + for (HydraID entity_id : shadow_system->Entities) { HydraSpotShadowSourceComponent shad_comp = GetEngine()->ECS()->GetComponent(entity_id); HydraLightComponent light_comp = GetEngine()->ECS()->GetComponent(entity_id); _UpdateUBO(light_comp.shadow_map_id); - + glBindFramebuffer(GL_FRAMEBUFFER, shad_comp.frame_buffer_id); float depth_value = 1.0f; @@ -273,7 +276,6 @@ void HydraShadowPipeline::_CreateSpotRenderStage() m_render_stages[SPOT_RENDER_STAGE] = render_stage; } - void HydraShadowPipeline::_UpdateUBO(uint32_t shadow_idx) { HydraBufferManager *buffer_manager = GetEngine()->BufferManager(); @@ -288,7 +290,6 @@ void HydraShadowPipeline::_BindFrameBufferAttachments(HydraID entity_id) glBindTextureUnit(0, 0); } - void HydraShadowPipeline::_CreateUBOs() { HydraBufferManager *buffer_manager = GetEngine()->BufferManager(); diff --git a/HydraEngine/source/renderer/HydraRenderer.cpp b/HydraEngine/source/renderer/HydraRenderer.cpp index 3730916..e048017 100644 --- a/HydraEngine/source/renderer/HydraRenderer.cpp +++ b/HydraEngine/source/renderer/HydraRenderer.cpp @@ -26,8 +26,8 @@ void HydraRenderer::Initialise(HydraRenderSettings render_settings) glEnable(GL_DEPTH_TEST); glEnable(GL_DEBUG_OUTPUT); - glfwSwapInterval(1); - glDebugMessageCallback(MessageCallback, 0); + glfwSwapInterval(0); + // glDebugMessageCallback(MessageCallback, 0); } } diff --git a/HydraEngine/source/task/ecs/HydraDeleteComponentsTask.hpp b/HydraEngine/source/task/ecs/HydraDeleteComponentsTask.hpp new file mode 100644 index 0000000..47ebfe7 --- /dev/null +++ b/HydraEngine/source/task/ecs/HydraDeleteComponentsTask.hpp @@ -0,0 +1,27 @@ +#ifndef HYDRADELETECOMPONENTSTASK +#define HYDRADELETECOMPONENTSTASK + + +#include "../HydraTask.h" +#include "../../engine/HydraEngine.h" +#include "../../ecs/HydraECS.h" +#include + + +class HydraDeleteComponentsTask : public HydraTask +{ + private: + + protected: + public: + virtual void Process() override + { + + // GetEngine()->ECS()->DeleteComponents(); + } + + +}; + + +#endif /* HYDRADELETECOMPONENTSTASK */ diff --git a/HydraEngine/source/task/ecs/HydraInitialiseComponentsTask.hpp b/HydraEngine/source/task/ecs/HydraInitialiseComponentsTask.hpp index a3ab3ad..44105ad 100644 --- a/HydraEngine/source/task/ecs/HydraInitialiseComponentsTask.hpp +++ b/HydraEngine/source/task/ecs/HydraInitialiseComponentsTask.hpp @@ -14,6 +14,7 @@ class HydraInitialiseComponentsTask : public HydraTask public: virtual void Process() override { + GetEngine()->ECS()->InitialiseComponents(); } diff --git a/HydraEngine/source/task/physics/HydraCreatePhysicsObjectTask.hpp b/HydraEngine/source/task/physics/HydraCreatePhysicsObjectTask.hpp index 775df52..c0e071e 100644 --- a/HydraEngine/source/task/physics/HydraCreatePhysicsObjectTask.hpp +++ b/HydraEngine/source/task/physics/HydraCreatePhysicsObjectTask.hpp @@ -57,9 +57,10 @@ public: b3Pos pos = {}; shapeDef.density = 1.0f; - shapeDef.baseMaterial.restitution = 0.4f; + shapeDef.baseMaterial.restitution = 0.6f; b3CreateHullShape(*m_body_id, &shapeDef, &box.base ); + DebugLog("B3LOG " + std::to_string(m_entity_id) + " BODY " + std::to_string(m_body_id->index1) + "\n"); } void Initialise(b3WorldId world_id, HydraPhysicsComponent physics_comp, b3BodyId* body_id, HydraID entity_id) diff --git a/HydraEngine/source/task/physics/HydraDeletePhysicsObjectTask.h b/HydraEngine/source/task/physics/HydraDeletePhysicsObjectTask.h index 8e68d7e..4a912a6 100644 --- a/HydraEngine/source/task/physics/HydraDeletePhysicsObjectTask.h +++ b/HydraEngine/source/task/physics/HydraDeletePhysicsObjectTask.h @@ -20,6 +20,7 @@ public: void Process() override { b3DestroyBody(m_body_id); + DebugLog("B3 DELETE " + std::to_string(m_body_id.index1) + "\n"); } void Initialise(b3BodyId body_id) diff --git a/HydraEngine/source/task/physics/HydraInitialisePhysicsWorldTask.hpp b/HydraEngine/source/task/physics/HydraInitialisePhysicsWorldTask.hpp index 6fe27c9..a59a693 100644 --- a/HydraEngine/source/task/physics/HydraInitialisePhysicsWorldTask.hpp +++ b/HydraEngine/source/task/physics/HydraInitialisePhysicsWorldTask.hpp @@ -20,9 +20,9 @@ public: void Process() override { b3WorldDef world_def = b3DefaultWorldDef(); - world_def.workerCount = 1; + world_def.workerCount = 4; world_def.enableSleep = true; - + world_def.enableContinuous = true; *m_world_id = b3CreateWorld( &world_def ); diff --git a/HydraEngine/source/task/physics/HydraStepPhysicsTask.h b/HydraEngine/source/task/physics/HydraStepPhysicsTask.h index cff4ca3..f1e7cae 100644 --- a/HydraEngine/source/task/physics/HydraStepPhysicsTask.h +++ b/HydraEngine/source/task/physics/HydraStepPhysicsTask.h @@ -24,22 +24,23 @@ public: b3BodyEvents events = b3World_GetBodyEvents(m_world_id); HydraTaskScheduler* task_scheduler = GetEngine()->TaskScheduler(); - HydraID barrier_id = task_scheduler->CreateBarrier(); + // 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); + 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->StartTask(task_id); + task_scheduler->WaitForTask(task_id); } - task_scheduler->WaitForBarrier(barrier_id); + //task_scheduler->WaitForBarrier(barrier_id); } void Initialise(b3WorldId world_id, float delta_t_seconds) { diff --git a/build/.cmake/api/v1/reply/index-2026-08-25T16-46-16-0515.json b/build/.cmake/api/v1/reply/index-2026-08-28T07-59-00-0219.json similarity index 100% rename from build/.cmake/api/v1/reply/index-2026-08-25T16-46-16-0515.json rename to build/.cmake/api/v1/reply/index-2026-08-28T07-59-00-0219.json diff --git a/build/Debug/HydraClient.pdb b/build/Debug/HydraClient.pdb index ce1a19c5af8bff9ba506aabf11c35ca358d21625..6e30b8362af99f0a2f0f092a4ae291e7bd060e85 100644 GIT binary patch delta 239472 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

PY%zO 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%0A-=LS_ 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 delta 185609 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