From ebe36705223d00bfe92c7b8fc391e97895ba1155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kaj=20Gr=C3=B6nholm?= Date: Fri, 6 Nov 2020 12:56:36 +0200 Subject: [PATCH] Optimize particles vertex data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use uchar instead of float for vertex data that doesn't need float. Continue using floats in shaders. Also remove animY2, which is same as animY1. These changes reduce memory usage especially when the amount of particles increases. Testing on windows, memory reductions with emitters/trailemitter example were: - OpenGL: 82.7 MB -> 76.5 MB - Vulkan: 130.8 MB -> 126.3 MB - D3D11: 143.7 MB -> 135.8 MB Task-number: QTBUG-88124 Change-Id: I8f8dcb3845323b0e69fb99b5bff830cd0f151a47 Reviewed-by: Laszlo Agocs Reviewed-by: Tomi Korpipää --- src/particles/qquickimageparticle.cpp | 43 +++++++++--------- src/particles/qquickimageparticle_p.h | 32 +++++++------ src/particles/qquickparticlesystem_p.h | 2 +- src/particles/shaders_ng/imageparticle.vert | 24 +++++----- .../shaders_ng/imageparticle_colored.frag.qsb | Bin 1634 -> 1638 bytes .../shaders_ng/imageparticle_colored.vert.qsb | Bin 3451 -> 3438 bytes .../imageparticle_deformed.frag.qsb | Bin 1654 -> 1653 bytes .../imageparticle_deformed.vert.qsb | Bin 5352 -> 5356 bytes .../shaders_ng/imageparticle_simple.frag.qsb | Bin 1639 -> 1644 bytes .../shaders_ng/imageparticle_simple.vert.qsb | Bin 3449 -> 3448 bytes .../shaders_ng/imageparticle_sprite.frag.qsb | Bin 1964 -> 1974 bytes .../shaders_ng/imageparticle_sprite.vert.qsb | Bin 5997 -> 5995 bytes .../shaders_ng/imageparticle_tabled.frag.qsb | Bin 1833 -> 1841 bytes .../shaders_ng/imageparticle_tabled.vert.qsb | Bin 5673 -> 5652 bytes .../tst_qquickcustomaffector.cpp | 2 +- .../tst_qquickimageparticle.cpp | 12 ++--- 16 files changed, 58 insertions(+), 57 deletions(-) diff --git a/src/particles/qquickimageparticle.cpp b/src/particles/qquickimageparticle.cpp index 7ba26c4e54..1331032e7a 100644 --- a/src/particles/qquickimageparticle.cpp +++ b/src/particles/qquickimageparticle.cpp @@ -1067,8 +1067,8 @@ void QQuickImageParticle::createEngine() } static QSGGeometry::Attribute SimpleParticle_Attributes[] = { - QSGGeometry::Attribute::create(0, 2, QSGGeometry::FloatType, true), // Position - QSGGeometry::Attribute::create(1, 4, QSGGeometry::FloatType), // Data + QSGGeometry::Attribute::create(0, 2, QSGGeometry::FloatType, true), // Position + QSGGeometry::Attribute::create(1, 4, QSGGeometry::FloatType), // Data QSGGeometry::Attribute::create(2, 4, QSGGeometry::FloatType) // Vectors }; @@ -1080,9 +1080,9 @@ static QSGGeometry::AttributeSet SimpleParticle_AttributeSet = }; static QSGGeometry::Attribute ColoredParticle_Attributes[] = { - QSGGeometry::Attribute::create(0, 2, QSGGeometry::FloatType, true), // Position - QSGGeometry::Attribute::create(1, 4, QSGGeometry::FloatType), // Data - QSGGeometry::Attribute::create(2, 4, QSGGeometry::FloatType), // Vectors + QSGGeometry::Attribute::create(0, 2, QSGGeometry::FloatType, true), // Position + QSGGeometry::Attribute::create(1, 4, QSGGeometry::FloatType), // Data + QSGGeometry::Attribute::create(2, 4, QSGGeometry::FloatType), // Vectors QSGGeometry::Attribute::create(3, 4, QSGGeometry::UnsignedByteType), // Colors }; @@ -1094,36 +1094,36 @@ static QSGGeometry::AttributeSet ColoredParticle_AttributeSet = }; static QSGGeometry::Attribute DeformableParticle_Attributes[] = { - QSGGeometry::Attribute::create(0, 4, QSGGeometry::FloatType), // Position & TexCoord - QSGGeometry::Attribute::create(1, 4, QSGGeometry::FloatType), // Data - QSGGeometry::Attribute::create(2, 4, QSGGeometry::FloatType), // Vectors + QSGGeometry::Attribute::create(0, 4, QSGGeometry::FloatType), // Position & Rotation + QSGGeometry::Attribute::create(1, 4, QSGGeometry::FloatType), // Data + QSGGeometry::Attribute::create(2, 4, QSGGeometry::FloatType), // Vectors QSGGeometry::Attribute::create(3, 4, QSGGeometry::UnsignedByteType), // Colors - QSGGeometry::Attribute::create(4, 4, QSGGeometry::FloatType), // DeformationVectors - QSGGeometry::Attribute::create(5, 3, QSGGeometry::FloatType), // Rotation + QSGGeometry::Attribute::create(4, 4, QSGGeometry::FloatType), // DeformationVectors + QSGGeometry::Attribute::create(5, 4, QSGGeometry::UnsignedByteType), // TexCoord & autoRotate }; static QSGGeometry::AttributeSet DeformableParticle_AttributeSet = { 6, // Attribute Count - (4 + 4 + 4 + 4 + 3) * sizeof(float) + 4 * sizeof(uchar), + (4 + 4 + 4 + 4) * sizeof(float) + (4 + 4) * sizeof(uchar), DeformableParticle_Attributes }; static QSGGeometry::Attribute SpriteParticle_Attributes[] = { - QSGGeometry::Attribute::create(0, 4, QSGGeometry::FloatType), // Position & TexCoord - QSGGeometry::Attribute::create(1, 4, QSGGeometry::FloatType), // Data - QSGGeometry::Attribute::create(2, 4, QSGGeometry::FloatType), // Vectors + QSGGeometry::Attribute::create(0, 4, QSGGeometry::FloatType), // Position & Rotation + QSGGeometry::Attribute::create(1, 4, QSGGeometry::FloatType), // Data + QSGGeometry::Attribute::create(2, 4, QSGGeometry::FloatType), // Vectors QSGGeometry::Attribute::create(3, 4, QSGGeometry::UnsignedByteType), // Colors - QSGGeometry::Attribute::create(4, 4, QSGGeometry::FloatType), // DeformationVectors - QSGGeometry::Attribute::create(5, 3, QSGGeometry::FloatType), // Rotation - QSGGeometry::Attribute::create(6, 3, QSGGeometry::FloatType), // Anim Data - QSGGeometry::Attribute::create(7, 4, QSGGeometry::FloatType) // Anim Pos + QSGGeometry::Attribute::create(4, 4, QSGGeometry::FloatType), // DeformationVectors + QSGGeometry::Attribute::create(5, 4, QSGGeometry::UnsignedByteType), // TexCoord & autoRotate + QSGGeometry::Attribute::create(6, 3, QSGGeometry::FloatType), // Anim Data + QSGGeometry::Attribute::create(7, 3, QSGGeometry::FloatType) // Anim Pos }; static QSGGeometry::AttributeSet SpriteParticle_AttributeSet = { 8, // Attribute Count - (4 + 4 + 4 + 4 + 3 + 3 + 4) * sizeof(float) + 4 * sizeof(uchar), + (4 + 4 + 4 + 4 + 3 + 3) * sizeof(float) + (4 + 4) * sizeof(uchar), SpriteParticle_Attributes }; @@ -1622,7 +1622,6 @@ void QQuickImageParticle::spritesUpdate(qreal time) spriteVertices[i].animX1 = x1; spriteVertices[i].animY1 = y; spriteVertices[i].animX2 = x2; - spriteVertices[i].animY2 = y; spriteVertices[i].animW = w; spriteVertices[i].animH = h; spriteVertices[i].animProgress = progress; @@ -1677,7 +1676,7 @@ void QQuickImageParticle::initialize(int gIdx, int pIdx) float rotation; float rotationVelocity; - float autoRotate; + uchar autoRotate; switch (perfLevel){//Fall-through is intended on all of them case Sprites: // Initial Sprite State @@ -1749,7 +1748,7 @@ void QQuickImageParticle::initialize(int gIdx, int pIdx) (m_rotation + (m_rotationVariation - 2*QRandomGenerator::global()->bounded(m_rotationVariation)) ) * CONV; rotationVelocity = (m_rotationVelocity + (m_rotationVelocityVariation - 2*QRandomGenerator::global()->bounded(m_rotationVelocityVariation)) ) * CONV; - autoRotate = m_autoRotation?1.0:0.0; + autoRotate = m_autoRotation ? 1 : 0; if (datum->rotationOwner == this) { datum->rotation = rotation; datum->rotationVelocity = rotationVelocity; diff --git a/src/particles/qquickimageparticle_p.h b/src/particles/qquickimageparticle_p.h index 5399bc068c..894d31c300 100644 --- a/src/particles/qquickimageparticle_p.h +++ b/src/particles/qquickimageparticle_p.h @@ -99,8 +99,8 @@ struct ColoredVertex { struct DeformableVertex { float x; float y; - float tx; - float ty; + float rotation; + float rotationVelocity; float t; float lifeSpan; float size; @@ -114,16 +114,17 @@ struct DeformableVertex { float xy; float yx; float yy; - float rotation; - float rotationVelocity; - float autoRotate;//Assumed that GPUs prefer floats to bools + uchar tx; + uchar ty; + uchar autoRotate; + uchar _padding; // feel free to use }; struct SpriteVertex { float x; float y; - float tx; - float ty; + float rotation; + float rotationVelocity; float t; float lifeSpan; float size; @@ -137,16 +138,16 @@ struct SpriteVertex { float xy; float yx; float yy; - float rotation; - float rotationVelocity; - float autoRotate;//Assumed that GPUs prefer floats to bools + uchar tx; + uchar ty; + uchar autoRotate; + uchar _padding; // feel free to use float animW; float animH; float animProgress; float animX1; float animY1; float animX2; - float animY2; }; template @@ -433,18 +434,19 @@ private: template void initTexCoords(Vertex* v, int count){ Vertex* end = v + count; + // Vertex coords between (0.0, 0.0) and (1.0, 1.0) while (v < end){ v[0].tx = 0; v[0].ty = 0; - v[1].tx = 1; + v[1].tx = 255; v[1].ty = 0; v[2].tx = 0; - v[2].ty = 1; + v[2].ty = 255; - v[3].tx = 1; - v[3].ty = 1; + v[3].tx = 255; + v[3].ty = 255; v += 4; } diff --git a/src/particles/qquickparticlesystem_p.h b/src/particles/qquickparticlesystem_p.h index 8b14b74131..d991257452 100644 --- a/src/particles/qquickparticlesystem_p.h +++ b/src/particles/qquickparticlesystem_p.h @@ -301,7 +301,7 @@ public: float yy; float rotation; float rotationVelocity; - float autoRotate;//Assume that GPUs prefer floats to bools + uchar autoRotate; // Basically a bool //Used by ImageParticle Sprite mode float animIdx; float frameDuration; diff --git a/src/particles/shaders_ng/imageparticle.vert b/src/particles/shaders_ng/imageparticle.vert index 870139452b..124071e48e 100644 --- a/src/particles/shaders_ng/imageparticle.vert +++ b/src/particles/shaders_ng/imageparticle.vert @@ -4,7 +4,7 @@ layout(location = 1) in vec4 vData; // x = time, y = lifeSpan, z = size, w = end layout(location = 2) in vec4 vVec; // x,y = constant velocity, z,w = acceleration #if defined(DEFORM) -layout(location = 0) in vec4 vPosTex; +layout(location = 0) in vec4 vPosRot; //x = x, y = y, z = radians of rotation, w = rotation velocity #else layout(location = 0) in vec2 vPos; #endif @@ -15,12 +15,12 @@ layout(location = 3) in vec4 vColor; #if defined(DEFORM) layout(location = 4) in vec4 vDeformVec; // x,y x unit vector; z,w = y unit vector -layout(location = 5) in vec3 vRotation; // x = radians of rotation, y = rotation velocity, z = bool autoRotate +layout(location = 5) in vec3 vTex; // x = tx, y = ty, z = bool autoRotate #endif #if defined(SPRITE) layout(location = 6) in vec3 vAnimData; // w,h(premultiplied of anim), interpolation progress -layout(location = 7) in vec4 vAnimPos; // x,y, x,y (two frames for interpolation) +layout(location = 7) in vec3 vAnimPos; // x, y, x2 (two frames for interpolation) #endif #if defined(TABLE) @@ -55,7 +55,7 @@ void main() float t = (ubuf.timestamp - vData.x) / vData.y; if (t < 0. || t > 1.) { #if defined(DEFORM) - gl_Position = ubuf.matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.); + gl_Position = ubuf.matrix * vec4(vPosRot.x, vPosRot.y, 0., 1.); #else gl_PointSize = 0.; #endif @@ -64,13 +64,13 @@ void main() tt.y = vAnimData.z; // Calculate frame location in texture - fTexS.xy = vAnimPos.xy + vPosTex.zw * vAnimData.xy; + fTexS.xy = vAnimPos.xy + vTex.xy * vAnimData.xy; // Next frame is also passed, for interpolation - fTexS.zw = vAnimPos.zw + vPosTex.zw * vAnimData.xy; + fTexS.zw = vAnimPos.zy + vTex.xy * vAnimData.xy; #elif defined(DEFORM) - fTex = vPosTex.zw; + fTex = vTex.xy; #endif float currentSize = mix(vData.z, vData.w, t * t); float fade = 1.; @@ -89,7 +89,7 @@ void main() if (currentSize <= 0.) { #if defined(DEFORM) - gl_Position = ubuf.matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.); + gl_Position = ubuf.matrix * vec4(vPosRot.x, vPosRot.y, 0., 1.); #else gl_PointSize = 0.; #endif @@ -99,14 +99,14 @@ void main() vec2 pos; #if defined(DEFORM) - float rotation = vRotation.x + vRotation.y * t * vData.y; - if (vRotation.z == 1.0) { + float rotation = vPosRot.z + vPosRot.w * t * vData.y; + if (vTex.z > 0.) { vec2 curVel = vVec.zw * t * vData.y + vVec.xy; if (length(curVel) > 0.) rotation += atan(curVel.y, curVel.x); } vec2 trigCalcs = vec2(cos(rotation), sin(rotation)); - vec4 deform = vDeformVec * currentSize * (vPosTex.zzww - 0.5); + vec4 deform = vDeformVec * currentSize * (vTex.xxyy - 0.5); vec4 rotatedDeform = deform.xxzz * trigCalcs.xyxy; rotatedDeform = rotatedDeform + (deform.yyww * trigCalcs.yxyx * vec4(-1.,1.,-1.,1.)); /* The readable version: @@ -119,7 +119,7 @@ void main() yRotatedDeform.x = trigCalcs.x*yDeform.x - trigCalcs.y*yDeform.y; yRotatedDeform.y = trigCalcs.y*yDeform.x + trigCalcs.x*yDeform.y; */ - pos = vPosTex.xy + pos = vPosRot.xy + rotatedDeform.xy + rotatedDeform.zw + vVec.xy * t * vData.y // apply velocity diff --git a/src/particles/shaders_ng/imageparticle_colored.frag.qsb b/src/particles/shaders_ng/imageparticle_colored.frag.qsb index 72e517c0eeff8d482bbf5bc85abedfbc93dbb853..84ba3262eb50e2ce83d5b4dbf1721433d33e160b 100644 GIT binary patch literal 1638 zcmV-s2ATN)023B?oZVPWY!g=y95&G%;J&6}C`_H6(l4gfKv2+}@Sg(+~MfaEc5{KF0E8_9R0yayJn?a+c< zwAx?=s;CK&z$f<;^C77==}QqU`)JXDP2~6T*knkqOLsbO>N1MwP}qkpo@i1#)7VU~ zp(Jf<(R3@(ZWMFS6&otpv#?iYmD$!R6;!!{Dx|Q2aj{uto;9>{b?r#Q8XA;iyDIBO zgNGmsw^2QdWMk}njIbxoBsn9IR_dWfIfx<+2T(kbUix6_o5v6Co$Yx1`?J4Z{Pf!| z@i{V#&vFO+ywR{K-Kqw2=FP z{hx@;zr0Rtv7>k8F-md<@J|tog2x?dJ&Vx@9Zp_*+UDwkf-jUCOe@ zU_HC!dt0jOJ4L(VW3Ciiaqif@wNkLj4{dMqW%k$)t@tW>A3HhEt+=bcNM7p~vsV_b zh=p}4Z+l|OEtVau95FPQ8iEfOE?*r0RbNyp0#wea>00jW1X!G2nwp!tmL|XFn&?2I z4${Jn?4sqZ*%-R*h1uz)A3^1p_TOg-hbKN!xpV{*R95}#*8x_# zAo{#Z@pwo?p9|GrM|a7OX@G}M0q##-?}6uhx7YK@v^#rLW?UtpD* zcTIs!Z#1Dc-e>>{F5@sHcS;zj?UxWZB5K=a`NBx1ZX~=l)Zo3qD_ZQkxR^yS$8RTeFeN zWCldeEg@Ty(K{z-r=tM=UA2`*1A-6s;ry8NU_yjWdz9rK3-cQxEVFw0+lMi%xy}&8$r(UDlxf%X{?1ncb(!jewzhDnWjlOnDKmvcx zF?s;s|CExwcn_!NWxRi-@D-aHIZtO7ehI335{-4DUW{MSdX7EP2Hxa=J|ClUtexy& zkH${$JjBzN!|4Y86x$~L0I1K>F6Mh!-(db2sILV*-W%d)kw4D1;C2FrJW zt`8+o`~k*j{2=$Wf5i7NMwjO!JQkC941Er6>hCgtlylP?s)M7<_lEcrxccLuzI@w4 zbWF-Be{@Y9XMc!4$r#Nqc>V~_FCeH>(m&0zWcLDQ+JNATkz)QgB9#AeL@9EYmJ?u443nWe&3(;g=92ANttuQ>;h+oMHSS>z!p?!Y9zXJ&e7; k)m&5+pw9~fcKnAzVmmJW{MFiUQx85Q8viTuFRtcyG81SoP5=M^ literal 1634 zcmV-o2A%l;023B?oZVMVY*R-N9zWZOF_46m0EGY#0?272*NF^5%1=Y%gjA&@B7vqv zmT~Oo@X6!YqK4`cwp38Fj~Z>*M0z*RO>4M5HR!>ms|YV3*oWJ^(6ln9wZ*{# zN9b12OebhR!fZ6ff*OwUII6P9d}omwirhgF5?DjOSS+&063V!ycBo|!Ey9rC9CpQb<0-W(Trd!PyZ2z{-vK-%QV)%B&s`>d!RcF@hJC>hcD_g7Q(%Ci| zwYjbFc)ae|CD*HvL1rEQG*%5Ymo0BBW9Dx9Ip5m!>z;-4xANX?+gUenS%tJ&nsLjn zM_kt~;y!FAG0Zz#FX!gG{CXzu=T}o%bJ9$(jOxFMb~!x8Q1lS!{%G8ltyGy zvf+!Zc$^Z5R$)&UgUE#L1)ff&;#JQo*n--y*Eg!t3F9xYaoO?zR8*wd|Mu9>soN8r z0^{o;+bNXmMa!J1pd-q;nqMs2Yg6%nU$ZO4cjzyLOd-`SQo@bt z&DR;NbjNU|JH(5vqRpprZryLP%`Bm(h1bm0)dD>eso`upN!w`=R8sYt_RM$ z7|c1SW0sIZ_VN@1g|4yYR6uENp?zLTE(+a*rCN#LPv!`TxCAj>iV^y+MNA=)OB*WtQ*SD<8jQPmz9#HsHhBi z9W^A3eJt>JG?rO;Z|18<_qR^>Jo@$NAJ2dI<)`QZg(Vi1SF$wr5tO=t{UP=;R-r4I z*}2~g8NP2=>4Z>+Z*^pTYY=91bVA%F08D!2V?U)8urFAy-Nk|WBdTx^Tnp75j^_4a zf861^pyYF!w{jdE(0G7Og6-|?$9%>38T(=^(DNO?0jHUM%CxdWJ!3|2zax7GjrO={ zqxo{z3HO1~e531xyKabU9Q@8sEO)?tMz~0T`?3R$k|rmQ7O3)1{xL90k@ojX(S8iE zEGL{4hHZ*&Xom~lfWdO&q{?CAj7qX`I>`>DZ~A5W^rH)}CikIT@Z6eP^3BARVRQb{ z(j{|gBVWWaJmXfXHr3$y+x4kq!yYfBA_|p0NBnF|6F(u|6NNG9~*Gc?_{P0*ggaN9`@ztvU zYkd%Y)+cGaZikLYm#^YOQz4#n+?AN!ws8zQI7UZU9GW8=)n8~`g{zFxo*;f zBbqzL>kv)#?qmynf^`$U59DWQAJYRYZ!moXWQ|kvgBm@L^ikFw6?C*g5AjpybvNWB zFT}WMjb|_~qw&Jbo7Z>|<}GTxsNzM))^I}~*?qjl569UL)ZRdpA?UDJi^d0VMEf+c zA4GgN?>i!R5pf>Fyr*%dcQNlx9K|8{{M4JGk06r#9%p^(-L{+c5xtjrw0L;E%pycfz9ziV6WV4bml1N)bEGKM}@;Q#;t diff --git a/src/particles/shaders_ng/imageparticle_colored.vert.qsb b/src/particles/shaders_ng/imageparticle_colored.vert.qsb index a18b222b61290b30f9b8d475a2bfe8df0d91a5a2..293cc7ea4ef6e583c9ecc23d1e89236f9e53e824 100644 GIT binary patch literal 3438 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 Q|4D37dWHP|0HCch2v73_)Bpeg literal 3451 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 diff --git a/src/particles/shaders_ng/imageparticle_deformed.frag.qsb b/src/particles/shaders_ng/imageparticle_deformed.frag.qsb index 3107cfedddc60a39b5829a283df82a391842a2bb..02179080fa13baa7b0941687e2dc0fc99d3ed44b 100644 GIT binary patch literal 1653 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 K#{d8AD9uXCw*SEZ literal 5352 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 G?iV$=wGbu% diff --git a/src/particles/shaders_ng/imageparticle_simple.frag.qsb b/src/particles/shaders_ng/imageparticle_simple.frag.qsb index 79e81fa4794fc9817a16e1f7b284063667400bd4..e781a1d7a8afa75ee84de13008c4499cf1247187 100644 GIT binary patch literal 1644 zcmV-y29x;!022;)oZT2rZyQDQdF>?bmZoWF+R~;-o>eG-?tE zjV#x(*Uo~y>#o;T+N#iBP;n@5;n-VF^uVnbgb)V~962CP`~XyO;DX@2nK$0CYp0dy z0hs7{=e>Df^XARWn*cx$0K^a?2qu(Z5%N$3n<>U$+@Q75*dTKI$X$kc@SuX=vo6?0 zsuwn)fsz1m{Bl3Ota0@syaZL$9H2%Awh`aUV{;ncfa>(4=^C;ZkU4-`Y-mn7)80&+ zohx)J)=W3nL1c5#6&vc<%VV#`B1_#x>L_v>MMz*1Pn z!9$RP8z`PburYQ4M%Wi>61*ajZsJ<&Wxj1q`Q_1@wqJKV*P572nPxrk8->8yY?RD9 zriHDV57PAGJKIx&P^x(O!18MOf)m`*NwypKErh_S+Vvn`t?9(NbK4H`n-zQGTsqr9 zqc(PT$}}6UQ}X;OIb=2PMc zt@$q=2KQ!1QX7xH{_eAnrqBFB>lW{kM`;>i9Hp)!JV2=6uDzOBSp3b9>-#M$ofhhF zKO*sagLoz;ro}k`V9{npI0bYN%JwD8b=vX-Um+L}9_Q-xrLlbokGpJiC7;uRmE%PL zjRqJb*xA{6%!k9z2+Q$M&kvlubBzDWxbj1N<3@NglfT18XTCY3^;qu4_m0te7I)*j zW{3kAe&--oy6}BUe6f)4VHZA1nw;EMAaXRlou>F0xJt3kH-l(DMOc;-P71>gt!`wO zqj|_+Ik8P;x4A(j+T5DthtfCqEPeXEh3AvI>=b;j?v(;7adpgEy0mi1TG_(Qv;K7xgfVWpJzB>*wzbI8KkZVp&<#GfER~OdjuUxsBA-}J5kbyRt{Rk`XP~)EMm}>v8-$&C~lygJLp$Hbvw8yt*{DALVGy1j@!9p#$>|sPK!5u|Cp+JsNwJ?GR4q-N`om z1nVaJ0LX%Jfbk)gHyA$#@{CjC!y3MX_;J?VBk-OkKFVL6*4LDivP6+^(b15e2q5sk>4Y2aTwt^Pm^-@~+5uxCP8IOiaZn8dgx9w$pgzsY-+27Cl4CWsIl^>Fy@B>Vv@q?hA z7;>EOA*RumKf=Dp1U-g6hv&-~#*gya3~PCCl<{E=e-&qc9OQl7tHCkBEB#S9b)5Yn ze1vIa-(vd_wr@e0rzC%pc}ed%TxkQsdyZoM2U2MLXOK!U?C1E+aO?&-KJOz}pICFr zGsrx>V$EfY?laF}<|FzAq>&G!?Dq*x?iACN+-odL^jY+757Yj{*_@Xdpw0`Lf?9f- z;iFNa1^OmZW7$rUj;jmG>J?=gb=yx= zyn;K~6eE>YoJ?p^_7X}Fz7uF2Ng9GPl_jCJR(3_fDXFpBs9 z(5xn|Bq)f#rvjR(2{k^ q#1wkg)2wAtRD!&KH<ls^rP6H*mQgp)QU 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 literal 3449 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 b-Th*XlO5j=OpD^H@%v8my!ihECE%qx&UX5y diff --git a/src/particles/shaders_ng/imageparticle_sprite.frag.qsb b/src/particles/shaders_ng/imageparticle_sprite.frag.qsb index 05858b1e1ed39a8c96b197b5e2faa1ac8f707f1f..b720360a1bc2f33a005b1d1f2f82dc36bb1fe2dd 100644 GIT binary patch literal 1974 zcmV;n2TAw<02vKtvDtx?TsTrKlGqq)I&j5)yX~xo|=~bK<}q4shUtIP^lrfeV87cHVf$8*hK4 zUQj2Rc;1`uy?O7=?3=gC80%n+g`tO_YplSQn8_L}O7OG+N*tV|!?B zTEg{qbiBa2aD7|pTS#z?bs?4lew@oLzUNl!PC)e6&l;-Y^Yg)Z*6)JWK4btoI zPh!IFNyF@rPXnpGy&lG#WL zGNC(;G(}Ktt77FL9#+|iP=uO_^hw;-lTMWsrF|It?*p7_pPnf^`5zOO?hT}xH zBN6=^EsY}~=Q#wr92bPKi8eRouBO4>hS5yM6H!7s1x{+^^_d?JO*y}fe6jq8v-t4s z`_~@gxo|pp_DVwk45S`G*WpnA49pv;*}3Z>etvX?<0epD2OK}3PlXT@k59Od3SjVT zLO;bYSMc@=8RKsX^*`IpD^l-J_&FCDRwOW-+XsE1&AcMbA8YquN%}L=hGgjcu#6XN zkLTf-H_c!V+%@nyy8^$9-QF4oJ)qM>PZKSC5WjiVON{-O=|AprLXabXW9Hq4L11DWA@gSiiQvXNvvJ3A@}gxe=(w-}KY;$$5!Ao7|gL&aTud1xGh-MD+RV>FauWGn+SU zeWp^XT5y8&cq|%cZ=|oi^*)6VkBWT9Hp3g@d`05pxUY}%Rf(?>e`$7QW?|t*3jJJw zHO5E=*U;On0U|7YGqaSnH%tiiPI`WJhad-7BLZXo%i^D;L|h(=BAgfE`1K;9_d_!X}?4ZeuCQP<`>w+eS{|DJyX;n zuLOz3w5o09ESK7}Ha4rgIvC%@w#vZ#Kb0%o?57kheo#y4vX!;Bt@1`ots?Pw!O{u} zu39#VnK>w2QduXv8e8+1E{W9BikJ3?XDMGm@;M6_JSYwC94Wtg2PW|{)T}S<#xu$k z)H*&6siR$Z9=hT0HR29HuEP_u2kI{Ty$1JfwC3ca$xAVu@1?xv-kOjbF(YCZYhbp- zd^!yMq&p6|^IfP5MmRr0YazXla5DW0=|{Ss@PZ!p$)6-zCHk~a-)Yh(=JEFKBpZ>w zAkp(cM@4j8x}!;t(yz?xYRYk*Lbz#(rxGtE@j}F#mv~{~ElRu&!3(3Up{72xJLdB< zMt)-34=B~8L(NL&AdJvY9r_`_cah&=mlt-cnGpFjPIM3Pj=)G`-W#vn1bq~c_|-xq zec~-;59vdCAMtR$k7UJqeH2TD>>HrJxshIppP=I8aq$)F`7sD<4k;y z@zy&@JYnBylE)(J9N89@^qr@@Jtm!_^F&{e=n;q>?$tTsiHH*oO$Oad48pqJu5Nqav?@m>H5W4fPsgVMgf z0~!!}faLc}_(Kw2r8NcqFyRq%6?n%Pe@2ICPtXRm`vmb9L8^=VJ>lznA(l8Nazd2s z5pTu9pHbS+PsxT;Br__-;0*2YB%QCbWRtMlAk0}wPlR+C_jxklLMN-x`BcUo+dzW=PQy7!wA zi>$Siw92v|-r68hubH+{tmMjENY;xNtBi>6LWpIXkVJE3w5kO0@T}$|L)ZcpG)O{l zHcX(_*2bXbC<9q`!+*xTmjM9(3nq8TD*^Hot_4$a6$4oDeJTL#UH%d_?qaF%k@cm4 zgTB!eDHT9Zmmh};Bh5lk_>O&2zjK$z52)zw&vw${QLfGK+cO4Hi%K=o^NF}c65l%m zn9WKF0nK8`^Gs;;`RXccTRfp_wh1ej(L+&8b+}QGlAiP}(0k>RJ|oMY+(h#|@y{mr IAE@%Ad7($)bpQYW literal 1964 zcmV;d2UGX}02vKP%%^qlUAUekO(b}|v z>y;M=z;qelSpa)%hYU?iXPSor87p$#5}FKx_5;iTS8P^+s|;L~Nn}1)qyi$hK?DWX zAul$GERuwDu3-!|#n2=ieyp$@xVta0G`j`jX_#0U9%R_%YAo6jt%c+vFf8{_H7#ZI zAd|{yC*5EAEbXU}ZQHFlrJ^}@DP|ZI&#h)XbG^D@+%ZfTg^ZWLKdw_7=ZuYfDdU-? zawh9|J1WaAdTs;5a|(9F%M{8gv*O&gz07*vUcH=HYoSqDyE|?e)uOXeatr8?S%p6e zs{)$ywi{2H>04gfvuj?}wZ~g5XG{5#%k_eEsp^^Ab~a&dxS7ovTp2f4bl;61NYI9IU8)aIE0(wd<+t(TbOgCN9Nr{Q!Re zimK~jUHovwDQ$Ey@qieDd6Hj;_<9HGf-77fCR<4FC!9*ZO!|@TCA_4En&eLstrLB^ zN#AMGC)Y>m!0aXZfAfR+khqx{Acna}2O_+xP-$8MQIWG(qApAo9IMH3iI|5e* z^B*+okn~YNVzXe7zHZ|0BYjBkCmyc%kgT-VL%Gz*zdo|36aEOT^${NFA>s`HeUxIu zah~X7w2tz}nQVi6dnbt}{X0$agFv4n-@=N%^R&0elsY<3^aX_;hV0>9og3SK9h5wT@VnUQ+py>rYnte3qGb&7H>dlrwg{;O;J(%y z-)n<#-{_4mvq8A;bkP+2MH}!#0PdkK8U=}y8`g}&f=r9kgYnxuQA@Dh-CdnGYAs)_ z`AFy_OT{dN*)AH=TE5$gaZAea!$@4#k0C+U4YIL&KJ|2BPbc?=lXXj#(uQYR zHzMXdw61_ z{H58InT3TLNsMy=Y>bi&+Av$#z$PViGrg2?H*HAuZfbsZb zr1AcG7scNf-)Q7D+E~G^rY!i&%Ra3Uy$+pvyjQH_^`l;~Ca*CD8}vOg1!fDvLf$N6 z_rGWC-pujUBJ!sh%Q3yJv6vRAZ|*?-_uf^?862Ela{cDO9vsJ9 zfgWy;j$si?kS~mU(a4uTJ-&@jnG?CzeoyQN-c3{BZffc3(&tPx)UqzZv|n-r-$AX< z=I1!%^9Wt)_SvDYMx0_cU(MO(L;-Hld>Y;Z^UnH|;qxm_A$Jk~M7O4(52)ZHx|o5x z8*Wb9Us(KB+Dc^rqSNWsFibd91NjgPU5W5wS zs8(#(%9pZ5A*AZXhC)S*?LkPhbx6E!8NDh%K76mml_h;K;s5F?BxlnGYHe*4daWXm zMV|gMydMDo{N1ocNPg>+o8TTysofi3<@c!ou>YJ@uwxuck7ZR~3OE=WEs;_Q^mR4k zP+_Fr0L$2MPMUY_iu?f;-TT>2F&-7#tY&{kA!|{k7koAm-W-a(vw&Ie5D`#s68*@e y#->=g!j?@VhUVH}xrh&$Pgn(p|gllu?5JfwLbiO}8v diff --git a/src/particles/shaders_ng/imageparticle_sprite.vert.qsb b/src/particles/shaders_ng/imageparticle_sprite.vert.qsb index 4054a0268e625ebd31569824fadabf30b59975fb..284f610f51417357f74d4dbe54e168a95731f550 100644 GIT binary patch literal 5995 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 ZpyIEA>7$8h;Z*?Mmz&><|9?H}hPPo{`MLlA literal 5997 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 X7QH;Iw}Qu=(|*BscTWV8S?c>AJe)C` diff --git a/src/particles/shaders_ng/imageparticle_tabled.frag.qsb b/src/particles/shaders_ng/imageparticle_tabled.frag.qsb index 35da4df2f452173bacfa94e7b91edb08fe20ba3e..c4ca41814b43e13d2b89e587b8824b213c616b01 100644 GIT binary patch literal 1841 zcmV-12hR8a02bSLoaI=}ZyQAvf4g>^#7)yAZQ3*~W!v<_X(N+FX;sNdloBTmqR`N! zC6GpDW3Q7%{_1*NrL79RAR!_3gg9~O0rijzT;Pg&syOinz?D-kR2<-d;JukQ-tpFM zgW!N*lJU-a^LuaJyf-^DZvmhU0HRnUSUVsO%izEkwoRar9S7=vL5lD`+3WTr|ajDzO(6Tv(=DV ziLpz%0#@YpA-9w*)N+nBS#*56kg58)g1bH)5BOELn0tkOlAF`sUf66^~baua@<#^;$lDCvIWM7s|Fju{B{8ZQpaZQUTK{qonKK(pgT)_Zk?!izE1U zv7#|2tg3q($6GHrtLG-x8hTi#)_FIus%X2V(M-AKH`r$7J$qxeTqt|i>S~sriP7P; zW|D467aX^IA0=v4$4eB-*^(5}y7SAB%XhZ?n&*t?CWQslR_2DEVJ2d^)e0

