//@ 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. 
 */

let __exceptionCounter = 0;
function randomException() {
    __exceptionCounter++;
    if (__exceptionCounter % 500 === 0) {
        throw new Error("rando");
    }
}
noInline(randomException);


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];
        randomException();
    } catch(e) { }

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

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

function scaleVector(self, scale) {
    try {
        self[0] *= scale;
        self[1] *= scale;
        randomException();
    } 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;
        randomException();
    } 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 {
        randomException();
    } 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];
        randomException();
    } 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];
        randomException();
    } 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];
        randomException();
    } 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];
        randomException();
    } 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;
        randomException();
    } 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;
        randomException();
    } catch(e) { }
    if (a2 < 0) 
        return null;
    try {
        var a3 = Pu * this.nu2 + Pv * this.nv2;
        randomException();
    } 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];
        randomException();
    } 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;
            randomException();
        } 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;
        }
        randomException();
    } 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);
            randomException();
        } 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));
            randomException();
        } catch(e) { }
    }
    try {
        l = scalev(l, colour);
        if (reflected) {
            l = addVector(scaleVector(l, 1 - colour.reflection), scaleVector(reflected, colour.reflection));
        }
        randomException();
    } 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);
            randomException();
        } 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]);

        randomException();
    } 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));
        randomException();
    } 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;
                randomException();
            } 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);
        randomException();
    } 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;

        randomException();
    } 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;
            randomException();
        } 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();
            randomException();
        } catch(e) { }
        for (var x = 0; x < size; x++) {
            try {
                pixels[y][x] = 0;
                randomException();
            } 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);
        randomException();
    } 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;

