Files
lace/3-mid/physics/interface/source/private/box2d/box2d_physics-joint.ads
2025-09-05 02:43:49 +10:00

380 lines
13 KiB
Ada

with
physics.Joint.DoF6,
physics.Joint.cone_twist,
physics.Joint.slider,
physics.Joint.hinge,
physics.Joint.ball,
physics.Object,
box2d_C.Pointers,
lace.Any;
package box2d_Physics.Joint
--
-- Provides glue between a physics joint and a Box2D joint.
--
is
type Item is abstract limited new physics.Joint.item with -- TODO: Make private.
record
C : box2d_c.Pointers.Joint_Pointer;
user_Data : access lace.Any.limited_item'Class;
end record;
type View is access all Item'Class;
use Math;
function new_Dof6_Joint (Object_A, Object_B : in physics.Object.view;
Frame_A, Frame_B : in Matrix_4x4) return physics.Joint.DoF6.view;
function new_ball_Joint (Object_A, Object_B : in physics.Object.view;
Pivot_in_A, Pivot_in_B : in Vector_3) return physics.Joint.ball.view;
function new_slider_Joint (Object_A, Object_B : in physics.Object.view;
Frame_A, Frame_B : in Matrix_4x4) return physics.Joint.slider.view;
function new_cone_twist_Joint (Object_A, Object_B : in physics.Object.view;
Frame_A, Frame_B : in Matrix_4x4) return physics.Joint.cone_twist.view;
function new_hinge_Joint (in_Space : in box2d_c.Pointers.Space_Pointer;
Object_A, Object_B : in physics.Object.view;
Anchor_in_A, Anchor_in_B : in Vector_3;
low_Limit, high_Limit : in math.Real;
collide_Conected : in Boolean) return physics.Joint.hinge.view;
function new_hinge_Joint (in_Space : in box2d_c.Pointers.Space_Pointer;
Object_A, Object_B : in physics.Object.view;
Frame_A, Frame_B : in Matrix_4x4;
low_Limit, high_Limit : in math.Real;
collide_Conected : in Boolean) return physics.Joint.hinge.view;
function new_hinge_Joint (in_Space : in box2d_c.Pointers.Space_Pointer;
Object_A : in physics.Object.view;
Frame_A : in Matrix_4x4) return physics.Joint.hinge.view;
procedure free (the_Joint : in out physics.Joint.view);
-- procedure set_b2d_user_Data (Self : in View);
private
overriding
function reaction_Force (Self : in Item) return Vector_3;
overriding
function reaction_Torque (Self : in Item) return Real;
overriding
procedure user_Data_is (Self : in out Item; Now : access lace.Any.limited_Item'Class);
overriding
function user_Data (Self : in Item) return access lace.Any.limited_Item'Class;
overriding
function collide_Connected (Self : in Item) return Boolean;
use physics.Joint;
--------
-- DoF6
--
type DoF6 is new Item
and physics.Joint.DoF6.item with
record
null;
end record;
type DoF6_view is access DoF6;
overriding
procedure destruct (Self : in out DoF6);
overriding
function Object_A (Self : in DoF6) return physics.Object.view;
overriding
function Object_B (Self : in DoF6) return physics.Object.view;
overriding
function Frame_A (Self : in DoF6) return Matrix_4x4;
overriding
function Frame_B (Self : in DoF6) return Matrix_4x4;
overriding
procedure Frame_A_is (Self : in out DoF6; Now : in Matrix_4x4);
overriding
procedure Frame_B_is (Self : in out DoF6; Now : in Matrix_4x4);
overriding
function is_Limited (Self : in DoF6; DoF : Degree_of_freedom) return Boolean;
overriding
procedure Velocity_is (Self : in out DoF6; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function Extent (Self : in DoF6; DoF : in Degree_of_freedom) return Real;
overriding
procedure desired_Extent_is (Self : in out DoF6; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function lower_Limit (Self : in DoF6; DoF : in Degree_of_freedom) return Real;
overriding
function upper_Limit (Self : in DoF6; DoF : in Degree_of_freedom) return Real;
overriding
procedure lower_Limit_is (Self : in out DoF6; Now : in Real;
DoF : in Degree_of_freedom);
overriding
procedure upper_Limit_is (Self : in out DoF6; Now : in Real;
DoF : in Degree_of_freedom);
----------
-- Slider
--
type Slider is new Item
and physics.Joint.Slider.item with
record
null;
end record;
type Slider_view is access Slider;
overriding
procedure destruct (Self : in out Slider);
overriding
function Object_A (Self : in Slider) return physics.Object.view;
overriding
function Object_B (Self : in Slider) return physics.Object.view;
overriding
function Frame_A (Self : in Slider) return Matrix_4x4;
overriding
function Frame_B (Self : in Slider) return Matrix_4x4;
overriding
procedure Frame_A_is (Self : in out Slider; Now : in Matrix_4x4);
overriding
procedure Frame_B_is (Self : in out Slider; Now : in Matrix_4x4);
overriding
function is_Limited (Self : in Slider; DoF : Degree_of_freedom) return Boolean;
overriding
procedure Velocity_is (Self : in out Slider; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function Extent (Self : in Slider; DoF : in Degree_of_freedom) return Real;
overriding
procedure desired_Extent_is (Self : in out Slider; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function lower_Limit (Self : in Slider; DoF : in Degree_of_freedom) return Real;
overriding
function upper_Limit (Self : in Slider; DoF : in Degree_of_freedom) return Real;
overriding
procedure lower_Limit_is (Self : in out Slider; Now : in Real;
DoF : in Degree_of_freedom);
overriding
procedure upper_Limit_is (Self : in out Slider; Now : in Real;
DoF : in Degree_of_freedom);
--------------
-- cone_Twist
--
type cone_Twist is new Item
and physics.Joint.cone_Twist.item with
record
null;
end record;
type cone_Twist_view is access cone_Twist;
overriding
procedure destruct (Self : in out cone_Twist);
overriding
function Object_A (Self : in cone_Twist) return physics.Object.view;
overriding
function Object_B (Self : in cone_Twist) return physics.Object.view;
overriding
function Frame_A (Self : in cone_Twist) return Matrix_4x4;
overriding
function Frame_B (Self : in cone_Twist) return Matrix_4x4;
overriding
procedure Frame_A_is (Self : in out cone_Twist; Now : in Matrix_4x4);
overriding
procedure Frame_B_is (Self : in out cone_Twist; Now : in Matrix_4x4);
overriding
function is_Limited (Self : in cone_Twist; DoF : Degree_of_freedom) return Boolean;
overriding
procedure Velocity_is (Self : in out cone_Twist; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function Extent (Self : in cone_Twist; DoF : in Degree_of_freedom) return Real;
overriding
procedure desired_Extent_is (Self : in out cone_Twist; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function lower_Limit (Self : in cone_Twist; DoF : in Degree_of_freedom) return Real;
overriding
function upper_Limit (Self : in cone_Twist; DoF : in Degree_of_freedom) return Real;
overriding
procedure lower_Limit_is (Self : in out cone_Twist; Now : in Real;
DoF : in Degree_of_freedom);
overriding
procedure upper_Limit_is (Self : in out cone_Twist; Now : in Real;
DoF : in Degree_of_freedom);
--------
-- Ball
--
type Ball is new Item
and physics.Joint.Ball.item with
record
null;
end record;
type Ball_view is access Ball;
overriding
procedure destruct (Self : in out Ball);
overriding
function Object_A (Self : in Ball) return physics.Object.view;
overriding
function Object_B (Self : in Ball) return physics.Object.view;
overriding
function Frame_A (Self : in Ball) return Matrix_4x4;
overriding
function Frame_B (Self : in Ball) return Matrix_4x4;
overriding
procedure Frame_A_is (Self : in out Ball; Now : in Matrix_4x4);
overriding
procedure Frame_B_is (Self : in out Ball; Now : in Matrix_4x4);
overriding
function is_Limited (Self : in Ball; DoF : Degree_of_freedom) return Boolean;
overriding
procedure Velocity_is (Self : in out Ball; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function Extent (Self : in Ball; DoF : in Degree_of_freedom) return Real;
overriding
procedure desired_Extent_is (Self : in out Ball; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function lower_Limit (Self : in Ball; DoF : in Degree_of_freedom) return Real;
overriding
function upper_Limit (Self : in Ball; DoF : in Degree_of_freedom) return Real;
overriding
procedure lower_Limit_is (Self : in out Ball; Now : in Real;
DoF : in Degree_of_freedom);
overriding
procedure upper_Limit_is (Self : in out Ball; Now : in Real;
DoF : in Degree_of_freedom);
---------
-- Hinge
--
type Hinge is new Item
and physics.Joint.hinge.item with
record
null;
end record;
type Hinge_view is access Hinge;
overriding
procedure destruct (Self : in out Hinge);
overriding
function Object_A (Self : in Hinge) return physics.Object.view;
overriding
function Object_B (Self : in Hinge) return physics.Object.view;
overriding
function Frame_A (Self : in Hinge) return Matrix_4x4;
overriding
function Frame_B (Self : in Hinge) return Matrix_4x4;
overriding
procedure Frame_A_is (Self : in out Hinge; Now : in Matrix_4x4);
overriding
procedure Frame_B_is (Self : in out Hinge; Now : in Matrix_4x4);
overriding
function is_Limited (Self : in Hinge; DoF : Degree_of_freedom) return Boolean;
overriding
procedure Velocity_is (Self : in out Hinge; Now : in Real;
DoF : in Degree_of_freedom);
overriding
function Extent (Self : in Hinge; DoF : in Degree_of_freedom) return Real;
overriding
procedure desired_Extent_is (Self : in out Hinge; Now : in Real;
DoF : in Degree_of_freedom);
overriding
procedure Limits_are (Self : in out Hinge; Low, High : in Real;
Softness : in Real := 0.9;
biasFactor : in Real := 0.3;
relaxationFactor : in Real := 1.0);
overriding
function lower_Limit (Self : in Hinge) return Real;
overriding
function upper_Limit (Self : in Hinge) return Real;
overriding
function limit_Enabled (Self : in Hinge) return Boolean;
overriding
function Angle (Self : in Hinge) return Real;
overriding
function reference_Angle (Self : in Hinge) return Radians;
overriding
function local_Anchor_on_A (Self : in Hinge) return Vector_3;
overriding
function local_Anchor_on_B (Self : in Hinge) return Vector_3;
overriding
function motor_Enabled (Self : in Hinge) return Boolean;
overriding
function motor_Speed (Self : in Hinge) return Real;
overriding
function max_motor_Torque (Self : in Hinge) return Real;
end box2d_Physics.Joint;