From 712c4c24b8c827e693ebd5f482fd3eee1202905c Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 20 Mar 2023 20:43:50 +0800 Subject: [PATCH 1/2] Color tinting and scripting support for particles --- Assets/Scenes/Scene2.shade | 1 + Assets/Shaders/ParticleEmit_CS.glsl | 7 +- Assets/Shaders/ParticleEmit_CS.shshaderb | Bin 12045 -> 12309 bytes Assets/Shaders/ParticleUpdate_CS.glsl | 1 + Assets/Shaders/ParticleUpdate_CS.shshaderb | Bin 7585 -> 7833 bytes Assets/Shaders/Particle_FS.glsl | 3 +- Assets/Shaders/Particle_FS.shshaderb | Bin 1401 -> 1513 bytes Assets/Shaders/Particle_VS.glsl | 3 + Assets/Shaders/Particle_VS.shshaderb | Bin 6609 -> 6845 bytes .../Inspector/SHEditorComponentView.hpp | 11 ++ .../Particles/SHParticleEmitterComponent.cpp | 54 ++++++ .../Particles/SHParticleEmitterComponent.h | 21 ++- .../src/Serialization/SHYAMLConverters.h | 4 + .../src/Components/ParticleEmitter.cxx | 170 ++++++++++++++++++ .../src/Components/ParticleEmitter.hxx | 115 ++++++++++++ 15 files changed, 386 insertions(+), 4 deletions(-) create mode 100644 SHADE_Managed/src/Components/ParticleEmitter.cxx create mode 100644 SHADE_Managed/src/Components/ParticleEmitter.hxx diff --git a/Assets/Scenes/Scene2.shade b/Assets/Scenes/Scene2.shade index b4d7abbd..d284d4ea 100644 --- a/Assets/Scenes/Scene2.shade +++ b/Assets/Scenes/Scene2.shade @@ -172,5 +172,6 @@ Rotation Decay: 0.0199999996 Texture Asset ID: 63456868 Custom Update Shader Asset ID: 0 + Color Tint: {x: 1, y: 0, z: 0, w: 1} IsActive: true Scripts: ~ \ No newline at end of file diff --git a/Assets/Shaders/ParticleEmit_CS.glsl b/Assets/Shaders/ParticleEmit_CS.glsl index 45cea313..43ed335d 100644 --- a/Assets/Shaders/ParticleEmit_CS.glsl +++ b/Assets/Shaders/ParticleEmit_CS.glsl @@ -12,6 +12,7 @@ struct EmitterParameters float rotationSpeed; float rotationDecay; vec4 lifeAndSizeRange; // min life, max life, min size, max size + vec4 colorTint; float sizeDecay; uint textureIndex; float padding[2]; @@ -24,6 +25,7 @@ struct ParticleData vec4 velocity; vec4 acceleration; vec4 scaleAndDecay; + vec4 colorTint; float life; uint textureIndex; }; @@ -166,11 +168,14 @@ void main() float particleSize = map (rand(seed), 0.0f, 1.0f, emitterParams.data.lifeAndSizeRange.z, emitterParams.data.lifeAndSizeRange.w); - // Set size of particle + // Set size of and size decay of particle particle.scaleAndDecay.x = particleSize; particle.scaleAndDecay.y = particleSize; particle.scaleAndDecay.z = emitterParams.data.sizeDecay; particle.scaleAndDecay.w = emitterParams.data.sizeDecay; + + // Set particle color tint + particle.colorTint = emitterParams.data.colorTint; // Set the texture for the particle particle.textureIndex = emitterParams.data.textureIndex; diff --git a/Assets/Shaders/ParticleEmit_CS.shshaderb b/Assets/Shaders/ParticleEmit_CS.shshaderb index b003ba77861961ed5ed03983caec5948612b5c10..dea78edc165b6f1b6d1e6e338494926f08f3372d 100644 GIT binary patch delta 2988 zcmZvdTTC5g5XW~pHx7Z&oEESlZE5>ph}EDb8e+7NkbovA+FGrb!YQ1VgTO(0S}oQt z)MBl*H@6qDQmgfT1=qv}V@xDI=$j8d`KGVxt5##;|F`Tk3t{2Q%ztM7^Uch+-=34Z z&iB(3&mRo! znb2P8|CwlXvq4pIw&M1*vmjSWYiWv9Xiv*NT-;NTP|{3j%LL!0Z*=`@nU>ZauH%g5 z$MYj{r<|m-a|up6yB2Y|*gss@rbw2Kw-GlUo6vjSo(~AOSX}q)9D-3HDN1tjeU97*fRd% zY=e8rzmVNfcS)FMASxmy#%%CoHsLn6$=s#H%)e4=vsOpUmW^y(!LL;(T#w8=gz-Sd zh8f$cn2n~eHN|X+$i{nN++<{Hi`nQDZcognF1^s$7c=tC5ICUKsgrtLl`xJmtuA3} zy0(x7r`9T^CH%?r@V; zdh7fLa`pZntL8jvxk-6=&mR(p#te@L)4btvVfrzANSHHeQq=R(sUep0<5%a_HeZl^@a)JpX1^%>ul(4Nto6E^GyeU#231|{ty5km$0e9Y>y-{}6_=v((sPuC!w9>jgCRf! zqxVZfKp&8_DHWv0r?gi%-tB~PShs`n;U@=&18(=C@eT>ZiND2&PsxWLBBuzpDGf_! zN)$+86hw03i09oP#)=q~j;&quVS-*sfDv*JIa5g32sF}|^f>8hVdHR~aIg_aV&0d1 z(ybxxwB;&G#}^ggIr{}H8RH@uHUcf#0qH9xdq#GA*3GlhEf*6c7dGOEnUw9Ibj#K4 zN~1Eq6ccjbY9nrJyWpw^U~w-;B#7w@hTevL?gTw5jYAq z0AJK%I%REoS^Bq<;04Jyh1q~EuSkDOi{Ao{lh_9}IhuM~I6_4smnR;cx}vaAoJU;Mi51ch&A(aH`o${SVK3XeR&w delta 2726 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 diff --git a/Assets/Shaders/Particle_FS.glsl b/Assets/Shaders/Particle_FS.glsl index 243baa2e..69bc224b 100644 --- a/Assets/Shaders/Particle_FS.glsl +++ b/Assets/Shaders/Particle_FS.glsl @@ -15,12 +15,13 @@ layout(location = 0) in struct layout(location = 1) flat in struct { uint textureIndex; + vec4 color; } InFlat; void main () { - fragColor = vec4 (texture(textures [nonuniformEXT(InFlat.textureIndex)], In.uv)); + fragColor = vec4 (texture(textures [nonuniformEXT(InFlat.textureIndex)], In.uv)) * InFlat.color; if (fragColor.a < 0.01f) discard; } diff --git a/Assets/Shaders/Particle_FS.shshaderb b/Assets/Shaders/Particle_FS.shshaderb index edd2dd6b7d9b403787f621ed464e8e07afc8316e..59049d0c1cc9d068cc27942f802b250d3523f06c 100644 GIT binary patch delta 339 zcmXYtJqp4=5QS%xXfQ$iC5?@cMvea(Nuh#A@C=p;0XrM5Jb@>XG~UEk>^y-#sQ8}j z!pFRQGdnZv)491`{*sdaF%91qQQ}BeqNBG|g|wt3kDLOFconact=cHp`kOhJ_Tg(J z^Ac2DmsQ1*hSumN0q(490~0Xc(K?ODJYyd?XMbE4Lk7v!tf<`#)7dHjMZgggl(TIU z(BGqm_ZFxD`cn+bXpcQOt_$dK4ff#39-x0h%>Z$zJ+5*WGn5eo&kGNj3<13dcBFpe LW2otUpd;`Dgy|lb delta 228 zcmaFK{gX>fpn#PD449de*%=rZ8MqjD8H_iIWixJ`%2>w8&deYHl;)o-#=O~(AIQ=K zVrC##U|?a;g0k6wv^J0rqIH3o>$mjt)(2vc7|6))Kr;-1Gzk0xst3s#05M4H2hb`I`w!6dAT~(s JFOY2k!~i>O7Ayb& diff --git a/Assets/Shaders/Particle_VS.glsl b/Assets/Shaders/Particle_VS.glsl index 5004cea1..b5b6f13e 100644 --- a/Assets/Shaders/Particle_VS.glsl +++ b/Assets/Shaders/Particle_VS.glsl @@ -23,6 +23,7 @@ struct ParticleData vec4 velocity; vec4 acceleration; vec4 scaleAndDecay; + vec4 colorTint; float life; uint textureIndex; }; @@ -62,6 +63,7 @@ layout(location = 0) out struct layout(location = 1) out struct { uint textureIndex; // location = 1 + vec4 color; // location = 2 } OutFlat; vec2 CreateQuad (in uint vertexID) @@ -96,6 +98,7 @@ void main() particlePos = particle.position.xyz + (viewRight * particlePos.x * particleScaleData.x) + (viewUp * particlePos.y * particleScaleData.y); OutFlat.textureIndex = particle.textureIndex; + OutFlat.color = particle.colorTint; gl_Position = cameraData.vpMat * vec4(particlePos, 1.0f); } \ No newline at end of file diff --git a/Assets/Shaders/Particle_VS.shshaderb b/Assets/Shaders/Particle_VS.shshaderb index 0a9be96da9bf63b3c3bd87dbe16a9816e4b3d495..2ba7a729785e50c831ae7cb54520cb2ab69ca6e6 100644 GIT binary patch literal 6845 zcmai%`Ja__6~`Z#1rQJn6jGr9Uj_w{ifg3Iz`#IZ42xQ}4A*-fhHIC(w>x)6G)mNV zN+oQM_RVb1R?5sItZcL8Z|RqM^?pCkbB2d$eD&pZUgw<8S-$6czUTSQW!96ICfVwm zeZ`z4nU!3SEKL5HL&-(SY>*_GpY&#YXxF}78^$}e4cA_Gl`a=1U74poi->e}Lx(H% zG37PTE1{jxY3MA}#lP9`=Lza2W@y*Q(C*zsyS9x~Tdk4t&b^Ivq){JBM{4zUTJ6*) zQ~ldmZ&y~(`H-yS#H^>nOL(X_9XrnSMe zTDi9rYhNeRMzdP)2$OM67V9lls@1fSwzJ@}&AyFSD~)tu?0@q0V5>G8&G!EKSO>Y6 z^H_T?)TkfiX3p)w@FX;~Gto|W=H1B8zZsl2J;q z=M&qCQ0iHJWK{ z`dCBSsIpx=QK<{Kc!rD!Rq&oj7RybZBm=&@hu<^9BBKi`q^e(LULe)sq9y7#dTvVZXn zM?Py1n+4g!@KM(%?k9ZgUykK*p0gaMZd}}habnZstiK$mZrr0#)F2jd_BnESu9Mh2 zw{?c@xn1gh_s*qu^PPda?1d{Z?P6s=>lJhV@KYAc``VS|(@(qKn#=lKftgb*zw6x3 z7_qrf_?cVG-$P>Y4T`xuyO^<_&F^tF%v<%xkxO$$)Uw}!5>2Iz@@IGi3w64&diO|it6moy<>dv=oDOs1p#oeR$X*;D~ zrc-ikbHuGcv!0b?yRwk2|K-T$7u!_mYYHrCT8r+|{}piSvv&Q}eWS#*zZz~n_p%39 z!>vzD`!#USFCMjDkIdSM35Y!2hL!_|!&f*U7hocfLeiyrPop9Sgv z`od-|^*0oHf1&S%doJsaJGukeJwm?|*`9~~R%H7Z`T^vgl3qoQ{c6bOx0m5RT42`m zjzadXmZS4uhU`AwPy0QEU3@)Ry=#A@JCn|-6!?9G9=5>WS@P8;ZoZ?Cxs21t`mFmw z$o^T6Z=b!%=OzEWr7j+1ogYQFXD1-QbmK3_{w&&6vN#jS(}ay6>Ub^-PA`{<+-yUm(tlzRrgK_mit%1K(KE{qFp~P}yED={013 zdxzb5YL|59$KTswH~;Zzy1%u{_EUv^Gxhj3t%H1*j-q@1^#yhdr?GbRn~L{l1G0ZJ z#0S89!>)qXKx-jm)b$Jdwa8(2PrrrhAn}Kayf+q@@7W$O@8c#&+!feski}*}!&K|{ zvI){x+og~-*kkcHcJ96KeUNu+tTn0Y7cu*h&Er|@l`*$L#w>=6QP(eGZbvr8nTwb=A{*noW{kRi z5%VTwW1P*1c{8#xcS6Rf>lZO^K{m#@j+nP08{_+EjJkdiGlFc4vmY@PWMd9M#;EIO z%v|_gkTLe&80S5OjHyD#sOx8peg`3AoM~g^hah7{A!F3_i#qN`)^3lyL+|YEkoayY zagG`VChqcH?DGP4)qc3Zw!!svAHP*`=f&Eakozo#mO<|2Ia`o6WBi`gqqcEmW9)0x z)P}wUe<37?}m)K5YiSk-;ZqUTF9EsC8mGm zI)+@%^#HoL7DC6M$n_9%p2eAK=Fk3but6U?0Y!;n7W)^fbS2Dr1w zkUs{Ugq*qPZPfYk!XCb#DEY?u!uONdw1@AfO1|b^28HjZk+sL$_!(sPGKaR9<wg3;9{YR_xm>?}ihVwhtUY|cfE>QoU-tbXy7ut>5_0%jf7$oT=-Q+HuOPdZ zIkZLnUqz1k^|Ag_aPj!AzJ|ORviH{QH~)1=JihsF6qvZnoU+&xib-xey+|GcQEe7CpZRS-)q=vk3kY$Xh|rw1p}r~ literal 6609 zcmai$`Ja__6~~`p7C=xiP;h|&Uj_xD=7NUG4BJ4VGYCrAGFCE4no zbJ^S^=}FE>&Q1QAL&^Ec9FQbgkPKvec+b8)8z;N9jn`gxl`iKcy_u&zi->gfK@*jF zQ+X})7HBv0EOZL$d^+uP)BAUCM+E7m zk0iOfkS`Zx4UjS9sp;I$enzIc#0+G89cql-nWt*j();!4ORm7DUFlRN;O=(~Jl}7$ zHJM=p$<6T5N~c?|Hqz~tZUvQ$Ij-DpP1d{hRyMUJ zZ?Y?gkmqJ^iF>!ZIoYi=t7o3UIDXAmXQI-mKake!t1r11tkOKx@DPn}!Q-6vdG5sp z)OQM7r^N-s*}HqRGfI|epgPw%_Ee&}!)S?me;w#o#zD^KQK7IU3>#<{O&Jl(#v zV!S=;o1H0nMFaCZ+nv@uV(xPsy;|DGnoojR&mC=R=}n$NcX{_i{@?rBmwk^ozMYLM z_dxOoVwme_+R2}Eo+HPVwZ*eExBm8#;q_*BA0yW z2H~#DayEn6kJw@;{Om<+RSB~PG5-;TpKn}ju!Q-x#YRimK!NRtTiXy^>>#uYeJk9x z3@YnOGX3-$H?M1$i5kJF`K&>#2XbEFqpnY!MfmVTp}_Ju`z*()8y7Q=_dPq#`pa?Z z#vO;E2C;~9&XLQ$^s{g44Bft6>i*{N4r(`_Z`S23T!Cp9EBo1lnEQvHvRFRX-YlPf z+I?3p>vsiaPO0;Uu<)suPrcRt#KXX(*MnH>l4>s z-S3f@_ABA$b1!FbHQf5dw7(T@|Kd^W^~kI(8@L0;ZGyxkbKC?shv&Z%4}bfK%_e=E zk^9^NcOQL?8HCUFkG#gLpu!=ze$HqsT-{vT;GUtFJ*#goFynS0o5Q%BaCPH`;l_y> zr@pJeVs^XHdm#PaQP|9-ep{gr7W(aQd$R60n*+%15&B)o&N}q>B0IOx45S%uI_hFO#6vKb`GB5Gw_(fuaWIn z%vg25i7|uc3R(Y4vHu=!9_w657QdHq&$LPI`A4`pw3}D`6cl-%N47ru(EsJaW-jyk zt#lvBy(MdZ6|T*gf56Ql<{s*=71;IM0&ULD<-Y#{@ownrxn2Ru)qS_ulyu+MmXfZ0 zyrfr_2<%GuRnS^!9b}BUeqp~BIqdG~JGc%Kf2_!RLxF9A?*;QbZiK{LfxQh`tOpvU zTHnfMNMCKf6>D(D;?d*Vk^M#t5##q^53~!iW^MY}`>l{R{ceMgK-(exwCOhpABD78 zmv?Dzfx)uA{l@HrJX>R}NnO8)*^g`iR{@yO53XZbrt~Gfu0qBr8{<7rA!BNgG3xq79fy#$+pp*0{0~FoBUIv@s27;H%NaYfh3usL zo&wte*Vlc<3*57}_6FoWi=kzZd)em%q|F%Lrh3%YMmEM7MQ!g#79XKI?|ugolU&wj zt`=OIvTynb6nj2^>|WMy4IhAvI}g$pH9v@K>^jJr%_XLPQ~qA-|Tb)r@@xPFM`CqlTQ`@BQ7m)`@a~9 od@GU5`QC`W0uqmWtB}RZ`BtNgN50WwE^ENtOZ$JAg}QV5FNY$By8r+H diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp index 2edadbbc..421aec6d 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp @@ -883,6 +883,17 @@ namespace SHADE comp->SetRotationDecay(val); }); + SHEditorWidgets::ColorPicker("Color Tint", + [comp = component]() + { + return comp->GetColorTint(); + }, + [comp = component](SHVec4 const& val) + { + comp->SetColorTint(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 5454cf31..fcdb20da 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp @@ -52,6 +52,18 @@ namespace SHADE } + void SHParticleEmitterComponent::SetAngularRanges(SHVec2 const& ranges) noexcept + { + cpuEmitterData.angularRangesAndOffsets.x = ranges.x; + cpuEmitterData.angularRangesAndOffsets.y = ranges.y; + } + + void SHParticleEmitterComponent::SetAngularOffsets(SHVec2 const& offsets) noexcept + { + cpuEmitterData.angularRangesAndOffsets.z = offsets.x; + cpuEmitterData.angularRangesAndOffsets.w = offsets.y; + } + void SHParticleEmitterComponent::SetMinSpeed(float speed) noexcept { cpuEmitterData.minSpeed = speed; @@ -107,6 +119,23 @@ namespace SHADE customUpdateShader = shaderModule; } + void SHParticleEmitterComponent::SetColorTint(SHVec4 tint) noexcept + { + cpuEmitterData.colorTint = tint; + } + + void SHParticleEmitterComponent::SetColorTintRGB(SHVec3 tint) noexcept + { + cpuEmitterData.colorTint.x = tint.x; + cpuEmitterData.colorTint.y = tint.y; + cpuEmitterData.colorTint.z = tint.z; + } + + void SHParticleEmitterComponent::SetColorTintAlpha(float alpha) noexcept + { + cpuEmitterData.colorTint.w = alpha; + } + uint32_t SHParticleEmitterComponent::GetEmissionCount(void) const noexcept { return emissionCount; @@ -138,6 +167,16 @@ namespace SHADE return cpuEmitterData.angularRangesAndOffsets; } + SHVec2 SHParticleEmitterComponent::GetAngularRanges(void) const noexcept + { + return SHVec2{cpuEmitterData.angularRangesAndOffsets.x, cpuEmitterData.angularRangesAndOffsets.y}; + } + + SHVec2 SHParticleEmitterComponent::GetAngularOffsets(void) const noexcept + { + return {cpuEmitterData.angularRangesAndOffsets.z, cpuEmitterData.angularRangesAndOffsets.w }; + } + float SHParticleEmitterComponent::GetMinSpeed(void) const noexcept { return cpuEmitterData.minSpeed; @@ -194,4 +233,19 @@ namespace SHADE return customUpdateShader; } + SHVec4 const& SHParticleEmitterComponent::GetColorTint(void) const noexcept + { + return cpuEmitterData.colorTint; + } + + SHVec3 SHParticleEmitterComponent::GetColorTintRGB(void) const noexcept + { + return SHVec3 (cpuEmitterData.colorTint.x, cpuEmitterData.colorTint.y, cpuEmitterData.colorTint.z); + } + + float SHParticleEmitterComponent::GetColorTintAlpha(void) const noexcept + { + return cpuEmitterData.colorTint.w; + } + } \ No newline at end of file diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h index d9c26666..e5360e85 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h @@ -1,5 +1,6 @@ #pragma once +#include "SH_API.h" #include "Resource/SHHandle.h" #include "Math/Vector/SHVec2.h" #include "Math/Vector/SHVec4.h" @@ -15,7 +16,7 @@ namespace SHADE class SHVkShaderModule; class SHVkPipeline; - class SHParticleEmitterComponent : public SHComponent + class SH_API SHParticleEmitterComponent : public SHComponent { private: @@ -24,7 +25,7 @@ namespace SHADE //! Angular ranges of emission SHVec4 angularRangesAndOffsets; - //! minimum starting velocity + //! minimum starting velocity float minSpeed; //! Maximum starting velocity @@ -39,6 +40,9 @@ namespace SHADE //! Spawn lifetime and size range (min and max) SHVec4 lifeAndSizeRange; + //! Color tint to assign to particles + SHVec4 colorTint; + //! Size decay for particles float sizeDecayMult; @@ -67,6 +71,9 @@ namespace SHADE //! x scale, x scale decay, y scale and y scale decay SHVec4 scaleAndDecay; + //! Color tinting for particle + SHVec4 colorTint; + //! Life of the particle float life; @@ -147,6 +154,8 @@ namespace SHADE void SetMinLife (float val) noexcept; void SetMaxLife (float val) noexcept; void SetAngularRangesAndOffsets (SHVec4 const& ranges) noexcept; + void SetAngularRanges (SHVec2 const& ranges) noexcept; + void SetAngularOffsets (SHVec2 const& offsets) noexcept; void SetMinSpeed (float speed) noexcept; void SetMaxSpeed (float speed) noexcept; void SetRotationSpeed (float speed) noexcept; @@ -156,6 +165,9 @@ namespace SHADE void SetMaxSize (float size) noexcept; void SetSizeDecayMult (float decay) noexcept; void SetCustomUpdateShader (Handle shaderModule) noexcept; + void SetColorTint (SHVec4 tint) noexcept; + void SetColorTintRGB (SHVec3 tint) noexcept; + void SetColorTintAlpha (float alpha) noexcept; uint32_t GetEmissionCount (void) const noexcept; bool GetPassive (void) const noexcept; @@ -163,6 +175,8 @@ namespace SHADE float GetMinLife (void) const noexcept; float GetMaxLife (void) const noexcept; SHVec4 const& GetAngularRangesAndOffsets (void) const noexcept; + SHVec2 GetAngularRanges (void) const noexcept; + SHVec2 GetAngularOffsets (void) const noexcept; float GetMinSpeed (void) const noexcept; float GetMaxSpeed (void) const noexcept; float GetRotationSpeed (void) const noexcept; @@ -172,6 +186,9 @@ namespace SHADE float GetMaxSize (void) const noexcept; float GetSizeDecayMult (void) const noexcept; Handle GetCustomUpdateShader (void) const noexcept; + SHVec4 const& GetColorTint (void) const noexcept; + SHVec3 GetColorTintRGB (void) const noexcept; + float GetColorTintAlpha (void) const noexcept; /*-----------------------------------------------------------------------*/ /* NON-INTERFACE FUNCTIONS */ diff --git a/SHADE_Engine/src/Serialization/SHYAMLConverters.h b/SHADE_Engine/src/Serialization/SHYAMLConverters.h index 2550388e..923037d1 100644 --- a/SHADE_Engine/src/Serialization/SHYAMLConverters.h +++ b/SHADE_Engine/src/Serialization/SHYAMLConverters.h @@ -519,6 +519,7 @@ namespace YAML 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"; + static constexpr std::string_view COLOR_TINT_TAG = "Color Tint"; static YAML::Node encode(SHParticleEmitterComponent const& rhs) { @@ -538,6 +539,7 @@ namespace YAML 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(); + node[COLOR_TINT_TAG.data()] = rhs.GetColorTint(); return node; } @@ -581,6 +583,8 @@ namespace YAML if (node[ROTATION_DECAY_TAG.data()].IsDefined()) rhs.SetRotationDecay(node[ROTATION_DECAY_TAG.data()].as()); + if (node[COLOR_TINT_TAG.data()].IsDefined()) + rhs.SetColorTint(node[COLOR_TINT_TAG.data()].as()); if (node[TEXTURE_ASSET_ID_TAG.data()].IsDefined()) { diff --git a/SHADE_Managed/src/Components/ParticleEmitter.cxx b/SHADE_Managed/src/Components/ParticleEmitter.cxx new file mode 100644 index 00000000..a5bbf350 --- /dev/null +++ b/SHADE_Managed/src/Components/ParticleEmitter.cxx @@ -0,0 +1,170 @@ +#include "SHpch.h" + +#include "ParticleEmitter.hxx" + + +namespace SHADE +{ + ParticleEmitter::ParticleEmitter(Entity entity) + :Component(entity) + { + + } + + void ParticleEmitter::Emit() + { + GetNativeComponent()->Emit(); + } + + + float ParticleEmitter::EmissionInterval::get() + { + return (GetNativeComponent()->GetEmissionInterval()); + } + + void ParticleEmitter::EmissionInterval::set(float val) + { + GetNativeComponent()->SetEmissionInterval(val); + } + + bool ParticleEmitter::IsPassive::get() + { + return (GetNativeComponent()->GetPassive()); + } + + void ParticleEmitter::IsPassive::set(bool val) + { + GetNativeComponent()->SetPassive(val); + } + + float ParticleEmitter::MinLife::get() + { + return (GetNativeComponent()->GetMinLife()); + } + + void ParticleEmitter::MinLife::set(float val) + { + GetNativeComponent()->SetMinLife(val); + } + + float ParticleEmitter::MaxLife::get() + { + return (GetNativeComponent()->GetMaxLife()); + } + + void ParticleEmitter::MaxLife::set(float val) + { + GetNativeComponent()->SetMaxLife(val); + } + + Vector2 ParticleEmitter::AngularRanges::get() + { + return Convert::ToCLI(GetNativeComponent()->GetAngularRanges()); + } + + void ParticleEmitter::AngularRanges::set(Vector2 val) + { + GetNativeComponent()->SetAngularRanges(Convert::ToNative(val)); + } + + Vector2 ParticleEmitter::AngularOffsets::get() + { + return Convert::ToCLI(GetNativeComponent()->GetAngularOffsets()); + } + + void ParticleEmitter::AngularOffsets::set(Vector2 val) + { + GetNativeComponent()->SetAngularOffsets(Convert::ToNative(val)); + } + + float ParticleEmitter::MinSpeed::get() + { + return GetNativeComponent()->GetMinSpeed(); + } + + void ParticleEmitter::MinSpeed::set(float val) + { + GetNativeComponent()->SetMinSpeed(val); + } + + float ParticleEmitter::MaxSpeed::get() + { + return GetNativeComponent()->GetMinSpeed(); + } + + void ParticleEmitter::MaxSpeed::set(float val) + { + GetNativeComponent()->SetMaxSpeed(val); + } + + float ParticleEmitter::RotationSpeed::get() + { + return GetNativeComponent()->GetRotationSpeed(); + } + + void ParticleEmitter::RotationSpeed::set(float val) + { + GetNativeComponent()->SetRotationSpeed(val); + } + + float ParticleEmitter::RotationDecay::get() + { + return GetNativeComponent()->GetRotationDecay(); + } + + void ParticleEmitter::RotationDecay::set(float val) + { + GetNativeComponent()->SetRotationDecay(val); + } + + float ParticleEmitter::MinSize::get() + { + return GetNativeComponent()->GetMinSize(); + } + + void ParticleEmitter::MinSize::set(float val) + { + GetNativeComponent()->SetMinSize(val); + } + + float ParticleEmitter::MaxSize::get() + { + return GetNativeComponent()->GetMaxSize(); + } + + void ParticleEmitter::MaxSize::set(float val) + { + GetNativeComponent()->SetMaxSize(val); + } + + float ParticleEmitter::SizeDecayMult::get() + { + return GetNativeComponent()->GetSizeDecayMult(); + } + + void ParticleEmitter::SizeDecayMult::set(float val) + { + GetNativeComponent()->SetSizeDecayMult(val); + } + + Vector3 ParticleEmitter::ColorTintRGB::get() + { + return Convert::ToCLI(GetNativeComponent()->GetColorTintRGB()); + } + + void ParticleEmitter::ColorTintRGB::set(Vector3 val) + { + GetNativeComponent()->SetColorTintRGB (Convert::ToNative (val)); + } + + float ParticleEmitter::ColorTintAlpha::get() + { + return GetNativeComponent()->GetColorTintAlpha(); + } + + void ParticleEmitter::ColorTintAlpha::set(float val) + { + GetNativeComponent()->SetColorTintAlpha(val); + } + +} \ No newline at end of file diff --git a/SHADE_Managed/src/Components/ParticleEmitter.hxx b/SHADE_Managed/src/Components/ParticleEmitter.hxx new file mode 100644 index 00000000..686d0a83 --- /dev/null +++ b/SHADE_Managed/src/Components/ParticleEmitter.hxx @@ -0,0 +1,115 @@ +#pragma once + +// Project Includes +#include "Components/Component.hxx" +#include "Math/Vector2.hxx" +#include "Math/Vector3.hxx" +#include "Math/Quaternion.hxx" +// External Dependencies +#include "Camera/SHCameraComponent.h" +#include "Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h" + +namespace SHADE +{ + public ref class ParticleEmitter : public Component + { + internal: + ParticleEmitter(Entity entity); + + public: + + property bool IsPassive + { + bool get(); + void set(bool val); + } + + property float EmissionInterval + { + float get(); + void set(float val); + } + + property float MinLife + { + float get(); + void set(float val); + } + + property float MaxLife + { + float get(); + void set(float val); + } + + property Vector2 AngularRanges + { + Vector2 get(); + void set(Vector2 val); + } + + property Vector2 AngularOffsets + { + Vector2 get(); + void set(Vector2 val); + } + + property float MinSpeed + { + float get(); + void set(float val); + } + + property float MaxSpeed + { + float get(); + void set(float val); + } + + property float RotationSpeed + { + float get(); + void set(float val); + } + + property float RotationDecay + { + float get(); + void set(float val); + } + + property float MinSize + { + float get(); + void set(float val); + } + + property float MaxSize + { + float get(); + void set(float val); + } + + property float SizeDecayMult + { + float get(); + void set(float val); + } + + property Vector3 ColorTintRGB + { + Vector3 get(); + void set(Vector3 val); + } + + property float ColorTintAlpha + { + float get(); + void set (float val); + } + + void Emit(); + + + }; +} \ No newline at end of file From 7216c1c3dd102a4d9bbed1415f9ca90023b16f47 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Tue, 21 Mar 2023 15:27:42 +0800 Subject: [PATCH 2/2] Particles test on level 1 food --- Assets/Scenes/Level1.shade | 75 +++++++++++++++++- Assets/Scenes/Scene2.shade.shmeta | 3 + Assets/Scripts/Gameplay/Item/SC_Item.cs | 9 +++ Assets/Shaders/ParticleEmit_CS.glsl | 3 +- Assets/Shaders/ParticleEmit_CS.shshaderb | Bin 12309 -> 12373 bytes .../Inspector/SHEditorComponentView.hpp | 17 ++++ .../Particles/SHParticleEmitterComponent.cpp | 12 +++ .../Particles/SHParticleEmitterComponent.h | 5 ++ .../src/Serialization/SHYAMLConverters.h | 5 ++ SHADE_Managed/src/Engine/ECS.cxx | 3 + 10 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 Assets/Scenes/Scene2.shade.shmeta diff --git a/Assets/Scenes/Level1.shade b/Assets/Scenes/Level1.shade index af4c20e3..fbb6ba1c 100644 --- a/Assets/Scenes/Level1.shade +++ b/Assets/Scenes/Level1.shade @@ -7124,7 +7124,7 @@ NumberOfChildren: 0 Components: Transform Component: - Translate: {x: -2.50000072, y: 0.799999893, z: -4.28408909} + Translate: {x: -2.51287055, y: 0.799999893, z: -4.28408909} Rotate: {x: -5.83341553e-08, y: 7.48974247e-14, z: 1.10461471e-08} Scale: {x: 1, y: 1, z: 1} IsActive: true @@ -8178,4 +8178,75 @@ Hovered: false Clicked: false IsActive: true - Scripts: ~ \ No newline at end of file + Scripts: ~ +- EID: 523 + Name: Mesh_Apple + IsActive: true + NumberOfChildren: 0 + Components: + Transform Component: + Translate: {x: -7.29431438, y: 1.17736602, z: -4.53253984} + Rotate: {x: -5.83341553e-08, y: 7.48974247e-14, z: 1.10461471e-08} + Scale: {x: 1, y: 1, z: 1} + IsActive: true + Renderable Component: + Mesh: 144128170 + Material: 122370915 + IsActive: true + RigidBody Component: + Type: Dynamic + Drag: 0.00999999978 + Angular Drag: 0.100000001 + Gravity Scale: 1 + Use Gravity: true + Interpolate: false + Sleeping Enabled: true + Freeze Position X: false + Freeze Position Y: false + Freeze Position Z: false + Freeze Rotation X: false + Freeze Rotation Y: false + Freeze Rotation Z: false + IsActive: true + Collider Component: + Colliders: + - Is Trigger: false + Collision Tag: 2 + Type: Box + Half Extents: {x: 0.200000003, y: 0.200000003, z: 0.200000003} + Friction: 0.400000006 + Bounciness: 0 + Density: 1 + Position Offset: {x: 0, y: 0, z: 0} + Rotation Offset: {x: 0, y: 0, z: 0} + IsActive: true + classSHADE::SHParticleEmitterComponent: + Emission Count: 4 + Is Passive: false + Emission Interval: 0 + Min Life: 1 + Max Life: 2 + Minimum Speed: 1 + Maximum Speed: 1.5 + Minimum Size: 0 + Maximum Size: 0.075000003 + Size Decay: 0.907999992 + Angular Ranges And Offset: {x: 6.19999981, y: 3.1400001, z: 0, w: 1.70000005} + Rotation Speed: 0.805999994 + Rotation Decay: 0 + Texture Asset ID: 0 + Custom Update Shader Asset ID: 0 + Color Tint: {x: 0.470701218, y: 0.559471369, z: 0.283432603, w: 1} + Acceleration: {x: 0, y: -0.0390000008, z: 0} + IsActive: true + Scripts: + - Type: Item + Enabled: true + Score: 10 + currCategory: 0 + density: 1 + dontReturn: false + soundDistance: 10 + highlightSpeed: 200 + highlightThickness: 60 + highlightLowerClamp: 0.25 \ No newline at end of file diff --git a/Assets/Scenes/Scene2.shade.shmeta b/Assets/Scenes/Scene2.shade.shmeta new file mode 100644 index 00000000..9ec289c8 --- /dev/null +++ b/Assets/Scenes/Scene2.shade.shmeta @@ -0,0 +1,3 @@ +Name: Scene2 +ID: 89281126 +Type: 5 diff --git a/Assets/Scripts/Gameplay/Item/SC_Item.cs b/Assets/Scripts/Gameplay/Item/SC_Item.cs index be28bb5a..3fdeee6e 100644 --- a/Assets/Scripts/Gameplay/Item/SC_Item.cs +++ b/Assets/Scripts/Gameplay/Item/SC_Item.cs @@ -33,6 +33,8 @@ public class Item : Script public float highlightThickness = 600.0f; public float highlightLowerClamp = 0.25f; + private ParticleEmitter emitter; + protected override void awake() { @@ -50,6 +52,8 @@ public class Item : Script AudioHandler.audioClipHandlers["SFXImpactElastic"] = Audio.CreateAudioClip("event:/Props/impact_elastic"); AudioHandler.audioClipHandlers["SFXImpactHard"] = Audio.CreateAudioClip("event:/Props/impact_hard"); + + emitter = GetComponent(); } protected override void start() @@ -135,6 +139,11 @@ public class Item : Script playSound = false; Audio.DetachAudioClipFromObject(AudioHandler.audioClipHandlers["SFXImpactElastic"]); Audio.DetachAudioClipFromObject(AudioHandler.audioClipHandlers["SFXImpactHard"]); + + if(emitter) + emitter.Emit(); + + Debug.Log("EMIT"); } if (info.GameObject.GetScript() && !returnBack) diff --git a/Assets/Shaders/ParticleEmit_CS.glsl b/Assets/Shaders/ParticleEmit_CS.glsl index 43ed335d..b2f81a05 100644 --- a/Assets/Shaders/ParticleEmit_CS.glsl +++ b/Assets/Shaders/ParticleEmit_CS.glsl @@ -7,6 +7,7 @@ layout(local_size_x = 128) in; struct EmitterParameters { vec4 angularRangesAndOffsets; + vec4 acceleration; float minSpeed; float maxSpeed; float rotationSpeed; @@ -187,7 +188,7 @@ void main() particle.orientationSpeedDecay = vec4 (0.0f); - particle.acceleration = vec4 (0.0f, -0.058f, 0.0f, 0.0f); + particle.acceleration = emitterParams.data.acceleration; inputParticles.data[index] = particle; diff --git a/Assets/Shaders/ParticleEmit_CS.shshaderb b/Assets/Shaders/ParticleEmit_CS.shshaderb index dea78edc165b6f1b6d1e6e338494926f08f3372d..08972d9d58d1df32985ed1f5e2f34e3e4cab437d 100644 GIT binary patch literal 12373 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 }); + SHEditorWidgets::DragVec3("Acceleration", {"x", "y", "z"}, + [comp = component]() + { + return comp->GetAcceleration(); + }, + [comp = component](SHVec3 const& val) + { + comp->SetAcceleration(val); + }); + SHEditorWidgets::ColorPicker("Color Tint", [comp = component]() { @@ -903,6 +913,13 @@ namespace SHADE { comp->SetTextureAssetID(val); }); + ImGui::SameLine(); + if (ImGui::Button("Reset")) + { + component->SetTextureAssetID(0); + component->SetTextureIndex(0); + } + if (SHDragDrop::BeginTarget()) { if (AssetID* payload = SHDragDrop::AcceptPayload(SHDragDrop::DRAG_RESOURCE)) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp index fcdb20da..d6f1e115 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.cpp @@ -52,6 +52,13 @@ namespace SHADE } + void SHParticleEmitterComponent::SetAcceleration(SHVec3 const& accel) noexcept + { + cpuEmitterData.accleration.x = accel.x; + cpuEmitterData.accleration.y = accel.y; + cpuEmitterData.accleration.z = accel.z; + } + void SHParticleEmitterComponent::SetAngularRanges(SHVec2 const& ranges) noexcept { cpuEmitterData.angularRangesAndOffsets.x = ranges.x; @@ -177,6 +184,11 @@ namespace SHADE return {cpuEmitterData.angularRangesAndOffsets.z, cpuEmitterData.angularRangesAndOffsets.w }; } + SHVec3 SHParticleEmitterComponent::GetAcceleration(void) const noexcept + { + return SHVec3{cpuEmitterData.accleration.x, cpuEmitterData.accleration.y, cpuEmitterData.accleration.z }; + } + float SHParticleEmitterComponent::GetMinSpeed(void) const noexcept { return cpuEmitterData.minSpeed; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h index e5360e85..47791c44 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h @@ -25,6 +25,9 @@ namespace SHADE //! Angular ranges of emission SHVec4 angularRangesAndOffsets; + //! Acceleration + SHVec4 accleration; + //! minimum starting velocity float minSpeed; @@ -154,6 +157,7 @@ namespace SHADE void SetMinLife (float val) noexcept; void SetMaxLife (float val) noexcept; void SetAngularRangesAndOffsets (SHVec4 const& ranges) noexcept; + void SetAcceleration (SHVec3 const& accel) noexcept; void SetAngularRanges (SHVec2 const& ranges) noexcept; void SetAngularOffsets (SHVec2 const& offsets) noexcept; void SetMinSpeed (float speed) noexcept; @@ -177,6 +181,7 @@ namespace SHADE SHVec4 const& GetAngularRangesAndOffsets (void) const noexcept; SHVec2 GetAngularRanges (void) const noexcept; SHVec2 GetAngularOffsets (void) const noexcept; + SHVec3 GetAcceleration (void) const noexcept; float GetMinSpeed (void) const noexcept; float GetMaxSpeed (void) const noexcept; float GetRotationSpeed (void) const noexcept; diff --git a/SHADE_Engine/src/Serialization/SHYAMLConverters.h b/SHADE_Engine/src/Serialization/SHYAMLConverters.h index 923037d1..8805ed41 100644 --- a/SHADE_Engine/src/Serialization/SHYAMLConverters.h +++ b/SHADE_Engine/src/Serialization/SHYAMLConverters.h @@ -520,6 +520,7 @@ namespace YAML 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"; static constexpr std::string_view COLOR_TINT_TAG = "Color Tint"; + static constexpr std::string_view ACCELERATION_TAG = "Acceleration"; static YAML::Node encode(SHParticleEmitterComponent const& rhs) { @@ -540,6 +541,7 @@ namespace YAML node[TEXTURE_ASSET_ID_TAG.data()] = rhs.GetTextureAssetID(); node[CUSTOM_UPDATE_SHADER_ASSET_ID_TAG.data()] = rhs.GetCustomUpdateShaderAssetID(); node[COLOR_TINT_TAG.data()] = rhs.GetColorTint(); + node[ACCELERATION_TAG.data()] = rhs.GetAcceleration(); return node; } @@ -586,6 +588,9 @@ namespace YAML if (node[COLOR_TINT_TAG.data()].IsDefined()) rhs.SetColorTint(node[COLOR_TINT_TAG.data()].as()); + if (node[ACCELERATION_TAG.data()].IsDefined()) + rhs.SetAcceleration(node[ACCELERATION_TAG.data()].as()); + if (node[TEXTURE_ASSET_ID_TAG.data()].IsDefined()) { AssetID id = node[TEXTURE_ASSET_ID_TAG.data()].as(); diff --git a/SHADE_Managed/src/Engine/ECS.cxx b/SHADE_Managed/src/Engine/ECS.cxx index c79175bf..38138be6 100644 --- a/SHADE_Managed/src/Engine/ECS.cxx +++ b/SHADE_Managed/src/Engine/ECS.cxx @@ -34,6 +34,7 @@ of DigiPen Institute of Technology is prohibited. #include "UI\SHCanvasComponent.h" #include "Animation\SHAnimatorComponent.h" #include "Graphics\MiddleEnd\TrajectoryRendering\SHTrajectoryRenderableComponent.h" +#include "Graphics\MiddleEnd/Particles/SHParticleEmitterComponent.h" // Project Headers #include "Utility/Convert.hxx" #include "Utility/Debug.hxx" @@ -50,6 +51,7 @@ of DigiPen Institute of Technology is prohibited. #include "Components\Slider.hxx" #include "Components\TrajectoryRenderable.hxx" #include "Components\Animator.hxx" +#include "Components\ParticleEmitter.hxx" @@ -341,6 +343,7 @@ namespace SHADE componentMap.Add(createComponentSet()); componentMap.Add(createComponentSet()); componentMap.Add(createComponentSet()); + componentMap.Add(createComponentSet()); } /*---------------------------------------------------------------------------------*/