Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions drivers/gles3/storage/particles_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,22 @@ void ParticlesStorage::particles_set_transform_align(RID p_particles, RS::Partic
particles->transform_align = p_transform_align;
}

void ParticlesStorage::particles_set_transform_align_custom_src(RID p_particles, RS::ParticlesAlignCustomSrc p_custom_src) {
Particles *particles = particles_owner.get_or_null(p_particles);
ERR_FAIL_NULL(particles);

//TODO FIXME
//particles-> = p_transform_align;
}

void ParticlesStorage::particles_set_transform_align_rotation_axis(RID p_particles, RS::ParticlesAlignRotationAxis p_rotation_axis) {
Particles *particles = particles_owner.get_or_null(p_particles);
ERR_FAIL_NULL(particles);

//TODO FIXME
//particles-> = p_transform_align;
}

void ParticlesStorage::particles_set_process_material(RID p_particles, RID p_material) {
Particles *particles = particles_owner.get_or_null(p_particles);
ERR_FAIL_NULL(particles);
Expand Down
2 changes: 2 additions & 0 deletions drivers/gles3/storage/particles_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,8 @@ class ParticlesStorage : public RendererParticlesStorage {
virtual void particles_set_collision_base_size(RID p_particles, real_t p_size) override;

virtual void particles_set_transform_align(RID p_particles, RS::ParticlesTransformAlign p_transform_align) override;
virtual void particles_set_transform_align_custom_src(RID p_particles, RS::ParticlesAlignCustomSrc p_custom_src) override;
virtual void particles_set_transform_align_rotation_axis(RID p_particles, RS::ParticlesAlignRotationAxis p_rotation_axis) override;
virtual void particles_set_seed(RID p_particles, uint32_t p_seed) override;

virtual void particles_set_trails(RID p_particles, bool p_enable, double p_length) override;
Expand Down
33 changes: 31 additions & 2 deletions scene/3d/gpu_particles_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,7 @@ Ref<Skin> GPUParticles3D::get_skin() const {
}

void GPUParticles3D::set_transform_align(TransformAlign p_align) {
ERR_FAIL_INDEX(uint32_t(p_align), 4);
ERR_FAIL_INDEX(uint32_t(p_align), uint32_t(RS::ParticlesTransformAlign::PARTICLES_TRANSFORM_MAX));
transform_align = p_align;
RS::get_singleton()->particles_set_transform_align(particles, RS::ParticlesTransformAlign(transform_align));
}
Expand All @@ -636,6 +636,26 @@ GPUParticles3D::TransformAlign GPUParticles3D::get_transform_align() const {
return transform_align;
}

void GPUParticles3D::set_transform_align_custom_src(RS::ParticlesAlignCustomSrc p_align_custom_src) {
ERR_FAIL_INDEX(uint32_t(p_align_custom_src), uint32_t(RS::ParticlesAlignCustomSrc::PARTICLES_ALIGN_CUSTOM_SRC_MAX));
transform_align_custom_src = p_align_custom_src;
RS::get_singleton()->particles_set_transform_align_custom_src(particles, transform_align_custom_src);
}

RS::ParticlesAlignCustomSrc GPUParticles3D::get_transform_align_custom_src() const {
return transform_align_custom_src;
}

void GPUParticles3D::set_transform_align_rotation_axis(RS::ParticlesAlignRotationAxis p_axis) {
ERR_FAIL_INDEX(uint32_t(p_axis), uint32_t(RS::ParticlesAlignRotationAxis::PARTICLES_ALIGN_AXIS_MAX));
transform_align_rotation_axis = p_axis;
RS::get_singleton()->particles_set_transform_align_rotation_axis(particles, p_axis);
}

RS::ParticlesAlignRotationAxis GPUParticles3D::get_transform_align_rotation_axis() const {
return transform_align_rotation_axis;
}

void GPUParticles3D::convert_from_particles(Node *p_particles) {
CPUParticles3D *cpu_particles = Object::cast_to<CPUParticles3D>(p_particles);
ERR_FAIL_NULL_MSG(cpu_particles, "Only CPUParticles3D nodes can be converted to GPUParticles3D.");
Expand Down Expand Up @@ -807,6 +827,12 @@ void GPUParticles3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_transform_align", "align"), &GPUParticles3D::set_transform_align);
ClassDB::bind_method(D_METHOD("get_transform_align"), &GPUParticles3D::get_transform_align);

ClassDB::bind_method(D_METHOD("set_transform_align_custom_src", "align"), &GPUParticles3D::set_transform_align_custom_src);
ClassDB::bind_method(D_METHOD("get_transform_align_custom_src"), &GPUParticles3D::get_transform_align_custom_src);

ClassDB::bind_method(D_METHOD("set_transform_align_rotation_axis", "align"), &GPUParticles3D::set_transform_align_rotation_axis);
ClassDB::bind_method(D_METHOD("get_transform_align_rotation_axis"), &GPUParticles3D::get_transform_align_rotation_axis);

ClassDB::bind_method(D_METHOD("convert_from_particles", "particles"), &GPUParticles3D::convert_from_particles);

ClassDB::bind_method(D_METHOD("set_amount_ratio", "ratio"), &GPUParticles3D::set_amount_ratio);
Expand Down Expand Up @@ -841,7 +867,9 @@ void GPUParticles3D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::AABB, "visibility_aabb", PROPERTY_HINT_NONE, "suffix:m"), "set_visibility_aabb", "get_visibility_aabb");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "local_coords"), "set_use_local_coordinates", "get_use_local_coordinates");
ADD_PROPERTY(PropertyInfo(Variant::INT, "draw_order", PROPERTY_HINT_ENUM, "Index,Lifetime,Reverse Lifetime,View Depth"), "set_draw_order", "get_draw_order");
ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_align", PROPERTY_HINT_ENUM, "Disabled,Z-Billboard,Y to Velocity,Z-Billboard + Y to Velocity"), "set_transform_align", "get_transform_align");
ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_align", PROPERTY_HINT_ENUM, "Disabled,Z-Billboard,Y to Velocity,Z-Billboard + Y to Velocity,Rotate around Axis"), "set_transform_align", "get_transform_align");
ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_align_custom_src", PROPERTY_HINT_ENUM, "Disabled, X, Y, Z, W"), "set_transform_align_custom_src", "get_transform_align_custom_src");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_align_custom_src", PROPERTY_HINT_ENUM, "Disabled, X, Y, Z, W"), "set_transform_align_custom_src", "get_transform_align_custom_src");
ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_align_custom_src", PROPERTY_HINT_ENUM, "Disabled,X,Y,Z,W"), "set_transform_align_custom_src", "get_transform_align_custom_src");

ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_align_rotation_axis", PROPERTY_HINT_ENUM, "X, Y, Z"), "set_transform_align_rotation_axis", "get_transform_align_rotation_axis");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_align_rotation_axis", PROPERTY_HINT_ENUM, "X, Y, Z"), "set_transform_align_rotation_axis", "get_transform_align_rotation_axis");
ADD_PROPERTY(PropertyInfo(Variant::INT, "transform_align_rotation_axis", PROPERTY_HINT_ENUM, "X,Y,Z"), "set_transform_align_rotation_axis", "get_transform_align_rotation_axis");

