From b8a2e206f776e6c612dffb89fe9edf956327b89b Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 20 Mar 2023 12:19:27 +0800 Subject: [PATCH] Added rotation and size decay support for particles --- Assets/Scenes/Scene2.shade | 9 +++++--- Assets/Shaders/ParticleEmit_CS.glsl | 11 +++++++--- Assets/Shaders/ParticleEmit_CS.shshaderb | Bin 11661 -> 12045 bytes Assets/Shaders/ParticleUpdate_CS.glsl | 10 ++++++++- Assets/Shaders/ParticleUpdate_CS.shshaderb | Bin 7037 -> 7585 bytes Assets/Shaders/Particle_VS.glsl | 2 +- Assets/Shaders/Particle_VS.shshaderb | Bin 6609 -> 6609 bytes .../Inspector/SHEditorComponentView.hpp | 11 ++++++++++ .../Particles/SHParticleEmitterComponent.cpp | 20 ++++++++++++++++++ .../Particles/SHParticleEmitterComponent.h | 19 +++++++++++++++-- .../src/Serialization/SHYAMLConverters.h | 11 ++++++++++ 11 files changed, 83 insertions(+), 10 deletions(-) diff --git a/Assets/Scenes/Scene2.shade b/Assets/Scenes/Scene2.shade index e14f32cb..11078394 100644 --- a/Assets/Scenes/Scene2.shade +++ b/Assets/Scenes/Scene2.shade @@ -157,7 +157,7 @@ Scale: {x: 1, y: 1, z: 1} IsActive: true classSHADE::SHParticleEmitterComponent: - Emission Count: 7 + Emission Count: 15 Is Passive: true Emission Interval: 0.0939999968 Min Life: 2 @@ -166,8 +166,11 @@ Maximum Speed: 6 Minimum Size: 0 Maximum Size: 0.5 + Size Decay: 0.990999997 Angular Ranges And Offset: {x: 6.19999981, y: 1.10000002, z: 0, w: 0.100000001} - Rotation Speed: 0 - Texture Asset ID: 63456868 + Rotation Speed: 0.0309999995 + Rotation Decay: 0.0199999996 + Texture Asset ID: 0 + Custom Update Shader Asset ID: 0 IsActive: true Scripts: ~ \ No newline at end of file diff --git a/Assets/Shaders/ParticleEmit_CS.glsl b/Assets/Shaders/ParticleEmit_CS.glsl index 444af6db..45cea313 100644 --- a/Assets/Shaders/ParticleEmit_CS.glsl +++ b/Assets/Shaders/ParticleEmit_CS.glsl @@ -10,8 +10,11 @@ struct EmitterParameters float minSpeed; float maxSpeed; float rotationSpeed; - uint textureIndex; + float rotationDecay; vec4 lifeAndSizeRange; // min life, max life, min size, max size + float sizeDecay; + uint textureIndex; + float padding[2]; }; struct ParticleData @@ -165,14 +168,16 @@ void main() // Set size of particle particle.scaleAndDecay.x = particleSize; - particle.scaleAndDecay.z = particleSize; + particle.scaleAndDecay.y = particleSize; + particle.scaleAndDecay.z = emitterParams.data.sizeDecay; + particle.scaleAndDecay.w = emitterParams.data.sizeDecay; // Set the texture for the particle particle.textureIndex = emitterParams.data.textureIndex; // Set orientation and rotation speed if (emitterParams.data.rotationSpeed != 0.0f) - particle.orientationSpeedDecay = vec4 (rand(seed) * PI, emitterParams.data.rotationSpeed, 0.0f, 0.0f); + particle.orientationSpeedDecay = vec4 (rand(seed) * PI, emitterParams.data.rotationSpeed, emitterParams.data.rotationDecay, 0.0f); else particle.orientationSpeedDecay = vec4 (0.0f); diff --git a/Assets/Shaders/ParticleEmit_CS.shshaderb b/Assets/Shaders/ParticleEmit_CS.shshaderb index f0d782403695ba43b8271f8a3103ba6fa2c4ac7b..b003ba77861961ed5ed03983caec5948612b5c10 100644 GIT binary patch literal 12045 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 literal 11661 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 Y&a$4(VEfXyv($#c&P$(bDR(XZ4@-RRB>(^b diff --git a/Assets/Shaders/ParticleUpdate_CS.glsl b/Assets/Shaders/ParticleUpdate_CS.glsl index 5882a561..43d4893d 100644 --- a/Assets/Shaders/ParticleUpdate_CS.glsl +++ b/Assets/Shaders/ParticleUpdate_CS.glsl @@ -123,7 +123,15 @@ void main() particle.velocity += particle.acceleration; particle.life -= genericDataBuffer.data.dt; particle.orientationSpeedDecay.x += particle.orientationSpeedDecay.y; - particle.orientationSpeedDecay.y -= particle.orientationSpeedDecay.z * genericDataBuffer.data.dt; + particle.scaleAndDecay.x *= particle.scaleAndDecay.z; + particle.scaleAndDecay.y *= particle.scaleAndDecay.w; + + if (particle.orientationSpeedDecay.y > 0.0f) + { + particle.orientationSpeedDecay.y -= particle.orientationSpeedDecay.z * genericDataBuffer.data.dt; + if (particle.orientationSpeedDecay.y < 0.0f) + particle.orientationSpeedDecay.y = 0.0f; + } if (particle.life < 0.0f || particle.scaleAndDecay.x < 0.0f || particle.scaleAndDecay.y < 0.0f) { diff --git a/Assets/Shaders/ParticleUpdate_CS.shshaderb b/Assets/Shaders/ParticleUpdate_CS.shshaderb index 963f2ec9bbd9fa88371947916c2f77ed7179a781..63a79d5af3edef985bc8cb8bc9652dfe2032f10b 100644 GIT binary patch literal 7585 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 literal 7037 zcmai%`D`p% zqrY#}P?9W4E={gT{#HQA)kz;nl3bPy=JWXOeY@9ndz0%n-o9R!E0g}*Q=hBwsWA^A zN9tM2h0Bn|;9^%JClGy=e*WuYK94a#*74mF<9qgu@7_Mqn4X^K_Kr8xiDuSHCnmE_ z+URAoseZ#1zpT}0&P-MvYIs!hYY&qnYfYxdm}^+pbf`Ho-fSPNH+QvW+l_iJYqxf7 z%hv~!Ynb=eJH4#YOt;m0bxd|p;Of)uZYH6?FUkGgPrH+)tzI5$-*lQzZc7{Wn3(^lHa8u>Nw7K=G1d&V2g zZF`b7>(kwIa({Lt1s%%qyboD=bh_Q?-Iq=F4&xVV_F}eN+nHvE4im2iZwq)O=UnmD z?wVu1_Mv1e_M!P2=ls3rA7gE9OM7N|)n*vab;o?X!Q>=%J9nL9;yIjr6?_ia(Mi*0 z){WNM2iF}_ERD5iT5Jcj!0nGX7cy(4UEl@2PwaUZ!}B;;?^0vI!K9|4 zM|y}U=YM9d+#=t+O_OabMb^XOysBfJPX zCGVw}-q;0lEFTK9IjXE79GD`Fx93Anw)LipJyayzp5PVDo0z6dF+XtsL{8oTBEi#x^AD(FgxaR7FacA__;6r z;*8`PN31xbf&9(EoU8Y&1|#YXJMvktm~rgsIp&o}U&Xdw@4M?yF;{yUZ&CCo?8p~( zHJ@1I^WCcE(>7nx%Yo#1biZ%!wtYCy?1*@tk(m9m#_-YBC%*Ua;g8f3D|mg_Ri3uI z_^#!NE#z5$m8UK5F(hgb3!Z(BSoZM(Ybz1!4BLG>`O{rj_a2)n?rn4Y1@CXTe0PN*Bts^!R(s&QZn1`5yaU3 z&93cPE+?XY8;dOzeTq5<@_TB1`pWS=U+5ok@qk9jvt<87TK8U#&ZSPU^ z=0@}p#QNQvcKN?EIe!^;;akL8fo*N(5C7HZRsI@mIkA2Vy1fm1ExP>(dp)}M$a*(0 z8{dA!`bKp3sV#md;#fkKH!&|~)py=CMPJ2UY+-iI*rUwWwFR*k+FKDZ*T+gdavS45 zWD#O+?fVh^qn3xzlg&5p@CXVsv9*0)BleS}UhoI=x7N5-u}^2g&LGD8PRS87ruMlKv!18W<;(LO z)0X#rX7h^4)AlVBi~juy{RDCw5&XWMN5t&2as#|SGuw*+#IrqL+TtPR`wO-`4@=yQeW@nFygH3+rFe?i=Qs-QCPkS zS0cU}z7==Dv5u<{@w>@jJndNX?>DhgJpJyLBYvxXkFM$G{dy(h+P&l{?o5FJ!L8-L z9V^kTPp-MNN08vGLO0GLBsi}^m$Mp?qpe?XUX3otJ_YAB=yKK|aG?G zY

