on master help sign in
cleanup and completeness of the MJS library
c9905f4John P Mayer Jr
libraries/MJS.elm+97−31
@@ -2,58 +2,124 @@ module MJS where
2
2
3{-| MJS
3{-| MJS
4
4
5+A high performance linear algrbra library using
6+native JS array types. Geared towards 3D graphics
7+and used primarily by the Graphics.WebGL.
8+
9+Both vectors and matrices are immutable.
10+
5-}
11-}
6
12
7import Native.MJS
13import Native.MJS
8
14
9data V3 = Dummy_V3
15data V3 = Dummy_V3
10−data M4x4 = Dummy_M4x4
11
16
12v3 : Float -> Float -> Float -> V3
17v3 : Float -> Float -> Float -> V3
13v3 = Native.MJS.v3
18v3 = Native.MJS.v3
14
19
15−v3add : V3 -> V3 -> V3
20+add : V3 -> V3 -> V3
16−v3add = Native.MJS.v3add
21+add = Native.MJS.v3add
22+
23+sub : V3 -> V3 -> V3
24+sub = Native.MJS.v3sub
25+
26+neg : V3 -> V3
27+neg = Native.MJS.v3neg
28+
29+{- The normalized direction from v1 to v2 -}
30+direction : V3 -> V3 -> V3
31+direction = Native.MJS.v3direction
32+
33+length : V3 -> Float
34+length = Native.MJS.v3length
35+
36+lengthSquared : V3 -> Float
37+lengthSquared = Native.MJS.v3lengthSquared
38+
39+normalize : V3 -> V3
40+normalize = Native.MJS.v3normalize
41+
42+scale : V3 -> Float -> V3
43+scale = Native.MJS.v3scale
44+
45+dot : V3 -> V3 -> Float
46+dot = Native.MJS.v3dot
47+
48+cross : V3 -> V3 -> V3
49+cross = Native.MJS.v3cross
50+
51+data M4x4 = Dummy_M4x4
52+
53+mul4x4 : M4x4 -> V3 -> V3
54+mul4x4 = Native.MJS.v3mul4x4
55+
56+--m4x4 : V3[16] -> M4x4 ?
57+
58+identity : M4x4
59+identity = Native.MJS.m4x4identity
60+
61+--topLeft3x3 : M4x4 -> M3x3 ?
62+
63+{- Assumes that m is orthonormal -}
64+inverseOrthonormal : M4x4 -> M4x4
65+inverseOrthonormal = Native.MJS.m4x4inverseOrthonormal
66+
67+--inverseTo3x3 : M4x4 -> M3x3 ?
68+
69+makeFrustrum : Float -> Float -> Float -> Float -> Float -> Float -> Float -> M4x4
70+makeFrustrum = Native.MJS.m4x4makeFrustrum
71+
72+makePerspective : Float -> Float -> Float -> Float -> M4x4
73+makePerspective = Native.MJS.m4x4makePerspective
74+
75+makeOrtho : Float -> Float -> Float -> Float -> Float -> Float -> Float -> M4x4
76+makeOrtho = Native.MJS.m4x4makeOrtho
77+
78+makeOrtho2D : Float -> Float -> Float -> Float -> M4x4
79+makeOrtho2D = Native.MJS.m4x4makeOrtho2D
80+
81+mul : M4x4 -> M4x4 -> M4x4
82+mul = Native.MJS.m4x4mul
17
83
18−v3sub : V3 -> V3 -> V3
84+mulAffine : M4x4 -> M4x4 -> M4x4
19−v3sub = Native.MJS.v3sub
85+mulAffine = Native.MJS.m4x4mulAffine
20
86
21−v3length : V3 -> Float
87+makeRotate : Float -> V3 -> M4x4
22−v3length = Native.MJS.v3length
88+makeRotate = Native.MJS.m4x4makeRotate
23
89
24−v3normalize : V3 -> V3
90+rotate : Float -> V3 -> M4x4 -> M4x4
25−v3normalize = Native.MJS.v3normalize
91+rotate = Native.MJS.m4x4rotate
26
92
27−v3scale : V3 -> Float -> V3
93+makeScale3 : Float -> Float -> Float -> M4x4
28−v3scale = Native.MJS.v3scale
94+makeScale3 = Native.MJS.m4x4makeScale3
29
95
30−v3dot : V3 -> V3 -> Float
96+makeScale : V3 -> M4x4
31−v3dot = Native.MJS.v3dot
97+makeScale = Native.MJS.m4x4makeScale
32
98
33−v3cross : V3 -> V3 -> V3
99+scaleM3 : Float -> Float -> Float -> M4x4 -> M4x4
34−v3cross = Native.MJS.v3cross
100+scaleM3 = Native.MJS.m4x4scale3
35
101
36−v3mul4x4 : M4x4 -> V3 -> V3
102+scaleM : V3 -> M4x4 -> M4x4
37−v3mul4x4 = Native.MJS.v3mul4x4
103+scaleM = Native.MJS.m4x4scale
38
104
39−m4x4identity : M4x4
105+makeTranslate3 : Float -> Float -> Float -> M4x4
40−m4x4identity = Native.MJS.m4x4identity
106+makeTranslate3 = Native.MJS.m4x4makeTranslate3
41
107
42−m4x4mul : M4x4 -> M4x4 -> M4x4
108+makeTranslate : V3 -> M4x4
43−m4x4mul = Native.MJS.m4x4mul
109+makeTranslate = Native.MJS.m4x4makeTranslate
44
110
45−m4x4makeRotate : Float -> V3 -> M4x4
111+translate3 : Float -> Float -> Float -> M4x4 -> M4x4
46−m4x4makeRotate = Native.MJS.m4x4makeRotate
112+translate3 = Native.MJS.m4x4translate3
47
113
48−m4x4makeTranslate : V3 -> M4x4
114+translate : V3 -> M4x4 -> M4x4
49−m4x4makeTranslate = Native.MJS.m4x4makeTranslate
115+translate = Native.MJS.m4x4translate
50
116
51−m4x4makeLookAt : V3 -> V3 -> V3 -> M4x4
117+makeLookAt : V3 -> V3 -> V3 -> M4x4
52−m4x4makeLookAt = Native.MJS.m4x4makeLookAt
118+makeLookAt = Native.MJS.m4x4makeLookAt
53
119
54−m4x4makePerspective : Float -> Float -> Float -> Float -> M4x4
120+transpose : M4x4 -> M4x4
55−m4x4makePerspective = Native.MJS.m4x4makePerspective
121+transpose = Native.MJS.m4x4transpose
56
122
57{- Custom constructor for supplying arbitrary x,y,z axis -}
123{- Custom constructor for supplying arbitrary x,y,z axis -}
58−m4x4makeCoords : V3 -> V3 -> V3 -> M4x4
124+makeBasis : V3 -> V3 -> V3 -> M4x4
59−m4x4makeCoords = Native.MJS.m4x4makeCoords
125+makeBasis = Native.MJS.m4x4makeBasis
libraries/Native/MJS.js+3−157
@@ -797,7 +797,7 @@ Elm.Native.MJS.make = function(elm) {
797 };
797 };
798
798
799 /*
799 /*
800− * Function: M4x4.makeOrtho
800+ * Function: M4x4.makeOrtho2D
801 *
801 *
802 * Creates a matrix for a 2D orthogonal frustum projection with the given parameters.
802 * Creates a matrix for a 2D orthogonal frustum projection with the given parameters.
803 * znear and zfar are assumed to be -1 and 1, respectively.
803 * znear and zfar are assumed to be -1 and 1, respectively.
@@ -900,79 +900,6 @@ Elm.Native.MJS.make = function(elm) {
900 return r;
900 return r;
901 };
901 };
902
902
903− /*
904− * Function: M4x4.mulOffset
905− *
906− * Performs r' = a * b, where r' is the 16 elements of r starting at element o.
907− *
908− * Parameters:
909− *
910− * a - the first matrix operand
911− * b - the second matrix operand
912− * r - array to store the result in
913− * o - offset into r at which to start storing results
914− *
915− * Returns:
916− *
917− * r
918− */
919− M4x4.mulOffset = function M4x4_mulOffset(a, b, r, o) {
920− //MathUtils_assert(a.length == 16, "a.length == 16");
921− //MathUtils_assert(b.length == 16, "b.length == 16");
922−
923− var a21 = a[1];
924− var a31 = a[2];
925− var a41 = a[3];
926− var a12 = a[4];
927− var a22 = a[5];
928− var a32 = a[6];
929− var a42 = a[7];
930− var a13 = a[8];
931− var a23 = a[9];
932− var a33 = a[10];
933− var a43 = a[11];
934− var a14 = a[12];
935− var a24 = a[13];
936− var a34 = a[14];
937− var a44 = a[15];
938−
939− var b11 = b[0];
940− var b21 = b[1];
941− var b31 = b[2];
942− var b41 = b[3];
943− var b12 = b[4];
944− var b22 = b[5];
945− var b32 = b[6];
946− var b42 = b[7];
947− var b13 = b[8];
948− var b23 = b[9];
949− var b33 = b[10];
950− var b43 = b[11];
951− var b14 = b[12];
952− var b24 = b[13];
953− var b34 = b[14];
954− var b44 = b[15];
955−
956− r[o+0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;
957− r[o+1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;
958− r[o+2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;
959− r[o+3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;
960− r[o+4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;
961− r[o+5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;
962− r[o+6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;
963− r[o+7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;
964− r[o+8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;
965− r[o+9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;
966− r[o+10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;
967− r[o+11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;
968− r[o+12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;
969− r[o+13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;
970− r[o+14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;
971− r[o+15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;
972−
973− return r;
974− };
975−
976 /*
903 /*
977 * Function: M4x4.mulAffine
904 * Function: M4x4.mulAffine
978 *
905 *
@@ -1043,74 +970,6 @@ Elm.Native.MJS.make = function(elm) {
1043 return r;
970 return r;
1044 };
971 };
1045
972
1046− /*
1047− * Function: M4x4.mulAffineOffset
1048− *
1049− * Performs r' = a * b, assuming a and b are affine (elements 3,7,11,15 = 0,0,0,1), where r' is the 16 elements of r starting at element o
1050− *
1051− * Parameters:
1052− *
1053− * a - the first matrix operand
1054− * b - the second matrix operand
1055− * r - array to store the result in
1056− * o - offset into r at which to start storing results
1057− *
1058− * Returns:
1059− *
1060− * r
1061− */
1062− M4x4.mulAffine = function M4x4_mulAffine(a, b, r, o) {
1063− //MathUtils_assert(a.length == 16, "a.length == 16");
1064− //MathUtils_assert(b.length == 16, "b.length == 16");
1065−
1066− if (r == undefined)
1067− r = new MJS_FLOAT_ARRAY_TYPE(16);
1068− var a11 = a[0];
1069− var a21 = a[1];
1070− var a31 = a[2];
1071− var a12 = a[4];
1072− var a22 = a[5];
1073− var a32 = a[6];
1074− var a13 = a[8];
1075− var a23 = a[9];
1076− var a33 = a[10];
1077− var a14 = a[12];
1078− var a24 = a[13];
1079− var a34 = a[14];
1080−
1081− var b11 = b[0];
1082− var b21 = b[1];
1083− var b31 = b[2];
1084− var b12 = b[4];
1085− var b22 = b[5];
1086− var b32 = b[6];
1087− var b13 = b[8];
1088− var b23 = b[9];
1089− var b33 = b[10];
1090− var b14 = b[12];
1091− var b24 = b[13];
1092− var b34 = b[14];
1093−
1094− r[o+0] = a11 * b11 + a12 * b21 + a13 * b31;
1095− r[o+1] = a21 * b11 + a22 * b21 + a23 * b31;
1096− r[o+2] = a31 * b11 + a32 * b21 + a33 * b31;
1097− r[o+3] = 0;
1098− r[o+4] = a11 * b12 + a12 * b22 + a13 * b32;
1099− r[o+5] = a21 * b12 + a22 * b22 + a23 * b32;
1100− r[o+6] = a31 * b12 + a32 * b22 + a33 * b32;
1101− r[o+7] = 0;
1102− r[o+8] = a11 * b13 + a12 * b23 + a13 * b33;
1103− r[o+9] = a21 * b13 + a22 * b23 + a23 * b33;
1104− r[o+10] = a31 * b13 + a32 * b23 + a33 * b33;
1105− r[o+11] = 0;
1106− r[o+12] = a11 * b14 + a12 * b24 + a13 * b34 + a14;
1107− r[o+13] = a21 * b14 + a22 * b24 + a23 * b34 + a24;
1108− r[o+14] = a31 * b14 + a32 * b24 + a33 * b34 + a34;
1109− r[o+15] = 1;
1110−
1111− return r;
1112− };
1113−
1114 /*
973 /*
1115 * Function: M4x4.makeRotate
974 * Function: M4x4.makeRotate
1116 *
975 *
@@ -1840,7 +1699,7 @@ Elm.Native.MJS.make = function(elm) {
1840 return r;
1699 return r;
1841 };
1700 };
1842
1701
1843− M4x4.makeCoords = function M4x4_makeCoords(vx,vy,vz) {
1702+ M4x4.makeBasis = function M4x4_makeBasis(vx,vy,vz) {
1844
1703
1845 var r = new MJS_FLOAT_ARRAY_TYPE(16);
1704 var r = new MJS_FLOAT_ARRAY_TYPE(16);
1846
1705
@@ -1868,7 +1727,6 @@ Elm.Native.MJS.make = function(elm) {
1868 return {
1727 return {
1869 V3: V3,
1728 V3: V3,
1870 v3: F3(V3.$),
1729 v3: F3(V3.$),
1871− v3clone: V3.clone,
1872 v3add: F2(V3.add),
1730 v3add: F2(V3.add),
1873 v3sub: F2(V3.sub),
1731 v3sub: F2(V3.sub),
1874 v3neg: V3.neg,
1732 v3neg: V3.neg,
@@ -1880,12 +1738,8 @@ Elm.Native.MJS.make = function(elm) {
1880 v3dot: F2(V3.dot),
1738 v3dot: F2(V3.dot),
1881 v3cross: F2(V3.cross),
1739 v3cross: F2(V3.cross),
1882 v3mul4x4: F2(V3.mul4x4),
1740 v3mul4x4: F2(V3.mul4x4),
1883− /*
1884− m4x4: F16(M4x4.$),
1885− */
1886 M4x4:M4x4,
1741 M4x4:M4x4,
1887 m4x4identity: M4x4.identity,
1742 m4x4identity: M4x4.identity,
1888− m4x4clone: M4x4.clone,
1889 m4x4topLeft3x3: M4x4.topLeft3x3,
1743 m4x4topLeft3x3: M4x4.topLeft3x3,
1890 m4x4inverseOrthonormal: M4x4.inverseOrthonormal,
1744 m4x4inverseOrthonormal: M4x4.inverseOrthonormal,
1891 m4x4inverseTo3x3: M4x4.inverseTo3x3,
1745 m4x4inverseTo3x3: M4x4.inverseTo3x3,
@@ -1901,23 +1755,15 @@ Elm.Native.MJS.make = function(elm) {
1901 m4x4makeScale1: M4x4.makeScale1,
1755 m4x4makeScale1: M4x4.makeScale1,
1902 m4x4makeScale: M4x4.makeScale,
1756 m4x4makeScale: M4x4.makeScale,
1903 m4x4scale3: F4(M4x4.scale3),
1757 m4x4scale3: F4(M4x4.scale3),
1904− m4x4scale1: F2(M4x4.scale1),
1905 m4x4scale: F2(M4x4.scale),
1758 m4x4scale: F2(M4x4.scale),
1906 m4x4makeTranslate3: F3(M4x4.makeTranslate3),
1759 m4x4makeTranslate3: F3(M4x4.makeTranslate3),
1907− m4x4makeTranslate1: M4x4.makeTranslate1,
1908 m4x4makeTranslate: M4x4.makeTranslate,
1760 m4x4makeTranslate: M4x4.makeTranslate,
1909 m4x4translate3: F4(M4x4.translate3),
1761 m4x4translate3: F4(M4x4.translate3),
1910− m4x4translate1: F2(M4x4.translate1),
1911 m4x4translate: F2(M4x4.translate),
1762 m4x4translate: F2(M4x4.translate),
1912 m4x4makeLookAt: F3(M4x4.makeLookAt),
1763 m4x4makeLookAt: F3(M4x4.makeLookAt),
1913 m4x4transpose: M4x4.transpose,
1764 m4x4transpose: M4x4.transpose,
1914 m4x4transformPoint: F2(M4x4.transformPoint),
1765 m4x4transformPoint: F2(M4x4.transformPoint),
1915− /*
1766+ m4x4makeBasis: F3(M4x4.makeBasis),
1916− m4x4_transformLine(m, v, r) {
1917− m4x4_transformPointFffine (m, v, r) {
1918− m4x4_transformLineFffine(m, v, r) {
1919− */
1920− m4x4makeCoords: F3(M4x4.makeCoords),
1921 };
1767 };
1922
1768
1923}
1769}
tests/test-files/good/Box.elm+4−4
@@ -1,7 +1,7 @@
1
1
2module Box where
2module Box where
3
3
4−import MJS (V3,M4x4,v3,m4x4makeRotate,m4x4makePerspective,m4x4makeLookAt,m4x4mul)
4+import MJS (V3,M4x4,v3,makeRotate,makePerspective,makeLookAt,mul)
5import Graphics.WebGL (Program, link, Triangle, zipTriangle, Buffer, bind, Model, encapsulate, webgl)
5import Graphics.WebGL (Program, link, Triangle, zipTriangle, Buffer, bind, Model, encapsulate, webgl)
6import Window(dimensions)
6import Window(dimensions)
7
7
@@ -66,15 +66,15 @@ buf : Buffer {pos : V3, color : V3}
66buf = bind mesh
66buf = bind mesh
67
67
68per : M4x4
68per : M4x4
69−per = m4x4makePerspective 45 1 0.01 100
69+per = makePerspective 45 1 0.01 100
70
70
71cam : M4x4
71cam : M4x4
72−cam = m4x4makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
72+cam = makeLookAt (v3 0 0 5) (v3 0 0 0) (v3 0 1 0)
73
73
74angle : Signal Float
74angle : Signal Float
75angle = foldp (\_ n -> n + 0.02) 0 (fps 25)
75angle = foldp (\_ n -> n + 0.02) 0 (fps 25)
76
76
77−rot = (\t -> { rot = m4x4mul (m4x4makeRotate (3*t) (v3 0 1 0)) (m4x4makeRotate (2*t) (v3 1 0 0)), per = per, cam = cam }) <~ angle
77+rot = (\t -> { rot = mul (makeRotate (3*t) (v3 0 1 0)) (makeRotate (2*t) (v3 1 0 0)), per = per, cam = cam }) <~ angle
78
78
79draw : Signal [Model]
79draw : Signal [Model]
80draw = combine [ (encapsulate prog buf) <~ rot ]
80draw = combine [ (encapsulate prog buf) <~ rot ]