Change radius_range to angle to indicate hole of JointLimitationCone3D
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user