J&-U(I*Jm()pSEFdMLbs}YS@nM+N0DUZwDe*JmQa|8$WpZ?L@>+mb_ghCO>#@ zMGu}m(bg~4-&U@Bo>BL1bn)=Hr}U}r?d@RVk$VrinB3s)MUS4CTU)>A$Gzwm>&H95 zT{F%G=6#59ybIB@{U!b|KAz({5iz;Jdl!1}%&)DV`HlPTa@}vn_bXz*r(6ra_g4Ha zulT(W-8Fk)4ev+9t|J%g*THh_k+O~k z_5nmZa!jH}j_O`haMz-bQ|MyG2<{>DD%U-T=^MR1T>4bcC<7CJmb(159zewWww~r2 z5&Iw_?zeV?+2OY)-bBRw*3_e(7P|GUMXKk~#&#|8O{0sM@886TSkC|8#W4Se5c6+B z^fyn`)S$5hWTMcjxm-o ze*!s)7(?Iq9e4y?Ux)RaV*VtezrN$kEm>IG;n8(~kt_^XPJJLF8!b7o11Yk@*{lxOdRAU5&(< zeiPj@eTd!Y`z=JwGd13~5#z}*jyc8j`!A>CJ$n#cf9v}$at<-S9BZ)t?;);54bH|o z&Fos#^8<9Tuz!edeG&gh=+7X=*VhGetMaxLife(); }, [comp = component](float val) {comp->SetMaxLife(val); }); SHEditorWidgets::DragFloat("Min Size", [comp = component]() {return comp->GetMinSize(); }, [comp = component](float val) {comp->SetMinSize(val); }); SHEditorWidgets::DragFloat("Max Size", [comp = component]() {return comp->GetMaxSize(); }, [comp = component](float val) {comp->SetMaxSize(val); }); + SHEditorWidgets::DragFloat("Size Decay", [comp = component]() {return comp->GetSizeDecayMult(); }, [comp = component](float val) {comp->SetSizeDecayMult(val); }, {}, 0.0001f); SHEditorWidgets::DragVec4("Angles and Offsets", {"yaw", "bank", "yaw off", "bank off"}, [comp = component]() @@ -872,6 +873,16 @@ namespace SHADE comp->SetRotationSpeed(val); }); + SHEditorWidgets::DragFloat("Rotation Decay", + [comp = component]() + { + return comp->GetRotationDecay(); + }, + [comp = component](float val) + { + comp->SetRotationDecay(val); + }); + SHEditorWidgets::DragInt("Texture Index", [comp = component]() { diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp index 8293604c..5454cf31 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp @@ -67,6 +67,11 @@ namespace SHADE cpuEmitterData.rotationSpeed = speed; } + void SHParticleEmitterComponent::SetRotationDecay(float decay) noexcept + { + cpuEmitterData.rotationDecay = decay; + } + void SHParticleEmitterComponent::SetTextureIndex(uint32_t index) noexcept { cpuEmitterData.textureIndex = index; @@ -92,6 +97,11 @@ namespace SHADE cpuEmitterData.lifeAndSizeRange.w = size; } + void SHParticleEmitterComponent::SetSizeDecayMult(float decay) noexcept + { + cpuEmitterData.sizeDecayMult = decay; + } + void SHParticleEmitterComponent::SetCustomUpdateShader(Handle shaderModule) noexcept { customUpdateShader = shaderModule; @@ -143,6 +153,11 @@ namespace SHADE return cpuEmitterData.rotationSpeed; } + float SHParticleEmitterComponent::GetRotationDecay(void) const noexcept + { + return cpuEmitterData.rotationDecay; + } + uint32_t SHParticleEmitterComponent::GetTextureIndex(void) const noexcept { return cpuEmitterData.textureIndex; @@ -169,6 +184,11 @@ namespace SHADE } + float SHParticleEmitterComponent::GetSizeDecayMult(void) const noexcept + { + return cpuEmitterData.sizeDecayMult; + } + Handle SHParticleEmitterComponent::GetCustomUpdateShader(void) const noexcept { return customUpdateShader; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h index 616410cd..d9c26666 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h @@ -1,6 +1,7 @@ #pragma once #include "Resource/SHHandle.h" +#include "Math/Vector/SHVec2.h" #include "Math/Vector/SHVec4.h" #include "ECS_Base/Components/SHComponent.h" #include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h" @@ -32,11 +33,21 @@ namespace SHADE //! Rotational speed of the quad float rotationSpeed; - //! Texture used by the particle - uint32_t textureIndex; + //! Rotation decay rate + float rotationDecay; //! Spawn lifetime and size range (min and max) SHVec4 lifeAndSizeRange; + + //! Size decay for particles + float sizeDecayMult; + + //! Texture used by the particle + uint32_t textureIndex; + + //! Padding for the shader struct + float padding[2]; + }; struct GPUParticleStruct @@ -139,9 +150,11 @@ namespace SHADE void SetMinSpeed (float speed) noexcept; void SetMaxSpeed (float speed) noexcept; void SetRotationSpeed (float speed) noexcept; + void SetRotationDecay (float decay) noexcept; void SetTextureIndex (uint32_t index) noexcept; void SetMinSize (float size) noexcept; void SetMaxSize (float size) noexcept; + void SetSizeDecayMult (float decay) noexcept; void SetCustomUpdateShader (Handle shaderModule) noexcept; uint32_t GetEmissionCount (void) const noexcept; @@ -153,9 +166,11 @@ namespace SHADE float GetMinSpeed (void) const noexcept; float GetMaxSpeed (void) const noexcept; float GetRotationSpeed (void) const noexcept; + float GetRotationDecay (void) const noexcept; uint32_t GetTextureIndex (void) const noexcept; float GetMinSize (void) const noexcept; float GetMaxSize (void) const noexcept; + float GetSizeDecayMult (void) const noexcept; Handle GetCustomUpdateShader (void) const noexcept; /*-----------------------------------------------------------------------*/ diff --git a/SHADE_Engine/src/Serialization/SHYAMLConverters.h b/SHADE_Engine/src/Serialization/SHYAMLConverters.h index c1fa8548..44ed0888 100644 --- a/SHADE_Engine/src/Serialization/SHYAMLConverters.h +++ b/SHADE_Engine/src/Serialization/SHYAMLConverters.h @@ -512,9 +512,11 @@ namespace YAML static constexpr std::string_view ANGULAR_RANGES_OFFSET_TAG = "Angular Ranges And Offset"; static constexpr std::string_view MIN_SIZE_TAG = "Minimum Size"; static constexpr std::string_view MAX_SIZE_TAG = "Maximum Size"; + static constexpr std::string_view SIZE_DECAY_TAG = "Size Decay"; static constexpr std::string_view MIN_SPEED_TAG = "Minimum Speed"; static constexpr std::string_view MAX_SPEED_TAG = "Maximum Speed"; static constexpr std::string_view ROTATION_SPEED_TAG = "Rotation Speed"; + static constexpr std::string_view ROTATION_DECAY_TAG = "Rotation Decay"; static constexpr std::string_view TEXTURE_ASSET_ID_TAG = "Texture Asset ID"; static constexpr std::string_view CUSTOM_UPDATE_SHADER_ASSET_ID_TAG = "Custom Update Shader Asset ID"; @@ -530,8 +532,10 @@ namespace YAML node[MAX_SPEED_TAG.data()] = rhs.GetMaxSpeed(); node[MIN_SIZE_TAG.data()] = rhs.GetMinSize(); node[MAX_SIZE_TAG.data()] = rhs.GetMaxSize(); + node[SIZE_DECAY_TAG.data()] = rhs.GetSizeDecayMult(); node[ANGULAR_RANGES_OFFSET_TAG.data()] = rhs.GetAngularRangesAndOffsets(); node[ROTATION_SPEED_TAG.data()] = rhs.GetRotationSpeed(); + node[ROTATION_DECAY_TAG.data()] = rhs.GetRotationDecay(); node[TEXTURE_ASSET_ID_TAG.data()] = rhs.GetTextureAssetID(); node[CUSTOM_UPDATE_SHADER_ASSET_ID_TAG.data()] = rhs.GetCustomUpdateShaderAssetID(); @@ -556,6 +560,9 @@ namespace YAML if (node[MAX_LIFE_TAG.data()].IsDefined()) rhs.SetMaxLife(node[MAX_LIFE_TAG.data()].as()); + if (node[SIZE_DECAY_TAG.data()].IsDefined()) + rhs.SetSizeDecayMult(node[SIZE_DECAY_TAG.data()].as()); + if (node[ANGULAR_RANGES_OFFSET_TAG.data()].IsDefined()) rhs.SetAngularRangesAndOffsets(node[ANGULAR_RANGES_OFFSET_TAG.data()].as()); @@ -571,6 +578,10 @@ namespace YAML if (node[ROTATION_SPEED_TAG.data()].IsDefined()) rhs.SetRotationSpeed(node[ROTATION_SPEED_TAG.data()].as()); + if (node[ROTATION_DECAY_TAG.data()].IsDefined()) + rhs.SetRotationDecay(node[ROTATION_DECAY_TAG.data()].as()); + + if (node[TEXTURE_ASSET_ID_TAG.data()].IsDefined()) { AssetID id = node[TEXTURE_ASSET_ID_TAG.data()].as();