var vBoxWidth = 1200, vBoxHeight = 900, bgWidth = 900, bgHeight = 1500, clicked; //Object used for local storage of the user selections - had to use underscores instead of hyphen var pageData = { build: 0, level: 0, platform: 0, overlay_group: 0, overlay_single: 0, deaths_game_type_select: 0, data_resolution: 0, fps_game_type: 0, build_config: 0, metric: 0, draw_list: 0, statistics: 0, automated_tests_check: false, automated_tests_select: 0, fps_off_mission_cutscene: false, cps_metric: 0, cps_draw_list: 0, cps_statistics: 0, pst_statistics: 0, msf_game_type: 0, msf_memory_type: 0, msf_statistics: 0, } var totalAjaxRequests = 7; var completedAjaxRequests = 0; var forceUrlSuffix = ""; var fpsTelemetryData, pstTelemetryData, msfTelemetryData; var interpolationColours = ["#E51616", "#E2C016", "#59E016"]; // red - yellow - green function convert2WebXCoord(x) { return ((x + project.map.coords.x)/project.map.scale); } function convert2WebYCoord(y) { return (((-1)*y + project.map.coords.y)/project.map.scale); } function convert2WebCoords(p) { return [convert2WebXCoord(p[0]), convert2WebYCoord(p[1])]; } function convertFromWebXCoord(x) { return (-1) * ((project.map.coords.x) - (x*project.map.scale)); } function convertFromWebYCoord(y) { return ((project.map.coords.y) - (y*project.map.scale)); } function updateMapHeight() { // Adjust the height of the map automatically var windowHeight = $(window).height() - 3.0 * $("#sub-header").height(); //console.log(windowHeight); $("#map-wrapper").css("height", windowHeight); } function initPage() { // function from generic.js, variable from config file //initHeaderAndFilters(headerAndFilters); initHeaderAndFilters(null); updateMapHeight(); var localData = retrieveLocalObject(config.currentFilename); pageData = (localData) ? localData : pageData; block(); $.ajax({ url: project.map.svgFile, type: "GET", data: {}, dataType: "xml", success: function(xml, textStatus, jqXHR) { var importedNode; try { importedNode = document.importNode(xml.documentElement, true); } catch(e) { // IE case importedNode = ieImportNode(xml.documentElement, document); } $("#map").append(importedNode); }, error: function (xhr, ajaxOptions, thrownError){ console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError ); }, complete: function() { ++completedAjaxRequests; var svg = d3.select("#map svg") .attr("width", $("#map").width()) .attr("height", $("#map").height()) .attr("enable-background", "new 0 0 " + bgWidth + " "+ bgHeight) .call(svg_interact); drawGrid(); } }); $.ajax({ url: config.restHost + config.buildsAll, type: "GET", data: {}, dataType: "json", success: function(json, textStatus, jqXHR) { var builds = json.Items.sort(function(a, b) { return((a.Identifier > b.Identifier) ? -1 : 1); }); $.each(builds, function(i, build) { if (!build.GameVersion) return; var titleExtra = []; $("select#build").append( $("") .html(function() { var hasExtra = []; var text = build.Identifier; if (build.HasAutomatedEverythingStats) { hasExtra.push("AE"); titleExtra.push("Automated Everything"); } if (build.HasAutomatedMapOnlyStats) { hasExtra.push("MO"); titleExtra.push("Automated Map Only"); } if (build.HasMemShortfallStats) { hasExtra.push("MS"); titleExtra.push("Memory Shortfall"); } if (build.HasShapeTestStats) { hasExtra.push("ST"); titleExtra.push("Shape Test"); } return (hasExtra.length > 0) ? (text + " (" + hasExtra.join(",") + ")" ): text; }) .attr("title", function() { var title = build.Identifier; return (titleExtra.length > 0) ? (title + " (" + titleExtra.join(", ") + ")" ): title; }) .val(build.Identifier) .attr("selected", function() { return (pageData && pageData.build == build.Identifier) ? "selected" : false; }) ); }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { ++completedAjaxRequests; } }); $.ajax({ url: config.restHost + config.levelsAll, type: "GET", data: {}, dataType: "xml", success: function(xml, textStatus, jqXHR) { var levels = convertLevelsXml(xml); $.each(levels, function(i, level) { $("select#level").append( $('') .text(level.Name) .val(level.Identifier) .attr("selected", function() { return (pageData && pageData.level == level.Identifier) ? "selected" : false; }) ); }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { ++completedAjaxRequests; } }); // Platforms List /* $.ajax({ url: config.restHost + config.platformsAll, type: "GET", data: {}, dataType: "xml", success: function(xml, textStatus, jqXHR) { var platforms = convertPlatformsXml(xml); $.each(platforms, function(i, platform) { $("select#platform").append( $('') .text(platform.Value) .val(platform.Value) .attr("selected", function() { return (pageData && pageData.platform == platform.Value) ? "selected" : false; }) ); }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { ++completedAjaxRequests; } }); */ var platforms = getPlatforms(); $.each(platforms, function(i, platform) { $("select#platform").append( $('') .text(platform.Name) .val(platform.Name) .attr("selected", function() { return (pageData && pageData.platform == platform.Name) ? "selected" : false; }) ); }); ++completedAjaxRequests; // Overlay Groups $.each(config.overlayGroupsAll, function(i, overlayGroup) { $("select#overlay-group").append( $('') .text(overlayGroup) .val(overlayGroup) .attr("selected", function() { return (pageData && pageData.overlay_group == overlayGroup) ? "selected" : false; }) ); }); // Overlays $.each(config.overlaysAll, function(i, overlaySingle) { $("select#overlay-single").append( $('') .text(overlaySingle.Name) .val(overlaySingle.Value) .attr("selected", function() { return (pageData && pageData.overlay_single == overlaySingle.Value) ? "selected" : false; }) ); }) // Resolutions List $.each(config.resolutionsAll, function(i, value) { $("select#data-resolution").append( $('') .text(value) .val(value) .attr("selected", function() { return (pageData && pageData.data_resolution == value) ? "selected" : false; }) ); }); /* // Resolutions List $.ajax({ url: config.restHost + config.resolutionsAll, type: "GET", data: {}, dataType: "xml", success: function(xml, textStatus, jqXHR) { var resolutions = convertResolutionsXml(xml); $.each(resolutions, function(i, resolution) { $("select#data-resolution").append( $("") .text(resolution.BlockSize) .val(resolution.Id) .attr("selected", function() { return (pageData && pageData.data_resolution == resolution.Id) ? "selected" : false; }) ); }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { ++completedAjaxRequests; } }); */ // Gametypes List /* $.ajax({ url: config.restHost + config.gametypesAll, type: "GET", data: {}, dataType: "xml", success: function(xml, textStatus, jqXHR) { var gametypes = convertGametypesXml(xml); $.each(gametypes, function(i, gametype) { $("select#fps-game-type").append( $('') .text(gametype.Value) .val(gametype.Value) .attr("selected", function() { return (pageData && pageData.fps_game_type == gametype.Value) ? "selected" : false; }) ); $("select#deaths-game-type-select").append( $('') .text(gametype.Value) .val(gametype.Value) .attr("selected", function() { return (pageData && pageData.deaths_game_type_select == gametype.Value) ? "selected" : false; }) ); $("select#msf-game-type").append( $('') .text(gametype.Value) .val(gametype.Value) .attr("selected", function() { return (pageData && pageData.msf_game_type == gametype.Value) ? "selected" : false; }) ); }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { ++completedAjaxRequests; } }); */ var gameTypes = getGameTypes(); $.each(gameTypes, function(i, gametype) { $("select#fps-game-type").append( $('') .text(gametype.Name) .val(gametype.Name) .attr("selected", function() { return (pageData && pageData.fps_game_type == gametype.Name) ? "selected" : false; }) ); $("select#deaths-game-type-select").append( $('') .text(gametype.Name) .val(gametype.Name) .attr("selected", function() { return (pageData && pageData.deaths_game_type_select == gametype.Name) ? "selected" : false; }) ); $("select#msf-game-type").append( $('') .text(gametype.Name) .val(gametype.Name) .attr("selected", function() { return (pageData && pageData.msf_game_type == gametype.Name) ? "selected" : false; }) ); }); ++completedAjaxRequests; // BuildConfigs List /* $.ajax({ url: config.restHost + config.buildConfigsAll, type: "GET", data: {}, dataType: "xml", success: function(xml, textStatus, jqXHR) { var buildConfigs = convertBuildConfigsXml(xml); $.each(buildConfigs, function(i, buildConfig) { $("select#build-config").append( $('') .text(buildConfig.Value) .val(buildConfig.Value) .attr("selected", function() { return (pageData && pageData.build_config == buildConfig.Value) ? "selected" : false; }) ); }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { ++completedAjaxRequests; } }); */ var buildConfigs = getBuildConfigs(); $.each(buildConfigs, function(i, buildConfig) { $("select#build-config").append( $('') .text(buildConfig.Name) .val(buildConfig.Name) .attr("selected", function() { return (pageData && pageData.build_config == buildConfig.Name) ? "selected" : false; }) ); }); ++completedAjaxRequests; // Metric List $.each(config.metricAll, function(i, metric) { $("select#metric").append( $('') .text(metric) .val(metric) .attr("selected", function() { return (pageData && pageData.metric == metric) ? "selected" : false; }) ); }); // Draw List $.ajax({ url: config.restHost + config.drawListAll, type: "GET", data: {}, dataType: "json", success: function(json, textStatus, jqXHR) { var drawList = json.sort(function(a, b) {return (a.GameName < b.GameName) ? -1 : 1}); //var drawList = convertDrawListXml(xml); $.each(drawList, function(i, draw) { $("select#draw-list").append( $('') .text(draw.GameName) .val(draw.GameName) .attr("selected", function() { return (pageData && pageData.draw_list == draw.GameName) ? "selected" : false; }) ); $("select#cps-draw-list").append( $('') .text(draw.GameName) .val(draw.GameName) .attr("selected", function() { return (pageData && pageData.cps_draw_list == draw.GameName) ? "selected" : false; }) ); }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { ++completedAjaxRequests; } }); /* // Social Club Freemode Matches $.ajax({ url: config.restHost + config.SCFreemodeNames, type: "GET", data: {type: "DEATHMATCH"}, dataType: "json", success: function(deathmatches, textStatus, jqXHR) { $.each(deathmatches, function(i, deathmatch) { $("select#deathmatch-list").append( $('') .text(deathmatch.Name + " (" + deathmatch.Creator + ")") .val(deathmatch.UGCIdentifier) .attr("title", deathmatch.Name + " (" + deathmatch.Creator + ") : " + deathmatch.Description) ) }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { ++completedAjaxRequests; } }); */ // Statistics List $.each(config.statAll, function(i, stat) { $("select#statistics").append( $("") .text(stat.Name) .val(stat.Value) .attr("selected", function() { return (pageData && pageData.statistics == stat.Value) ? "selected" : false; }) ); $("select#cps-statistics").append( $("") .text(stat.Name) .val(stat.Value) .attr("selected", function() { return (pageData && pageData.cps_statistics == stat.Value) ? "selected" : false; }) ); $("select#pst-statistics").append( $("") .text(stat.Name) .val(stat.Value) .attr("selected", function() { return (pageData && pageData.pst_statistics == stat.Value) ? "selected" : false; }) ); $("select#msf-statistics").append( $("") .text(stat.Name) .val(stat.Value) .attr("selected", function() { return (pageData && pageData.msf_statistics == stat.Value) ? "selected" : false; }) ); }); // Automated Tests check if (pageData && pageData.automated_tests_check) { $("#automated-tests input[type=checkbox]").prop("checked", true); $("#automated-tests-select").attr("disabled", false); } else { $("#automated-tests input[type=checkbox]").prop("checked", false); $("#automated-tests-select").attr("disabled", true); } // Automated Tests select $.each(config.automatedTestsAll, function(i, automatedTest) { $("select#automated-tests-select").append( $('') .text(automatedTest.Name) .val(automatedTest.Value) .attr("selected", function() { return (pageData && pageData.automated_tests_select == automatedTest.Value) ? "selected" : false; }) ); }); // For fps off missions/cutscene if (pageData && pageData.fps_off_mission_cutscene) { $("#fps-off-mission-cutscene").prop("checked", true); } else { $("#fps-off-mission-cutscene").prop("checked", false); } // Memory Types select (for Memory Shortfall) $.each(config.memoryTypesAll, function(i, memoryType) { $("select#msf-memory-type").append( $("") .text(memoryType.Name) .val(memoryType.Value) .attr("selected", function() { return (pageData && pageData.msf_memory_type == memoryType.Value) ? "selected" : false; }) ); }); toggleOverlayOptions($("select#overlay-single").val()); // Bind the events $("#sub-header select").change(function() { // If the select id is not the group overlay, then store the header options locally if ($(this).attr("id") != "overlay-group") { pageData[$(this).attr("id").replace(/\-/g, '_')] = $(this).val(); storeLocalObject(config.currentFilename, pageData); } if (($(this).attr("id") == "build") || ($(this).attr("id") == "level") || ($(this).attr("id") == "platform")) //&& ($("select#overlay-single").val() == $("select#overlay-single option:eq(2)").val())) updatePerformanceMetrics(); generateCustomOverlay(); }); $("#sub-header #filter-force").change(function() { generateCustomOverlay(); }); $("select#overlay-single").change(function() { toggleOverlayOptions($(this).val()); }); $(".overlay-options select").change(function() { if ($(this).attr("id") != "deaths-list-select") { pageData[$(this).attr("id").replace(/\-/g, '_')] = $(this).val(); storeLocalObject(config.currentFilename, pageData); generateCustomOverlay(); } }); /* $("#fps-overlay-options select").change(function() { pageData[$(this).attr("id").replace(/\-/g, '_')] = $(this).val(); storeLocalObject(config.currentFilename, pageData); generateCustomOverlay(); }); */ $("#fps-overlay-options select#metric").change(function() { if ($(this).val() == config.fpsDrawListMetricName) $("#fps-overlay-options select#draw-list").attr("disabled", false); else $("#fps-overlay-options select#draw-list").attr("disabled", true); }); $("#fps-off-mission-cutscene").click(function() { pageData[$(this).attr("id").replace(/\-/g, '_')] = $(this).is(":checked"); storeLocalObject(config.currentFilename, pageData); generateCustomOverlay(); }); $("#automated-tests input[type=checkbox]").click(function() { if ($(this).is(":checked")) { $("#automated-tests-select").attr("disabled", false); pageData[$(this).attr("id").replace(/\-/g, '_')] = true; } else { $("#automated-tests-select").attr("disabled", true); pageData[$(this).attr("id").replace(/\-/g, '_')] = false; } storeLocalObject(config.currentFilename, pageData); generateCustomOverlay(); }); /* $("#deaths-game-type select").change(function() { pageData[$(this).attr("id").replace(/\-/g, '_')] = $(this).val(); storeLocalObject(config.currentFilename, pageData); generateCustomOverlay(); }); */ $("#deaths-list select").change(function() { highlightCircle($(this).val()); }); $("input#time-since-spawn").change(function() { generateCustomOverlay(); }); /* $("select#deathmatch-list").change(function() { generateCustomOverlay(); }); */ /* $("#cps-overlay-options select").change(function() { pageData[$(this).attr("id").replace(/\-/g, '_')] = $(this).val(); storeLocalObject(config.currentFilename, pageData); generateCustomOverlay(); }); */ $("#cps-overlay-options select#cps-metric").change(function() { if ($(this).val() == config.cpsDrawListMetricName) $("#cps-overlay-options select#cps-draw-list").attr("disabled", false); else $("#cps-overlay-options select#cps-draw-list").attr("disabled", true); }); /* $("#pst-overlay-options select").change(function() { pageData[$(this).attr("id").replace(/\-/g, '_')] = $(this).val(); storeLocalObject(config.currentFilename, pageData); generateCustomOverlay(); }); $("#msf-overlay-options select").change(function() { pageData[$(this).attr("id").replace(/\-/g, '_')] = $(this).val(); storeLocalObject(config.currentFilename, pageData); generateCustomOverlay(); }); */ //$("#map-layers :checkbox").click(function(){ // The following declaration is faster than the latter $("#map-layers input[type=checkbox]").click(function() { var layer = d3.select("#map svg").select("g#" + $(this).val()); if ($(this).is(":checked")) { layer .transition() .attr("opacity", 1); } else { layer .transition() .attr("opacity", 0.01); } }); // Initialise the overlay $("#performance-overlay").overlay({ mask: { color: "#222", loadSpeed: "fast", opacity: 0.5, }, top: "10%", closeOnClick: false, load: false, }); $(window).resize(updateMapHeight); $("#filter").click(function() { generateCustomOverlay(); }); completePage(); } function completePage() { //console.log(completedAjaxRequests); if (completedAjaxRequests < totalAjaxRequests) { setTimeout(completePage, 500) } else { unBlock(); updatePerformanceMetrics(); // Generate overlay if an overlay group is selected by default generateCustomOverlay(); } } function updatePerformanceMetrics() { block(); $.ajax({ url: config.restHost + config.capturePerformanceMetrics, type: "GET", dataType: "json", data: { build: $("select#build").val(), level: $("select#level").val(), platform: $("select#platform").val(), }, async: false, success: function(json, textStatus, jqXHR) { $("select#cps-metric").empty(); $.each(json, function(i, metric) { $("select#cps-metric").append( $('') .text(metric) .val(metric) .attr("selected", function() { return (pageData && pageData.cps_metric == metric) ? "selected" : false; }) ); }); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError); }, complete: function() { unBlock(); } }); } function drawGrid() { var gridStep = 500/project.map.scale; // The step of the grid in map coordinates var grid = d3.select("#map svg") .append("svg:g") .attr("id", "grid"); var xAxisDataNeg = d3.range(convert2WebXCoord(0), 0, -gridStep); var xAxisDataPos = d3.range(convert2WebXCoord(0), bgWidth, gridStep); var yAxisDataNeg = d3.range(convert2WebYCoord(0), 0, -gridStep); var yAxisDataPos = d3.range(convert2WebYCoord(0), bgHeight, gridStep); grid.selectAll("line.vertical") .data(xAxisDataNeg.concat(xAxisDataPos)) .enter() .append("svg:line") .attr("x1", function(d) {return d;}) .attr("y1", 0) .attr("x2", function(d) {return d;}) .attr("y2", bgHeight) .attr("class", "map-grid"); grid.selectAll("line.horizontal") .data(yAxisDataNeg.concat(yAxisDataPos)) .enter() .append("svg:line") .attr("x1", 0) .attr("y1", function(d) {return d;}) .attr("x2", bgWidth) .attr("y2", function(d) {return d;}) .attr("class", "map-grid"); } function drawFpsHeatmap(cached) { var resolution = Number($("select#data-resolution").val()), metric = $("select#metric").val(), stat = capitaliseString($("select#statistics").val()); if (!cached) { var pValues = { //ForceUrlSuffix: forceUrlSuffix, ElementKeyName: "Name", ElementValueName: "Value", Pairs: { "BuildIdentifier": $("select#build").val(), "LevelIdentifier": $("select#level").val(), "PlatformName": $("select#platform").val(), "Resolution" : resolution, "BuildConfigName" : $("select#build-config").val(), "GameTypeName" : $("select#fps-game-type").val(), "DrawListName" : $("select#draw-list").val(), "OffMissionAndCutsceneOnly" : $("#fps-off-mission-cutscene").is(":checked"), }, }; if ($("#automated-tests input[type=checkbox]").is(":checked")) { var autoTestNum = parseInt($("#automated-tests-select").val()); //console.log(autoTestNum); pValues.Pairs["AutomatedTestNumber"] = autoTestNum; } var restEndpoint, restEndpointAsync; if ($("#fps-overlay-options select#metric :selected").val() == config.fpsDrawListMetricName) { // == DrawLists restEndpoint = config.fpsDrawListPerformanceStats, restEndpointAsync = config.fpsDrawListPerformanceStatsAsync + forceUrlSuffix; } else { restEndpoint = config.fpsPerformanceStats, restEndpointAsync = config.fpsPerformanceStatsAsync + forceUrlSuffix; } var req = new ReportRequest(config.restHost + restEndpoint, "json", config.restHost + restEndpointAsync, config.restHost + config.reportsQueryAsync); req.sendSingleAsyncRequest(pValues, handleFpsPerformanceResults); } else { handleFpsPerformanceResults(fpsTelemetryData); } function handleFpsPerformanceResults(telemetryData) { // Save for later fpsTelemetryData = telemetryData var valueFunc = function(d) { return ((metric != config.fpsDrawListMetricName) ? d[stat + metric] : d[stat + "EntityCount"]); } generateGenericHeatmap(telemetryData, resolution, valueFunc, "fps-overlay-options"); } } // end of drawFpsHeatmap() function drawShapeTestHeatmap(cached) { var resolution = 100; if (!cached) { var pValues = { //ForceUrlSuffix: forceUrlSuffix, ElementKeyName: "Name", ElementValueName: "Value", Pairs: { "BuildIdentifier": $("select#build").val(), "PlatformName": $("select#platform").val(), "LevelIdentifier": $("select#level").val(), "Resolution" : resolution, } }; var req = new ReportRequest(config.restHost + config.physicsShapeTestStats, "json", config.restHost + config.physicsShapeTestStatsAsync + forceUrlSuffix, config.restHost + config.reportsQueryAsync); req.sendSingleAsyncRequest(pValues, handlePhysicsShapeTestResults); } else { handlePhysicsShapeTestResults(pstTelemetryData); } function handlePhysicsShapeTestResults(telemetryData) { // Save for later pstTelemetryData = telemetryData var valueFunc = function(d) { return d[capitaliseString($("select#pst-statistics").val())]; } generateGenericHeatmap(telemetryData, resolution, valueFunc, "pst-overlay-options"); } } // end of drawShapeTestHeatmap() function drawShortfallHeatmap(cached) { var resolution = 100; var memoryType = $("select#msf-memory-type").val(); var stat = capitaliseString($("select#msf-statistics").val()); if (!cached) { var pValues = { //ForceUrlSuffix: forceUrlSuffix, ElementKeyName: "Name", ElementValueName: "Value", Pairs: { "BuildIdentifier": $("select#build").val(), "PlatformName": $("select#platform").val(), "LevelIdentifier": $("select#level").val(), "Resolution" : resolution, } }; var req = new ReportRequest(config.restHost + config.memoryShortfallStats, "json", config.restHost + config.memoryShortfallStatsAsync + forceUrlSuffix, config.restHost + config.reportsQueryAsync); req.sendSingleAsyncRequest(pValues, handleShortfallResults); } else { handleShortfallResults(msfTelemetryData); } function handleShortfallResults(telemetryData) { // Save for later msfTelemetryData = telemetryData //console.log(telemetryData); var valueFunc = function(d) { //console.log(d[stat + memoryType]); return d[stat + memoryType]; }; generateGenericHeatmap(telemetryData, resolution, valueFunc, "msf-overlay-options"); } } // end of drawShortfallHeatmap() function generateGenericHeatmap(telemetryData, resolution, valueFunc, domElement) { showMsgWhenNoData(telemetryData); var min = 0, max = 0; $.each(telemetryData, function(i ,d) { min = ((valueFunc(d) < min) ? valueFunc(d) : min); max = ((valueFunc(d) > max) ? valueFunc(d) : max); }); var med = ((min+max)/2); var thresholdSlider = $("#" + domElement + " div.threshold-slider"); thresholdSlider.slider("option", "min", min); thresholdSlider.slider("option", "max", max); thresholdSlider.slider("refresh"); var valuesSlider = $("#" + domElement + " div.value-slider"); valuesSlider.slider("option", "min", min); valuesSlider.slider("option", "max", max); $("#" + domElement + " span.value-min").text(min.toFixed(2)); $("#" + domElement + " span.value-max").text(max.toFixed(2)); if ((valuesSlider.slider("values")[0] == min) && (valuesSlider.slider("values")[1] == min)) { valuesSlider.slider("values", 0, min); valuesSlider.slider("values", 1, max); } valuesSlider.slider("refresh"); rangeSliderValues = valuesSlider.slider("values"); var heatmapSliderValues = $("#" + domElement + " div.heatmap-slider-placeholder").slider("values"); var colourInterpolator = getColourInterpolator(rangeSliderValues[0], rangeSliderValues[1], heatmapSliderValues[1], heatmapSliderValues[0]); $("#" + domElement + " span.heatmap-gradient" + " span.heatmap-min").text(rangeSliderValues[0].toFixed(2)); $("#" + domElement + " span.heatmap-gradient" + " span.heatmap-med").text( ((rangeSliderValues[0] + rangeSliderValues[1]) / 2).toFixed(2) ); $("#" + domElement + " span.heatmap-gradient" + " span.heatmap-max").text(rangeSliderValues[1].toFixed(2)); var heatmap = d3.select("#map svg").append("svg:g") .attr("id", "telemetry-overlay") .attr("opacity", 0.01); heatmap .selectAll("rect") .data(telemetryData) .enter() .append("svg:rect") .attr("x", function(d) { return convert2WebXCoord(d.Location.X); }) .attr("y", function(d) { return convert2WebYCoord(d.Location.Y + resolution); }) .attr("width", resolution/project.map.scale) .attr("height", resolution/project.map.scale) .attr("fill", function(d) { return colourInterpolator(valueFunc(d)); }) .attr("visibility", function(d) { // Hide if below the threshold limit return (valueFunc(d) >= thresholdSlider.slider("value")) ? "visible" : "hidden"; }) .on("click", click) .append("title") .text(function(d) { var title = "Centre (x=" + (d.Location.X + resolution/2) + ", y=" + (d.Location.Y + resolution/2) + ")" + "\nValue : " + valueFunc(d).toFixed(2); //console.log(d.SampleSize); if ((typeof d.SampleSize) !== "undefined") title += "\nSample Size : " + d.SampleSize; return (title); }); heatmap .transition() .attr("opacity", 1); function click(d) { if (d && clicked !== d) { clicked = d; } else { clicked = null; } heatmap.selectAll("rect") .classed("active", clicked && function(d) { return d === clicked; }); } } // end of generateGenericHeatmap function drawCpsHeatmap() { var cpsMetric = $("select#cps-metric").val(); if (!cpsMetric) return; var restOptions = { build: $("select#build").val(), level: $("select#level").val(), platform: $("select#platform").val(), //resolution: 2, metric: cpsMetric, statistic: $("select#cps-statistics :selected").text(), } if (cpsMetric == config.cpsDrawListMetricName) restOptions["drawList"] = $("select#cps-draw-list").val(); block(); $.ajax({ url: config.restHost + config.capturePerformanceStats, type: "GET", data: restOptions, dataType: "json", success: function(json, textStatus, jqXHR) { //console.log(json) var colour = d3.scale.linear() .domain([33, 50, 66]) .range(interpolationColours); //var resolution = parseInt($("select#data-resolution :selected").text()); var resolution = 100; var heatmap = d3.select("#map svg").append("svg:g") .attr("id", "telemetry-overlay") .attr("opacity", 0.01); showMsgWhenNoData(json.Items); heatmap .selectAll("rect") .data(json.Items) .enter() .append("svg:rect") .attr("x", function(d) { return convert2WebXCoord(Number(d.Location.X)); }) .attr("y", function(d) { return convert2WebYCoord(Number(d.Location.Y) + resolution); }) .attr("width", resolution/project.map.scale) .attr("height", resolution/project.map.scale) .attr("fill", function(d) { return colour(d.Value); }) .on("mouseover", function() { d3.select(this).classed("active", true); }) .on("mouseout", function() { d3.select(this).classed("active", false); }) .on("click", showPerformanceDetails) //.on("dblclick", showPerformanceDetails) .append("title") .text(function(d) { var title = "Centre (x=" + (d.Location.X + resolution/2) + ", y=" + (d.Location.Y + resolution/2) + ")" + "\nValue : " + d.Value.toFixed(2) + "\nClick for Full Report"; return (title); }); heatmap .transition() .attr("opacity", 1); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError ); }, complete: function() { unBlock(); } }); // end of $.ajax() } function showPerformanceDetails(d) { var resolution = 100; var restOptions = { build: $("select#build").val(), level: $("select#level").val(), platform: $("select#platform").val(), resolution: 2, x: d.Location.X + (resolution/2), y: d.Location.Y + (resolution/2), } block(); var summary; $.ajax({ url: config.restHost + config.capturePerformanceSummary, type: "GET", data: restOptions, dataType: "json", async: true, success: function(json, textStatus, jqXHR) { summary = json; }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError ); }, complete: function() { } }); // end of summary $.ajax() $.ajax({ url: config.restHost + config.capturePerformanceZones, type: "GET", data: restOptions, dataType: "json", async: true, success: function(json, textStatus, jqXHR) { //console.log(json) populatePerformanceReport(json, summary); }, error: function (xhr, ajaxOptions, thrownError) { console.error(this.url + "\n" + ajaxOptions + " " + xhr.status + " " + thrownError ); }, complete: function() { var legendText = "Report for Cell with Centre (" + restOptions.x + ", " + restOptions.y + ")"; $("#performance-overlay fieldset legend").text(legendText); $("#performance-overlay").overlay().load(); unBlock(); } }); // end of zones $.ajax() } function populatePerformanceReport(data, summary) { $("#performance-overlay table").empty(); // FPS RESULT var fpsSum = summary.FpsInfo; $("#fps-results") .append( $("