1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/devtools/jint/sunspider/3d-cube.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,369 @@ 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 +/* BEGIN LOOP */ 1.61 + for (; i < NumPix; i++) { 1.62 + Num += NumAdd; 1.63 + if (Num >= Den) { 1.64 + Num -= Den; 1.65 + x += IncX1; 1.66 + y += IncY1; 1.67 + } 1.68 + x += IncX2; 1.69 + y += IncY2; 1.70 + } 1.71 +/* END LOOP */ 1.72 + Q.LastPx = NumPix; 1.73 +} 1.74 + 1.75 +function CalcCross(V0, V1) { 1.76 + var Cross = new Array(); 1.77 + Cross[0] = V0[1]*V1[2] - V0[2]*V1[1]; 1.78 + Cross[1] = V0[2]*V1[0] - V0[0]*V1[2]; 1.79 + Cross[2] = V0[0]*V1[1] - V0[1]*V1[0]; 1.80 + return Cross; 1.81 +} 1.82 + 1.83 +function CalcNormal(V0, V1, V2) { 1.84 + var A = new Array(); var B = new Array(); 1.85 +/* BEGIN LOOP */ 1.86 + for (var i = 0; i < 3; i++) { 1.87 + A[i] = V0[i] - V1[i]; 1.88 + B[i] = V2[i] - V1[i]; 1.89 + } 1.90 +/* END LOOP */ 1.91 + A = CalcCross(A, B); 1.92 + var Length = Math.sqrt(A[0]*A[0] + A[1]*A[1] + A[2]*A[2]); 1.93 +/* BEGIN LOOP */ 1.94 + for (var i = 0; i < 3; i++) A[i] = A[i] / Length; 1.95 +/* END LOOP */ 1.96 + A[3] = 1; 1.97 + return A; 1.98 +} 1.99 + 1.100 +function CreateP(X,Y,Z) { 1.101 + this.V = [X,Y,Z,1]; 1.102 +} 1.103 + 1.104 +// multiplies two matrices 1.105 +function MMulti(M1, M2) { 1.106 + var M = [[],[],[],[]]; 1.107 + var i = 0; 1.108 + var j = 0; 1.109 +/* BEGIN LOOP */ 1.110 + for (; i < 4; i++) { 1.111 + j = 0; 1.112 +/* BEGIN LOOP */ 1.113 + 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.114 +/* END LOOP */ 1.115 + } 1.116 +/* END LOOP */ 1.117 + return M; 1.118 +} 1.119 + 1.120 +//multiplies matrix with vector 1.121 +function VMulti(M, V) { 1.122 + var Vect = new Array(); 1.123 + var i = 0; 1.124 +/* BEGIN LOOP */ 1.125 + 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.126 +/* END LOOP */ 1.127 + return Vect; 1.128 +} 1.129 + 1.130 +function VMulti2(M, V) { 1.131 + var Vect = new Array(); 1.132 + var i = 0; 1.133 +/* BEGIN LOOP */ 1.134 + for (;i < 3; i++) Vect[i] = M[i][0] * V[0] + M[i][1] * V[1] + M[i][2] * V[2]; 1.135 +/* END LOOP */ 1.136 + return Vect; 1.137 +} 1.138 + 1.139 +// add to matrices 1.140 +function MAdd(M1, M2) { 1.141 + var M = [[],[],[],[]]; 1.142 + var i = 0; 1.143 + var j = 0; 1.144 +/* BEGIN LOOP */ 1.145 + for (; i < 4; i++) { 1.146 + j = 0; 1.147 +/* BEGIN LOOP */ 1.148 + for (; j < 4; j++) M[i][j] = M1[i][j] + M2[i][j]; 1.149 +/* END LOOP */ 1.150 + } 1.151 +/* END LOOP */ 1.152 + return M; 1.153 +} 1.154 + 1.155 +function Translate(M, Dx, Dy, Dz) { 1.156 + var T = [ 1.157 + [1,0,0,Dx], 1.158 + [0,1,0,Dy], 1.159 + [0,0,1,Dz], 1.160 + [0,0,0,1] 1.161 + ]; 1.162 + return MMulti(T, M); 1.163 +} 1.164 + 1.165 +function RotateX(M, Phi) { 1.166 + var a = Phi; 1.167 + a *= Math.PI / 180; 1.168 + var Cos = Math.cos(a); 1.169 + var Sin = Math.sin(a); 1.170 + var R = [ 1.171 + [1,0,0,0], 1.172 + [0,Cos,-Sin,0], 1.173 + [0,Sin,Cos,0], 1.174 + [0,0,0,1] 1.175 + ]; 1.176 + return MMulti(R, M); 1.177 +} 1.178 + 1.179 +function RotateY(M, Phi) { 1.180 + var a = Phi; 1.181 + a *= Math.PI / 180; 1.182 + var Cos = Math.cos(a); 1.183 + var Sin = Math.sin(a); 1.184 + var R = [ 1.185 + [Cos,0,Sin,0], 1.186 + [0,1,0,0], 1.187 + [-Sin,0,Cos,0], 1.188 + [0,0,0,1] 1.189 + ]; 1.190 + return MMulti(R, M); 1.191 +} 1.192 + 1.193 +function RotateZ(M, Phi) { 1.194 + var a = Phi; 1.195 + a *= Math.PI / 180; 1.196 + var Cos = Math.cos(a); 1.197 + var Sin = Math.sin(a); 1.198 + var R = [ 1.199 + [Cos,-Sin,0,0], 1.200 + [Sin,Cos,0,0], 1.201 + [0,0,1,0], 1.202 + [0,0,0,1] 1.203 + ]; 1.204 + return MMulti(R, M); 1.205 +} 1.206 + 1.207 +function DrawQube() { 1.208 + // calc current normals 1.209 + var CurN = new Array(); 1.210 + var i = 5; 1.211 + Q.LastPx = 0; 1.212 +/* BEGIN LOOP */ 1.213 + for (; i > -1; i--) CurN[i] = VMulti2(MQube, Q.Normal[i]); 1.214 +/* END LOOP */ 1.215 + if (CurN[0][2] < 0) { 1.216 + if (!Q.Line[0]) { DrawLine(Q[0], Q[1]); Q.Line[0] = true; }; 1.217 + if (!Q.Line[1]) { DrawLine(Q[1], Q[2]); Q.Line[1] = true; }; 1.218 + if (!Q.Line[2]) { DrawLine(Q[2], Q[3]); Q.Line[2] = true; }; 1.219 + if (!Q.Line[3]) { DrawLine(Q[3], Q[0]); Q.Line[3] = true; }; 1.220 + } 1.221 + if (CurN[1][2] < 0) { 1.222 + if (!Q.Line[2]) { DrawLine(Q[3], Q[2]); Q.Line[2] = true; }; 1.223 + if (!Q.Line[9]) { DrawLine(Q[2], Q[6]); Q.Line[9] = true; }; 1.224 + if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; }; 1.225 + if (!Q.Line[10]) { DrawLine(Q[7], Q[3]); Q.Line[10] = true; }; 1.226 + } 1.227 + if (CurN[2][2] < 0) { 1.228 + if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; }; 1.229 + if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; }; 1.230 + if (!Q.Line[6]) { DrawLine(Q[6], Q[7]); Q.Line[6] = true; }; 1.231 + if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; }; 1.232 + } 1.233 + if (CurN[3][2] < 0) { 1.234 + if (!Q.Line[4]) { DrawLine(Q[4], Q[5]); Q.Line[4] = true; }; 1.235 + if (!Q.Line[8]) { DrawLine(Q[5], Q[1]); Q.Line[8] = true; }; 1.236 + if (!Q.Line[0]) { DrawLine(Q[1], Q[0]); Q.Line[0] = true; }; 1.237 + if (!Q.Line[11]) { DrawLine(Q[0], Q[4]); Q.Line[11] = true; }; 1.238 + } 1.239 + if (CurN[4][2] < 0) { 1.240 + if (!Q.Line[11]) { DrawLine(Q[4], Q[0]); Q.Line[11] = true; }; 1.241 + if (!Q.Line[3]) { DrawLine(Q[0], Q[3]); Q.Line[3] = true; }; 1.242 + if (!Q.Line[10]) { DrawLine(Q[3], Q[7]); Q.Line[10] = true; }; 1.243 + if (!Q.Line[7]) { DrawLine(Q[7], Q[4]); Q.Line[7] = true; }; 1.244 + } 1.245 + if (CurN[5][2] < 0) { 1.246 + if (!Q.Line[8]) { DrawLine(Q[1], Q[5]); Q.Line[8] = true; }; 1.247 + if (!Q.Line[5]) { DrawLine(Q[5], Q[6]); Q.Line[5] = true; }; 1.248 + if (!Q.Line[9]) { DrawLine(Q[6], Q[2]); Q.Line[9] = true; }; 1.249 + if (!Q.Line[1]) { DrawLine(Q[2], Q[1]); Q.Line[1] = true; }; 1.250 + } 1.251 + Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false]; 1.252 + Q.LastPx = 0; 1.253 +} 1.254 + 1.255 +function Loop() { 1.256 + if (Testing.LoopCount > Testing.LoopMax) return; 1.257 + var TestingStr = String(Testing.LoopCount); 1.258 +/* BEGIN LOOP */ 1.259 + while (TestingStr.length < 3) TestingStr = "0" + TestingStr; 1.260 +/* END LOOP */ 1.261 + MTrans = Translate(I, -Q[8].V[0], -Q[8].V[1], -Q[8].V[2]); 1.262 + MTrans = RotateX(MTrans, 1); 1.263 + MTrans = RotateY(MTrans, 3); 1.264 + MTrans = RotateZ(MTrans, 5); 1.265 + MTrans = Translate(MTrans, Q[8].V[0], Q[8].V[1], Q[8].V[2]); 1.266 + MQube = MMulti(MTrans, MQube); 1.267 + var i = 8; 1.268 +/* BEGIN LOOP */ 1.269 + for (; i > -1; i--) { 1.270 + Q[i].V = VMulti(MTrans, Q[i].V); 1.271 + } 1.272 +/* END LOOP */ 1.273 + DrawQube(); 1.274 + Testing.LoopCount++; 1.275 + Loop(); 1.276 +} 1.277 + 1.278 +function Init(CubeSize) { 1.279 + // init/reset vars 1.280 + Origin.V = [150,150,20,1]; 1.281 + Testing.LoopCount = 0; 1.282 + Testing.LoopMax = 50; 1.283 + Testing.TimeMax = 0; 1.284 + Testing.TimeAvg = 0; 1.285 + Testing.TimeMin = 0; 1.286 + Testing.TimeTemp = 0; 1.287 + Testing.TimeTotal = 0; 1.288 + Testing.Init = false; 1.289 + 1.290 + // transformation matrix 1.291 + MTrans = [ 1.292 + [1,0,0,0], 1.293 + [0,1,0,0], 1.294 + [0,0,1,0], 1.295 + [0,0,0,1] 1.296 + ]; 1.297 + 1.298 + // position information of qube 1.299 + MQube = [ 1.300 + [1,0,0,0], 1.301 + [0,1,0,0], 1.302 + [0,0,1,0], 1.303 + [0,0,0,1] 1.304 + ]; 1.305 + 1.306 + // entity matrix 1.307 + I = [ 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 + // create qube 1.315 + Q[0] = new CreateP(-CubeSize,-CubeSize, CubeSize); 1.316 + Q[1] = new CreateP(-CubeSize, CubeSize, CubeSize); 1.317 + Q[2] = new CreateP( CubeSize, CubeSize, CubeSize); 1.318 + Q[3] = new CreateP( CubeSize,-CubeSize, CubeSize); 1.319 + Q[4] = new CreateP(-CubeSize,-CubeSize,-CubeSize); 1.320 + Q[5] = new CreateP(-CubeSize, CubeSize,-CubeSize); 1.321 + Q[6] = new CreateP( CubeSize, CubeSize,-CubeSize); 1.322 + Q[7] = new CreateP( CubeSize,-CubeSize,-CubeSize); 1.323 + 1.324 + // center of gravity 1.325 + Q[8] = new CreateP(0, 0, 0); 1.326 + 1.327 + // anti-clockwise edge check 1.328 + Q.Edge = [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]]; 1.329 + 1.330 + // calculate squad normals 1.331 + Q.Normal = new Array(); 1.332 +/* BEGIN LOOP */ 1.333 + 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.334 +/* END LOOP */ 1.335 + 1.336 + // line drawn ? 1.337 + Q.Line = [false,false,false,false,false,false,false,false,false,false,false,false]; 1.338 + 1.339 + // create line pixels 1.340 + Q.NumPx = 9 * 2 * CubeSize; 1.341 +/* BEGIN LOOP */ 1.342 + for (var i = 0; i < Q.NumPx; i++) CreateP(0,0,0); 1.343 +/* END LOOP */ 1.344 + 1.345 + MTrans = Translate(MTrans, Origin.V[0], Origin.V[1], Origin.V[2]); 1.346 + MQube = MMulti(MTrans, MQube); 1.347 + 1.348 + var i = 0; 1.349 +/* BEGIN LOOP */ 1.350 + for (; i < 9; i++) { 1.351 + Q[i].V = VMulti(MTrans, Q[i].V); 1.352 + } 1.353 +/* END LOOP */ 1.354 + DrawQube(); 1.355 + Testing.Init = true; 1.356 + Loop(); 1.357 +} 1.358 + 1.359 +/* BEGIN LOOP */ 1.360 +for ( var i = 20; i <= 160; i *= 2 ) { 1.361 + Init(i); 1.362 +} 1.363 +/* END LOOP */ 1.364 + 1.365 +Q = null; 1.366 +MTrans = null; 1.367 +MQube = null; 1.368 +I = null; 1.369 +Origin = null; 1.370 +Testing = null; 1.371 +LoopTime = null; 1.372 +DisplArea = null;