Skip to content

Commit

Permalink
Merge pull request #101617 from paddy-exe/processmaterial-vs-shaderma…
Browse files Browse the repository at this point in the history
…terial

Fix `emission_shape_changed` signal error when using ShaderMaterial with GPUParticles3D
  • Loading branch information
Repiteo committed Jan 17, 2025
2 parents 97daaca + 484d6d4 commit 923eb44
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
1 change: 1 addition & 0 deletions doc/classes/ParticleProcessMaterial.xml
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,7 @@
<signal name="emission_shape_changed">
<description>
Emitted when this material's emission shape is changed in any way. This includes changes to [member emission_shape], [member emission_shape_scale], or [member emission_sphere_radius], and any other property that affects the emission shape's offset, size, scale, or orientation.
[b]Note:[/b] This signal is only emitted inside the editor for performance reasons.
</description>
</signal>
</signals>
Expand Down
17 changes: 13 additions & 4 deletions scene/3d/gpu_particles_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,23 @@ void GPUParticles3D::set_use_local_coordinates(bool p_enable) {
}

void GPUParticles3D::set_process_material(const Ref<Material> &p_material) {
#ifdef TOOLS_ENABLED
if (process_material.is_valid()) {
if (Ref<ParticleProcessMaterial>(process_material).is_valid()) {
process_material->disconnect("emission_shape_changed", callable_mp((Node3D *)this, &GPUParticles3D::update_gizmos));
}
}
#endif

process_material = p_material;
RID material_rid;
if (process_material.is_valid()) {
material_rid = process_material->get_rid();
process_material->connect("emission_shape_changed", callable_mp((Node3D *)this, &GPUParticles3D::update_gizmos));
#ifdef TOOLS_ENABLED
if (Ref<ParticleProcessMaterial>(process_material).is_valid()) {
process_material->connect("emission_shape_changed", callable_mp((Node3D *)this, &GPUParticles3D::update_gizmos));
}
#endif
}
RS::get_singleton()->particles_set_process_material(particles, material_rid);

Expand Down Expand Up @@ -554,9 +566,6 @@ void GPUParticles3D::_notification(int p_what) {

case NOTIFICATION_EXIT_TREE: {
RS::get_singleton()->particles_set_subemitter(particles, RID());

Ref<ParticleProcessMaterial> material = get_process_material();
ERR_FAIL_COND(material.is_null());
} break;

case NOTIFICATION_SUSPENDED:
Expand Down

0 comments on commit 923eb44

Please sign in to comment.