summaryrefslogtreecommitdiff
path: root/src/lib/eina/eina_matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/eina/eina_matrix.c')
-rw-r--r--src/lib/eina/eina_matrix.c163
1 files changed, 163 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
756EAPI Eina_Bool
757eina_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}