ADD_GROUP("Trails", "trail_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "trail_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_trail_enabled", "is_trail_enabled");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "trail_lifetime", PROPERTY_HINT_RANGE, "0.01,10,0.01,or_greater,suffix:s"), "set_trail_lifetime", "get_trail_lifetime");
Expand Down Expand Up @@ -900,6 +928,7 @@ GPUParticles3D::GPUParticles3D() {
set_speed_scale(1);
set_collision_base_size(collision_base_size);
set_transform_align(TRANSFORM_ALIGN_DISABLED);
set_transform_align_custom_src(RS::ParticlesAlignCustomSrc::PARTICLES_ALIGN_CUSTOM_SRC_X);
set_use_fixed_seed(false);
}

Expand Down
8 changes: 8 additions & 0 deletions scene/3d/gpu_particles_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ class GPUParticles3D : public GeometryInstance3D {
double trail_lifetime = 0.3;

TransformAlign transform_align = TRANSFORM_ALIGN_DISABLED;
RS::ParticlesAlignCustomSrc transform_align_custom_src = RS::ParticlesAlignCustomSrc::PARTICLES_ALIGN_CUSTOM_SRC_X;
RS::ParticlesAlignRotationAxis transform_align_rotation_axis = RS::ParticlesAlignRotationAxis::PARTICLES_ALIGN_AXIS_Y;

Ref<Material> process_material;

Expand Down Expand Up @@ -181,6 +183,12 @@ class GPUParticles3D : public GeometryInstance3D {
void set_transform_align(TransformAlign p_align);
TransformAlign get_transform_align() const;

void set_transform_align_custom_src(RS::ParticlesAlignCustomSrc p_align_custom_src);
RS::ParticlesAlignCustomSrc get_transform_align_custom_src() const;

void set_transform_align_rotation_axis(RS::ParticlesAlignRotationAxis p_axis);
RS::ParticlesAlignRotationAxis get_transform_align_rotation_axis() const;

void restart(bool p_keep_seed = false);

void set_use_fixed_seed(bool p_use_fixed_seed);
Expand Down
2 changes: 2 additions & 0 deletions servers/rendering/dummy/storage/particles_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ class ParticlesStorage : public RendererParticlesStorage {
virtual void particles_set_collision_base_size(RID p_particles, real_t p_size) override {}

virtual void particles_set_transform_align(RID p_particles, RS::ParticlesTransformAlign p_transform_align) override {}
virtual void particles_set_transform_align_custom_src(RID p_particles, RS::ParticlesAlignCustomSrc p_transform_align_custom_src) override {}
virtual void particles_set_transform_align_rotation_axis(RID p_particles, RS::ParticlesAlignRotationAxis p_rotation_axis) override {}

virtual void particles_set_trails(RID p_particles, bool p_enable, double p_length) override {}
virtual void particles_set_trail_bind_poses(RID p_particles, const Vector<Transform3D> &p_bind_poses) override {}
Expand Down
83 changes: 73 additions & 10 deletions servers/rendering/renderer_rd/shaders/particles_copy.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,30 @@ layout(push_constant, std430) uniform Params {
uint motion_vectors_current_offset;
uint flags;

mat4 inv_emission_transform;
float inv_emission_transform[12];

uint custom_src;
uint subtype;
uint pad1;
uint pad2;
}
params;

#define TRANSFORM_ALIGN_DISABLED 0
#define TRANSFORM_ALIGN_Z_BILLBOARD 1
#define TRANSFORM_ALIGN_Y_TO_VELOCITY 2
#define TRANSFORM_ALIGN_Z_BILLBOARD_Y_TO_VELOCITY 3
#define ALIGN_DISABLED 0
#define ALIGN_BILLBOARD 1
#define ALIGN_Y_TO_VELOCITY 2
#define ALIGN_Z_BILLBOARD_Y_TO_VELOCITY 3
#define ALIGN_ROTATE_AXIS 4

#define CUSTOM_SRC_NONE 0
#define CUSTOM_SRC_X 1
#define CUSTOM_SRC_Y 2
#define CUSTOM_SRC_Z 3
#define CUSTOM_SRC_W 4

#define ROTATION_SUBTYPE_ROTATE_X 0
#define ROTATION_SUBTYPE_ROTATE_Y 1
#define ROTATION_SUBTYPE_ROTATE_Z 2

void main() {
#ifdef MODE_FILL_SORT_BUFFER
Expand Down Expand Up @@ -155,17 +171,59 @@ void main() {
}

switch (params.align_mode) {
case TRANSFORM_ALIGN_DISABLED: {
case ALIGN_DISABLED: {
} break; //nothing
case TRANSFORM_ALIGN_Z_BILLBOARD: {
case ALIGN_BILLBOARD: {
mat3 local = mat3(normalize(cross(params.align_up, params.sort_direction)), params.align_up, params.sort_direction);
local = local * mat3(txform);
txform[0].xyz = local[0];
txform[1].xyz = local[1];
txform[2].xyz = local[2];

} break;
case TRANSFORM_ALIGN_Y_TO_VELOCITY: {
case ALIGN_ROTATE_AXIS: {
vec3 axis = vec3(1.0, 0.0, 0.0);
switch (params.subtype) {
case ROTATION_SUBTYPE_ROTATE_X: {
axis = vec3(1.0, 0.0, 0.0);
} break;
case ROTATION_SUBTYPE_ROTATE_Y: {
axis = vec3(0.0, 1.0, 0.0);
} break;
case ROTATION_SUBTYPE_ROTATE_Z: {
axis = vec3(0.0, 0.0, 1.0);
} break;
}
float angle = 0.;
switch (params.custom_src) {
case CUSTOM_SRC_X: {
angle = particles.data[particle].custom.x;
} break;
case CUSTOM_SRC_Y: {
angle = particles.data[particle].custom.y;
} break;
case CUSTOM_SRC_Z: {
angle = particles.data[particle].custom.z;
} break;
case CUSTOM_SRC_W: {
angle = particles.data[particle].custom.w;
} break;
}
axis = normalize(axis);
float s = sin(angle);
float c = cos(angle);
float oc = 1.0 - c;
mat3 rotated = mat3(
oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s,
oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s,
oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c);
rotated = transpose(rotated);
rotated = mat3(txform) * rotated;
vec4 origin = txform[3];
txform = mat4(rotated);
txform[3] = origin;
} break;
case ALIGN_Y_TO_VELOCITY: {
vec3 v = particles.data[particle].velocity;
float s = (length(txform[0]) + length(txform[1]) + length(txform[2])) / 3.0;
if (length(v) > 0.0) {
Expand All @@ -179,7 +237,7 @@ void main() {
txform[0].xyz *= s;
txform[1].xyz *= s;
} break;
case TRANSFORM_ALIGN_Z_BILLBOARD_Y_TO_VELOCITY: {
case ALIGN_Z_BILLBOARD_Y_TO_VELOCITY: {
vec3 v = particles.data[particle].velocity;
vec3 sv = v - params.sort_direction * dot(params.sort_direction, v); //screen velocity

Expand All @@ -206,7 +264,12 @@ void main() {
if (bool(params.flags & PARAMS_FLAG_COPY_MODE_2D)) {
// In global mode, bring 2D particles to local coordinates
// as they will be drawn with the node position as origin.
txform = params.inv_emission_transform * txform;
mat4 inv_emission_transform;
inv_emission_transform[0] = vec4(params.inv_emission_transform[0], params.inv_emission_transform[1], params.inv_emission_transform[2], 0.0);
inv_emission_transform[1] = vec4(params.inv_emission_transform[3], params.inv_emission_transform[4], params.inv_emission_transform[5], 0.0);
inv_emission_transform[2] = vec4(params.inv_emission_transform[6], params.inv_emission_transform[7], params.inv_emission_transform[8], 0.0);
inv_emission_transform[3] = vec4(params.inv_emission_transform[9], params.inv_emission_transform[10], params.inv_emission_transform[11], 1.0);
txform = inv_emission_transform * txform;
}
} else {
// Set scale to zero and translate to -INF so particle will be invisible
Expand Down
32 changes: 31 additions & 1 deletion servers/rendering/renderer_rd/storage_rd/particles_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,20 @@ void ParticlesStorage::particles_set_transform_align(RID p_particles, RS::Partic
particles->transform_align = p_transform_align;
}

void ParticlesStorage::particles_set_transform_align_custom_src(RID p_particles, RS::ParticlesAlignCustomSrc p_transform_align_custom_src) {
Particles *particles = particles_owner.get_or_null(p_particles);
ERR_FAIL_NULL(particles);

particles->transform_align_src = p_transform_align_custom_src;
}

void ParticlesStorage::particles_set_transform_align_rotation_axis(RID p_particles, RS::ParticlesAlignRotationAxis p_rotation_axis) {
Particles *particles = particles_owner.get_or_null(p_particles);
ERR_FAIL_NULL(particles);

particles->rotation_axis = p_rotation_axis;
}

void ParticlesStorage::particles_set_process_material(RID p_particles, RID p_material) {
Particles *particles = particles_owner.get_or_null(p_particles);
ERR_FAIL_NULL(particles);
Expand Down Expand Up @@ -1295,6 +1309,8 @@ void ParticlesStorage::particles_set_view_axis(RID p_particles, const Vector3 &p
copy_push_constant.align_up[2] = p_up_axis.z;

copy_push_constant.align_mode = particles->transform_align;
copy_push_constant.transform_align_src = particles->transform_align_src;
copy_push_constant.subtype = uint32_t(particles->rotation_axis);

if (do_sort) {
RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin();
Expand Down Expand Up @@ -1619,7 +1635,19 @@ void ParticlesStorage::update_particles() {
// So, we need to pass the inverse of the emission transform to bring the
// particles to local coordinates before drawing.
Transform3D inv = particles->emission_transform.affine_inverse();
RendererRD::MaterialStorage::store_transform(inv, copy_push_constant.inv_emission_transform);
//RendererRD::MaterialStorage::store_transform(inv, copy_push_constant.inv_emission_transform);
copy_push_constant.inv_emission_transform[0] = inv.basis.rows[0][0];
copy_push_constant.inv_emission_transform[1] = inv.basis.rows[1][0];
copy_push_constant.inv_emission_transform[2] = inv.basis.rows[2][0];
copy_push_constant.inv_emission_transform[3] = inv.basis.rows[0][1];
copy_push_constant.inv_emission_transform[4] = inv.basis.rows[1][1];
copy_push_constant.inv_emission_transform[5] = inv.basis.rows[2][1];
copy_push_constant.inv_emission_transform[6] = inv.basis.rows[0][2];
copy_push_constant.inv_emission_transform[7] = inv.basis.rows[1][2];
copy_push_constant.inv_emission_transform[8] = inv.basis.rows[2][2];
copy_push_constant.inv_emission_transform[9] = inv.origin.x;
copy_push_constant.inv_emission_transform[10] = inv.origin.y;
copy_push_constant.inv_emission_transform[11] = inv.origin.z;
}

copy_push_constant.total_particles = total_amount;
Expand All @@ -1628,6 +1656,8 @@ void ParticlesStorage::update_particles() {
copy_push_constant.align_up[0] = 0;
copy_push_constant.align_up[1] = 0;
copy_push_constant.align_up[2] = 0;
copy_push_constant.transform_align_src = particles->transform_align_src;
copy_push_constant.subtype = uint32_t(particles->rotation_axis);

if (particles->trails_enabled && particles->trail_bind_poses.size() > 1) {
copy_push_constant.trail_size = particles->trail_bind_poses.size();
Expand Down
10 changes: 9 additions & 1 deletion servers/rendering/renderer_rd/storage_rd/particles_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,8 @@ class ParticlesStorage : public RendererParticlesStorage {
RID process_material;
uint32_t frame_counter = 0;
RS::ParticlesTransformAlign transform_align = RS::PARTICLES_TRANSFORM_ALIGN_DISABLED;
RS::ParticlesAlignCustomSrc transform_align_src = RS::PARTICLES_ALIGN_CUSTOM_SRC_X;
RS::ParticlesAlignRotationAxis rotation_axis = RS::ParticlesAlignRotationAxis::PARTICLES_ALIGN_AXIS_Y;

RS::ParticlesDrawOrder draw_order = RS::PARTICLES_DRAW_ORDER_INDEX;

Expand Down Expand Up @@ -315,7 +317,11 @@ class ParticlesStorage : public RendererParticlesStorage {
uint32_t copy_mode_2d : 1;
};

float inv_emission_transform[16];
float inv_emission_transform[12];
uint32_t transform_align_src;
uint32_t subtype;
uint32_t pad1;
uint32_t pad2;
};

enum {
Expand Down Expand Up @@ -459,6 +465,8 @@ class ParticlesStorage : public RendererParticlesStorage {
virtual void particles_set_fractional_delta(RID p_particles, bool p_enable) override;
virtual void particles_set_collision_base_size(RID p_particles, real_t p_size) override;
virtual void particles_set_transform_align(RID p_particles, RS::ParticlesTransformAlign p_transform_align) override;
virtual void particles_set_transform_align_custom_src(RID p_particles, RS::ParticlesAlignCustomSrc p_transform_align_custom_src) override;
virtual void particles_set_transform_align_rotation_axis(RID p_particles, RS::ParticlesAlignRotationAxis p_rotation_axis) override;
virtual void particles_set_seed(RID p_particles, uint32_t p_seed) override;

virtual void particles_set_trails(RID p_particles, bool p_enable, double p_length) override;
Expand Down
9 changes: 9 additions & 0 deletions servers/rendering/rendering_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2773,6 +2773,8 @@ void RenderingServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("particles_set_fractional_delta", "particles", "enable"), &RenderingServer::particles_set_fractional_delta);
ClassDB::bind_method(D_METHOD("particles_set_collision_base_size", "particles", "size"), &RenderingServer::particles_set_collision_base_size);
ClassDB::bind_method(D_METHOD("particles_set_transform_align", "particles", "align"), &RenderingServer::particles_set_transform_align);
ClassDB::bind_method(D_METHOD("particles_set_transform_align_custom_src", "particles", "custom_src"), &RenderingServer::particles_set_transform_align_custom_src);
ClassDB::bind_method(D_METHOD("particles_set_transform_align_rotation_axis", "particles", "p_rotation_axis"), &RenderingServer::particles_set_transform_align_rotation_axis);
ClassDB::bind_method(D_METHOD("particles_set_trails", "particles", "enable", "length_sec"), &RenderingServer::particles_set_trails);
ClassDB::bind_method(D_METHOD("particles_set_trail_bind_poses", "particles", "bind_poses"), &RenderingServer::_particles_set_trail_bind_poses);

Expand All @@ -2796,6 +2798,13 @@ void RenderingServer::_bind_methods() {
BIND_ENUM_CONSTANT(PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD);
BIND_ENUM_CONSTANT(PARTICLES_TRANSFORM_ALIGN_Y_TO_VELOCITY);
BIND_ENUM_CONSTANT(PARTICLES_TRANSFORM_ALIGN_Z_BILLBOARD_Y_TO_VELOCITY);
BIND_ENUM_CONSTANT(PARTICLES_TRANSFORM_ALIGN_STRETCH);
BIND_ENUM_CONSTANT(PARTICLES_TRANSFORM_ALIGN_ROTATION);

BIND_ENUM_CONSTANT(PARTICLES_ALIGN_CUSTOM_SRC_DISABLED);
BIND_ENUM_CONSTANT(PARTICLES_ALIGN_CUSTOM_SRC_X);
BIND_ENUM_CONSTANT(PARTICLES_ALIGN_CUSTOM_SRC_Y);
BIND_ENUM_CONSTANT(PARTICLES_ALIGN_CUSTOM_SRC_W);

BIND_CONSTANT(PARTICLES_EMIT_FLAG_POSITION);
BIND_CONSTANT(PARTICLES_EMIT_FLAG_ROTATION_SCALE);
Expand Down
Loading
Loading