using QskBoxRectangleNode for shadows without blur
This commit is contained in:
parent
f3aed21a23
commit
ca1951d9a6
@ -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 );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user