//@ skip if $model == "Apple Watch Series 3" # added by mark-jsc-stress-test.py
/*
 * Copyright (C) 2007 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */


function createVector(x,y,z) {
    try {
        return new Array(x,y,z);
    } catch(e) { }
}

function sqrLengthVector(self) {
    try {
        return self[0] * self[0] + self[1] * self[1] + self[2] * self[2];
    } catch(e) { }
}

function lengthVector(self) {
    try {
        return Math.sqrt(self[0] * self[0] + self[1] * self[1] + self[2] * self[2]);
    } catch(e) { }
}

function addVector(self, v) {
    try {
        self[0] += v[0];
        self[1] += v[1];
    } catch(e) { }

    self[2] += v[2];
    return self;
}

function subVector(self, v) {
    try {
        self[0] -= v[0];
        self[1] -= v[1];
    } catch(e) { 
    }
    self[2] -= v[2];
    return self;
}

function scaleVector(self, scale) {
    try {
        self[0] *= scale;
        self[1] *= scale;
    } catch(e) { }
    self[2] *= scale;
    return self;
}

function normaliseVector(self) {
    var len = Math.sqrt(self[0] * self[0] + self[1] * self[1] + self[2] * self[2]);
    try {
        self[0] /= len;
        self[1] /= len;
    } catch(e) { }
    self[2] /= len;
    return self;
}

function add(v1, v2) {
    try {
        return new Array(v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]);
    } catch(e) { }
}

function sub(v1, v2) {
    try {
        return new Array(v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]);
    } catch(e) { }
}

function scalev(v1, v2) {
    try {
        return new Array(v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2]);
    } catch(e) { }
}

function dot(v1, v2) {
    try {
        return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
    } catch(e) { }
}

function scale(v, scale) {
    try {
        return [v[0] * scale, v[1] * scale, v[2] * scale];
    } catch(e) { }
}

function cross(v1, v2) {
    try {
        return [v1[1] * v2[2] - v1[2] * v2[1], 
                v1[2] * v2[0] - v1[0] * v2[2],
                v1[0] * v2[1] - v1[1] * v2[0]];
    } catch(e) { }

}

function normalise(v) {
    var len = lengthVector(v);
    try {
    } catch(e) { }
    return [v[0] / len, v[1] / len, v[2] / len];
}

function transformMatrix(self, v) {
    try {
        var vals = self;
        var x  = vals[0] * v[0] + vals[1] * v[1] + vals[2] * v[2] + vals[3];
        var y  = vals[4] * v[0] + vals[5] * v[1] + vals[6] * v[2] + vals[7];
    } catch(e) { }
    var z  = vals[8] * v[0] + vals[9] * v[1] + vals[10] * v[2] + vals[11];
    return [x, y, z];
}

function invertMatrix(self) {
    try {
        var temp = new Array(16);
        var tx = -self[3];
        var ty = -self[7];
        var tz = -self[11];
        for (h = 0; h < 3; h++) 
            for (v = 0; v < 3; v++) 
                temp[h + v * 4] = self[v + h * 4];
    } catch(e) { }
    try {
        for (i = 0; i < 11; i++)
            self[i] = temp[i];
        self[3] = tx * self[0] + ty * self[1] + tz * self[2];
        self[7] = tx * self[4] + ty * self[5] + tz * self[6];
        self[11] = tx * self[8] + ty * self[9] + tz * self[10];
    } catch(e) { }
    return self;
}


// Triangle intersection using barycentric coord method
function Triangle(p1, p2, p3) {
    try {
        var edge1 = sub(p3, p1);
        var edge2 = sub(p2, p1);
        var normal = cross(edge1, edge2);
        if (Math.abs(normal[0]) > Math.abs(normal[1]))
            if (Math.abs(normal[0]) > Math.abs(normal[2]))
                this.axis = 0; 
            else 
                this.axis = 2;
        else
            if (Math.abs(normal[1]) > Math.abs(normal[2])) 
                this.axis = 1;
            else 
                this.axis = 2;
        var u = (this.axis + 1) % 3;
        var v = (this.axis + 2) % 3;
        var u1 = edge1[u];
        var v1 = edge1[v];
        
        var u2 = edge2[u];
        var v2 = edge2[v];
        this.normal = normalise(normal);
        this.nu = normal[u] / normal[this.axis];
        this.nv = normal[v] / normal[this.axis];
        this.nd = dot(normal, p1) / normal[this.axis];
        var det = u1 * v2 - v1 * u2;
        this.eu = p1[u];
        this.ev = p1[v]; 
        this.nu1 = u1 / det;
        this.nv1 = -v1 / det;
        this.nu2 = v2 / det;
        this.nv2 = -u2 / det; 
        this.material = [0.7, 0.7, 0.7];
    } catch(e) { }
}

