diff --git a/doc/classes/LookAtModifier3D.xml b/doc/classes/LookAtModifier3D.xml
index 2475de186882..3922c30e96ea 100644
--- a/doc/classes/LookAtModifier3D.xml
+++ b/doc/classes/LookAtModifier3D.xml
@@ -47,7 +47,7 @@
The ease type of the time-based interpolation. See also [enum Tween.EaseType].
-
+
The forward axis of the bone. This [SkeletonModifier3D] modifies the bone so that this axis points toward the [member target_node].
@@ -129,24 +129,6 @@
-
- Enumerated value for the +X axis.
-
-
- Enumerated value for the -X axis.
-
-
- Enumerated value for the +Y axis.
-
-
- Enumerated value for the -Y axis.
-
-
- Enumerated value for the +Z axis.
-
-
- Enumerated value for the -Z axis.
-
The bone rest position of the bone specified in [member bone] is used as origin.
diff --git a/doc/classes/SkeletonModifier3D.xml b/doc/classes/SkeletonModifier3D.xml
index 7b1d70179ac4..7e9814b16f8f 100644
--- a/doc/classes/SkeletonModifier3D.xml
+++ b/doc/classes/SkeletonModifier3D.xml
@@ -1,7 +1,7 @@
- A Node that may modify Skeleton3D's bone.
+ A node that may modify Skeleton3D's bone.
[SkeletonModifier3D] retrieves a target [Skeleton3D] by having a [Skeleton3D] parent.
@@ -43,4 +43,24 @@
+
+
+ Enumerated value for the +X axis.
+
+
+ Enumerated value for the -X axis.
+
+
+ Enumerated value for the +Y axis.
+
+
+ Enumerated value for the -Y axis.
+
+
+ Enumerated value for the +Z axis.
+
+
+ Enumerated value for the -Z axis.
+
+
diff --git a/scene/3d/look_at_modifier_3d.cpp b/scene/3d/look_at_modifier_3d.cpp
index 04dae61dce0d..578f6bdde91e 100644
--- a/scene/3d/look_at_modifier_3d.cpp
+++ b/scene/3d/look_at_modifier_3d.cpp
@@ -109,7 +109,7 @@ void LookAtModifier3D::set_forward_axis(BoneAxis p_axis) {
update_configuration_warnings();
}
-LookAtModifier3D::BoneAxis LookAtModifier3D::get_forward_axis() const {
+SkeletonModifier3D::BoneAxis LookAtModifier3D::get_forward_axis() const {
return forward_axis;
}
@@ -482,13 +482,6 @@ void LookAtModifier3D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "secondary_negative_limit_angle", PROPERTY_HINT_RANGE, "0,180,0.01,radians_as_degrees"), "set_secondary_negative_limit_angle", "get_secondary_negative_limit_angle");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "secondary_negative_damp_threshold", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_secondary_negative_damp_threshold", "get_secondary_negative_damp_threshold");
- BIND_ENUM_CONSTANT(BONE_AXIS_PLUS_X);
- BIND_ENUM_CONSTANT(BONE_AXIS_MINUS_X);
- BIND_ENUM_CONSTANT(BONE_AXIS_PLUS_Y);
- BIND_ENUM_CONSTANT(BONE_AXIS_MINUS_Y);
- BIND_ENUM_CONSTANT(BONE_AXIS_PLUS_Z);
- BIND_ENUM_CONSTANT(BONE_AXIS_MINUS_Z);
-
BIND_ENUM_CONSTANT(ORIGIN_FROM_SELF);
BIND_ENUM_CONSTANT(ORIGIN_FROM_SPECIFIC_BONE);
BIND_ENUM_CONSTANT(ORIGIN_FROM_EXTERNAL_NODE);
@@ -610,7 +603,7 @@ bool LookAtModifier3D::is_intersecting_axis(const Vector3 &p_prev, const Vector3
return signbit(p_prev[p_flipping_axis]) != signbit(p_current[p_flipping_axis]);
}
-Vector3 LookAtModifier3D::get_basis_vector_from_bone_axis(const Basis &p_basis, LookAtModifier3D::BoneAxis p_axis) const {
+Vector3 LookAtModifier3D::get_basis_vector_from_bone_axis(const Basis &p_basis, BoneAxis p_axis) {
Vector3 ret;
switch (p_axis) {
case BONE_AXIS_PLUS_X: {
@@ -635,67 +628,12 @@ Vector3 LookAtModifier3D::get_basis_vector_from_bone_axis(const Basis &p_basis,
return ret;
}
-Vector3 LookAtModifier3D::get_vector_from_bone_axis(const LookAtModifier3D::BoneAxis &p_axis) const {
- Vector3 ret;
- switch (p_axis) {
- case BONE_AXIS_PLUS_X: {
- ret = Vector3(1, 0, 0);
- } break;
- case BONE_AXIS_MINUS_X: {
- ret = Vector3(-1, 0, 0);
- } break;
- case BONE_AXIS_PLUS_Y: {
- ret = Vector3(0, 1, 0);
- } break;
- case BONE_AXIS_MINUS_Y: {
- ret = Vector3(0, -1, 0);
- } break;
- case BONE_AXIS_PLUS_Z: {
- ret = Vector3(0, 0, 1);
- } break;
- case BONE_AXIS_MINUS_Z: {
- ret = Vector3(0, 0, -1);
- } break;
- }
- return ret;
-}
-
-Vector3 LookAtModifier3D::get_vector_from_axis(const Vector3::Axis &p_axis) const {
- Vector3 ret;
- switch (p_axis) {
- case Vector3::AXIS_X: {
- ret = Vector3(1, 0, 0);
- } break;
- case Vector3::AXIS_Y: {
- ret = Vector3(0, 1, 0);
- } break;
- case Vector3::AXIS_Z: {
- ret = Vector3(0, 0, 1);
- } break;
- }
- return ret;
-}
-
-Vector3::Axis LookAtModifier3D::get_axis_from_bone_axis(BoneAxis p_axis) const {
- Vector3::Axis ret = Vector3::AXIS_X;
- switch (p_axis) {
- case BONE_AXIS_PLUS_X:
- case BONE_AXIS_MINUS_X: {
- ret = Vector3::AXIS_X;
- } break;
- case BONE_AXIS_PLUS_Y:
- case BONE_AXIS_MINUS_Y: {
- ret = Vector3::AXIS_Y;
- } break;
- case BONE_AXIS_PLUS_Z:
- case BONE_AXIS_MINUS_Z: {
- ret = Vector3::AXIS_Z;
- } break;
- }
- return ret;
+Vector3::Axis LookAtModifier3D::get_secondary_rotation_axis(BoneAxis p_forward_axis, Vector3::Axis p_primary_rotation_axis) {
+ Vector3 secondary_plane = get_vector_from_bone_axis(p_forward_axis) + get_vector_from_axis(p_primary_rotation_axis);
+ return Math::is_zero_approx(secondary_plane.x) ? Vector3::AXIS_X : (Math::is_zero_approx(secondary_plane.y) ? Vector3::AXIS_Y : Vector3::AXIS_Z);
}
-Vector2 LookAtModifier3D::get_projection_vector(const Vector3 &p_vector, Vector3::Axis p_axis) const {
+Vector2 LookAtModifier3D::get_projection_vector(const Vector3 &p_vector, Vector3::Axis p_axis) {
// NOTE: axis is swapped between 2D and 3D.
Vector2 ret;
switch (p_axis) {
@@ -789,8 +727,7 @@ Transform3D LookAtModifier3D::look_at_with_axes(const Transform3D &p_rest) {
}
// Needs for detecting flipping even if use_secondary_rotation is false.
- Vector3 secondary_plane = get_vector_from_bone_axis(forward_axis) + get_vector_from_axis(primary_rotation_axis);
- secondary_rotation_axis = Math::is_zero_approx(secondary_plane.x) ? Vector3::AXIS_X : (Math::is_zero_approx(secondary_plane.y) ? Vector3::AXIS_Y : Vector3::AXIS_Z);
+ secondary_rotation_axis = get_secondary_rotation_axis(forward_axis, primary_rotation_axis);
if (!use_secondary_rotation) {
return current_result;
diff --git a/scene/3d/look_at_modifier_3d.h b/scene/3d/look_at_modifier_3d.h
index 9329edf3c97a..7f824e1e5e46 100644
--- a/scene/3d/look_at_modifier_3d.h
+++ b/scene/3d/look_at_modifier_3d.h
@@ -38,15 +38,6 @@ class LookAtModifier3D : public SkeletonModifier3D {
GDCLASS(LookAtModifier3D, SkeletonModifier3D);
public:
- enum BoneAxis {
- BONE_AXIS_PLUS_X,
- BONE_AXIS_MINUS_X,
- BONE_AXIS_PLUS_Y,
- BONE_AXIS_MINUS_Y,
- BONE_AXIS_PLUS_Z,
- BONE_AXIS_MINUS_Z,
- };
-
enum OriginFrom {
ORIGIN_FROM_SELF,
ORIGIN_FROM_SPECIFIC_BONE,
@@ -104,11 +95,6 @@ class LookAtModifier3D : public SkeletonModifier3D {
float remaining = 0;
float time_step = 1.0;
- Vector3 get_basis_vector_from_bone_axis(const Basis &p_basis, BoneAxis p_axis) const;
- Vector3 get_vector_from_bone_axis(const BoneAxis &p_axis) const;
- Vector3 get_vector_from_axis(const Vector3::Axis &p_axis) const;
- Vector3::Axis get_axis_from_bone_axis(BoneAxis p_axis) const;
- Vector2 get_projection_vector(const Vector3 &p_vector, Vector3::Axis p_axis) const;
float remap_damped(float p_from, float p_to, float p_damp_threshold, float p_value) const;
double get_bspline_y(const Vector2 &p_from, const Vector2 &p_control, const Vector2 &p_to, double p_x) const;
bool is_intersecting_axis(const Vector3 &p_prev, const Vector3 &p_current, Vector3::Axis p_flipping_axis, Vector3::Axis p_check_axis, bool p_check_plane = false) const;
@@ -197,9 +183,12 @@ class LookAtModifier3D : public SkeletonModifier3D {
float get_interpolation_remaining() const;
bool is_interpolating() const;
bool is_target_within_limitation() const;
+
+ static Vector3::Axis get_secondary_rotation_axis(BoneAxis p_forward_axis, Vector3::Axis p_primary_rotation_axis);
+ static Vector3 get_basis_vector_from_bone_axis(const Basis &p_basis, BoneAxis p_axis);
+ static Vector2 get_projection_vector(const Vector3 &p_vector, Vector3::Axis p_axis);
};
-VARIANT_ENUM_CAST(LookAtModifier3D::BoneAxis);
VARIANT_ENUM_CAST(LookAtModifier3D::OriginFrom);
#endif // LOOK_AT_MODIFIER_3D_H
diff --git a/scene/3d/skeleton_modifier_3d.cpp b/scene/3d/skeleton_modifier_3d.cpp
index e8a8e517a2e9..ad42526f6c80 100644
--- a/scene/3d/skeleton_modifier_3d.cpp
+++ b/scene/3d/skeleton_modifier_3d.cpp
@@ -152,6 +152,73 @@ void SkeletonModifier3D::_bind_methods() {
ADD_SIGNAL(MethodInfo("modification_processed"));
GDVIRTUAL_BIND(_process_modification);
+
+ BIND_ENUM_CONSTANT(BONE_AXIS_PLUS_X);
+ BIND_ENUM_CONSTANT(BONE_AXIS_MINUS_X);
+ BIND_ENUM_CONSTANT(BONE_AXIS_PLUS_Y);
+ BIND_ENUM_CONSTANT(BONE_AXIS_MINUS_Y);
+ BIND_ENUM_CONSTANT(BONE_AXIS_PLUS_Z);
+ BIND_ENUM_CONSTANT(BONE_AXIS_MINUS_Z);
+}
+
+Vector3 SkeletonModifier3D::get_vector_from_bone_axis(BoneAxis p_axis) {
+ Vector3 ret;
+ switch (p_axis) {
+ case BONE_AXIS_PLUS_X: {
+ ret = Vector3(1, 0, 0);
+ } break;
+ case BONE_AXIS_MINUS_X: {
+ ret = Vector3(-1, 0, 0);
+ } break;
+ case BONE_AXIS_PLUS_Y: {
+ ret = Vector3(0, 1, 0);
+ } break;
+ case BONE_AXIS_MINUS_Y: {
+ ret = Vector3(0, -1, 0);
+ } break;
+ case BONE_AXIS_PLUS_Z: {
+ ret = Vector3(0, 0, 1);
+ } break;
+ case BONE_AXIS_MINUS_Z: {
+ ret = Vector3(0, 0, -1);
+ } break;
+ }
+ return ret;
+}
+
+Vector3 SkeletonModifier3D::get_vector_from_axis(Vector3::Axis p_axis) {
+ Vector3 ret;
+ switch (p_axis) {
+ case Vector3::AXIS_X: {
+ ret = Vector3(1, 0, 0);
+ } break;
+ case Vector3::AXIS_Y: {
+ ret = Vector3(0, 1, 0);
+ } break;
+ case Vector3::AXIS_Z: {
+ ret = Vector3(0, 0, 1);
+ } break;
+ }
+ return ret;
+}
+
+Vector3::Axis SkeletonModifier3D::get_axis_from_bone_axis(BoneAxis p_axis) {
+ Vector3::Axis ret = Vector3::AXIS_X;
+ switch (p_axis) {
+ case BONE_AXIS_PLUS_X:
+ case BONE_AXIS_MINUS_X: {
+ ret = Vector3::AXIS_X;
+ } break;
+ case BONE_AXIS_PLUS_Y:
+ case BONE_AXIS_MINUS_Y: {
+ ret = Vector3::AXIS_Y;
+ } break;
+ case BONE_AXIS_PLUS_Z:
+ case BONE_AXIS_MINUS_Z: {
+ ret = Vector3::AXIS_Z;
+ } break;
+ }
+ return ret;
}
SkeletonModifier3D::SkeletonModifier3D() {
diff --git a/scene/3d/skeleton_modifier_3d.h b/scene/3d/skeleton_modifier_3d.h
index 9e216354d17c..86e9d9a67aa5 100644
--- a/scene/3d/skeleton_modifier_3d.h
+++ b/scene/3d/skeleton_modifier_3d.h
@@ -40,6 +40,16 @@ class SkeletonModifier3D : public Node3D {
void rebind();
+public:
+ enum BoneAxis {
+ BONE_AXIS_PLUS_X,
+ BONE_AXIS_MINUS_X,
+ BONE_AXIS_PLUS_Y,
+ BONE_AXIS_MINUS_Y,
+ BONE_AXIS_PLUS_Z,
+ BONE_AXIS_MINUS_Z,
+ };
+
protected:
bool active = true;
real_t influence = 1.0;
@@ -76,7 +86,14 @@ class SkeletonModifier3D : public Node3D {
void process_modification();
+ // Utility APIs.
+ static Vector3 get_vector_from_bone_axis(BoneAxis p_axis);
+ static Vector3 get_vector_from_axis(Vector3::Axis p_axis);
+ static Vector3::Axis get_axis_from_bone_axis(BoneAxis p_axis);
+
SkeletonModifier3D();
};
+VARIANT_ENUM_CAST(SkeletonModifier3D::BoneAxis);
+
#endif // SKELETON_MODIFIER_3D_H