Skip to content

Commit 37305e4

Browse files
committed
Merge pull request #95711 from TokageItLab/warn-oneshot-prop
Add hint for oneshot property & warning when it will be updated continuously by Force Continuous in `AnimationMixer`
2 parents dcb59f0 + 761a20f commit 37305e4

File tree

11 files changed

+37
-8
lines changed

11 files changed

+37
-8
lines changed

core/core_constants.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,7 @@ void register_global_constants() {
678678
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_HIDE_QUATERNION_EDIT);
679679
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_PASSWORD);
680680
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_TOOL_BUTTON);
681+
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_ONESHOT);
681682
BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_MAX);
682683

683684
BIND_CORE_BITFIELD_FLAG(PROPERTY_USAGE_NONE);

core/object/object.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ enum PropertyHint {
8888
PROPERTY_HINT_LAYERS_AVOIDANCE,
8989
PROPERTY_HINT_DICTIONARY_TYPE,
9090
PROPERTY_HINT_TOOL_BUTTON,
91+
PROPERTY_HINT_ONESHOT, ///< the property will be changed by self after setting, such as AudioStreamPlayer.playing, Particles.emitting.
9192
PROPERTY_HINT_MAX,
9293
};
9394

doc/classes/@GlobalScope.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2941,7 +2941,10 @@
29412941
[/codeblock]
29422942
[b]Note:[/b] A [Callable] cannot be properly serialized and stored in a file, so it is recommended to use [constant PROPERTY_USAGE_EDITOR] instead of [constant PROPERTY_USAGE_DEFAULT].
29432943
</constant>
2944-
<constant name="PROPERTY_HINT_MAX" value="40" enum="PropertyHint">
2944+
<constant name="PROPERTY_HINT_ONESHOT" value="40" enum="PropertyHint">
2945+
Hints that a property will be changed on its own after setting, such as [member AudioStreamPlayer.playing] or [member GPUParticles3D.emitting].
2946+
</constant>
2947+
<constant name="PROPERTY_HINT_MAX" value="41" enum="PropertyHint">
29452948
Represents the size of the [enum PropertyHint] enum.
29462949
</constant>
29472950
<constant name="PROPERTY_USAGE_NONE" value="0" enum="PropertyUsageFlags" is_bitfield="true">

scene/2d/audio_stream_player_2d.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ void AudioStreamPlayer2D::_bind_methods() {
410410
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"), "set_stream", "get_stream");
411411
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volume_db", PROPERTY_HINT_RANGE, "-80,24,suffix:dB"), "set_volume_db", "get_volume_db");
412412
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "pitch_scale", PROPERTY_HINT_RANGE, "0.01,4,0.01,or_greater"), "set_pitch_scale", "get_pitch_scale");
413-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_playing", "is_playing");
413+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing", PROPERTY_HINT_ONESHOT, "", PROPERTY_USAGE_EDITOR), "set_playing", "is_playing");
414414
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "is_autoplay_enabled");
415415
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "stream_paused", PROPERTY_HINT_NONE, ""), "set_stream_paused", "get_stream_paused");
416416
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_distance", PROPERTY_HINT_RANGE, "1,4096,1,or_greater,exp,suffix:px"), "set_max_distance", "get_max_distance");

scene/2d/cpu_particles_2d.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,10 @@ bool CPUParticles2D::get_split_scale() {
506506
}
507507

508508
void CPUParticles2D::_validate_property(PropertyInfo &p_property) const {
509+
if (p_property.name == "emitting") {
510+
p_property.hint = one_shot ? PROPERTY_HINT_ONESHOT : PROPERTY_HINT_NONE;
511+
}
512+
509513
if (p_property.name == "emission_sphere_radius" && (emission_shape != EMISSION_SHAPE_SPHERE && emission_shape != EMISSION_SHAPE_SPHERE_SURFACE)) {
510514
p_property.usage = PROPERTY_USAGE_NONE;
511515
}
@@ -1285,7 +1289,7 @@ void CPUParticles2D::_bind_methods() {
12851289

12861290
ClassDB::bind_method(D_METHOD("restart"), &CPUParticles2D::restart);
12871291

1288-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting"), "set_emitting", "is_emitting");
1292+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting", PROPERTY_HINT_ONESHOT), "set_emitting", "is_emitting");
12891293
ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,1000000,1,exp"), "set_amount", "get_amount");
12901294
ADD_GROUP("Time", "");
12911295
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "lifetime", PROPERTY_HINT_RANGE, "0.01,600.0,0.01,or_greater,exp,suffix:s"), "set_lifetime", "get_lifetime");

scene/2d/gpu_particles_2d.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,9 @@ Ref<Texture2D> GPUParticles2D::get_texture() const {
384384
}
385385

386386
void GPUParticles2D::_validate_property(PropertyInfo &p_property) const {
387+
if (p_property.name == "emitting") {
388+
p_property.hint = one_shot ? PROPERTY_HINT_ONESHOT : PROPERTY_HINT_NONE;
389+
}
387390
}
388391