Triangle.prototype.intersect = function(orig, dir, near, far) {
    try {
        var u = (this.axis + 1) % 3;
        var v = (this.axis + 2) % 3;
        var d = dir[this.axis] + this.nu * dir[u] + this.nv * dir[v];
        var t = (this.nd - orig[this.axis] - this.nu * orig[u] - this.nv * orig[v]) / d;
    } catch(e) { }
    if (t < near || t > far)
        return null;
    try {
        var Pu = orig[u] + t * dir[u] - this.eu;
        var Pv = orig[v] + t * dir[v] - this.ev;
        var a2 = Pv * this.nu1 + Pu * this.nv1;
    } catch(e) { }
    if (a2 < 0) 
        return null;
    try {
        var a3 = Pu * this.nu2 + Pv * this.nv2;
    } catch(e) { }
    if (a3 < 0) 
        return null;

    if ((a2 + a3) > 1) 
        return null;
    return t;
}

function Scene(a_triangles) {
    try {
        this.triangles = a_triangles;
        this.lights = [];
        this.ambient = [0,0,0];
        this.background = [0.8,0.8,1];
    } catch(e) { }
}
var zero = new Array(0,0,0);

Scene.prototype.intersect = function(origin, dir, near, far) {
    var closest = null;
    for (i = 0; i < this.triangles.length; i++) {
        try {
            var triangle = this.triangles[i];   
            var d = triangle.intersect(origin, dir, near, far);
            if (d == null || d > far || d < near)
                continue;
            far = d;
            closest = triangle;
        } catch(e) { }
    }
    
    if (!closest)
        return [this.background[0],this.background[1],this.background[2]];
        
    try {
        var normal = closest.normal;
        var hit = add(origin, scale(dir, far)); 
        if (dot(dir, normal) > 0)
            normal = [-normal[0], -normal[1], -normal[2]];
        
        var colour = null;
        if (closest.shader) {
            colour = closest.shader(closest, hit, dir);
        } else {
            colour = closest.material;
        }
    } catch(e) { }
    
    // do reflection
    var reflected = null;
    if (colour.reflection > 0.001) {
        try {
            var reflection = addVector(scale(normal, -2*dot(dir, normal)), dir);
            reflected = this.intersect(hit, reflection, 0.0001, 1000000);
        } catch(e) { }
        if (colour.reflection >= 0.999999)
            return reflected;
    }
    
    var l = [this.ambient[0], this.ambient[1], this.ambient[2]];
    for (var i = 0; i < this.lights.length; i++) {
        try {
            var light = this.lights[i];
            var toLight = sub(light, hit);
            var distance = lengthVector(toLight);
            scaleVector(toLight, 1.0/distance);
            distance -= 0.0001;
            if (this.blocked(hit, toLight, distance))
                continue;
            var nl = dot(normal, toLight);
            if (nl > 0)
                addVector(l, scale(light.colour, nl));
        } catch(e) { }
    }
    try {
        l = scalev(l, colour);
        if (reflected) {
            l = addVector(scaleVector(l, 1 - colour.reflection), scaleVector(reflected, colour.reflection));
        }
    } catch(e) { }
    return l;
}

Scene.prototype.blocked = function(O, D, far) {
    var near = 0.0001;
    var closest = null;
    for (i = 0; i < this.triangles.length; i++) {
        try {
            var triangle = this.triangles[i];   
            var d = triangle.intersect(O, D, near, far);
        } catch(e) { }
        if (d == null || d > far || d < near)
            continue;
        return true;
    }
    
    return false;
}


