diff --git a/src/nodes/QskBoxClipNode.cpp b/src/nodes/QskBoxClipNode.cpp index 7cd5f2b7..8cddf85d 100644 --- a/src/nodes/QskBoxClipNode.cpp +++ b/src/nodes/QskBoxClipNode.cpp @@ -49,7 +49,7 @@ void QskBoxClipNode::setBox( const QRectF& rect, else { setIsRectangular( false ); - QskBoxRenderer::renderFill( rect, shape, border, m_geometry ); + QskBoxRenderer::renderFillGeometry( rect, shape, border, m_geometry ); } /* diff --git a/src/nodes/QskBoxFillNode.cpp b/src/nodes/QskBoxFillNode.cpp index ed9dcaa1..a54b41e9 100644 --- a/src/nodes/QskBoxFillNode.cpp +++ b/src/nodes/QskBoxFillNode.cpp @@ -92,7 +92,7 @@ void QskBoxFillNode::updateNode( if ( dirtyMetrics ) { - QskBoxRenderer::renderFill( rect, shapeMetrics, borderMetrics, d->geometry ); + QskBoxRenderer::renderFillGeometry( rect, shapeMetrics, borderMetrics, d->geometry ); markDirty( QSGNode::DirtyGeometry ); } diff --git a/src/nodes/QskBoxRectangleNode.cpp b/src/nodes/QskBoxRectangleNode.cpp index 0d24d8e1..e1c98344 100644 --- a/src/nodes/QskBoxRectangleNode.cpp +++ b/src/nodes/QskBoxRectangleNode.cpp @@ -207,12 +207,14 @@ void QskBoxRectangleNode::updateNode( const QRectF& rect, if ( hasFill ) { flatMaterial->setColor( fillGradient.rgbStart() ); - QskBoxRenderer::renderFill( d->rect, shape, QskBoxBorderMetrics(), *geometry() ); + QskBoxRenderer::renderFillGeometry( + d->rect, shape, QskBoxBorderMetrics(), *geometry() ); } else { flatMaterial->setColor( borderColors.left().rgbStart() ); - QskBoxRenderer::renderBorder( d->rect, shape, borderMetrics, *geometry() ); + QskBoxRenderer::renderBorderGeometry( + d->rect, shape, borderMetrics, *geometry() ); } } } diff --git a/src/nodes/QskBoxRenderer.cpp b/src/nodes/QskBoxRenderer.cpp index 0f1a1e52..5487b75f 100644 --- a/src/nodes/QskBoxRenderer.cpp +++ b/src/nodes/QskBoxRenderer.cpp @@ -7,6 +7,8 @@ #include "QskRectRenderer.h" #include "QskRoundedRectRenderer.h" #include "QskBoxShapeMetrics.h" +#include "QskBoxBorderMetrics.h" +#include "QskBoxBorderColors.h" #include "QskGradient.h" #include "QskGradientDirection.h" @@ -35,24 +37,42 @@ static inline QskGradient qskNormalizedGradient( const QskGradient gradient ) return gradient; } -void QskBoxRenderer::renderBorder( +void QskBoxRenderer::renderBorderGeometry( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) { + geometry.setDrawingMode( QSGGeometry::DrawTriangleStrip ); + if ( shape.isRectangle() ) - QskRectRenderer::renderBorder( rect, border, geometry ); + QskRectRenderer::renderBorderGeometry( rect, border, geometry ); else - QskRoundedRectRenderer::renderBorder( rect, shape, border, geometry ); + QskRoundedRectRenderer::renderBorderGeometry( rect, shape, border, geometry ); } -void QskBoxRenderer::renderFill( +void QskBoxRenderer::renderFillGeometry( + const QRectF& rect, const QskBoxShapeMetrics& shape, QSGGeometry& geometry ) +{ + renderFillGeometry( rect, shape, QskBoxBorderMetrics(), geometry ); +} + +void QskBoxRenderer::renderFillGeometry( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) { + geometry.setDrawingMode( QSGGeometry::DrawTriangleStrip ); + if ( shape.isRectangle() ) - QskRectRenderer::renderFill( rect, border, geometry ); + QskRectRenderer::renderFillGeometry( rect, border, geometry ); else - QskRoundedRectRenderer::renderFill( rect, shape, border, geometry ); + QskRoundedRectRenderer::renderFillGeometry( rect, shape, border, geometry ); +} + +void QskBoxRenderer::renderBox( const QRectF& rect, + const QskBoxShapeMetrics& shape, const QskGradient& gradient, + QSGGeometry& geometry ) +{ + renderBox( rect, shape, QskBoxBorderMetrics(), + QskBoxBorderColors(), gradient, geometry ); } void QskBoxRenderer::renderBox( const QRectF& rect, @@ -60,6 +80,8 @@ void QskBoxRenderer::renderBox( const QRectF& rect, const QskBoxBorderColors& borderColors, const QskGradient& gradient, QSGGeometry& geometry ) { + geometry.setDrawingMode( QSGGeometry::DrawTriangleStrip ); + const auto gradientN = qskNormalizedGradient( gradient ); if ( shape.isRectangle() ) diff --git a/src/nodes/QskBoxRenderer.h b/src/nodes/QskBoxRenderer.h index f8dd3c1a..efd0f940 100644 --- a/src/nodes/QskBoxRenderer.h +++ b/src/nodes/QskBoxRenderer.h @@ -18,17 +18,35 @@ class QRectF; namespace QskBoxRenderer { - QSK_EXPORT void renderBorder( const QRectF&, + /* + Filling the geometry without any color information: + see QSGGeometry::defaultAttributes_Point2D() + + - clip nodes + - using shaders setting the color information + */ + + QSK_EXPORT void renderBorderGeometry( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); - QSK_EXPORT void renderFill( const QRectF&, + QSK_EXPORT void renderFillGeometry( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); + QSK_EXPORT void renderFillGeometry( const QRectF&, + const QskBoxShapeMetrics&, QSGGeometry& ); + + /* + Filling the geometry usually with color information: + see QSGGeometry::defaultAttributes_ColoredPoint2D() + */ + QSK_EXPORT bool isGradientSupported( const QskBoxShapeMetrics&, const QskGradient& ); + QSK_EXPORT void renderBox( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, const QskBoxBorderColors&, const QskGradient&, QSGGeometry& ); - QSK_EXPORT bool isGradientSupported( const QskBoxShapeMetrics&, const QskGradient& ); + QSK_EXPORT void renderBox( const QRectF&, + const QskBoxShapeMetrics&, const QskGradient&, QSGGeometry& ); } #endif diff --git a/src/nodes/QskRectRenderer.cpp b/src/nodes/QskRectRenderer.cpp index 7cc5e302..d82433e4 100644 --- a/src/nodes/QskRectRenderer.cpp +++ b/src/nodes/QskRectRenderer.cpp @@ -387,7 +387,7 @@ static inline Line* qskAddBorderLines( return line; } -void QskRectRenderer::renderBorder( const QRectF& rect, +void QskRectRenderer::renderBorderGeometry( const QRectF& rect, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) { const Quad out = rect; @@ -409,7 +409,7 @@ void QskRectRenderer::renderFill0( const QskVertex::Quad& rect, qskAddFillLines( rect, gradient, lineCount, line ); } -void QskRectRenderer::renderFill( const QRectF& rect, +void QskRectRenderer::renderFillGeometry( const QRectF& rect, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) { const Quad quad = qskValidOrEmptyInnerRect( rect, border.widths() ); diff --git a/src/nodes/QskRectRenderer.h b/src/nodes/QskRectRenderer.h index 248f6b56..5a484500 100644 --- a/src/nodes/QskRectRenderer.h +++ b/src/nodes/QskRectRenderer.h @@ -17,10 +17,10 @@ class QRectF; namespace QskRectRenderer { - void renderBorder( const QRectF&, + void renderBorderGeometry( const QRectF&, const QskBoxBorderMetrics&, QSGGeometry& ); - void renderFill( const QRectF&, + void renderFillGeometry( const QRectF&, const QskBoxBorderMetrics&, QSGGeometry& ); void renderRect( const QRectF&, const QskBoxBorderMetrics&, diff --git a/src/nodes/QskRectangleNode.cpp b/src/nodes/QskRectangleNode.cpp index aad931b3..d58908e4 100644 --- a/src/nodes/QskRectangleNode.cpp +++ b/src/nodes/QskRectangleNode.cpp @@ -7,11 +7,8 @@ #include "QskGradient.h" #include "QskSGNode.h" #include "QskBoxRenderer.h" -#include "QskGradientMaterial.h" - -#include "QskBoxBorderMetrics.h" -#include "QskBoxBorderColors.h" #include "QskBoxShapeMetrics.h" +#include "QskGradientMaterial.h" #include #include @@ -22,21 +19,6 @@ QSK_QT_PRIVATE_END Q_GLOBAL_STATIC( QSGVertexColorMaterial, qskMaterialColorVertex ) -static inline void qskUpdateColoredPoint2D( const QRectF& rect, - const QskBoxShapeMetrics& shape, const QskGradient& gradient, - QSGGeometry& geometry ) -{ - QskBoxRenderer::renderBox( rect, shape, - QskBoxBorderMetrics(), QskBoxBorderColors(), gradient, geometry ); -} - -static inline void qskUpdatePoint2D( const QRectF& rect, - const QskBoxShapeMetrics& shape, QSGGeometry& geometry ) -{ - QskBoxRenderer::renderFill( rect, shape, - QskBoxBorderMetrics(), geometry ); -} - class QskRectangleNodePrivate final : public QSGGeometryNodePrivate { public: @@ -154,8 +136,9 @@ void QskRectangleNode::updateNode( */ if ( dirtyMetrics || dirtyColors ) { - qskUpdateColoredPoint2D( rect, effectiveShape, - effectiveGradient, d->geometry ); + QskBoxRenderer::renderBox( rect, + effectiveShape, effectiveGradient, d->geometry ); + markDirty( QSGNode::DirtyGeometry ); } } @@ -169,7 +152,7 @@ void QskRectangleNode::updateNode( */ if ( dirtyMetrics ) { - qskUpdatePoint2D( rect, effectiveShape, d->geometry ); + QskBoxRenderer::renderFillGeometry( rect, effectiveShape, d->geometry ); markDirty( QSGNode::DirtyGeometry ); } diff --git a/src/nodes/QskRoundedRectRenderer.cpp b/src/nodes/QskRoundedRectRenderer.cpp index bba4f4ca..fa05cbfc 100644 --- a/src/nodes/QskRoundedRectRenderer.cpp +++ b/src/nodes/QskRoundedRectRenderer.cpp @@ -1157,7 +1157,7 @@ QskRoundedRectRenderer::Metrics::Metrics( const QRectF& rect, ( borderRight == borderBottom ); } -void QskRoundedRectRenderer::renderBorder( +void QskRoundedRectRenderer::renderBorderGeometry( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) { @@ -1176,7 +1176,7 @@ void QskRoundedRectRenderer::renderBorder( qskRenderBorderLines( metrics, Qt::Vertical, line, BorderMapNone() ); } -void QskRoundedRectRenderer::renderFill( +void QskRoundedRectRenderer::renderFillGeometry( const QRectF& rect, const QskBoxShapeMetrics& shape, const QskBoxBorderMetrics& border, QSGGeometry& geometry ) { @@ -1205,10 +1205,27 @@ void QskRoundedRectRenderer::renderFill( return; } +#if 0 + if ( metrics.isBorderRegular && metrics.isRadiusRegular ) + { + int lineCount += metrics.corner[ TopLeft ].stepCount + + metrics.corner[ BottomLeft ].stepCount; + + if ( metrics.centerQuad.top >= metrics.centerQuad.bottom ) + lineCount--; + + geometry.allocate( 2 * lineCount ); + + // TODO ... + qskRenderLines( metrics, Qt::Vertical, ... ); + return; + } +#endif + /* Unfortunately QSGGeometry::DrawTriangleFan is no longer supported with Qt6 and we have to go with DrawTriangleStrip, duplicating the center with - each each vertex. + each vertex. */ const auto numPoints = @@ -1289,22 +1306,6 @@ void QskRoundedRectRenderer::renderFill( *idx++ = 0; *idx++ = 1; - -#if 0 - { - auto p = geometry.vertexDataAsPoint2D(); - - qDebug() << "Vertexes:" << geometry.vertexCount(); - for ( int i = 0; i < geometry.vertexCount(); i++ ) - qDebug() << "\t" << i << p[i].x << p[i].y; - - auto idx = geometry.indexDataAsUShort(); - - qDebug() << "Indexes:" << geometry.indexCount(); - for ( int i = 0; i < geometry.indexCount(); i++ ) - qDebug() << "\t" << i << idx[i]; - } -#endif } void QskRoundedRectRenderer::renderRect( const QRectF& rect, diff --git a/src/nodes/QskRoundedRectRenderer.h b/src/nodes/QskRoundedRectRenderer.h index 872691b1..eac29787 100644 --- a/src/nodes/QskRoundedRectRenderer.h +++ b/src/nodes/QskRoundedRectRenderer.h @@ -43,10 +43,10 @@ namespace QskRoundedRectRenderer bool isTotallyCropped; }; - void renderFill( const QRectF&, + void renderFillGeometry( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); - void renderBorder( const QRectF&, + void renderBorderGeometry( const QRectF&, const QskBoxShapeMetrics&, const QskBoxBorderMetrics&, QSGGeometry& ); void renderRect( const QRectF&,