Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Customizable particle attribute layout #109

Closed
djeedai opened this issue Dec 24, 2022 · 0 comments · Fixed by #129
Closed

Customizable particle attribute layout #109

djeedai opened this issue Dec 24, 2022 · 0 comments · Fixed by #129
Labels
C - enhancement New feature or request

Comments

@djeedai
Copy link
Owner

djeedai commented Dec 24, 2022

The current particle attribute layout is hard-coded into the GpuParticle type:

bevy_hanabi/src/render/mod.rs

Lines 1117 to 1129 in 0f7494d

/// GPU representation of a single particle stored in a GPU buffer.
#[repr(C)]
#[derive(Debug, Copy, Clone, Pod, Zeroable, ShaderType)]
struct GpuParticle {
/// Particle position in effect space (local or world).
pub position: [f32; 3],
/// Current particle age in \[0:`lifetime`\].
pub age: f32,
/// Particle velocity in effect space (local or world).
pub velocity: [f32; 3],
/// Total particle lifetime.
pub lifetime: f32,
}

It contains the position and velocity of the particle, its age, and its maximum lifetime after which the particle dies.

Although this is the most common set of attributes, some effects require more per-particle attributes, like the particle size (per-particle size variation/randomness), or its color, among many examples. To unlock building such effects, the particle layout should instead be dynamically determined by the set of modifiers which define the effect. This allows enabling a wide range of new effects while keeping the per-particle data as small as possible.

The idea is to define an Attribute type representing a single attribute of a particle, with a name (e.g. "position") and a value (e.g. vec3<f32>), and compose the minimal set of attributes needed per effect into a particle layout which determines how the per-particle data is encoded in the GPU buffer of particles.

@djeedai djeedai added the C - enhancement New feature or request label Dec 24, 2022
djeedai added a commit that referenced this issue Feb 11, 2023
This change introduces a new dynamic particle layout based on _attributes_. A
particle attribute is a single scalar or vector value describing one aspect of
the particle. The value is stored per particle, and the set of attributes for
all the particles of an effect is organized into a layout describing the offset
and alignment of each attribute into the particle buffer on the GPU.

This new design allows customizing the particle storage itself based on the
modifiers used for each effect, which enables both greater customizing and a
compact memory footprint, as particles only store the attributes needed by the
effect.

To enable even greater customization, _properties_ can be attached to effects.
A property is a dynamic quantity assignable at runtime, and uploaded to the GPU
each frame, allowing to control the quantity it's bound to. Properties can be
bound to values of modifiers, like the `AccelModifer` acceleration, to enable
users to vary that field at runtime without the need to recreate the effect.
Properties trade some performance for greater control and customizing. This
generalize an implicit concept previously only available for the acceleration
of `AccelModifier` and the force field sources, and now made available to any
property-enabled field of any modifier.

Fixes #109
djeedai added a commit that referenced this issue Feb 25, 2023
Initialize the render shader variables used by modifiers with the
attributes of those modifiers if present, or with a default attribute
value otherwise.

Related to #109
djeedai added a commit that referenced this issue Feb 25, 2023
Initialize the render shader variables used by modifiers with the
attributes of those modifiers if present, or with a default attribute
value otherwise.

Related to #109
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C - enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant