Change radius_range to angle to indicate hole of JointLimitationCone3D

This commit is contained in:
Silc Lizard (Tokage) Renew
2025-12-28 23:46:12 +09:00
parent 3b48b0110e
commit 261ab6092b
3 changed files with 33 additions and 18 deletions

View File

@@ -9,9 +9,9 @@
<tutorials>
</tutorials>
<members>
<member name="radius_range" type="float" setter="set_radius_range" getter="get_radius_range" default="0.25">
The size of the hole made by the cone.
[code]0[/code] is no hole, [code]0.5[/code] makes a hemisphere, and [code]1.0[/code] makes a sphere (no limitation).
<member name="angle" type="float" setter="set_angle" getter="get_angle" default="1.5707964">
The radius range of the hole made by the cone.
[code]0[/code] degrees makes a sphere without hole, [code]180[/code] degrees makes a hemisphere, and [code]360[/code] degrees become empty (no limitation).
</member>
</members>
</class>

View File

@@ -30,20 +30,32 @@
#include "joint_limitation_cone_3d.h"
void JointLimitationCone3D::set_radius_range(real_t p_radius_range) {
radius_range = p_radius_range;
#ifndef DISABLE_DEPRECATED
bool JointLimitationCone3D::_set(const StringName &p_path, const Variant &p_value) {
// To keep compatibility between 4.6.beta2 and beta3.
if (p_path == SNAME("radius_range")) {
set_angle((float)p_value * Math::TAU);
} else {
return false;
}
return true;
}
#endif // DISABLE_DEPRECATED
void JointLimitationCone3D::set_angle(real_t p_angle) {
angle = p_angle;
emit_changed();
}
real_t JointLimitationCone3D::get_radius_range() const {
return radius_range;
real_t JointLimitationCone3D::get_angle() const {
return angle;
}
void JointLimitationCone3D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_radius_range", "radius_range"), &JointLimitationCone3D::set_radius_range);
ClassDB::bind_method(D_METHOD("get_radius_range"), &JointLimitationCone3D::get_radius_range);
ClassDB::bind_method(D_METHOD("set_angle", "angle"), &JointLimitationCone3D::set_angle);
ClassDB::bind_method(D_METHOD("get_angle"), &JointLimitationCone3D::get_angle);
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "radius_range", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_radius_range", "get_radius_range");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "angle", PROPERTY_HINT_RANGE, "0,360,0.01,radians_as_degrees"), "set_angle", "get_angle");
}
Vector3 JointLimitationCone3D::_solve(const Vector3 &p_direction) const {
@@ -52,10 +64,10 @@ Vector3 JointLimitationCone3D::_solve(const Vector3 &p_direction) const {
Vector3 center_axis = Vector3(0, 1, 0);
// Apply the limitation if the angle exceeds radius_range * PI.
real_t angle = p_direction.angle_to(center_axis);
real_t max_angle = radius_range * Math::PI;
real_t current_angle = p_direction.angle_to(center_axis);
real_t max_angle = angle * 0.5;
if (angle <= max_angle) {
if (current_angle <= max_angle) {
// If within the limitation range, return the new direction as is.
return p_direction;
}
@@ -65,7 +77,7 @@ Vector3 JointLimitationCone3D::_solve(const Vector3 &p_direction) const {
Vector3 plane_normal;
// Special handling for when the new direction vector is completely opposite to the central axis.
if (Math::is_equal_approx((double)angle, Math::PI)) {
if (Math::is_equal_approx((double)current_angle, Math::PI)) {
// Select an arbitrary perpendicular axis
plane_normal = center_axis.get_any_perpendicular();
} else {
@@ -97,7 +109,7 @@ void JointLimitationCone3D::draw_shape(Ref<SurfaceTool> &p_surface_tool, const T
if (sphere_r <= CMP_EPSILON) {
return;
}
real_t alpha = CLAMP((real_t)radius_range, (real_t)0.0, (real_t)1.0) * Math::PI;
real_t alpha = CLAMP((real_t)angle, (real_t)0.0, (real_t)Math::TAU) * 0.5;
real_t y_cap = sphere_r * Math::cos(alpha);
real_t r_cap = sphere_r * Math::sin(alpha);

View File

@@ -35,16 +35,19 @@
class JointLimitationCone3D : public JointLimitation3D {
GDCLASS(JointLimitationCone3D, JointLimitation3D);
real_t radius_range = 0.25;
real_t angle = Math::TAU * 0.25;
protected:
#ifndef DISABLE_DEPRECATED
bool _set(const StringName &p_name, const Variant &p_value);
#endif // DISABLE_DEPRECATED
static void _bind_methods();
virtual Vector3 _solve(const Vector3 &p_direction) const override;
public:
void set_radius_range(real_t p_radius_range);
real_t get_radius_range() const;
void set_angle(real_t p_angle);
real_t get_angle() const;
#ifdef TOOLS_ENABLED
virtual void draw_shape(Ref<SurfaceTool> &p_surface_tool, const Transform3D &p_transform, float p_bone_length, const Color &p_color) const override;