add icon to EditorNameComponent

This commit is contained in:
SweetId 2023-11-29 17:19:09 +05:30
parent fa4cc84a31
commit bc18b5ef5d
2 changed files with 83 additions and 0 deletions

View File

@ -2,10 +2,19 @@
#include <NazaraEditor/Core/Config.hpp>
#include <Nazara/Core/Clock.hpp>
#include <NazaraUtils/Signal.hpp>
#include <filesystem>
#include <memory>
#include <string>
namespace Nz
{
class Billboard;
class NodeComponent;
class WorldInstance;
enum EditorEntityFlags : uint64_t
{
EditorEntityFlags_None = 0,
@ -24,15 +33,32 @@ namespace Nz
EditorNameComponent& operator=(const EditorNameComponent&) = delete;
EditorNameComponent& operator=(EditorNameComponent&&) = default;
void Update(Time elapsedTime, NodeComponent& node);
void SetName(const std::string& name) { m_name = name; }
const std::string& GetName() const { return m_name; }
void SetIcon(const std::filesystem::path& path);
void SetFlags(const uint64_t flags) { m_flags = flags; }
uint64_t GetFlags() const { return m_flags; }
NazaraSignal(OnIconChanged, EditorNameComponent*, const std::filesystem::path& );
private:
std::string m_name;
uint64_t m_flags;
std::filesystem::path m_iconPath; // @TODO replace with asset
struct BillboardData
{
size_t index;
std::shared_ptr<Nz::WorldInstance> instance;
std::shared_ptr<Nz::Billboard> billboard;
};
std::optional<BillboardData> m_icon;
};
}

View File

@ -0,0 +1,57 @@
#include <NazaraEditor/Core/Components/NameComponent.hpp>
#include <NazaraEditor/Core/Application/BaseApplication.hpp>
#include <Nazara/Core/AppFilesystemComponent.hpp>
#include <Nazara/Graphics/Billboard.hpp>
#include <Nazara/Graphics/FramePipeline.hpp>
#include <Nazara/Graphics/MaterialInstance.hpp>
#include <Nazara/Graphics/Systems/RenderSystem.hpp>
#include <Nazara/Utility/Components/NodeComponent.hpp>
namespace Nz
{
void EditorNameComponent::Update(Time, NodeComponent& node)
{
if (!m_icon.has_value())
return;
m_icon.value().instance->UpdateWorldMatrix(node.GetTransformMatrix());
}
void EditorNameComponent::SetIcon(const std::filesystem::path& path)
{
auto& level = EditorBaseApplication::Instance()->GetLevel();
auto& renderer = level.GetEnttWorld()->GetSystem<RenderSystem>();
if (m_icon.has_value())
{
renderer.GetFramePipeline().UnregisterRenderable(m_icon.value().index);
m_icon = {};
}
auto& fs = EditorBaseApplication::Instance()->GetComponent<Nz::AppFilesystemComponent>();
Nz::TextureParams params;
params.loadFormat = Nz::PixelFormat::RGBA8_SRGB;
std::shared_ptr<Nz::Texture> tex = fs.Load<Nz::Texture>(path.string(), params);
std::shared_ptr<Nz::MaterialInstance> mat = Nz::MaterialInstance::GetDefault(Nz::MaterialType::Basic, Nz::MaterialInstancePreset::Transparent)->Clone();
mat->SetTextureProperty("BaseColorMap", tex);
mat->SetValueProperty("Billboard", true);
m_icon = BillboardData{
.index = 0,
.instance = std::make_shared<Nz::WorldInstance>(),
.billboard = std::make_shared<Nz::Billboard>(mat, Nz::Vector2f(1.f, 1.f))
};
auto& icon = m_icon.value();
Nz::Recti scissorBox(-1, -1, -1, -1);
Nz::ElementRendererRegistry elementRegistry;
icon.index = renderer.GetFramePipeline().RegisterWorldInstance(icon.instance);
renderer.GetFramePipeline().RegisterRenderable(icon.index, Nz::FramePipeline::NoSkeletonInstance, icon.billboard.get(), 0xFFFFFFFF, scissorBox);
OnIconChanged(this, path);
}
}