This commit is contained in:
Confideo-IOM
2026-09-08 20:31:57 +01:00
parent 1ad59aff2e
commit 4bbfd8b8e2
44 changed files with 1121 additions and 425 deletions
@@ -17,7 +17,7 @@ class CLASS_DEFINE HydraLightSpawnerActor : public HydraActor
public:
void InitialiseComponents() override;
void SetEnabled(bool enabled);
void FixedTick(float delta_t);
void FixedTick(float delta_t) override;
void SpawnSettings(float spawns_per_second,
glm::vec3 spawn_direction,
glm::vec3 dir_variation,
@@ -8,12 +8,30 @@
#include "../../ecs/components/HydraMeshComponent.h"
#include "../../ecs/components/HydraRenderableComponent.h"
#include "../../ecs/components/HydraMaterialComponent.h"
#include "../../ecs/components/HydraTickComponent.h"
#include "../../buffer/HydraMaterialBufferManager.h"
#include "../../buffer/HydraTextureBufferManager.h"
#include "../../buffer/HydraMaterialBuffer.h"
#include "../../mesh/HydraMeshManager.h"
#include "../../mesh/HydraMesh.h"
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();
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]));
quad0->CheckResolution(pos_comp.position);
quad1->CheckResolution(pos_comp.position);
quad2->CheckResolution(pos_comp.position);
quad3->CheckResolution(pos_comp.position);
}
void HydraPlanetActor::InitialiseComponents()
{
@@ -26,12 +44,22 @@ void HydraPlanetActor::InitialiseComponents()
//_CreateMesh();
//_CreateRenderableComponent();
_CreateQuads();
_CreateTick();
}
void HydraPlanetActor::DeferredInitialiseComponents()
{
}
void HydraPlanetActor::_CreateTick()
{
HydraECS *ecs = GetEngine()->ECS();
HydraTickComponent tick_component;
tick_component.entity_id = GetID();
tick_component.fixed = true;
ecs->AddComponent<HydraTickComponent>(GetID(), tick_component);
}
void HydraPlanetActor::_CreatePosition()
{
HydraECS *ecs = GetEngine()->ECS();
@@ -217,6 +245,7 @@ void HydraPlanetActor::_CreateQuads()
float diameter = 50000.0f;
float quad_size = 50000.0f;
float radius = diameter /2.0f;
m_quads[0] = GetEngine()->ActorManager()->CreateActor<HydraPlanetQuadActor>();
HydraPlanetQuadActor* quad0 = static_cast<HydraPlanetQuadActor*>(GetEngine()->ActorManager()->GetActor(m_quads[0]));
quad0->InitialiseQuad(diameter, quad_size, divisions, glm::vec3(0,0,radius), glm::vec3(0,0,0));
@@ -19,10 +19,12 @@ class CLASS_DEFINE HydraPlanetActor : public HydraActor
void _CreatePhysics();
void _CreateRenderableComponent();
void _CreateQuads();
void _CreateTick();
public:
virtual void InitialiseComponents();
virtual void DeferredInitialiseComponents();
virtual void Destroy(){}
void FixedTick(float delta_t) override;
void InitialiseComponents() override;
void DeferredInitialiseComponents()override;
};
@@ -42,7 +42,24 @@ void HydraPlanetQuadActor::InitialiseQuad(float planet_diameter, float quad_dime
_CreateMesh();
}
glm::vec3 HydraPlanetQuadActor::_ProjectSphere(glm::dvec4 vert_in, glm::mat4 trans, glm::mat4 inv_trans, double diameter, glm::vec3 origin)
void HydraPlanetQuadActor::CheckResolution(glm::dvec3 player_position)
{
if(m_divided)
{
std::vector<HydraID> children = GetEngine()->ActorManager()->GetChildren(GetID());
for(HydraID child_id : children)
{
}
}
double distance_to_quad = glm::length(player_position - m_centre);
if(distance_to_quad < m_quad_dimension)
{
}
}
glm::vec3 HydraPlanetQuadActor::_ProjectSphere(glm::dvec4 vert_in, glm::dmat4 trans, glm::dmat4 inv_trans, double diameter, glm::vec3 origin)
{
glm::dvec4 vert = trans * vert_in;
vert = glm::normalize(vert);
@@ -60,11 +77,18 @@ glm::vec3 HydraPlanetQuadActor::_ProjectSphere(glm::dvec4 vert_in, glm::mat4 tra
vert = glm::normalize(vert) * ((m_planet_diameter / 2.0) + (noise * 500.0f));
vert = inv_trans * glm::dvec4(vert.x, vert.y, vert.z, 1.0);
return glm::vec3(vert);
}
glm::dvec3 HydraPlanetQuadActor::_ProjectCentre(glm::dvec4 vert_in, glm::dmat4 trans, double diameter, glm::vec3 origin)
{
glm::dvec4 vert = trans * vert_in;
vert = glm::normalize(vert);
vert = vert * (m_planet_diameter / 2.0);
return glm::dvec3(vert);
}
void HydraPlanetQuadActor::_CreatePosition()
{
HydraECS *ecs = GetEngine()->ECS();
@@ -121,10 +145,15 @@ void HydraPlanetQuadActor::_CreateMesh()
uint32_t index_idx = 0;
//glm::mat4 trans = GetEngine()->ActorManager()->GetActorPose(actor_id);
glm::mat4 trans_matrix = glm::translate(pos_comp.position);
glm::mat4 rot_matrix = glm::toMat4(glm::quat(pos_comp.orientation));
glm::mat4 trans = trans_matrix * rot_matrix;
glm::mat4 inv_trans = glm::inverse(trans);
glm::dmat4 trans_matrix = glm::translate(pos_comp.position);
glm::dmat4 rot_matrix = glm::toMat4(glm::quat(pos_comp.orientation));
glm::dmat4 trans = trans_matrix * rot_matrix;
glm::dmat4 inv_trans = glm::inverse(trans);
glm::dvec4 centre = glm::dvec4(max_x - min_x, max_y - min_y, max_z - min_z, 1.0);
m_centre = _ProjectCentre(centre, trans, m_planet_diameter, m_origin);
for (uint32_t y_count = 0; y_count < m_divisions - 1; y_count++)
{
for (uint32_t x_count = 0; x_count < m_divisions - 1; x_count++)
@@ -236,3 +265,4 @@ void HydraPlanetQuadActor::_CreateRenderableComponent()
ecs->AddComponent<HydraRenderableComponent>(GetID(), render_comp);
ecs->AddComponent<HydraShadowCasterComponent>(GetID(), shad_caster);
}
@@ -11,8 +11,10 @@ class CLASS_DEFINE HydraPlanetQuadActor : public HydraActor
virtual void DeferredInitialiseComponents();
virtual void Destroy(){}
void InitialiseQuad(float planet_diameter, float quad_dimension, uint32_t divisions, glm::dvec3 origin, glm::vec3 orientation);
void CheckResolution(glm::dvec3 player_position);
private:
glm::vec3 _ProjectSphere(glm::dvec4 vert_in, glm::mat4 trans, glm::mat4 inv_trans, double diameter, glm::vec3 origin);
glm::vec3 _ProjectSphere(glm::dvec4 vert_in, glm::dmat4 trans, glm::dmat4 inv_trans, double diameter, glm::vec3 origin);
glm::dvec3 _ProjectCentre(glm::dvec4 vert_in, glm::dmat4 trans, double diameter, glm::vec3 origin);
double m_scale = 1.0;
double m_widthscale = 1000.0f;
HydraID m_material_component = INVALID_HYDRA_ID;
@@ -21,7 +23,9 @@ class CLASS_DEFINE HydraPlanetQuadActor : public HydraActor
uint32_t m_divisions = 100;
float m_quad_dimension = 0;
float m_planet_diameter = 0;
glm::vec3 m_origin {};
glm::dvec3 m_centre {};
glm::vec3 m_origin {};
bool m_divided = false;
protected: