using QskBoxRectangleNode for shadows without blur

This commit is contained in:
Uwe Rathmann 2024-10-23 15:20:42 +02:00
parent f3aed21a23
commit ca1951d9a6

View File

@ -20,6 +20,7 @@ namespace
enum Role enum Role
{ {
ShadowRole, ShadowRole,
ShadowFillRole,
BoxRole, BoxRole,
FillRole FillRole
}; };
@ -27,14 +28,15 @@ namespace
static void qskUpdateChildren( QSGNode* parentNode, quint8 role, QSGNode* node ) static void qskUpdateChildren( QSGNode* parentNode, quint8 role, QSGNode* node )
{ {
static const QVector< quint8 > roles = { ShadowRole, BoxRole, FillRole }; static const QVector< quint8 > roles =
{ ShadowRole, ShadowFillRole, BoxRole, FillRole };
auto oldNode = QskSGNode::findChildNode( parentNode, role ); auto oldNode = QskSGNode::findChildNode( parentNode, role );
QskSGNode::replaceChildNode( roles, role, parentNode, oldNode, node ); QskSGNode::replaceChildNode( roles, role, parentNode, oldNode, node );
} }
template< typename Node > template< typename Node >
inline Node* qskNode( QSGNode* parentNode, quint8 role ) static inline Node* qskNode( QSGNode* parentNode, quint8 role )
{ {
using namespace QskSGNode; using namespace QskSGNode;
@ -65,6 +67,7 @@ void QskBoxNode::updateNode( const QRectF& rect,
using namespace QskSGNode; using namespace QskSGNode;
QskBoxShadowNode* shadowNode = nullptr; QskBoxShadowNode* shadowNode = nullptr;
QskBoxRectangleNode* shadowFillNode = nullptr;
QskBoxRectangleNode* rectNode = nullptr; QskBoxRectangleNode* rectNode = nullptr;
QskBoxRectangleNode* fillNode = nullptr; QskBoxRectangleNode* fillNode = nullptr;
@ -77,10 +80,21 @@ void QskBoxNode::updateNode( const QRectF& rect,
&& QskRgb::isVisible( shadowColor ); && QskRgb::isVisible( shadowColor );
if ( hasShadow ) if ( hasShadow )
{
const auto shadowRect = shadowMetrics.shadowRect( rect );
const auto blurRadius = shadowMetrics.blurRadius();
if ( blurRadius <= 0.0 )
{
// QskBoxRectangleNode allows scene graph batching
shadowFillNode = qskNode< QskBoxRectangleNode >( this, ShadowFillRole );
shadowFillNode->updateFilling( shadowRect, shape, shadowColor );
}
else
{ {
shadowNode = qskNode< QskBoxShadowNode >( this, ShadowRole ); shadowNode = qskNode< QskBoxShadowNode >( this, ShadowRole );
shadowNode->setShadowData( shadowMetrics.shadowRect( rect ), shadowNode->setShadowData( shadowRect, shape, blurRadius, shadowColor );
shape, shadowMetrics.blurRadius(), shadowColor ); }
} }
if ( hasBorder || hasFilling ) if ( hasBorder || hasFilling )
@ -109,6 +123,7 @@ void QskBoxNode::updateNode( const QRectF& rect,
} }
qskUpdateChildren( this, ShadowRole, shadowNode ); qskUpdateChildren( this, ShadowRole, shadowNode );
qskUpdateChildren( this, ShadowFillRole, shadowFillNode );
qskUpdateChildren( this, BoxRole, rectNode ); qskUpdateChildren( this, BoxRole, rectNode );
qskUpdateChildren( this, FillRole, fillNode ); qskUpdateChildren( this, FillRole, fillNode );
} }