130 lines · 4.1 KB · JavaScript
RawDownload
////  rayPickingPerformance.js//  examples////  Created by Brad Hefta-Gaub on 5/13/2017//  Copyright 2017 High Fidelity, Inc.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html//   var MIN_RANGE = -3;var MAX_RANGE = 3;var RANGE_DELTA = 0.5;var OUTER_LOOPS = 10; // NOTE: These expected results depend completely on the model, and the range settings abovevar EXPECTED_TESTS = 1385 * OUTER_LOOPS;var EXPECTED_INTERSECTIONS = 1286 * OUTER_LOOPS;  var center = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(Camera.getOrientation())));var model_url = Script.getExternalPath(Script.ExternalPaths.HF_Content, "/caitlyn/production/Scansite/buddhaReduced.fbx"); var rayPickOverlays = Array(); var modelEntity = Entities.addEntity({    type: "Model",    modelURL: model_url,    dimensions: {        x: 0.671,        y: 1.21,        z: 0.938    },    position: center}); function rayCastTest() {    var tests = 0;    var intersections = 0;     var testStart = Date.now();    for (var t = 0; t < OUTER_LOOPS; t++) {        print("beginning loop:" + t);        for (var x = MIN_RANGE; x < MAX_RANGE; x += RANGE_DELTA) {            for (var y = MIN_RANGE; y < MAX_RANGE; y += RANGE_DELTA) {                for (var z = MIN_RANGE; z < MAX_RANGE; z += RANGE_DELTA) {                    if ((x <= -2 || x >= 2) ||                         (y <= -2 || y >= 2) ||                         (z <= -2 || z >= 2)) {                         tests++;                         var origin = { x: center.x + x,                                       y: center.y + y,                                       z: center.z + z };                        var direction = Vec3.subtract(center, origin);                         var pickRay = {                             origin: origin,                            direction: direction                        };                         var pickResults = Entities.findRayIntersection(pickRay, Picks.PICK_DOMAIN_ENTITIES | Picks.PICK_AVATAR_ENTITIES);                         var color;                        var visible;                         if (pickResults.intersects && pickResults.entityID == modelEntity) {                            intersections++;                            color = {                                red: 0,                                green: 255,                                blue: 0                            };                            visible = false;                         } else {                            /*                            print("NO INTERSECTION?");                            Vec3.print("origin:", origin);                            Vec3.print("direction:", direction);                            */                             color = {                                red: 255,                                green: 0,                                blue: 0                            };                            visible = true;                        }                         var overlayID = Overlays.addOverlay("line3d", {                            color: color,                            alpha: 1,                            visible: visible,                            start: origin,                            end: Vec3.sum(origin,Vec3.multiply(5,direction))                        });                         rayPickOverlays.push(overlayID);                     }                }            }        }        print("ending loop:" + t);    }    var testEnd = Date.now();    var testElapsed = testEnd - testStart;      print("EXPECTED tests:" + EXPECTED_TESTS + " intersections:" + EXPECTED_INTERSECTIONS);    print("ACTUAL   tests:" + tests + " intersections:" + intersections);    print("ELAPSED TIME:" + testElapsed + " ms"); } function cleanup() {    Entities.deleteEntity(modelEntity);    rayPickOverlays.forEach(function(item){        Overlays.deleteOverlay(item);    });} Script.scriptEnding.connect(cleanup); rayCastTest(); // run ray cast test immediately