Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: chrome/test/data/sunspider/3d-raytrace.html

Issue 42549: Add a copy of SunSpider 0.9 for performance testing.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/test/data/sunspider/3d-morph.html ('k') | chrome/test/data/sunspider/README.chromium » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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-raytrace</title>
29 <link rel="stylesheet" href="sunspider.css">
30 </head>
31
32 <body>
33 <h3>3d-raytrace</h3>
34 <div id="console">
35 </div>
36 <script src="sunspider-record-result.js"></script>
37 <script>
38
39 var _sunSpiderStartDate = new Date();
40
41 /*
42 * Copyright (C) 2007 Apple Inc. All rights reserved.
43 *
44 * Redistribution and use in source and binary forms, with or without
45 * modification, are permitted provided that the following conditions
46 * are met:
47 * 1. Redistributions of source code must retain the above copyright
48 * notice, this list of conditions and the following disclaimer.
49 * 2. Redistributions in binary form must reproduce the above copyright
50 * notice, this list of conditions and the following disclaimer in the
51 * documentation and/or other materials provided with the distribution.
52 *
53 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
54 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
57 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
58 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
59 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
60 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
61 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
63 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64 */
65
66 function createVector(x,y,z) {
67 return new Array(x,y,z);
68 }
69
70 function sqrLengthVector(self) {
71 return self[0] * self[0] + self[1] * self[1] + self[2] * self[2];
72 }
73
74 function lengthVector(self) {
75 return Math.sqrt(self[0] * self[0] + self[1] * self[1] + self[2] * self[2]);
76 }
77
78 function addVector(self, v) {
79 self[0] += v[0];
80 self[1] += v[1];
81 self[2] += v[2];
82 return self;
83 }
84
85 function subVector(self, v) {
86 self[0] -= v[0];
87 self[1] -= v[1];
88 self[2] -= v[2];
89 return self;
90 }
91
92 function scaleVector(self, scale) {
93 self[0] *= scale;
94 self[1] *= scale;
95 self[2] *= scale;
96 return self;
97 }
98
99 function normaliseVector(self) {
100 var len = Math.sqrt(self[0] * self[0] + self[1] * self[1] + self[2] * self[2 ]);
101 self[0] /= len;
102 self[1] /= len;
103 self[2] /= len;
104 return self;
105 }
106
107 function add(v1, v2) {
108 return new Array(v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]);
109 }
110
111 function sub(v1, v2) {
112 return new Array(v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]);
113 }
114
115 function scalev(v1, v2) {
116 return new Array(v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2]);
117 }
118
119 function dot(v1, v2) {
120 return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
121 }
122
123 function scale(v, scale) {
124 return [v[0] * scale, v[1] * scale, v[2] * scale];
125 }
126
127 function cross(v1, v2) {
128 return [v1[1] * v2[2] - v1[2] * v2[1],
129 v1[2] * v2[0] - v1[0] * v2[2],
130 v1[0] * v2[1] - v1[1] * v2[0]];
131
132 }
133
134 function normalise(v) {
135 var len = lengthVector(v);
136 return [v[0] / len, v[1] / len, v[2] / len];
137 }
138
139 function transformMatrix(self, v) {
140 var vals = self;
141 var x = vals[0] * v[0] + vals[1] * v[1] + vals[2] * v[2] + vals[3];
142 var y = vals[4] * v[0] + vals[5] * v[1] + vals[6] * v[2] + vals[7];
143 var z = vals[8] * v[0] + vals[9] * v[1] + vals[10] * v[2] + vals[11];
144 return [x, y, z];
145 }
146
147 function invertMatrix(self) {
148 var temp = new Array(16);
149 var tx = -self[3];
150 var ty = -self[7];
151 var tz = -self[11];
152 for (h = 0; h < 3; h++)
153 for (v = 0; v < 3; v++)
154 temp[h + v * 4] = self[v + h * 4];
155 for (i = 0; i < 11; i++)
156 self[i] = temp[i];
157 self[3] = tx * self[0] + ty * self[1] + tz * self[2];
158 self[7] = tx * self[4] + ty * self[5] + tz * self[6];
159 self[11] = tx * self[8] + ty * self[9] + tz * self[10];
160 return self;
161 }
162
163
164 // Triangle intersection using barycentric coord method
165 function Triangle(p1, p2, p3) {
166 var edge1 = sub(p3, p1);
167 var edge2 = sub(p2, p1);
168 var normal = cross(edge1, edge2);
169 if (Math.abs(normal[0]) > Math.abs(normal[1]))
170 if (Math.abs(normal[0]) > Math.abs(normal[2]))
171 this.axis = 0;
172 else
173 this.axis = 2;
174 else
175 if (Math.abs(normal[1]) > Math.abs(normal[2]))
176 this.axis = 1;
177 else
178 this.axis = 2;
179 var u = (this.axis + 1) % 3;
180 var v = (this.axis + 2) % 3;
181 var u1 = edge1[u];
182 var v1 = edge1[v];
183
184 var u2 = edge2[u];
185 var v2 = edge2[v];
186 this.normal = normalise(normal);
187 this.nu = normal[u] / normal[this.axis];
188 this.nv = normal[v] / normal[this.axis];
189 this.nd = dot(normal, p1) / normal[this.axis];
190 var det = u1 * v2 - v1 * u2;
191 this.eu = p1[u];
192 this.ev = p1[v];
193 this.nu1 = u1 / det;
194 this.nv1 = -v1 / det;
195 this.nu2 = v2 / det;
196 this.nv2 = -u2 / det;
197 this.material = [0.7, 0.7, 0.7];
198 }
199
200 Triangle.prototype.intersect = function(orig, dir, near, far) {
201 var u = (this.axis + 1) % 3;
202 var v = (this.axis + 2) % 3;
203 var d = dir[this.axis] + this.nu * dir[u] + this.nv * dir[v];
204 var t = (this.nd - orig[this.axis] - this.nu * orig[u] - this.nv * orig[v]) / d;
205 if (t < near || t > far)
206 return null;
207 var Pu = orig[u] + t * dir[u] - this.eu;
208 var Pv = orig[v] + t * dir[v] - this.ev;
209 var a2 = Pv * this.nu1 + Pu * this.nv1;
210 if (a2 < 0)
211 return null;
212 var a3 = Pu * this.nu2 + Pv * this.nv2;
213 if (a3 < 0)
214 return null;
215
216 if ((a2 + a3) > 1)
217 return null;
218 return t;
219 }
220
221 function Scene(a_triangles) {
222 this.triangles = a_triangles;
223 this.lights = [];
224 this.ambient = [0,0,0];
225 this.background = [0.8,0.8,1];
226 }
227 var zero = new Array(0,0,0);
228
229 Scene.prototype.intersect = function(origin, dir, near, far) {
230 var closest = null;
231 for (i = 0; i < this.triangles.length; i++) {
232 var triangle = this.triangles[i];
233 var d = triangle.intersect(origin, dir, near, far);
234 if (d == null || d > far || d < near)
235 continue;
236 far = d;
237 closest = triangle;
238 }
239
240 if (!closest)
241 return [this.background[0],this.background[1],this.background[2]];
242
243 var normal = closest.normal;
244 var hit = add(origin, scale(dir, far));
245 if (dot(dir, normal) > 0)
246 normal = [-normal[0], -normal[1], -normal[2]];
247
248 var colour = null;
249 if (closest.shader) {
250 colour = closest.shader(closest, hit, dir);
251 } else {
252 colour = closest.material;
253 }
254
255 // do reflection
256 var reflected = null;
257 if (colour.reflection > 0.001) {
258 var reflection = addVector(scale(normal, -2*dot(dir, normal)), dir);
259 reflected = this.intersect(hit, reflection, 0.0001, 1000000);
260 if (colour.reflection >= 0.999999)
261 return reflected;
262 }
263
264 var l = [this.ambient[0], this.ambient[1], this.ambient[2]];
265 for (var i = 0; i < this.lights.length; i++) {
266 var light = this.lights[i];
267 var toLight = sub(light, hit);
268 var distance = lengthVector(toLight);
269 scaleVector(toLight, 1.0/distance);
270 distance -= 0.0001;
271 if (this.blocked(hit, toLight, distance))
272 continue;
273 var nl = dot(normal, toLight);
274 if (nl > 0)
275 addVector(l, scale(light.colour, nl));
276 }
277 l = scalev(l, colour);
278 if (reflected) {
279 l = addVector(scaleVector(l, 1 - colour.reflection), scaleVector(reflect ed, colour.reflection));
280 }
281 return l;
282 }
283
284 Scene.prototype.blocked = function(O, D, far) {
285 var near = 0.0001;
286 var closest = null;
287 for (i = 0; i < this.triangles.length; i++) {
288 var triangle = this.triangles[i];
289 var d = triangle.intersect(O, D, near, far);
290 if (d == null || d > far || d < near)
291 continue;
292 return true;
293 }
294
295 return false;
296 }
297
298
299 // this camera code is from notes i made ages ago, it is from *somewhere* -- i c annot remember where
300 // that somewhere is
301 function Camera(origin, lookat, up) {
302 var zaxis = normaliseVector(subVector(lookat, origin));
303 var xaxis = normaliseVector(cross(up, zaxis));
304 var yaxis = normaliseVector(cross(xaxis, subVector([0,0,0], zaxis)));
305 var m = new Array(16);
306 m[0] = xaxis[0]; m[1] = xaxis[1]; m[2] = xaxis[2];
307 m[4] = yaxis[0]; m[5] = yaxis[1]; m[6] = yaxis[2];
308 m[8] = zaxis[0]; m[9] = zaxis[1]; m[10] = zaxis[2];
309 invertMatrix(m);
310 m[3] = 0; m[7] = 0; m[11] = 0;
311 this.origin = origin;
312 this.directions = new Array(4);
313 this.directions[0] = normalise([-0.7, 0.7, 1]);
314 this.directions[1] = normalise([ 0.7, 0.7, 1]);
315 this.directions[2] = normalise([ 0.7, -0.7, 1]);
316 this.directions[3] = normalise([-0.7, -0.7, 1]);
317 this.directions[0] = transformMatrix(m, this.directions[0]);
318 this.directions[1] = transformMatrix(m, this.directions[1]);
319 this.directions[2] = transformMatrix(m, this.directions[2]);
320 this.directions[3] = transformMatrix(m, this.directions[3]);
321 }
322
323 Camera.prototype.generateRayPair = function(y) {
324 rays = new Array(new Object(), new Object());
325 rays[0].origin = this.origin;
326 rays[1].origin = this.origin;
327 rays[0].dir = addVector(scale(this.directions[0], y), scale(this.directions[ 3], 1 - y));
328 rays[1].dir = addVector(scale(this.directions[1], y), scale(this.directions[ 2], 1 - y));
329 return rays;
330 }
331
332 function renderRows(camera, scene, pixels, width, height, starty, stopy) {
333 for (var y = starty; y < stopy; y++) {
334 var rays = camera.generateRayPair(y / height);
335 for (var x = 0; x < width; x++) {
336 var xp = x / width;
337 var origin = addVector(scale(rays[0].origin, xp), scale(rays[1].orig in, 1 - xp));
338 var dir = normaliseVector(addVector(scale(rays[0].dir, xp), scale(ra ys[1].dir, 1 - xp)));
339 var l = scene.intersect(origin, dir);
340 pixels[y][x] = l;
341 }
342 }
343 }
344
345 Camera.prototype.render = function(scene, pixels, width, height) {
346 var cam = this;
347 var row = 0;
348 renderRows(cam, scene, pixels, width, height, 0, height);
349 }
350
351
352
353 function raytraceScene()
354 {
355 var startDate = new Date().getTime();
356 var numTriangles = 2 * 6;
357 var triangles = new Array();//numTriangles);
358 var tfl = createVector(-10, 10, -10);
359 var tfr = createVector( 10, 10, -10);
360 var tbl = createVector(-10, 10, 10);
361 var tbr = createVector( 10, 10, 10);
362 var bfl = createVector(-10, -10, -10);
363 var bfr = createVector( 10, -10, -10);
364 var bbl = createVector(-10, -10, 10);
365 var bbr = createVector( 10, -10, 10);
366
367 // cube!!!
368 // front
369 var i = 0;
370
371 triangles[i++] = new Triangle(tfl, tfr, bfr);
372 triangles[i++] = new Triangle(tfl, bfr, bfl);
373 // back
374 triangles[i++] = new Triangle(tbl, tbr, bbr);
375 triangles[i++] = new Triangle(tbl, bbr, bbl);
376 // triangles[i-1].material = [0.7,0.2,0.2];
377 // triangles[i-1].material.reflection = 0.8;
378 // left
379 triangles[i++] = new Triangle(tbl, tfl, bbl);
380 // triangles[i-1].reflection = 0.6;
381 triangles[i++] = new Triangle(tfl, bfl, bbl);
382 // triangles[i-1].reflection = 0.6;
383 // right
384 triangles[i++] = new Triangle(tbr, tfr, bbr);
385 triangles[i++] = new Triangle(tfr, bfr, bbr);
386 // top
387 triangles[i++] = new Triangle(tbl, tbr, tfr);
388 triangles[i++] = new Triangle(tbl, tfr, tfl);
389 // bottom
390 triangles[i++] = new Triangle(bbl, bbr, bfr);
391 triangles[i++] = new Triangle(bbl, bfr, bfl);
392
393 //Floor!!!!
394 var green = createVector(0.0, 0.4, 0.0);
395 var grey = createVector(0.4, 0.4, 0.4);
396 grey.reflection = 1.0;
397 var floorShader = function(tri, pos, view) {
398 var x = ((pos[0]/32) % 2 + 2) % 2;
399 var z = ((pos[2]/32 + 0.3) % 2 + 2) % 2;
400 if (x < 1 != z < 1) {
401 //in the real world we use the fresnel term...
402 // var angle = 1-dot(view, tri.normal);
403 // angle *= angle;
404 // angle *= angle;
405 // angle *= angle;
406 //grey.reflection = angle;
407 return grey;
408 } else
409 return green;
410 }
411 var ffl = createVector(-1000, -30, -1000);
412 var ffr = createVector( 1000, -30, -1000);
413 var fbl = createVector(-1000, -30, 1000);
414 var fbr = createVector( 1000, -30, 1000);
415 triangles[i++] = new Triangle(fbl, fbr, ffr);
416 triangles[i-1].shader = floorShader;
417 triangles[i++] = new Triangle(fbl, ffr, ffl);
418 triangles[i-1].shader = floorShader;
419
420 var _scene = new Scene(triangles);
421 _scene.lights[0] = createVector(20, 38, -22);
422 _scene.lights[0].colour = createVector(0.7, 0.3, 0.3);
423 _scene.lights[1] = createVector(-23, 40, 17);
424 _scene.lights[1].colour = createVector(0.7, 0.3, 0.3);
425 _scene.lights[2] = createVector(23, 20, 17);
426 _scene.lights[2].colour = createVector(0.7, 0.7, 0.7);
427 _scene.ambient = createVector(0.1, 0.1, 0.1);
428 // _scene.background = createVector(0.7, 0.7, 1.0);
429
430 var size = 30;
431 var pixels = new Array();
432 for (var y = 0; y < size; y++) {
433 pixels[y] = new Array();
434 for (var x = 0; x < size; x++) {
435 pixels[y][x] = 0;
436 }
437 }
438
439 var _camera = new Camera(createVector(-40, 40, 40), createVector(0, 0, 0), c reateVector(0, 1, 0));
440 _camera.render(_scene, pixels, size, size);
441
442 return pixels;
443 }
444
445 function arrayToCanvasCommands(pixels)
446 {
447 var s = '<canvas id="renderCanvas" width="30px" height="30px"></canvas><scr' + 'ipt>\nvar pixels = [';
448 var size = 30;
449 for (var y = 0; y < size; y++) {
450 s += "[";
451 for (var x = 0; x < size; x++) {
452 s += "[" + pixels[y][x] + "],";
453 }
454 s+= "],";
455 }
456 s += '];\n var canvas = document.getElementById("renderCanvas").getContex t("2d");\n\
457 \n\
458 \n\
459 var size = 30;\n\
460 canvas.fillStyle = "red";\n\
461 canvas.fillRect(0, 0, size, size);\n\
462 canvas.scale(1, -1);\n\
463 canvas.translate(0, -size);\n\
464 \n\
465 if (!canvas.setFillColor)\n\
466 canvas.setFillColor = function(r, g, b, a) {\n\
467 this.fillStyle = "rgb("+[Math.floor(r * 255), Math.floor(g * 255), M ath.floor(b * 255)]+")";\n\
468 }\n\
469 \n\
470 for (var y = 0; y < size; y++) {\n\
471 for (var x = 0; x < size; x++) {\n\
472 var l = pixels[y][x];\n\
473 canvas.setFillColor(l[0], l[1], l[2], 1);\n\
474 canvas.fillRect(x, y, 1, 1);\n\
475 }\n\
476 }</scr' + 'ipt>';
477
478 return s;
479 }
480
481 testOutput = arrayToCanvasCommands(raytraceScene());
482
483
484 var _sunSpiderInterval = new Date() - _sunSpiderStartDate;
485
486 record(_sunSpiderInterval);
487 </script>
488
489
490 </body>
491 </html>
OLDNEW
« no previous file with comments | « chrome/test/data/sunspider/3d-morph.html ('k') | chrome/test/data/sunspider/README.chromium » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698