1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/sunspider/check-3d-cube.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,345 @@ 1.4 +// 3D Cube Rotation 1.5 +// http://www.speich.net/computer/moztesting/3d.htm 1.6 +// Created by Simon Speich 1.7 + 1.8 +var Q = new Array(); 1.9 +var MTrans = new Array(); // transformation matrix 1.10 +var MQube = new Array(); // position information of qube 1.11 +var I = new Array(); // entity matrix 1.12 +var Origin = new Object(); 1.13 +var Testing = new Object(); 1.14 +var LoopTimer; 1.15 + 1.16 +var DisplArea = new Object(); 1.17 +DisplArea.Width = 300; 1.18 +DisplArea.Height = 300; 1.19 + 1.20 +function DrawLine(From, To) { 1.21 + var x1 = From.V[0]; 1.22 + var x2 = To.V[0]; 1.23 + var y1 = From.V[1]; 1.24 + var y2 = To.V[1]; 1.25 + var dx = Math.abs(x2 - x1); 1.26 + var dy = Math.abs(y2 - y1); 1.27 + var x = x1; 1.28 + var y = y1; 1.29 + var IncX1, IncY1; 1.30 + var IncX2, IncY2; 1.31 + var Den; 1.32 + var Num; 1.33 + var NumAdd; 1.34 + var NumPix; 1.35 + 1.36 + if (x2 >= x1) { IncX1 = 1; IncX2 = 1; } 1.37 + else { IncX1 = -1; IncX2 = -1; } 1.38 + if (y2 >= y1) { IncY1 = 1; IncY2 = 1; } 1.39 + else { IncY1 = -1; IncY2 = -1; } 1.40 + if (dx >= dy) { 1.41 + IncX1 = 0; 1.42 + IncY2 = 0; 1.43 + Den = dx; 1.44 + Num = dx / 2; 1.45 + NumAdd = dy; 1.46 + NumPix = dx; 1.47 + } 1.48 + else { 1.49 + IncX2 = 0; 1.50 + IncY1 = 0; 1.51 + Den = dy; 1.52 + Num = dy / 2; 1.53 + NumAdd = dx; 1.54 + NumPix = dy; 1.55 + } 1.56 + 1.57 + NumPix = Math.round(Q.LastPx + NumPix); 1.58 + 1.59 + var i = Q.LastPx; 1.60 + for (; i < NumPix; i++) { 1.61 + Num += NumAdd; 1.62 + if (Num >= Den) { 1.63 + Num -= Den; 1.64 + x += IncX1; 1.65 + y += IncY1; 1.66 + } 1.67 + x += IncX2; 1.68 + y += IncY2; 1.69 + } 1.70 + Q.LastPx = NumPix; 1.71 +} 1.72 + 1.73 +function CalcCross(V0, V1) { 1.74 + var Cross = new Array(); 1.75 + Cross[0] = V0[1]*V1[2] - V0[2]*V1[1]; 1.76 + Cross[1] = V0[2]*V1[0] - V0[0]*V1[2]; 1.77 + Cross[2] = V0[0]*V1[1] - V0[1]*V1[0]; 1.78 + return Cross; 1.79 +} 1.80 + 1.81 +function CalcNormal(V0, V1, V2) { 1.82 + var A = new Array(); var B = new Array(); 1.83 + for (var i = 0; i < 3; i++) { 1.84 + A[i] = V0[i] - V1[i]; 1.85 + B[i] = V2[i] - V1[i]; 1.86 + } 1.87 + A = CalcCross(A, B); 1.88 + var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); 1.89 + for (var i = 0; i < 3; i++) A[i] = A[i] / Length; 1.90 + A[3] = 1; 1.91 + return A; 1.92 +} 1.93 + 1.94 +function CreateP(X,Y,Z) { 1.95 + this.V = [X,Y,Z,1]; 1.96 +} 1.97 + 1.98 +// multiplies two matrices 1.99 +function MMulti(M1, M2) { 1.100 + var M = [[],[],[],[]]; 1.101 + var i = 0; 1.102 + var j = 0; 1.103 + for (; i < 4; i++) { 1.104 + j = 0; 1.105 + 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.106 + } 1.107 + return M; 1.108 +} 1.109 + 1.110 +//multiplies matrix with vector 1.111 +function VMulti(M, V) { 1.112 + var Vect = new Array(); 1.113 + var i = 0; 1.114 + 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.115 + return Vect; 1.116 +} 1.117 + 1.118 +function VMulti2(M, V) { 1.119 + var Vect = new Array(); 1.120 + var i = 0; 1.121 + for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2]; 1.122 + return Vect; 1.123 +} 1.124 + 1.125 +// add to matrices 1.126 +function MAdd(M1, M2) { 1.127 + var M = [[],[],[],[]]; 1.128 + var i = 0; 1.129 + var j = 0; 1.130 + for (; i < 4; i++) { 1.131 + j = 0; 1.132 + for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j]; 1.133 + } 1.134 + return M; 1.135 +} 1.136 + 1.137 +function Translate(M, Dx, Dy, Dz) { 1.138 + var T = [ 1.139 + [1,0,0,Dx], 1.140 + [0,1,0,Dy], 1.141 + [0,0,1,Dz], 1.142 + [0,0,0,1] 1.143 + ]; 1.144 + return MMulti(T, M); 1.145 +} 1.146 + 1.147 +function RotateX(M, Phi) { 1.148 + var a = Phi; 1.149 + a *= Math.PI / 180; 1.150 + var Cos = Math.cos(a); 1.151 + var Sin = Math.sin(a); 1.152 + var R = [ 1.153 + [1,0,0,0], 1.154 + [0,Cos,-Sin,0], 1.155 + [0,Sin,Cos,0], 1.156 + [0,0,0,1] 1.157 + ]; 1.158 + return MMulti(R, M); 1.159 +} 1.160 + 1.161 +function RotateY(M, Phi) { 1.162 + var a = Phi; 1.163 + a *= Math.PI / 180; 1.164 + var Cos = Math.cos(a); 1.165 + var Sin = Math.sin(a); 1.166 + var R = [ 1.167 + [Cos,0,Sin,0], 1.168 + [0,1,0,0], 1.169 + [-Sin,0,Cos,0], 1.170 + [0,0,0,1] 1.171 + ]; 1.172 + return MMulti(R, M); 1.173 +} 1.174 + 1.175 +function RotateZ(M, Phi) { 1.176 + var a = Phi; 1.177 + a *= Math.PI / 180; 1.178 + var Cos = Math.cos(a); 1.179 + var Sin = Math.sin(a); 1.180 + var R = [ 1.181 + [Cos,-Sin,0,0], 1.182 + [Sin,Cos,0,0], 1.183 + [0,0,1,0], 1.184 + [0,0,0,1] 1.185 + ]; 1.186 + return MMulti(R, M); 1.187 +} 1.188 + 1.189 +function DrawQube() { 1.190 + // calc current normals 1.191 + var CurN = new Array(); 1.192 + var i = 5; 1.193 + Q.LastPx = 0; 1.194 + for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]); 1.195 + if (CurN[0][2] < 0) { 1.196 + if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; }; 1.197 + if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; }; 1.198 + if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; }; 1.199 + if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; }; 1.200 + } 1.201 + if (CurN[1][2] < 0) { 1.202 + if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; }; 1.203 + if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; }; 1.204 + if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; }; 1.205 + if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; }; 1.206 + } 1.207 + if (CurN[2][2] < 0) { 1.208 + if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; }; 1.209 + if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; }; 1.210 + if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; }; 1.211 + if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; }; 1.212 + } 1.213 + if (CurN[3][2] < 0) { 1.214 + if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; }; 1.215 + if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; }; 1.216 + if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; }; 1.217 + if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; }; 1.218 + } 1.219 + if (CurN[4][2] < 0) { 1.220 + if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; }; 1.221 + if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; }; 1.222 + if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; }; 1.223 + if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; }; 1.224 + } 1.225 + if (CurN[5][2] < 0) { 1.226 + if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; }; 1.227 + if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; }; 1.228 + if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; }; 1.229 + if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; }; 1.230 + } 1.231 + Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false]; 1.232 + Q.LastPx = 0; 1.233 +} 1.234 + 1.235 +function Loop() { 1.236 + if (Testing.LoopCount > Testing.LoopMax) return; 1.237 + var TestingStr = String(Testing.LoopCount); 1.238 + while (TestingStr.length < 3) TestingStr = "0" + TestingStr; 1.239 + MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]); 1.240 + MTrans = RotateX(MTrans, 1); 1.241 + MTrans = RotateY(MTrans, 3); 1.242 + MTrans = RotateZ(MTrans, 5); 1.243 + MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]); 1.244 + MQube = MMulti(MTrans, MQube); 1.245 + var i = 8; 1.246 + for (; i > -1; i--) { 1.247 + Q[i].V = VMulti(MTrans, Q[i].V); 1.248 + } 1.249 + DrawQube(); 1.250 + Testing.LoopCount++; 1.251 + Loop(); 1.252 +} 1.253 + 1.254 +function Init(CubeSize) { 1.255 + // init/reset vars 1.256 + Origin.V = [150,150,20,1]; 1.257 + Testing.LoopCount = 0; 1.258 + Testing.LoopMax = 50; 1.259 + Testing.TimeMax = 0; 1.260 + Testing.TimeAvg = 0; 1.261 + Testing.TimeMin = 0; 1.262 + Testing.TimeTemp = 0; 1.263 + Testing.TimeTotal = 0; 1.264 + Testing.Init = false; 1.265 + 1.266 + // transformation matrix 1.267 + MTrans = [ 1.268 + [1,0,0,0], 1.269 + [0,1,0,0], 1.270 + [0,0,1,0], 1.271 + [0,0,0,1] 1.272 + ]; 1.273 + 1.274 + // position information of qube 1.275 + MQube = [ 1.276 + [1,0,0,0], 1.277 + [0,1,0,0], 1.278 + [0,0,1,0], 1.279 + [0,0,0,1] 1.280 + ]; 1.281 + 1.282 + // entity matrix 1.283 + I = [ 1.284 + [1,0,0,0], 1.285 + [0,1,0,0], 1.286 + [0,0,1,0], 1.287 + [0,0,0,1] 1.288 + ]; 1.289 + 1.290 + // create qube 1.291 + Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize); 1.292 + Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize); 1.293 + Q[2] = new CreateP( CubeSize, CubeSize, CubeSize); 1.294 + Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize); 1.295 + Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize); 1.296 + Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize); 1.297 + Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize); 1.298 + Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize); 1.299 + 1.300 + // center of gravity 1.301 + Q[8] = new CreateP(0, 0, 0); 1.302 + 1.303 + // anti-clockwise edge check 1.304 + Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]]; 1.305 + 1.306 + // calculate squad normals 1.307 + Q.Normal = new Array(); 1.308 + 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.309 + 1.310 + // line drawn ? 1.311 + Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false]; 1.312 + 1.313 + // create line pixels 1.314 + Q.NumPx = 9 * 2 * CubeSize; 1.315 + for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0); 1.316 + 1.317 + MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]); 1.318 + MQube = MMulti(MTrans, MQube); 1.319 + 1.320 + var i = 0; 1.321 + for (; i < 9; i++) { 1.322 + Q[i].V = VMulti(MTrans, Q[i].V); 1.323 + } 1.324 + DrawQube(); 1.325 + Testing.Init = true; 1.326 + Loop(); 1.327 +} 1.328 + 1.329 +for ( var i = 20; i <= 160; i *= 2 ) { 1.330 + Init(i); 1.331 +} 1.332 + 1.333 +var actual = ''; 1.334 +for (var i = 0; i < Q.length; ++i) { 1.335 + actual += Q[i].V + ';'; 1.336 +} 1.337 +var expected = "-116.618229186398,212.51135212951073,62.5094191967962,1;127.83701023614447,417.11611179082263,90.41153816299942,1;293.9570894432935,196.58093046570656,252.17789153139591,1;49.501850020750915,-8.02382919560505,224.275772565193,1;6.042910556709444,103.41906953429206,-212.1778915313964,1;250.49814997925202,308.02382919560387,-184.27577256519325,1;416.61822918640064,87.48864787048812,-22.509419196796493,1;172.1629897638581,-117.1161117908236,-50.41153816299975,1;150.0000000000007,149.99999999999952,20,1;"; 1.338 +assertEq(actual, expected); 1.339 + 1.340 +Q = null; 1.341 +MTrans = null; 1.342 +MQube = null; 1.343 +I = null; 1.344 +Origin = null; 1.345 +Testing = null; 1.346 +LoopTime = null; 1.347 +DisplArea = null; 1.348 +