| 730 | } |
| 731 | |
| 732 | void DelAlignLaraToRope(ItemInfo* item) |
| 733 | { |
| 734 | ROPE_STRUCT* rope; |
| 735 | short ropeY; |
| 736 | Vector3i vec, vec2, vec3, vec4, vec5, pos, pos2, diff, diff2; |
| 737 | int matrix[12]; |
| 738 | short angle[3]; |
| 739 | |
| 740 | vec.x = 4096; |
| 741 | vec.y = 0; |
| 742 | vec.z = 0; |
| 743 | |
| 744 | const auto& offset = GetClosestKeyframe(*item).RootOffset; |
| 745 | ropeY = Lara.Control.Rope.Y - ANGLE(90.0f); |
| 746 | rope = &Ropes[Lara.Control.Rope.Ptr]; |
| 747 | |
| 748 | GetRopePos(rope, ((Lara.Control.Rope.Segment - 1) << 7) + offset.y, &pos.x, &pos.y, &pos.z); |
| 749 | GetRopePos(rope, ((Lara.Control.Rope.Segment - 1) << 7) + offset.y - 192, &pos2.x, &pos2.y, &pos2.z); |
| 750 | |
| 751 | diff.x = (pos.x - pos2.x) << 16; |
| 752 | diff.y = (pos.y - pos2.y) << 16; |
| 753 | diff.z = (pos.z - pos2.z) << 16; |
| 754 | NormaliseRopeVector(&diff); |
| 755 | diff.x >>= 2; |
| 756 | diff.y >>= 2; |
| 757 | diff.z >>= 2; |
| 758 | ScaleVector(&diff, DotProduct(&vec, &diff), &vec2); |
| 759 | vec2.x = vec.x - vec2.x; |
| 760 | vec2.y = vec.y - vec2.y; |
| 761 | vec2.z = vec.z - vec2.z; |
| 762 | |
| 763 | vec3.x = vec2.x; |
| 764 | vec3.y = vec2.y; |
| 765 | vec3.z = vec2.z; |
| 766 | vec4.x = vec2.x; |
| 767 | vec4.y = vec2.y; |
| 768 | vec4.z = vec2.z; |
| 769 | |
| 770 | diff2.x = diff.x; |
| 771 | diff2.y = diff.y; |
| 772 | diff2.z = diff.z; |
| 773 | |
| 774 | ScaleVector(&vec3, 16384 * phd_cos(ropeY), &vec3); |
| 775 | ScaleVector(&diff2, DotProduct(&diff2, &vec2), &diff2); |
| 776 | ScaleVector(&diff2, 4096 - 16384 * phd_cos(ropeY), &diff2); |
| 777 | |
| 778 | CrossProduct(&diff, &vec2, &vec4); |
| 779 | ScaleVector(&vec4, 16384 * phd_sin(ropeY), &vec4); |
| 780 | diff2.x += vec3.x; |
| 781 | diff2.y += vec3.y; |
| 782 | diff2.z += vec3.z; |
| 783 | |
| 784 | vec2.x = (diff2.x + vec4.x) << 16; |
| 785 | vec2.y = (diff2.y + vec4.y) << 16; |
| 786 | vec2.z = (diff2.z + vec4.z) << 16; |
| 787 | NormaliseRopeVector(&vec2); |
| 788 | vec2.x >>= 2; |
| 789 | vec2.y >>= 2; |
no test coverage detected