js/src/devtools/jint/sunspider/3d-cube.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 // 3D Cube Rotation
     2 // http://www.speich.net/computer/moztesting/3d.htm
     3 // Created by Simon Speich
     5 var Q = new Array();
     6 var MTrans = new Array();  // transformation matrix
     7 var MQube = new Array();  // position information of qube
     8 var I = new Array();      // entity matrix
     9 var Origin = new Object();
    10 var Testing = new Object();
    11 var LoopTimer;
    13 var DisplArea = new Object();
    14 DisplArea.Width = 300;
    15 DisplArea.Height = 300;
    17 function DrawLine(From, To) {
    18   var x1 = From.V[0];
    19   var x2 = To.V[0];
    20   var y1 = From.V[1];
    21   var y2 = To.V[1];
    22   var dx = Math.abs(x2 - x1);
    23   var dy = Math.abs(y2 - y1);
    24   var x = x1;
    25   var y = y1;
    26   var IncX1, IncY1;
    27   var IncX2, IncY2;  
    28   var Den;
    29   var Num;
    30   var NumAdd;
    31   var NumPix;
    33   if (x2 >= x1) {  IncX1 = 1; IncX2 = 1;  }
    34   else { IncX1 = -1; IncX2 = -1; }
    35   if (y2 >= y1)  {  IncY1 = 1; IncY2 = 1; }
    36   else { IncY1 = -1; IncY2 = -1; }
    37   if (dx >= dy) {
    38     IncX1 = 0;
    39     IncY2 = 0;
    40     Den = dx;
    41     Num = dx / 2;
    42     NumAdd = dy;
    43     NumPix = dx;
    44   }
    45   else {
    46     IncX2 = 0;
    47     IncY1 = 0;
    48     Den = dy;
    49     Num = dy / 2;
    50     NumAdd = dx;
    51     NumPix = dy;
    52   }
    54   NumPix = Math.round(Q.LastPx + NumPix);
    56   var i = Q.LastPx;
    57 /* BEGIN LOOP */
    58   for (; i < NumPix; i++) {
    59     Num += NumAdd;
    60     if (Num >= Den) {
    61       Num -= Den;
    62       x += IncX1;
    63       y += IncY1;
    64     }
    65     x += IncX2;
    66     y += IncY2;
    67   }
    68 /* END LOOP */
    69   Q.LastPx = NumPix;
    70 }
    72 function CalcCross(V0, V1) {
    73   var Cross = new Array();
    74   Cross[0] = V0[1]*V1[2] - V0[2]*V1[1];
    75   Cross[1] = V0[2]*V1[0] - V0[0]*V1[2];
    76   Cross[2] = V0[0]*V1[1] - V0[1]*V1[0];
    77   return Cross;
    78 }
    80 function CalcNormal(V0, V1, V2) {
    81   var A = new Array();   var B = new Array(); 
    82 /* BEGIN LOOP */
    83   for (var i = 0; i < 3; i++) {
    84     A[i] = V0[i] - V1[i];
    85     B[i] = V2[i] - V1[i];
    86   }
    87 /* END LOOP */
    88   A = CalcCross(A, B);
    89   var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); 
    90 /* BEGIN LOOP */
    91   for (var i = 0; i < 3; i++) A[i] = A[i] / Length;
    92 /* END LOOP */
    93   A[3] = 1;
    94   return A;
    95 }
    97 function CreateP(X,Y,Z) {
    98   this.V = [X,Y,Z,1];
    99 }
   101 // multiplies two matrices
   102 function MMulti(M1, M2) {
   103   var M = [[],[],[],[]];
   104   var i = 0;
   105   var j = 0;
   106 /* BEGIN LOOP */
   107   for (; i < 4; i++) {
   108     j = 0;
   109 /* BEGIN LOOP */
   110     for (; j < 4; j++) M[i][j] = M1[i][0] * M2[0][j] + M1[i][1] * M2[1][j] + M1[i][2] * M2[2][j] + M1[i][3] * M2[3][j];
   111 /* END LOOP */
   112   }
   113 /* END LOOP */
   114   return M;
   115 }
   117 //multiplies matrix with vector
   118 function VMulti(M, V) {
   119   var Vect = new Array();
   120   var i = 0;
   121 /* BEGIN LOOP */
   122   for (;i < 4; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2] + M[i][3] * V[3];
   123 /* END LOOP */
   124   return Vect;
   125 }
   127 function VMulti2(M, V) {
   128   var Vect = new Array();
   129   var i = 0;
   130 /* BEGIN LOOP */
   131   for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2];
   132 /* END LOOP */
   133   return Vect;
   134 }
   136 // add to matrices
   137 function MAdd(M1, M2) {
   138   var M = [[],[],[],[]];
   139   var i = 0;
   140   var j = 0;
   141 /* BEGIN LOOP */
   142   for (; i < 4; i++) {
   143     j = 0;
   144 /* BEGIN LOOP */
   145     for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j];
   146 /* END LOOP */
   147   }
   148 /* END LOOP */
   149   return M;
   150 }
   152 function Translate(M, Dx, Dy, Dz) {
   153   var T = [
   154   [1,0,0,Dx],
   155   [0,1,0,Dy],
   156   [0,0,1,Dz],
   157   [0,0,0,1]
   158   ];
   159   return MMulti(T, M);
   160 }
   162 function RotateX(M, Phi) {
   163   var a = Phi;
   164   a *= Math.PI / 180;
   165   var Cos = Math.cos(a);
   166   var Sin = Math.sin(a);
   167   var R = [
   168   [1,0,0,0],
   169   [0,Cos,-Sin,0],
   170   [0,Sin,Cos,0],
   171   [0,0,0,1]
   172   ];
   173   return MMulti(R, M);
   174 }
   176 function RotateY(M, Phi) {
   177   var a = Phi;
   178   a *= Math.PI / 180;
   179   var Cos = Math.cos(a);
   180   var Sin = Math.sin(a);
   181   var R = [
   182   [Cos,0,Sin,0],
   183   [0,1,0,0],
   184   [-Sin,0,Cos,0],
   185   [0,0,0,1]
   186   ];
   187   return MMulti(R, M);
   188 }
   190 function RotateZ(M, Phi) {
   191   var a = Phi;
   192   a *= Math.PI / 180;
   193   var Cos = Math.cos(a);
   194   var Sin = Math.sin(a);
   195   var R = [
   196   [Cos,-Sin,0,0],
   197   [Sin,Cos,0,0],
   198   [0,0,1,0],   
   199   [0,0,0,1]
   200   ];
   201   return MMulti(R, M);
   202 }
   204 function DrawQube() {
   205   // calc current normals
   206   var CurN = new Array();
   207   var i = 5;
   208   Q.LastPx = 0;
   209 /* BEGIN LOOP */
   210   for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]);
   211 /* END LOOP */
   212   if (CurN[0][2] < 0) {
   213     if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; };
   214     if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; };
   215     if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; };
   216     if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; };
   217   }
   218   if (CurN[1][2] < 0) {
   219     if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; };
   220     if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; };
   221     if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
   222     if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; };
   223   }
   224   if (CurN[2][2] < 0) {
   225     if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
   226     if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
   227     if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
   228     if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
   229   }
   230   if (CurN[3][2] < 0) {
   231     if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
   232     if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; };
   233     if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; };
   234     if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; };
   235   }
   236   if (CurN[4][2] < 0) {
   237     if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; };
   238     if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; };
   239     if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; };
   240     if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
   241   }
   242   if (CurN[5][2] < 0) {
   243     if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; };
   244     if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
   245     if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; };
   246     if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; };
   247   }
   248   Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
   249   Q.LastPx = 0;
   250 }
   252 function Loop() {
   253   if (Testing.LoopCount > Testing.LoopMax) return;
   254   var TestingStr = String(Testing.LoopCount);
   255 /* BEGIN LOOP */
   256   while (TestingStr.length < 3) TestingStr = "0" + TestingStr;
   257 /* END LOOP */
   258   MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]);
   259   MTrans = RotateX(MTrans, 1);
   260   MTrans = RotateY(MTrans, 3);
   261   MTrans = RotateZ(MTrans, 5);
   262   MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]);
   263   MQube = MMulti(MTrans, MQube);
   264   var i = 8;
   265 /* BEGIN LOOP */
   266   for (; i > -1; i--) {
   267     Q[i].V = VMulti(MTrans, Q[i].V);
   268   }
   269 /* END LOOP */
   270   DrawQube();
   271   Testing.LoopCount++;
   272   Loop();
   273 }
   275 function Init(CubeSize) {
   276   // init/reset vars
   277   Origin.V = [150,150,20,1];
   278   Testing.LoopCount = 0;
   279   Testing.LoopMax = 50;
   280   Testing.TimeMax = 0;
   281   Testing.TimeAvg = 0;
   282   Testing.TimeMin = 0;
   283   Testing.TimeTemp = 0;
   284   Testing.TimeTotal = 0;
   285   Testing.Init = false;
   287   // transformation matrix
   288   MTrans = [
   289   [1,0,0,0],
   290   [0,1,0,0],
   291   [0,0,1,0],
   292   [0,0,0,1]
   293   ];
   295   // position information of qube
   296   MQube = [
   297   [1,0,0,0],
   298   [0,1,0,0],
   299   [0,0,1,0],
   300   [0,0,0,1]
   301   ];
   303   // entity matrix
   304   I = [
   305   [1,0,0,0],
   306   [0,1,0,0],
   307   [0,0,1,0],
   308   [0,0,0,1]
   309   ];
   311   // create qube
   312   Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize);
   313   Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize);
   314   Q[2] = new CreateP( CubeSize, CubeSize, CubeSize);
   315   Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize);
   316   Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize);
   317   Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize);
   318   Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize);
   319   Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize);
   321   // center of gravity
   322   Q[8] = new CreateP(0, 0, 0);
   324   // anti-clockwise edge check
   325   Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
   327   // calculate squad normals
   328   Q.Normal = new Array();
   329 /* BEGIN LOOP */
   330   for (var i = 0; i < Q.Edge.length; i++) Q.Normal[i] = CalcNormal(Q[Q.Edge[i][0]].V, Q[Q.Edge[i][1]].V, Q[Q.Edge[i][2]].V);
   331 /* END LOOP */
   333   // line drawn ?
   334   Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
   336   // create line pixels
   337   Q.NumPx = 9 * 2 * CubeSize;
   338 /* BEGIN LOOP */
   339   for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0);
   340 /* END LOOP */
   342   MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]);
   343   MQube = MMulti(MTrans, MQube);
   345   var i = 0;
   346 /* BEGIN LOOP */
   347   for (; i < 9; i++) {
   348     Q[i].V = VMulti(MTrans, Q[i].V);
   349   }
   350 /* END LOOP */
   351   DrawQube();
   352   Testing.Init = true;
   353   Loop();
   354 }
   356 /* BEGIN LOOP */
   357 for ( var i = 20; i <= 160; i *= 2 ) {
   358   Init(i);
   359 }
   360 /* END LOOP */
   362 Q = null;
   363 MTrans = null;
   364 MQube = null;
   365 I = null;
   366 Origin = null;
   367 Testing = null;
   368 LoopTime = null;
   369 DisplArea = null;

mercurial