@3@rmRFl8#pO7 zCBn9hpvRIFlVR($XbNc}0%MeH$UGtH`@;k#za|@&uIJzwB{B*_7mwrn)FuoEx%ZE2 zuU<60^6Kn2vBzJ1`&Q-Qhu_=3J-GheHG0vbF?nE2VEq`So?x}`E!{-smGs>FrHI@R zEJNZZNnIPh^GF|$5N2#_QtVHNp$!4+aqT7lfsF|lgX_;t`VFnN8FF(`hnhMysBbsc z-X{Hq)_=I!Zl>waXwk~>Qh-blhJY8~Am|1RiWq}7xAXX1>`?kB)b4rQb2i`|p{q18Q&E?-){u>2{={XoS@UB*>uy`pz^k@_1YN(ThDa~k{0h&j|w zmUZCY2y=VU8nSg4&W4^BaaAYrf|i^(OJ@w;tL3c38iY7h) z&~0^EJ#}7tT~6{0#?5FvlX+>47h&Fl#)~p0z||-EvyF+-wwg$+```uwu|^FraPH;5L3bAWOCHN6MfuS)MB_N&r+ zm@$VmJuk5?>brnEn#(ZH{}k(@d7WndeU>}Jvc#XpS#~n-cl646xzf~LM#L7>i}A(K zO~{2@C~Z~f1qlhMC&Yv}z=>5G_&%k=r1G0_zYL zi$oSlLORz}20~*93CEu+EDO%qL6&DXK|Bu?^TLA&yIf6*W<+Ztc>oN{IaEzc89mCR zQWB)Q7}(H$9^SItx?OdQu}mgebFG5SsZD!hvu2daRnwbzhHX2*Ox8WOQSglQMk#qG zX+Wu%UKamcdwYU2xVTZRnFZUsrLru?bDJ2RU9sw(S*fYax_#U7%=NOhdOo|>LZi}m z7yM~BcB$%C&>^D%e+o;uT?hST%N@@d`I}zev$nm4YfVIg3e|GeB^`7xD-* zV-MsCJ}+Hfx}2_i#dP*u2K&4Do+h$qAM4~9k5$^}>naq zNbiN`@eqBC^dsF%cuDsYtrI;Ek{=*>**_SvcZ^m+57EaJdI9KR!nSd`&8Ov4<+b~A zf~OH~M&aqi%PG7V@fH+boOp{0uTApe=xfZ^hkl<7jr$~x8_Rw`>70&nTVl_N@o^eZ z4*|ZN#vSLpIAnnE3;7d7cM|U~w2~~?J=7xUBY?ycAW8bVh`)#QA-$J)Xn!B+(+S_h zWKIb@(!IpP{sYvO{vq8@JgI+x^h^0c>K_1lh-BkjF3w)1SYSD;&^UKTl{_(sKCaM1 z5S?Kr@+zU!V>Bn|?+F&n{RGh`iHG)2kuHtwBYj#KZ;G&}_dH~R&Vs`X=j3+j!%qlvh;RoLy@x5TQtuIptJHgxFh>+UuaGY6 zy9hiS%LtACH0i=|ogw~xk~>SX$e)H$b`tMTh{^?#X>u<^;tS>%?Llyeoy)vb2h$6V zq=>_)+VJSqfn$UY9@|mRCP4+qlI)E*k$gSsVYJJm=${@$IC5RDZYk(>CI_~UmeHgm@qkD!7{j1 zs|zKcm+ba`IsMtl`Oiiq0C|Oj&*Wj{HTkBjoYhqx$5duyt(BzhsDe17AknB>ZmL`@ zI6_G2#`#hKW6c1WCMsmyH;hhIARK|yqLq@azzrTGAvPNpP-| zW!$+d;s;c^dB0N(r-i0e*q2d=SX!60Ks8{MZUXaaZf^c^ zjBXa1z)hmMHh66W`a}#dV`Gza(&McJPwW%QBL9h;2^Wp(uPypDrM79}HY2}_$PW+L zhqspA7X6yif3(#Lv7$e(%vPRKf#ri~2zUXG1>FoLh1P4W;YI6yK6Nu^ zyOVp%F1Xctwd5J8t0Tq&y!#qUn`RMqoY`unX5-c~mPwDXH(`v})@) diff --git a/src/particles/shaders_ng/imageparticle_tabled.vert.qsb b/src/particles/shaders_ng/imageparticle_tabled.vert.qsb index c8be30f414687d3e62821159546df5547458ceb7..91955cb521b70edb3d21407a0d87d9618f47c33a 100644 GIT binary patch literal 5652 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 u!YWB&Ri46%*WUA)!m3J2saRU6@VCdli;~6w literal 5673 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, 0.5f); QCOMPARE(d->size, 100.f); QCOMPARE(d->endSize, 100.f); - QCOMPARE(d->autoRotate, 1.f); + QCOMPARE(d->autoRotate, (uchar)1); QCOMPARE(d->color.r, (uchar)0); QCOMPARE(d->color.g, (uchar)255); QCOMPARE(d->color.b, (uchar)0); diff --git a/tests/auto/particles/qquickimageparticle/tst_qquickimageparticle.cpp b/tests/auto/particles/qquickimageparticle/tst_qquickimageparticle.cpp index 7e07878d39..736c188991 100644 --- a/tests/auto/particles/qquickimageparticle/tst_qquickimageparticle.cpp +++ b/tests/auto/particles/qquickimageparticle/tst_qquickimageparticle.cpp @@ -96,7 +96,7 @@ void tst_qquickimageparticle::test_basic() QCOMPARE(d->yx, 0.0f); QCOMPARE(d->rotation, 0.0f); QCOMPARE(d->rotationVelocity, 0.0f); - QCOMPARE(d->autoRotate, 0.0f); + QCOMPARE(d->autoRotate, (uchar)0); QCOMPARE(d->animX, 0.0f); QCOMPARE(d->animY, 0.0f); QCOMPARE(d->animWidth, 1.0f); @@ -140,7 +140,7 @@ void tst_qquickimageparticle::test_colored() QCOMPARE(d->yx, 0.0f); QCOMPARE(d->rotation, 0.0f); QCOMPARE(d->rotationVelocity, 0.0f); - QCOMPARE(d->autoRotate, 0.0f); + QCOMPARE(d->autoRotate, (uchar)0); QCOMPARE(d->animX, 0.0f); QCOMPARE(d->animY, 0.0f); QCOMPARE(d->animWidth, 1.0f); @@ -185,7 +185,7 @@ void tst_qquickimageparticle::test_colorVariance() QCOMPARE(d->yx, 0.0f); QCOMPARE(d->rotation, 0.0f); QCOMPARE(d->rotationVelocity, 0.0f); - QCOMPARE(d->autoRotate, 0.0f); + QCOMPARE(d->autoRotate, (uchar)0); QCOMPARE(d->animX, 0.0f); QCOMPARE(d->animY, 0.0f); QCOMPARE(d->animWidth, 1.0f); @@ -229,7 +229,7 @@ void tst_qquickimageparticle::test_deformed() QCOMPARE(d->yx, 0.5f); QCOMPARE(d->rotation, 90.0f * (float)CONV_FACTOR); QCOMPARE(d->rotationVelocity, 90.0f * (float)CONV_FACTOR); - QCOMPARE(d->autoRotate, 1.0f); + QCOMPARE(d->autoRotate, (uchar)1); QCOMPARE(d->animX, 0.0f); QCOMPARE(d->animY, 0.0f); QCOMPARE(d->animWidth, 1.0f); @@ -273,7 +273,7 @@ void tst_qquickimageparticle::test_tabled() QCOMPARE(d->yx, 0.0f); QCOMPARE(d->rotation, 0.0f); QCOMPARE(d->rotationVelocity, 0.0f); - QCOMPARE(d->autoRotate, 0.0f); + QCOMPARE(d->autoRotate, (uchar)0); QCOMPARE(d->animX, 0.0f); QCOMPARE(d->animY, 0.0f); QCOMPARE(d->animWidth, 1.0f); @@ -318,7 +318,7 @@ void tst_qquickimageparticle::test_sprite() QCOMPARE(d->yx, 0.0f); QCOMPARE(d->rotation, 0.0f); QCOMPARE(d->rotationVelocity, 0.0f); - QCOMPARE(d->autoRotate, 0.0f); + QCOMPARE(d->autoRotate, (uchar)0); QVERIFY(myFuzzyCompare(d->frameDuration, 120.f)); QCOMPARE(d->frameCount, 6.0f); QVERIFY(d->animT > 0.0f);