Advertisement
Guest User

c3ga Complex Sphere

a guest
Mar 23rd, 2021
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #version 430
  2.  
  3. in vec2 vTexCoords;
  4. uniform float uAspectRatio;
  5. uniform vec3 uCamX;
  6. uniform vec3 uCamY;
  7. uniform vec3 uCamZ;
  8. uniform vec3 uCamPos;
  9. uniform float uFocalLength;
  10.  
  11. uniform float uTime;
  12.  
  13. // --------
  14. // C3GA implementation adapted from ganja : https://github.com/enkimute/ganja.js/blob/master/codegen/cpp/cga.cpp
  15. // --------
  16.  
  17. struct Mvec {
  18.     float c0;
  19.     float c1;
  20.     float c2;
  21.     float c3;
  22.     float c4;
  23.     float c5;
  24.     float c6;
  25.     float c7;
  26.     float c8;
  27.     float c9;
  28.     float c10;
  29.     float c11;
  30.     float c12;
  31.     float c13;
  32.     float c14;
  33.     float c15;
  34.     float c16;
  35.     float c17;
  36.     float c18;
  37.     float c19;
  38.     float c20;
  39.     float c21;
  40.     float c22;
  41.     float c23;
  42.     float c24;
  43.     float c25;
  44.     float c26;
  45.     float c27;
  46.     float c28;
  47.     float c29;
  48.     float c30;
  49.     float c31;
  50. };
  51.  
  52. //***********************
  53. // CGA.Reverse
  54. // Reverses the order of the basis blades.
  55. //***********************
  56. Mvec reverse(Mvec a) {
  57.     Mvec res;
  58.     res.c0  =  a.c0;
  59.     res.c1  =  a.c1;
  60.     res.c2  =  a.c2;
  61.     res.c3  =  a.c3;
  62.     res.c4  =  a.c4;
  63.     res.c5  =  a.c5;
  64.     res.c6  = -a.c6;
  65.     res.c7  = -a.c7;
  66.     res.c8  = -a.c8;
  67.     res.c9  = -a.c9;
  68.     res.c10 = -a.c10;
  69.     res.c11 = -a.c11;
  70.     res.c12 = -a.c12;
  71.     res.c13 = -a.c13;
  72.     res.c14 = -a.c14;
  73.     res.c15 = -a.c15;
  74.     res.c16 = -a.c16;
  75.     res.c17 = -a.c17;
  76.     res.c18 = -a.c18;
  77.     res.c19 = -a.c19;
  78.     res.c20 = -a.c20;
  79.     res.c21 = -a.c21;
  80.     res.c22 = -a.c22;
  81.     res.c23 = -a.c23;
  82.     res.c24 = -a.c24;
  83.     res.c25 = -a.c25;
  84.     res.c26 =  a.c26;
  85.     res.c27 =  a.c27;
  86.     res.c28 =  a.c28;
  87.     res.c29 =  a.c29;
  88.     res.c30 =  a.c30;
  89.     res.c31 =  a.c31;
  90.     return res;
  91. }
  92.  
  93.  
  94. //***********************
  95. // CGA.Dual
  96. // Poincare duality operator.
  97. //***********************
  98. Mvec dual(Mvec a) {
  99.   Mvec res;
  100.   res.c0=-a.c31;
  101.   res.c1=-a.c30;
  102.   res.c2=a.c29;
  103.   res.c3=-a.c28;
  104.   res.c4=a.c27;
  105.   res.c5=a.c26;
  106.   res.c6=a.c25;
  107.   res.c7=-a.c24;
  108.   res.c8=a.c23;
  109.   res.c9=a.c22;
  110.   res.c10=a.c21;
  111.   res.c11=-a.c20;
  112.   res.c12=-a.c19;
  113.   res.c13=a.c18;
  114.   res.c14=a.c17;
  115.   res.c15=-a.c16;
  116.   res.c16=a.c15;
  117.   res.c17=-a.c14;
  118.   res.c18=-a.c13;
  119.   res.c19=a.c12;
  120.   res.c20=a.c11;
  121.   res.c21=-a.c10;
  122.   res.c22=-a.c9;
  123.   res.c23=-a.c8;
  124.   res.c24=a.c7;
  125.   res.c25=-a.c6;
  126.   res.c26=-a.c5;
  127.   res.c27=-a.c4;
  128.   res.c28=a.c3;
  129.   res.c29=-a.c2;
  130.   res.c30=a.c1;
  131.   res.c31=a.c0;
  132.   return res;
  133. }
  134.  
  135. //***********************
  136. // CGA.Conjugate : res = a.Conjugate()
  137. // Clifford Conjugation
  138. //***********************
  139. Mvec conjugate(Mvec a) {
  140.   Mvec res;
  141.   res.c0=a.c0;
  142.   res.c1=-a.c1;
  143.   res.c2=-a.c2;
  144.   res.c3=-a.c3;
  145.   res.c4=-a.c4;
  146.   res.c5=-a.c5;
  147.   res.c6=-a.c6;
  148.   res.c7=-a.c7;
  149.   res.c8=-a.c8;
  150.   res.c9=-a.c9;
  151.   res.c10=-a.c10;
  152.   res.c11=-a.c11;
  153.   res.c12=-a.c12;
  154.   res.c13=-a.c13;
  155.   res.c14=-a.c14;
  156.   res.c15=-a.c15;
  157.   res.c16=a.c16;
  158.   res.c17=a.c17;
  159.   res.c18=a.c18;
  160.   res.c19=a.c19;
  161.   res.c20=a.c20;
  162.   res.c21=a.c21;
  163.   res.c22=a.c22;
  164.   res.c23=a.c23;
  165.   res.c24=a.c24;
  166.   res.c25=a.c25;
  167.   res.c26=a.c26;
  168.   res.c27=a.c27;
  169.   res.c28=a.c28;
  170.   res.c29=a.c29;
  171.   res.c30=a.c30;
  172.   res.c31=-a.c31;
  173.   return res;
  174. }
  175.  
  176. //***********************
  177. // CGA.Involute : res = a.Involute()
  178. // Main involution
  179. //***********************
  180. Mvec involute(Mvec a) {
  181.   Mvec res;
  182.   res.c0=a.c0;
  183.   res.c1=-a.c1;
  184.   res.c2=-a.c2;
  185.   res.c3=-a.c3;
  186.   res.c4=-a.c4;
  187.   res.c5=-a.c5;
  188.   res.c6=a.c6;
  189.   res.c7=a.c7;
  190.   res.c8=a.c8;
  191.   res.c9=a.c9;
  192.   res.c10=a.c10;
  193.   res.c11=a.c11;
  194.   res.c12=a.c12;
  195.   res.c13=a.c13;
  196.   res.c14=a.c14;
  197.   res.c15=a.c15;
  198.   res.c16=-a.c16;
  199.   res.c17=-a.c17;
  200.   res.c18=-a.c18;
  201.   res.c19=-a.c19;
  202.   res.c20=-a.c20;
  203.   res.c21=-a.c21;
  204.   res.c22=-a.c22;
  205.   res.c23=-a.c23;
  206.   res.c24=-a.c24;
  207.   res.c25=-a.c25;
  208.   res.c26=a.c26;
  209.   res.c27=a.c27;
  210.   res.c28=a.c28;
  211.   res.c29=a.c29;
  212.   res.c30=a.c30;
  213.   res.c31=-a.c31;
  214.   return res;
  215. }
  216.  
  217. //***********************
  218. // CGA.Mul : res = a * b
  219. // The geometric product.
  220. //***********************
  221. Mvec mul(Mvec a, Mvec b) {
  222.   Mvec res;
  223.   res.c0=b.c0*a.c0+b.c1*a.c1+b.c2*a.c2+b.c3*a.c3+b.c4*a.c4-b.c5*a.c5-b.c6*a.c6-b.c7*a.c7-b.c8*a.c8+b.c9*a.c9-b.c10*a.c10-b.c11*a.c11+b.c12*a.c12-b.c13*a.c13+b.c14*a.c14+b.c15*a.c15-b.c16*a.c16-b.c17*a.c17+b.c18*a.c18-b.c19*a.c19+b.c20*a.c20+b.c21*a.c21-b.c22*a.c22+b.c23*a.c23+b.c24*a.c24+b.c25*a.c25+b.c26*a.c26-b.c27*a.c27-b.c28*a.c28-b.c29*a.c29-b.c30*a.c30-b.c31*a.c31;
  224.   res.c1=b.c1*a.c0+b.c0*a.c1-b.c6*a.c2-b.c7*a.c3-b.c8*a.c4+b.c9*a.c5+b.c2*a.c6+b.c3*a.c7+b.c4*a.c8-b.c5*a.c9-b.c16*a.c10-b.c17*a.c11+b.c18*a.c12-b.c19*a.c13+b.c20*a.c14+b.c21*a.c15-b.c10*a.c16-b.c11*a.c17+b.c12*a.c18-b.c13*a.c19+b.c14*a.c20+b.c15*a.c21+b.c26*a.c22-b.c27*a.c23-b.c28*a.c24-b.c29*a.c25-b.c22*a.c26+b.c23*a.c27+b.c24*a.c28+b.c25*a.c29-b.c31*a.c30-b.c30*a.c31;
  225.   res.c2=b.c2*a.c0+b.c6*a.c1+b.c0*a.c2-b.c10*a.c3-b.c11*a.c4+b.c12*a.c5-b.c1*a.c6+b.c16*a.c7+b.c17*a.c8-b.c18*a.c9+b.c3*a.c10+b.c4*a.c11-b.c5*a.c12-b.c22*a.c13+b.c23*a.c14+b.c24*a.c15+b.c7*a.c16+b.c8*a.c17-b.c9*a.c18-b.c26*a.c19+b.c27*a.c20+b.c28*a.c21-b.c13*a.c22+b.c14*a.c23+b.c15*a.c24-b.c30*a.c25+b.c19*a.c26-b.c20*a.c27-b.c21*a.c28+b.c31*a.c29+b.c25*a.c30+b.c29*a.c31;
  226.   res.c3=b.c3*a.c0+b.c7*a.c1+b.c10*a.c2+b.c0*a.c3-b.c13*a.c4+b.c14*a.c5-b.c16*a.c6-b.c1*a.c7+b.c19*a.c8-b.c20*a.c9-b.c2*a.c10+b.c22*a.c11-b.c23*a.c12+b.c4*a.c13-b.c5*a.c14+b.c25*a.c15-b.c6*a.c16+b.c26*a.c17-b.c27*a.c18+b.c8*a.c19-b.c9*a.c20+b.c29*a.c21+b.c11*a.c22-b.c12*a.c23+b.c30*a.c24+b.c15*a.c25-b.c17*a.c26+b.c18*a.c27-b.c31*a.c28-b.c21*a.c29-b.c24*a.c30-b.c28*a.c31;
  227.   res.c4=b.c4*a.c0+b.c8*a.c1+b.c11*a.c2+b.c13*a.c3+b.c0*a.c4+b.c15*a.c5-b.c17*a.c6-b.c19*a.c7-b.c1*a.c8-b.c21*a.c9-b.c22*a.c10-b.c2*a.c11-b.c24*a.c12-b.c3*a.c13-b.c25*a.c14-b.c5*a.c15-b.c26*a.c16-b.c6*a.c17-b.c28*a.c18-b.c7*a.c19-b.c29*a.c20-b.c9*a.c21-b.c10*a.c22-b.c30*a.c23-b.c12*a.c24-b.c14*a.c25+b.c16*a.c26+b.c31*a.c27+b.c18*a.c28+b.c20*a.c29+b.c23*a.c30+b.c27*a.c31;
  228.   res.c5=b.c5*a.c0+b.c9*a.c1+b.c12*a.c2+b.c14*a.c3+b.c15*a.c4+b.c0*a.c5-b.c18*a.c6-b.c20*a.c7-b.c21*a.c8-b.c1*a.c9-b.c23*a.c10-b.c24*a.c11-b.c2*a.c12-b.c25*a.c13-b.c3*a.c14-b.c4*a.c15-b.c27*a.c16-b.c28*a.c17-b.c6*a.c18-b.c29*a.c19-b.c7*a.c20-b.c8*a.c21-b.c30*a.c22-b.c10*a.c23-b.c11*a.c24-b.c13*a.c25+b.c31*a.c26+b.c16*a.c27+b.c17*a.c28+b.c19*a.c29+b.c22*a.c30+b.c26*a.c31;
  229.   res.c6=b.c6*a.c0+b.c2*a.c1-b.c1*a.c2+b.c16*a.c3+b.c17*a.c4-b.c18*a.c5+b.c0*a.c6-b.c10*a.c7-b.c11*a.c8+b.c12*a.c9+b.c7*a.c10+b.c8*a.c11-b.c9*a.c12-b.c26*a.c13+b.c27*a.c14+b.c28*a.c15+b.c3*a.c16+b.c4*a.c17-b.c5*a.c18-b.c22*a.c19+b.c23*a.c20+b.c24*a.c21+b.c19*a.c22-b.c20*a.c23-b.c21*a.c24+b.c31*a.c25-b.c13*a.c26+b.c14*a.c27+b.c15*a.c28-b.c30*a.c29+b.c29*a.c30+b.c25*a.c31;
  230.   res.c7=b.c7*a.c0+b.c3*a.c1-b.c16*a.c2-b.c1*a.c3+b.c19*a.c4-b.c20*a.c5+b.c10*a.c6+b.c0*a.c7-b.c13*a.c8+b.c14*a.c9-b.c6*a.c10+b.c26*a.c11-b.c27*a.c12+b.c8*a.c13-b.c9*a.c14+b.c29*a.c15-b.c2*a.c16+b.c22*a.c17-b.c23*a.c18+b.c4*a.c19-b.c5*a.c20+b.c25*a.c21-b.c17*a.c22+b.c18*a.c23-b.c31*a.c24-b.c21*a.c25+b.c11*a.c26-b.c12*a.c27+b.c30*a.c28+b.c15*a.c29-b.c28*a.c30-b.c24*a.c31;
  231.   res.c8=b.c8*a.c0+b.c4*a.c1-b.c17*a.c2-b.c19*a.c3-b.c1*a.c4-b.c21*a.c5+b.c11*a.c6+b.c13*a.c7+b.c0*a.c8+b.c15*a.c9-b.c26*a.c10-b.c6*a.c11-b.c28*a.c12-b.c7*a.c13-b.c29*a.c14-b.c9*a.c15-b.c22*a.c16-b.c2*a.c17-b.c24*a.c18-b.c3*a.c19-b.c25*a.c20-b.c5*a.c21+b.c16*a.c22+b.c31*a.c23+b.c18*a.c24+b.c20*a.c25-b.c10*a.c26-b.c30*a.c27-b.c12*a.c28-b.c14*a.c29+b.c27*a.c30+b.c23*a.c31;
  232.   res.c9=b.c9*a.c0+b.c5*a.c1-b.c18*a.c2-b.c20*a.c3-b.c21*a.c4-b.c1*a.c5+b.c12*a.c6+b.c14*a.c7+b.c15*a.c8+b.c0*a.c9-b.c27*a.c10-b.c28*a.c11-b.c6*a.c12-b.c29*a.c13-b.c7*a.c14-b.c8*a.c15-b.c23*a.c16-b.c24*a.c17-b.c2*a.c18-b.c25*a.c19-b.c3*a.c20-b.c4*a.c21+b.c31*a.c22+b.c16*a.c23+b.c17*a.c24+b.c19*a.c25-b.c30*a.c26-b.c10*a.c27-b.c11*a.c28-b.c13*a.c29+b.c26*a.c30+b.c22*a.c31;
  233.   res.c10=b.c10*a.c0+b.c16*a.c1+b.c3*a.c2-b.c2*a.c3+b.c22*a.c4-b.c23*a.c5-b.c7*a.c6+b.c6*a.c7-b.c26*a.c8+b.c27*a.c9+b.c0*a.c10-b.c13*a.c11+b.c14*a.c12+b.c11*a.c13-b.c12*a.c14+b.c30*a.c15+b.c1*a.c16-b.c19*a.c17+b.c20*a.c18+b.c17*a.c19-b.c18*a.c20+b.c31*a.c21+b.c4*a.c22-b.c5*a.c23+b.c25*a.c24-b.c24*a.c25-b.c8*a.c26+b.c9*a.c27-b.c29*a.c28+b.c28*a.c29+b.c15*a.c30+b.c21*a.c31;
  234.   res.c11=b.c11*a.c0+b.c17*a.c1+b.c4*a.c2-b.c22*a.c3-b.c2*a.c4-b.c24*a.c5-b.c8*a.c6+b.c26*a.c7+b.c6*a.c8+b.c28*a.c9+b.c13*a.c10+b.c0*a.c11+b.c15*a.c12-b.c10*a.c13-b.c30*a.c14-b.c12*a.c15+b.c19*a.c16+b.c1*a.c17+b.c21*a.c18-b.c16*a.c19-b.c31*a.c20-b.c18*a.c21-b.c3*a.c22-b.c25*a.c23-b.c5*a.c24+b.c23*a.c25+b.c7*a.c26+b.c29*a.c27+b.c9*a.c28-b.c27*a.c29-b.c14*a.c30-b.c20*a.c31;
  235.   res.c12=b.c12*a.c0+b.c18*a.c1+b.c5*a.c2-b.c23*a.c3-b.c24*a.c4-b.c2*a.c5-b.c9*a.c6+b.c27*a.c7+b.c28*a.c8+b.c6*a.c9+b.c14*a.c10+b.c15*a.c11+b.c0*a.c12-b.c30*a.c13-b.c10*a.c14-b.c11*a.c15+b.c20*a.c16+b.c21*a.c17+b.c1*a.c18-b.c31*a.c19-b.c16*a.c20-b.c17*a.c21-b.c25*a.c22-b.c3*a.c23-b.c4*a.c24+b.c22*a.c25+b.c29*a.c26+b.c7*a.c27+b.c8*a.c28-b.c26*a.c29-b.c13*a.c30-b.c19*a.c31;
  236.   res.c13=b.c13*a.c0+b.c19*a.c1+b.c22*a.c2+b.c4*a.c3-b.c3*a.c4-b.c25*a.c5-b.c26*a.c6-b.c8*a.c7+b.c7*a.c8+b.c29*a.c9-b.c11*a.c10+b.c10*a.c11+b.c30*a.c12+b.c0*a.c13+b.c15*a.c14-b.c14*a.c15-b.c17*a.c16+b.c16*a.c17+b.c31*a.c18+b.c1*a.c19+b.c21*a.c20-b.c20*a.c21+b.c2*a.c22+b.c24*a.c23-b.c23*a.c24-b.c5*a.c25-b.c6*a.c26-b.c28*a.c27+b.c27*a.c28+b.c9*a.c29+b.c12*a.c30+b.c18*a.c31;
  237.   res.c14=b.c14*a.c0+b.c20*a.c1+b.c23*a.c2+b.c5*a.c3-b.c25*a.c4-b.c3*a.c5-b.c27*a.c6-b.c9*a.c7+b.c29*a.c8+b.c7*a.c9-b.c12*a.c10+b.c30*a.c11+b.c10*a.c12+b.c15*a.c13+b.c0*a.c14-b.c13*a.c15-b.c18*a.c16+b.c31*a.c17+b.c16*a.c18+b.c21*a.c19+b.c1*a.c20-b.c19*a.c21+b.c24*a.c22+b.c2*a.c23-b.c22*a.c24-b.c4*a.c25-b.c28*a.c26-b.c6*a.c27+b.c26*a.c28+b.c8*a.c29+b.c11*a.c30+b.c17*a.c31;
  238.   res.c15=b.c15*a.c0+b.c21*a.c1+b.c24*a.c2+b.c25*a.c3+b.c5*a.c4-b.c4*a.c5-b.c28*a.c6-b.c29*a.c7-b.c9*a.c8+b.c8*a.c9-b.c30*a.c10-b.c12*a.c11+b.c11*a.c12-b.c14*a.c13+b.c13*a.c14+b.c0*a.c15-b.c31*a.c16-b.c18*a.c17+b.c17*a.c18-b.c20*a.c19+b.c19*a.c20+b.c1*a.c21-b.c23*a.c22+b.c22*a.c23+b.c2*a.c24+b.c3*a.c25+b.c27*a.c26-b.c26*a.c27-b.c6*a.c28-b.c7*a.c29-b.c10*a.c30-b.c16*a.c31;
  239.   res.c16=b.c16*a.c0+b.c10*a.c1-b.c7*a.c2+b.c6*a.c3-b.c26*a.c4+b.c27*a.c5+b.c3*a.c6-b.c2*a.c7+b.c22*a.c8-b.c23*a.c9+b.c1*a.c10-b.c19*a.c11+b.c20*a.c12+b.c17*a.c13-b.c18*a.c14+b.c31*a.c15+b.c0*a.c16-b.c13*a.c17+b.c14*a.c18+b.c11*a.c19-b.c12*a.c20+b.c30*a.c21-b.c8*a.c22+b.c9*a.c23-b.c29*a.c24+b.c28*a.c25+b.c4*a.c26-b.c5*a.c27+b.c25*a.c28-b.c24*a.c29+b.c21*a.c30+b.c15*a.c31;
  240.   res.c17=b.c17*a.c0+b.c11*a.c1-b.c8*a.c2+b.c26*a.c3+b.c6*a.c4+b.c28*a.c5+b.c4*a.c6-b.c22*a.c7-b.c2*a.c8-b.c24*a.c9+b.c19*a.c10+b.c1*a.c11+b.c21*a.c12-b.c16*a.c13-b.c31*a.c14-b.c18*a.c15+b.c13*a.c16+b.c0*a.c17+b.c15*a.c18-b.c10*a.c19-b.c30*a.c20-b.c12*a.c21+b.c7*a.c22+b.c29*a.c23+b.c9*a.c24-b.c27*a.c25-b.c3*a.c26-b.c25*a.c27-b.c5*a.c28+b.c23*a.c29-b.c20*a.c30-b.c14*a.c31;
  241.   res.c18=b.c18*a.c0+b.c12*a.c1-b.c9*a.c2+b.c27*a.c3+b.c28*a.c4+b.c6*a.c5+b.c5*a.c6-b.c23*a.c7-b.c24*a.c8-b.c2*a.c9+b.c20*a.c10+b.c21*a.c11+b.c1*a.c12-b.c31*a.c13-b.c16*a.c14-b.c17*a.c15+b.c14*a.c16+b.c15*a.c17+b.c0*a.c18-b.c30*a.c19-b.c10*a.c20-b.c11*a.c21+b.c29*a.c22+b.c7*a.c23+b.c8*a.c24-b.c26*a.c25-b.c25*a.c26-b.c3*a.c27-b.c4*a.c28+b.c22*a.c29-b.c19*a.c30-b.c13*a.c31;
  242.   res.c19=b.c19*a.c0+b.c13*a.c1-b.c26*a.c2-b.c8*a.c3+b.c7*a.c4+b.c29*a.c5+b.c22*a.c6+b.c4*a.c7-b.c3*a.c8-b.c25*a.c9-b.c17*a.c10+b.c16*a.c11+b.c31*a.c12+b.c1*a.c13+b.c21*a.c14-b.c20*a.c15-b.c11*a.c16+b.c10*a.c17+b.c30*a.c18+b.c0*a.c19+b.c15*a.c20-b.c14*a.c21-b.c6*a.c22-b.c28*a.c23+b.c27*a.c24+b.c9*a.c25+b.c2*a.c26+b.c24*a.c27-b.c23*a.c28-b.c5*a.c29+b.c18*a.c30+b.c12*a.c31;
  243.   res.c20=b.c20*a.c0+b.c14*a.c1-b.c27*a.c2-b.c9*a.c3+b.c29*a.c4+b.c7*a.c5+b.c23*a.c6+b.c5*a.c7-b.c25*a.c8-b.c3*a.c9-b.c18*a.c10+b.c31*a.c11+b.c16*a.c12+b.c21*a.c13+b.c1*a.c14-b.c19*a.c15-b.c12*a.c16+b.c30*a.c17+b.c10*a.c18+b.c15*a.c19+b.c0*a.c20-b.c13*a.c21-b.c28*a.c22-b.c6*a.c23+b.c26*a.c24+b.c8*a.c25+b.c24*a.c26+b.c2*a.c27-b.c22*a.c28-b.c4*a.c29+b.c17*a.c30+b.c11*a.c31;
  244.   res.c21=b.c21*a.c0+b.c15*a.c1-b.c28*a.c2-b.c29*a.c3-b.c9*a.c4+b.c8*a.c5+b.c24*a.c6+b.c25*a.c7+b.c5*a.c8-b.c4*a.c9-b.c31*a.c10-b.c18*a.c11+b.c17*a.c12-b.c20*a.c13+b.c19*a.c14+b.c1*a.c15-b.c30*a.c16-b.c12*a.c17+b.c11*a.c18-b.c14*a.c19+b.c13*a.c20+b.c0*a.c21+b.c27*a.c22-b.c26*a.c23-b.c6*a.c24-b.c7*a.c25-b.c23*a.c26+b.c22*a.c27+b.c2*a.c28+b.c3*a.c29-b.c16*a.c30-b.c10*a.c31;
  245.   res.c22=b.c22*a.c0+b.c26*a.c1+b.c13*a.c2-b.c11*a.c3+b.c10*a.c4+b.c30*a.c5-b.c19*a.c6+b.c17*a.c7-b.c16*a.c8-b.c31*a.c9+b.c4*a.c10-b.c3*a.c11-b.c25*a.c12+b.c2*a.c13+b.c24*a.c14-b.c23*a.c15+b.c8*a.c16-b.c7*a.c17-b.c29*a.c18+b.c6*a.c19+b.c28*a.c20-b.c27*a.c21+b.c0*a.c22+b.c15*a.c23-b.c14*a.c24+b.c12*a.c25-b.c1*a.c26-b.c21*a.c27+b.c20*a.c28-b.c18*a.c29-b.c5*a.c30-b.c9*a.c31;
  246.   res.c23=b.c23*a.c0+b.c27*a.c1+b.c14*a.c2-b.c12*a.c3+b.c30*a.c4+b.c10*a.c5-b.c20*a.c6+b.c18*a.c7-b.c31*a.c8-b.c16*a.c9+b.c5*a.c10-b.c25*a.c11-b.c3*a.c12+b.c24*a.c13+b.c2*a.c14-b.c22*a.c15+b.c9*a.c16-b.c29*a.c17-b.c7*a.c18+b.c28*a.c19+b.c6*a.c20-b.c26*a.c21+b.c15*a.c22+b.c0*a.c23-b.c13*a.c24+b.c11*a.c25-b.c21*a.c26-b.c1*a.c27+b.c19*a.c28-b.c17*a.c29-b.c4*a.c30-b.c8*a.c31;
  247.   res.c24=b.c24*a.c0+b.c28*a.c1+b.c15*a.c2-b.c30*a.c3-b.c12*a.c4+b.c11*a.c5-b.c21*a.c6+b.c31*a.c7+b.c18*a.c8-b.c17*a.c9+b.c25*a.c10+b.c5*a.c11-b.c4*a.c12-b.c23*a.c13+b.c22*a.c14+b.c2*a.c15+b.c29*a.c16+b.c9*a.c17-b.c8*a.c18-b.c27*a.c19+b.c26*a.c20+b.c6*a.c21-b.c14*a.c22+b.c13*a.c23+b.c0*a.c24-b.c10*a.c25+b.c20*a.c26-b.c19*a.c27-b.c1*a.c28+b.c16*a.c29+b.c3*a.c30+b.c7*a.c31;
  248.   res.c25=b.c25*a.c0+b.c29*a.c1+b.c30*a.c2+b.c15*a.c3-b.c14*a.c4+b.c13*a.c5-b.c31*a.c6-b.c21*a.c7+b.c20*a.c8-b.c19*a.c9-b.c24*a.c10+b.c23*a.c11-b.c22*a.c12+b.c5*a.c13-b.c4*a.c14+b.c3*a.c15-b.c28*a.c16+b.c27*a.c17-b.c26*a.c18+b.c9*a.c19-b.c8*a.c20+b.c7*a.c21+b.c12*a.c22-b.c11*a.c23+b.c10*a.c24+b.c0*a.c25-b.c18*a.c26+b.c17*a.c27-b.c16*a.c28-b.c1*a.c29-b.c2*a.c30-b.c6*a.c31;
  249.   res.c26=b.c26*a.c0+b.c22*a.c1-b.c19*a.c2+b.c17*a.c3-b.c16*a.c4-b.c31*a.c5+b.c13*a.c6-b.c11*a.c7+b.c10*a.c8+b.c30*a.c9+b.c8*a.c10-b.c7*a.c11-b.c29*a.c12+b.c6*a.c13+b.c28*a.c14-b.c27*a.c15+b.c4*a.c16-b.c3*a.c17-b.c25*a.c18+b.c2*a.c19+b.c24*a.c20-b.c23*a.c21-b.c1*a.c22-b.c21*a.c23+b.c20*a.c24-b.c18*a.c25+b.c0*a.c26+b.c15*a.c27-b.c14*a.c28+b.c12*a.c29-b.c9*a.c30-b.c5*a.c31;
  250.   res.c27=b.c27*a.c0+b.c23*a.c1-b.c20*a.c2+b.c18*a.c3-b.c31*a.c4-b.c16*a.c5+b.c14*a.c6-b.c12*a.c7+b.c30*a.c8+b.c10*a.c9+b.c9*a.c10-b.c29*a.c11-b.c7*a.c12+b.c28*a.c13+b.c6*a.c14-b.c26*a.c15+b.c5*a.c16-b.c25*a.c17-b.c3*a.c18+b.c24*a.c19+b.c2*a.c20-b.c22*a.c21-b.c21*a.c22-b.c1*a.c23+b.c19*a.c24-b.c17*a.c25+b.c15*a.c26+b.c0*a.c27-b.c13*a.c28+b.c11*a.c29-b.c8*a.c30-b.c4*a.c31;
  251.   res.c28=b.c28*a.c0+b.c24*a.c1-b.c21*a.c2+b.c31*a.c3+b.c18*a.c4-b.c17*a.c5+b.c15*a.c6-b.c30*a.c7-b.c12*a.c8+b.c11*a.c9+b.c29*a.c10+b.c9*a.c11-b.c8*a.c12-b.c27*a.c13+b.c26*a.c14+b.c6*a.c15+b.c25*a.c16+b.c5*a.c17-b.c4*a.c18-b.c23*a.c19+b.c22*a.c20+b.c2*a.c21+b.c20*a.c22-b.c19*a.c23-b.c1*a.c24+b.c16*a.c25-b.c14*a.c26+b.c13*a.c27+b.c0*a.c28-b.c10*a.c29+b.c7*a.c30+b.c3*a.c31;
  252.   res.c29=b.c29*a.c0+b.c25*a.c1-b.c31*a.c2-b.c21*a.c3+b.c20*a.c4-b.c19*a.c5+b.c30*a.c6+b.c15*a.c7-b.c14*a.c8+b.c13*a.c9-b.c28*a.c10+b.c27*a.c11-b.c26*a.c12+b.c9*a.c13-b.c8*a.c14+b.c7*a.c15-b.c24*a.c16+b.c23*a.c17-b.c22*a.c18+b.c5*a.c19-b.c4*a.c20+b.c3*a.c21-b.c18*a.c22+b.c17*a.c23-b.c16*a.c24-b.c1*a.c25+b.c12*a.c26-b.c11*a.c27+b.c10*a.c28+b.c0*a.c29-b.c6*a.c30-b.c2*a.c31;
  253.   res.c30=b.c30*a.c0+b.c31*a.c1+b.c25*a.c2-b.c24*a.c3+b.c23*a.c4-b.c22*a.c5-b.c29*a.c6+b.c28*a.c7-b.c27*a.c8+b.c26*a.c9+b.c15*a.c10-b.c14*a.c11+b.c13*a.c12+b.c12*a.c13-b.c11*a.c14+b.c10*a.c15+b.c21*a.c16-b.c20*a.c17+b.c19*a.c18+b.c18*a.c19-b.c17*a.c20+b.c16*a.c21+b.c5*a.c22-b.c4*a.c23+b.c3*a.c24-b.c2*a.c25-b.c9*a.c26+b.c8*a.c27-b.c7*a.c28+b.c6*a.c29+b.c0*a.c30+b.c1*a.c31;
  254.   res.c31=b.c31*a.c0+b.c30*a.c1-b.c29*a.c2+b.c28*a.c3-b.c27*a.c4+b.c26*a.c5+b.c25*a.c6-b.c24*a.c7+b.c23*a.c8-b.c22*a.c9+b.c21*a.c10-b.c20*a.c11+b.c19*a.c12+b.c18*a.c13-b.c17*a.c14+b.c16*a.c15+b.c15*a.c16-b.c14*a.c17+b.c13*a.c18+b.c12*a.c19-b.c11*a.c20+b.c10*a.c21-b.c9*a.c22+b.c8*a.c23-b.c7*a.c24+b.c6*a.c25+b.c5*a.c26-b.c4*a.c27+b.c3*a.c28-b.c2*a.c29+b.c1*a.c30+b.c0*a.c31;
  255.   return res;
  256. }
  257.  
  258. //***********************
  259. // CGA.Wedge : res = a ^ b
  260. // The outer product. (MEET)
  261. //***********************
  262. Mvec outer(Mvec a, Mvec b) {
  263.   Mvec res;
  264.   res.c0=b.c0*a.c0;
  265.   res.c1=b.c1*a.c0+b.c0*a.c1;
  266.   res.c2=b.c2*a.c0+b.c0*a.c2;
  267.   res.c3=b.c3*a.c0+b.c0*a.c3;
  268.   res.c4=b.c4*a.c0+b.c0*a.c4;
  269.   res.c5=b.c5*a.c0+b.c0*a.c5;
  270.   res.c6=b.c6*a.c0+b.c2*a.c1-b.c1*a.c2+b.c0*a.c6;
  271.   res.c7=b.c7*a.c0+b.c3*a.c1-b.c1*a.c3+b.c0*a.c7;
  272.   res.c8=b.c8*a.c0+b.c4*a.c1-b.c1*a.c4+b.c0*a.c8;
  273.   res.c9=b.c9*a.c0+b.c5*a.c1-b.c1*a.c5+b.c0*a.c9;
  274.   res.c10=b.c10*a.c0+b.c3*a.c2-b.c2*a.c3+b.c0*a.c10;
  275.   res.c11=b.c11*a.c0+b.c4*a.c2-b.c2*a.c4+b.c0*a.c11;
  276.   res.c12=b.c12*a.c0+b.c5*a.c2-b.c2*a.c5+b.c0*a.c12;
  277.   res.c13=b.c13*a.c0+b.c4*a.c3-b.c3*a.c4+b.c0*a.c13;
  278.   res.c14=b.c14*a.c0+b.c5*a.c3-b.c3*a.c5+b.c0*a.c14;
  279.   res.c15=b.c15*a.c0+b.c5*a.c4-b.c4*a.c5+b.c0*a.c15;
  280.   res.c16=b.c16*a.c0+b.c10*a.c1-b.c7*a.c2+b.c6*a.c3+b.c3*a.c6-b.c2*a.c7+b.c1*a.c10+b.c0*a.c16;
  281.   res.c17=b.c17*a.c0+b.c11*a.c1-b.c8*a.c2+b.c6*a.c4+b.c4*a.c6-b.c2*a.c8+b.c1*a.c11+b.c0*a.c17;
  282.   res.c18=b.c18*a.c0+b.c12*a.c1-b.c9*a.c2+b.c6*a.c5+b.c5*a.c6-b.c2*a.c9+b.c1*a.c12+b.c0*a.c18;
  283.   res.c19=b.c19*a.c0+b.c13*a.c1-b.c8*a.c3+b.c7*a.c4+b.c4*a.c7-b.c3*a.c8+b.c1*a.c13+b.c0*a.c19;
  284.   res.c20=b.c20*a.c0+b.c14*a.c1-b.c9*a.c3+b.c7*a.c5+b.c5*a.c7-b.c3*a.c9+b.c1*a.c14+b.c0*a.c20;
  285.   res.c21=b.c21*a.c0+b.c15*a.c1-b.c9*a.c4+b.c8*a.c5+b.c5*a.c8-b.c4*a.c9+b.c1*a.c15+b.c0*a.c21;
  286.   res.c22=b.c22*a.c0+b.c13*a.c2-b.c11*a.c3+b.c10*a.c4+b.c4*a.c10-b.c3*a.c11+b.c2*a.c13+b.c0*a.c22;
  287.   res.c23=b.c23*a.c0+b.c14*a.c2-b.c12*a.c3+b.c10*a.c5+b.c5*a.c10-b.c3*a.c12+b.c2*a.c14+b.c0*a.c23;
  288.   res.c24=b.c24*a.c0+b.c15*a.c2-b.c12*a.c4+b.c11*a.c5+b.c5*a.c11-b.c4*a.c12+b.c2*a.c15+b.c0*a.c24;
  289.   res.c25=b.c25*a.c0+b.c15*a.c3-b.c14*a.c4+b.c13*a.c5+b.c5*a.c13-b.c4*a.c14+b.c3*a.c15+b.c0*a.c25;
  290.   res.c26=b.c26*a.c0+b.c22*a.c1-b.c19*a.c2+b.c17*a.c3-b.c16*a.c4+b.c13*a.c6-b.c11*a.c7+b.c10*a.c8+b.c8*a.c10-b.c7*a.c11+b.c6*a.c13+b.c4*a.c16-b.c3*a.c17+b.c2*a.c19-b.c1*a.c22+b.c0*a.c26;
  291.   res.c27=b.c27*a.c0+b.c23*a.c1-b.c20*a.c2+b.c18*a.c3-b.c16*a.c5+b.c14*a.c6-b.c12*a.c7+b.c10*a.c9+b.c9*a.c10-b.c7*a.c12+b.c6*a.c14+b.c5*a.c16-b.c3*a.c18+b.c2*a.c20-b.c1*a.c23+b.c0*a.c27;
  292.   res.c28=b.c28*a.c0+b.c24*a.c1-b.c21*a.c2+b.c18*a.c4-b.c17*a.c5+b.c15*a.c6-b.c12*a.c8+b.c11*a.c9+b.c9*a.c11-b.c8*a.c12+b.c6*a.c15+b.c5*a.c17-b.c4*a.c18+b.c2*a.c21-b.c1*a.c24+b.c0*a.c28;
  293.   res.c29=b.c29*a.c0+b.c25*a.c1-b.c21*a.c3+b.c20*a.c4-b.c19*a.c5+b.c15*a.c7-b.c14*a.c8+b.c13*a.c9+b.c9*a.c13-b.c8*a.c14+b.c7*a.c15+b.c5*a.c19-b.c4*a.c20+b.c3*a.c21-b.c1*a.c25+b.c0*a.c29;
  294.   res.c30=b.c30*a.c0+b.c25*a.c2-b.c24*a.c3+b.c23*a.c4-b.c22*a.c5+b.c15*a.c10-b.c14*a.c11+b.c13*a.c12+b.c12*a.c13-b.c11*a.c14+b.c10*a.c15+b.c5*a.c22-b.c4*a.c23+b.c3*a.c24-b.c2*a.c25+b.c0*a.c30;
  295.   res.c31=b.c31*a.c0+b.c30*a.c1-b.c29*a.c2+b.c28*a.c3-b.c27*a.c4+b.c26*a.c5+b.c25*a.c6-b.c24*a.c7+b.c23*a.c8-b.c22*a.c9+b.c21*a.c10-b.c20*a.c11+b.c19*a.c12+b.c18*a.c13-b.c17*a.c14+b.c16*a.c15+b.c15*a.c16-b.c14*a.c17+b.c13*a.c18+b.c12*a.c19-b.c11*a.c20+b.c10*a.c21-b.c9*a.c22+b.c8*a.c23-b.c7*a.c24+b.c6*a.c25+b.c5*a.c26-b.c4*a.c27+b.c3*a.c28-b.c2*a.c29+b.c1*a.c30+b.c0*a.c31;
  296.   return res;
  297. }
  298.  
  299. //***********************
  300. // CGA.Vee : res = a & b
  301. // The regressive product. (JOIN)
  302. //***********************
  303. Mvec regressive(Mvec a, Mvec b) {
  304.   Mvec res;
  305.   res.c31=1*(a.c31*b.c31);
  306.   res.c30=1*(a.c30*b.c31+a.c31*b.c30);
  307.   res.c29=-1*(a.c29*-1*b.c31+a.c31*b.c29*-1);
  308.   res.c28=1*(a.c28*b.c31+a.c31*b.c28);
  309.   res.c27=-1*(a.c27*-1*b.c31+a.c31*b.c27*-1);
  310.   res.c26=1*(a.c26*b.c31+a.c31*b.c26);
  311.   res.c25=1*(a.c25*b.c31+a.c29*-1*b.c30-a.c30*b.c29*-1+a.c31*b.c25);
  312.   res.c24=-1*(a.c24*-1*b.c31+a.c28*b.c30-a.c30*b.c28+a.c31*b.c24*-1);
  313.   res.c23=1*(a.c23*b.c31+a.c27*-1*b.c30-a.c30*b.c27*-1+a.c31*b.c23);
  314.   res.c22=-1*(a.c22*-1*b.c31+a.c26*b.c30-a.c30*b.c26+a.c31*b.c22*-1);
  315.   res.c21=1*(a.c21*b.c31+a.c28*b.c29*-1-a.c29*-1*b.c28+a.c31*b.c21);
  316.   res.c20=-1*(a.c20*-1*b.c31+a.c27*-1*b.c29*-1-a.c29*-1*b.c27*-1+a.c31*b.c20*-1);
  317.   res.c19=1*(a.c19*b.c31+a.c26*b.c29*-1-a.c29*-1*b.c26+a.c31*b.c19);
  318.   res.c18=1*(a.c18*b.c31+a.c27*-1*b.c28-a.c28*b.c27*-1+a.c31*b.c18);
  319.   res.c17=-1*(a.c17*-1*b.c31+a.c26*b.c28-a.c28*b.c26+a.c31*b.c17*-1);
  320.   res.c16=1*(a.c16*b.c31+a.c26*b.c27*-1-a.c27*-1*b.c26+a.c31*b.c16);
  321.   res.c15=1*(a.c15*b.c31+a.c21*b.c30-a.c24*-1*b.c29*-1+a.c25*b.c28+a.c28*b.c25-a.c29*-1*b.c24*-1+a.c30*b.c21+a.c31*b.c15);
  322.   res.c14=-1*(a.c14*-1*b.c31+a.c20*-1*b.c30-a.c23*b.c29*-1+a.c25*b.c27*-1+a.c27*-1*b.c25-a.c29*-1*b.c23+a.c30*b.c20*-1+a.c31*b.c14*-1);
  323.   res.c13=1*(a.c13*b.c31+a.c19*b.c30-a.c22*-1*b.c29*-1+a.c25*b.c26+a.c26*b.c25-a.c29*-1*b.c22*-1+a.c30*b.c19+a.c31*b.c13);
  324.   res.c12=1*(a.c12*b.c31+a.c18*b.c30-a.c23*b.c28+a.c24*-1*b.c27*-1+a.c27*-1*b.c24*-1-a.c28*b.c23+a.c30*b.c18+a.c31*b.c12);
  325.   res.c11=-1*(a.c11*-1*b.c31+a.c17*-1*b.c30-a.c22*-1*b.c28+a.c24*-1*b.c26+a.c26*b.c24*-1-a.c28*b.c22*-1+a.c30*b.c17*-1+a.c31*b.c11*-1);
  326.   res.c10=1*(a.c10*b.c31+a.c16*b.c30-a.c22*-1*b.c27*-1+a.c23*b.c26+a.c26*b.c23-a.c27*-1*b.c22*-1+a.c30*b.c16+a.c31*b.c10);
  327.   res.c9=-1*(a.c9*-1*b.c31+a.c18*b.c29*-1-a.c20*-1*b.c28+a.c21*b.c27*-1+a.c27*-1*b.c21-a.c28*b.c20*-1+a.c29*-1*b.c18+a.c31*b.c9*-1);
  328.   res.c8=1*(a.c8*b.c31+a.c17*-1*b.c29*-1-a.c19*b.c28+a.c21*b.c26+a.c26*b.c21-a.c28*b.c19+a.c29*-1*b.c17*-1+a.c31*b.c8);
  329.   res.c7=-1*(a.c7*-1*b.c31+a.c16*b.c29*-1-a.c19*b.c27*-1+a.c20*-1*b.c26+a.c26*b.c20*-1-a.c27*-1*b.c19+a.c29*-1*b.c16+a.c31*b.c7*-1);
  330.   res.c6=1*(a.c6*b.c31+a.c16*b.c28-a.c17*-1*b.c27*-1+a.c18*b.c26+a.c26*b.c18-a.c27*-1*b.c17*-1+a.c28*b.c16+a.c31*b.c6);
  331.   res.c5=1*(a.c5*b.c31+a.c9*-1*b.c30-a.c12*b.c29*-1+a.c14*-1*b.c28-a.c15*b.c27*-1+a.c18*b.c25-a.c20*-1*b.c24*-1+a.c21*b.c23+a.c23*b.c21-a.c24*-1*b.c20*-1+a.c25*b.c18+a.c27*-1*b.c15-a.c28*b.c14*-1+a.c29*-1*b.c12-a.c30*b.c9*-1+a.c31*b.c5);
  332.   res.c4=-1*(a.c4*-1*b.c31+a.c8*b.c30-a.c11*-1*b.c29*-1+a.c13*b.c28-a.c15*b.c26+a.c17*-1*b.c25-a.c19*b.c24*-1+a.c21*b.c22*-1+a.c22*-1*b.c21-a.c24*-1*b.c19+a.c25*b.c17*-1+a.c26*b.c15-a.c28*b.c13+a.c29*-1*b.c11*-1-a.c30*b.c8+a.c31*b.c4*-1);
  333.   res.c3=1*(a.c3*b.c31+a.c7*-1*b.c30-a.c10*b.c29*-1+a.c13*b.c27*-1-a.c14*-1*b.c26+a.c16*b.c25-a.c19*b.c23+a.c20*-1*b.c22*-1+a.c22*-1*b.c20*-1-a.c23*b.c19+a.c25*b.c16+a.c26*b.c14*-1-a.c27*-1*b.c13+a.c29*-1*b.c10-a.c30*b.c7*-1+a.c31*b.c3);
  334.   res.c2=-1*(a.c2*-1*b.c31+a.c6*b.c30-a.c10*b.c28+a.c11*-1*b.c27*-1-a.c12*b.c26+a.c16*b.c24*-1-a.c17*-1*b.c23+a.c18*b.c22*-1+a.c22*-1*b.c18-a.c23*b.c17*-1+a.c24*-1*b.c16+a.c26*b.c12-a.c27*-1*b.c11*-1+a.c28*b.c10-a.c30*b.c6+a.c31*b.c2*-1);
  335.   res.c1=1*(a.c1*b.c31+a.c6*b.c29*-1-a.c7*-1*b.c28+a.c8*b.c27*-1-a.c9*-1*b.c26+a.c16*b.c21-a.c17*-1*b.c20*-1+a.c18*b.c19+a.c19*b.c18-a.c20*-1*b.c17*-1+a.c21*b.c16+a.c26*b.c9*-1-a.c27*-1*b.c8+a.c28*b.c7*-1-a.c29*-1*b.c6+a.c31*b.c1);
  336.   res.c0=1*(a.c0*b.c31+a.c1*b.c30-a.c2*-1*b.c29*-1+a.c3*b.c28-a.c4*-1*b.c27*-1+a.c5*b.c26+a.c6*b.c25-a.c7*-1*b.c24*-1+a.c8*b.c23-a.c9*-1*b.c22*-1+a.c10*b.c21-a.c11*-1*b.c20*-1+a.c12*b.c19+a.c13*b.c18-a.c14*-1*b.c17*-1+a.c15*b.c16+a.c16*b.c15-a.c17*-1*b.c14*-1+a.c18*b.c13+a.c19*b.c12-a.c20*-1*b.c11*-1+a.c21*b.c10-a.c22*-1*b.c9*-1+a.c23*b.c8-a.c24*-1*b.c7*-1+a.c25*b.c6+a.c26*b.c5-a.c27*-1*b.c4*-1+a.c28*b.c3-a.c29*-1*b.c2*-1+a.c30*b.c1+a.c31*b.c0);
  337.   return res;
  338. }
  339.  
  340. //***********************
  341. // CGA.Dot : res = a | b
  342. // The inner product.
  343. //***********************
  344. Mvec inner(Mvec a, Mvec b) {
  345.   Mvec res;
  346.   res.c0=b.c0*a.c0+b.c1*a.c1+b.c2*a.c2+b.c3*a.c3+b.c4*a.c4-b.c5*a.c5-b.c6*a.c6-b.c7*a.c7-b.c8*a.c8+b.c9*a.c9-b.c10*a.c10-b.c11*a.c11+b.c12*a.c12-b.c13*a.c13+b.c14*a.c14+b.c15*a.c15-b.c16*a.c16-b.c17*a.c17+b.c18*a.c18-b.c19*a.c19+b.c20*a.c20+b.c21*a.c21-b.c22*a.c22+b.c23*a.c23+b.c24*a.c24+b.c25*a.c25+b.c26*a.c26-b.c27*a.c27-b.c28*a.c28-b.c29*a.c29-b.c30*a.c30-b.c31*a.c31;
  347.   res.c1=b.c1*a.c0+b.c0*a.c1-b.c6*a.c2-b.c7*a.c3-b.c8*a.c4+b.c9*a.c5+b.c2*a.c6+b.c3*a.c7+b.c4*a.c8-b.c5*a.c9-b.c16*a.c10-b.c17*a.c11+b.c18*a.c12-b.c19*a.c13+b.c20*a.c14+b.c21*a.c15-b.c10*a.c16-b.c11*a.c17+b.c12*a.c18-b.c13*a.c19+b.c14*a.c20+b.c15*a.c21+b.c26*a.c22-b.c27*a.c23-b.c28*a.c24-b.c29*a.c25-b.c22*a.c26+b.c23*a.c27+b.c24*a.c28+b.c25*a.c29-b.c31*a.c30-b.c30*a.c31;
  348.   res.c2=b.c2*a.c0+b.c6*a.c1+b.c0*a.c2-b.c10*a.c3-b.c11*a.c4+b.c12*a.c5-b.c1*a.c6+b.c16*a.c7+b.c17*a.c8-b.c18*a.c9+b.c3*a.c10+b.c4*a.c11-b.c5*a.c12-b.c22*a.c13+b.c23*a.c14+b.c24*a.c15+b.c7*a.c16+b.c8*a.c17-b.c9*a.c18-b.c26*a.c19+b.c27*a.c20+b.c28*a.c21-b.c13*a.c22+b.c14*a.c23+b.c15*a.c24-b.c30*a.c25+b.c19*a.c26-b.c20*a.c27-b.c21*a.c28+b.c31*a.c29+b.c25*a.c30+b.c29*a.c31;
  349.   res.c3=b.c3*a.c0+b.c7*a.c1+b.c10*a.c2+b.c0*a.c3-b.c13*a.c4+b.c14*a.c5-b.c16*a.c6-b.c1*a.c7+b.c19*a.c8-b.c20*a.c9-b.c2*a.c10+b.c22*a.c11-b.c23*a.c12+b.c4*a.c13-b.c5*a.c14+b.c25*a.c15-b.c6*a.c16+b.c26*a.c17-b.c27*a.c18+b.c8*a.c19-b.c9*a.c20+b.c29*a.c21+b.c11*a.c22-b.c12*a.c23+b.c30*a.c24+b.c15*a.c25-b.c17*a.c26+b.c18*a.c27-b.c31*a.c28-b.c21*a.c29-b.c24*a.c30-b.c28*a.c31;
  350.   res.c4=b.c4*a.c0+b.c8*a.c1+b.c11*a.c2+b.c13*a.c3+b.c0*a.c4+b.c15*a.c5-b.c17*a.c6-b.c19*a.c7-b.c1*a.c8-b.c21*a.c9-b.c22*a.c10-b.c2*a.c11-b.c24*a.c12-b.c3*a.c13-b.c25*a.c14-b.c5*a.c15-b.c26*a.c16-b.c6*a.c17-b.c28*a.c18-b.c7*a.c19-b.c29*a.c20-b.c9*a.c21-b.c10*a.c22-b.c30*a.c23-b.c12*a.c24-b.c14*a.c25+b.c16*a.c26+b.c31*a.c27+b.c18*a.c28+b.c20*a.c29+b.c23*a.c30+b.c27*a.c31;
  351.   res.c5=b.c5*a.c0+b.c9*a.c1+b.c12*a.c2+b.c14*a.c3+b.c15*a.c4+b.c0*a.c5-b.c18*a.c6-b.c20*a.c7-b.c21*a.c8-b.c1*a.c9-b.c23*a.c10-b.c24*a.c11-b.c2*a.c12-b.c25*a.c13-b.c3*a.c14-b.c4*a.c15-b.c27*a.c16-b.c28*a.c17-b.c6*a.c18-b.c29*a.c19-b.c7*a.c20-b.c8*a.c21-b.c30*a.c22-b.c10*a.c23-b.c11*a.c24-b.c13*a.c25+b.c31*a.c26+b.c16*a.c27+b.c17*a.c28+b.c19*a.c29+b.c22*a.c30+b.c26*a.c31;
  352.   res.c6=b.c6*a.c0+b.c16*a.c3+b.c17*a.c4-b.c18*a.c5+b.c0*a.c6-b.c26*a.c13+b.c27*a.c14+b.c28*a.c15+b.c3*a.c16+b.c4*a.c17-b.c5*a.c18+b.c31*a.c25-b.c13*a.c26+b.c14*a.c27+b.c15*a.c28+b.c25*a.c31;
  353.   res.c7=b.c7*a.c0-b.c16*a.c2+b.c19*a.c4-b.c20*a.c5+b.c0*a.c7+b.c26*a.c11-b.c27*a.c12+b.c29*a.c15-b.c2*a.c16+b.c4*a.c19-b.c5*a.c20-b.c31*a.c24+b.c11*a.c26-b.c12*a.c27+b.c15*a.c29-b.c24*a.c31;
  354.   res.c8=b.c8*a.c0-b.c17*a.c2-b.c19*a.c3-b.c21*a.c5+b.c0*a.c8-b.c26*a.c10-b.c28*a.c12-b.c29*a.c14-b.c2*a.c17-b.c3*a.c19-b.c5*a.c21+b.c31*a.c23-b.c10*a.c26-b.c12*a.c28-b.c14*a.c29+b.c23*a.c31;
  355.   res.c9=b.c9*a.c0-b.c18*a.c2-b.c20*a.c3-b.c21*a.c4+b.c0*a.c9-b.c27*a.c10-b.c28*a.c11-b.c29*a.c13-b.c2*a.c18-b.c3*a.c20-b.c4*a.c21+b.c31*a.c22-b.c10*a.c27-b.c11*a.c28-b.c13*a.c29+b.c22*a.c31;
  356.   res.c10=b.c10*a.c0+b.c16*a.c1+b.c22*a.c4-b.c23*a.c5-b.c26*a.c8+b.c27*a.c9+b.c0*a.c10+b.c30*a.c15+b.c1*a.c16+b.c31*a.c21+b.c4*a.c22-b.c5*a.c23-b.c8*a.c26+b.c9*a.c27+b.c15*a.c30+b.c21*a.c31;
  357.   res.c11=b.c11*a.c0+b.c17*a.c1-b.c22*a.c3-b.c24*a.c5+b.c26*a.c7+b.c28*a.c9+b.c0*a.c11-b.c30*a.c14+b.c1*a.c17-b.c31*a.c20-b.c3*a.c22-b.c5*a.c24+b.c7*a.c26+b.c9*a.c28-b.c14*a.c30-b.c20*a.c31;
  358.   res.c12=b.c12*a.c0+b.c18*a.c1-b.c23*a.c3-b.c24*a.c4+b.c27*a.c7+b.c28*a.c8+b.c0*a.c12-b.c30*a.c13+b.c1*a.c18-b.c31*a.c19-b.c3*a.c23-b.c4*a.c24+b.c7*a.c27+b.c8*a.c28-b.c13*a.c30-b.c19*a.c31;
  359.   res.c13=b.c13*a.c0+b.c19*a.c1+b.c22*a.c2-b.c25*a.c5-b.c26*a.c6+b.c29*a.c9+b.c30*a.c12+b.c0*a.c13+b.c31*a.c18+b.c1*a.c19+b.c2*a.c22-b.c5*a.c25-b.c6*a.c26+b.c9*a.c29+b.c12*a.c30+b.c18*a.c31;
  360.   res.c14=b.c14*a.c0+b.c20*a.c1+b.c23*a.c2-b.c25*a.c4-b.c27*a.c6+b.c29*a.c8+b.c30*a.c11+b.c0*a.c14+b.c31*a.c17+b.c1*a.c20+b.c2*a.c23-b.c4*a.c25-b.c6*a.c27+b.c8*a.c29+b.c11*a.c30+b.c17*a.c31;
  361.   res.c15=b.c15*a.c0+b.c21*a.c1+b.c24*a.c2+b.c25*a.c3-b.c28*a.c6-b.c29*a.c7-b.c30*a.c10+b.c0*a.c15-b.c31*a.c16+b.c1*a.c21+b.c2*a.c24+b.c3*a.c25-b.c6*a.c28-b.c7*a.c29-b.c10*a.c30-b.c16*a.c31;
  362.   res.c16=b.c16*a.c0-b.c26*a.c4+b.c27*a.c5+b.c31*a.c15+b.c0*a.c16+b.c4*a.c26-b.c5*a.c27+b.c15*a.c31;
  363.   res.c17=b.c17*a.c0+b.c26*a.c3+b.c28*a.c5-b.c31*a.c14+b.c0*a.c17-b.c3*a.c26-b.c5*a.c28-b.c14*a.c31;
  364.   res.c18=b.c18*a.c0+b.c27*a.c3+b.c28*a.c4-b.c31*a.c13+b.c0*a.c18-b.c3*a.c27-b.c4*a.c28-b.c13*a.c31;
  365.   res.c19=b.c19*a.c0-b.c26*a.c2+b.c29*a.c5+b.c31*a.c12+b.c0*a.c19+b.c2*a.c26-b.c5*a.c29+b.c12*a.c31;
  366.   res.c20=b.c20*a.c0-b.c27*a.c2+b.c29*a.c4+b.c31*a.c11+b.c0*a.c20+b.c2*a.c27-b.c4*a.c29+b.c11*a.c31;
  367.   res.c21=b.c21*a.c0-b.c28*a.c2-b.c29*a.c3-b.c31*a.c10+b.c0*a.c21+b.c2*a.c28+b.c3*a.c29-b.c10*a.c31;
  368.   res.c22=b.c22*a.c0+b.c26*a.c1+b.c30*a.c5-b.c31*a.c9+b.c0*a.c22-b.c1*a.c26-b.c5*a.c30-b.c9*a.c31;
  369.   res.c23=b.c23*a.c0+b.c27*a.c1+b.c30*a.c4-b.c31*a.c8+b.c0*a.c23-b.c1*a.c27-b.c4*a.c30-b.c8*a.c31;
  370.   res.c24=b.c24*a.c0+b.c28*a.c1-b.c30*a.c3+b.c31*a.c7+b.c0*a.c24-b.c1*a.c28+b.c3*a.c30+b.c7*a.c31;
  371.   res.c25=b.c25*a.c0+b.c29*a.c1+b.c30*a.c2-b.c31*a.c6+b.c0*a.c25-b.c1*a.c29-b.c2*a.c30-b.c6*a.c31;
  372.   res.c26=b.c26*a.c0-b.c31*a.c5+b.c0*a.c26-b.c5*a.c31;
  373.   res.c27=b.c27*a.c0-b.c31*a.c4+b.c0*a.c27-b.c4*a.c31;
  374.   res.c28=b.c28*a.c0+b.c31*a.c3+b.c0*a.c28+b.c3*a.c31;
  375.   res.c29=b.c29*a.c0-b.c31*a.c2+b.c0*a.c29-b.c2*a.c31;
  376.   res.c30=b.c30*a.c0+b.c31*a.c1+b.c0*a.c30+b.c1*a.c31;
  377.   res.c31=b.c31*a.c0+b.c0*a.c31;
  378.   return res;
  379. }
  380.  
  381. //***********************
  382. // CGA.Add : res = a + b
  383. // Multivector addition
  384. //***********************
  385. Mvec add(Mvec a, Mvec b) {
  386.   Mvec res;
  387.       res.c0 = a.c0+b.c0;
  388.     res.c1 = a.c1+b.c1;
  389.     res.c2 = a.c2+b.c2;
  390.     res.c3 = a.c3+b.c3;
  391.     res.c4 = a.c4+b.c4;
  392.     res.c5 = a.c5+b.c5;
  393.     res.c6 = a.c6+b.c6;
  394.     res.c7 = a.c7+b.c7;
  395.     res.c8 = a.c8+b.c8;
  396.     res.c9 = a.c9+b.c9;
  397.     res.c10 = a.c10+b.c10;
  398.     res.c11 = a.c11+b.c11;
  399.     res.c12 = a.c12+b.c12;
  400.     res.c13 = a.c13+b.c13;
  401.     res.c14 = a.c14+b.c14;
  402.     res.c15 = a.c15+b.c15;
  403.     res.c16 = a.c16+b.c16;
  404.     res.c17 = a.c17+b.c17;
  405.     res.c18 = a.c18+b.c18;
  406.     res.c19 = a.c19+b.c19;
  407.     res.c20 = a.c20+b.c20;
  408.     res.c21 = a.c21+b.c21;
  409.     res.c22 = a.c22+b.c22;
  410.     res.c23 = a.c23+b.c23;
  411.     res.c24 = a.c24+b.c24;
  412.     res.c25 = a.c25+b.c25;
  413.     res.c26 = a.c26+b.c26;
  414.     res.c27 = a.c27+b.c27;
  415.     res.c28 = a.c28+b.c28;
  416.     res.c29 = a.c29+b.c29;
  417.     res.c30 = a.c30+b.c30;
  418.     res.c31 = a.c31+b.c31;
  419.   return res;
  420. }
  421.  
  422. //***********************
  423. // CGA.Sub : res = a - b
  424. // Multivector subtraction
  425. //***********************
  426. Mvec sub(Mvec a, Mvec b) {
  427.   Mvec res;
  428.       res.c0 = a.c0-b.c0;
  429.     res.c1 = a.c1-b.c1;
  430.     res.c2 = a.c2-b.c2;
  431.     res.c3 = a.c3-b.c3;
  432.     res.c4 = a.c4-b.c4;
  433.     res.c5 = a.c5-b.c5;
  434.     res.c6 = a.c6-b.c6;
  435.     res.c7 = a.c7-b.c7;
  436.     res.c8 = a.c8-b.c8;
  437.     res.c9 = a.c9-b.c9;
  438.     res.c10 = a.c10-b.c10;
  439.     res.c11 = a.c11-b.c11;
  440.     res.c12 = a.c12-b.c12;
  441.     res.c13 = a.c13-b.c13;
  442.     res.c14 = a.c14-b.c14;
  443.     res.c15 = a.c15-b.c15;
  444.     res.c16 = a.c16-b.c16;
  445.     res.c17 = a.c17-b.c17;
  446.     res.c18 = a.c18-b.c18;
  447.     res.c19 = a.c19-b.c19;
  448.     res.c20 = a.c20-b.c20;
  449.     res.c21 = a.c21-b.c21;
  450.     res.c22 = a.c22-b.c22;
  451.     res.c23 = a.c23-b.c23;
  452.     res.c24 = a.c24-b.c24;
  453.     res.c25 = a.c25-b.c25;
  454.     res.c26 = a.c26-b.c26;
  455.     res.c27 = a.c27-b.c27;
  456.     res.c28 = a.c28-b.c28;
  457.     res.c29 = a.c29-b.c29;
  458.     res.c30 = a.c30-b.c30;
  459.     res.c31 = a.c31-b.c31;
  460.   return res;
  461. }
  462.  
  463. //***********************
  464. // CGA.smul : res = a * b
  465. // scalar/multivector multiplication
  466. //***********************
  467. Mvec scale(Mvec b, float a) {
  468.   Mvec res;
  469.       res.c0 = a*b.c0;
  470.     res.c1 = a*b.c1;
  471.     res.c2 = a*b.c2;
  472.     res.c3 = a*b.c3;
  473.     res.c4 = a*b.c4;
  474.     res.c5 = a*b.c5;
  475.     res.c6 = a*b.c6;
  476.     res.c7 = a*b.c7;
  477.     res.c8 = a*b.c8;
  478.     res.c9 = a*b.c9;
  479.     res.c10 = a*b.c10;
  480.     res.c11 = a*b.c11;
  481.     res.c12 = a*b.c12;
  482.     res.c13 = a*b.c13;
  483.     res.c14 = a*b.c14;
  484.     res.c15 = a*b.c15;
  485.     res.c16 = a*b.c16;
  486.     res.c17 = a*b.c17;
  487.     res.c18 = a*b.c18;
  488.     res.c19 = a*b.c19;
  489.     res.c20 = a*b.c20;
  490.     res.c21 = a*b.c21;
  491.     res.c22 = a*b.c22;
  492.     res.c23 = a*b.c23;
  493.     res.c24 = a*b.c24;
  494.     res.c25 = a*b.c25;
  495.     res.c26 = a*b.c26;
  496.     res.c27 = a*b.c27;
  497.     res.c28 = a*b.c28;
  498.     res.c29 = a*b.c29;
  499.     res.c30 = a*b.c30;
  500.     res.c31 = a*b.c31;
  501.   return res;
  502. }
  503.  
  504. float quadraticNorm(Mvec a) {
  505.     return inner(reverse(a), a).c0;
  506. }
  507.  
  508. Mvec inv(Mvec a) {
  509.     float n = quadraticNorm(a);
  510.     if(abs(n) < 0.0000001) {
  511.         Mvec res;
  512.         return res;
  513.     }
  514.     return scale(reverse(a), 1./n);
  515. }
  516.  
  517. float norm(Mvec a) {
  518.     return sqrt(abs(
  519.         mul(a, conjugate(a)).c0
  520.     ));
  521. }
  522.  
  523. float inorm(Mvec a) { return norm(dual(a)); }
  524.  
  525. Mvec normalized(Mvec a) {
  526.     return scale(a, 1./norm(a));
  527. }
  528.  
  529. Mvec fromPoint(vec3 v) {
  530.     Mvec res;
  531.     float d = dot(v, v);
  532.     res.c1 = v.x;
  533.     res.c2 = v.y;
  534.     res.c3 = v.z;
  535.     res.c4 = 1. - 0.5 * d;
  536.     res.c5 = 1. + 0.5 * d;
  537.     return res;
  538. }
  539.  
  540. Mvec fromDirection(vec3 v) {
  541.     Mvec res;
  542.     res.c1 = v.x;
  543.     res.c2 = v.y;
  544.     res.c3 = v.z;
  545.     return res;
  546. }
  547.  
  548. Mvec createDualSphere(vec3 center, float radiusSq) {
  549.     Mvec res = fromPoint(center);
  550.     res.c4 += 0.5 * radiusSq;
  551.     res.c5 -= 0.5 * radiusSq;
  552.     return res;
  553. }
  554.  
  555. void extractPointPair(Mvec ptPair, out Mvec p1, out Mvec p2) {
  556.     Mvec ei;
  557.     ei.c4 = -0.5;
  558.     ei.c5 =  0.5;
  559.     Mvec invDenominator = inv(inner(ei, ptPair));
  560.     Mvec truc; truc.c0 = sqrt(abs(inner(ptPair, ptPair).c0));
  561.     p1 = mul(
  562.             add(
  563.                 ptPair,
  564.                 truc
  565.             ),
  566.             invDenominator
  567.     );
  568.     p2 = mul(
  569.             sub(
  570.                 ptPair,
  571.                 truc
  572.             ),
  573.             invDenominator
  574.     );
  575. }
  576.  
  577. void main()
  578. {
  579.     Mvec e1, e2, e3, e4, e5, e0, ei;
  580.     e1.c1 = 1.;
  581.     e2.c2 = 1.;
  582.     e3.c3 = 1.;
  583.     e4.c4 = 1.;
  584.     e5.c5 = 1.;
  585.     e0 = add(e4, e5);
  586.     ei = scale(sub(e5, e4), 0.5);
  587.     vec3 col = vec3(0.);
  588.     // Setup camera
  589.     Mvec ro = fromPoint(uCamPos);
  590.     Mvec rd = fromDirection(
  591.         normalize(
  592.               uCamX * (vTexCoords.x - 0.5) * uAspectRatio
  593.             + uCamY * (vTexCoords.y - 0.5)
  594.             - uCamZ * uFocalLength
  595.         )
  596.     );
  597.     // Scene params
  598.     float sphereRadius = 2.5;
  599.     Mvec sphereCenter = fromPoint(vec3(0.));
  600.     Mvec dualSphere = createDualSphere(vec3(0.), sphereRadius * sphereRadius);
  601.     // Ray Tracing
  602.     Mvec rayLine = outer(outer(ro, rd), ei);
  603.     Mvec intersectionPtPair = dual(outer(dualSphere, dual(rayLine)));
  604.         // Normal
  605.         Mvec p1, p2;
  606.         extractPointPair(intersectionPtPair, p1, p2);
  607.     vec3 ro2p2 = vec3(
  608.         p2.c1 - ro.c1,
  609.         p2.c2 - ro.c2,
  610.         p2.c3 - ro.c3
  611.     );
  612.         Mvec normal;
  613.     if (dot(ro2p2, vec3(rd.c1, rd.c2, rd.c3)) < 0) {
  614.         normal = normalized(sub(p1, sphereCenter));
  615.     }
  616.     else {
  617.         normal = normalized(sub(p2, sphereCenter));
  618.     }
  619.        
  620.         col = vec3(normal.c1, normal.c2, normal.c3);
  621.     //
  622.     col = pow(abs(col), vec3(.4545)); // gamma correction
  623.     gl_FragColor = vec4(col,1.0);
  624. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement