]>
git.saurik.com Git - apple/javascriptcore.git/blob - tests/exceptionFuzz/3d-cube.js
4 // http://www.speich.net/computer/moztesting/3d.htm
5 // Created by Simon Speich
11 var MTrans
= new Array(); // transformation matrix
12 var MQube
= new Array(); // position information of qube
13 var I
= new Array(); // entity matrix
14 var Origin
= new Object();
15 var Testing
= new Object();
19 20: 2889.0000000000045,
20 40: 2889.0000000000055,
21 80: 2889.000000000005,
22 160: 2889.0000000000055
25 var DisplArea
= new Object();
26 DisplArea
.Width
= 300;
27 DisplArea
.Height
= 300;
29 function DrawLine(From
, To
) {
34 var dx
= Math
.abs(x2
- x1
);
35 var dy
= Math
.abs(y2
- y1
);
45 if (x2
>= x1
) { IncX1
= 1; IncX2
= 1; }
46 else { IncX1
= -1; IncX2
= -1; }
47 if (y2
>= y1
) { IncY1
= 1; IncY2
= 1; }
48 else { IncY1
= -1; IncY2
= -1; }
66 NumPix
= Math
.round(Q
.LastPx
+ NumPix
);
69 for (; i
< NumPix
; i
++) {
82 function CalcCross(V0
, V1
) {
83 var Cross
= new Array();
84 Cross
[0] = V0
[1]*V1
[2] - V0
[2]*V1
[1];
85 Cross
[1] = V0
[2]*V1
[0] - V0
[0]*V1
[2];
86 Cross
[2] = V0
[0]*V1
[1] - V0
[1]*V1
[0];
90 function CalcNormal(V0
, V1
, V2
) {
91 var A
= new Array(); var B
= new Array();
92 for (var i
= 0; i
< 3; i
++) {
97 var Length
= Math
.sqrt(A
[0]*A
[0] + A
[1]*A
[1] + A
[2]*A
[2]);
98 for (var i
= 0; i
< 3; i
++) A
[i
] = A
[i
] / Length
;
103 function CreateP(X
,Y
,Z
) {
107 // multiplies two matrices
108 function MMulti(M1
, M2
) {
109 var M
= [[],[],[],[]];
114 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
];
119 //multiplies matrix with vector
120 function VMulti(M
, V
) {
121 var Vect
= new Array();
123 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];
127 function VMulti2(M
, V
) {
128 var Vect
= new Array();
130 for (;i
< 3; i
++) Vect
[i
] = M
[i
][0] * V
[0] + M
[i
][1] * V
[1] + M
[i
][2] * V
[2];
135 function MAdd(M1
, M2
) {
136 var M
= [[],[],[],[]];
141 for (; j
< 4; j
++) M
[i
][j
] = M1
[i
][j
] + M2
[i
][j
];
146 function Translate(M
, Dx
, Dy
, Dz
) {
156 function RotateX(M
, Phi
) {
159 var Cos
= Math
.cos(a
);
160 var Sin
= Math
.sin(a
);
170 function RotateY(M
, Phi
) {
173 var Cos
= Math
.cos(a
);
174 var Sin
= Math
.sin(a
);
184 function RotateZ(M
, Phi
) {
187 var Cos
= Math
.cos(a
);
188 var Sin
= Math
.sin(a
);
198 function DrawQube() {
199 // calc current normals
200 var CurN
= new Array();
203 for (; i
> -1; i
--) CurN
[i
] = VMulti2(MQube
, Q
.Normal
[i
]);
204 if (CurN
[0][2] < 0) {
205 if (!Q
.Line
[0]) { DrawLine(Q
[0], Q
[1]); Q
.Line
[0] = true; };
206 if (!Q
.Line
[1]) { DrawLine(Q
[1], Q
[2]); Q
.Line
[1] = true; };
207 if (!Q
.Line
[2]) { DrawLine(Q
[2], Q
[3]); Q
.Line
[2] = true; };
208 if (!Q
.Line
[3]) { DrawLine(Q
[3], Q
[0]); Q
.Line
[3] = true; };
210 if (CurN
[1][2] < 0) {
211 if (!Q
.Line
[2]) { DrawLine(Q
[3], Q
[2]); Q
.Line
[2] = true; };
212 if (!Q
.Line
[9]) { DrawLine(Q
[2], Q
[6]); Q
.Line
[9] = true; };
213 if (!Q
.Line
[6]) { DrawLine(Q
[6], Q
[7]); Q
.Line
[6] = true; };
214 if (!Q
.Line
[10]) { DrawLine(Q
[7], Q
[3]); Q
.Line
[10] = true; };
216 if (CurN
[2][2] < 0) {
217 if (!Q
.Line
[4]) { DrawLine(Q
[4], Q
[5]); Q
.Line
[4] = true; };
218 if (!Q
.Line
[5]) { DrawLine(Q
[5], Q
[6]); Q
.Line
[5] = true; };
219 if (!Q
.Line
[6]) { DrawLine(Q
[6], Q
[7]); Q
.Line
[6] = true; };
220 if (!Q
.Line
[7]) { DrawLine(Q
[7], Q
[4]); Q
.Line
[7] = true; };
222 if (CurN
[3][2] < 0) {
223 if (!Q
.Line
[4]) { DrawLine(Q
[4], Q
[5]); Q
.Line
[4] = true; };
224 if (!Q
.Line
[8]) { DrawLine(Q
[5], Q
[1]); Q
.Line
[8] = true; };
225 if (!Q
.Line
[0]) { DrawLine(Q
[1], Q
[0]); Q
.Line
[0] = true; };
226 if (!Q
.Line
[11]) { DrawLine(Q
[0], Q
[4]); Q
.Line
[11] = true; };
228 if (CurN
[4][2] < 0) {
229 if (!Q
.Line
[11]) { DrawLine(Q
[4], Q
[0]); Q
.Line
[11] = true; };
230 if (!Q
.Line
[3]) { DrawLine(Q
[0], Q
[3]); Q
.Line
[3] = true; };
231 if (!Q
.Line
[10]) { DrawLine(Q
[3], Q
[7]); Q
.Line
[10] = true; };
232 if (!Q
.Line
[7]) { DrawLine(Q
[7], Q
[4]); Q
.Line
[7] = true; };
234 if (CurN
[5][2] < 0) {
235 if (!Q
.Line
[8]) { DrawLine(Q
[1], Q
[5]); Q
.Line
[8] = true; };
236 if (!Q
.Line
[5]) { DrawLine(Q
[5], Q
[6]); Q
.Line
[5] = true; };
237 if (!Q
.Line
[9]) { DrawLine(Q
[6], Q
[2]); Q
.Line
[9] = true; };
238 if (!Q
.Line
[1]) { DrawLine(Q
[2], Q
[1]); Q
.Line
[1] = true; };
240 Q
.Line
= [false,false,false,false,false,false,false,false,false,false,false,false];
245 if (Testing
.LoopCount
> Testing
.LoopMax
) return;
246 var TestingStr
= String(Testing
.LoopCount
);
247 while (TestingStr
.length
< 3) TestingStr
= "0" + TestingStr
;
248 MTrans
= Translate(I
, -Q
[8].V
[0], -Q
[8].V
[1], -Q
[8].V
[2]);
249 MTrans
= RotateX(MTrans
, 1);
250 MTrans
= RotateY(MTrans
, 3);
251 MTrans
= RotateZ(MTrans
, 5);
252 MTrans
= Translate(MTrans
, Q
[8].V
[0], Q
[8].V
[1], Q
[8].V
[2]);
253 MQube
= MMulti(MTrans
, MQube
);
255 for (; i
> -1; i
--) {
256 Q
[i
].V
= VMulti(MTrans
, Q
[i
].V
);
263 function Init(CubeSize
) {
265 Origin
.V
= [150,150,20,1];
266 Testing
.LoopCount
= 0;
267 Testing
.LoopMax
= 50;
271 Testing
.TimeTemp
= 0;
272 Testing
.TimeTotal
= 0;
273 Testing
.Init
= false;
275 // transformation matrix
283 // position information of qube
300 Q
[0] = new CreateP(-CubeSize
,-CubeSize
, CubeSize
);
301 Q
[1] = new CreateP(-CubeSize
, CubeSize
, CubeSize
);
302 Q
[2] = new CreateP( CubeSize
, CubeSize
, CubeSize
);
303 Q
[3] = new CreateP( CubeSize
,-CubeSize
, CubeSize
);
304 Q
[4] = new CreateP(-CubeSize
,-CubeSize
,-CubeSize
);
305 Q
[5] = new CreateP(-CubeSize
, CubeSize
,-CubeSize
);
306 Q
[6] = new CreateP( CubeSize
, CubeSize
,-CubeSize
);
307 Q
[7] = new CreateP( CubeSize
,-CubeSize
,-CubeSize
);
310 Q
[8] = new CreateP(0, 0, 0);
312 // anti-clockwise edge check
313 Q
.Edge
= [[0,1,2],[3,2,6],[7,6,5],[4,5,1],[4,0,3],[1,5,6]];
315 // calculate squad normals
316 Q
.Normal
= new Array();
317 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
);
320 Q
.Line
= [false,false,false,false,false,false,false,false,false,false,false,false];
322 // create line pixels
323 Q
.NumPx
= 9 * 2 * CubeSize
;
324 for (var i
= 0; i
< Q
.NumPx
; i
++) CreateP(0,0,0);
326 MTrans
= Translate(MTrans
, Origin
.V
[0], Origin
.V
[1], Origin
.V
[2]);
327 MQube
= MMulti(MTrans
, MQube
);
331 Q
[i
].V
= VMulti(MTrans
, Q
[i
].V
);
337 // Perform a simple sum-based verification.
339 for (var i
= 0; i
< Q
.length
; ++i
) {
341 for (var j
= 0; j
< vector
.length
; ++j
)
344 if (sum
!= validation
[CubeSize
])
345 throw "Error: bad vector sum for CubeSize = " + CubeSize
+ "; expected " + validation
[CubeSize
] + " but got " + sum
;
348 for ( var i
= 20; i
<= 160; i
*= 2 ) {
362 print("JSC EXCEPTION FUZZ: Caught exception: " + e
);