diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.cpp b/editor/plugins/cpu_particles_2d_editor_plugin.cpp index ef00af592f3a..7be0d6c17261 100644 --- a/editor/plugins/cpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/cpu_particles_2d_editor_plugin.cpp @@ -217,11 +217,16 @@ void CPUParticles2DEditorPlugin::_generate_emission_mask() { } { + Vector2 offset; + if (emission_mask_centered->is_pressed()) { + offset = Vector2(-s.width * 0.5, -s.height * 0.5); + } + PackedVector2Array points; points.resize(valid_positions.size()); Vector2 *pointsw = points.ptrw(); for (int i = 0; i < valid_positions.size(); i += 1) { - pointsw[i] = valid_positions[i]; + pointsw[i] = valid_positions[i] + offset; } particles->set_emission_points(points); } @@ -281,9 +286,14 @@ CPUParticles2DEditorPlugin::CPUParticles2DEditorPlugin() { emission_mask_mode->add_item(TTR("Solid Pixels"), EMISSION_MODE_SOLID); emission_mask_mode->add_item(TTR("Border Pixels"), EMISSION_MODE_BORDER); emission_mask_mode->add_item(TTR("Directed Border Pixels"), EMISSION_MODE_BORDER_DIRECTED); + VBoxContainer *optionsvb = memnew(VBoxContainer); + emvb->add_margin_child(TTR("Options"), optionsvb); + emission_mask_centered = memnew(CheckBox); + emission_mask_centered->set_text(TTR("Centered")); + optionsvb->add_child(emission_mask_centered); emission_colors = memnew(CheckBox); - emission_colors->set_text(TTR("Capture from Pixel")); - emvb->add_margin_child(TTR("Emission Colors"), emission_colors); + emission_colors->set_text(TTR("Capture Colors from Pixel")); + optionsvb->add_child(emission_colors); toolbar->add_child(emission_mask); diff --git a/editor/plugins/cpu_particles_2d_editor_plugin.h b/editor/plugins/cpu_particles_2d_editor_plugin.h index cab9fca4d637..ff8e1712084a 100644 --- a/editor/plugins/cpu_particles_2d_editor_plugin.h +++ b/editor/plugins/cpu_particles_2d_editor_plugin.h @@ -69,6 +69,7 @@ class CPUParticles2DEditorPlugin : public EditorPlugin { ConfirmationDialog *emission_mask = nullptr; OptionButton *emission_mask_mode = nullptr; + CheckBox *emission_mask_centered = nullptr; CheckBox *emission_colors = nullptr; String source_emission_file; diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.cpp b/editor/plugins/gpu_particles_2d_editor_plugin.cpp index 8631ee05c82a..da648bd1ae6a 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.cpp +++ b/editor/plugins/gpu_particles_2d_editor_plugin.cpp @@ -292,11 +292,16 @@ void GPUParticles2DEditorPlugin::_generate_emission_mask() { texdata.resize(w * h * 2 * sizeof(float)); { + Vector2 offset; + if (emission_mask_centered->is_pressed()) { + offset = Vector2(-s.width * 0.5, -s.height * 0.5); + } + uint8_t *tw = texdata.ptrw(); float *twf = reinterpret_cast(tw); for (int i = 0; i < vpc; i++) { - twf[i * 2 + 0] = valid_positions[i].x; - twf[i * 2 + 1] = valid_positions[i].y; + twf[i * 2 + 0] = valid_positions[i].x + offset.x; + twf[i * 2 + 1] = valid_positions[i].y + offset.y; } } @@ -417,9 +422,14 @@ GPUParticles2DEditorPlugin::GPUParticles2DEditorPlugin() { emission_mask_mode->add_item(TTR("Solid Pixels"), EMISSION_MODE_SOLID); emission_mask_mode->add_item(TTR("Border Pixels"), EMISSION_MODE_BORDER); emission_mask_mode->add_item(TTR("Directed Border Pixels"), EMISSION_MODE_BORDER_DIRECTED); + VBoxContainer *optionsvb = memnew(VBoxContainer); + emvb->add_margin_child(TTR("Options"), optionsvb); + emission_mask_centered = memnew(CheckBox); + emission_mask_centered->set_text(TTR("Centered")); + optionsvb->add_child(emission_mask_centered); emission_colors = memnew(CheckBox); - emission_colors->set_text(TTR("Capture from Pixel")); - emvb->add_margin_child(TTR("Emission Colors"), emission_colors); + emission_colors->set_text(TTR("Capture Colors from Pixel")); + optionsvb->add_child(emission_colors); toolbar->add_child(emission_mask); diff --git a/editor/plugins/gpu_particles_2d_editor_plugin.h b/editor/plugins/gpu_particles_2d_editor_plugin.h index aa6d166d85e6..237a005ab7ef 100644 --- a/editor/plugins/gpu_particles_2d_editor_plugin.h +++ b/editor/plugins/gpu_particles_2d_editor_plugin.h @@ -75,6 +75,7 @@ class GPUParticles2DEditorPlugin : public EditorPlugin { ConfirmationDialog *emission_mask = nullptr; OptionButton *emission_mask_mode = nullptr; + CheckBox *emission_mask_centered = nullptr; CheckBox *emission_colors = nullptr; String source_emission_file;