diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/eina/eina_matrix.c | 163 | ||||
-rw-r--r-- | src/lib/eina/eina_matrix.h | 10 |
2 files changed, 173 insertions, 0 deletions
diff --git a/src/lib/eina/eina_matrix.c b/src/lib/eina/eina_matrix.c index a43c5b2..6219004 100644 --- a/src/lib/eina/eina_matrix.c +++ b/src/lib/eina/eina_matrix.c | |||
@@ -752,3 +752,166 @@ eina_matrix4_normalized(Eina_Matrix4 *out, const Eina_Matrix4 *in) | |||
752 | 752 | ||
753 | return EINA_TRUE; | 753 | return EINA_TRUE; |
754 | } | 754 | } |
755 | |||
756 | EAPI Eina_Bool | ||
757 | eina_matrix4_inverse(Eina_Matrix4 *out, const Eina_Matrix4 *in) | ||
758 | { | ||
759 | double det; | ||
760 | |||
761 | MATRIX_XX(out) = | ||
762 | MATRIX_YY(in) * MATRIX_ZZ(in) * MATRIX_WW(in) | ||
763 | - MATRIX_YY(in) * MATRIX_ZW(in) * MATRIX_WZ(in) | ||
764 | - MATRIX_ZY(in) * MATRIX_YZ(in) * MATRIX_WW(in) | ||
765 | + MATRIX_ZY(in) * MATRIX_YW(in) * MATRIX_WZ(in) | ||
766 | + MATRIX_WY(in) * MATRIX_YZ(in) * MATRIX_ZW(in) | ||
767 | - MATRIX_WY(in) * MATRIX_YW(in) * MATRIX_ZZ(in); | ||
768 | |||
769 | MATRIX_YX(out) = | ||
770 | - MATRIX_YX(in) * MATRIX_ZZ(in) * MATRIX_WW(in) | ||
771 | + MATRIX_YX(in) * MATRIX_ZW(in) * MATRIX_WZ(in) | ||
772 | + MATRIX_ZX(in) * MATRIX_YZ(in) * MATRIX_WW(in) | ||
773 | - MATRIX_ZX(in) * MATRIX_YW(in) * MATRIX_WZ(in) | ||
774 | - MATRIX_WX(in) * MATRIX_YZ(in) * MATRIX_ZW(in) | ||
775 | + MATRIX_WX(in) * MATRIX_YW(in) * MATRIX_ZZ(in); | ||
776 | |||
777 | MATRIX_ZX(out) = | ||
778 | MATRIX_YX(in) * MATRIX_ZY(in) * MATRIX_WW(in) | ||
779 | - MATRIX_YX(in) * MATRIX_ZW(in) * MATRIX_WY(in) | ||
780 | - MATRIX_ZX(in) * MATRIX_YY(in) * MATRIX_WW(in) | ||
781 | + MATRIX_ZX(in) * MATRIX_YW(in) * MATRIX_WY(in) | ||
782 | + MATRIX_WX(in) * MATRIX_YY(in) * MATRIX_ZW(in) | ||
783 | - MATRIX_WX(in) * MATRIX_YW(in) * MATRIX_ZY(in); | ||
784 | |||
785 | MATRIX_WX(out) = | ||
786 | - MATRIX_YX(in) * MATRIX_ZY(in) * MATRIX_WZ(in) | ||
787 | + MATRIX_YX(in) * MATRIX_ZZ(in) * MATRIX_WY(in) | ||
788 | + MATRIX_ZX(in) * MATRIX_YY(in) * MATRIX_WZ(in) | ||
789 | - MATRIX_ZX(in) * MATRIX_YZ(in) * MATRIX_WY(in) | ||
790 | - MATRIX_WX(in) * MATRIX_YY(in) * MATRIX_ZZ(in) | ||
791 | + MATRIX_WX(in) * MATRIX_YZ(in) * MATRIX_ZY(in); | ||
792 | |||
793 | MATRIX_XY(out) = | ||
794 | - MATRIX_XY(in) * MATRIX_ZZ(in) * MATRIX_WW(in) | ||
795 | + MATRIX_XY(in) * MATRIX_ZW(in) * MATRIX_WZ(in) | ||
796 | + MATRIX_ZY(in) * MATRIX_XZ(in) * MATRIX_WW(in) | ||
797 | - MATRIX_ZY(in) * MATRIX_XW(in) * MATRIX_WZ(in) | ||
798 | - MATRIX_WY(in) * MATRIX_XZ(in) * MATRIX_ZW(in) | ||
799 | + MATRIX_WY(in) * MATRIX_XW(in) * MATRIX_ZZ(in); | ||
800 | |||
801 | MATRIX_YY(out) = | ||
802 | MATRIX_XX(in) * MATRIX_ZZ(in) * MATRIX_WW(in) | ||
803 | - MATRIX_XX(in) * MATRIX_ZW(in) * MATRIX_WZ(in) | ||
804 | - MATRIX_ZX(in) * MATRIX_XZ(in) * MATRIX_WW(in) | ||
805 | + MATRIX_ZX(in) * MATRIX_XW(in) * MATRIX_WZ(in) | ||
806 | + MATRIX_WX(in) * MATRIX_XZ(in) * MATRIX_ZW(in) | ||
807 | - MATRIX_WX(in) * MATRIX_XW(in) * MATRIX_ZZ(in); | ||
808 | |||
809 | MATRIX_ZY(out) = | ||
810 | - MATRIX_XX(in) * MATRIX_ZY(in) * MATRIX_WW(in) | ||
811 | + MATRIX_XX(in) * MATRIX_ZW(in) * MATRIX_WY(in) | ||
812 | + MATRIX_ZX(in) * MATRIX_XY(in) * MATRIX_WW(in) | ||
813 | - MATRIX_ZX(in) * MATRIX_XW(in) * MATRIX_WY(in) | ||
814 | - MATRIX_WX(in) * MATRIX_XY(in) * MATRIX_ZW(in) | ||
815 | + MATRIX_WX(in) * MATRIX_XW(in) * MATRIX_ZY(in); | ||
816 | |||
817 | MATRIX_WY(out) = | ||
818 | MATRIX_XX(in) * MATRIX_ZY(in) * MATRIX_WZ(in) | ||
819 | - MATRIX_XX(in) * MATRIX_ZZ(in) * MATRIX_WY(in) | ||
820 | - MATRIX_ZX(in) * MATRIX_XY(in) * MATRIX_WZ(in) | ||
821 | + MATRIX_ZX(in) * MATRIX_XZ(in) * MATRIX_WY(in) | ||
822 | + MATRIX_WX(in) * MATRIX_XY(in) * MATRIX_ZZ(in) | ||
823 | - MATRIX_WX(in) * MATRIX_XZ(in) * MATRIX_ZY(in); | ||
824 | |||
825 | MATRIX_XZ(out) = | ||
826 | MATRIX_XY(in) * MATRIX_YZ(in) * MATRIX_WW(in) | ||
827 | - MATRIX_XY(in) * MATRIX_YW(in) * MATRIX_WZ(in) | ||
828 | - MATRIX_YY(in) * MATRIX_XZ(in) * MATRIX_WW(in) | ||
829 | + MATRIX_YY(in) * MATRIX_XW(in) * MATRIX_WZ(in) | ||
830 | + MATRIX_WY(in) * MATRIX_XZ(in) * MATRIX_YW(in) | ||
831 | - MATRIX_WY(in) * MATRIX_XW(in) * MATRIX_YZ(in); | ||
832 | |||
833 | MATRIX_YZ(out) = | ||
834 | - MATRIX_XX(in) * MATRIX_YZ(in) * MATRIX_WW(in) | ||
835 | + MATRIX_XX(in) * MATRIX_YW(in) * MATRIX_WZ(in) | ||
836 | + MATRIX_YX(in) * MATRIX_XZ(in) * MATRIX_WW(in) | ||
837 | - MATRIX_YX(in) * MATRIX_XW(in) * MATRIX_WZ(in) | ||
838 | - MATRIX_WX(in) * MATRIX_XZ(in) * MATRIX_YW(in) | ||
839 | + MATRIX_WX(in) * MATRIX_XW(in) * MATRIX_YZ(in); | ||
840 | |||
841 | MATRIX_ZZ(out) = | ||
842 | MATRIX_XX(in) * MATRIX_YY(in) * MATRIX_WW(in) | ||
843 | - MATRIX_XX(in) * MATRIX_YW(in) * MATRIX_WY(in) | ||
844 | - MATRIX_YX(in) * MATRIX_XY(in) * MATRIX_WW(in) | ||
845 | + MATRIX_YX(in) * MATRIX_XW(in) * MATRIX_WY(in) | ||
846 | + MATRIX_WX(in) * MATRIX_XY(in) * MATRIX_YW(in) | ||
847 | - MATRIX_WX(in) * MATRIX_XW(in) * MATRIX_YY(in); | ||
848 | |||
849 | MATRIX_WZ(out) = | ||
850 | - MATRIX_XX(in) * MATRIX_YY(in) * MATRIX_WZ(in) | ||
851 | + MATRIX_XX(in) * MATRIX_YZ(in) * MATRIX_WY(in) | ||
852 | + MATRIX_YX(in) * MATRIX_XY(in) * MATRIX_WZ(in) | ||
853 | - MATRIX_YX(in) * MATRIX_XZ(in) * MATRIX_WY(in) | ||
854 | - MATRIX_WX(in) * MATRIX_XY(in) * MATRIX_YZ(in) | ||
855 | + MATRIX_WX(in) * MATRIX_XZ(in) * MATRIX_YY(in); | ||
856 | |||
857 | MATRIX_XW(out) = | ||
858 | - MATRIX_XY(in) * MATRIX_YZ(in) * MATRIX_ZW(in) | ||
859 | + MATRIX_XY(in) * MATRIX_YW(in) * MATRIX_ZZ(in) | ||
860 | + MATRIX_YY(in) * MATRIX_XZ(in) * MATRIX_ZW(in) | ||
861 | - MATRIX_YY(in) * MATRIX_XW(in) * MATRIX_ZZ(in) | ||
862 | - MATRIX_ZY(in) * MATRIX_XZ(in) * MATRIX_YW(in) | ||
863 | + MATRIX_ZY(in) * MATRIX_XW(in) * MATRIX_YZ(in); | ||
864 | |||
865 | MATRIX_YW(out) = | ||
866 | MATRIX_XX(in) * MATRIX_YZ(in) * MATRIX_ZW(in) | ||
867 | - MATRIX_XX(in) * MATRIX_YW(in) * MATRIX_ZZ(in) | ||
868 | - MATRIX_YX(in) * MATRIX_XZ(in) * MATRIX_ZW(in) | ||
869 | + MATRIX_YX(in) * MATRIX_XW(in) * MATRIX_ZZ(in) | ||
870 | + MATRIX_ZX(in) * MATRIX_XZ(in) * MATRIX_YW(in) | ||
871 | - MATRIX_ZX(in) * MATRIX_XW(in) * MATRIX_YZ(in); | ||
872 | |||
873 | MATRIX_ZW(out) = | ||
874 | - MATRIX_XX(in) * MATRIX_YY(in) * MATRIX_ZW(in) | ||
875 | + MATRIX_XX(in) * MATRIX_YW(in) * MATRIX_ZY(in) | ||
876 | + MATRIX_YX(in) * MATRIX_XY(in) * MATRIX_ZW(in) | ||
877 | - MATRIX_YX(in) * MATRIX_XW(in) * MATRIX_ZY(in) | ||
878 | - MATRIX_ZX(in) * MATRIX_XY(in) * MATRIX_YW(in) | ||
879 | + MATRIX_ZX(in) * MATRIX_XW(in) * MATRIX_YY(in); | ||
880 | |||
881 | MATRIX_WW(out) = | ||
882 | MATRIX_XX(in) * MATRIX_YY(in) * MATRIX_ZZ(in) | ||
883 | - MATRIX_XX(in) * MATRIX_YZ(in) * MATRIX_ZY(in) | ||
884 | - MATRIX_YX(in) * MATRIX_XY(in) * MATRIX_ZZ(in) | ||
885 | + MATRIX_YX(in) * MATRIX_XZ(in) * MATRIX_ZY(in) | ||
886 | + MATRIX_ZX(in) * MATRIX_XY(in) * MATRIX_YZ(in) | ||
887 | - MATRIX_ZX(in) * MATRIX_XZ(in) * MATRIX_YY(in); | ||
888 | |||
889 | det = | ||
890 | MATRIX_XX(in) * MATRIX_XX(out) | ||
891 | + MATRIX_XY(in) * MATRIX_YX(out) | ||
892 | + MATRIX_XZ(in) * MATRIX_ZX(out) | ||
893 | + MATRIX_XW(in) * MATRIX_WX(out); | ||
894 | |||
895 | if (fabs(det) < DBL_EPSILON) return EINA_FALSE; | ||
896 | |||
897 | det = 1.0 / det; | ||
898 | |||
899 | MATRIX_XX(out) = MATRIX_XX(out) * det; | ||
900 | MATRIX_XY(out) = MATRIX_XY(out) * det; | ||
901 | MATRIX_XZ(out) = MATRIX_XZ(out) * det; | ||
902 | MATRIX_XW(out) = MATRIX_XW(out) * det; | ||
903 | MATRIX_YX(out) = MATRIX_YX(out) * det; | ||
904 | MATRIX_YY(out) = MATRIX_YY(out) * det; | ||
905 | MATRIX_YZ(out) = MATRIX_YZ(out) * det; | ||
906 | MATRIX_YW(out) = MATRIX_YW(out) * det; | ||
907 | MATRIX_ZX(out) = MATRIX_ZX(out) * det; | ||
908 | MATRIX_ZY(out) = MATRIX_ZY(out) * det; | ||
909 | MATRIX_ZZ(out) = MATRIX_ZZ(out) * det; | ||
910 | MATRIX_ZW(out) = MATRIX_ZW(out) * det; | ||
911 | MATRIX_WX(out) = MATRIX_WX(out) * det; | ||
912 | MATRIX_WY(out) = MATRIX_WY(out) * det; | ||
913 | MATRIX_WZ(out) = MATRIX_WZ(out) * det; | ||
914 | MATRIX_WW(out) = MATRIX_WW(out) * det; | ||
915 | |||
916 | return EINA_TRUE; | ||
917 | } | ||
diff --git a/src/lib/eina/eina_matrix.h b/src/lib/eina/eina_matrix.h index bf02f17..1f11be3 100644 --- a/src/lib/eina/eina_matrix.h +++ b/src/lib/eina/eina_matrix.h | |||
@@ -538,6 +538,16 @@ EAPI double eina_matrix4_determinant(const Eina_Matrix4 *m); | |||
538 | EAPI Eina_Bool eina_matrix4_normalized(Eina_Matrix4 *out, | 538 | EAPI Eina_Bool eina_matrix4_normalized(Eina_Matrix4 *out, |
539 | const Eina_Matrix4 *in); | 539 | const Eina_Matrix4 *in); |
540 | 540 | ||
541 | /** | ||
542 | * @brief Return the inverse of the given matrix. | ||
543 | * | ||
544 | * @param out The inverse matrix | ||
545 | * @param in The matrix. | ||
546 | * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise. | ||
547 | * | ||
548 | * @since 1.15 | ||
549 | */ | ||
550 | EAPI Eina_Bool eina_matrix4_inverse(Eina_Matrix4 *out, const Eina_Matrix4 *in); | ||
541 | 551 | ||
542 | /** | 552 | /** |
543 | * @brief Convert an Eina_Matrix4 into an Eina_Matrix3. | 553 | * @brief Convert an Eina_Matrix4 into an Eina_Matrix3. |