Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move enum BoneAxis to SkeletonModifier from LookAtModifier #101148

Merged
merged 1 commit into from
Jan 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 1 addition & 19 deletions doc/classes/LookAtModifier3D.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
<member name="ease_type" type="int" setter="set_ease_type" getter="get_ease_type" enum="Tween.EaseType" default="0">
The ease type of the time-based interpolation. See also [enum Tween.EaseType].
</member>
<member name="forward_axis" type="int" setter="set_forward_axis" getter="get_forward_axis" enum="LookAtModifier3D.BoneAxis" default="4">
<member name="forward_axis" type="int" setter="set_forward_axis" getter="get_forward_axis" enum="SkeletonModifier3D.BoneAxis" default="4">
The forward axis of the bone. This [SkeletonModifier3D] modifies the bone so that this axis points toward the [member target_node].
</member>
<member name="origin_bone" type="int" setter="set_origin_bone" getter="get_origin_bone">
Expand Down Expand Up @@ -129,24 +129,6 @@
</member>
</members>
<constants>
<constant name="BONE_AXIS_PLUS_X" value="0" enum="BoneAxis">
Enumerated value for the +X axis.
</constant>
<constant name="BONE_AXIS_MINUS_X" value="1" enum="BoneAxis">
Enumerated value for the -X axis.
</constant>
<constant name="BONE_AXIS_PLUS_Y" value="2" enum="BoneAxis">
Enumerated value for the +Y axis.
</constant>
<constant name="BONE_AXIS_MINUS_Y" value="3" enum="BoneAxis">
Enumerated value for the -Y axis.
</constant>
<constant name="BONE_AXIS_PLUS_Z" value="4" enum="BoneAxis">
Enumerated value for the +Z axis.
</constant>
<constant name="BONE_AXIS_MINUS_Z" value="5" enum="BoneAxis">
Enumerated value for the -Z axis.
</constant>
<constant name="ORIGIN_FROM_SELF" value="0" enum="OriginFrom">
The bone rest position of the bone specified in [member bone] is used as origin.
</constant>
Expand Down
22 changes: 21 additions & 1 deletion doc/classes/SkeletonModifier3D.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="SkeletonModifier3D" inherits="Node3D" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
<brief_description>
A Node that may modify Skeleton3D's bone.
A node that may modify Skeleton3D's bone.
</brief_description>
<description>
[SkeletonModifier3D] retrieves a target [Skeleton3D] by having a [Skeleton3D] parent.
Expand Down Expand Up @@ -43,4 +43,24 @@
</description>
</signal>
</signals>
<constants>
<constant name="BONE_AXIS_PLUS_X" value="0" enum="BoneAxis">
Enumerated value for the +X axis.
</constant>
<constant name="BONE_AXIS_MINUS_X" value="1" enum="BoneAxis">
Enumerated value for the -X axis.
</constant>
<constant name="BONE_AXIS_PLUS_Y" value="2" enum="BoneAxis">
Enumerated value for the +Y axis.
</constant>
<constant name="BONE_AXIS_MINUS_Y" value="3" enum="BoneAxis">
Enumerated value for the -Y axis.
</constant>
<constant name="BONE_AXIS_PLUS_Z" value="4" enum="BoneAxis">
Enumerated value for the +Z axis.
</constant>
<constant name="BONE_AXIS_MINUS_Z" value="5" enum="BoneAxis">
Enumerated value for the -Z axis.
</constant>
</constants>
</class>
77 changes: 7 additions & 70 deletions scene/3d/look_at_modifier_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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: {
Expand All @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down
19 changes: 4 additions & 15 deletions scene/3d/look_at_modifier_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
67 changes: 67 additions & 0 deletions scene/3d/skeleton_modifier_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
17 changes: 17 additions & 0 deletions scene/3d/skeleton_modifier_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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