tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

3d-cube.html (9720B)


      1 <!DOCTYPE html>
      2 <head>
      3 <!--
      4 Copyright (C) 2007 Apple Inc.  All rights reserved.
      5 
      6 Redistribution and use in source and binary forms, with or without
      7 modification, are permitted provided that the following conditions
      8 are met:
      9 1. Redistributions of source code must retain the above copyright
     10    notice, this list of conditions and the following disclaimer.
     11 2. Redistributions in binary form must reproduce the above copyright
     12    notice, this list of conditions and the following disclaimer in the
     13    documentation and/or other materials provided with the distribution.
     14 
     15 THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     16 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     18 PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     19 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     23 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
     26 -->
     27 
     28 <title>SunSpider 3d-cube</title>
     29 
     30 </head>
     31 
     32 <body>
     33 <h3>3d-cube</h3>
     34 <div id="console">
     35 </div>
     36 
     37 <script>
     38 
     39 var _sunSpiderStartDate = new Date();
     40 
     41 // 3D Cube Rotation
     42 // http://www.speich.net/computer/moztesting/3d.htm
     43 // Created by Simon Speich
     44 
     45 var Q = new Array();
     46 var MTrans = new Array();  // transformation matrix
     47 var MQube = new Array();  // position information of qube
     48 var I = new Array();      // entity matrix
     49 var Origin = new Object();
     50 var Testing = new Object();
     51 var LoopTimer;
     52 
     53 var DisplArea = new Object();
     54 DisplArea.Width = 300;
     55 DisplArea.Height = 300;
     56 
     57 function DrawLine(From, To) {
     58  var x1 = From.V[0];
     59  var x2 = To.V[0];
     60  var y1 = From.V[1];
     61  var y2 = To.V[1];
     62  var dx = Math.abs(x2 - x1);
     63  var dy = Math.abs(y2 - y1);
     64  var x = x1;
     65  var y = y1;
     66  var IncX1, IncY1;
     67  var IncX2, IncY2;  
     68  var Den;
     69  var Num;
     70  var NumAdd;
     71  var NumPix;
     72 
     73  if (x2 >= x1) {  IncX1 = 1; IncX2 = 1;  }
     74  else { IncX1 = -1; IncX2 = -1; }
     75  if (y2 >= y1)  {  IncY1 = 1; IncY2 = 1; }
     76  else { IncY1 = -1; IncY2 = -1; }
     77  if (dx >= dy) {
     78    IncX1 = 0;
     79    IncY2 = 0;
     80    Den = dx;
     81    Num = dx / 2;
     82    NumAdd = dy;
     83    NumPix = dx;
     84  }
     85  else {
     86    IncX2 = 0;
     87    IncY1 = 0;
     88    Den = dy;
     89    Num = dy / 2;
     90    NumAdd = dx;
     91    NumPix = dy;
     92  }
     93 
     94  NumPix = Math.round(Q.LastPx + NumPix);
     95 
     96  var i = Q.LastPx;
     97  for (; i < NumPix; i++) {
     98    Num += NumAdd;
     99    if (Num >= Den) {
    100      Num -= Den;
    101      x += IncX1;
    102      y += IncY1;
    103    }
    104    x += IncX2;
    105    y += IncY2;
    106  }
    107  Q.LastPx = NumPix;
    108 }
    109 
    110 function CalcCross(V0, V1) {
    111  var Cross = new Array();
    112  Cross[0] = V0[1]*V1[2] - V0[2]*V1[1];
    113  Cross[1] = V0[2]*V1[0] - V0[0]*V1[2];
    114  Cross[2] = V0[0]*V1[1] - V0[1]*V1[0];
    115  return Cross;
    116 }
    117 
    118 function CalcNormal(V0, V1, V2) {
    119  var A = new Array();   var B = new Array(); 
    120  for (var i = 0; i < 3; i++) {
    121    A[i] = V0[i] - V1[i];
    122    B[i] = V2[i] - V1[i];
    123  }
    124  A = CalcCross(A, B);
    125  var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); 
    126  for (var i = 0; i < 3; i++) A[i] = A[i] / Length;
    127  A[3] = 1;
    128  return A;
    129 }
    130 
    131 function CreateP(X,Y,Z) {
    132  this.V = [X,Y,Z,1];
    133 }
    134 
    135 // multiplies two matrices
    136 function MMulti(M1, M2) {
    137  var M = [[],[],[],[]];
    138  var i = 0;
    139  var j = 0;
    140  for (; i < 4; i++) {
    141    j = 0;
    142    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];
    143  }
    144  return M;
    145 }
    146 
    147 //multiplies matrix with vector
    148 function VMulti(M, V) {
    149  var Vect = new Array();
    150  var i = 0;
    151  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];
    152  return Vect;
    153 }
    154 
    155 function VMulti2(M, V) {
    156  var Vect = new Array();
    157  var i = 0;
    158  for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2];
    159  return Vect;
    160 }
    161 
    162 // add to matrices
    163 function MAdd(M1, M2) {
    164  var M = [[],[],[],[]];
    165  var i = 0;
    166  var j = 0;
    167  for (; i < 4; i++) {
    168    j = 0;
    169    for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j];
    170  }
    171  return M;
    172 }
    173 
    174 function Translate(M, Dx, Dy, Dz) {
    175  var T = [
    176  [1,0,0,Dx],
    177  [0,1,0,Dy],
    178  [0,0,1,Dz],
    179  [0,0,0,1]
    180  ];
    181  return MMulti(T, M);
    182 }
    183 
    184 function RotateX(M, Phi) {
    185  var a = Phi;
    186  a *= Math.PI / 180;
    187  var Cos = Math.cos(a);
    188  var Sin = Math.sin(a);
    189  var R = [
    190  [1,0,0,0],
    191  [0,Cos,-Sin,0],
    192  [0,Sin,Cos,0],
    193  [0,0,0,1]
    194  ];
    195  return MMulti(R, M);
    196 }
    197 
    198 function RotateY(M, Phi) {
    199  var a = Phi;
    200  a *= Math.PI / 180;
    201  var Cos = Math.cos(a);
    202  var Sin = Math.sin(a);
    203  var R = [
    204  [Cos,0,Sin,0],
    205  [0,1,0,0],
    206  [-Sin,0,Cos,0],
    207  [0,0,0,1]
    208  ];
    209  return MMulti(R, M);
    210 }
    211 
    212 function RotateZ(M, Phi) {
    213  var a = Phi;
    214  a *= Math.PI / 180;
    215  var Cos = Math.cos(a);
    216  var Sin = Math.sin(a);
    217  var R = [
    218  [Cos,-Sin,0,0],
    219  [Sin,Cos,0,0],
    220  [0,0,1,0],   
    221  [0,0,0,1]
    222  ];
    223  return MMulti(R, M);
    224 }
    225 
    226 function DrawQube() {
    227  // calc current normals
    228  var CurN = new Array();
    229  var i = 5;
    230  Q.LastPx = 0;
    231  for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]);
    232  if (CurN[0][2] < 0) {
    233    if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; };
    234    if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; };
    235    if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; };
    236    if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; };
    237  }
    238  if (CurN[1][2] < 0) {
    239    if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; };
    240    if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; };
    241    if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
    242    if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; };
    243  }
    244  if (CurN[2][2] < 0) {
    245    if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
    246    if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
    247    if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; };
    248    if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
    249  }
    250  if (CurN[3][2] < 0) {
    251    if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; };
    252    if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; };
    253    if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; };
    254    if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; };
    255  }
    256  if (CurN[4][2] < 0) {
    257    if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; };
    258    if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; };
    259    if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; };
    260    if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; };
    261  }
    262  if (CurN[5][2] < 0) {
    263    if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; };
    264    if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; };
    265    if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; };
    266    if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; };
    267  }
    268  Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
    269  Q.LastPx = 0;
    270 }
    271 
    272 function Loop() {
    273  if (Testing.LoopCount > Testing.LoopMax) return;
    274  var TestingStr = String(Testing.LoopCount);
    275  while (TestingStr.length < 3) TestingStr = "0" + TestingStr;
    276  MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]);
    277  MTrans = RotateX(MTrans, 1);
    278  MTrans = RotateY(MTrans, 3);
    279  MTrans = RotateZ(MTrans, 5);
    280  MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]);
    281  MQube = MMulti(MTrans, MQube);
    282  var i = 8;
    283  for (; i > -1; i--) {
    284    Q[i].V = VMulti(MTrans, Q[i].V);
    285  }
    286  DrawQube();
    287  Testing.LoopCount++;
    288  Loop();
    289 }
    290 
    291 function Init(CubeSize) {
    292  // init/reset vars
    293  Origin.V = [150,150,20,1];
    294  Testing.LoopCount = 0;
    295  Testing.LoopMax = 50;
    296  Testing.TimeMax = 0;
    297  Testing.TimeAvg = 0;
    298  Testing.TimeMin = 0;
    299  Testing.TimeTemp = 0;
    300  Testing.TimeTotal = 0;
    301  Testing.Init = false;
    302 
    303  // transformation matrix
    304  MTrans = [
    305  [1,0,0,0],
    306  [0,1,0,0],
    307  [0,0,1,0],
    308  [0,0,0,1]
    309  ];
    310  
    311  // position information of qube
    312  MQube = [
    313  [1,0,0,0],
    314  [0,1,0,0],
    315  [0,0,1,0],
    316  [0,0,0,1]
    317  ];
    318  
    319  // entity matrix
    320  I = [
    321  [1,0,0,0],
    322  [0,1,0,0],
    323  [0,0,1,0],
    324  [0,0,0,1]
    325  ];
    326  
    327  // create qube
    328  Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize);
    329  Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize);
    330  Q[2] = new CreateP( CubeSize, CubeSize, CubeSize);
    331  Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize);
    332  Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize);
    333  Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize);
    334  Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize);
    335  Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize);
    336  
    337  // center of gravity
    338  Q[8] = new CreateP(0, 0, 0);
    339  
    340  // anti-clockwise edge check
    341  Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
    342  
    343  // calculate squad normals
    344  Q.Normal = new Array();
    345  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);
    346  
    347  // line drawn ?
    348  Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false];
    349  
    350  // create line pixels
    351  Q.NumPx = 9 * 2 * CubeSize;
    352  for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0);
    353  
    354  MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]);
    355  MQube = MMulti(MTrans, MQube);
    356 
    357  var i = 0;
    358  for (; i < 9; i++) {
    359    Q[i].V = VMulti(MTrans, Q[i].V);
    360  }
    361  DrawQube();
    362  Testing.Init = true;
    363  Loop();
    364 }
    365 
    366 for ( var i = 20; i <= 160; i *= 2 ) {
    367  Init(i);
    368 }
    369 
    370 Q = null;
    371 MTrans = null;
    372 MQube = null;
    373 I = null;
    374 Origin = null;
    375 Testing = null;
    376 LoopTime = null;
    377 DisplArea = null;
    378 
    379 
    380 var _sunSpiderInterval = new Date() - _sunSpiderStartDate;
    381 
    382 document.getElementById("console").innerHTML = _sunSpiderInterval;
    383 </script>
    384 
    385 
    386 </body>
    387 </html>