From e31c063937ca4f6f2ab93d0f889c4610ad0d1ca1 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 23 Nov 2023 15:47:08 +0100 Subject: [PATCH] QskLinesNode derived from QskBasicLinesNode --- src/nodes/QskLinesNode.cpp | 192 +++------------------- src/nodes/QskLinesNode.h | 17 +- src/nodes/shaders/boxshadow.frag.qsb | Bin 2650 -> 2639 bytes src/nodes/shaders/boxshadow.vert.qsb | Bin 1565 -> 1552 bytes src/nodes/shaders/crisplines.frag.qsb | Bin 870 -> 869 bytes src/nodes/shaders/crisplines.vert.qsb | Bin 2512 -> 2510 bytes src/nodes/shaders/gradientconic.frag.qsb | Bin 1840 -> 1830 bytes src/nodes/shaders/gradientconic.vert.qsb | Bin 1630 -> 1617 bytes src/nodes/shaders/gradientlinear.frag.qsb | Bin 1440 -> 1424 bytes src/nodes/shaders/gradientlinear.vert.qsb | Bin 1608 -> 1592 bytes src/nodes/shaders/gradientradial.frag.qsb | Bin 1540 -> 1526 bytes src/nodes/shaders/gradientradial.vert.qsb | Bin 1478 -> 1472 bytes 12 files changed, 31 insertions(+), 178 deletions(-) diff --git a/src/nodes/QskLinesNode.cpp b/src/nodes/QskLinesNode.cpp index 7f1e50dd..1d89715e 100644 --- a/src/nodes/QskLinesNode.cpp +++ b/src/nodes/QskLinesNode.cpp @@ -9,17 +9,9 @@ #include "QskStippledLineRenderer.h" #include "QskSGNode.h" -#include -#include #include -#include -#include #include -QSK_QT_PRIVATE_BEGIN -#include -QSK_QT_PRIVATE_END - namespace { inline qreal mapX( const QTransform& t, qreal x ) @@ -114,115 +106,14 @@ static QSGGeometry::Point2D* qskAddLines( const QTransform& transform, return reinterpret_cast< QSGGeometry::Point2D* >( vlines ); } -class QskLinesNodePrivate final : public QSGGeometryNodePrivate -{ - public: - QskLinesNodePrivate() - : geometry( QSGGeometry::defaultAttributes_Point2D(), 0 ) - { - geometry.setDrawingMode( QSGGeometry::DrawLines ); - } - - inline qreal round( bool isHorizontal, qreal v ) const - { - if ( !doRound ) - return v; - - const auto r2 = 2.0 * devicePixelRatio; - const qreal v0 = isHorizontal ? p0.x() : p0.y(); - - const int d = qRound( r2 * ( v + v0 ) ); - const auto f = ( d % 2 ? d : d - 1 ) / r2; - - return f / devicePixelRatio - v0; - } - - inline void setLineAttributes( QskLinesNode* node, - const QColor& color, float lineWidth ) - { - if ( color != material.color() ) - { - material.setColor( color ); - node->markDirty( QSGNode::DirtyMaterial ); - } - - if( lineWidth != geometry.lineWidth() ) - geometry.setLineWidth( lineWidth ); - } - - QSGGeometry geometry; - QSGFlatColorMaterial material; - - // position of [0,0] in device coordinates - QPointF p0; - qreal devicePixelRatio = 1.0; - - QskHashValue hash = 0.0; - - bool dirty = true; - bool doRound = false; -}; - QskLinesNode::QskLinesNode() - : QSGGeometryNode( *new QskLinesNodePrivate ) { - Q_D( QskLinesNode ); - - setGeometry( &d->geometry ); - setMaterial( &d->material ); } QskLinesNode::~QskLinesNode() { } -void QskLinesNode::setGlobalPosition( const QQuickItem* item ) -{ - QPointF p0; - qreal devicePixelRatio = 1.0; - - if ( item ) - { - p0 = item->mapToGlobal( QPointF() ); - - if ( auto w = item->window() ) - devicePixelRatio = w->devicePixelRatio(); - } - - setGlobalPosition( p0, devicePixelRatio ); -} - -void QskLinesNode::setGlobalPosition( - const QPointF& pos, qreal devicePixelRatio ) -{ - Q_D( QskLinesNode ); - - if ( d->doRound == false ) - { - d->doRound = true; - d->dirty = true; - } - - if ( pos != d->p0 || devicePixelRatio != d->devicePixelRatio ) - { - d->p0 = pos; - d->devicePixelRatio = devicePixelRatio; - - d->dirty = true; - } -} - -void QskLinesNode::resetGlobalPosition() -{ - Q_D( QskLinesNode ); - - if ( d->doRound == true ) - { - d->doRound = false; - d->dirty = true; - } -} - void QskLinesNode::updateRect( const QColor& color, qreal lineWidth, const QskStippleMetrics& stippleMetrics, const QTransform& transform, const QRectF& rect ) @@ -272,8 +163,6 @@ void QskLinesNode::updateLines( const QColor& color, qreal lineWidth, const QskStippleMetrics& stippleMetrics, const QTransform& transform, int count, const QLineF* lines ) { - Q_D( QskLinesNode ); - if ( !stippleMetrics.isValid() || !color.isValid() || color.alpha() == 0 || count == 0 ) { @@ -287,22 +176,18 @@ void QskLinesNode::updateLines( const QColor& color, hash = qHash( transform, hash ); hash = qHashBits( lines, count * sizeof( QLineF ) ); - if ( hash != d->hash ) + if ( hash != m_hash ) { - d->dirty = true; - d->hash = hash; - } + m_hash = hash; - if( d->dirty ) - { updateGeometry( stippleMetrics, transform, count, lines ); - d->geometry.markVertexDataDirty(); + geometry()->markVertexDataDirty(); markDirty( QSGNode::DirtyGeometry ); - d->dirty = false; } - d->setLineAttributes( this, color, lineWidth ); + setLineWidth( lineWidth ); + setColor( color ); } void QskLinesNode::updateGrid( const QColor& color, @@ -310,8 +195,6 @@ void QskLinesNode::updateGrid( const QColor& color, const QTransform& transform, const QRectF& rect, const QVector< qreal >& xValues, const QVector< qreal >& yValues ) { - Q_D( QskLinesNode ); - if ( !stippleMetrics.isValid() || !color.isValid() || color.alpha() == 0 ) { QskSGNode::resetGeometry( this ); @@ -326,30 +209,24 @@ void QskLinesNode::updateGrid( const QColor& color, hash = qHash( xValues, hash ); hash = qHash( yValues, hash ); - if ( hash != d->hash ) + if ( hash != m_hash ) { - d->dirty = true; - d->hash = hash; - } + m_hash = hash; - if( d->dirty ) - { updateGeometry( stippleMetrics, transform, rect, xValues, yValues ); - d->geometry.markVertexDataDirty(); + geometry()->markVertexDataDirty(); markDirty( QSGNode::DirtyGeometry ); - d->dirty = false; } - d->setLineAttributes( this, color, lineWidth ); + setLineWidth( lineWidth ); + setColor( color ); } void QskLinesNode::updateGeometry( const QskStippleMetrics& stippleMetrics, const QTransform& transform, int count, const QLineF* lines ) { - Q_D( QskLinesNode ); - - auto& geom = d->geometry; + auto& geom = *geometry(); QSGGeometry::Point2D* points = nullptr; @@ -382,8 +259,8 @@ void QskLinesNode::updateGeometry( const QskStippleMetrics& stippleMetrics, lineCount += renderer.dashCount( p1, p2 ); } - d->geometry.allocate( 2 * lineCount ); - points = d->geometry.vertexDataAsPoint2D(); + geometry()->allocate( 2 * lineCount ); + points = geometry()->vertexDataAsPoint2D(); points = qskAddDashes( transform, count, lines, stippleMetrics, points ); @@ -397,9 +274,7 @@ void QskLinesNode::updateGeometry( const QTransform& transform, const QRectF& rect, const QVector< qreal >& xValues, const QVector< qreal >& yValues ) { - Q_D( QskLinesNode ); - - auto& geom = d->geometry; + auto& geom = *geometry(); const auto y1 = mapY( transform, rect.top() ); const auto y2 = mapY( transform, rect.bottom() ); @@ -430,8 +305,8 @@ void QskLinesNode::updateGeometry( const auto countY = renderer.dashCount( x1, 0.0, x2, 0.0 ); const auto count = xValues.count() * countX + yValues.count() * countY; - d->geometry.allocate( 2 * count ); - points = d->geometry.vertexDataAsPoint2D(); + geometry()->allocate( 2 * count ); + points = geometry()->vertexDataAsPoint2D(); points = setStippledLines( Qt::Vertical, y1, y2, transform, xValues.count(), xValues.constData(), @@ -450,8 +325,6 @@ QSGGeometry::Point2D* QskLinesNode::setStippledLines( const QTransform& transform, int count, const qreal* values, const QskStippleMetrics& stippleMetrics, QSGGeometry::Point2D* points ) const { - Q_D( const QskLinesNode ); - if ( count <= 0 ) return points; @@ -464,16 +337,14 @@ QSGGeometry::Point2D* QskLinesNode::setStippledLines( if ( orientation == Qt::Vertical ) { - auto x = mapX( transform, values[0] ); - x = d->round( true, x ); + const auto x = mapX( transform, values[0] ); points = renderer.addDashes( points, x, v1, x, v2 ); dashCount = points - line0; } else { - auto y = mapY( transform, values[0] ); - y = d->round( false, y ); + const auto y = mapY( transform, values[0] ); points = renderer.addDashes( points, v1, y, v2, y ); dashCount = points - line0; @@ -485,8 +356,7 @@ QSGGeometry::Point2D* QskLinesNode::setStippledLines( { for ( int i = 1; i < count; i++ ) { - auto x = mapX( transform, values[i] ); - x = d->round( true, x ); + const auto x = mapX( transform, values[i] ); for ( int j = 0; j < dashCount; j++ ) points++->set( x, line0[j].y ); @@ -496,8 +366,7 @@ QSGGeometry::Point2D* QskLinesNode::setStippledLines( { for ( int i = 1; i < count; i++ ) { - auto y = mapY( transform, values[i] ); - y = d->round( false, y ); + const auto y = mapY( transform, values[i] ); for ( int j = 0; j < dashCount; j++ ) points++->set( line0[j].x, y ); @@ -512,8 +381,6 @@ QSGGeometry::Point2D* QskLinesNode::setSolidLines( const QTransform& transform, int count, const qreal* values, QSGGeometry::Point2D* points ) const { - Q_D( const QskLinesNode ); - if ( count <= 0 ) return points; @@ -523,9 +390,7 @@ QSGGeometry::Point2D* QskLinesNode::setSolidLines( { for ( int i = 0; i < count; i++ ) { - auto x = mapX( transform, values[i] ); - x = d->round( true, x ); - + const auto x = mapX( transform, values[i] ); lines++->setVLine( x, v1, v2 ); } } @@ -533,9 +398,7 @@ QSGGeometry::Point2D* QskLinesNode::setSolidLines( { for ( int i = 0; i < count; i++ ) { - auto y = mapY( transform, values[i] ); - y = d->round( false, y ); - + const auto y = mapY( transform, values[i] ); lines++->setHLine( v1, v2, y ); } } @@ -552,13 +415,11 @@ void QskLinesNode::updatePolygon( const QColor& color, qreal lineWidth, return; } - Q_D( QskLinesNode ); - if ( true ) // for the moment we always update the geometry. TODO ... { - d->geometry.allocate( polygon.count() + 1 ); + geometry()->allocate( polygon.count() + 1 ); - auto points = d->geometry.vertexDataAsPoint2D(); + auto points = geometry()->vertexDataAsPoint2D(); if ( transform.isIdentity() ) { @@ -579,9 +440,10 @@ void QskLinesNode::updatePolygon( const QColor& color, qreal lineWidth, points[ polygon.count() ] = points[0]; - d->geometry.markVertexDataDirty(); + geometry()->markVertexDataDirty(); markDirty( QSGNode::DirtyGeometry ); } - d->setLineAttributes( this, color, lineWidth ); + setLineWidth( lineWidth ); + setColor( color ); } diff --git a/src/nodes/QskLinesNode.h b/src/nodes/QskLinesNode.h index 54e25b9c..4a1271a6 100644 --- a/src/nodes/QskLinesNode.h +++ b/src/nodes/QskLinesNode.h @@ -6,9 +6,7 @@ #ifndef QSK_LINES_NODE_H #define QSK_LINES_NODE_H -#include "QskGlobal.h" - -#include +#include "QskBasicLinesNode.h" #include class QskIntervalF; @@ -17,26 +15,19 @@ class QTransform; class QPointF; class QLineF; class QPolygonF; -class QQuickItem; - -class QskLinesNodePrivate; /* A node for stippled or solid lines. For the moment limited to horizontal/vertical lines: TODO */ -class QSK_EXPORT QskLinesNode : public QSGGeometryNode +class QSK_EXPORT QskLinesNode : public QskBasicLinesNode { - using Inherited = QSGGeometryNode; + using Inherited = QskBasicLinesNode; public: QskLinesNode(); ~QskLinesNode() override; - void setGlobalPosition( const QPointF&, qreal devicePixelRatio ); - void setGlobalPosition( const QQuickItem* ); - void resetGlobalPosition(); - void updateGrid( const QColor&, qreal lineWidth, const QskStippleMetrics&, const QTransform&, const QRectF&, const QVector< qreal >&, const QVector< qreal >& ); @@ -80,7 +71,7 @@ class QSK_EXPORT QskLinesNode : public QSGGeometryNode const QTransform&, int count, const qreal* values, const QskStippleMetrics&, QSGGeometry::Point2D* ) const; - Q_DECLARE_PRIVATE( QskLinesNode ) + QskHashValue m_hash = 0.0; }; #endif diff --git a/src/nodes/shaders/boxshadow.frag.qsb b/src/nodes/shaders/boxshadow.frag.qsb index 67bd10ec91548a0f74cb47261ccba78676a5b9eb..9a7990780c64b70fef57497c0cc5678079420cf5 100644 GIT binary patch literal 2639 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 literal 2650 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 I1JuI~<9Tvnz5oCK diff --git a/src/nodes/shaders/boxshadow.vert.qsb b/src/nodes/shaders/boxshadow.vert.qsb index 3f9a0c90bd92c8b57cc77a43b871f4205438cafa..4d37149243a5e43d074dc658723291e6f1a8ba4b 100644 GIT binary patch literal 1552 zcmV+r2JiU*03numob6icZq!x~K6^<*9Kt1B(iRGaP}l{u-9*bpY=c06S|lVQQlUyw zY8Kf1nPj_kibi$!6tzEPzVb`QMtVk*}>%2NyxoN5MaImC}UN>SUtIPnGiA1VS{(ODFDe$Q6~Q;4tv_*H4z8G{UIUXx(V4 zxGSmQqheC-G2))-c(|Vw>d3IHXHXxc$U8^&k)9$NZG0ofz@}PLDW)QMWht*hfz=u# zd_vFBZ_b+_-wCfoxOT)F)Q;?vCI%2 zWB8Q#i&V$6Oh z?e_Zt+Q7IkQqK2*!h9|>{3V9FLb6}LF48s9y~1>_GTl1)yGqz0_a7uWB7I*d-JaX9 zgV6CkeZJY$v@i-{E7I5EuJ%^bVfDl)s~D6+iK~S@A?6w1GD4AVaiz0&9HA< zkz#aR-vpCx96Z{JY%j<4`=;eYuiM&oThn6C>H0wrz3VZ20BgexUOV2pGHUsL&}nOC z1ktR;k*&CnXABdxPyo3__7>XlosNzrsMRSksiQA4b>yzQ#*!a85f)@o2GLN->sPtG zZA}|dQ@Bb$|1WBqNt9dTRb+sQ9sK*{E9alGP@D9(S}-|tv|JNvMLz}nqyjBj!aSsPb= zx4=yo^f2=~dSI_RVPprjwPq4);BOi|^9MgrnYFfBGBkriyQ4!LfAqWE(2i@5y9ZC7K6}{ARVnes0P`w| zAs(K_QNaaeFv5H;b-*k?XNA~K+8rY_cHHy5*sZ1MUFUsPmyJ9ax0Zz>ea;D>&I6HR|}U zBHtg3`mPyuF33GAKJG0bt3&p{$N;zY{yk#n&&FMIOUc5_!&rChl{-&WWPdZk8<8>R zc$OP?Z2haA9ht5XMjh8#yQ^jV(CKx)#E-_yyYM;|;x`M=?AakqsI5z__Kd4_(S?SXjK?BwuZ`9Tpzzi=ATQjT-zy)cFUUvHPO^&na{Uc(Y_52H CiwlAP literal 1565 zcmV+&2IBbu03kMbob6hBZ`4K*-&`&saS|Tk)fNhdP`C@|dPK)VT!TO~YLSqLNQEjz zsd0S1;MQj!ek1`DsjAcu(0}@M`Vsnd`cKu)?9QIYc8)4lsX`P-ws&TJJFgwDJqJRF zF`cZWTpCXISDDAT835^FTkG zM~2KmnNjj+n0`c$i*=ETE{rDNuE%|b8i#XQ^n?wbL=XddJw>ty40l`)lmotWK?V4L zi}^7P5F7mTz-~<7<>6o(Kz&Gq1FophUP#AxIZi<=K4^`^5_pW+4&)?^`6XE@9Y?|E zK3H+Up+vkUxIYa3u49_+9lC>}YG<@EcLaw9_VWBr}1YAit5{CVG;1C^sm6EjK8~BcyMJ z^i`!FD(5pa_ZaCpN^_4bg$!EXDQ_&?iZk(mf&bqR@I?=;1A zitL@1@n^A~rSVCkKOx&Qgh%=u@lbw&eAV%2U&je=(%OtrJaZI}pm>nJ!gBc;jmMe1 zPCng+s;G$U$wb^Az`IY@s> znDe9u9DW@Va5tL+fS= z7hr{Hq7*t|79Ec=w!A)Z`^g1R6T&q(U5^OHAdC1-Ht>rNG5)6M) znrx_0&3UeG$1qq1vA`B|`hfkN1M|9WB;CGeM(&0eCvH?*Z))RFxMlV1@54w1-P&$R zTNc^6XF?Kw2)o_bO=?cF&hkS*neGCvwF^!yLjib;0~ZufEl&Y>n*$XtTeKp!@urNX z#VkR$>S}$Vy6nVrw972}?VM<^+IeQSc6mK)rMSSfUL_X5T_{vt*DK49pFOu8MPVFU zkAr@i&emMG-{1vWFTopcU_ut^d``9{ADD8O>VYh+fC+21;aVP!wZDTb zFLG%k?|!yeC6q1)gk^5#VXQjTt~E%SV(b!tnjT6*fjFm;&u6Z>OIRHqizjlEGztnv zcKFUy71=i=Zba6c7dU>}am_D!Zesfud?NbZ`h6qg$6l}VIbIqs@52Tgd%=bo*gZFf zC)73NtoAOu{$QWtJ3o~m+xv;bcYmtlf3^RU8yIa9GqBr(vAUYZu(|r76Ey2HIiq8s_V5lk&OK(hCrtgLh z-SKue`)+9N!|#SoJ9>?^&c7W7D^~o3$O-<(FA2=$cJ?JP@>7=6g@c>ZOj3SL|HtXx z`)iA>ju2U=j=jW>yi+%cySGk#QjXu%sULRf8O^)&!>;`Ob>;iLYyO8W7I#kX0Cus! z+TR-_Z-lXIem`u4_e~@Go*Ui|y`SAr4eE#1dBT2M`R%at+&`UX7E`u$bJU#!)1MY* z$k!F1_#3MT+1gWQTj;_LaA*6WbYZ+l7Wv;D4sehBet&nUmOtL~?>g%L1&GqWa+KtS P-y+{BFU|iO2?(xH=92#2 diff --git a/src/nodes/shaders/crisplines.frag.qsb b/src/nodes/shaders/crisplines.frag.qsb index 7d310ef430750d50e7f8934192945920beae2f07..9a0addc5d5f10383cfd457d15d579e434113d5c7 100644 GIT binary patch delta 830 zcmV-E1Ht^}2IU3>000SikpvR4nEFrG6G>k`aECJXzkV}ag-94a-+rFs<=(BQmlgl<3%s7Vb% z@cr_Cpm)%U;z6skZQ%Z@&_e3A20mCCPS0|E#FrSBSr%9o<6(u^ZQ_3g_A;&Kg*~6y z^~@*7s!Yn3VsqrTr(h+*4#j!p48yZm;eD65Qu_|sTi{g^c3D(~>l?5_v2>U>!M{r4 zRRmTMohegZU9y)5y9KsJdlibWQG7{gAoERseQLzHLi@|axgvCy*mbbiC?Bl-KH2MJ zWBdmBBIhGGqr~#h0`vL-2x|Qdp6I(t{K&CGHEt2U3lU3X|AZ4Bi&I#I`isVZ-Z;M1 z&v+QQfv-O_3~d~8+ZEQS>zt1D;V7`;?hNeu0BTVjCU&g%lc9E@=`cJi?%*SICtU%5 zoN>FO+rcOZGrO%v?m6#jQy@rucNl~oGUy3B06GiYfsUy*nndc1%om~MJhx)&*f`O5 zglCILrLIj^m4{HOVTQS$wo=ezxn@(q$$MhzjyeHnR45!vpQ`QtTh=jqRV zx50JDLvi2}J>-rX#XM~Ejg&VGKAE0>^#ORr&FV}#g5H!xLCn~)KL*2L#N&o-G-XxN zRXU113Vt2cuPyyhgo4|4Q>p^GTCr=Vw5kxKc<=D_+aq&745G+gBPGu>CzzMx0 z^PLqsJT@e|&=MWYD+M)kL1#~!?FEs^Ixh);k{oUZ!jMiX(o#=X>J=T~aT5A}1%j#C zycx;VK_~SBi`@33>N3J(`fREPcE?mRN^&Q=}JRU(mxGthD z`~Ar7gnGwGbLEy(pYwZ8M3}FEHTf@JQk<03iTI_KD}{# ztDo~Qasyv~Xc*ckw{B^;xMsey_Y!JrKZF1thj@Z&>eSw zh2xyt9o-IwL73TXJ#sI2SDOGq;=4`|ddQ$B@Br6&;P!P)wb3Nf!O(mWT7&0SY@HaV z`i?-hh;*W9h1$j}AD{Eu+QxsH?-wQCuX(=P|0v%eiDi@nIqu8I8AW8fSLTn`w4J9v z_uU4l!$Wc46FuYuH;Q@K=ou+*7<@8+J?jJTiksCLcLcpDi-MSuWq%ADC*pC#Hkz_3 z36(&RM*-JSaczl15el&Frc?!VwPM#!X;mRe@uS1nZ;#FWFo+`aO%jiiIF+Rk0w)|D zoA0b}z+*$Q3oQ{~UMZ-V3p#z;bT5cZ);S{pN*Zu85QYS)o|byLQm^O;kCV`UFAz-B zE?4M>E$#AA-SzEZ(&ze9kH^-~gg-7rx3{b1{>b(E5Ae}C+l6Zwx&A=+Essag53Y-- zS-&6Iolx&MX|CLI>T`b2i3syGu!cW%>*PeRG>qoysf@%ukNZljTs7>#2T6R9-96DU zh?ciogg3KKGL6HzqhC&BjzK{tb@d}sWDlg;DEGXeqOYp(Wo5tCjQ$HM^kiy3^%Zeq J{08Tw-~;fgpW^@k diff --git a/src/nodes/shaders/crisplines.vert.qsb b/src/nodes/shaders/crisplines.vert.qsb index bff4576922ce44691ed1c04677ca296d67de2491..27f5213f1e69491abe0f393feb12b3de8da180d5 100644 GIT binary patch literal 2510 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 literal 2512 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 U#GHy{to>`nXoAoF0C7n|7(Wh=0RR91 literal 1840 zcmV-02haEb02lyxob6a!Pa8)R9*jw-Ly{&vd8m*a2&SBxB?7tKOe$ zs1wj8SOYY3(CD!vpifcXs)qYey-b4JF7pBIfU2Sm4pJr6{s zpN~~6y-x~+IDkX=FQFU5pyNWn4X#Px)-d21FpEG39N_Gj;Jd@%>XD=1#M#Ff8lZ?V zld?bZI&pe1-2=c<3F0Ow)G04yx72<))KO7ln|3<|NQ@eb876g0Rwq&g*Ciwxg!&@NJuW zK`+?)rXL=0JLG-97XyGz+wZ~6_oD*n_xN!y&^iX_t70m(>mKn|=;qd!WG+?=C#VPE zw%usz$>W%Y9bneoaEII6HOeur97(>8j}V`NSh(k?)H#^1Viz-SR71N~LQMi5wj6Hk zY(3e2S}uh_6qTR&%@(I&)75~j-3QN0o15F~SsBOx;msEBk=E>ihMlM7T|2C~oKz4* z1h&RanZ>qUZ@F>hxR5NrlOju|#OzN-hTJuUe8$LH*=ibdo=UX?uOj?_g7bVctvhJ6 zjb$V9YQ7ndaoV_Pn5NBbKWEO0;H~3~%z|~4Hf|dWR<3Yot}vf3x%@)DkiWAy zUrigcT1j=4M$-=M23RuNfB{wzn(Z{|vJWE7GKs_~TaI%h6rg8%k%{Q~2fz?v_Km6m zZq?kfhwmx}a%`9NE{n=Wc|u8(i~+`^Xdnm)(m9qMj8=Qv;C3r`mBKXzZPJod=`2l& z#hJDnMqc0>bJ=XF8M=-qs6(%I*p#U*_OU&mcghvAN1->c^yCU8-D$fH6nkf-(Z^3) zQ*^c%=q?6~qE2@P3S4OUUNs0CVx7cc)L7C}D&^dIr{Dq8w!>r3uaSS!vlI|-GjX_D zZOm9>Mkvyzi9So-G(oKH3GzCB>+u z)P}Y+nwU9>6_$c6_z`i>!6t__cM3K<{C%{svjJ{bto(dd?!lw+rh1m06gw|AW#byO z0>fj+sNkPO9q@+7kZH1^=&MW}B9iPf^^FO7ET(7ZSLdB%@>rvIBZOPkcnRV?)_9}D z+t7GP;%#ZXG2-nCUq@qo==W4l98(mBqA~s}8eP!nk3dU8;75fo_&y15c(gD?ON!XA zA@5_L$LT#OhC?mDEcz!KLfv~N&i{mBdl}SP0s2$2pA>P8i`*bj;q->~J|o%7WDn^n;#~y#3dKG`_L2Ua^rO5%Sf%d^!d@VK zNM9o!>bp+*R6I!EpnjA$nL1#1`ZGQ8W1;_Y_UBdQ4<7kONq&*u$H_j@1>z}uiOCvT zfd2{BIh`WrSKy41tQC6-VJCd6xS>%6D zyakF4`&J-(mx!ly+$A3reUE6Bmm>K&PJPPO63G@dAD0K@d4>2&-+j`Tq&^k%D(SpW zey$PkF7%`AFPXfWt!ehw$zDmb_kj36lH5a*eL#8(#QP1rC_q~voVxbm+OP;Xte+Is z+63vx`F@VcxvuP;C)^h3!TEHNcsT!`k?u*7!@l1^AJPT6y68uhBNji2vCdH?m;I+7 zKmI>>y#IqoQp}PN1y+AyA4g@`nNIg!Q~6=&+7%%Eh)Yw~4JvBtQpI19cYN)NA486>yhxDks-~N6^x@G&KD6Wfg27vs$ zBeI@(O>BUqPJ#}O4lT+K0ZYg0q4E*ivhng&@h#T^xTSl(6|V>J``@u71U)z0t`#Ap zk9*G$_bnFMfCus(jEl#ZNDFN*KWW>`>CW~t|1aHMp!oEi1&3X1F8UX$ciV0LLwn5| ezX1)~W)iIL3$390zV6aj-=1x0IQCCvMMfv1GoT0n diff --git a/src/nodes/shaders/gradientconic.vert.qsb b/src/nodes/shaders/gradientconic.vert.qsb index 6d5b229375f0edbca64124470f917d56fa65eb19..e1b0505ce22435643e08ffde070d5f92dd807372 100644 GIT binary patch literal 1617 zcmV-X2Cn%403?Zcob6g$Z`4*0KH1&e93b41mKKU36n43oCEXB28U#wK1}RdafDlp? zS&rA6y4|&deVhv@PgURg(idL(8~OwKWBNb(QnfSZjO}B4H-uJAA;ieLo;lxK&&>F& z2xDxB$*TnSINM|n3mAvbZ8pbz_!qDytW*&47hNoOon|I`0YWChQ3Ydta1Ztp!9|VP ziiOf%77#wb)>y<^3|)?r=jRG)0PbU~!z}P6U@nBf*a)pXRB$KbhjH-0VV;OL$i!PB zks;RQ8V3s@+W;XOM3;p<7eu9>^KrWJmj*%{z?feNUFZcJ68bH0O#+vC0Z)Kg1lr&L zXFCLc+6(?quRi)dM&HeJsq#~~G%<(}4cxv>+*6Q26dHj|!S8Pto-7z4ZyJrMy7ar8 zC?2IOqsJY~#hBSJ8M}(Iu!8hwq#NmD3Ox^Wyrunu?oa561e5Z>S@9h6`Uv+>;gyIt zukgymTTplv;w>q>e&Rh9zLpbx==W*(zO2N7^d-f|EA%{)V9J7r@@L?)B=BY7i|p94 zD0?05k3b*BHb84S&_m=m@@I%1CLZE7!dD1C!s6bP_z~I%jmB)0+V$T>$^y? z4+y@@tww8~)7lmC73r(Qi)~*c-H5M}?NOp{5f=5`g}p4XvD&aM+b&c_YP$Il>x^i9It zAU&90gZAVa*)a(BCuHlM98;BehOl%_!9xF%I;ZZ@!rRTMVe#B+PNBfjtV-qU6gS3j zG`rrP*@g6N79YB#KBVhPtmxaMq95tIr1NO@9qjCjeZ50_^av>Q>k9=xso)y47RNM2 zvJFLcT9Lg=_NEEjW!56mWXUmP) zo)L^q$DY(}$Ky^g=lelZa$9ZR;<^=XI5uClxa+IzkXr%IFg7etrTq=dcKObXwmYL~ zk>|Gjpo2c>5qtn^(+YN6Z=GyQs}={J)*|j8w*emkcecqRZPRy~I!0WrQ5-@_pH*?j z_Kto_m@o?Q2)MDMU!RqLLS*Z0bIA`~j+rBj%#waR>&vdD^+-S5eZL;Y^rvf5zxjfj zu;2vm*3RU>#!G-Ft^!zH+v>KF+bp@%KAJo<8~HBnR`2xZ`snba|3m4c*GeBfPd9Sv zo!v-3;+ai!z4xwpUMtP>%c03RFb{95l<0IwSNS&^47ETGvvgk%oOL$@$E$1gIL^S| zGCS6Heju~b*lq~tOmgnN4mtncZ?!^)SM7RD*^WsGR8o;cH&nC)D{0Atjh98ZsE7h^ zs|ye+C5M|TqNslIKx3ySOA5*wJhLeiYNls0OG$xc@!8g<7J0Jtc=?$*7x-alKK3>u zPI)iNfLl+$em=LjxcpUJ`qM?lV#ISg$eFCPVnHpu`}&h-N=&$HdQ~8^3 zDF05>t}2>uswGzwHC>EZwr3%oI5pNC)5Yi5c{QoCD!?doni9EWbTKRy_=1oim1AT> z%M?uk8>iJyJqR2g1zyg`Zm*_>SzMVvYU=-~snw;-`{Q3Wdm2(Y=~KY;hdmA6{)Ko@ z!z1+~3sfrOeVH*8mi~Vrj-1^I*R$JE)6u`|INWMO*EZYk+5;`+hi<2N8$XP1AHZ=e z#Gfsm)p4M0ZATYUGhI%K$wX35i*fD#hv!9d1mmq^4!U*C%1RW%AZ`1$SFf$E_UxRM zl?{4CP(i!v_3rzXmEsb?DkqxQPW5D+w3YM-cf*4UsHL=*1jq~_k%9^+YLs4Sd%*&7S?lfeb4o7@{DZc P^~6_RUR-|zA(JGiM*lJj literal 1630 zcmV-k2BG-?03<4Sob6g)Puo@$za;!Mw6wIab!%6*bdUfwDdSJIjH(r#N+l!^pb810 z$T$x3me|yGfVARi+S^|CvX^~^eSm$KeUH6N+d221n_SxoP)%i&#wf(++~4_okMF%c zz!>Xd;!441gdH%O`7DIrM{J3C@Z+;0jC3O8AG%od8e#?Z8e|HDMh%R0z^A8$1deIU zQuL=z(2wYDw#%xl1b4mgE$_D!R5yGEScRG3iO(GHpRs-#d#d2B$(s>yz-BHF){g|6 zB9UI!=~j#QRlL?TP>ArUxzRKYu&f^oFKIQ%x*5Lz14KMeDAPOF~9eG zy;SzhaQ0|cuL2l&q3;}l%)V*;;FU^&9cHXtHqV7PbVdLz+XanFp63^1=vfslz-F*- zTj9DHI$j)Xyh*}?(DcIu@URJR-*jWRxg^SiaVMgxLQoElPHsRCFKfi$tPS`A}HD2f*9BjE#PMjO@EjumV5(l)bxqPM1cr^>cyg7sg^T}<|(ySvk3v?4Tv<-G!Yp)gfKKM znIfHslb9YICUnm(ICw8(RVQgt1sIW1Kxo5@C{U>ksgd$27)|^W;vOdiNaYyOghgsN zft8bGH5~QruTbEt28~@qBN_nQ}X-@U-Ym*uv$&O=D2%gTUa$i@M*Ui+Q^MPzM{O( zUfITJm2I3-*&IWQ?nKlVC{rc8tgicY2Z5S1UNtau&3hpi|9Q4J87wa4YEFdj~kA((MS8q7<^FR1&ku^3(}ADfI=?=EqCQEPIuMm(K@EV z1Bdy&-~i6bJJ2ME4O7@fzVf3E$7;X-nYy zX>O4BDbRy7*2(?q<*^Qu{_fZZ^<5`lu8}^Zhln=}^bPVI^-mIglW3G5CTx!~eoKk( zGrI34eRoJ7Bm5o8pVW7kV(;dBk!y{{zNE1S;#wy*R0r(M9bE>RKCf? z)!%*8$&;t#_c(pz2*#Vk(^j+d`Sx}-fLFG%XSuoT&Q8lS`u6rd-6ANV-EmvLVQg>L z3nUY>p`2V*)IwGo5qcUSh`Wq5sypbJJo4`BOhHsGkSTi#QTb^=obzI|&HCmTCsZPDb`8isvQFBdY_&W#S)YpzU c$iJbA|C?cn|KCWA$5xaR#}o4Z0(}!Cf%SSg#Q*>R diff --git a/src/nodes/shaders/gradientlinear.frag.qsb b/src/nodes/shaders/gradientlinear.frag.qsb index 87c773bd79eda6ecb48c34ea4f1f5c0accc7072b..0d0426783b8b383520696f0bee424b35d38816a5 100644 GIT binary patch literal 1424 zcmV;B1#kKQ01<$AoaI;DPa8)NUoc;FNYbPIX50I)?)C^M%5&fP*uScOP+$5nvpaXU9EP-N)IM~jvv+1^elz=(iF}4ahSzAJy_` zAvX$}Qa8>_jdI-(**&&&!=&5L@oI$*V>c?fHYisd?|{{?mTQ^`oL_?(671+_M8_W| z(%%Dlg61RIZ-l+YOsk;Hb&xL7dbQHId=v05!S_YNzf5}6Es>m`$&W!E(|MYK@uvuX znEbCZ(+m^jkMa%D;rdOMx0G2&d75Z;|{tcwmknFw^*`e*!v; z^%3QF$HH(){}cH&$=4;^8>IUUcJUCN2V|FDDp=>wzz*}OQ_howkF~o(b<5*jCA$s4 znbJHN9oBM(u&hPPlU(S zUf_L|@ZK6%e7C)q8$dSNq3PVyJ8hLb)a#WJ9kF5zeOs1jzWp!I{=X#rXN&N?lJLd< zj_^2B2Dl45Tg8Q?x{Urg|8JiCBEi2)Jl@;$CGj=xgK<|Rnxrov@19JRNZkE)v6c9R z7xM2Rlul{kXh8??Of|p<0{swoyQxsF-)>sfAVX87is6E7XzVECis53@6mvU2%8v~8 zN?AEOZ-p6bnd)vSu7u+ib{&Kp-C0={2=QH=TRsW4?Ors5Xk)%OP|WH^9g>m4p!jaLkK70p-6#s;b^Zx zKPZYGw=Y{dXRo<#2@Chy#{Hjlj(2x;UEFqaZ*PF7jLvGI-Q6sOmJMP*vVC=j$|#T# zG`q(Yv&f;7Z{j(U9)`NcEB=! zOBvI_yTgcPL7O#;_i~;iKFiL_S4#u#1{s}d#kkT-C$5M&o9znAr`~TC=dtNHY`IaL e8NKi-FFh^mG2kzKrAN=TWh7U9^!O7u83^EqYs;Jf literal 1440 zcmV;R1z-9A01;7moaGnUZWKqbeUrgJAcO=kr0or4mYB`PvI)W1GO}}6Lc;Po5D8hM z_H6HZ!W^ra9%BpnId6H)SLK89lB24-W~cYUiV`IcX{l$rs_W`H`e2MrF~%mLk3ql6 ze3q~fddjw0%$iKHW13@sP-DFf=dQ38a0u3Bn_Ye*^=(|!?11IK$=Esg7vnvPY6AK! zi$JmhiGjA|Jk4!bbng~}S#|^_`#@fruwfI}?II9$K(-H(6+0oTb_&Z!HM8K-QM(`_ z0zr(qw9v7)u~VBSHM7=gUsXD(Xh(wkp@`eO8HjeAWGe7^0E1LE`NI7dQIKUp+`ivQ z6P2iwj?5MurxL_|m^USV97!cYFH_AhI9RvvSr9cp!%yvS-Endh!DA80tRsBMHP@=+ zWGc;l#Sik9^Ty%OT45s8^6@f{gi3?sRSU_Fq_2|HLh%HI1?ptgIW1*HB8cl=lB*tx zyag-WOu{7PFJJojck9*t{UMw|Y%_9AyB#;>F)-$tOx-Z?W1ClKhs9wKOYV6>f!znW zlAh%knU?bnfYT~1C6yp0E+=b--0h`aG&U@`WJA4HuU27|j)TsNWNbOtjNHOy zuzqk4_@XTV+TUL^W{FtG_Abxi3k2|ON#ps&x2z2)X_82XuMRbu2~AckwzLuZ8h>+Y zr%XqrA_8m>*UHcu0wAxIX|mQ0lV(}8UEk+reors3)=fvt=O9$O5bAA8TLy!1=u1`| z3g0*eeZ?OEXFJFgtm>fN4Pf%xi^LCLR<}S3q}9r#a{YR>r))H#shvK; zWt-5@(GvOySE?r2_b6mrCS=QY%q+VVTF@||X+V8IU3BTZB9<0?hV(@x_1Eia&jh!F zRupbyXM6X#x0xnc=55EF-qN=#_z~ax>if-S&vv)!J(X_@c$TZq=*{C1Z#?(*MB0{$ zMD*3P(WxtFWc3->xPwj^Qh_Zh!J{N-YCAm4BDdPJ#3HHtGkRn;7b)wNJE-FfdO_Ec zJK$bk6grFxLo6?^+4BQcX05>>hNw0Ci3SXjjp->;D^Dz6_X;@0>YGHJbXYdaLv!rM z%8^X7Ac^_s^}5qZr5|YMFlZlkjDJ@L&_S$*on8@Uf_-v9*`0ZA<#EtT(nuFS#>7Gy zWt1FCTV)CX&5=k?@K7C67Fz4s30Z8wTduXW0q>9lKxf}yNW6CFeGP%x5=y+R?~ls9 znw@=pAv(4$K;M-iTB`pGZvWpooKZ~_2huMSstZ@TG$n3^nY(#`8zZ_63pY-<9j$Moi$mR&K3gkfE4KH5YFxt;+7mdw z1|z(AbKNJke(Z?*0N``1yqV9#_Z`MG4r#6fbb;pkZ}!}*)6cuJXhgy#tNA;6q?Cv}XBKMUM6$ygwL z^CV+|{EfKx0sfeH#>i%b?^rh8r7_BT06NB5`G7(@e+A4G$woikB7d&Y`froX>p*>r z;4gs#ZTyIt2Or{}01kD1LiXLUWVnR?iTJ9->yq3Xg!>Iv@euk0qAMPg80Rm54()Qt z=2?=DvAaxhEA(9nRr|@{FqSV!_BGx unyv*~XF0ql{`Nlm&+oEl-ls-wutknquWyYTc)8PyzVC%Fn)XkdiV#=D4be~l diff --git a/src/nodes/shaders/gradientlinear.vert.qsb b/src/nodes/shaders/gradientlinear.vert.qsb index ef94ce40983460f370880b3865cd5964bf5f3e74..55c4d629e7c1a141bd3ae663a8de54dbcd0aa6ab 100644 GIT binary patch literal 1592 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 diff --git a/src/nodes/shaders/gradientradial.vert.qsb b/src/nodes/shaders/gradientradial.vert.qsb index 99fa76147b8b65827c3d12f08065e284039e13d2..c81c721db05850bff2fe1b2fc65b8167f4cb9582 100644 GIT binary patch literal 1472 zcmV;x1wZ-#03RcGob6fvPuo@yeWK?;nG(b^*kHyPes2L>jydA@EU-wc_IupY-a zfDC|Hz`-N%T0ih*@VN`{I>3E)K*?+n-4i8?3o9spO1@DZm*h2&!=evzc`%am z5hm6FS$-et1_<{^(q%}uCh4-I+u$6s5f1rG!OuGqKa@X{V&9ZtS*RRiDx4pIKjb__YbwYi#0T{il1E90c!lse!jG|VDg=Iv>WjLML7t$s9IxvT z&uxPIhq2Mm72+^Seo&qw-89Hoi8K10Bl#N1Xg^KZVID`+K%uoyi2n`pjq(iXLSHwj zeu%$Cz9vY%Ls<0p71TV#;weD=U!cMMs8W3{Q4Q9C4f456x=Un(oF9Y5G=Cl<&ue5q z%K*HQRD{R%`JB^~;>#YDeOQ4UqA`EAmNoK)iUJJ={p^w4e6qaVyMPj$IT zaq@)w8yJ5rMl~1C5sPOP7IMBks}E@5-DY)^-}jrUPjnUMngbZNo3) z#kD#WuGll{i)!7pebZfa9Je89U87+Io=`Mfj^V4$u2HxAgNkxkQIx>8nvUB>=V|~K zQ0*D+fo1QIQ{m3=A=q}{o2V_r#r4e&g;Mq$tD#~lg(4B;R%%toX`KUgfrrq#i0-uX z4ac*5%(yBrB0KedGSs1>^eG#h1Lm13Tf8Rx>o0vB7EJe4E1CjpuK*q~0kFKb-|GQ% zSaisJyZHV;fd92`!?LCN_6(Hmob>G*sc$Fa2e5Sd55NihMDZ>AeQVY?QnPNp|Fr_; znQcwneJ#eVnO&_zpeER15tdcg+_601RoE_tX}He5-Zp-6T#8RvmMQ2`Q9NAe9K*NjL|QINC9xDe>Lfln z9MpxI8&96S&{ti@^Ykb7Zs1dix@~~e^Y4CGU0;9pZAtLy;bJ}TQ$C1H(prij_sFuk z`9jL+Fzi8Op&!2y^&=Xw9kdFP;k^9ti@dwKQxbE~RV@`tykqJX-iO@enpI_h*46V; zVnWd)uyEjTL4ah9mP{?t6J6M_YW0|bYx;p}r-B^z8!vd9W&gYwucOCHUP`=E|Kr%j z3B|9+81V31&*i&+Bu;CLV-`uE^x)6RwC7m-fAcu}U*;{l-U=F~`c2#Pjh62Djh3~& zqQrX7YBwI>Mf-6Db|4<^jBTTBdN5?B%B?Crc0JL%LEiadP=mFBf1IO zX^@jj^%HzOGJjn3(+Tubug`#tdiWu9UCM@k4*(~B64H?UWA$t57mDa_mW=-7o7xd| at*73hZ(Z+Y&nQOPPk5y5`SC9%Dgxx{-1Yka literal 1478 zcmV;%1v&Zv03O76ob6fvPuo@ye=G%8gBm8zN) zAV2t%M zapd50o$WGgp@Sul38u4GFh?geT41aXK7)tMz%hlHlKtFU z>?3-BZLyFw;cf`7(ftbvg$zeon;F2wV>a+-Y=p)hNx1Ro<~k6tn8Snh62azZ$`I>u zi~`62m<=3!0^Z0B!<2VEYuzdX&(U9HVq?#H#$S`CM@jZ7SgYE@`g-CG;`^ zNyF=R&o-WEe$ddW3l+gB&v7_5MzoPl+przHA0}s0I2T4x{*-K^JSxenAV&%9=W>5n zE_N}o4#@KRNY_WWN0Kf_x>ZS+C*3;dkniG<&jeiWNc>R#O!9q$?nk;*573wj@(}SseU0Q{(ji_Ue1Y&IEGl?`AEErB?qiV0Xsp2V zI>2KaBm0qWv~z_xjFTOdCrCF5@>SxDc4tVwMl#NyB!Q(LL(8et$>UDx*SfZTYCVj+7B~HJ=9EFJ*x=nhtgE1B< zFE`0gk#K(l)H(!`IpMXio?|<8K-sj)j4ig%dp#S>Fcg<2N>p(z=)94 z`$<;^ijvAzCw}yOR-CK()6dne;qBYbb|PO!0M53;!0M5?rN?FSPyZ}m(rqI)&K<%{*6-auzDd<93JZ`8ZBd|>(EhnXx z80tRwBtE%Zs4h3wpFV%7uXwKS>rb7XFrXA==K!e}-+sTcw)Xr zTap1{32%NRH9Ae5h(m<+Ex%cE;{vly}Fd zh|-Ug^hfNF4!w^Xbj8b5{64OH`0wNQ z_BDpFxIKf^6#}_Edq4vxYtM%H{bB9dG&}z-8seuZ9^`h>vc3D34duHm`lUtKLwTBX z$n|sL%E&&-C9;9@%XB{=jn9$K|6@ytHZT|WD36ap!W`X~@FfX1Lu0>yU6f~O?u;~7 zljhEmKaH?Qw4m5lZG8AGC@9Zt6D4=CEcw`8llr;Y&+&vny!^2L8zJ#Ne*36viES!{)I@qc;I3crI^_?$Pn$81$oKOLWeR`neG gbX;JWpO2&84a9$Rv#v(4VzZWV3y=xQjuK)l5