Skip to content
Draft
Show file tree
Hide file tree
Changes from all 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
24 changes: 24 additions & 0 deletions drivers/gles3/storage/particles_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,30 @@ 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_flags(RID p_particles, uint32_t p_flags) {
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
3 changes: 3 additions & 0 deletions drivers/gles3/storage/particles_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,9 @@ 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_transform_align_flags(RID p_particles, uint32_t p_flags) 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
55 changes: 53 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,40 @@ 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;
}

uint32_t GPUParticles3D::compute_align_flags() const {
return uint32_t(transform_align_use_velocity) & uint32_t(1);
}

void GPUParticles3D::set_transform_align_use_velocity(bool p_align_to_velocity){
transform_align_use_velocity = p_align_to_velocity;
RS::get_singleton()->particles_set_transform_align_flags(particles, compute_align_flags());

}

bool GPUParticles3D::get_transform_align_use_velocity() const{
return transform_align_use_velocity;
}

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 +841,16 @@ 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("set_transform_align_use_velocity", "align_use_velocity"), &GPUParticles3D::set_transform_align_use_velocity);
ClassDB::bind_method(D_METHOD("get_transform_align_use_velocity"), &GPUParticles3D::get_transform_align_use_velocity);


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 +885,11 @@ 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, Local Billboard"), "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_PROPERTY(PropertyInfo(Variant::BOOL, "transform_align_use_velocity"), "set_transform_align_use_velocity", "get_transform_align_use_velocity");

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 +948,9 @@ 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_transform_align_rotation_axis(RS::ParticlesAlignRotationAxis::PARTICLES_ALIGN_AXIS_Y);
set_transform_align_use_velocity(true);
set_use_fixed_seed(false);
}

Expand Down
14 changes: 14 additions & 0 deletions scene/3d/gpu_particles_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ 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;
bool transform_align_use_velocity = true;

Ref<Material> process_material;

Expand Down Expand Up @@ -181,6 +184,17 @@ 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 set_transform_align_use_velocity(bool p_align_to_velocity);
bool get_transform_align_use_velocity() const;

uint32_t compute_align_flags() const;

void restart(bool p_keep_seed = false);

void set_use_fixed_seed(bool p_use_fixed_seed);
Expand Down
3 changes: 3 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,9 @@ 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_transform_align_flags(RID p_particles, uint32_t p_flags) 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
Loading
Loading