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