[Runtime Feature]: Particle System Feature Expansion
What is the context of the feature/improvement?
The new particle system is already quite useful for general purpose but is lacking certain features for more specialized and visually interesting applications. The majority of suggested features are fairly common in other particle system solutions like Unreal Engines Niagara/Cascade or Unity Particle System.
Please describe the feature/improvement?
Particle Flipbook animation type:
Currently the particles can inherit the flipbook animation from the material, however the animation isn't tied to the particle in any way which makes certain common effects like explosions very difficult to get right as a simple flipbook explosion effect would loop in the midst of the lifetime. I suggest adding a toggle for changing the playback behavior of the flipbook to be directly tied to the lifetime of the particle so that the first frame of the flipbook plays at birth and reaches the end of the flipbook at the end of the lifetime without looping.
Alpha fade duration for the particles:
Either as a fixed value in seconds or percentage wise tied to the lifetime of a particle i.e. fade-in = 0.1 fades the particle from 0 to max opacity over 10% of the lifetime or over 100 ms, depending on which of the two is implemented.
Just two variables for fade in and fade out should suffice already, and while curves are better but I reckon those two vars are easier to code for now.
Attraction force:
Define a position (with a gizmo or just via XYZ) that is offset from the mesh emitter origin to act as an attraction point with a force and radius value that tries to reorient the particle towards said point.
In Unreal it's called Orbit or Point Attractor and it's generally useful for energy balls and other magical FX.
This can also be very useful for moving emitters that inherit velocity as the point emitter might work as a makeshift turbulence or an attractor for trailing particles.
Collision behavior:
Currently particles can only have their bounciness affected when colliding and while that's already mighty useful, there might be instances where other behaviors might be desired. For example kill (remove it on collision), stop (set all velocities to 0 and stop gravity from affecting the particle), bounce (default behavior) and spawn child (creates a new particle of a different type on collision, think of rain or bullet tracers that spawn water splashes or sparks on collision)
Burst rate:
Certain effects might only get spawned for a very short time but the emitter might linger around for longer so this can limit the time how long to spawn particles for before turning the spawn rate to 0 and waiting for despawn. I know there are plenty of games that have emitters that persist longer than they need to after firing off their particles.
Additionally to the burst rate having a emitter duration variable that defaults to infinite for normal particle systems would be useful as this could be used to reset the burst for regular interval effects that need a big burst of particles but not at a constant rate.
Drag or air resistance:
Slow down particles over time based on a resistance coefficient. Useful in combination with attraction or to slow down particles without running the risk of dragging them in the opposite direction. I.e. smoke particles that should eventually stop after rising but shouldn't fall back down, something that isn't given with using gravity as a counter force. The example below shows a firework type effect where the individual sparks slow down after the initial velocity from the explosion gets overwhelmed by the air resistance.
Mesh Emitter:
Sometimes you might need a mesh for particles instead of quads. For example ice shards or rockets.
Particle Size:
I am specifically referring to XY scale individually as not every particle needs to be a perfect quad and not everything makes use of velocity stretching. Schema lists a simple scalar for the size, having the ability to make something rectangular is very useful and quite common. For example the fire in HL2 is generally in a 2x1 ratio, it's twice as tall as it is wide. Just having more granular control over the shape of the quad would help a lot. Especially given that not everything can rely on motion trail stretching.
Restrict axis:
Disallow particles to move on a given axis regardless of inherited velocity or impulse. Quite useful in combination with a constant velocity or attraction (e.g. only allow two axis so particles can orbit a barrel of a railgun for example. Mind you I don't mean the orientation of the particle as that's already implemented
Motion Trail stretch type:
Currently the motion trail feature stretches based on a box, as in it stretches the middle part of the particle and keeps the top and bottom as is. I suggest also adding a simple full quad stretch feature as not every particle might benefit from the box stretch.
Flip particle orientation:
Adding the ability to have the particle randomly flipped (a dropdown with "None", "Horizontal", "Vertical", "Both" would be ideal here) would allow particle systems to have much less repetition for something like a fire or a swirling portal if the quad has a random flip it adds a lot more perceived randomness while still only using a single material.
Initial Rotation:
Currently particle systems have a start and end rotation rate, but from what I gather it's quite limiting if one requires random orientation on sprites for something like smoke but doesn't want any change to the rotation over the lifespan. A simple 0 to 180° slider for setting the maximum deviation in degrees from default up would be nice.
Pick Random SubUV from Atlas:
It is quite common to have a spritesheet for things like gibs or impact debris that contain several different textures on the same atlas that get randomly picked from when a particle spawns. This means the particle doesn't use a flipbook animation but instead just assigns a random entry via the same shader. Basically just using a randomly picked constant instead of time for the animation.
These are most of the things I'd like to see added to the particle system to make it a truly versatile tool for artists and modders.
What would be your solution? (optional)
No response
Version
x.x.x
Media
No response
All of these features would be massively beneficial to Remix and what artists can achieve with it. I can already see use-cases for every single one listed in my Republic Commando RTX project.
Great list! All of the features @RuneStorm has mentioned would be very useful.
I'd like to suggest some additional features:
It currently does not appear to be possible to use a mesh as an anchor for a particle system: it functions in the toolkit, however no particles are emitted in the runtime. Simply changing the anchor to a mat causes the particle system to be visible in the runtime.
Multi-system emitter support, ability to tie multiple particle systems to the same emitter
Ability to use different materials on each particle system (material tied to particle system rather than emitter)
Ability to use spawn rate less than 1.0 (currently does not seem to work)
Ability to specify a spatial range for spawn location relative to original spawn location or emitter centre of mass:
- SpawnLocationMinX
- SpawnLocationMinY
- SpawnLocationMinZ
- SpawnLocationMaxX
- SpawnLocationMaxY
- SpawnLocationMaxZ
Ability to set min/max velocity ranges on all axes both for start and end of lifetime:
- SpawnVelocityMinX
- SpawnVelocityMinY
- SpawnVelocityMinZ
- SpawnVelocityMaxX
- SpawnVelocityMaxY
- SpawnVelocityMaxZ
- TargetVelocityMinX
- TargetVelocityMinY
- TargetVelocityMinZ
- TargetVelocityMaxX
- TargetVelocityMaxY
- TargetVelocityMaxZ
Expand the gravity option to be a general acceleration option applicable on any axis with min/max ranges:
- SpawnAccelMinX
- SpawnAccelMinY
- SpawnAccelMinZ
- SpawnAccelMaxX
- SpawnAccelMaxY
- SpawnAccelMaxZ
- TargetAccelMinX
- TargetAccelMinY
- TargetAccelMinZ
- TargetAccelMaxX
- TargetAccelMaxY
- TargetAccelMaxZ (TargetAccel possibly mutually exclusive with TargetVelocity)
Three-point alpha/colour interpolation over lifetime:
- AlphaStart
- AlphaMid
- AlphaEnd
- ColorStartR/G/B
- ColorMidR/G/B
- ColorEndR/G/B
Velocity-based colour and alpha blending:
- VelBlendMin
- VelBlendMax
- VelBlendColorScale
- VelBlendAlphaScale
Ability to set a kill distance from emitter/spawn location:
- KillDistX
- KillDistY
- KillDistZ
Ability to texture a mesh with different RGB values which can be used as an emitter to drive various spawn parameters such as size, velocity, acceleration, with R/G/B channels mapping to parameter min/max ranges
Thanks to @RuneStorm and @BinqAdams for all the suggestions! In future, will you please file separate tickets for each requested feature? We know it's convenient to put them all in one form, but it really helps us track features if they're filed discretely. :)
In the meantime, we've filed some tickets for these features - note some may have been combined for similarity of features: REMIX-4688 - Particle Flipbook animation type REMIX-4689 - Alpha fade duration for the particles REMIX-4690 - Particle attraction force REMIX-4691 - Particle collision behavior REMIX-4692 - Particle burst rate REMIX-4693 - Particle drag or air resistance REMIX-4694 - Mesh emitter REMIX-4695 - Particle size REMIX-4696 - Restrict particle axis REMIX-4697 - Particle Motion Trail stretch type REMIX-4698 - Flip particle orientation REMIX-4699 - Particle initial rotation REMIX-4700 - Pick Random SubUV from Atlas REMIX-4701 - Multi-system emitter support REMIX-4702 - Particle spawn rate lower than 1.0 REMIX-4703 - Particle system min/max ranges REMIX-4704 - Particle general acceleration option REMIX-4705 - Particle color/alpha changes REMIX-4706 - Kill distance from particle emitter REMIX-4707 - Different RGB values for particle emitter