Split improvemnts before tess shader

This commit is contained in:
Confideo-IOM
2026-09-26 18:40:34 +01:00
parent 5ded63d3f4
commit 6e1a531f94
29 changed files with 282 additions and 201 deletions
@@ -3,6 +3,7 @@
#include "../../engine/HydraEngine.h"
#include "../../actor/HydraActorManager.h"
#include "../../task/HydraTask.h"
#include "../../scheduler/HydraTaskScheduler.h"
#include "../../ecs/HydraECS.h"
#include "../../ecs/components/HydraPositionComponent.h"
#include "../../ecs/components/HydraMeshComponent.h"
@@ -14,31 +15,44 @@
#include "../../buffer/HydraMaterialBuffer.h"
#include "../../mesh/HydraMeshManager.h"
#include "../../mesh/HydraMesh.h"
#include "../../task/planet/HydraCheckPlanetResolutionTask.hpp"
void HydraPlanetActor::FixedTick(float delta_t)
{
HydraID player_id = GetEngine()->GetPossessedPlayer();
HydraPositionComponent pos_comp = GetEngine()->ECS()->GetComponent<HydraPositionComponent>(player_id);
HydraActorManager* actor_manager = GetEngine()->ActorManager();
HydraECS* ecs = GetEngine()->ECS();
HydraTaskScheduler* task_scheduler = GetEngine()->TaskScheduler();
if(task_scheduler->BarrierComplete(m_update_barrier))
{
HydraPlanetQuadActor* quad0 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[0]));
HydraPlanetQuadActor* quad1 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[1]));
HydraPlanetQuadActor* quad2 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[2]));
HydraPlanetQuadActor* quad3 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[3]));
HydraPlanetQuadActor* quad4 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[4]));
HydraPlanetQuadActor* quad5 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[5]));
m_update_barrier = task_scheduler->CreateBarrier();
HydraID task_id = task_scheduler->CreateTask<HydraCheckPlanetResolutionTask>(HydraThreadAffinity::General, m_update_barrier);
HydraCheckPlanetResolutionTask* task = static_cast<HydraCheckPlanetResolutionTask*>(task_scheduler->GetTask(task_id));
task->Initialise(m_quads);
task_scheduler->StartTask(task_id);
// HydraID player_id = GetEngine()->GetPossessedPlayer();
// HydraPositionComponent pos_comp = GetEngine()->ECS()->GetComponent<HydraPositionComponent>(player_id);
// HydraActorManager* actor_manager = GetEngine()->ActorManager();
// HydraECS* ecs = GetEngine()->ECS();
quad0->CheckResolution(pos_comp.position);
quad1->CheckResolution(pos_comp.position);
quad2->CheckResolution(pos_comp.position);
quad3->CheckResolution(pos_comp.position);
quad4->CheckResolution(pos_comp.position);
quad5->CheckResolution(pos_comp.position);
// HydraPlanetQuadActor* quad0 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[0]));
// HydraPlanetQuadActor* quad1 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[1]));
// HydraPlanetQuadActor* quad2 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[2]));
// HydraPlanetQuadActor* quad3 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[3]));
// HydraPlanetQuadActor* quad4 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[4]));
// HydraPlanetQuadActor* quad5 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[5]));
// quad0->CheckResolution(pos_comp.position);
// quad1->CheckResolution(pos_comp.position);
// quad2->CheckResolution(pos_comp.position);
// quad3->CheckResolution(pos_comp.position);
// quad4->CheckResolution(pos_comp.position);
// quad5->CheckResolution(pos_comp.position);
}
}
void HydraPlanetActor::InitialiseComponents()
{
m_quads.resize(6);
m_update_barrier = GetEngine()->TaskScheduler()->CreateBarrier();
// HydraECS* ecs = GetEngine()->ECS();
// HydraID entity_id = ecs->CreateEntity();
_CreatePosition();
@@ -11,7 +11,8 @@ class CLASS_DEFINE HydraPlanetActor : public HydraActor
HydraID m_material_component = INVALID_HYDRA_ID;
HydraID m_position_component = INVALID_HYDRA_ID;
HydraID m_mesh_component = INVALID_HYDRA_ID;
HydraID m_quads[6];
std::vector<HydraID> m_quads;
HydraID m_update_barrier = INVALID_HYDRA_ID;
protected:
void _CreatePosition();
void _CreateMesh();
@@ -58,8 +58,8 @@ void HydraPlanetQuadActor::CheckResolution(glm::dvec3 player_position)
double distance_to_quad = glm::length(player_position - m_centre);
// might need to bias this so it splits sooner and merges later
if (distance_to_quad < m_quad_dimension)
{
if ((distance_to_quad < m_quad_dimension)&& (m_quad_dimension > 64))
{
should_split = true;
}
if(distance_to_quad > m_quad_dimension * 1.1f)
@@ -111,6 +111,7 @@ HydraPlanetQuadActor::~HydraPlanetQuadActor()
{
GetEngine()->ActorManager()->DeleteActor(m_center_actor);
}
}
void HydraPlanetQuadActor::_MergeQuads()
@@ -129,8 +130,8 @@ glm::vec3 HydraPlanetQuadActor::_ProjectSphere(glm::dvec4 vert_in, glm::dmat4 tr
fnl.SetFractalType(FastNoiseLite::FractalType::FractalType_Ridged);
fnl.SetSeed(341411);
fnl.SetFrequency(0.00009);
fnl.SetFractalOctaves(8);
fnl.SetFractalOctaves(15);
fnl.SetFractalLacunarity(2.1);
float noise = fnl.GetNoise(vert.x, vert.y, vert.z);
vert = glm::normalize(vert) * ((m_planet_diameter / 2.0) + (noise * 500.0f));
@@ -154,7 +155,9 @@ glm::dvec3 HydraPlanetQuadActor::_ProjectCentre(glm::vec3 vert_in, glm::dmat4 tr
fnl.SetFractalType(FastNoiseLite::FractalType::FractalType_Ridged);
fnl.SetSeed(341411);
fnl.SetFrequency(0.00009);
fnl.SetFractalOctaves(8);
fnl.SetFractalOctaves(15);
fnl.SetFractalLacunarity(2.1);
float noise = fnl.GetNoise(vert.x, vert.y, vert.z);
@@ -204,7 +207,7 @@ void HydraPlanetQuadActor::_CreateMesh()
HydraMeshManager *mesh_manager = GetEngine()->MeshManager();
HydraID mesh_id = mesh_manager->CreateMesh();
HydraMesh *mesh = mesh_manager->GetMesh(mesh_id);
HydraMaterialComponent mat_comp = GetEngine()->ECS()->GetComponent<HydraMaterialComponent>(GetID());
HydraPositionComponent pos_comp = GetEngine()->ECS()->GetComponent<HydraPositionComponent>(GetID());
@@ -325,11 +328,12 @@ void HydraPlanetQuadActor::_CreateMesh()
mesh_comp.mesh_state = HYDRA_STATE::Waiting;
ecs->AddComponent<HydraMeshComponent>(GetID(), mesh_comp);
HydraRenderableComponent& render_comp = GetEngine()->ECS()->GetComponent<HydraRenderableComponent>(GetID());
render_comp.active = true;
}
void HydraPlanetQuadActor::_CreateMaterial()
{
HydraEngine *engine = GetEngine();
std::string filename = std::string(texture_base) + std::string("/DesignArea/DesignArea_Albedo_white.png");
@@ -374,4 +378,5 @@ void HydraPlanetQuadActor::_CreateRenderableComponent()
render_comp.renderable_types.set((uint32_t)HYDRA_RENDERABLE_TYPE::HYDRA_SHADOW_CASTER, true);
ecs->AddComponent<HydraRenderableComponent>(GetID(), render_comp);
ecs->AddComponent<HydraShadowCasterComponent>(GetID(), shad_caster);
render_comp.active = false;
}
@@ -51,6 +51,7 @@ void HydraMeshManager::DeleteMesh(HydraID mesh_id)
if(mesh_id < m_meshes.size())
{
m_meshes[mesh_id].vertexes.clear();
m_meshes[mesh_id].indexes.clear();
m_meshes[mesh_id].mesh_id = INVALID_HYDRA_ID;
}
}
@@ -12,16 +12,16 @@
#include <iostream>
#include <GLMIncludes.h>
void HydraRenderStage::Initialise(std::string vertex_shader_file,
std::string fragment_shader_file,
std::string geometry_shader_file,
HydraShaderBinding shader_binding,
uint32_t framebuffer_id,
std::vector<uint32_t> textures,
bool enable_culling,
uint32_t cull_face,
bool depth_enable,
HYDRA_RENDERABLE_TYPE renderable_type)
void HydraRenderStage::Initialise(std::string vertex_shader_file,
std::string fragment_shader_file,
std::string geometry_shader_file,
HydraShaderBinding shader_binding,
uint32_t framebuffer_id,
std::vector<uint32_t> textures,
bool enable_culling,
uint32_t cull_face,
bool depth_enable,
HYDRA_RENDERABLE_TYPE renderable_type)
{
m_framebuffer_id = framebuffer_id;
m_renderable_type = static_cast<uint32_t>(renderable_type);
@@ -31,17 +31,17 @@ void HydraRenderStage::Initialise(std::string vertex_shader_file,
m_cull = enable_culling;
m_program = glCreateProgram();
m_cull_face = cull_face;
if(vertex_shader_file.length() > 0)
if (vertex_shader_file.length() > 0)
{
m_vertex_shader = _LoadShader(vertex_shader_file, GL_VERTEX_SHADER);
m_vertex_shader = _LoadShader(vertex_shader_file, GL_VERTEX_SHADER);
glAttachShader(m_program, m_vertex_shader);
}
if(fragment_shader_file.length() > 0)
if (fragment_shader_file.length() > 0)
{
m_fragment_shader = _LoadShader(fragment_shader_file, GL_FRAGMENT_SHADER);
glAttachShader(m_program, m_fragment_shader);
}
if(geometry_shader_file.length() > 0)
if (geometry_shader_file.length() > 0)
{
m_geometry_shader = _LoadShader(geometry_shader_file, GL_GEOMETRY_SHADER);
glAttachShader(m_program, m_geometry_shader);
@@ -49,23 +49,24 @@ void HydraRenderStage::Initialise(std::string vertex_shader_file,
glLinkProgram(m_program);
int success;
glGetProgramiv(m_program, GL_LINK_STATUS, &success);
glGetProgramiv(m_program, GL_LINK_STATUS, &success);
if (!success) {
// 2. Get the log length (optional but recommended)
int logLength;
glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &logLength);
// 3. Retrieve and print the error log
char* infoLog = new char[logLength];
glGetProgramInfoLog(m_program, logLength, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
// 4. Clean up allocated memory
delete[] infoLog;
}
if (!success)
{
// 2. Get the log length (optional but recommended)
int logLength;
glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &logLength);
// 3. Retrieve and print the error log
char *infoLog = new char[logLength];
glGetProgramInfoLog(m_program, logLength, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n"
<< infoLog << std::endl;
// 4. Clean up allocated memory
delete[] infoLog;
}
}
void HydraRenderStage::ShutDown()
@@ -75,22 +76,22 @@ void HydraRenderStage::ShutDown()
glDeleteProgram(m_program);
}
void HydraRenderStage::Render(std::set<HydraID>& entities, uint32_t framebuffer_id)
void HydraRenderStage::Render(std::set<HydraID> &entities, uint32_t framebuffer_id)
{
HydraECS* ecs = GetEngine()->ECS();
if(framebuffer_id != INVALID_HYDRA_ID)
HydraECS *ecs = GetEngine()->ECS();
if (framebuffer_id != INVALID_HYDRA_ID)
{
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id);
}
//glDrawBuffers(m_rb_attachments.size(), &m_rb_attachments[0]);
HydraVertexBufferManager* vert_buffer_mananger = GetEngine()->VertexBufferManager();
// glDrawBuffers(m_rb_attachments.size(), &m_rb_attachments[0]);
HydraVertexBufferManager *vert_buffer_mananger = GetEngine()->VertexBufferManager();
glUseProgram(m_program);
_BindBuffers();
_BindTextures();
HydraSignature signature = {};
signature.set(m_renderable_type, true);
if(m_cull)
if (m_cull)
{
glEnable(GL_CULL_FACE);
glCullFace(m_cull_face);
@@ -100,31 +101,34 @@ void HydraRenderStage::Render(std::set<HydraID>& entities, uint32_t framebuffer_
glDisable(GL_CULL_FACE);
}
if(m_depth_enable)
if (m_depth_enable)
{
glEnable(GL_DEPTH_TEST);
}
else
{
{
glDisable(GL_DEPTH_TEST);
}
for(const auto& entity_id : entities )
for (const auto &entity_id : entities)
{
HydraRenderableComponent render_comp = ecs->GetComponent<HydraRenderableComponent>(entity_id);
if(((render_comp.renderable_types & signature) == signature) && (render_comp.active))
if (((render_comp.renderable_types & signature) == signature) && (render_comp.active))
{
HydraMeshComponent mesh_comp = ecs->GetComponent<HydraMeshComponent>(entity_id);
if(mesh_comp.mesh_state == HYDRA_STATE::Ready)
if (ecs->HasComponent<HydraMeshComponent>(entity_id))
{
HydraVertexBuffer& vertex_buffer = vert_buffer_mananger->GetVertexBuffer(mesh_comp.vertex_buffer_id);
HydraMeshComponent mesh_comp = ecs->GetComponent<HydraMeshComponent>(entity_id);
if (mesh_comp.mesh_state == HYDRA_STATE::Ready)
{
HydraVertexBuffer &vertex_buffer = vert_buffer_mananger->GetVertexBuffer(mesh_comp.vertex_buffer_id);
glBindVertexArray(vertex_buffer.vao);
glDrawElements(GL_TRIANGLES, vertex_buffer.triangle_count, GL_UNSIGNED_INT, (void*)0 );
glBindVertexArray(0);
glBindVertexArray(vertex_buffer.vao);
glDrawElements(GL_TRIANGLES, vertex_buffer.triangle_count, GL_UNSIGNED_INT, (void *)0);
}
}
}
}
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
@@ -134,10 +138,10 @@ void HydraRenderStage::Render(std::set<HydraID> &entities)
}
uint32_t HydraRenderStage::_LoadShader(std::string filename, uint32_t shader_type)
{
{
std::string shader_source = _LoadShaderSource(filename);
const char* src = shader_source.c_str();
const char *src = shader_source.c_str();
GLuint shader = glCreateShader(shader_type);
int length = shader_source.length();
int success;
@@ -146,59 +150,57 @@ uint32_t HydraRenderStage::_LoadShader(std::string filename, uint32_t shader_typ
glShaderSource(shader, 1, &src, &length);
glCompileShader(shader);
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if(!success)
if (!success)
{
glGetShaderInfoLog(shader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n"
<< infoLog << std::endl;
};
return shader;
}
std::string HydraRenderStage::_LoadShaderSource(std::string filename)
{
{
std::ifstream file(filename);
if (!file.is_open()) {
if (!file.is_open())
{
std::cerr << "Failed to open shader file: " << filename << std::endl;
return "";
}
std::stringstream buffer;
buffer << file.rdbuf();
return buffer.str();
}
void HydraRenderStage::_BindBuffers()
{
HydraBufferManager* buffer_manager = GetEngine()->BufferManager();
HydraBufferManager *buffer_manager = GetEngine()->BufferManager();
for(uint32_t bind_idx = 0; bind_idx <m_shader_binding.block_name.size(); bind_idx++)
for (uint32_t bind_idx = 0; bind_idx < m_shader_binding.block_name.size(); bind_idx++)
{
HydraBuffer buffer = buffer_manager->GetBuffer(m_shader_binding.buffer_id[bind_idx]);
switch(m_shader_binding.buffer_type[bind_idx])
{
case HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER:
{
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, m_shader_binding.binding_point[bind_idx], buffer.gpu_buffer_id);
break;
}
case HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER:
{
glBindBufferBase(GL_UNIFORM_BUFFER, m_shader_binding.binding_point[bind_idx], buffer.gpu_buffer_id);
break;
}
}
switch (m_shader_binding.buffer_type[bind_idx])
{
case HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER:
{
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, m_shader_binding.binding_point[bind_idx], buffer.gpu_buffer_id);
break;
}
case HYDRA_BUFFER_TYPE::HYDRA_UBO_BUFFER:
{
glBindBufferBase(GL_UNIFORM_BUFFER, m_shader_binding.binding_point[bind_idx], buffer.gpu_buffer_id);
break;
}
}
}
}
void HydraRenderStage::_BindTextures()
{
uint32_t active_texture = 0;
for(auto texture:m_textures)
for (auto texture : m_textures)
{
glBindTexture(GL_TEXTURE_2D, texture);
glActiveTexture(GL_TEXTURE0 + active_texture);
@@ -66,27 +66,22 @@ void HydraTaskScheduler::Shutdown()
HydraID HydraTaskScheduler::_SaveTask(HydraTask *task)
{
if (m_avaialble_task_ids.size() > 0)
{
HydraID id = m_avaialble_task_ids.front();
m_avaialble_task_ids.pop_front();
if(id > m_tasks.size())
{
DebugLog("INVALID TASK");
}
task->m_taskID = id;
m_tasks[id] = task;
return id;
}
else
{
DebugLog("Create Task Fail");
}
return INVALID_HYDRA_ID;
}
@@ -135,6 +130,19 @@ void HydraTaskScheduler::ProcessTask()
}
}
bool HydraTaskScheduler::BarrierComplete(HydraID barrierID)
{
if(barrierID < m_barriers.size())
{
if(m_barriers[barrierID]->reference_count > 0)
{
return false;
}
_CompleteBarrier(barrierID);
}
return true;
}
void HydraTaskScheduler::_NotifyThread(std::thread::id thread_id)
{
HydraThread *thread = nullptr;
@@ -71,7 +71,7 @@ public:
void NotifyStart(HydraID taskID);
void NotifyComplete(HydraID taskID);
void ProcessTask();
bool BarrierComplete(HydraID barrierID);
void DeleteTask(HydraID taskID);
};
@@ -0,0 +1,50 @@
#ifndef HYDRACHECKPLANETRESOLUTIONTASK
#define HYDRACHECKPLANETRESOLUTIONTASK
#include "../HydraTask.h"
#include "../../pipeline/HydraPipeline.h"
#include "../../engine/HydraEngine.h"
#include "../../ecs/HydraECS.h"
#include "../../ecs/components/HydraPositionComponent.h"
#include "../../actor/PlanetActor/HydraPlanetQuadActor.h"
#include "../../actor/HydraActorManager.h"
#include <vector>
class HydraCheckPlanetResolutionTask : public HydraTask
{
private:
protected:
std::vector<HydraID> m_quads;
public:
virtual void Process() override
{
HydraID player_id = GetEngine()->GetPossessedPlayer();
HydraPositionComponent pos_comp = GetEngine()->ECS()->GetComponent<HydraPositionComponent>(player_id);
HydraActorManager* actor_manager = GetEngine()->ActorManager();
HydraECS* ecs = GetEngine()->ECS();
HydraPlanetQuadActor* quad0 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[0]));
HydraPlanetQuadActor* quad1 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[1]));
HydraPlanetQuadActor* quad2 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[2]));
HydraPlanetQuadActor* quad3 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[3]));
HydraPlanetQuadActor* quad4 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[4]));
HydraPlanetQuadActor* quad5 = static_cast<HydraPlanetQuadActor*>(actor_manager->GetActor(m_quads[5]));
quad0->CheckResolution(pos_comp.position);
quad1->CheckResolution(pos_comp.position);
quad2->CheckResolution(pos_comp.position);
quad3->CheckResolution(pos_comp.position);
quad4->CheckResolution(pos_comp.position);
quad5->CheckResolution(pos_comp.position);
}
void Initialise(std::vector<HydraID> quads)
{
m_quads = quads;
}
};
#endif /* HYDRACHECKPLANETRESOLUTIONTASK */