1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/build/pgo/js-input/3d-cube.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,387 @@ 1.4 +<!DOCTYPE html> 1.5 +<head> 1.6 +<!-- 1.7 + Copyright (C) 2007 Apple Inc. All rights reserved. 1.8 + 1.9 + Redistribution and use in source and binary forms, with or without 1.10 + modification, are permitted provided that the following conditions 1.11 + are met: 1.12 + 1. Redistributions of source code must retain the above copyright 1.13 + notice, this list of conditions and the following disclaimer. 1.14 + 2. Redistributions in binary form must reproduce the above copyright 1.15 + notice, this list of conditions and the following disclaimer in the 1.16 + documentation and/or other materials provided with the distribution. 1.17 + 1.18 + THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 1.19 + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.20 + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1.21 + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 1.22 + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 1.23 + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 1.24 + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 1.25 + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 1.26 + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1.27 + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1.28 + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1.29 +--> 1.30 + 1.31 +<title>SunSpider 3d-cube</title> 1.32 + 1.33 +</head> 1.34 + 1.35 +<body> 1.36 +<h3>3d-cube</h3> 1.37 +<div id="console"> 1.38 +</div> 1.39 + 1.40 +<script> 1.41 + 1.42 +var _sunSpiderStartDate = new Date(); 1.43 + 1.44 +// 3D Cube Rotation 1.45 +// http://www.speich.net/computer/moztesting/3d.htm 1.46 +// Created by Simon Speich 1.47 + 1.48 +var Q = new Array(); 1.49 +var MTrans = new Array(); // transformation matrix 1.50 +var MQube = new Array(); // position information of qube 1.51 +var I = new Array(); // entity matrix 1.52 +var Origin = new Object(); 1.53 +var Testing = new Object(); 1.54 +var LoopTimer; 1.55 + 1.56 +var DisplArea = new Object(); 1.57 +DisplArea.Width = 300; 1.58 +DisplArea.Height = 300; 1.59 + 1.60 +function DrawLine(From, To) { 1.61 + var x1 = From.V[0]; 1.62 + var x2 = To.V[0]; 1.63 + var y1 = From.V[1]; 1.64 + var y2 = To.V[1]; 1.65 + var dx = Math.abs(x2 - x1); 1.66 + var dy = Math.abs(y2 - y1); 1.67 + var x = x1; 1.68 + var y = y1; 1.69 + var IncX1, IncY1; 1.70 + var IncX2, IncY2; 1.71 + var Den; 1.72 + var Num; 1.73 + var NumAdd; 1.74 + var NumPix; 1.75 + 1.76 + if (x2 >= x1) { IncX1 = 1; IncX2 = 1; } 1.77 + else { IncX1 = -1; IncX2 = -1; } 1.78 + if (y2 >= y1) { IncY1 = 1; IncY2 = 1; } 1.79 + else { IncY1 = -1; IncY2 = -1; } 1.80 + if (dx >= dy) { 1.81 + IncX1 = 0; 1.82 + IncY2 = 0; 1.83 + Den = dx; 1.84 + Num = dx / 2; 1.85 + NumAdd = dy; 1.86 + NumPix = dx; 1.87 + } 1.88 + else { 1.89 + IncX2 = 0; 1.90 + IncY1 = 0; 1.91 + Den = dy; 1.92 + Num = dy / 2; 1.93 + NumAdd = dx; 1.94 + NumPix = dy; 1.95 + } 1.96 + 1.97 + NumPix = Math.round(Q.LastPx + NumPix); 1.98 + 1.99 + var i = Q.LastPx; 1.100 + for (; i < NumPix; i++) { 1.101 + Num += NumAdd; 1.102 + if (Num >= Den) { 1.103 + Num -= Den; 1.104 + x += IncX1; 1.105 + y += IncY1; 1.106 + } 1.107 + x += IncX2; 1.108 + y += IncY2; 1.109 + } 1.110 + Q.LastPx = NumPix; 1.111 +} 1.112 + 1.113 +function CalcCross(V0, V1) { 1.114 + var Cross = new Array(); 1.115 + Cross[0] = V0[1]*V1[2] - V0[2]*V1[1]; 1.116 + Cross[1] = V0[2]*V1[0] - V0[0]*V1[2]; 1.117 + Cross[2] = V0[0]*V1[1] - V0[1]*V1[0]; 1.118 + return Cross; 1.119 +} 1.120 + 1.121 +function CalcNormal(V0, V1, V2) { 1.122 + var A = new Array(); var B = new Array(); 1.123 + for (var i = 0; i < 3; i++) { 1.124 + A[i] = V0[i] - V1[i]; 1.125 + B[i] = V2[i] - V1[i]; 1.126 + } 1.127 + A = CalcCross(A, B); 1.128 + var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); 1.129 + for (var i = 0; i < 3; i++) A[i] = A[i] / Length; 1.130 + A[3] = 1; 1.131 + return A; 1.132 +} 1.133 + 1.134 +function CreateP(X,Y,Z) { 1.135 + this.V = [X,Y,Z,1]; 1.136 +} 1.137 + 1.138 +// multiplies two matrices 1.139 +function MMulti(M1, M2) { 1.140 + var M = [[],[],[],[]]; 1.141 + var i = 0; 1.142 + var j = 0; 1.143 + for (; i < 4; i++) { 1.144 + j = 0; 1.145 + 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]; 1.146 + } 1.147 + return M; 1.148 +} 1.149 + 1.150 +//multiplies matrix with vector 1.151 +function VMulti(M, V) { 1.152 + var Vect = new Array(); 1.153 + var i = 0; 1.154 + 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]; 1.155 + return Vect; 1.156 +} 1.157 + 1.158 +function VMulti2(M, V) { 1.159 + var Vect = new Array(); 1.160 + var i = 0; 1.161 + for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2]; 1.162 + return Vect; 1.163 +} 1.164 + 1.165 +// add to matrices 1.166 +function MAdd(M1, M2) { 1.167 + var M = [[],[],[],[]]; 1.168 + var i = 0; 1.169 + var j = 0; 1.170 + for (; i < 4; i++) { 1.171 + j = 0; 1.172 + for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j]; 1.173 + } 1.174 + return M; 1.175 +} 1.176 + 1.177 +function Translate(M, Dx, Dy, Dz) { 1.178 + var T = [ 1.179 + [1,0,0,Dx], 1.180 + [0,1,0,Dy], 1.181 + [0,0,1,Dz], 1.182 + [0,0,0,1] 1.183 + ]; 1.184 + return MMulti(T, M); 1.185 +} 1.186 + 1.187 +function RotateX(M, Phi) { 1.188 + var a = Phi; 1.189 + a *= Math.PI / 180; 1.190 + var Cos = Math.cos(a); 1.191 + var Sin = Math.sin(a); 1.192 + var R = [ 1.193 + [1,0,0,0], 1.194 + [0,Cos,-Sin,0], 1.195 + [0,Sin,Cos,0], 1.196 + [0,0,0,1] 1.197 + ]; 1.198 + return MMulti(R, M); 1.199 +} 1.200 + 1.201 +function RotateY(M, Phi) { 1.202 + var a = Phi; 1.203 + a *= Math.PI / 180; 1.204 + var Cos = Math.cos(a); 1.205 + var Sin = Math.sin(a); 1.206 + var R = [ 1.207 + [Cos,0,Sin,0], 1.208 + [0,1,0,0], 1.209 + [-Sin,0,Cos,0], 1.210 + [0,0,0,1] 1.211 + ]; 1.212 + return MMulti(R, M); 1.213 +} 1.214 + 1.215 +function RotateZ(M, Phi) { 1.216 + var a = Phi; 1.217 + a *= Math.PI / 180; 1.218 + var Cos = Math.cos(a); 1.219 + var Sin = Math.sin(a); 1.220 + var R = [ 1.221 + [Cos,-Sin,0,0], 1.222 + [Sin,Cos,0,0], 1.223 + [0,0,1,0], 1.224 + [0,0,0,1] 1.225 + ]; 1.226 + return MMulti(R, M); 1.227 +} 1.228 + 1.229 +function DrawQube() { 1.230 + // calc current normals 1.231 + var CurN = new Array(); 1.232 + var i = 5; 1.233 + Q.LastPx = 0; 1.234 + for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]); 1.235 + if (CurN[0][2] < 0) { 1.236 + if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; }; 1.237 + if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; }; 1.238 + if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; }; 1.239 + if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; }; 1.240 + } 1.241 + if (CurN[1][2] < 0) { 1.242 + if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; }; 1.243 + if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; }; 1.244 + if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; }; 1.245 + if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; }; 1.246 + } 1.247 + if (CurN[2][2] < 0) { 1.248 + if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; }; 1.249 + if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; }; 1.250 + if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; }; 1.251 + if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; }; 1.252 + } 1.253 + if (CurN[3][2] < 0) { 1.254 + if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; }; 1.255 + if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; }; 1.256 + if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; }; 1.257 + if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; }; 1.258 + } 1.259 + if (CurN[4][2] < 0) { 1.260 + if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; }; 1.261 + if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; }; 1.262 + if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; }; 1.263 + if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; }; 1.264 + } 1.265 + if (CurN[5][2] < 0) { 1.266 + if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; }; 1.267 + if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; }; 1.268 + if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; }; 1.269 + if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; }; 1.270 + } 1.271 + Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false]; 1.272 + Q.LastPx = 0; 1.273 +} 1.274 + 1.275 +function Loop() { 1.276 + if (Testing.LoopCount > Testing.LoopMax) return; 1.277 + var TestingStr = String(Testing.LoopCount); 1.278 + while (TestingStr.length < 3) TestingStr = "0" + TestingStr; 1.279 + MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]); 1.280 + MTrans = RotateX(MTrans, 1); 1.281 + MTrans = RotateY(MTrans, 3); 1.282 + MTrans = RotateZ(MTrans, 5); 1.283 + MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]); 1.284 + MQube = MMulti(MTrans, MQube); 1.285 + var i = 8; 1.286 + for (; i > -1; i--) { 1.287 + Q[i].V = VMulti(MTrans, Q[i].V); 1.288 + } 1.289 + DrawQube(); 1.290 + Testing.LoopCount++; 1.291 + Loop(); 1.292 +} 1.293 + 1.294 +function Init(CubeSize) { 1.295 + // init/reset vars 1.296 + Origin.V = [150,150,20,1]; 1.297 + Testing.LoopCount = 0; 1.298 + Testing.LoopMax = 50; 1.299 + Testing.TimeMax = 0; 1.300 + Testing.TimeAvg = 0; 1.301 + Testing.TimeMin = 0; 1.302 + Testing.TimeTemp = 0; 1.303 + Testing.TimeTotal = 0; 1.304 + Testing.Init = false; 1.305 + 1.306 + // transformation matrix 1.307 + MTrans = [ 1.308 + [1,0,0,0], 1.309 + [0,1,0,0], 1.310 + [0,0,1,0], 1.311 + [0,0,0,1] 1.312 + ]; 1.313 + 1.314 + // position information of qube 1.315 + MQube = [ 1.316 + [1,0,0,0], 1.317 + [0,1,0,0], 1.318 + [0,0,1,0], 1.319 + [0,0,0,1] 1.320 + ]; 1.321 + 1.322 + // entity matrix 1.323 + I = [ 1.324 + [1,0,0,0], 1.325 + [0,1,0,0], 1.326 + [0,0,1,0], 1.327 + [0,0,0,1] 1.328 + ]; 1.329 + 1.330 + // create qube 1.331 + Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize); 1.332 + Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize); 1.333 + Q[2] = new CreateP( CubeSize, CubeSize, CubeSize); 1.334 + Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize); 1.335 + Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize); 1.336 + Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize); 1.337 + Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize); 1.338 + Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize); 1.339 + 1.340 + // center of gravity 1.341 + Q[8] = new CreateP(0, 0, 0); 1.342 + 1.343 + // anti-clockwise edge check 1.344 + Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]]; 1.345 + 1.346 + // calculate squad normals 1.347 + Q.Normal = new Array(); 1.348 + 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); 1.349 + 1.350 + // line drawn ? 1.351 + Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false]; 1.352 + 1.353 + // create line pixels 1.354 + Q.NumPx = 9 * 2 * CubeSize; 1.355 + for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0); 1.356 + 1.357 + MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]); 1.358 + MQube = MMulti(MTrans, MQube); 1.359 + 1.360 + var i = 0; 1.361 + for (; i < 9; i++) { 1.362 + Q[i].V = VMulti(MTrans, Q[i].V); 1.363 + } 1.364 + DrawQube(); 1.365 + Testing.Init = true; 1.366 + Loop(); 1.367 +} 1.368 + 1.369 +for ( var i = 20; i <= 160; i *= 2 ) { 1.370 + Init(i); 1.371 +} 1.372 + 1.373 +Q = null; 1.374 +MTrans = null; 1.375 +MQube = null; 1.376 +I = null; 1.377 +Origin = null; 1.378 +Testing = null; 1.379 +LoopTime = null; 1.380 +DisplArea = null; 1.381 + 1.382 + 1.383 +var _sunSpiderInterval = new Date() - _sunSpiderStartDate; 1.384 + 1.385 +document.getElementById("console").innerHTML = _sunSpiderInterval; 1.386 +</script> 1.387 + 1.388 + 1.389 +</body> 1.390 +</html>