<?xml version="1.0" encoding="UTF-8" ?>
<class name="PhysicalBone3D" inherits="PhysicsBody3D" keywords="ragdoll" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
	<brief_description>
		A physics body used to make bones in a [Skeleton3D] react to physics.
	</brief_description>
	<description>
		The [PhysicalBone3D] node is a physics body that can be used to make bones in a [Skeleton3D] react to physics.
		[b]Note:[/b] In order to detect physical bones with raycasts, the [member SkeletonModifier3D.active] property of the parent [PhysicalBoneSimulator3D] must be [code]true[/code] and the [Skeleton3D]'s bone must be assigned to [PhysicalBone3D] correctly; it means that [method get_bone_id] should return a valid id ([code]&gt;= 0[/code]).
	</description>
	<tutorials>
		<link title="Ragdoll System">$DOCS_URL/tutorials/physics/ragdoll_system.html</link>
	</tutorials>
	<methods>
		<method name="_integrate_forces" qualifiers="virtual">
			<return type="void" />
			<param index="0" name="state" type="PhysicsDirectBodyState3D" />
			<description>
				Called during physics processing, allowing you to read and safely modify the simulation state for the object. By default, it is called before the standard force integration, but the [member custom_integrator] property allows you to disable the standard force integration and do fully custom force integration for a body.
			</description>
		</method>
		<method name="apply_central_impulse">
			<return type="void" />
			<param index="0" name="impulse" type="Vector3" />
			<description>
				Applies a directional impulse without affecting rotation.
				An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the "_integrate_forces" functions otherwise).
				This is equivalent to using [method apply_impulse] at the body's center of mass.
			</description>
		</method>
		<method name="apply_impulse">
			<return type="void" />
			<param index="0" name="impulse" type="Vector3" />
			<param index="1" name="position" type="Vector3" default="Vector3(0, 0, 0)" />
			<description>
				Applies a positioned impulse to the PhysicsBone3D.
				An impulse is time-independent! Applying an impulse every frame would result in a framerate-dependent force. For this reason, it should only be used when simulating one-time impacts (use the "_integrate_forces" functions otherwise).
				[param position] is the offset from the PhysicsBone3D origin in global coordinates.
			</description>
		</method>
		<method name="get_bone_id" qualifiers="const">
			<return type="int" />
			<description>
				Returns the unique identifier of the PhysicsBone3D.
			</description>
		</method>
		<method name="get_simulate_physics">
			<return type="bool" />
			<description>
				Returns [code]true[/code] if the PhysicsBone3D is allowed to simulate physics.
			</description>
		</method>
		<method name="is_simulating_physics">
			<return type="bool" />
			<description>
				Returns [code]true[/code] if the PhysicsBone3D is currently simulating physics.
			</description>
		</method>
	</methods>
	<members>
		<member name="angular_damp" type="float" setter="set_angular_damp" getter="get_angular_damp" default="0.0">
			Damps the body's rotation. By default, the body will use the [member ProjectSettings.physics/3d/default_angular_damp] project setting or any value override set by an [Area3D] the body is in. Depending on [member angular_damp_mode], you can set [member angular_damp] to be added to or to replace the body's damping value.
			See [member ProjectSettings.physics/3d/default_angular_damp] for more details about damping.
		</member>
		<member name="angular_damp_mode" type="int" setter="set_angular_damp_mode" getter="get_angular_damp_mode" enum="PhysicalBone3D.DampMode" default="0">
			Defines how [member angular_damp] is applied.
		</member>
		<member name="angular_velocity" type="Vector3" setter="set_angular_velocity" getter="get_angular_velocity" default="Vector3(0, 0, 0)">
			The PhysicalBone3D's rotational velocity in [i]radians[/i] per second.
		</member>
		<member name="body_offset" type="Transform3D" setter="set_body_offset" getter="get_body_offset" default="Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)">
			Sets the body's transform.
		</member>
		<member name="bounce" type="float" setter="set_bounce" getter="get_bounce" default="0.0">
			The body's bounciness. Values range from [code]0[/code] (no bounce) to [code]1[/code] (full bounciness).
			[b]Note:[/b] Even with [member bounce] set to [code]1.0[/code], some energy will be lost over time due to linear and angular damping. To have a [PhysicalBone3D] that preserves all its energy over time, set [member bounce] to [code]1.0[/code], [member linear_damp_mode] to [constant DAMP_MODE_REPLACE], [member linear_damp] to [code]0.0[/code], [member angular_damp_mode] to [constant DAMP_MODE_REPLACE], and [member angular_damp] to [code]0.0[/code].
		</member>
		<member name="can_sleep" type="bool" setter="set_can_sleep" getter="is_able_to_sleep" default="true">
			If [code]true[/code], the body is deactivated when there is no movement, so it will not take part in the simulation until it is awakened by an external force.
		</member>
		<member name="custom_integrator" type="bool" setter="set_use_custom_integrator" getter="is_using_custom_integrator" default="false">
			If [code]true[/code], the standard force integration (like gravity or damping) will be disabled for this body. Other than collision response, the body will only move as determined by the [method _integrate_forces] method, if that virtual method is overridden.
			Setting this property will call the method [method PhysicsServer3D.body_set_omit_force_integration] internally.
		</member>
		<member name="friction" type="float" setter="set_friction" getter="get_friction" default="1.0">
			The body's friction, from [code]0[/code] (frictionless) to [code]1[/code] (max friction).
		</member>
		<member name="gravity_scale" type="float" setter="set_gravity_scale" getter="get_gravity_scale" default="1.0">
			This is multiplied by [member ProjectSettings.physics/3d/default_gravity] to produce this body's gravity. For example, a value of [code]1.0[/code] will apply normal gravity, [code]2.0[/code] will apply double the gravity, and [code]0.5[/code] will apply half the gravity to this body.
		</member>
		<member name="joint_offset" type="Transform3D" setter="set_joint_offset" getter="get_joint_offset" default="Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)">
			Sets the joint's transform.
		</member>
		<member name="joint_rotation" type="Vector3" setter="set_joint_rotation" getter="get_joint_rotation" default="Vector3(0, 0, 0)">
			Sets the joint's rotation in radians.
		</member>
		<member name="joint_type" type="int" setter="set_joint_type" getter="get_joint_type" enum="PhysicalBone3D.JointType" default="0">
			Sets the joint type.
		</member>
		<member name="linear_damp" type="float" setter="set_linear_damp" getter="get_linear_damp" default="0.0">
			Damps the body's movement. By default, the body will use [member ProjectSettings.physics/3d/default_linear_damp] or any value override set by an [Area3D] the body is in. Depending on [member linear_damp_mode], [member linear_damp] may be added to or replace the body's damping value.
			See [member ProjectSettings.physics/3d/default_linear_damp] for more details about damping.
		</member>
		<member name="linear_damp_mode" type="int" setter="set_linear_damp_mode" getter="get_linear_damp_mode" enum="PhysicalBone3D.DampMode" default="0">
			Defines how [member linear_damp] is applied.
		</member>
		<member name="linear_velocity" type="Vector3" setter="set_linear_velocity" getter="get_linear_velocity" default="Vector3(0, 0, 0)">
			The body's linear velocity in units per second. Can be used sporadically, but [b]don't set this every frame[/b], because physics may run in another thread and runs at a different granularity. Use [method _integrate_forces] as your process loop for precise control of the body state.
		</member>
		<member name="mass" type="float" setter="set_mass" getter="get_mass" default="1.0">
			The body's mass.
		</member>
	</members>
	<constants>
		<constant name="DAMP_MODE_COMBINE" value="0" enum="DampMode">
			In this mode, the body's damping value is added to any value set in areas or the default value.
		</constant>
		<constant name="DAMP_MODE_REPLACE" value="1" enum="DampMode">
			In this mode, the body's damping value replaces any value set in areas or the default value.
		</constant>
		<constant name="JOINT_TYPE_NONE" value="0" enum="JointType">
			No joint is applied to the PhysicsBone3D.
		</constant>
		<constant name="JOINT_TYPE_PIN" value="1" enum="JointType">
			A pin joint is applied to the PhysicsBone3D.
		</constant>
		<constant name="JOINT_TYPE_CONE" value="2" enum="JointType">
			A cone joint is applied to the PhysicsBone3D.
		</constant>
		<constant name="JOINT_TYPE_HINGE" value="3" enum="JointType">
			A hinge joint is applied to the PhysicsBone3D.
		</constant>
		<constant name="JOINT_TYPE_SLIDER" value="4" enum="JointType">
			A slider joint is applied to the PhysicsBone3D.
		</constant>
		<constant name="JOINT_TYPE_6DOF" value="5" enum="JointType">
			A 6 degrees of freedom joint is applied to the PhysicsBone3D.
		</constant>
	</constants>
</class>
