@@ -47,6 +47,8 @@ bool AimModifier3D::_set(const StringName &p_path, const Variant &p_value) {
4747 set_primary_rotation_axis (which, static_cast <Vector3::Axis>((int )p_value));
4848 } else if (what == " use_secondary_rotation" ) {
4949 set_use_secondary_rotation (which, p_value);
50+ } else if (what == " relative" ) {
51+ set_relative (which, p_value);
5052 } else {
5153 return false ;
5254 }
@@ -70,6 +72,8 @@ bool AimModifier3D::_get(const StringName &p_path, Variant &r_ret) const {
7072 r_ret = (int )get_primary_rotation_axis (which);
7173 } else if (what == " use_secondary_rotation" ) {
7274 r_ret = is_using_secondary_rotation (which);
75+ } else if (what == " relative" ) {
76+ r_ret = is_relative (which);
7377 } else {
7478 return false ;
7579 }
@@ -88,6 +92,7 @@ void AimModifier3D::_get_property_list(List<PropertyInfo> *p_list) const {
8892 p_list->push_back (PropertyInfo (Variant::BOOL, path + " use_euler" ));
8993 p_list->push_back (PropertyInfo (Variant::INT, path + " primary_rotation_axis" , PROPERTY_HINT_ENUM, " X,Y,Z" , rotation_usage));
9094 p_list->push_back (PropertyInfo (Variant::BOOL, path + " use_secondary_rotation" , PROPERTY_HINT_NONE, " " , rotation_usage));
95+ p_list->push_back (PropertyInfo (Variant::BOOL, path + " relative" ));
9196 }
9297}
9398
@@ -158,6 +163,18 @@ bool AimModifier3D::is_using_secondary_rotation(int p_index) const {
158163 return setting->use_secondary_rotation ;
159164}
160165
166+ void AimModifier3D::set_relative (int p_index, bool p_enabled) {
167+ ERR_FAIL_INDEX (p_index, settings.size ());
168+ AimModifier3DSetting *setting = static_cast <AimModifier3DSetting *>(settings[p_index]);
169+ setting->relative = p_enabled;
170+ }
171+
172+ bool AimModifier3D::is_relative (int p_index) const {
173+ ERR_FAIL_INDEX_V (p_index, settings.size (), 0 );
174+ AimModifier3DSetting *setting = static_cast <AimModifier3DSetting *>(settings[p_index]);
175+ return setting->relative ;
176+ }
177+
161178void AimModifier3D::_bind_methods () {
162179 ClassDB::bind_method (D_METHOD (" set_forward_axis" , " index" , " axis" ), &AimModifier3D::set_forward_axis);
163180 ClassDB::bind_method (D_METHOD (" get_forward_axis" , " index" ), &AimModifier3D::get_forward_axis);
@@ -167,6 +184,8 @@ void AimModifier3D::_bind_methods() {
167184 ClassDB::bind_method (D_METHOD (" get_primary_rotation_axis" , " index" ), &AimModifier3D::get_primary_rotation_axis);
168185 ClassDB::bind_method (D_METHOD (" set_use_secondary_rotation" , " index" , " enabled" ), &AimModifier3D::set_use_secondary_rotation);
169186 ClassDB::bind_method (D_METHOD (" is_using_secondary_rotation" , " index" ), &AimModifier3D::is_using_secondary_rotation);
187+ ClassDB::bind_method (D_METHOD (" set_relative" , " index" , " enabled" ), &AimModifier3D::set_relative);
188+ ClassDB::bind_method (D_METHOD (" is_relative" , " index" ), &AimModifier3D::is_relative);
170189
171190 ADD_ARRAY_COUNT (" Settings" , " setting_count" , " set_setting_count" , " get_setting_count" , " settings/" );
172191}
@@ -193,7 +212,7 @@ void AimModifier3D::_process_aim(int p_index, Skeleton3D *p_skeleton, int p_appl
193212 AimModifier3DSetting *setting = static_cast <AimModifier3DSetting *>(settings[p_index]);
194213
195214 // Prepare forward_vector and rest.
196- Transform3D src_bone_rest = p_skeleton->get_bone_rest (p_apply_bone);
215+ Transform3D src_bone_rest = setting-> relative ? p_skeleton-> get_bone_pose (p_apply_bone) : p_skeleton->get_bone_rest (p_apply_bone);
197216 Transform3D bone_rest_space;
198217 int parent_bone = p_skeleton->get_bone_parent (p_apply_bone);
199218 if (parent_bone < 0 ) {
0 commit comments