overte-thingvellir/scripts/developer/tests/performance/rayPickPerformance.js

130 lines
No EOL
4 KiB
JavaScript

//
// 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 above
var 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, true);
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