From b62d5f68463664c4e98d1ccd2c9aa5997fd06be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Wed, 1 Dec 2021 10:37:48 +0100 Subject: [PATCH] Widgets: Improve default theme --- include/Nazara/Widgets/DefaultWidgetTheme.hpp | 6 ++--- include/Nazara/Widgets/SimpleWidgetStyles.hpp | 14 +++++++++- src/Nazara/Widgets/DefaultWidgetTheme.cpp | 27 +++++++++++++------ src/Nazara/Widgets/SimpleWidgetStyles.cpp | 16 +++++++---- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/include/Nazara/Widgets/DefaultWidgetTheme.hpp b/include/Nazara/Widgets/DefaultWidgetTheme.hpp index 617da4171..8590c2b37 100644 --- a/include/Nazara/Widgets/DefaultWidgetTheme.hpp +++ b/include/Nazara/Widgets/DefaultWidgetTheme.hpp @@ -30,9 +30,9 @@ namespace Nz private: std::shared_ptr m_buttonMaterial; - std::shared_ptr m_hoveredButtonMaterial; - std::shared_ptr m_pressedHoveredMaterial; - std::shared_ptr m_pressedButtonMaterial; + std::shared_ptr m_buttonHoveredMaterial; + std::shared_ptr m_buttonPressedHoveredMaterial; + std::shared_ptr m_buttonPressedMaterial; }; } diff --git a/include/Nazara/Widgets/SimpleWidgetStyles.hpp b/include/Nazara/Widgets/SimpleWidgetStyles.hpp index 57571e38e..cac9a26f7 100644 --- a/include/Nazara/Widgets/SimpleWidgetStyles.hpp +++ b/include/Nazara/Widgets/SimpleWidgetStyles.hpp @@ -17,7 +17,9 @@ namespace Nz class NAZARA_WIDGETS_API SimpleButtonWidgetStyle : public ButtonWidgetStyle { public: - SimpleButtonWidgetStyle(ButtonWidget* buttonWidget, std::shared_ptr material, std::shared_ptr hoveredMaterial = {}, std::shared_ptr pressedMaterial = {}, std::shared_ptr pressedHoveredMaterial = {}); + struct StyleConfig; + + SimpleButtonWidgetStyle(ButtonWidget* buttonWidget, StyleConfig config); SimpleButtonWidgetStyle(const SimpleButtonWidgetStyle&) = delete; SimpleButtonWidgetStyle(SimpleButtonWidgetStyle&&) = default; ~SimpleButtonWidgetStyle() = default; @@ -34,6 +36,16 @@ namespace Nz SimpleButtonWidgetStyle& operator=(const SimpleButtonWidgetStyle&) = delete; SimpleButtonWidgetStyle& operator=(SimpleButtonWidgetStyle&&) = default; + struct StyleConfig + { + std::shared_ptr hoveredMaterial; + std::shared_ptr material; + std::shared_ptr pressedMaterial; + std::shared_ptr pressedHoveredMaterial; + float cornerSize; + float cornerTexCoords; + }; + protected: virtual void UpdateMaterial(bool hovered, bool pressed); diff --git a/src/Nazara/Widgets/DefaultWidgetTheme.cpp b/src/Nazara/Widgets/DefaultWidgetTheme.cpp index 1af563d9a..06ec1e6f7 100644 --- a/src/Nazara/Widgets/DefaultWidgetTheme.cpp +++ b/src/Nazara/Widgets/DefaultWidgetTheme.cpp @@ -15,19 +15,19 @@ namespace Nz namespace { const UInt8 ButtonImage[] = { - #include + #include }; const UInt8 ButtonHoveredImage[] = { - #include + #include }; const UInt8 ButtonPressedImage[] = { - #include + #include }; const UInt8 ButtonPressedHoveredImage[] = { - #include + #include }; } @@ -42,6 +42,9 @@ namespace Nz std::shared_ptr buttonMaterialPass = std::make_shared(BasicMaterial::GetSettings()); buttonMaterialPass->EnableDepthBuffer(true); buttonMaterialPass->EnableDepthWrite(false); + buttonMaterialPass->EnableBlending(true); + buttonMaterialPass->SetBlendEquation(BlendEquation::Add, BlendEquation::Add); + buttonMaterialPass->SetBlendFunc(BlendFunc::SrcAlpha, BlendFunc::InvSrcAlpha, BlendFunc::One, BlendFunc::One); std::shared_ptr material = std::make_shared(); material->AddPass("ForwardPass", buttonMaterialPass); @@ -54,14 +57,22 @@ namespace Nz // Button material m_buttonMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(ButtonImage, sizeof(ButtonImage), texParams)); - m_hoveredButtonMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(ButtonHoveredImage, sizeof(ButtonHoveredImage), texParams)); - m_pressedButtonMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(ButtonPressedImage, sizeof(ButtonPressedImage), texParams)); - m_pressedHoveredMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(ButtonPressedHoveredImage, sizeof(ButtonPressedHoveredImage), texParams)); + m_buttonHoveredMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(ButtonHoveredImage, sizeof(ButtonHoveredImage), texParams)); + m_buttonPressedMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(ButtonPressedImage, sizeof(ButtonPressedImage), texParams)); + m_buttonPressedHoveredMaterial = CreateMaterialFromTexture(Texture::LoadFromMemory(ButtonPressedHoveredImage, sizeof(ButtonPressedHoveredImage), texParams)); } std::unique_ptr DefaultWidgetTheme::CreateStyle(ButtonWidget* buttonWidget) const { - return std::make_unique(buttonWidget, m_buttonMaterial, m_hoveredButtonMaterial, m_pressedButtonMaterial, m_pressedHoveredMaterial); + SimpleButtonWidgetStyle::StyleConfig styleConfig; + styleConfig.cornerSize = 20.f; + styleConfig.cornerTexCoords = 20.f / 128.f; + styleConfig.hoveredMaterial = m_buttonHoveredMaterial; + styleConfig.material = m_buttonMaterial; + styleConfig.pressedHoveredMaterial = m_buttonPressedHoveredMaterial; + styleConfig.pressedMaterial = m_buttonPressedMaterial; + + return std::make_unique(buttonWidget, styleConfig); } std::unique_ptr DefaultWidgetTheme::CreateStyle(LabelWidget* buttonWidget) const diff --git a/src/Nazara/Widgets/SimpleWidgetStyles.cpp b/src/Nazara/Widgets/SimpleWidgetStyles.cpp index 112502396..cae47414b 100644 --- a/src/Nazara/Widgets/SimpleWidgetStyles.cpp +++ b/src/Nazara/Widgets/SimpleWidgetStyles.cpp @@ -13,12 +13,12 @@ namespace Nz { - SimpleButtonWidgetStyle::SimpleButtonWidgetStyle(ButtonWidget* buttonWidget, std::shared_ptr material, std::shared_ptr hoveredMaterial, std::shared_ptr pressedMaterial, std::shared_ptr pressedHoveredMaterial) : + SimpleButtonWidgetStyle::SimpleButtonWidgetStyle(ButtonWidget* buttonWidget, StyleConfig config) : ButtonWidgetStyle(buttonWidget), - m_hoveredMaterial(std::move(hoveredMaterial)), - m_material(std::move(material)), - m_pressedMaterial(std::move(pressedMaterial)), - m_pressedHoveredMaterial(std::move(pressedHoveredMaterial)), + m_hoveredMaterial(std::move(config.hoveredMaterial)), + m_material(std::move(config.material)), + m_pressedMaterial(std::move(config.pressedMaterial)), + m_pressedHoveredMaterial(std::move(config.pressedHoveredMaterial)), m_isHovered(false), m_isPressed(false) { @@ -27,7 +27,13 @@ namespace Nz auto& registry = GetRegistry(); UInt32 renderMask = GetRenderMask(); + SlicedSprite::Corner corner; + corner.size.Set(config.cornerSize); + corner.textureCoords.Set(config.cornerTexCoords); + m_sprite = std::make_shared(m_material); + m_sprite->SetCorners(corner, corner); + m_textSprite = std::make_shared(Widgets::Instance()->GetTransparentMaterial()); m_spriteEntity = CreateGraphicsEntity();