on master help sign in
cleanup and completeness of the MJS library
commitc9905f4f64743fa5a8b1135bd2ed38058ba141c6 authorJohn P Mayer Jr <john.p.mayer.jr@gmail.com> dateMon 20 Jan 2014, 16:55 (13 years ago) parenta438d56
3 files changed+104−192
libraries/MJS.elm+97−31 libraries/Native/MJS.js+3−157 tests/test-files/good/Box.elm+4−4
libraries/MJS.elm+97−31
@@ -2,58 +2,124 @@ module MJS where
22
33{-| MJS
44
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+
511-}
612
713import Native.MJS
814
915data V3 = Dummy_V3
10−data M4x4 = Dummy_M4x4
1116
1217v3 : Float -> Float -> Float -> V3
1318v3 = Native.MJS.v3
1419
15−v3add : V3 -> V3 -> V3
16−v3add = Native.MJS.v3add
20+add : V3 -> V3 -> V3
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
1783
18−v3sub : V3 -> V3 -> V3
19−v3sub = Native.MJS.v3sub
84+mulAffine : M4x4 -> M4x4 -> M4x4
85+mulAffine = Native.MJS.m4x4mulAffine
2086
21−v3length : V3 -> Float
22−v3length = Native.MJS.v3length
87+makeRotate : Float -> V3 -> M4x4
88+makeRotate = Native.MJS.m4x4makeRotate
2389
24−v3normalize : V3 -> V3
25−v3normalize = Native.MJS.v3normalize
90+rotate : Float -> V3 -> M4x4 -> M4x4
91+rotate = Native.MJS.m4x4rotate
2692
27−v3scale : V3 -> Float -> V3
28−v3scale = Native.MJS.v3scale
93+makeScale3 : Float -> Float -> Float -> M4x4
94+makeScale3 = Native.MJS.m4x4makeScale3
2995
30−v3dot : V3 -> V3 -> Float
31−v3dot = Native.MJS.v3dot
96+makeScale : V3 -> M4x4
97+makeScale = Native.MJS.m4x4makeScale
3298
33−v3cross : V3 -> V3 -> V3
34−v3cross = Native.MJS.v3cross
99+scaleM3 : Float -> Float -> Float -> M4x4 -> M4x4
100+scaleM3 = Native.MJS.m4x4scale3
35101
36−v3mul4x4 : M4x4 -> V3 -> V3
37−v3mul4x4 = Native.MJS.v3mul4x4
102+scaleM : V3 -> M4x4 -> M4x4
103+scaleM = Native.MJS.m4x4scale
38104
39−m4x4identity : M4x4
40−m4x4identity = Native.MJS.m4x4identity
105+makeTranslate3 : Float -> Float -> Float -> M4x4
106+makeTranslate3 = Native.MJS.m4x4makeTranslate3
41107
42−m4x4mul : M4x4 -> M4x4 -> M4x4
43−m4x4mul = Native.MJS.m4x4mul
108+makeTranslate : V3 -> M4x4
109+makeTranslate = Native.MJS.m4x4makeTranslate
44110
45−m4x4makeRotate : Float -> V3 -> M4x4
46−m4x4makeRotate = Native.MJS.m4x4makeRotate
111+translate3 : Float -> Float -> Float -> M4x4 -> M4x4
112+translate3 = Native.MJS.m4x4translate3
47113
48−m4x4makeTranslate : V3 -> M4x4
49−m4x4makeTranslate = Native.MJS.m4x4makeTranslate
114+translate : V3 -> M4x4 -> M4x4
115+translate = Native.MJS.m4x4translate
50116
51−m4x4makeLookAt : V3 -> V3 -> V3 -> M4x4
52−m4x4makeLookAt = Native.MJS.m4x4makeLookAt
117+makeLookAt : V3 -> V3 -> V3 -> M4x4
118+makeLookAt = Native.MJS.m4x4makeLookAt
53119
54−m4x4makePerspective : Float -> Float -> Float -> Float -> M4x4
55−m4x4makePerspective = Native.MJS.m4x4makePerspective
120+transpose : M4x4 -> M4x4
121+transpose = Native.MJS.m4x4transpose
56122
57123{- Custom constructor for supplying arbitrary x,y,z axis -}
58−m4x4makeCoords : V3 -> V3 -> V3 -> M4x4
59−m4x4makeCoords = Native.MJS.m4x4makeCoords
124+makeBasis : V3 -> V3 -> V3 -> M4x4
125+makeBasis = Native.MJS.m4x4makeBasis
libraries/Native/MJS.js+3−157
@@ -797,7 +797,7 @@ Elm.Native.MJS.make = function(elm) {
797797 };
798798
799799 /*
800− * Function: M4x4.makeOrtho
800+ * Function: M4x4.makeOrtho2D
801801 *
802802 * Creates a matrix for a 2D orthogonal frustum projection with the given parameters.
803803 * znear and zfar are assumed to be -1 and 1, respectively.
@@ -900,79 +900,6 @@ Elm.Native.MJS.make = function(elm) {
900900 return r;
901901 };
902902
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−
976903 /*
977904 * Function: M4x4.mulAffine
978905 *
@@ -1043,74 +970,6 @@ Elm.Native.MJS.make = function(elm) {
1043970 return r;
1044971 };
1045972
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−
1114973 /*
1115974 * Function: M4x4.makeRotate
1116975 *
@@ -1840,7 +1699,7 @@ Elm.Native.MJS.make = function(elm) {
18401699 return r;
18411700 };
18421701
1843− M4x4.makeCoords = function M4x4_makeCoords(vx,vy,vz) {
1702+ M4x4.makeBasis = function M4x4_makeBasis(vx,vy,vz) {
18441703
18451704 var r = new MJS_FLOAT_ARRAY_TYPE(16);
18461705
@@ -1868,7 +1727,6 @@ Elm.Native.MJS.make = function(elm) {
18681727 return {
18691728 V3: V3,
18701729 v3: F3(V3.$),
1871− v3clone: V3.clone,
18721730 v3add: F2(V3.add),
18731731 v3sub: F2(V3.sub),
18741732 v3neg: V3.neg,
@@ -1880,12 +1738,8 @@ Elm.Native.MJS.make = function(elm) {
18801738 v3dot: F2(V3.dot),
18811739 v3cross: F2(V3.cross),
18821740 v3mul4x4: F2(V3.mul4x4),
1883− /*
1884− m4x4: F16(M4x4.$),
1885− */
18861741 M4x4:M4x4,
18871742 m4x4identity: M4x4.identity,
1888− m4x4clone: M4x4.clone,
18891743 m4x4topLeft3x3: M4x4.topLeft3x3,
18901744 m4x4inverseOrthonormal: M4x4.inverseOrthonormal,
18911745 m4x4inverseTo3x3: M4x4.inverseTo3x3,
@@ -1901,23 +1755,15 @@ Elm.Native.MJS.make = function(elm) {
19011755 m4x4makeScale1: M4x4.makeScale1,
19021756 m4x4makeScale: M4x4.makeScale,
19031757 m4x4scale3: F4(M4x4.scale3),
1904− m4x4scale1: F2(M4x4.scale1),
19051758 m4x4scale: F2(M4x4.scale),
19061759 m4x4makeTranslate3: F3(M4x4.makeTranslate3),
1907− m4x4makeTranslate1: M4x4.makeTranslate1,
19081760 m4x4makeTranslate: M4x4.makeTranslate,
19091761 m4x4translate3: F4(M4x4.translate3),
1910− m4x4translate1: F2(M4x4.translate1),
19111762 m4x4translate: F2(M4x4.translate),
19121763 m4x4makeLookAt: F3(M4x4.makeLookAt),
19131764 m4x4transpose: M4x4.transpose,
19141765 m4x4transformPoint: F2(M4x4.transformPoint),
1915− /*
1916− m4x4_transformLine(m, v, r) {
1917− m4x4_transformPointFffine (m, v, r) {
1918− m4x4_transformLineFffine(m, v, r) {
1919− */
1920− m4x4makeCoords: F3(M4x4.makeCoords),
1766+ m4x4makeBasis: F3(M4x4.makeBasis),
19211767 };
19221768
19231769}
tests/test-files/good/Box.elm+4−4
@@ -1,7 +1,7 @@
11
22module Box where
33
4−import MJS (V3,M4x4,v3,m4x4makeRotate,m4x4makePerspective,m4x4makeLookAt,m4x4mul)
4+import MJS (V3,M4x4,v3,makeRotate,makePerspective,makeLookAt,mul)
55import Graphics.WebGL (Program, link, Triangle, zipTriangle, Buffer, bind, Model, encapsulate, webgl)
66import Window(dimensions)
77
@@ -66,15 +66,15 @@ buf : Buffer {pos : V3, color : V3}
6666buf = bind mesh
6767
6868per : M4x4
69−per = m4x4makePerspective 45 1 0.01 100
69+per = makePerspective 45 1 0.01 100
7070
7171cam : 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)
7373
7474angle : Signal Float
7575angle = foldp (\_ n -> n + 0.02) 0 (fps 25)
7676
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
7878
7979draw : Signal [Model]
8080draw = combine [ (encapsulate prog buf) <~ rot ]