389392
void GPUParticles2D::emit_particle(const Transform2D &p_transform2d, const Vector2 &p_velocity2d, const Color &p_color, const Color &p_custom, uint32_t p_emit_flags) {
@@ -818,7 +821,7 @@ void GPUParticles2D::_bind_methods() {
818821

819822
ADD_SIGNAL(MethodInfo("finished"));
820823

821-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting"), "set_emitting", "is_emitting");
824+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting", PROPERTY_HINT_ONESHOT), "set_emitting", "is_emitting");
822825
ADD_PROPERTY_DEFAULT("emitting", true); // Workaround for doctool in headless mode, as dummy rasterizer always returns false.
823826
ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,1000000,1,exp"), "set_amount", "get_amount");
824827
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "amount_ratio", PROPERTY_HINT_RANGE, "0,1,0.0001"), "set_amount_ratio", "get_amount_ratio");

scene/3d/audio_stream_player_3d.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -834,7 +834,7 @@ void AudioStreamPlayer3D::_bind_methods() {
834834
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "unit_size", PROPERTY_HINT_RANGE, "0.1,100,0.01,or_greater"), "set_unit_size", "get_unit_size");
835835
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_db", PROPERTY_HINT_RANGE, "-24,6,suffix:dB"), "set_max_db", "get_max_db");
836836
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "pitch_scale", PROPERTY_HINT_RANGE, "0.01,4,0.01,or_greater"), "set_pitch_scale", "get_pitch_scale");
837-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_playing", "is_playing");
837+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing", PROPERTY_HINT_ONESHOT, "", PROPERTY_USAGE_EDITOR), "set_playing", "is_playing");
838838
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "is_autoplay_enabled");
839839
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "stream_paused", PROPERTY_HINT_NONE, ""), "set_stream_paused", "get_stream_paused");
840840
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "max_distance", PROPERTY_HINT_RANGE, "0,4096,0.01,or_greater,suffix:m"), "set_max_distance", "get_max_distance");

scene/3d/cpu_particles_3d.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,10 @@ AABB CPUParticles3D::capture_aabb() const {
543543
}
544544

545545
void CPUParticles3D::_validate_property(PropertyInfo &p_property) const {
546+
if (p_property.name == "emitting") {
547+
p_property.hint = one_shot ? PROPERTY_HINT_ONESHOT : PROPERTY_HINT_NONE;
548+
}
549+
546550
if (p_property.name == "emission_sphere_radius" && (emission_shape != EMISSION_SHAPE_SPHERE && emission_shape != EMISSION_SHAPE_SPHERE_SURFACE)) {
547551
p_property.usage = PROPERTY_USAGE_NONE;
548552
}
@@ -1481,7 +1485,7 @@ void CPUParticles3D::_bind_methods() {
14811485
ClassDB::bind_method(D_METHOD("restart"), &CPUParticles3D::restart);
14821486
ClassDB::bind_method(D_METHOD("capture_aabb"), &CPUParticles3D::capture_aabb);
14831487

1484-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting"), "set_emitting", "is_emitting");
1488+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting", PROPERTY_HINT_ONESHOT), "set_emitting", "is_emitting");
14851489
ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,1000000,1,exp"), "set_amount", "get_amount");
14861490
ADD_GROUP("Time", "");
14871491
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "lifetime", PROPERTY_HINT_RANGE, "0.01,600.0,0.01,or_greater,exp,suffix:s"), "set_lifetime", "get_lifetime");

scene/3d/gpu_particles_3d.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,10 @@ AABB GPUParticles3D::capture_aabb() const {
414414
}
415415

416416
void GPUParticles3D::_validate_property(PropertyInfo &p_property) const {
417+
if (p_property.name == "emitting") {
418+
p_property.hint = one_shot ? PROPERTY_HINT_ONESHOT : PROPERTY_HINT_NONE;
419+
}
420+
417421
if (p_property.name.begins_with("draw_pass_")) {
418422
int index = p_property.name.get_slicec('_', 2).to_int() - 1;
419423
if (index >= draw_passes.size()) {
@@ -744,7 +748,7 @@ void GPUParticles3D::_bind_methods() {
744748

745749
ADD_SIGNAL(MethodInfo("finished"));
746750

747-
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting"), "set_emitting", "is_emitting");
751+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting", PROPERTY_HINT_ONESHOT), "set_emitting", "is_emitting");
748752
ADD_PROPERTY_DEFAULT("emitting", true); // Workaround for doctool in headless mode, as dummy rasterizer always returns false.
749753
ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,1000000,1,exp"), "set_amount", "get_amount");
750754
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "amount_ratio", PROPERTY_HINT_RANGE, "0,1,0.0001"), "set_amount_ratio", "get_amount_ratio");

scene/animation/animation_mixer.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,15 @@ bool AnimationMixer::_update_caches() {
748748
}
749749
}
750750

751+
if (is_value && callback_mode_discrete == ANIMATION_CALLBACK_MODE_DISCRETE_FORCE_CONTINUOUS) {
752+
if (child) {
753+
PropertyInfo prop_info;
754+
ClassDB::get_property_info(child->get_class_name(), path.get_concatenated_subnames(), &prop_info);
755+
if (prop_info.hint == PROPERTY_HINT_ONESHOT) {
756+
WARN_PRINT_ED(vformat("%s: '%s', Value Track: '%s' is oneshot property, but will be continuously updated. Consider setting a value other than ANIMATION_CALLBACK_MODE_DISCRETE_FORCE_CONTINUOUS to AnimationMixer.callback_mode_dominant.", mixer_name, String(E), String(path)));
757+
}
758+
}
759+
}
751760
} break;
752761
case Animation::TYPE_POSITION_3D:
753762
case Animation::TYPE_ROTATION_3D:

0 commit comments

Comments
 (0)