Advertisement
giovani-rubim

transform

Feb 1st, 2020
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {
  2.     const mulMatMat = (m1, m2, r) => {
  3.         const r0 = m1[0x0]*m2[0x0] + m1[0x1]*m2[0x4] + m1[0x2]*m2[0x8] + m1[0x3]*m2[0xc];
  4.         const r1 = m1[0x0]*m2[0x1] + m1[0x1]*m2[0x5] + m1[0x2]*m2[0x9] + m1[0x3]*m2[0xd];
  5.         const r2 = m1[0x0]*m2[0x2] + m1[0x1]*m2[0x6] + m1[0x2]*m2[0xa] + m1[0x3]*m2[0xe];
  6.         const r3 = m1[0x0]*m2[0x3] + m1[0x1]*m2[0x7] + m1[0x2]*m2[0xb] + m1[0x3]*m2[0xf];
  7.         const r4 = m1[0x4]*m2[0x0] + m1[0x5]*m2[0x4] + m1[0x6]*m2[0x8] + m1[0x7]*m2[0xc];
  8.         const r5 = m1[0x4]*m2[0x1] + m1[0x5]*m2[0x5] + m1[0x6]*m2[0x9] + m1[0x7]*m2[0xd];
  9.         const r6 = m1[0x4]*m2[0x2] + m1[0x5]*m2[0x6] + m1[0x6]*m2[0xa] + m1[0x7]*m2[0xe];
  10.         const r7 = m1[0x4]*m2[0x3] + m1[0x5]*m2[0x7] + m1[0x6]*m2[0xb] + m1[0x7]*m2[0xf];
  11.         const r8 = m1[0x8]*m2[0x0] + m1[0x9]*m2[0x4] + m1[0xa]*m2[0x8] + m1[0xb]*m2[0xc];
  12.         const r9 = m1[0x8]*m2[0x1] + m1[0x9]*m2[0x5] + m1[0xa]*m2[0x9] + m1[0xb]*m2[0xd];
  13.         const ra = m1[0x8]*m2[0x2] + m1[0x9]*m2[0x6] + m1[0xa]*m2[0xa] + m1[0xb]*m2[0xe];
  14.         const rb = m1[0x8]*m2[0x3] + m1[0x9]*m2[0x7] + m1[0xa]*m2[0xb] + m1[0xb]*m2[0xf];
  15.         const rc = m1[0xc]*m2[0x0] + m1[0xd]*m2[0x4] + m1[0xe]*m2[0x8] + m1[0xf]*m2[0xc];
  16.         const rd = m1[0xc]*m2[0x1] + m1[0xd]*m2[0x5] + m1[0xe]*m2[0x9] + m1[0xf]*m2[0xd];
  17.         const re = m1[0xc]*m2[0x2] + m1[0xd]*m2[0x6] + m1[0xe]*m2[0xa] + m1[0xf]*m2[0xe];
  18.         r[0xf] = m1[0xc]*m2[0x3] + m1[0xd]*m2[0x7] + m1[0xe]*m2[0xb] + m1[0xf]*m2[0xf];
  19.         r[0xe] = re;
  20.         r[0xd] = rd;
  21.         r[0xc] = rc;
  22.         r[0xb] = rb;
  23.         r[0xa] = ra;
  24.         r[0x9] = r9;
  25.         r[0x8] = r8;
  26.         r[0x7] = r7;
  27.         r[0x6] = r6;
  28.         r[0x5] = r5;
  29.         r[0x4] = r4;
  30.         r[0x3] = r3;
  31.         r[0x2] = r2;
  32.         r[0x1] = r1;
  33.         r[0x0] = r0;
  34.     };
  35.  
  36.     const mulMatVec = (m, v, r) => {
  37.         const r0 = m[0x0]*v[0] + m[0x1]*v[1] + m[0x2]*v[2] + m[0x3]*v[3];
  38.         const r1 = m[0x4]*v[0] + m[0x5]*v[1] + m[0x6]*v[2] + m[0x7]*v[3];
  39.         const r2 = m[0x8]*v[0] + m[0x9]*v[1] + m[0xa]*v[2] + m[0xb]*v[3];
  40.         r[3] = m[0xc]*v[0] + m[0xd]*v[1] + m[0xe]*v[2] + m[0xf]*v[3];
  41.         r[2] = r2;
  42.         r[1] = r1;
  43.         r[0] = r0;
  44.     };
  45.  
  46.     const mixMatMat = (m1, m2, value, r) => {
  47.         value = Math.max(Math.min(value, 1), 0);
  48.         const inv = 1 - value;
  49.         for (let i=16; i--; r[i] = m1[i]*inv + m2[i]*value);
  50.     };
  51.  
  52.     const rotateX = (m, angle, r) => {
  53.         const cos = Math.cos(angle);
  54.         const sin = Math.sin(angle);
  55.         const aux = [
  56.             1,  0 ,   0,  0,
  57.             0, cos, -sin, 0,
  58.             0, sin,  cos, 0,
  59.             0,  0 ,   0 , 1
  60.         ];
  61.         mulMatMat(aux, m, r);
  62.     };
  63.  
  64.     const rotateY = (m, angle, r) => {
  65.         const cos = Math.cos(angle);
  66.         const sin = Math.sin(angle);
  67.         const aux = [
  68.              cos, 0, sin, 0,
  69.               0 , 1,  0 , 0,
  70.             -sin, 0, cos, 0,
  71.               0 , 0,  0 , 1
  72.         ];
  73.         mulMatMat(aux, m, r);
  74.     };
  75.  
  76.     const rotateZ = (m, angle, r) => {
  77.         const cos = Math.cos(angle);
  78.         const sin = Math.sin(angle);
  79.         const aux = [
  80.             cos, -sin, 0, 0,
  81.             sin,  cos, 0, 0,
  82.              0 ,   0 , 1, 0,
  83.              0 ,   0 , 0, 1
  84.         ];
  85.         mulMatMat(aux, m, r);
  86.     };
  87.  
  88.     const scale = (m, x, y, z, r) => {
  89.         const aux = [
  90.             x, 0, 0, 0,
  91.             0, y, 0, 0,
  92.             0, 0, z, 0,
  93.             0, 0, 0, 1
  94.         ];
  95.         mulMatMat(aux, m, r);
  96.     };
  97.  
  98.     class Transform extends Float32Array {
  99.         constructor() {
  100.             super(16);
  101.             this[0x0] = 1;
  102.             this[0x5] = 1;
  103.             this[0xa] = 1;
  104.             this[0xf] = 1;
  105.         }
  106.         clear() {
  107.             this.fill(0);
  108.             this[0x0] = 1;
  109.             this[0x5] = 1;
  110.             this[0xa] = 1;
  111.             this[0xf] = 1;
  112.             return this;
  113.         }
  114.         clone() {
  115.             return new Transform().set(...this);
  116.         }
  117.         set() {
  118.             if (arguments.length === 1) return this.set(...arguments[0]);
  119.             for (let i=16; i--;) this[i] = arguments[i];
  120.             return this;
  121.         }
  122.         apply(other, dst) {
  123.             if (!dst) dst = this;
  124.             mulMatMat(other, this, dst);
  125.             return dst;
  126.         }
  127.         rotateX(angle, dst) {
  128.             if (!dst) dst = this;
  129.             rotateX(this, angle, dst);
  130.             return dst;
  131.         }
  132.         rotateY(angle, dst) {
  133.             if (!dst) dst = this;
  134.             rotateY(this, angle, dst);
  135.             return dst;
  136.         }
  137.         rotateZ(angle, dst) {
  138.             if (!dst) dst = this;
  139.             rotateZ(this, angle, dst);
  140.             return dst;
  141.         }
  142.         rotateXYZ(x, y, z, dst) {
  143.             if (!dst) dst = this;
  144.             this.rotateX(x, dst);
  145.             dst.rotateY(y);
  146.             dst.rotateZ(z);
  147.             return dst;
  148.         }
  149.         translate(x, y, z, dst) {
  150.             if (!dst) dst = this;
  151.             else dst.set(...this);
  152.             dst[0x3] += x;
  153.             dst[0x7] += y;
  154.             dst[0xb] += z;
  155.             return dst;
  156.         }
  157.         scale(x, y, z, dst) {
  158.             if (!dst) dst = this;
  159.             scale(this, x, y, z, dst);
  160.             return dst;
  161.         }
  162.         mix(other, value, dst) {
  163.             if (!dst) dst = this;
  164.             mixMatMat(this, other, value, dst);
  165.             return dst;
  166.         }
  167.         applyTo(vec, dst) {
  168.             if (!dst) dst = vec;
  169.             mulMatVec(this, vec, dst);
  170.             return dst;
  171.         }
  172.     }
  173.     window.Transform = Transform;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement