| 1643 | }; |
| 1644 | |
| 1645 | static void CDrawArmsImpl( |
| 1646 | MovementObject& this_mo, |
| 1647 | RiggedObject& rigged_object, |
| 1648 | Skeleton& skeleton, |
| 1649 | float& breath_amount, |
| 1650 | float& max_speed, |
| 1651 | float& true_max_speed, |
| 1652 | int& idle_type, |
| 1653 | bool& on_ground, |
| 1654 | bool& flip_info_flipping, |
| 1655 | float& threat_amount, |
| 1656 | bool& ledge_info_on_ledge, |
| 1657 | CScriptArray* skeleton_bind_transforms, |
| 1658 | CScriptArray* inv_skeleton_bind_transforms, |
| 1659 | CScriptArray* ik_chain_start_index, |
| 1660 | CScriptArray* ik_chain_elements, |
| 1661 | CScriptArray* ik_chain_length, |
| 1662 | CScriptArray* key_transforms, |
| 1663 | CScriptArray* arm_points, |
| 1664 | CScriptArray* old_arm_points, |
| 1665 | CScriptArray* temp_old_arm_points, |
| 1666 | CScriptArray* bone_children, |
| 1667 | CScriptArray* bone_children_index, |
| 1668 | const BoneTransform& chest_transform, const BoneTransform& l_hand_transform, const BoneTransform& r_hand_transform, int num_frames) { |
| 1669 | // Get relative chest transformation |
| 1670 | int chest_bone = ASIKBoneStart(&skeleton, "torso"); |
| 1671 | BoneTransform chest_frame_matrix = rigged_object.animation_frame_bone_matrices[chest_bone]; |
| 1672 | BoneTransform chest_bind_matrix = *(BoneTransform*)skeleton_bind_transforms->At(chest_bone); |
| 1673 | BoneTransform rel_mat = chest_transform * invert(chest_frame_matrix * chest_bind_matrix); |
| 1674 | |
| 1675 | // Get points in arm IK chain transformed by chest |
| 1676 | float upper_arm_length[2]; |
| 1677 | float upper_arm_weight[2]; |
| 1678 | float lower_arm_length[2]; |
| 1679 | float lower_arm_weight[2]; |
| 1680 | vec3 chain_points[kNumArmPoints * 2]; |
| 1681 | |
| 1682 | for (int right = 0; right < 2; ++right) { |
| 1683 | int chain_start = *(int*)ik_chain_start_index->At(kLeftArmIK + right); |
| 1684 | vec3 hand = GetTransformedBonePoint(&rigged_object, *(int*)ik_chain_elements->At(chain_start + 0), 1); |
| 1685 | vec3 wrist = GetTransformedBonePoint(&rigged_object, *(int*)ik_chain_elements->At(chain_start + 0), 0); |
| 1686 | vec3 elbow = GetTransformedBonePoint(&rigged_object, *(int*)ik_chain_elements->At(chain_start + 2), 0); |
| 1687 | vec3 shoulder = GetTransformedBonePoint(&rigged_object, *(int*)ik_chain_elements->At(chain_start + 4), 0); |
| 1688 | vec3 collar_tip = GetTransformedBonePoint(&rigged_object, *(int*)ik_chain_elements->At(chain_start + 5), 1); |
| 1689 | vec3 collar = GetTransformedBonePoint(&rigged_object, *(int*)ik_chain_elements->At(chain_start + 5), 0); |
| 1690 | |
| 1691 | // Get more metrics about arm lengths |
| 1692 | upper_arm_length[right] = distance(elbow, shoulder); |
| 1693 | lower_arm_length[right] = distance(wrist, elbow); |
| 1694 | |
| 1695 | vec3 mid_low_arm = GetTransformedBonePoint(&rigged_object, *(int*)ik_chain_elements->At(chain_start + 1), 0); |
| 1696 | vec3 mid_up_arm = GetTransformedBonePoint(&rigged_object, *(int*)ik_chain_elements->At(chain_start + 3), 0); |
| 1697 | |
| 1698 | lower_arm_weight[right] = distance(elbow, mid_low_arm) / distance(wrist, elbow); |
| 1699 | upper_arm_weight[right] = distance(shoulder, mid_up_arm) / distance(shoulder, elbow); |
| 1700 | |
| 1701 | BoneTransform world_chest = *(BoneTransform*)key_transforms->At(kChestKey) * *(BoneTransform*)inv_skeleton_bind_transforms->At(*(int*)ik_chain_start_index->At(kTorsoIK)); |
| 1702 | vec3 breathe_dir = world_chest.rotation * normalize(vec3(0.0f, -0.3f, 1.0f)); |
no test coverage detected