add raycasting in level

This commit is contained in:
SweetId
2023-11-20 18:54:57 +05:30
parent e8504ea3b9
commit 2b9b4f6df8
2 changed files with 39 additions and 0 deletions

View File

@@ -3,11 +3,20 @@
#include <NazaraEditor/Core/Config.hpp>
#include <Nazara/Core/EnttWorld.hpp>
#include <Nazara/Math/Ray.hpp>
namespace Nz
{
class EditorBaseApplication;
struct RaycastHit
{
entt::handle entity;
Nz::Vector3f position;
float distance;
};
class NAZARAEDITOR_CORE_API Level final
{
public:
@@ -21,6 +30,9 @@ namespace Nz
entt::handle CreateEntity();
bool CreateNewLevel();
// This is slow af
std::vector<RaycastHit> Raycast(const Nz::Rayf& ray);
protected:
EditorBaseApplication* m_application;

View File

@@ -20,4 +20,31 @@ namespace Nz
m_world = &ecs.AddWorld<Nz::EnttWorld>();
return true;
}
std::vector<RaycastHit> Level::Raycast(const Nz::Rayf& ray)
{
std::vector<RaycastHit> entities;
auto& registry = m_world->GetRegistry();
for (auto&& entity : registry.storage<entt::entity>().each())
{
Nz::GraphicsComponent* component = registry.try_get<Nz::GraphicsComponent>(std::get<entt::entity>(entity));
if (component != nullptr)
{
float distance = 0;
if (ray.Intersect(component->GetAABB(), &distance))
{
entities.push_back({
.entity = entt::handle(registry, std::get<entt::entity>(entity)),
.position = ray.origin + ray.direction * distance,
.distance = distance
});
}
}
}
// sort the result by distance first
std::sort(entities.begin(), entities.end(), [](auto&& A, auto&& B) { return A.distance < B.distance; });
return entities;
}
}