// this camera code is from notes i made ages ago, it is from *somewhere* -- i cannot remember where
// that somewhere is
function Camera(origin, lookat, up) {
    try {
        var zaxis = normaliseVector(subVector(lookat, origin));
        var xaxis = normaliseVector(cross(up, zaxis));
        var yaxis = normaliseVector(cross(xaxis, subVector([0,0,0], zaxis)));
        var m = new Array(16);
        m[0] = xaxis[0]; m[1] = xaxis[1]; m[2] = xaxis[2];
        m[4] = yaxis[0]; m[5] = yaxis[1]; m[6] = yaxis[2];
        m[8] = zaxis[0]; m[9] = zaxis[1]; m[10] = zaxis[2];
        invertMatrix(m);
        m[3] = 0; m[7] = 0; m[11] = 0;
        this.origin = origin;
        this.directions = new Array(4);
        this.directions[0] = normalise([-0.7,  0.7, 1]);
        this.directions[1] = normalise([ 0.7,  0.7, 1]);
        this.directions[2] = normalise([ 0.7, -0.7, 1]);
        this.directions[3] = normalise([-0.7, -0.7, 1]);
        this.directions[0] = transformMatrix(m, this.directions[0]);
        this.directions[1] = transformMatrix(m, this.directions[1]);
        this.directions[2] = transformMatrix(m, this.directions[2]);
        this.directions[3] = transformMatrix(m, this.directions[3]);

    } catch(e) { }
}

Camera.prototype.generateRayPair = function(y) {
    try {
        rays = new Array(new Object(), new Object());
        rays[0].origin = this.origin;
        rays[1].origin = this.origin;
        rays[0].dir = addVector(scale(this.directions[0], y), scale(this.directions[3], 1 - y));
        rays[1].dir = addVector(scale(this.directions[1], y), scale(this.directions[2], 1 - y));
    } catch(e) { }
    return rays;
}

function renderRows(camera, scene, pixels, width, height, starty, stopy) {
    for (var y = starty; y < stopy; y++) {
        var rays = camera.generateRayPair(y / height);
        for (var x = 0; x < width; x++) {
            try {
                var xp = x / width;
                var origin = addVector(scale(rays[0].origin, xp), scale(rays[1].origin, 1 - xp));
                var dir = normaliseVector(addVector(scale(rays[0].dir, xp), scale(rays[1].dir, 1 - xp)));
                var l = scene.intersect(origin, dir);
                pixels[y][x] = l;
            } catch(e) { }
        }
    }
}

Camera.prototype.render = function(scene, pixels, width, height) {
    try {
        var cam = this;
        var row = 0;
        renderRows(cam, scene, pixels, width, height, 0, height);
    } catch(e) { }
}



