From 8aa3c2f0918707c2243b86ac53c02c27ceb9a266 Mon Sep 17 00:00:00 2001 From: TwistedTwigleg Date: Mon, 3 Aug 2020 14:02:24 -0400 Subject: New and improved IK system for Skeleton2D This PR and commit adds a new IK system for 2D with the Skeleton2D node that adds several new IK solvers, a way to control bones in a Skeleton2D node similar to that in Skeleton3D. It also adds additional changes and functionality. This work was sponsored by GSoC 2020 and TwistedTwigleg. Full list of changes: * Adds a SkeletonModifier2D resource * This resource is the base where all IK code is written and executed * Has a function for clamping angles, since it is so commonly used * Modifiers are unique when duplicated so it works with instancing * Adds a SkeletonModifierStack2D resource * This resource manages a series of SkeletonModification2Ds * This is what the Skeleton2D directly interfaces with to make IK possible * Adds SkeletonModifier2D resources for LookAt, CCDIK, FABRIK, Jiggle, and TwoBoneIK * Each modification is in its own file * There is also a SkeletonModifier2D resource that acts as a stack for using multiple stacks together * Adds a PhysicalBone2D node * Works similar to the PhysicalBone3D node, but uses a RigidBody2D node * Changes to Skeleton2D listed below: * Skeleton2D now holds a single SkeletonModificationStack2D for IK * Skeleton2D now has a local_pose_override, which overrides the Bone2D position similar to how the overrides work in Skeleton3D * Changes to Bone2D listed below: * The default_length property has been changed to length. Length is the length of the bone to its child bone node * New bone_angle property, which is the angle the bone has to its first child bone node * Bone2D caches its transform when not modified by IK for IK interpolation purposes * Bone2D draws its own editor gizmo, though this is stated to change in the future * Changes to CanvasItemEditor listed below: * Bone2D gizmo drawing code removed * The 2D IK code is removed. Now Bone2D is the only bone system for 2D * Transform2D now has a looking_at function for rotating to face a position * Two new node notifications: NOTIFICATION_EDITOR_PRE_SAVE and NOTIFICATION_EDITOR_POST_SAVE * These notifications only are called in the editor right before and after saving a scene * Needed for not saving the IK position when executing IK in the editor * Documentation for all the changes listed above. --- doc/classes/Bone2D.xml | 69 +++++- doc/classes/Node.xml | 6 + doc/classes/PhysicalBone2D.xml | 49 +++++ doc/classes/Skeleton2D.xml | 54 +++++ doc/classes/SkeletonModification2D.xml | 104 +++++++++ doc/classes/SkeletonModification2DCCDIK.xml | 170 +++++++++++++++ doc/classes/SkeletonModification2DFABRIK.xml | 108 ++++++++++ doc/classes/SkeletonModification2DJiggle.xml | 232 +++++++++++++++++++++ doc/classes/SkeletonModification2DLookAt.xml | 107 ++++++++++ .../SkeletonModification2DPhysicalBones.xml | 68 ++++++ doc/classes/SkeletonModification2DStackHolder.xml | 32 +++ doc/classes/SkeletonModification2DTwoBoneIK.xml | 94 +++++++++ doc/classes/SkeletonModificationStack2D.xml | 108 ++++++++++ doc/classes/Transform2D.xml | 35 +++- 14 files changed, 1225 insertions(+), 11 deletions(-) create mode 100644 doc/classes/PhysicalBone2D.xml create mode 100644 doc/classes/SkeletonModification2D.xml create mode 100644 doc/classes/SkeletonModification2DCCDIK.xml create mode 100644 doc/classes/SkeletonModification2DFABRIK.xml create mode 100644 doc/classes/SkeletonModification2DJiggle.xml create mode 100644 doc/classes/SkeletonModification2DLookAt.xml create mode 100644 doc/classes/SkeletonModification2DPhysicalBones.xml create mode 100644 doc/classes/SkeletonModification2DStackHolder.xml create mode 100644 doc/classes/SkeletonModification2DTwoBoneIK.xml create mode 100644 doc/classes/SkeletonModificationStack2D.xml (limited to 'doc') diff --git a/doc/classes/Bone2D.xml b/doc/classes/Bone2D.xml index 910d488dfd..93744ddad7 100644 --- a/doc/classes/Bone2D.xml +++ b/doc/classes/Bone2D.xml @@ -19,6 +19,28 @@ Stores the node's current transforms in [member rest]. + + + + + Returns whether this [code]Bone2D[/code] node is going to autocalculate its length and bone angle using its first [code]Bone2D[/code] child node, if one exists. If there are no [code]Bone2D[/code] children, then it cannot autocalculate these values and will print a warning. + + + + + + + Returns the angle of the bone in the [code]Bone2D[/code] node. + [b]Note:[/b] This is different from the [code]Bone2D[/code]'s rotation. The bone angle is the rotation of the bone shown by the [code]Bone2D[/code] gizmo, and because [code]Bone2D[/code] bones are based on positions, this can vary from the actual rotation of the [code]Bone2D[/code] node. + + + + + + + Deprecated. Please use [code]get_length[/code] instead. + + @@ -26,6 +48,13 @@ Returns the node's index as part of the entire skeleton. See [Skeleton2D]. + + + + + Returns the length of the bone in the [code]Bone2D[/code] node. + + @@ -33,11 +62,45 @@ Returns the node's [member rest] [code]Transform2D[/code] if it doesn't have a parent, or its rest pose relative to its parent. + + + + + + + When set to [code]true[/code], the [code]Bone2D[/code] node will attempt to automatically calculate the bone angle and length using the first child [code]Bone2D[/code] node, if one exists. If none exist, the [code]Bone2D[/code] cannot automatically calculate these values and will print a warning. + + + + + + + + + Sets the bone angle for the [code]Bone2D[/code] node. This is typically set to the rotation from the [code]Bone2D[/code] node to a child [code]Bone2D[/code] node. + [b]Note:[/b] This is different from the [code]Bone2D[/code]'s rotation. The bone angle is the rotation of the bone shown by the [code]Bone2D[/code] gizmo, and because [code]Bone2D[/code] bones are based on positions, this can vary from the actual rotation of the [code]Bone2D[/code] node. + + + + + + + + + Deprecated. Please use [code]set_length[/code] instead. + + + + + + + + + Sets the length of the bone in the [code]Bone2D[/code] node. + + - - Length of the bone's representation drawn in the editor's viewport in pixels. - Rest transform of the bone. You can reset the node's transforms to this value using [method apply_rest]. diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 523f3a0c17..c4447962df 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -969,6 +969,12 @@ Notification received when the node is ready, just before [constant NOTIFICATION_READY] is received. Unlike the latter, it's sent every time the node enters tree, instead of only once. + + Notification received right before the scene with the node is saved in the editor. This notification is only sent in the Godot editor and will not occur in exported projects. + + + Notification received right after the scene with the node is saved in the editor. This notification is only sent in the Godot editor and will not occur in exported projects. + Notification received from the OS when the mouse enters the game window. Implemented on desktop and web platforms. diff --git a/doc/classes/PhysicalBone2D.xml b/doc/classes/PhysicalBone2D.xml new file mode 100644 index 0000000000..cea75bad52 --- /dev/null +++ b/doc/classes/PhysicalBone2D.xml @@ -0,0 +1,49 @@ + + + + A 2D node that can be used for physically aware bones in 2D. + + + The [code]PhysicalBone2D[/code] node is a [RigidBody2D]-based node that can be used to make [Bone2D] nodes in a [Skeleton2D] react to physics. This node is very similar to the [PhysicalBone3D] node, just for 2D instead of 3D. + [b]Note:[/b] To have the Bone2D nodes visually follow the [code]PhysicalBone2D[/code] node, use a [SkeletonModification2DPhysicalBones] modification on the [Skeleton2D] node with the [Bone2D] nodes. + [b]Note:[/b] The PhysicalBone2D node does not automatically create a [Joint2D] node to keep [code]PhysicalBone2D[/code] nodes together. You will need to create these manually. For most cases, you want to use a [PinJoint2D] node. The [code]PhysicalBone2D[/code] node can automatically configure the [Joint2D] node once it's been created as a child node. + + + + + + + + + Returns the first [Joint2D] child node, if one exists. This is mainly a helper function to make it easier to get the [Joint2D] that the [code]PhysicalBone2D[/code] is autoconfiguring. + + + + + + + Returns a boolean that indicates whether the [code]PhysicalBone2D[/code] node is running and simulating using the Godot 2D physics engine. When [code]true[/code], the PhysicalBone2D node is using physics. + + + + + + If [code]true[/code], the [code]PhysicalBone2D[/code] node will automatically configure the first [Joint2D] child node. The automatic configuration is limited to setting up the node properties and positioning the [Joint2D]. + + + The index of the [Bone2D] node that this [code]PhysicalBone2D[/code] node is supposed to be simulating. + + + The [NodePath] to the [Bone2D] node that this [code]PhysicalBone2D[/code] node is supposed to be simulating. + + + If [code]true[/code], the [code]PhysicalBone2D[/code] will keep the transform of the bone it is bound to when simulating physics. + + + If [code]true[/code], the [code]PhysicalBone2D[/code] will start simulating using physics. If [code]false[/code], the [code]PhysicalBone2D[/code] will follow the transform of the [Bone2D] node. + [b]Note:[/b] To have the Bone2D nodes visually follow the [code]PhysicalBone2D[/code] node, use a [SkeletonModification2DPhysicalBones] modification on the [Skeleton2D] node with the [Bone2D] nodes. + + + + + diff --git a/doc/classes/Skeleton2D.xml b/doc/classes/Skeleton2D.xml index 0ddbac9ba4..80db57d7d0 100644 --- a/doc/classes/Skeleton2D.xml +++ b/doc/classes/Skeleton2D.xml @@ -10,6 +10,17 @@ https://docs.godotengine.org/en/latest/tutorials/animation/2d_skeletons.html + + + + + + + + + Executes all the modifications on the [SkeletonModificationStack2D], if the Skeleton3D has one assigned. + + @@ -26,6 +37,22 @@ Returns the number of [Bone2D] nodes in the node hierarchy parented by Skeleton2D. + + + + + + + Returns the local pose override transform for [code]bone_idx[/code]. + + + + + + + Returns the [SkeletonModificationStack2D] attached to this skeleton, if one exists. + + @@ -33,10 +60,37 @@ Returns the [RID] of a Skeleton2D instance. + + + + + + + + + + + + + Sets the local pose transform, [code]pose[/code], for the bone at [code]bone_idx[/code]. + [code]amount[/code] is the interpolation strengh that will be used when applying the pose, and [code]persistent[/code] determines if the applied pose will remain. + [b]Note:[/b] The pose transform needs to be a local transform relative to the [Bone2D] node at [code]bone_idx[/code]! + + + + + + + + + Sets the [SkeletonModificationStack2D] attached to this skeleton. + + + Emitted when the [Bone2D] setup attached to this skeletons changes. This is primarily used internally within the skeleton. diff --git a/doc/classes/SkeletonModification2D.xml b/doc/classes/SkeletonModification2D.xml new file mode 100644 index 0000000000..8596dac76e --- /dev/null +++ b/doc/classes/SkeletonModification2D.xml @@ -0,0 +1,104 @@ + + + + A resource that operates on [Bone2D] nodes in a [Skeleton2D]. + + + This resource provides an interface that can be expanded so code that operates on [Bone2D] nodes in a [Skeleton2D] can be mixed and matched together to create complex interactions. + This is used to provide Godot with a flexible and powerful Inverse Kinematics solution that can be adapted for many different uses. + + + + + + + + + Used for drawing [b]editor-only[/b] modification gizmos. This function will only be called in the Godot editor and can be overriden to draw custom gizmos. + [b]Note:[/b] You will need to use the Skeleton2D from [method SkeletonModificationStack2D.get_skeleton] and it's draw functions, as the [SkeletonModification2D] resource cannot draw on its own. + + + + + + + + + Executes the given modification. This is where the modification performs whatever function it is designed to do. + + + + + + + + + Called when the modification is setup. This is where the modification performs initialization. + + + + + + + + + + + + + + + Takes a angle and clamps it so it is within the passed-in [code]min[/code] and [code]max[/code] range. [code]invert[/code] will inversely clamp the angle, clamping it to the range outside of the given bounds. + + + + + + + Returns whether this modification will call [method _draw_editor_gizmo] in the Godot editor to draw modification-specific gizmos. + + + + + + + Returns whether this modification has been successfully setup or not. + + + + + + + Returns the [SkeletonModificationStack2D] that this modification is bound to. Through the modification stack, you can access the Skeleton3D the modification is operating on. + + + + + + + + + Sets whether this modification will call [method _draw_editor_gizmo] in the Godot editor to draw modification-specific gizmos. + + + + + + + + + Manually allows you to set the setup state of the modification. This function should only rarely be used, as the [SkeletonModificationStack2D] the modification is bound to should handle setting the modification up. + + + + + + If [code]true[/code], the modification's [method _execute] function will be called by the [SkeletonModificationStack2D]. + + + The execution mode for the modification. This tells the modification stack when to execute the modification. Some modifications have settings that are only availible in certain execution modes. + + + + + diff --git a/doc/classes/SkeletonModification2DCCDIK.xml b/doc/classes/SkeletonModification2DCCDIK.xml new file mode 100644 index 0000000000..014d366a42 --- /dev/null +++ b/doc/classes/SkeletonModification2DCCDIK.xml @@ -0,0 +1,170 @@ + + + + A modification that uses CCDIK to manipulate a series of bones to reach a target in 2D. + + + This [SkeletonModification2D] uses an algorithm called [b]C[/b]yclic [b]C[/b]oordinate [b]D[/b]escent [b]I[/b]nverse [b]K[/b]inematics, or CCDIK, to maniuplate a chain of bones in a [Skeleton2D] so it reaches a defined target. + CCDIK works by rotating a set of bones, typically called a "bone chain", on a single axis. Each bone is rotated to face the target from the tip (by default), which over a chain of bones allow it to rotate properly to reach the target. Because the bones only rotate on a single axis, CCDIK [i]can[/i] look more robotic than other IK solvers. + [b]Note:[/b] The CCDIK modifier has [code]ccdik_joints[/code], which are the data objects that hold the data for each joint in the CCDIK chain. This is different from a bone! CCDIK joints hold the data needed for each bone in the bone chain used by CCDIK. + CCDIK also fully supports angle constraints, allowing for more control over how a solution is met. + + + + + + + + + + + Returns the [Bone2D] node assigned to the CCDIK joint at [code]joint_idx[/code]. + + + + + + + + + Returns the index of the [Bone2D] node assigned to the CCDIK joint at [code]joint_idx[/code]. + + + + + + + + + Returns whether the CCDIK joint at [code]joint_idx[/code] uses an inverted joint constraint. See [method set_ccdik_joint_constraint_angle_invert] for details. + + + + + + + + + Returns the maximum angle constraint for the joint at [code]joint_idx[/code]. + + + + + + + + + Returns the minimum angle constraint for the joint at [code]joint_idx[/code]. + + + + + + + + + Returns whether angle constraints on the CCDIK joint at [code]joint_idx[/code] are enabled. + + + + + + + + + Returns whether the joint at [code]joint_idx[/code] is set to rotate from the joint, [code]true[/code], or to rotate from the tip, [code]false[/code]. The default is to rotate from the tip. + + + + + + + + + + + Sets the [Bone2D] node assigned to the CCDIK joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets the bone index, [code]bone_index[/code], of the CCDIK joint at [code]joint_idx[/code]. When possible, this will also update the [code]bone2d_node[/code] of the CCDIK joint based on data provided by the linked skeleton. + + + + + + + + + + + Sets whether the CCDIK joint at [code]joint_idx[/code] uses an inverted joint constraint. + An inverted joint constraint only constraints the CCDIK joint to the angles [i]outside of[/i] the inputted minimum and maximum angles. For this reason, it is referred to as an inverted joint constraint, as it constraints the joint to the outside of the inputted values. + + + + + + + + + + + Sets the maximum angle constraint for the joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets the minimum angle constraint for the joint at [code]joint_idx[/code]. + + + + + + + + + + + Determines whether angle constraints on the CCDIK joint at [code]joint_idx[/code] are enabled. When [code]true[/code], constraints will be enabled and taken into account when solving. + + + + + + + + + + + Sets whether the joint at [code]joint_idx[/code] is set to rotate from the joint, [code]true[/code], or to rotate from the tip, [code]false[/code]. + + + + + + The amount of CCDIK joints in the CCDIK modification. + + + The NodePath to the node that is the target for the CCDIK modification. This node is what the CCDIK chain will attempt to rotate the bone chain to. + + + The end position of the CCDIK chain. Typically, this should be a child of a [Bone2D] node attached to the final [Bone2D] in the CCDIK chain. + + + + + diff --git a/doc/classes/SkeletonModification2DFABRIK.xml b/doc/classes/SkeletonModification2DFABRIK.xml new file mode 100644 index 0000000000..62ab34b06f --- /dev/null +++ b/doc/classes/SkeletonModification2DFABRIK.xml @@ -0,0 +1,108 @@ + + + + A modification that uses FABRIK to manipulate a series of [Bone2D] nodes to reach a target. + + + This [SkeletonModification2D] uses an algorithm called [b]F[/b]orward [b]A[/b]nd [b]B[/b]ackward [b]R[/b]eaching [b]I[/b]nverse [b]K[/b]inematics, or FABRIK, to rotate a bone chain so that it reaches a target. + FABRIK works by knowing the positions and lengths of a series of bones, typically called a "bone chain". It first starts by running a forward pass, which places the final bone at the target's position. Then all other bones are moved towards the tip bone, so they stay at the defined bone length away. Then a backwards pass is performed, where the root/first bone in the FABRIK chain is placed back at the origin. then all other bones are moved so they stay at the defined bone length away. This positions the bone chain so that it reaches the target when possible, but all of the bones stay the correct length away from each other. + Because of how FABRIK works, it often gives more natural results than those seen in [SkeletonModification2DCCDIK]. FABRIK also supports angle constraints, which are fully taken into account when solving. + [b]Note:[/b] The FABRIK modifier has [code]fabrik_joints[/code], which are the data objects that hold the data for each joint in the FABRIK chain. This is different from [Bone2D] nodes! FABRIK joints hold the data needed for each [Bone2D] in the bone chain used by FABRIK. + To help control how the FABRIK joints move, a magnet vector can be passed, which can nudge the bones in a certain direction prior to solving, giving a level of control over the final result. + + + + + + + + + + + Returns the [Bone2D] node assigned to the FABRIK joint at [code]joint_idx[/code]. + + + + + + + + + Returns the index of the [Bone2D] node assigned to the FABRIK joint at [code]joint_idx[/code]. + + + + + + + + + Returns the magnet position vector for the joint at [code]joint_idx[/code]. + + + + + + + + + Returns whether the joint is using the target's rotation rather than allowing FABRIK to rotate the joint. This option only applies to the tip/final joint in the chain. + + + + + + + + + + + Sets the [Bone2D] node assigned to the FABRIK joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets the bone index, [code]bone_index[/code], of the FABRIK joint at [code]joint_idx[/code]. When possible, this will also update the [code]bone2d_node[/code] of the FABRIK joint based on data provided by the linked skeleton. + + + + + + + + + + + Sets the magnet position vector for the joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets whether the joint at [code]joint_idx[/code] will use the target node's rotation rather than letting FABRIK rotate the node. + [b]Note:[/b] This option only works for the tip/final joint in the chain. For all other nodes, this option will be ignored. + + + + + + The amount of FABRIK joints in the FABRIK modification. + + + The NodePath to the node that is the target for the FABRIK modification. This node is what the FABRIK chain will attempt to rotate the bone chain to. + + + + + diff --git a/doc/classes/SkeletonModification2DJiggle.xml b/doc/classes/SkeletonModification2DJiggle.xml new file mode 100644 index 0000000000..7f8cf2d4d9 --- /dev/null +++ b/doc/classes/SkeletonModification2DJiggle.xml @@ -0,0 +1,232 @@ + + + + A modification that jiggles [Bone2D] nodes as they move towards a target. + + + This modification moves a series of bones, typically called a bone chain, towards a target. What makes this modification special is that it calculates the velocity and acceleration for each bone in the bone chain, and runs a very light physics-like calculation using the inputted values. This allows the bones to overshoot the target and "jiggle" around. It can be configured to act more like a spring, or sway around like cloth might. + This modification is useful for adding additional motion to things like hair, the edges of clothing, and more. It has several settings to that allow control over how the joint moves when the target moves. + [b]Note:[/b] The Jiggle modifier has [code]jiggle_joints[/code], which are the data objects that hold the data for each joint in the Jiggle chain. This is different from than [Bone2D] nodes! Jiggle joints hold the data needed for each [Bone2D] in the bone chain used by the Jiggle modification. + + + + + + + + + Returns the collision mask used by the Jiggle modifier when collisions are enabled. + + + + + + + + + Returns the [Bone2D] node assigned to the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + Returns the index of the [Bone2D] node assigned to the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + Returns the amount of damping of the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + Returns a [Vector2] representing the amount of gravity the Jiggle joint at [code]joint_idx[/code] is influenced by. + + + + + + + + + Returns the amount of mass of the jiggle joint at [code]joint_idx[/code]. + + + + + + + + + Returns a boolean that indiciates whether the joint at [code]joint_idx[/code] is overriding the default Jiggle joint data defined in the modification. + + + + + + + + + Returns the stiffness of the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + Returns a boolean that indiciates whether the joint at [code]joint_idx[/code] is using gravity or not. + + + + + + + Returns whether the jiggle modifier is taking physics colliders into account when solving. + + + + + + + + + Sets the collision mask that the Jiggle modifier will use when reacting to colliders, if the Jiggle modifier is set to take colliders into account. + + + + + + + + + + + Sets the [Bone2D] node assigned to the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets the bone index, [code]bone_index[/code], of the Jiggle joint at [code]joint_idx[/code]. When possible, this will also update the [code]bone2d_node[/code] of the Jiggle joint based on data provided by the linked skeleton. + + + + + + + + + + + Sets the amount of dampening of the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets the gravity vector of the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets the of mass of the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets whether the Jiggle joint at [code]joint_idx[/code] should override the default Jiggle joint settings. Setting this to [code]true[/code] will make the joint use its own settings rather than the default ones attached to the modification. + + + + + + + + + + + Sets the of stiffness of the Jiggle joint at [code]joint_idx[/code]. + + + + + + + + + + + Sets whether the Jiggle joint at [code]joint_idx[/code] should use gravity. + + + + + + + + + If [code]true[/code], the Jiggle modifier will take colliders into account, keeping them from entering into these collision objects. + + + + + + The default amount of dampening applied to the Jiggle joints, if they are not overriden. Higher values lead to more of the calculated velocity being applied. + + + The default amount of gravity applied to the Jiggle joints, if they are not overriden. + + + The amount of Jiggle joints in the Jiggle modification. + + + The default amount of mass assigned to the Jiggle joints, if they are not overriden. Higher values lead to faster movements and more overshooting. + + + The default amount of stiffness assigned to the Jiggle joints, if they are not overriden. Higher values act more like springs, quickly moving into the correct position. + + + The NodePath to the node that is the target for the Jiggle modification. This node is what the Jiggle chain will attempt to rotate the bone chain to. + + + Whether the gravity vector, [member gravity], should be applied to the Jiggle joints, assuming they are not overriding the default settings. + + + + + diff --git a/doc/classes/SkeletonModification2DLookAt.xml b/doc/classes/SkeletonModification2DLookAt.xml new file mode 100644 index 0000000000..b0fa0e5a01 --- /dev/null +++ b/doc/classes/SkeletonModification2DLookAt.xml @@ -0,0 +1,107 @@ + + + + A modification that rotates a [Bone2D] node to look at a target. + + + This [SkeletonModification2D] rotates a bone to look a target. This is extremely helpful for moving character's head to look at the player, rotating a turret to look at a target, or any other case where you want to make a bone rotate towards something quickly and easily. + + + + + + + + + Returns the amount of additional rotation that is applied after the LookAt modification executes. + + + + + + + Returns whether the constraints to this modification are inverted or not. + + + + + + + Returns the constraint's maximum allowed angle. + + + + + + + Returns the constraint's minimum allowed angle. + + + + + + + Returns [code]true[/code] if the LookAt modification is using constraints. + + + + + + + + + Sets the amount of additional rotation that is to be applied after executing the modification. This allows for offsetting the results by the inputted rotation amount. + + + + + + + + + When [code]true[/code], the modification will use an inverted joint constraint. + An inverted joint constraint only constraints the [Bone2D] to the angles [i]outside of[/i] the inputted minimum and maximum angles. For this reason, it is referred to as an inverted joint constraint, as it constraints the joint to the outside of the inputted values. + + + + + + + + + Sets the constraint's maximum allowed angle. + + + + + + + + + Sets the constraint's minimum allowed angle. + + + + + + + + + Sets whether this modification will use constraints or not. When [code]true[/code], constraints will be applied when solving the LookAt modification. + + + + + + The [Bone2D] node that the modification will operate on. + + + The index of the [Bone2D] node that the modification will oeprate on. + + + The NodePath to the node that is the target for the LookAt modification. This node is what the modification will rotate the [Bone2D] to. + + + + + diff --git a/doc/classes/SkeletonModification2DPhysicalBones.xml b/doc/classes/SkeletonModification2DPhysicalBones.xml new file mode 100644 index 0000000000..d8aaf09a8e --- /dev/null +++ b/doc/classes/SkeletonModification2DPhysicalBones.xml @@ -0,0 +1,68 @@ + + + + A modification that applies the transforms of [PhysicalBone2D] nodes to [Bone2D] nodes. + + + This modification takes the transforms of [PhysicalBone2D] nodes and applies them to [Bone2D] nodes. This allows the [Bone2D] nodes to react to physics thanks to the linked [PhysicalBone2D] nodes. + + + + + + + + + Empties the list of [PhysicalBone2D] nodes and populates it will all [PhysicalBone2D] nodes that are children of the [Skeleton2D]. + + + + + + + + + Returns the [PhysicalBone2D] node at [code]joint_idx[/code]. + + + + + + + + + + + Sets the [PhysicalBone2D] node at [code]joint_idx[/code]. + [b]Note:[/b] This is just the index used for this modification, not the bone index used in the [Skeleton2D]. + + + + + + + + + Tell the [PhysicalBone2D] nodes to start simulating and interacting with the physics world. + Optionally, an array of bone names can be passed to this function, and that will cause only [PhysicalBone2D] nodes with those names to start simulating. + + + + + + + + + Tell the [PhysicalBone2D] nodes to stop simulating and interacting with the physics world. + Optionally, an array of bone names can be passed to this function, and that will cause only [PhysicalBone2D] nodes with those names to stop simulating. + + + + + + The amount of [PhysicalBone2D] nodes linked in this modification. + + + + + diff --git a/doc/classes/SkeletonModification2DStackHolder.xml b/doc/classes/SkeletonModification2DStackHolder.xml new file mode 100644 index 0000000000..313cf81482 --- /dev/null +++ b/doc/classes/SkeletonModification2DStackHolder.xml @@ -0,0 +1,32 @@ + + + + A modification that holds and executes a [SkeletonModificationStack2D]. + + + This [SkeletonModification2D] holds a reference to a [SkeletonModificationStack2D], allowing you to use multiple modification stacks on a single [Skeleton2D]. + [b]Note:[/b] The modifications in the held [SkeletonModificationStack2D] will only be executed if their execution mode matches the execution mode of the SkeletonModification2DStackHolder. + + + + + + + + + Returns the [SkeletonModificationStack2D] that this modification is holding. + + + + + + + + + Sets the [SkeletonModificationStack2D] that this modification is holding. This modification stack will then be executed when this modification is executed. + + + + + + diff --git a/doc/classes/SkeletonModification2DTwoBoneIK.xml b/doc/classes/SkeletonModification2DTwoBoneIK.xml new file mode 100644 index 0000000000..554515556b --- /dev/null +++ b/doc/classes/SkeletonModification2DTwoBoneIK.xml @@ -0,0 +1,94 @@ + + + + A modification that rotates two bones using the law of cosigns to reach the target. + + + This [SkeletonModification2D] uses an algorithm typically called TwoBoneIK. This algorithm works by leveraging the law of cosigns and the lengths of the bones to figure out what rotation the bones currently have, and what rotation they need to make a complete triangle, where the first bone, the second bone, and the target form the three verticies of the triangle. Because the algorithm works by making a triangle, it can only opperate on two bones. + TwoBoneIK is great for arms, legs, and really any joints that can be represented by just two bones that bend to reach a target. This solver is more lightweight than [SkeletonModification2DFABRIK], but gives similar, natural looking results. + + + + + + + + + Returns the [Bone2D] node that is being used as the first bone in the TwoBoneIK modification. + + + + + + + Returns the index of the [Bone2D] node that is being used as the first bone in the TwoBoneIK modification. + + + + + + + Returns the [Bone2D] node that is being used as the second bone in the TwoBoneIK modification. + + + + + + + Returns the index of the [Bone2D] node that is being used as the second bone in the TwoBoneIK modification. + + + + + + + + + Sets the [Bone2D] node that is being used as the first bone in the TwoBoneIK modification. + + + + + + + + + Sets the index of the [Bone2D] node that is being used as the first bone in the TwoBoneIK modification. + + + + + + + + + Sets the [Bone2D] node that is being used as the second bone in the TwoBoneIK modification. + + + + + + + + + Sets the index of the [Bone2D] node that is being used as the second bone in the TwoBoneIK modification. + + + + + + If [code]true[/code], the bones in the modification will blend outward as opposed to inwards when contracting. If [code]false[/code], the bones will bend inwards when contracting. + + + The maximum distance the target can be at. If the target is farther than this distance, the modification will solve as if it's at this maximum distance. When set to [code]0[/code], the modification will solve without distance constraints. + + + The minimum distance the target can be at. If the target is closer than this distance, the modification will solve as if it's at this minimum distance. When set to [code]0[/code], the modification will solve without distance constraints. + + + The NodePath to the node that is the target for the TwoBoneIK modification. This node is what the modification will use when bending the [Bone2D] nodes. + + + + + diff --git a/doc/classes/SkeletonModificationStack2D.xml b/doc/classes/SkeletonModificationStack2D.xml new file mode 100644 index 0000000000..35b899fe08 --- /dev/null +++ b/doc/classes/SkeletonModificationStack2D.xml @@ -0,0 +1,108 @@ + + + + A resource that holds a stack of [SkeletonModification2D]s. + + + This resource is used by the Skeleton and holds a stack of [SkeletonModification2D]s. + This controls the order of the modifications and how they are applied. Modification order is especially important for full-body IK setups, as you need to execute the modifications in the correct order to get the desired results. For example, you want to execute a modification on the spine [i]before[/i] the arms on a humanoid skeleton. + This resource also controls how strongly all of the modifications are applied to the [Skeleton2D]. + + + + + + + + + + + Adds the passed-in [SkeletonModification2D] to the stack. + + + + + + + + + Deletes the [SkeletonModification2D] at the index position [code]mod_idx[/code], if it exists. + + + + + + + + + Enables all [SkeletonModification2D]s in the stack. + + + + + + + + + + + Executes all of the [SkeletonModification2D]s in the stack that use the same execution mode as the passed-in [code]execution_mode[/code], starting from index [code]0[/code] to [member modification_count]. + [b]Note:[/b] The order of the modifications can matter depending on the modifications. For example, modifications on a spine should operate before modifications on the arms in order to get proper results. + + + + + + + Returns a boolean that indiciates whether the modification stack is setup and can execute. + + + + + + + + + Returns the [SkeletonModification2D] at the passed-in index, [code]mod_idx[/code]. + + + + + + + Returns the [Skeleton2D] node that the SkeletonModificationStack2D is bound to. + + + + + + + + + + + Sets the modification at [code]mod_idx[/code] to the passed-in modification, [code]modification[/code]. + + + + + + + Sets up the modification stack so it can execute. This function should be called by [Skeleton2D] and shouldn't be manually called unless you know what you are doing. + + + + + + If [code]true[/code], the modification's in the stack will be called. This is handled automatically through the [Skeleton2D] node. + + + The number of modifications in the stack. + + + The interpolation strength of the modifications in stack. A value of [code]0[/code] will make it where the modifications are not applied, a strength of [code]0.5[/code] will be half applied, and a strength of [code]1[/code] will allow the modifications to be fully applied and override the [Skeleton2D] [Bone2D] poses. + + + + + diff --git a/doc/classes/Transform2D.xml b/doc/classes/Transform2D.xml index e748ceb281..0dbf95376a 100644 --- a/doc/classes/Transform2D.xml +++ b/doc/classes/Transform2D.xml @@ -129,6 +129,16 @@ Returns [code]true[/code] if this transform and [code]transform[/code] are approximately equal, by calling [code]is_equal_approx[/code] on each component. + + + + + + + Returns a copy of the transform rotated such that it's rotation on the X-axis points towards the [code]target[/code] position. + Operations take place in global space. + + @@ -138,33 +148,33 @@ - + - + - + - + - + - + - + - + @@ -210,6 +220,15 @@ Scales the transform by the given scale factor, using matrix multiplication. + + + + + + + Sets the transform's rotation (in radians). + + -- cgit v1.2.3