diff --git a/Code/Legacy/CryCommon/LyShine/IDraw2d.h b/Code/Legacy/CryCommon/LyShine/IDraw2d.h index a8c7af7411..3bfa3a1c14 100644 --- a/Code/Legacy/CryCommon/LyShine/IDraw2d.h +++ b/Code/Legacy/CryCommon/LyShine/IDraw2d.h @@ -12,9 +12,6 @@ #include #include -// Forward declarations -struct IFFont; - //////////////////////////////////////////////////////////////////////////////////////////////////// //! Class for 2D drawing in screen space // @@ -58,55 +55,6 @@ public: // types MAX_TEXT_STRING_LENGTH = 1024, }; - enum : int - { - //! Constant that indicates the built-in default value should be used - UseDefault = -1 - }; - - //! Struct used to pass additional image options. - // - //! If this is not passed then the defaults below are used - struct ImageOptions - { - int blendMode; //!< default is GS_BLSRC_SRCALPHA|GS_BLDST_ONEMINUSSRCALPHA - AZ::Vector3 color; //!< default is (1,1,1) - Rounding pixelRounding; //!< default is Rounding::Nearest - int baseState; //!< Additional flags for SetState. Default is GS_NODEPTHTEST - }; - - //! Struct used to pass additional text options - mostly ones that do not change from call to call. - // - //! If this is not passed then the defaults below are used - struct TextOptions - { - AZStd::string fontName; //!< default is "default" - unsigned int effectIndex; //!< default is 0 - AZ::Vector3 color; //!< default is (1,1,1) - HAlign horizontalAlignment; //!< default is HAlign::Left - VAlign verticalAlignment; //!< default is VAlign::Top - AZ::Vector2 dropShadowOffset; //!< default is (0,0), zero offset means no drop shadow is drawn - AZ::Color dropShadowColor; //!< default is (0,0,0,0), zero alpha means no drop shadow is drawn - float rotation; //!< default is 0 - int baseState; //!< Additional flags for SetState. Default is GS_NODEPTHTEST - }; - - //! Used to pass in arrays of vertices (e.g. to DrawQuad) - struct VertexPosColUV - { - VertexPosColUV(){} - VertexPosColUV(const AZ::Vector2& inPos, const AZ::Color& inColor, const AZ::Vector2& inUV) - { - position = inPos; - color = inColor; - uv = inUV; - } - - AZ::Vector2 position; //!< 2D position of vertex - AZ::Color color; //!< Float color - AZ::Vector2 uv; //!< Texture coordinate - }; - public: // member functions //! Implement virtual destructor just for safety. diff --git a/Gems/LyShine/Code/Editor/EditorCommon.h b/Gems/LyShine/Code/Editor/EditorCommon.h index a13332b0fd..5a435e7dba 100644 --- a/Gems/LyShine/Code/Editor/EditorCommon.h +++ b/Gems/LyShine/Code/Editor/EditorCommon.h @@ -9,7 +9,6 @@ #include #include -#include #include #include #include diff --git a/Gems/LyShine/Code/Editor/GuideHelpers.cpp b/Gems/LyShine/Code/Editor/GuideHelpers.cpp index 7efbaf236f..eb5966568e 100644 --- a/Gems/LyShine/Code/Editor/GuideHelpers.cpp +++ b/Gems/LyShine/Code/Editor/GuideHelpers.cpp @@ -172,20 +172,23 @@ namespace GuideHelpers // the line is drawn as the inverse of the background color AZ::Color guideColor(1.0f, 1.0f, 1.0f, 1.0f); - int blendMode = GS_BLSRC_ONEMINUSDSTCOL|GS_BLDST_ZERO; + + CDraw2d::RenderState renderState; + renderState.m_blendState.m_blendSource = AZ::RHI::BlendFactor::ColorDestInverse; + renderState.m_blendState.m_blendDest = AZ::RHI::BlendFactor::Zero; // Draw the guide line if (guideIsVertical) { AZ::Vector2 start(viewportPoint.GetX(), 0); AZ::Vector2 end(viewportPoint.GetX(), viewportSize.GetY()); - draw2d.DrawLine(start, end, guideColor, blendMode); + draw2d.DrawLine(start, end, guideColor, IDraw2d::Rounding::Nearest, renderState); } else { AZ::Vector2 start(0, viewportPoint.GetY()); AZ::Vector2 end(viewportSize.GetX(), viewportPoint.GetY()); - draw2d.DrawLine(start, end, guideColor, blendMode); + draw2d.DrawLine(start, end, guideColor, IDraw2d::Rounding::Nearest, renderState); } } diff --git a/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp b/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp index 4cf2c0e6b4..668c4e8024 100644 --- a/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp +++ b/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp @@ -50,7 +50,7 @@ void ViewportCanvasBackground::Draw(Draw2dHelper& draw2d, const AZ::Vector2& can // now draw the same as Stretched but with UV's adjusted const AZ::Vector2 uvs[4] = { AZ::Vector2(0, 0), AZ::Vector2(uvScale.GetX(), 0), AZ::Vector2(uvScale.GetX(), uvScale.GetY()), AZ::Vector2(0, uvScale.GetY()) }; AZ::Color colorWhite(1.0f, 1.0f, 1.0f, 1.0f); - IDraw2d::VertexPosColUV verts[4]; + CDraw2d::VertexPosColUV verts[4]; for (int i = 0; i < 4; ++i) { verts[i].position = positions[i]; @@ -58,5 +58,5 @@ void ViewportCanvasBackground::Draw(Draw2dHelper& draw2d, const AZ::Vector2& can verts[i].uv = uvs[i]; } - m_canvasBackground->DrawImageTiled(draw2d, verts, 1.0f); + m_canvasBackground->DrawImageTiled(draw2d, verts); } diff --git a/Gems/LyShine/Code/Editor/ViewportIcon.cpp b/Gems/LyShine/Code/Editor/ViewportIcon.cpp index e3ad68922e..3f0fdfaba0 100644 --- a/Gems/LyShine/Code/Editor/ViewportIcon.cpp +++ b/Gems/LyShine/Code/Editor/ViewportIcon.cpp @@ -48,12 +48,11 @@ void ViewportIcon::DrawImageAligned(Draw2dHelper& draw2d, AZ::Vector2& pivot, fl opacity); } -void ViewportIcon::DrawImageTiled(Draw2dHelper& draw2d, IDraw2d::VertexPosColUV* verts, [[maybe_unused]] float opacity) +void ViewportIcon::DrawImageTiled(Draw2dHelper& draw2d, CDraw2d::VertexPosColUV* verts) { // Use default blending and rounding modes - int blendMode = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA; IDraw2d::Rounding rounding = IDraw2d::Rounding::Nearest; - draw2d.DrawQuad(m_image, verts, blendMode, rounding); + draw2d.DrawQuad(m_image, verts, rounding); } void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 bound0, AZ::Vector2 bound1) @@ -64,7 +63,7 @@ void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 float endTexCoordU = fabsf((bound1.GetX() - bound0.GetX()) * pixelLengthForDottedLineTexture); float endTexCoordV = fabsf((bound1.GetY() - bound0.GetY()) * pixelLengthForDottedLineTexture); - IDraw2d::VertexPosColUV verts[2]; + CDraw2d::VertexPosColUV verts[2]; { verts[0].color = dottedColor; verts[1].color = dottedColor; @@ -159,7 +158,7 @@ void ViewportIcon::Draw(Draw2dHelper& draw2d, AZ::Vector2 anchorPos, const AZ::M AZ::Matrix4x4 moveFromPivotSpaceMat = AZ::Matrix4x4::CreateTranslation(pivot3); AZ::Matrix4x4 newTransform = transform * moveFromPivotSpaceMat * rotMat * moveToPivotSpaceMat; - IDraw2d::VertexPosColUV verts[4]; + CDraw2d::VertexPosColUV verts[4]; // points are a clockwise quad static const AZ::Vector2 uvs[4] = { AZ::Vector2(0.0f, 0.0f), AZ::Vector2(1.0f, 0.0f), AZ::Vector2(1.0f, 1.0f), AZ::Vector2(0.0f, 1.0f) @@ -252,7 +251,7 @@ void ViewportIcon::DrawDistanceLine(Draw2dHelper& draw2d, AZ::Vector2 start, AZ: const float pixelLengthForDottedLineTexture = 8.0f; float endTexCoordU = length / pixelLengthForDottedLineTexture; - IDraw2d::VertexPosColUV verts[2]; + CDraw2d::VertexPosColUV verts[2]; verts[0].position = start; verts[0].color = dottedColor; diff --git a/Gems/LyShine/Code/Editor/ViewportIcon.h b/Gems/LyShine/Code/Editor/ViewportIcon.h index c7391d9f46..f815b244e9 100644 --- a/Gems/LyShine/Code/Editor/ViewportIcon.h +++ b/Gems/LyShine/Code/Editor/ViewportIcon.h @@ -20,7 +20,7 @@ public: void DrawImageAligned(Draw2dHelper& draw2d, AZ::Vector2& pivot, float opacity); - void DrawImageTiled(Draw2dHelper& draw2d, IDraw2d::VertexPosColUV* verts, float opacity); + void DrawImageTiled(Draw2dHelper& draw2d, CDraw2d::VertexPosColUV* verts); void Draw(Draw2dHelper& draw2d, AZ::Vector2 anchorPos, const AZ::Matrix4x4& transform, float iconRot = 0.0f, AZ::Color color = AZ::Color(1.0f, 1.0f, 1.0f, 1.0f)) const; diff --git a/Gems/LyShine/Code/Include/LyShine/Draw2d.h b/Gems/LyShine/Code/Include/LyShine/Draw2d.h index d6e255f6f7..6c848a7f96 100644 --- a/Gems/LyShine/Code/Include/LyShine/Draw2d.h +++ b/Gems/LyShine/Code/Include/LyShine/Draw2d.h @@ -26,6 +26,65 @@ class CDraw2d : public IDraw2d // LYSHINE_ATOM_TODO - keep around until gEnv->pLyShine is replaced by bus interface , public AZ::Render::Bootstrap::NotificationBus::Handler { +public: // types + + struct RenderState + { + RenderState() + { + m_blendState.m_enable = true; + m_blendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; + m_blendState.m_blendDest = AZ::RHI::BlendFactor::AlphaSourceInverse; + + m_depthState.m_enable = false; + } + + AZ::RHI::TargetBlendState m_blendState; + AZ::RHI::DepthState m_depthState; + }; + + //! Struct used to pass additional image options. + // + //! If this is not passed then the defaults are used + struct ImageOptions + { + AZ::Vector3 color = AZ::Vector3(1.0f, 1.0f, 1.0f); + Rounding pixelRounding = Rounding::Nearest; + RenderState m_renderState; + }; + + //! Struct used to pass additional text options - mostly ones that do not change from call to call. + // + //! If this is not passed then the defaults below are used + struct TextOptions + { + AZStd::string fontName; //!< default is "default" + unsigned int effectIndex; //!< default is 0 + AZ::Vector3 color; //!< default is (1,1,1) + HAlign horizontalAlignment; //!< default is HAlign::Left + VAlign verticalAlignment; //!< default is VAlign::Top + AZ::Vector2 dropShadowOffset; //!< default is (0,0), zero offset means no drop shadow is drawn + AZ::Color dropShadowColor; //!< default is (0,0,0,0), zero alpha means no drop shadow is drawn + float rotation; //!< default is 0 + bool depthTestEnabled; //!< default is false + }; + + //! Used to pass in arrays of vertices (e.g. to DrawQuad) + struct VertexPosColUV + { + VertexPosColUV() {} + VertexPosColUV(const AZ::Vector2& inPos, const AZ::Color& inColor, const AZ::Vector2& inUV) + { + position = inPos; + color = inColor; + uv = inUV; + } + + AZ::Vector2 position; //!< 2D position of vertex + AZ::Color color; //!< Float color + AZ::Vector2 uv; //!< Texture coordinate + }; + public: // member functions //! Constructor, constructed by the LyShine class @@ -81,40 +140,34 @@ public: // member functions // //! \param texId The texture ID returned by ITexture::GetTextureID() //! \param verts An array of 4 vertices, in clockwise order (e.g. top left, top right, bottom right, bottom left) - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState + //! \param renderState Blend mode and depth state virtual void DrawQuad(AZ::Data::Instance image, VertexPosColUV* verts, - int blendMode = UseDefault, Rounding pixelRounding = Rounding::Nearest, - int baseState = UseDefault); + const RenderState& renderState = RenderState{}); //! Draw a line // //! \param start The start position //! \param end The end position //! \param color The color of the line - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState + //! \param renderState Blend mode and depth state virtual void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, - int blendMode = UseDefault, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = UseDefault); + const RenderState& renderState = RenderState{}); //! Draw a line with a texture so it can be dotted or dashed // //! \param texId The texture ID returned by ITexture::GetTextureID() //! \param verts An array of 2 vertices for the start and end points of the line - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState + //! \param renderState Blend mode and depth state virtual void DrawLineTextured(AZ::Data::Instance image, VertexPosColUV* verts, - int blendMode = UseDefault, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = UseDefault); + const RenderState& renderState = RenderState{}); //! Draw a text string. Only supports ASCII text. // //! The font and effect used to render the text are specified in the textOptions structure @@ -225,7 +278,7 @@ protected: // types and constants AZ::Vector2 m_texCoords[4]; uint32 m_packedColors[4]; AZ::Data::Instance m_image; - int m_state; + RenderState m_renderState; }; class DeferredLine @@ -241,7 +294,7 @@ protected: // types and constants AZ::Vector2 m_points[2]; AZ::Vector2 m_texCoords[2]; uint32 m_packedColors[2]; - int m_state; + RenderState m_renderState; }; class DeferredText @@ -286,7 +339,7 @@ protected: // member functions //! Helper function to render a text string void DrawTextInternal(const char* textString, AzFramework::FontId fontId, unsigned int effectIndex, AZ::Vector2 position, float pointSize, AZ::Color color, float rotation, - HAlign horizontalAlignment, VAlign verticalAlignment, int baseState); + HAlign horizontalAlignment, VAlign verticalAlignment, bool depthTestEnabled); //! Draw or defer a quad void DrawOrDeferQuad(const DeferredQuad* quad); @@ -397,39 +450,39 @@ public: // member functions //! Draw a textured quad where the position, color and uv of each point is specified explicitly // //! See IDraw2d:DrawQuad for parameter descriptions - void DrawQuad(AZ::Data::Instance image, IDraw2d::VertexPosColUV* verts, int blendMode = IDraw2d::UseDefault, + void DrawQuad(AZ::Data::Instance image, CDraw2d::VertexPosColUV* verts, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) + const CDraw2d::RenderState& renderState = CDraw2d::RenderState{}) { if (m_draw2d) { - m_draw2d->DrawQuad(image, verts, blendMode, pixelRounding, baseState); + m_draw2d->DrawQuad(image, verts, pixelRounding, renderState); } } //! Draw a line // //! See IDraw2d:DrawLine for parameter descriptions - void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int blendMode = IDraw2d::UseDefault, + void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) + const CDraw2d::RenderState& renderState = CDraw2d::RenderState{}) { if (m_draw2d) { - m_draw2d->DrawLine(start, end, color, blendMode, pixelRounding, baseState); + m_draw2d->DrawLine(start, end, color, pixelRounding, renderState); } } //! Draw a line with a texture so it can be dotted or dashed // //! See IDraw2d:DrawLineTextured for parameter descriptions - void DrawLineTextured(AZ::Data::Instance image, IDraw2d::VertexPosColUV* verts, int blendMode = IDraw2d::UseDefault, + void DrawLineTextured(AZ::Data::Instance image, CDraw2d::VertexPosColUV* verts, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) + const CDraw2d::RenderState& renderState = CDraw2d::RenderState{}) { if (m_draw2d) { - m_draw2d->DrawLineTextured(image, verts, blendMode, pixelRounding, baseState); + m_draw2d->DrawLineTextured(image, verts, pixelRounding, renderState); } } @@ -478,7 +531,7 @@ public: // member functions // State management //! Set the blend mode used for images, default is GS_BLSRC_SRCALPHA|GS_BLDST_ONEMINUSSRCALPHA. - void SetImageBlendMode(int mode) { m_imageOptions.blendMode = mode; } + void SetImageBlendMode(const AZ::RHI::TargetBlendState& blendState) { m_imageOptions.m_renderState.m_blendState = blendState; } //! Set the color used for DrawImage and other image drawing. void SetImageColor(AZ::Vector3 color) { m_imageOptions.color = color; } @@ -487,7 +540,7 @@ public: // member functions void SetImagePixelRounding(IDraw2d::Rounding round) { m_imageOptions.pixelRounding = round; } //! Set the base state (that blend mode etc is combined with) used for images, default is GS_NODEPTHTEST. - void SetImageBaseState(int state) { m_imageOptions.baseState = state; } + void SetImageDepthState(const AZ::RHI::DepthState& depthState) { m_imageOptions.m_renderState.m_depthState = depthState; } //! Set the text font. void SetTextFont(AZStd::string_view fontName) { m_textOptions.fontName = fontName; } @@ -518,8 +571,11 @@ public: // member functions m_textOptions.rotation = rotation; } - //! Set the base state (that blend mode etc is combined with) used for text, default is GS_NODEPTHTEST. - void SetTextBaseState(int state) { m_textOptions.baseState = state; } + //! Set wheter to enable depth test for the text + void SetTextDepthTestEnabled(bool enabled) + { + m_textOptions.depthTestEnabled = enabled; + } public: // static member functions @@ -565,8 +621,8 @@ public: // static member functions protected: // attributes - IDraw2d::ImageOptions m_imageOptions; //!< image options are stored locally and updated by member functions - IDraw2d::TextOptions m_textOptions; //!< text options are stored locally and updated by member functions + CDraw2d::ImageOptions m_imageOptions; //!< image options are stored locally and updated by member functions + CDraw2d::TextOptions m_textOptions; //!< text options are stored locally and updated by member functions CDraw2d* m_draw2d; bool m_previousDeferCalls; }; diff --git a/Gems/LyShine/Code/Source/Draw2d.cpp b/Gems/LyShine/Code/Source/Draw2d.cpp index b4c8d58fae..b0539900e2 100644 --- a/Gems/LyShine/Code/Source/Draw2d.cpp +++ b/Gems/LyShine/Code/Source/Draw2d.cpp @@ -5,7 +5,6 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ -#include "IFont.h" #include // for SVF_P3F_C4B_T2F which will be removed in a coming PR #include @@ -23,9 +22,6 @@ #include #include -static const int g_defaultBlendState = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA; -static const int g_defaultBaseState = GS_NODEPTHTEST; - //////////////////////////////////////////////////////////////////////////////////////////////////// // LOCAL STATIC FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -48,10 +44,6 @@ CDraw2d::CDraw2d(AZ::RPI::ViewportContextPtr viewportContext) { // These default options are set here and never change. They are stored so that if a null options // structure is passed into the draw functions then this default one can be used instead - m_defaultImageOptions.blendMode = g_defaultBlendState; - m_defaultImageOptions.color.Set(1.0f, 1.0f, 1.0f); - m_defaultImageOptions.pixelRounding = Rounding::Nearest; - m_defaultImageOptions.baseState = g_defaultBaseState; m_defaultTextOptions.fontName = "default"; m_defaultTextOptions.effectIndex = 0; @@ -61,7 +53,7 @@ CDraw2d::CDraw2d(AZ::RPI::ViewportContextPtr viewportContext) m_defaultTextOptions.dropShadowOffset.Set(0.0f, 0.0f); m_defaultTextOptions.dropShadowColor.Set(0.0f, 0.0f, 0.0f, 0.0f); m_defaultTextOptions.rotation = 0.0f; - m_defaultTextOptions.baseState = g_defaultBaseState; + m_defaultTextOptions.depthTestEnabled = false; AZ::Render::Bootstrap::NotificationBus::Handler::BusConnect(); } @@ -112,7 +104,8 @@ void CDraw2d::OnBootstrapSceneReady([[maybe_unused]] AZ::RPI::Scene* bootstrapSc {"COLOR", AZ::RHI::Format::B8G8R8A8_UNORM}, {"TEXCOORD0", AZ::RHI::Format::R32G32_FLOAT} }); m_dynamicDraw->AddDrawStateOptions(AZ::RPI::DynamicDrawContext::DrawStateOptions::PrimitiveType - | AZ::RPI::DynamicDrawContext::DrawStateOptions::BlendMode); + | AZ::RPI::DynamicDrawContext::DrawStateOptions::BlendMode + | AZ::RPI::DynamicDrawContext::DrawStateOptions::DepthState); if (uiCanvasPass) { m_dynamicDraw->SetOutputScope(uiCanvasPass); @@ -124,12 +117,6 @@ void CDraw2d::OnBootstrapSceneReady([[maybe_unused]] AZ::RPI::Scene* bootstrapSc } m_dynamicDraw->EndInit(); - AZ::RHI::TargetBlendState targetBlendState; - targetBlendState.m_enable = true; - targetBlendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; - targetBlendState.m_blendDest = AZ::RHI::BlendFactor::AlphaSourceInverse; - m_dynamicDraw->SetTarget0BlendState(targetBlendState); - // Cache draw srg input indices for later use static const char textureIndexName[] = "m_texture"; static const char worldToProjIndexName[] = "m_worldToProj"; @@ -154,8 +141,6 @@ void CDraw2d::DrawImage(AZ::Data::Instance image, AZ::Vector2 po AZ::Color color = AZ::Color::CreateFromVector3AndFloat(actualImageOptions->color, opacity); AZ::u32 packedColor = PackARGB8888(color); - int blendMode = actualImageOptions->blendMode; - // Depending on the requested pixel rounding setting we may round position to an exact pixel AZ::Vector2 pos = Draw2dHelper::RoundXY(position, actualImageOptions->pixelRounding); @@ -189,7 +174,7 @@ void CDraw2d::DrawImage(AZ::Data::Instance image, AZ::Vector2 po quad.m_image = image; // add the blendMode flags to the base state - quad.m_state = blendMode | actualImageOptions->baseState; + quad.m_renderState = actualImageOptions->m_renderState; // apply rotation if requested if (rotation != 0.0f) @@ -212,11 +197,9 @@ void CDraw2d::DrawImageAligned(AZ::Data::Instance image, AZ::Vec } //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawQuad(AZ::Data::Instance image, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) +void CDraw2d::DrawQuad(AZ::Data::Instance image, VertexPosColUV* verts, Rounding pixelRounding, + const CDraw2d::RenderState& renderState) { - int actualBlendMode = (blendMode == -1) ? g_defaultBlendState : blendMode; - int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; - // define quad DeferredQuad quad; for (int i = 0; i < 4; ++i) @@ -228,20 +211,17 @@ void CDraw2d::DrawQuad(AZ::Data::Instance image, VertexPosColUV* quad.m_image = image; // add the blendMode flags to the base state - quad.m_state = actualBlendMode | actualBaseState; + quad.m_renderState = renderState; DrawOrDeferQuad(&quad); } //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int blendMode, Rounding pixelRounding, int baseState) +void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, Rounding pixelRounding, + const CDraw2d::RenderState& renderState) { - int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; - auto image = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); - int actualBlendMode = (blendMode == -1) ? g_defaultBlendState : blendMode; - // define line uint32 packedColor = PackARGB8888(color); @@ -258,19 +238,16 @@ void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int line.m_packedColors[1] = packedColor; // add the blendMode flags to the base state - line.m_state = actualBlendMode | actualBaseState; + line.m_renderState = renderState; DrawOrDeferLine(&line); } //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawLineTextured(AZ::Data::Instance image, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) +void CDraw2d::DrawLineTextured(AZ::Data::Instance image, VertexPosColUV* verts, Rounding pixelRounding, + const CDraw2d::RenderState& renderState) { - int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; - - int actualBlendMode = (blendMode == -1) ? g_defaultBlendState : blendMode; - // define line DeferredLine line; line.m_image = image; @@ -283,7 +260,7 @@ void CDraw2d::DrawLineTextured(AZ::Data::Instance image, VertexP } // add the blendMode flags to the base state - line.m_state = actualBlendMode | actualBaseState; + line.m_renderState = renderState; DrawOrDeferLine(&line); } @@ -313,7 +290,7 @@ void CDraw2d::DrawText(const char* textString, AZ::Vector2 position, float point dropShadowPosition, pointSize, actualTextOptions->dropShadowColor, actualTextOptions->rotation, actualTextOptions->horizontalAlignment, actualTextOptions->verticalAlignment, - actualTextOptions->baseState); + actualTextOptions->depthTestEnabled); } // draw the text string @@ -322,7 +299,7 @@ void CDraw2d::DrawText(const char* textString, AZ::Vector2 position, float point position, pointSize, textColor, actualTextOptions->rotation, actualTextOptions->horizontalAlignment, actualTextOptions->verticalAlignment, - actualTextOptions->baseState); + actualTextOptions->depthTestEnabled); } void CDraw2d::DrawRectOutlineTextured(AZ::Data::Instance image, @@ -594,7 +571,7 @@ void CDraw2d::RotatePointsAboutPivot(AZ::Vector2* points, [[maybe_unused]] int n //////////////////////////////////////////////////////////////////////////////////////////////////// void CDraw2d::DrawTextInternal(const char* textString, AzFramework::FontId fontId, unsigned int effectIndex, AZ::Vector2 position, float pointSize, AZ::Color color, float rotation, - HAlign horizontalAlignment, VAlign verticalAlignment, [[maybe_unused]] int baseState) + HAlign horizontalAlignment, VAlign verticalAlignment, bool depthTestEnabled) { // FFont.cpp uses the alpha value of the color to decide whether to use the color, if the alpha value is zero // (in a ColorB format) then the color set via SetColor is ignored and it usually ends up drawing with an alpha of 1. @@ -651,7 +628,7 @@ void CDraw2d::DrawTextInternal(const char* textString, AzFramework::FontId fontI drawParams.m_hAlign = hAlignment; drawParams.m_vAlign = vAlignment; drawParams.m_monospace = false; - drawParams.m_depthTest = false; + drawParams.m_depthTest = depthTestEnabled; drawParams.m_virtual800x600ScreenSize = false; drawParams.m_scaleWithWindow = false; drawParams.m_multiline = true; @@ -809,6 +786,8 @@ void CDraw2d::DeferredQuad::Draw(AZ::RHI::Ptr dynam // Add the primitive to the dynamic draw context for drawing dynamicDraw->SetPrimitiveType(AZ::RHI::PrimitiveTopology::TriangleList); + dynamicDraw->SetDepthState(m_renderState.m_depthState); + dynamicDraw->SetTarget0BlendState(m_renderState.m_blendState); dynamicDraw->DrawLinear(vertices, NUM_VERTS, drawSrg); } @@ -868,6 +847,8 @@ void CDraw2d::DeferredLine::Draw(AZ::RHI::Ptr dynam // Add the primitive to the dynamic draw context for drawing dynamicDraw->SetPrimitiveType(AZ::RHI::PrimitiveTopology::LineList); + dynamicDraw->SetDepthState(m_renderState.m_depthState); + dynamicDraw->SetTarget0BlendState(m_renderState.m_blendState); dynamicDraw->DrawLinear(vertices, NUM_VERTS, drawSrg); } @@ -966,4 +947,3 @@ void CDraw2d::DeferredText::Draw([[maybe_unused]] AZ::RHI::Ptr #include @@ -51,7 +50,7 @@ static const int g_numColors = 8; "black" }; -static AZ::Vector3 g_colorVec3[g_numColors] = +[[maybe_unused]] static AZ::Vector3 g_colorVec3[g_numColors] = { AZ::Vector3(1.0f, 1.0f, 1.0f), AZ::Vector3(1.0f, 0.0f, 0.0f), @@ -64,34 +63,34 @@ static AZ::Vector3 g_colorVec3[g_numColors] = }; static const int g_numSrcBlendModes = 11; -[[maybe_unused]] static int g_srcBlendModes[g_numSrcBlendModes] = +[[maybe_unused]] static AZ::RHI::BlendFactor g_srcBlendModes[g_numSrcBlendModes] = { - GS_BLSRC_ZERO, - GS_BLSRC_ONE, - GS_BLSRC_DSTCOL, - GS_BLSRC_ONEMINUSDSTCOL, - GS_BLSRC_SRCALPHA, - GS_BLSRC_ONEMINUSSRCALPHA, - GS_BLSRC_DSTALPHA, - GS_BLSRC_ONEMINUSDSTALPHA, - GS_BLSRC_ALPHASATURATE, - GS_BLSRC_SRCALPHA_A_ZERO, // separate alpha blend state - GS_BLSRC_SRC1ALPHA, // dual source blending + AZ::RHI::BlendFactor::Zero, + AZ::RHI::BlendFactor::One, + AZ::RHI::BlendFactor::ColorDest, + AZ::RHI::BlendFactor::ColorDestInverse, + AZ::RHI::BlendFactor::AlphaSource, + AZ::RHI::BlendFactor::AlphaSourceInverse, + AZ::RHI::BlendFactor::AlphaDest, + AZ::RHI::BlendFactor::AlphaDestInverse, + AZ::RHI::BlendFactor::AlphaSourceSaturate, + AZ::RHI::BlendFactor::Factor, + AZ::RHI::BlendFactor::AlphaSource1 }; static const int g_numDstBlendModes = 10; -[[maybe_unused]] static int g_dstBlendModes[g_numDstBlendModes] = +[[maybe_unused]] static AZ::RHI::BlendFactor g_dstBlendModes[g_numDstBlendModes] = { - GS_BLDST_ZERO, - GS_BLDST_ONE, - GS_BLDST_SRCCOL, - GS_BLDST_ONEMINUSSRCCOL, - GS_BLDST_SRCALPHA, - GS_BLDST_ONEMINUSSRCALPHA, - GS_BLDST_DSTALPHA, - GS_BLDST_ONEMINUSDSTALPHA, - GS_BLDST_ONE_A_ZERO, // separate alpha blend state - GS_BLDST_ONEMINUSSRC1ALPHA, // dual source blending + AZ::RHI::BlendFactor::Zero, + AZ::RHI::BlendFactor::One, + AZ::RHI::BlendFactor::ColorSource, + AZ::RHI::BlendFactor::ColorSourceInverse, + AZ::RHI::BlendFactor::AlphaSource, + AZ::RHI::BlendFactor::AlphaSourceInverse, + AZ::RHI::BlendFactor::AlphaDest, + AZ::RHI::BlendFactor::AlphaDestInverse, + AZ::RHI::BlendFactor::FactorInverse, + AZ::RHI::BlendFactor::AlphaSource1Inverse }; [[maybe_unused]] static bool g_deferDrawsToEndOfFrame = false; @@ -378,7 +377,7 @@ static void DebugDrawColoredBox(AZ::Vector2 pos, AZ::Vector2 size, AZ::Color col { CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); imageOptions.color = color.GetAsVector3(); auto whiteTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); draw2d->DrawImageAligned(whiteTexture, pos, size, horizontalAlignment, verticalAlignment, @@ -393,7 +392,7 @@ static void DebugDrawStringWithSizeBox(AZStd::string_view font, unsigned int eff { CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); if (!font.empty()) { textOptions.fontName = font; @@ -619,7 +618,7 @@ static AZ::Vector2 DebugDrawFontColorTestBox(AZ::Vector2 pos, const char* string float pointSize = 32.0f; const float spacing = 6.0f; - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); textOptions.effectIndex = 1; // no drop shadow baked in textOptions.color = color; @@ -743,7 +742,7 @@ static void DebugDraw2dImageColor() AZ::Data::Instance texture = GetMonoAlphaTestTexture(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText( "Testing image colors, image is black and white, top row is opacity=1, bottom row is opacity = 0.5", @@ -781,7 +780,7 @@ static void DebugDraw2dImageBlendMode() AZ::Data::Instance texture = GetColorAlphaTestTexture(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText("Testing blend modes, src blend changes across x-axis, dst blend changes across y axis", AZ::Vector2(20, 20), 16); @@ -802,7 +801,7 @@ static void DebugDraw2dImageBlendMode() AZ::Vector2 pos(xStart + xSpacing * srcIndex, yStart + ySpacing * dstIndex); // first draw a background with varying color and alpha - IDraw2d::VertexPosColUV verts[4] = + CDraw2d::VertexPosColUV verts[4] = { { // top left AZ::Vector2(pos.GetX(), pos.GetY()), @@ -829,7 +828,9 @@ static void DebugDraw2dImageBlendMode() // Draw the image with this color - imageOptions.blendMode = g_srcBlendModes[srcIndex] | g_dstBlendModes[dstIndex]; + CDraw2d::RenderState renderState; + renderState.m_blendState.m_blendSource = g_srcBlendModes[srcIndex]; + renderState.m_blendState.m_blendDest = g_dstBlendModes[dstIndex]; draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, 0, &imageOptions); } } @@ -844,7 +845,7 @@ static void DebugDraw2dImageUVs() AZ::Data::Instance texture = GetColorTestTexture(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText( "Testing DrawImage with minMaxTexCoords. Full image, top left quadrant, middle section, full flipped", @@ -893,7 +894,7 @@ static void DebugDraw2dImagePixelRounding() AZ::Data::Instance texture = GetColorTestTexture(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText("Testing DrawImage pixel rounding options", AZ::Vector2(20, 20), 16); @@ -932,7 +933,7 @@ static void DebugDraw2dLineBasic() { CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText("Testing DrawLine", AZ::Vector2(20, 20), 16); diff --git a/Gems/LyShine/Code/Source/UiCanvasManager.cpp b/Gems/LyShine/Code/Source/UiCanvasManager.cpp index 04cb5c4a1f..a71c46d45e 100644 --- a/Gems/LyShine/Code/Source/UiCanvasManager.cpp +++ b/Gems/LyShine/Code/Source/UiCanvasManager.cpp @@ -1031,7 +1031,7 @@ void UiCanvasManager::DebugDisplayCanvasData(int setting) const // local function to write a line of text (with a background rect) and increment Y offset AZStd::function WriteLine = [&](const char* buffer, const AZ::Vector3& color) { - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); textOptions.color = color; AZ::Vector2 textSize = draw2d->GetTextSize(buffer, fontSize, &textOptions); AZ::Vector2 rectTopLeft = AZ::Vector2(xOffset - 2, yOffset); @@ -1182,7 +1182,7 @@ void UiCanvasManager::DebugDisplayDrawCallData() const // local function to write a line of text (with a background rect) and increment Y offset AZStd::function WriteLine = [&](const char* buffer, const AZ::Vector3& color) { - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); textOptions.color = color; AZ::Vector2 textSize = draw2d->GetTextSize(buffer, 16, &textOptions); AZ::Vector2 rectTopLeft = AZ::Vector2(xOffset - 2, yOffset); diff --git a/Gems/LyShine/Code/Source/UiRenderer.cpp b/Gems/LyShine/Code/Source/UiRenderer.cpp index 07a9f77007..3111f31615 100644 --- a/Gems/LyShine/Code/Source/UiRenderer.cpp +++ b/Gems/LyShine/Code/Source/UiRenderer.cpp @@ -489,7 +489,7 @@ void UiRenderer::DebugDisplayTextureData(int recordingOption) // local function to write a line of text (with a background rect) and increment Y offset AZStd::function WriteLine = [&](const char* buffer, const AZ::Vector3& color) { - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); textOptions.color = color; AZ::Vector2 textSize = draw2d->GetTextSize(buffer, 16, &textOptions); AZ::Vector2 rectTopLeft = AZ::Vector2(xOffset - 2, yOffset);