function raytraceScene()
{
    try {
        var startDate = new Date().getTime();
        var numTriangles = 2 * 6;
        var triangles = new Array();//numTriangles);
        var tfl = createVector(-10,  10, -10);
        var tfr = createVector( 10,  10, -10);
        var tbl = createVector(-10,  10,  10);
        var tbr = createVector( 10,  10,  10);
        var bfl = createVector(-10, -10, -10);
        var bfr = createVector( 10, -10, -10);
        var bbl = createVector(-10, -10,  10);
        var bbr = createVector( 10, -10,  10);
        
        // cube!!!
        // front
        var i = 0;
        
        triangles[i++] = new Triangle(tfl, tfr, bfr);
        triangles[i++] = new Triangle(tfl, bfr, bfl);
        // back
        triangles[i++] = new Triangle(tbl, tbr, bbr);
        triangles[i++] = new Triangle(tbl, bbr, bbl);
        //        triangles[i-1].material = [0.7,0.2,0.2];
        //            triangles[i-1].material.reflection = 0.8;
        // left
        triangles[i++] = new Triangle(tbl, tfl, bbl);
        //            triangles[i-1].reflection = 0.6;
        triangles[i++] = new Triangle(tfl, bfl, bbl);
        //            triangles[i-1].reflection = 0.6;
        // right
        triangles[i++] = new Triangle(tbr, tfr, bbr);
        triangles[i++] = new Triangle(tfr, bfr, bbr);
        // top
        triangles[i++] = new Triangle(tbl, tbr, tfr);
        triangles[i++] = new Triangle(tbl, tfr, tfl);
        // bottom
        triangles[i++] = new Triangle(bbl, bbr, bfr);
        triangles[i++] = new Triangle(bbl, bfr, bfl);
        
        //Floor!!!!
        var green = createVector(0.0, 0.4, 0.0);
        var grey = createVector(0.4, 0.4, 0.4);
        grey.reflection = 1.0;

    } catch(e) { }
    var floorShader = function(tri, pos, view) {
        try {
            var x = ((pos[0]/32) % 2 + 2) % 2;
            var z = ((pos[2]/32 + 0.3) % 2 + 2) % 2;
        } catch(e) { }
        try {
            if (x < 1 != z < 1) {
                //in the real world we use the fresnel term...
                //    var angle = 1-dot(view, tri.normal);
                //   angle *= angle;
                //  angle *= angle;
                // angle *= angle;
                //grey.reflection = angle;
                return grey;
            } else 
                return green;
        } catch(e) { }
    }
    var ffl = createVector(-1000, -30, -1000);
    var ffr = createVector( 1000, -30, -1000);
    var fbl = createVector(-1000, -30,  1000);
    var fbr = createVector( 1000, -30,  1000);
    triangles[i++] = new Triangle(fbl, fbr, ffr);
    triangles[i-1].shader = floorShader;
    triangles[i++] = new Triangle(fbl, ffr, ffl);
    triangles[i-1].shader = floorShader;
    
    var _scene = new Scene(triangles);
    _scene.lights[0] = createVector(20, 38, -22);
    _scene.lights[0].colour = createVector(0.7, 0.3, 0.3);
    _scene.lights[1] = createVector(-23, 40, 17);
    _scene.lights[1].colour = createVector(0.7, 0.3, 0.3);
    _scene.lights[2] = createVector(23, 20, 17);
    _scene.lights[2].colour = createVector(0.7, 0.7, 0.7);
    _scene.ambient = createVector(0.1, 0.1, 0.1);
    //  _scene.background = createVector(0.7, 0.7, 1.0);
    
    var size = 30;
    var pixels = new Array();
    for (var y = 0; y < size; y++) {
        try {
            pixels[y] = new Array();
        } catch(e) { }
        for (var x = 0; x < size; x++) {
            try {
                pixels[y][x] = 0;
            } catch(e) { }
        }
    }

    try {
        var _camera = new Camera(createVector(-40, 40, 40), createVector(0, 0, 0), createVector(0, 1, 0));
        _camera.render(_scene, pixels, size, size);
    } catch(e){}

    return pixels;
}

function arrayToCanvasCommands(pixels)
{
    var s = '<canvas id="renderCanvas" width="30px" height="30px"></canvas><scr' + 'ipt>\nvar pixels = [';
    var size = 30;
    for (var y = 0; y < size; y++) {
        s += "[";
        for (var x = 0; x < size; x++) {
            s += "[" + pixels[y][x] + "],";
        }
        s+= "],";
    }
    s += '];\n    var canvas = document.getElementById("renderCanvas").getContext("2d");\n\
\n\
\n\
    var size = 30;\n\
    canvas.fillStyle = "red";\n\
    canvas.fillRect(0, 0, size, size);\n\
    canvas.scale(1, -1);\n\
    canvas.translate(0, -size);\n\
\n\
    if (!canvas.setFillColor)\n\
        canvas.setFillColor = function(r, g, b, a) {\n\
            this.fillStyle = "rgb("+[Math.floor(r * 255), Math.floor(g * 255), Math.floor(b * 255)]+")";\n\
    }\n\
\n\
for (var y = 0; y < size; y++) {\n\
  for (var x = 0; x < size; x++) {\n\
    var l = pixels[y][x];\n\
    canvas.setFillColor(l[0], l[1], l[2], 1);\n\
    canvas.fillRect(x, y, 1, 1);\n\
  }\n\
}</scr' + 'ipt>';

    return s;
}

testOutput = arrayToCanvasCommands(raytraceScene());

var expectedLength = 20970;

if (testOutput.length != expectedLength)
    throw "Error: bad result: expected length " + expectedLength + " but got " + testOutput.length;

