diff --git a/include/Nazara/Widgets/BaseWidget.hpp b/include/Nazara/Widgets/BaseWidget.hpp index 96256b03d..ce45f3ee3 100644 --- a/include/Nazara/Widgets/BaseWidget.hpp +++ b/include/Nazara/Widgets/BaseWidget.hpp @@ -159,18 +159,18 @@ namespace Nz std::optional m_backgroundEntity; std::size_t m_canvasIndex; - std::shared_ptr m_backgroundSprite; + std::shared_ptr m_backgroundSprite; std::vector m_entities; std::vector> m_children; entt::registry* m_registry; Canvas* m_canvas; Color m_backgroundColor; - Nz::Rectf m_renderingRect; - Nz::SystemCursor m_cursor; - Nz::Vector2f m_maximumSize; - Nz::Vector2f m_minimumSize; - Nz::Vector2f m_preferredSize; - Nz::Vector2f m_size; + Rectf m_renderingRect; + SystemCursor m_cursor; + Vector2f m_maximumSize; + Vector2f m_minimumSize; + Vector2f m_preferredSize; + Vector2f m_size; BaseWidget* m_widgetParent; bool m_visible; }; diff --git a/include/Nazara/Widgets/Widgets.hpp b/include/Nazara/Widgets/Widgets.hpp index fd1705a99..a552f1e0a 100644 --- a/include/Nazara/Widgets/Widgets.hpp +++ b/include/Nazara/Widgets/Widgets.hpp @@ -15,6 +15,9 @@ namespace Nz { + class Material; + class MaterialPass; + class NAZARA_WIDGETS_API Widgets : public ModuleBase { friend ModuleBase; @@ -27,9 +30,22 @@ namespace Nz Widgets(Config config); ~Widgets() = default; + inline const std::shared_ptr& GetOpaqueMaterial() const; + inline const std::shared_ptr& GetOpaqueMaterialPass() const; + + inline const std::shared_ptr& GetTransparentMaterial() const; + inline const std::shared_ptr& GetTransparentMaterialPass() const; + struct Config {}; private: + void CreateDefaultMaterials(); + + std::shared_ptr m_opaqueMaterial; + std::shared_ptr m_transparentMaterial; + std::shared_ptr m_opaqueMaterialPass; + std::shared_ptr m_transparentMaterialPass; + static Widgets* s_instance; }; } diff --git a/include/Nazara/Widgets/Widgets.inl b/include/Nazara/Widgets/Widgets.inl index 29342ca41..6febcdab4 100644 --- a/include/Nazara/Widgets/Widgets.inl +++ b/include/Nazara/Widgets/Widgets.inl @@ -7,6 +7,25 @@ namespace Nz { + inline const std::shared_ptr& Widgets::GetOpaqueMaterial() const + { + return m_opaqueMaterial; + } + + inline const std::shared_ptr& Widgets::GetOpaqueMaterialPass() const + { + return m_opaqueMaterialPass; + } + + inline const std::shared_ptr& Widgets::GetTransparentMaterial() const + { + return m_transparentMaterial; + } + + inline const std::shared_ptr& Widgets::GetTransparentMaterialPass() const + { + return m_transparentMaterialPass; + } } #include diff --git a/src/Nazara/Widgets/BaseWidget.cpp b/src/Nazara/Widgets/BaseWidget.cpp index 3e2f55ac5..c5e76828c 100644 --- a/src/Nazara/Widgets/BaseWidget.cpp +++ b/src/Nazara/Widgets/BaseWidget.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -79,12 +80,8 @@ namespace Nz if (enable) { - auto material = std::make_shared(); - material->AddPass("ForwardPass", std::make_shared(BasicMaterial::GetSettings())); - - m_backgroundSprite = std::make_shared(std::move(material)); + m_backgroundSprite = std::make_shared((m_backgroundColor.IsOpaque()) ? Widgets::Instance()->GetOpaqueMaterial() : Widgets::Instance()->GetTransparentMaterial()); m_backgroundSprite->SetColor(m_backgroundColor); - //m_backgroundSprite->SetMaterial(Nz::Material::New((m_backgroundColor.IsOpaque()) ? "Basic2D" : "Translucent2D")); //< TODO: Use a shared material instead of creating one everytime entt::entity backgroundEntity = CreateEntity(); m_registry->emplace(backgroundEntity).AttachRenderable(m_backgroundSprite, GetCanvas()->GetRenderMask()); @@ -115,10 +112,10 @@ namespace Nz return m_canvas->IsKeyboardOwner(m_canvasIndex); } - void BaseWidget::Resize(const Nz::Vector2f& size) + void BaseWidget::Resize(const Vector2f& size) { // Adjust new size - Nz::Vector2f newSize = size; + Vector2f newSize = size; newSize.Maximize(m_minimumSize); newSize.Minimize(m_maximumSize); @@ -135,11 +132,11 @@ namespace Nz if (m_backgroundSprite) { m_backgroundSprite->SetColor(color); - //m_backgroundSprite->GetMaterial()->Configure((color.IsOpaque()) ? "Basic2D" : "Translucent2D"); //< Our sprite has its own material (see EnableBackground) + m_backgroundSprite->SetMaterial((color.IsOpaque()) ? Widgets::Instance()->GetOpaqueMaterial() : Widgets::Instance()->GetTransparentMaterial()); //< Our sprite has its own material (see EnableBackground) } } - void BaseWidget::SetCursor(Nz::SystemCursor systemCursor) + void BaseWidget::SetCursor(SystemCursor systemCursor) { m_cursor = systemCursor; @@ -167,7 +164,7 @@ namespace Nz Layout(); } - void BaseWidget::SetRenderingRect(const Nz::Rectf& renderingRect) + void BaseWidget::SetRenderingRect(const Rectf& renderingRect) { m_renderingRect = renderingRect; @@ -242,10 +239,7 @@ namespace Nz void BaseWidget::Layout() { if (m_backgroundSprite) - { - m_registry->get(*m_backgroundEntity).SetPosition(0.f, m_size.y); m_backgroundSprite->SetSize({ m_size.x, m_size.y }); - } UpdatePositionAndSize(); } @@ -257,13 +251,13 @@ namespace Nz UpdatePositionAndSize(); } - Nz::Rectf BaseWidget::GetScissorRect() const + Rectf BaseWidget::GetScissorRect() const { - Nz::Vector2f widgetPos = Nz::Vector2f(GetPosition(Nz::CoordSys::Global)); - Nz::Vector2f widgetSize = GetSize(); + Vector2f widgetPos = Vector2f(GetPosition(CoordSys::Global)); + Vector2f widgetSize = GetSize(); - Nz::Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); - Nz::Rectf widgetRenderingRect(widgetPos.x + m_renderingRect.x, widgetPos.y + m_renderingRect.y, m_renderingRect.width, m_renderingRect.height); + Rectf widgetRect(widgetPos.x, widgetPos.y, widgetSize.x, widgetSize.y); + Rectf widgetRenderingRect(widgetPos.x + m_renderingRect.x, widgetPos.y + m_renderingRect.y, m_renderingRect.width, m_renderingRect.height); widgetRect.Intersect(widgetRenderingRect, &widgetRect); @@ -283,12 +277,12 @@ namespace Nz { } - bool BaseWidget::OnKeyPressed(const Nz::WindowEvent::KeyEvent& key) + bool BaseWidget::OnKeyPressed(const WindowEvent::KeyEvent& key) { return false; } - void BaseWidget::OnKeyReleased(const Nz::WindowEvent::KeyEvent& /*key*/) + void BaseWidget::OnKeyReleased(const WindowEvent::KeyEvent& /*key*/) { } @@ -300,11 +294,11 @@ namespace Nz { } - void BaseWidget::OnMouseButtonPress(int /*x*/, int /*y*/, Nz::Mouse::Button /*button*/) + void BaseWidget::OnMouseButtonPress(int /*x*/, int /*y*/, Mouse::Button /*button*/) { } - void BaseWidget::OnMouseButtonRelease(int /*x*/, int /*y*/, Nz::Mouse::Button /*button*/) + void BaseWidget::OnMouseButtonRelease(int /*x*/, int /*y*/, Mouse::Button /*button*/) { } @@ -316,7 +310,7 @@ namespace Nz { } - void BaseWidget::OnParentResized(const Nz::Vector2f& /*newSize*/) + void BaseWidget::OnParentResized(const Vector2f& /*newSize*/) { } @@ -372,17 +366,17 @@ namespace Nz if (IsRegisteredToCanvas()) m_canvas->NotifyWidgetBoxUpdate(m_canvasIndex); - Nz::Rectf scissorRect = GetScissorRect(); + Rectf scissorRect = GetScissorRect(); if (m_widgetParent) { - Nz::Rectf parentScissorRect = m_widgetParent->GetScissorRect(); + Rectf parentScissorRect = m_widgetParent->GetScissorRect(); if (!scissorRect.Intersect(parentScissorRect, &scissorRect)) scissorRect = parentScissorRect; } - /*Nz::Recti fullBounds(scissorRect); + /*Recti fullBounds(scissorRect); for (WidgetEntity& widgetEntity : m_entities) { const Ndk::EntityHandle& entity = widgetEntity.handle; diff --git a/src/Nazara/Widgets/LabelWidget.cpp b/src/Nazara/Widgets/LabelWidget.cpp index 8b74e793b..42b1f0b06 100644 --- a/src/Nazara/Widgets/LabelWidget.cpp +++ b/src/Nazara/Widgets/LabelWidget.cpp @@ -4,11 +4,10 @@ #include #include -#include -#include #include #include #include +#include #include namespace Nz @@ -16,18 +15,7 @@ namespace Nz LabelWidget::LabelWidget(BaseWidget* parent) : BaseWidget(parent) { - auto materialPass = std::make_shared(BasicMaterial::GetSettings()); - materialPass->EnableFlag(MaterialPassFlag::Transparent); - materialPass->EnableDepthBuffer(true); - materialPass->EnableDepthWrite(false); - materialPass->EnableBlending(true); - materialPass->SetBlendEquation(BlendEquation::Add, BlendEquation::Add); - materialPass->SetBlendFunc(BlendFunc::SrcAlpha, BlendFunc::InvSrcAlpha, BlendFunc::One, BlendFunc::Zero); - - auto material = std::make_shared(); - material->AddPass("ForwardPass", std::move(materialPass)); - - m_textSprite = std::make_shared(std::move(material)); + m_textSprite = std::make_shared(Widgets::Instance()->GetTransparentMaterial()); m_textEntity = CreateEntity(); GetRegistry().emplace(m_textEntity).AttachRenderable(m_textSprite, GetCanvas()->GetRenderMask()); diff --git a/src/Nazara/Widgets/Widgets.cpp b/src/Nazara/Widgets/Widgets.cpp index 6d09a1017..a30672c43 100644 --- a/src/Nazara/Widgets/Widgets.cpp +++ b/src/Nazara/Widgets/Widgets.cpp @@ -3,6 +3,9 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include +#include +#include #include namespace Nz @@ -16,6 +19,29 @@ namespace Nz ModuleBase("Widgets", this) { ECS::RegisterComponents(); + + CreateDefaultMaterials(); + } + + void Widgets::CreateDefaultMaterials() + { + m_opaqueMaterialPass = std::make_shared(BasicMaterial::GetSettings()); + m_opaqueMaterialPass->EnableDepthBuffer(true); + m_opaqueMaterialPass->EnableDepthWrite(false); + + m_opaqueMaterial = std::make_shared(); + m_opaqueMaterial->AddPass("ForwardPass", m_opaqueMaterialPass); + + m_transparentMaterialPass = std::make_shared(BasicMaterial::GetSettings()); + m_transparentMaterialPass->EnableFlag(MaterialPassFlag::Transparent); + m_transparentMaterialPass->EnableDepthBuffer(true); + m_transparentMaterialPass->EnableDepthWrite(false); + m_transparentMaterialPass->EnableBlending(true); + m_transparentMaterialPass->SetBlendEquation(BlendEquation::Add, BlendEquation::Add); + m_transparentMaterialPass->SetBlendFunc(BlendFunc::SrcAlpha, BlendFunc::InvSrcAlpha, BlendFunc::One, BlendFunc::Zero); + + m_transparentMaterial = std::make_shared(); + m_transparentMaterial->AddPass("ForwardPass", m_transparentMaterialPass); } Widgets* Widgets::s_instance = nullptr;