mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-29 21:36:50 +02:00
Merge branch 'RC-58' of https://github.com/samcake/hifi into RC-58
This commit is contained in:
commit
d446796bc1
20 changed files with 342 additions and 317 deletions
|
@ -50,9 +50,9 @@ static const int INTERFACE_RUNNING_CHECK_FREQUENCY_MS = 1000;
|
||||||
|
|
||||||
const QString ASSET_SERVER_LOGGING_TARGET_NAME = "asset-server";
|
const QString ASSET_SERVER_LOGGING_TARGET_NAME = "asset-server";
|
||||||
|
|
||||||
static const QStringList BAKEABLE_MODEL_EXTENSIONS = {"fbx"};
|
static const QStringList BAKEABLE_MODEL_EXTENSIONS = { "fbx" };
|
||||||
static QStringList BAKEABLE_TEXTURE_EXTENSIONS;
|
static QStringList BAKEABLE_TEXTURE_EXTENSIONS;
|
||||||
static const QStringList BAKEABLE_SCRIPT_EXTENSIONS = {"js"};
|
static const QStringList BAKEABLE_SCRIPT_EXTENSIONS = {};
|
||||||
static const QString BAKED_MODEL_SIMPLE_NAME = "asset.fbx";
|
static const QString BAKED_MODEL_SIMPLE_NAME = "asset.fbx";
|
||||||
static const QString BAKED_TEXTURE_SIMPLE_NAME = "texture.ktx";
|
static const QString BAKED_TEXTURE_SIMPLE_NAME = "texture.ktx";
|
||||||
static const QString BAKED_SCRIPT_SIMPLE_NAME = "asset.js";
|
static const QString BAKED_SCRIPT_SIMPLE_NAME = "asset.js";
|
||||||
|
|
|
@ -146,187 +146,256 @@ function sendUpdatePlaceRequest(id, path, domainID, clearDomainID, onSuccess, on
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var pendingDomainRequest = null;
|
||||||
|
function getDomainFromAPI(callback) {
|
||||||
|
if (pendingDomainRequest !== null) {
|
||||||
|
pendingDomainRequest.success(callback);
|
||||||
|
pendingDomainRequest.error(function() { callback({ status: 'fail' }) });
|
||||||
|
return pendingDomainRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (callback === undefined) {
|
||||||
|
callback = function() {};
|
||||||
|
}
|
||||||
|
|
||||||
|
var domainID = Settings.data.values.metaverse.id;
|
||||||
|
if (domainID === null || domainID === undefined || domainID === '') {
|
||||||
|
callback({ status: 'fail' });
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingDomainRequest = $.ajax({
|
||||||
|
url: "/api/domains/" + domainID,
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(data) {
|
||||||
|
pendingDomainRequest = null;
|
||||||
|
|
||||||
|
if (data.status === 'success') {
|
||||||
|
DomainInfo = data.domain;
|
||||||
|
} else {
|
||||||
|
DomainInfo = null;
|
||||||
|
}
|
||||||
|
callback(data);
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
pendingDomainRequest = null;
|
||||||
|
|
||||||
|
DomainInfo = null;
|
||||||
|
callback({ status: 'fail' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return pendingDomainRequest;
|
||||||
|
}
|
||||||
|
|
||||||
function chooseFromHighFidelityPlaces(accessToken, forcePathTo, onSuccessfullyAdded) {
|
function chooseFromHighFidelityPlaces(accessToken, forcePathTo, onSuccessfullyAdded) {
|
||||||
if (accessToken) {
|
if (accessToken) {
|
||||||
|
|
||||||
var loadingDialog = showLoadingDialog(Strings.ADD_PLACE_LOADING_DIALOG);
|
var loadingDialog = showLoadingDialog(Strings.ADD_PLACE_LOADING_DIALOG);
|
||||||
|
|
||||||
$.ajax("/api/places", {
|
function loadPlaces() {
|
||||||
dataType: 'json',
|
$.ajax("/api/places", {
|
||||||
jsonp: false,
|
dataType: 'json',
|
||||||
success: function(data) {
|
jsonp: false,
|
||||||
if (data.status == 'success') {
|
success: function(data) {
|
||||||
var modal_buttons = {
|
if (data.status == 'success') {
|
||||||
cancel: {
|
var modal_buttons = {
|
||||||
label: Strings.ADD_PLACE_CANCEL_BUTTON,
|
cancel: {
|
||||||
className: 'add-place-cancel-button btn-default'
|
label: Strings.ADD_PLACE_CANCEL_BUTTON,
|
||||||
}
|
className: 'add-place-cancel-button btn-default'
|
||||||
};
|
|
||||||
|
|
||||||
var dialog;
|
|
||||||
var modal_body;
|
|
||||||
|
|
||||||
if (data.data.places.length) {
|
|
||||||
var places_by_id = {};
|
|
||||||
|
|
||||||
modal_body = $('<div>');
|
|
||||||
|
|
||||||
modal_body.append($("<p>Choose a place name that you own or <a href='" + URLs.METAVERSE_URL + "/user/places' target='_blank'>register a new place name</a></p>"));
|
|
||||||
|
|
||||||
var currentDomainIDType = getCurrentDomainIDType();
|
|
||||||
if (currentDomainIDType === DOMAIN_ID_TYPE_TEMP) {
|
|
||||||
var warning = "<div class='domain-loading-error alert alert-warning'>";
|
|
||||||
warning += "If you choose a place name it will replace your current temporary place name.";
|
|
||||||
warning += "</div>";
|
|
||||||
modal_body.append(warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
// setup a select box for the returned places
|
|
||||||
modal_body.append($("<label for='place-name-select'>Places</label>"));
|
|
||||||
place_select = $("<select id='place-name-select' class='form-control'></select>");
|
|
||||||
_.each(data.data.places, function(place) {
|
|
||||||
places_by_id[place.id] = place;
|
|
||||||
place_select.append("<option value='" + place.id + "'>" + place.name + "</option>");
|
|
||||||
})
|
|
||||||
modal_body.append(place_select);
|
|
||||||
modal_body.append($("<p id='place-name-warning' class='warning-text' style='display: none'>This place name already points to a place or path. Saving this would overwrite the previous settings associated with it.</p>"));
|
|
||||||
|
|
||||||
if (forcePathTo === undefined || forcePathTo === null) {
|
|
||||||
var path = "<div class='form-group'>";
|
|
||||||
path += "<label for='place-path-input' class='control-label'>Path</label>";
|
|
||||||
path += "<input type='text' id='place-path-input' class='form-control' value='/'>";
|
|
||||||
path += "</div>";
|
|
||||||
modal_body.append($(path));
|
|
||||||
}
|
|
||||||
|
|
||||||
var place_select = modal_body.find("#place-name-select")
|
|
||||||
place_select.change(function(ev) {
|
|
||||||
var warning = modal_body.find("#place-name-warning");
|
|
||||||
var place = places_by_id[$(this).val()];
|
|
||||||
if (place === undefined || place.pointee === null) {
|
|
||||||
warning.hide();
|
|
||||||
} else {
|
|
||||||
warning.show();
|
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
place_select.trigger('change');
|
|
||||||
|
|
||||||
modal_buttons["success"] = {
|
var dialog;
|
||||||
label: Strings.ADD_PLACE_CONFIRM_BUTTON,
|
var modal_body;
|
||||||
className: 'add-place-confirm-button btn btn-primary',
|
|
||||||
callback: function() {
|
|
||||||
var placeID = $('#place-name-select').val();
|
|
||||||
// set the place ID on the form
|
|
||||||
$(Settings.place_ID_SELECTOR).val(placeID).change();
|
|
||||||
|
|
||||||
if (forcePathTo === undefined || forcePathTo === null) {
|
if (data.data.places.length) {
|
||||||
var placePath = $('#place-path-input').val();
|
var places_by_id = {};
|
||||||
|
|
||||||
|
modal_body = $('<div>');
|
||||||
|
|
||||||
|
modal_body.append($("<p>Choose a place name that you own or <a href='" + URLs.METAVERSE_URL + "/user/places' target='_blank'>register a new place name</a></p>"));
|
||||||
|
|
||||||
|
var currentDomainIDType = getCurrentDomainIDType();
|
||||||
|
if (currentDomainIDType === DOMAIN_ID_TYPE_TEMP) {
|
||||||
|
var warning = "<div class='domain-loading-error alert alert-warning'>";
|
||||||
|
warning += "If you choose a place name it will replace your current temporary place name.";
|
||||||
|
warning += "</div>";
|
||||||
|
modal_body.append(warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup a select box for the returned places
|
||||||
|
modal_body.append($("<label for='place-name-select'>Places</label>"));
|
||||||
|
place_select = $("<select id='place-name-select' class='form-control'></select>");
|
||||||
|
_.each(data.data.places, function(place) {
|
||||||
|
places_by_id[place.id] = place;
|
||||||
|
place_select.append("<option value='" + place.id + "'>" + place.name + "</option>");
|
||||||
|
})
|
||||||
|
modal_body.append(place_select);
|
||||||
|
modal_body.append($("<p id='place-name-warning' class='warning-text' style='display: none'>This place name already points to a place or path. Saving this would overwrite the previous settings associated with it.</p>"));
|
||||||
|
|
||||||
|
if (forcePathTo === undefined || forcePathTo === null) {
|
||||||
|
var path = "<div class='form-group'>";
|
||||||
|
path += "<label for='place-path-input' class='control-label'>Path</label>";
|
||||||
|
path += "<input type='text' id='place-path-input' class='form-control' value='/'>";
|
||||||
|
path += "</div>";
|
||||||
|
modal_body.append($(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
var place_select = modal_body.find("#place-name-select")
|
||||||
|
place_select.change(function(ev) {
|
||||||
|
var warning = modal_body.find("#place-name-warning");
|
||||||
|
var place = places_by_id[$(this).val()];
|
||||||
|
if (place === undefined || place.pointee === null) {
|
||||||
|
warning.hide();
|
||||||
} else {
|
} else {
|
||||||
var placePath = forcePathTo;
|
warning.show();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
place_select.trigger('change');
|
||||||
|
|
||||||
$('.add-place-confirm-button').attr('disabled', 'disabled');
|
modal_buttons["success"] = {
|
||||||
$('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON_PENDING);
|
label: Strings.ADD_PLACE_CONFIRM_BUTTON,
|
||||||
$('.add-place-cancel-button').attr('disabled', 'disabled');
|
className: 'add-place-confirm-button btn btn-primary',
|
||||||
|
callback: function() {
|
||||||
|
var placeID = $('#place-name-select').val();
|
||||||
|
// set the place ID on the form
|
||||||
|
$(Settings.place_ID_SELECTOR).val(placeID).change();
|
||||||
|
|
||||||
function finalizeSaveDomainID(domainID) {
|
if (forcePathTo === undefined || forcePathTo === null) {
|
||||||
var jsonSettings = {
|
var placePath = $('#place-path-input').val();
|
||||||
metaverse: {
|
} else {
|
||||||
id: domainID
|
var placePath = forcePathTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
$('.add-place-confirm-button').attr('disabled', 'disabled');
|
||||||
|
$('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON_PENDING);
|
||||||
|
$('.add-place-cancel-button').attr('disabled', 'disabled');
|
||||||
|
|
||||||
|
function finalizeSaveDomainID(domainID) {
|
||||||
|
var jsonSettings = {
|
||||||
|
metaverse: {
|
||||||
|
id: domainID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var dialog = showLoadingDialog("Waiting for Domain Server to restart...");
|
||||||
|
$.ajax('/settings.json', {
|
||||||
|
data: JSON.stringify(jsonSettings),
|
||||||
|
contentType: 'application/json',
|
||||||
|
type: 'POST'
|
||||||
|
}).done(function(data) {
|
||||||
|
if (data.status == "success") {
|
||||||
|
waitForDomainServerRestart(function() {
|
||||||
|
dialog.modal('hide');
|
||||||
|
if (onSuccessfullyAdded) {
|
||||||
|
onSuccessfullyAdded(places_by_id[placeID].name, domainID);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
bootbox.alert("Failed to add place");
|
||||||
|
}
|
||||||
|
}).fail(function() {
|
||||||
|
bootbox.alert("Failed to add place");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// If domainID is not specified, the current domain id will be used.
|
||||||
|
function finishSettingUpPlace(domainID) {
|
||||||
|
sendUpdatePlaceRequest(
|
||||||
|
placeID,
|
||||||
|
placePath,
|
||||||
|
domainID,
|
||||||
|
false,
|
||||||
|
function(data) {
|
||||||
|
dialog.modal('hide')
|
||||||
|
if (domainID) {
|
||||||
|
$(Settings.DOMAIN_ID_SELECTOR).val(domainID).change();
|
||||||
|
finalizeSaveDomainID(domainID);
|
||||||
|
} else {
|
||||||
|
if (onSuccessfullyAdded) {
|
||||||
|
onSuccessfullyAdded(places_by_id[placeID].name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function(data) {
|
||||||
|
$('.add-place-confirm-button').removeAttr('disabled');
|
||||||
|
$('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON);
|
||||||
|
$('.add-place-cancel-button').removeAttr('disabled');
|
||||||
|
bootbox.alert(Strings.ADD_PLACE_UNKNOWN_ERROR);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function maybeCreateNewDomainID() {
|
||||||
|
console.log("Maybe creating domain id", currentDomainIDType)
|
||||||
|
if (currentDomainIDType === DOMAIN_ID_TYPE_FULL) {
|
||||||
|
finishSettingUpPlace();
|
||||||
|
} else {
|
||||||
|
sendCreateDomainRequest(function(domainID) {
|
||||||
|
console.log("Created domain", domainID);
|
||||||
|
finishSettingUpPlace(domainID);
|
||||||
|
}, function() {
|
||||||
|
$('.add-place-confirm-button').removeAttr('disabled');
|
||||||
|
$('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON);
|
||||||
|
$('.add-place-cancel-button').removeAttr('disabled');
|
||||||
|
bootbox.alert(Strings.ADD_PLACE_UNKNOWN_ERROR);
|
||||||
|
bootbox.alert("FAIL");
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var dialog = showLoadingDialog("Waiting for Domain Server to restart...");
|
|
||||||
$.ajax('/settings.json', {
|
|
||||||
data: JSON.stringify(jsonSettings),
|
|
||||||
contentType: 'application/json',
|
|
||||||
type: 'POST'
|
|
||||||
}).done(function(data) {
|
|
||||||
if (data.status == "success") {
|
|
||||||
waitForDomainServerRestart(function() {
|
|
||||||
dialog.modal('hide');
|
|
||||||
if (onSuccessfullyAdded) {
|
|
||||||
onSuccessfullyAdded(places_by_id[placeID].name, domainID);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
bootbox.alert("Failed to add place");
|
|
||||||
}
|
|
||||||
}).fail(function() {
|
|
||||||
bootbox.alert("Failed to add place");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function finishSettingUpPlace(domainID) {
|
maybeCreateNewDomainID();
|
||||||
sendUpdatePlaceRequest(
|
|
||||||
placeID,
|
|
||||||
placePath,
|
|
||||||
domainID,
|
|
||||||
false,
|
|
||||||
function(data) {
|
|
||||||
$(Settings.DOMAIN_ID_SELECTOR).val(domainID).change();
|
|
||||||
dialog.modal('hide')
|
|
||||||
if (domainID) {
|
|
||||||
finalizeSaveDomainID(domainID);
|
|
||||||
} else {
|
|
||||||
if (onSuccessfullyAdded) {
|
|
||||||
onSuccessfullyAdded(places_by_id[placeID].name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
function(data) {
|
|
||||||
$('.add-place-confirm-button').removeAttr('disabled');
|
|
||||||
$('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON);
|
|
||||||
$('.add-place-cancel-button').removeAttr('disabled');
|
|
||||||
bootbox.alert(Strings.ADD_PLACE_UNKNOWN_ERROR);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentDomainIDType === DOMAIN_ID_TYPE_FULL) {
|
return false;
|
||||||
finishSettingUpPlace();
|
|
||||||
} else {
|
|
||||||
sendCreateDomainRequest(function(domainID) {
|
|
||||||
console.log("Created domain", domainID);
|
|
||||||
finishSettingUpPlace(domainID);
|
|
||||||
}, function() {
|
|
||||||
$('.add-place-confirm-button').removeAttr('disabled');
|
|
||||||
$('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON);
|
|
||||||
$('.add-place-cancel-button').removeAttr('disabled');
|
|
||||||
bootbox.alert(Strings.ADD_PLACE_UNKNOWN_ERROR);
|
|
||||||
bootbox.alert("FAIL");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
modal_buttons["success"] = {
|
||||||
|
label: Strings.ADD_PLACE_NO_PLACES_BUTTON,
|
||||||
|
callback: function() {
|
||||||
|
window.open(URLs.METAVERSE_URL + "/user/places", '_blank');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
modal_body = Strings.ADD_PLACE_NO_PLACES_MESSAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialog = bootbox.dialog({
|
||||||
|
title: Strings.ADD_PLACE_TITLE,
|
||||||
|
message: modal_body,
|
||||||
|
closeButton: false,
|
||||||
|
buttons: modal_buttons
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
modal_buttons["success"] = {
|
bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR);
|
||||||
label: Strings.ADD_PLACE_NO_PLACES_BUTTON,
|
|
||||||
callback: function() {
|
|
||||||
window.open(URLs.METAVERSE_URL + "/user/places", '_blank');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
modal_body = Strings.ADD_PLACE_NO_PLACES_MESSAGE;
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
dialog = bootbox.dialog({
|
error: function() {
|
||||||
title: Strings.ADD_PLACE_TITLE,
|
|
||||||
message: modal_body,
|
|
||||||
closeButton: false,
|
|
||||||
buttons: modal_buttons
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR);
|
bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR);
|
||||||
|
},
|
||||||
|
complete: function() {
|
||||||
|
loadingDialog.modal('hide');
|
||||||
}
|
}
|
||||||
},
|
});
|
||||||
error: function() {
|
}
|
||||||
bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR);
|
|
||||||
},
|
var domainType = getCurrentDomainIDType();
|
||||||
complete: function() {
|
if (domainType !== DOMAIN_ID_TYPE_UNKNOWN) {
|
||||||
loadingDialog.modal('hide');
|
loadPlaces();
|
||||||
}
|
} else {
|
||||||
});
|
getDomainFromAPI(function(data) {
|
||||||
|
if (data.status === 'success') {
|
||||||
|
var domainType = getCurrentDomainIDType();
|
||||||
|
loadPlaces();
|
||||||
|
} else {
|
||||||
|
loadingDialog.modal('hide');
|
||||||
|
bootbox.confirm("We were not able to load your domain information from the Metaverse. Would you like to retry?", function(response) {
|
||||||
|
if (response) {
|
||||||
|
chooseFromHighFidelityPlaces(accessToken, forcePathTo, onSuccessfullyAdded);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
bootbox.alert({
|
bootbox.alert({
|
||||||
|
|
|
@ -980,20 +980,6 @@ function placeTableRowForPlaceObject(place) {
|
||||||
return placeTableRow(place.name, placePathOrIndex, false, place.id);
|
return placeTableRow(place.name, placePathOrIndex, false, place.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDomainFromAPI(callback) {
|
|
||||||
var domainID = Settings.data.values.metaverse.id;
|
|
||||||
$.ajax({
|
|
||||||
url: "/api/domains/" + domainID,
|
|
||||||
dataType: 'json',
|
|
||||||
success: function(data) {
|
|
||||||
callback(data);
|
|
||||||
},
|
|
||||||
error: function() {
|
|
||||||
callback({ status: 'fail' });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function reloadDomainInfo() {
|
function reloadDomainInfo() {
|
||||||
$('#' + Settings.PLACES_TABLE_ID + " tbody tr").not('.headers').remove();
|
$('#' + Settings.PLACES_TABLE_ID + " tbody tr").not('.headers').remove();
|
||||||
|
|
||||||
|
@ -1010,7 +996,6 @@ function reloadDomainInfo() {
|
||||||
// check if we have owner_places (for a real domain) or a name (for a temporary domain)
|
// check if we have owner_places (for a real domain) or a name (for a temporary domain)
|
||||||
if (data.status == "success") {
|
if (data.status == "success") {
|
||||||
$('.domain-loading-hide').show();
|
$('.domain-loading-hide').show();
|
||||||
DomainInfo = data.domain;
|
|
||||||
if (data.domain.owner_places) {
|
if (data.domain.owner_places) {
|
||||||
// add a table row for each of these names
|
// add a table row for each of these names
|
||||||
_.each(data.domain.owner_places, function(place){
|
_.each(data.domain.owner_places, function(place){
|
||||||
|
@ -1043,7 +1028,6 @@ function reloadDomainInfo() {
|
||||||
appendAddButtonToPlacesTable();
|
appendAddButtonToPlacesTable();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
DomainInfo = null;
|
|
||||||
$('.domain-loading-error').show();
|
$('.domain-loading-error').show();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -58,6 +58,7 @@ $(document).ready(function(){
|
||||||
|
|
||||||
reloadSettings(function(success) {
|
reloadSettings(function(success) {
|
||||||
if (success) {
|
if (success) {
|
||||||
|
getDomainFromAPI();
|
||||||
setupWizardSteps();
|
setupWizardSteps();
|
||||||
updatePlaceNameDisplay();
|
updatePlaceNameDisplay();
|
||||||
updateUsernameDisplay();
|
updateUsernameDisplay();
|
||||||
|
|
|
@ -830,26 +830,6 @@ void DomainServer::setupICEHeartbeatForFullNetworking() {
|
||||||
void DomainServer::updateICEServerAddresses() {
|
void DomainServer::updateICEServerAddresses() {
|
||||||
if (_iceAddressLookupID == INVALID_ICE_LOOKUP_ID) {
|
if (_iceAddressLookupID == INVALID_ICE_LOOKUP_ID) {
|
||||||
_iceAddressLookupID = QHostInfo::lookupHost(_iceServerAddr, this, SLOT(handleICEHostInfo(QHostInfo)));
|
_iceAddressLookupID = QHostInfo::lookupHost(_iceServerAddr, this, SLOT(handleICEHostInfo(QHostInfo)));
|
||||||
|
|
||||||
// there seems to be a 5.9 bug where lookupHost never calls our slot
|
|
||||||
// so we add a single shot manual "timeout" to fire it off again if it hasn't called back yet
|
|
||||||
static const int ICE_ADDRESS_LOOKUP_TIMEOUT_MS = 5000;
|
|
||||||
QTimer::singleShot(ICE_ADDRESS_LOOKUP_TIMEOUT_MS, this, &DomainServer::timeoutICEAddressLookup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DomainServer::timeoutICEAddressLookup() {
|
|
||||||
if (_iceAddressLookupID != INVALID_ICE_LOOKUP_ID) {
|
|
||||||
// we waited 5s and didn't hear back for our ICE DNS lookup
|
|
||||||
// so time that one out and kick off another
|
|
||||||
|
|
||||||
qDebug() << "IP address lookup timed out for" << _iceServerAddr << "- retrying";
|
|
||||||
|
|
||||||
QHostInfo::abortHostLookup(_iceAddressLookupID);
|
|
||||||
|
|
||||||
_iceAddressLookupID = INVALID_ICE_LOOKUP_ID;
|
|
||||||
|
|
||||||
updateICEServerAddresses();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3007,9 +2987,20 @@ void DomainServer::handleKeypairChange() {
|
||||||
|
|
||||||
void DomainServer::handleICEHostInfo(const QHostInfo& hostInfo) {
|
void DomainServer::handleICEHostInfo(const QHostInfo& hostInfo) {
|
||||||
// clear the ICE address lookup ID so that it can fire again
|
// clear the ICE address lookup ID so that it can fire again
|
||||||
_iceAddressLookupID = -1;
|
_iceAddressLookupID = INVALID_ICE_LOOKUP_ID;
|
||||||
|
|
||||||
if (hostInfo.error() != QHostInfo::NoError) {
|
// enumerate the returned addresses and collect only valid IPv4 addresses
|
||||||
|
QList<QHostAddress> sanitizedAddresses = hostInfo.addresses();
|
||||||
|
auto it = sanitizedAddresses.begin();
|
||||||
|
while (it != sanitizedAddresses.end()) {
|
||||||
|
if (!it->isNull() && it->protocol() == QAbstractSocket::IPv4Protocol) {
|
||||||
|
++it;
|
||||||
|
} else {
|
||||||
|
it = sanitizedAddresses.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hostInfo.error() != QHostInfo::NoError || sanitizedAddresses.empty()) {
|
||||||
qWarning() << "IP address lookup failed for" << _iceServerAddr << ":" << hostInfo.errorString();
|
qWarning() << "IP address lookup failed for" << _iceServerAddr << ":" << hostInfo.errorString();
|
||||||
|
|
||||||
// if we don't have an ICE server to use yet, trigger a retry
|
// if we don't have an ICE server to use yet, trigger a retry
|
||||||
|
@ -3022,7 +3013,7 @@ void DomainServer::handleICEHostInfo(const QHostInfo& hostInfo) {
|
||||||
} else {
|
} else {
|
||||||
int countBefore = _iceServerAddresses.count();
|
int countBefore = _iceServerAddresses.count();
|
||||||
|
|
||||||
_iceServerAddresses = hostInfo.addresses();
|
_iceServerAddresses = sanitizedAddresses;
|
||||||
|
|
||||||
if (countBefore == 0) {
|
if (countBefore == 0) {
|
||||||
qInfo() << "Found" << _iceServerAddresses.count() << "ice-server IP addresses for" << _iceServerAddr;
|
qInfo() << "Found" << _iceServerAddresses.count() << "ice-server IP addresses for" << _iceServerAddr;
|
||||||
|
|
|
@ -116,8 +116,6 @@ private slots:
|
||||||
void tokenGrantFinished();
|
void tokenGrantFinished();
|
||||||
void profileRequestFinished();
|
void profileRequestFinished();
|
||||||
|
|
||||||
void timeoutICEAddressLookup();
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void iceServerChanged();
|
void iceServerChanged();
|
||||||
void userConnected();
|
void userConnected();
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <NLPacketList.h>
|
#include <NLPacketList.h>
|
||||||
#include <NumericalConstants.h>
|
#include <NumericalConstants.h>
|
||||||
#include <SettingHandle.h>
|
#include <SettingHandle.h>
|
||||||
|
#include <SettingHelpers.h>
|
||||||
#include <AvatarData.h> //for KillAvatarReason
|
#include <AvatarData.h> //for KillAvatarReason
|
||||||
#include <FingerprintUtils.h>
|
#include <FingerprintUtils.h>
|
||||||
#include "DomainServerNodeData.h"
|
#include "DomainServerNodeData.h"
|
||||||
|
@ -43,12 +44,7 @@ const QString DESCRIPTION_COLUMNS_KEY = "columns";
|
||||||
|
|
||||||
const QString SETTINGS_VIEWPOINT_KEY = "viewpoint";
|
const QString SETTINGS_VIEWPOINT_KEY = "viewpoint";
|
||||||
|
|
||||||
static Setting::Handle<double> JSON_SETTING_VERSION("json-settings/version", 0.0);
|
DomainServerSettingsManager::DomainServerSettingsManager() {
|
||||||
|
|
||||||
DomainServerSettingsManager::DomainServerSettingsManager() :
|
|
||||||
_descriptionArray(),
|
|
||||||
_configMap()
|
|
||||||
{
|
|
||||||
// load the description object from the settings description
|
// load the description object from the settings description
|
||||||
QFile descriptionFile(QCoreApplication::applicationDirPath() + SETTINGS_DESCRIPTION_RELATIVE_PATH);
|
QFile descriptionFile(QCoreApplication::applicationDirPath() + SETTINGS_DESCRIPTION_RELATIVE_PATH);
|
||||||
descriptionFile.open(QIODevice::ReadOnly);
|
descriptionFile.open(QIODevice::ReadOnly);
|
||||||
|
@ -100,12 +96,34 @@ void DomainServerSettingsManager::processSettingsRequestPacket(QSharedPointer<Re
|
||||||
void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList) {
|
void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList) {
|
||||||
_argumentList = argumentList;
|
_argumentList = argumentList;
|
||||||
|
|
||||||
// after 1.7 we no longer use the master or merged configs - this is kept in place for migration
|
_configMap.loadConfig(_argumentList);
|
||||||
_configMap.loadMasterAndUserConfig(_argumentList);
|
|
||||||
|
static const auto VERSION_SETTINGS_KEYPATH = "version";
|
||||||
|
QVariant* versionVariant = _configMap.valueForKeyPath(VERSION_SETTINGS_KEYPATH);
|
||||||
|
|
||||||
|
if (!versionVariant) {
|
||||||
|
versionVariant = _configMap.valueForKeyPath(VERSION_SETTINGS_KEYPATH, true);
|
||||||
|
*versionVariant = _descriptionVersion;
|
||||||
|
persistToFile();
|
||||||
|
qDebug() << "No version in config file, setting to current version" << _descriptionVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Backward compatibility migration code
|
||||||
|
// The config version used to be stored in a different file
|
||||||
|
// This moves it to the actual config file.
|
||||||
|
Setting::Handle<double> JSON_SETTING_VERSION("json-settings/version", 0.0);
|
||||||
|
if (JSON_SETTING_VERSION.isSet()) {
|
||||||
|
auto version = JSON_SETTING_VERSION.get();
|
||||||
|
*versionVariant = version;
|
||||||
|
persistToFile();
|
||||||
|
QFile::remove(settingsFilename());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// What settings version were we before and what are we using now?
|
// What settings version were we before and what are we using now?
|
||||||
// Do we need to do any re-mapping?
|
// Do we need to do any re-mapping?
|
||||||
double oldVersion = JSON_SETTING_VERSION.get();
|
double oldVersion = versionVariant->toDouble();
|
||||||
|
|
||||||
if (oldVersion != _descriptionVersion) {
|
if (oldVersion != _descriptionVersion) {
|
||||||
const QString ALLOWED_USERS_SETTINGS_KEYPATH = "security.allowed_users";
|
const QString ALLOWED_USERS_SETTINGS_KEYPATH = "security.allowed_users";
|
||||||
|
@ -137,12 +155,6 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList
|
||||||
QVariant* restrictedAccess = _configMap.valueForKeyPath(RESTRICTED_ACCESS_SETTINGS_KEYPATH, true);
|
QVariant* restrictedAccess = _configMap.valueForKeyPath(RESTRICTED_ACCESS_SETTINGS_KEYPATH, true);
|
||||||
|
|
||||||
*restrictedAccess = QVariant(true);
|
*restrictedAccess = QVariant(true);
|
||||||
|
|
||||||
// write the new settings to the json file
|
|
||||||
persistToFile();
|
|
||||||
|
|
||||||
// reload the master and user config so that the merged config is right
|
|
||||||
_configMap.loadMasterAndUserConfig(_argumentList);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,12 +184,6 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList
|
||||||
|
|
||||||
*entityServerVariant = entityServerMap;
|
*entityServerVariant = entityServerMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
// write the new settings to the json file
|
|
||||||
persistToFile();
|
|
||||||
|
|
||||||
// reload the master and user config so that the merged config is right
|
|
||||||
_configMap.loadMasterAndUserConfig(_argumentList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -195,12 +201,6 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList
|
||||||
qDebug() << "Migrating plaintext password to SHA256 hash in domain-server settings.";
|
qDebug() << "Migrating plaintext password to SHA256 hash in domain-server settings.";
|
||||||
|
|
||||||
*passwordVariant = QCryptographicHash::hash(plaintextPassword.toUtf8(), QCryptographicHash::Sha256).toHex();
|
*passwordVariant = QCryptographicHash::hash(plaintextPassword.toUtf8(), QCryptographicHash::Sha256).toHex();
|
||||||
|
|
||||||
// write the new settings to file
|
|
||||||
persistToFile();
|
|
||||||
|
|
||||||
// reload the master and user config so the merged config is correct
|
|
||||||
_configMap.loadMasterAndUserConfig(_argumentList);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -283,19 +283,6 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList
|
||||||
packPermissions();
|
packPermissions();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (oldVersion < 1.7) {
|
|
||||||
// This was prior to the removal of the master config file
|
|
||||||
// So we write the merged config to the user config file, and stop reading from the user config file
|
|
||||||
|
|
||||||
qDebug() << "Migrating merged config to user config file. The master config file is deprecated.";
|
|
||||||
|
|
||||||
// replace the user config by the merged config
|
|
||||||
_configMap.getConfig() = _configMap.getMergedConfig();
|
|
||||||
|
|
||||||
// persist the new config so the user config file has the correctly merged config
|
|
||||||
persistToFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldVersion < 1.8) {
|
if (oldVersion < 1.8) {
|
||||||
unpackPermissions();
|
unpackPermissions();
|
||||||
// This was prior to addition of domain content replacement, add that to localhost permissions by default
|
// This was prior to addition of domain content replacement, add that to localhost permissions by default
|
||||||
|
@ -316,16 +303,16 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList
|
||||||
QVariant* wizardCompletedOnce = _configMap.valueForKeyPath(WIZARD_COMPLETED_ONCE, true);
|
QVariant* wizardCompletedOnce = _configMap.valueForKeyPath(WIZARD_COMPLETED_ONCE, true);
|
||||||
|
|
||||||
*wizardCompletedOnce = QVariant(true);
|
*wizardCompletedOnce = QVariant(true);
|
||||||
|
|
||||||
// write the new settings to the json file
|
|
||||||
persistToFile();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// write the current description version to our settings
|
||||||
|
*versionVariant = _descriptionVersion;
|
||||||
|
|
||||||
|
// write the new settings to the json file
|
||||||
|
persistToFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
unpackPermissions();
|
unpackPermissions();
|
||||||
|
|
||||||
// write the current description version to our settings
|
|
||||||
JSON_SETTING_VERSION.set(_descriptionVersion);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantMap& DomainServerSettingsManager::getDescriptorsMap() {
|
QVariantMap& DomainServerSettingsManager::getDescriptorsMap() {
|
||||||
|
@ -1289,9 +1276,6 @@ bool DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// re-merge the user and master configs after a settings change
|
|
||||||
_configMap.mergeMasterAndUserConfigs();
|
|
||||||
|
|
||||||
return needRestart;
|
return needRestart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,6 +179,12 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
|
||||||
const AvatarPriority& sortData = sortedAvatars.top();
|
const AvatarPriority& sortData = sortedAvatars.top();
|
||||||
const auto& avatar = std::static_pointer_cast<Avatar>(sortData.avatar);
|
const auto& avatar = std::static_pointer_cast<Avatar>(sortData.avatar);
|
||||||
|
|
||||||
|
bool ignoring = DependencyManager::get<NodeList>()->isPersonalMutingNode(avatar->getID());
|
||||||
|
if (ignoring) {
|
||||||
|
sortedAvatars.pop();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// for ALL avatars...
|
// for ALL avatars...
|
||||||
if (_shouldRender) {
|
if (_shouldRender) {
|
||||||
avatar->ensureInScene(avatar, qApp->getMain3DScene());
|
avatar->ensureInScene(avatar, qApp->getMain3DScene());
|
||||||
|
|
|
@ -295,6 +295,14 @@ void EntityRenderer::updateInScene(const ScenePointer& scene, Transaction& trans
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EntityRenderer::clearSubRenderItemIDs() {
|
||||||
|
_subRenderItemIDs.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityRenderer::setSubRenderItemIDs(const render::ItemIDs& ids) {
|
||||||
|
_subRenderItemIDs = ids;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Internal methods
|
// Internal methods
|
||||||
//
|
//
|
||||||
|
|
|
@ -49,6 +49,9 @@ public:
|
||||||
virtual bool addToScene(const ScenePointer& scene, Transaction& transaction) final;
|
virtual bool addToScene(const ScenePointer& scene, Transaction& transaction) final;
|
||||||
virtual void removeFromScene(const ScenePointer& scene, Transaction& transaction);
|
virtual void removeFromScene(const ScenePointer& scene, Transaction& transaction);
|
||||||
|
|
||||||
|
void clearSubRenderItemIDs();
|
||||||
|
void setSubRenderItemIDs(const render::ItemIDs& ids);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool needsRenderUpdateFromEntity() const final { return needsRenderUpdateFromEntity(_entity); }
|
virtual bool needsRenderUpdateFromEntity() const final { return needsRenderUpdateFromEntity(_entity); }
|
||||||
virtual void onAddToScene(const EntityItemPointer& entity);
|
virtual void onAddToScene(const EntityItemPointer& entity);
|
||||||
|
@ -113,6 +116,7 @@ protected:
|
||||||
SharedSoundPointer _collisionSound;
|
SharedSoundPointer _collisionSound;
|
||||||
QUuid _changeHandlerId;
|
QUuid _changeHandlerId;
|
||||||
ItemID _renderItemID{ Item::INVALID_ITEM_ID };
|
ItemID _renderItemID{ Item::INVALID_ITEM_ID };
|
||||||
|
ItemIDs _subRenderItemIDs;
|
||||||
quint64 _fadeStartTime{ usecTimestampNow() };
|
quint64 _fadeStartTime{ usecTimestampNow() };
|
||||||
bool _isFading{ _entitiesShouldFadeFunction() };
|
bool _isFading{ _entitiesShouldFadeFunction() };
|
||||||
bool _prevIsTransparent { false };
|
bool _prevIsTransparent { false };
|
||||||
|
|
|
@ -215,6 +215,7 @@ void RenderableModelEntityItem::updateModelBounds() {
|
||||||
model->setScaleToFit(true, getDimensions());
|
model->setScaleToFit(true, getDimensions());
|
||||||
model->setSnapModelToRegistrationPoint(true, getRegistrationPoint());
|
model->setSnapModelToRegistrationPoint(true, getRegistrationPoint());
|
||||||
updateRenderItems = true;
|
updateRenderItems = true;
|
||||||
|
model->scaleToFit();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool success;
|
bool success;
|
||||||
|
@ -952,7 +953,8 @@ ItemKey ModelEntityRenderer::getKey() {
|
||||||
|
|
||||||
uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) {
|
uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) {
|
||||||
if (_model) {
|
if (_model) {
|
||||||
auto metaSubItems = _model->fetchRenderItemIDs();
|
// auto metaSubItems = _model->fetchRenderItemIDs();
|
||||||
|
auto metaSubItems = _subRenderItemIDs;
|
||||||
subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end());
|
subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end());
|
||||||
return (uint32_t)metaSubItems.size();
|
return (uint32_t)metaSubItems.size();
|
||||||
}
|
}
|
||||||
|
@ -1201,6 +1203,10 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
if ((bool)model) {
|
if ((bool)model) {
|
||||||
model->removeFromScene(scene, transaction);
|
model->removeFromScene(scene, transaction);
|
||||||
withWriteLock([&] { _model.reset(); });
|
withWriteLock([&] { _model.reset(); });
|
||||||
|
transaction.updateItem<PayloadProxyInterface>(getRenderItemID(), [](PayloadProxyInterface& data) {
|
||||||
|
auto re = static_cast<EntityRenderer*>(&data);
|
||||||
|
re->clearSubRenderItemIDs();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1296,6 +1302,12 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
render::Item::Status::Getters statusGetters;
|
render::Item::Status::Getters statusGetters;
|
||||||
makeStatusGetters(entity, statusGetters);
|
makeStatusGetters(entity, statusGetters);
|
||||||
model->addToScene(scene, transaction, statusGetters);
|
model->addToScene(scene, transaction, statusGetters);
|
||||||
|
|
||||||
|
auto newRenderItemIDs{ model->fetchRenderItemIDs() };
|
||||||
|
transaction.updateItem<PayloadProxyInterface>(getRenderItemID(), [newRenderItemIDs](PayloadProxyInterface& data) {
|
||||||
|
auto re = static_cast<EntityRenderer*>(&data);
|
||||||
|
re->setSubRenderItemIDs(newRenderItemIDs);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -202,6 +202,24 @@ enum EntityPropertyList {
|
||||||
PROP_ENTITY_INSTANCE_NUMBER,
|
PROP_ENTITY_INSTANCE_NUMBER,
|
||||||
PROP_CERTIFICATE_ID,
|
PROP_CERTIFICATE_ID,
|
||||||
|
|
||||||
|
PROP_HAZE_MODE,
|
||||||
|
|
||||||
|
PROP_HAZE_RANGE,
|
||||||
|
PROP_HAZE_COLOR,
|
||||||
|
PROP_HAZE_GLARE_COLOR,
|
||||||
|
PROP_HAZE_ENABLE_GLARE,
|
||||||
|
PROP_HAZE_GLARE_ANGLE,
|
||||||
|
|
||||||
|
PROP_HAZE_ALTITUDE_EFFECT,
|
||||||
|
PROP_HAZE_CEILING,
|
||||||
|
PROP_HAZE_BASE_REF,
|
||||||
|
|
||||||
|
PROP_HAZE_BACKGROUND_BLEND,
|
||||||
|
|
||||||
|
PROP_HAZE_ATTENUATE_KEYLIGHT,
|
||||||
|
PROP_HAZE_KEYLIGHT_RANGE,
|
||||||
|
PROP_HAZE_KEYLIGHT_ALTITUDE,
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// ATTENTION: add new properties to end of list just ABOVE this line
|
// ATTENTION: add new properties to end of list just ABOVE this line
|
||||||
PROP_AFTER_LAST_ITEM,
|
PROP_AFTER_LAST_ITEM,
|
||||||
|
@ -234,24 +252,6 @@ enum EntityPropertyList {
|
||||||
PROP_STAGE_AUTOMATIC_HOURDAY = PROP_ANIMATION_FRAME_INDEX,
|
PROP_STAGE_AUTOMATIC_HOURDAY = PROP_ANIMATION_FRAME_INDEX,
|
||||||
PROP_BACKGROUND_MODE = PROP_MODEL_URL,
|
PROP_BACKGROUND_MODE = PROP_MODEL_URL,
|
||||||
|
|
||||||
PROP_HAZE_MODE = PROP_COLOR,
|
|
||||||
|
|
||||||
PROP_HAZE_RANGE = PROP_INTENSITY,
|
|
||||||
PROP_HAZE_COLOR = PROP_CUTOFF,
|
|
||||||
PROP_HAZE_GLARE_COLOR = PROP_EXPONENT,
|
|
||||||
PROP_HAZE_ENABLE_GLARE = PROP_IS_SPOTLIGHT,
|
|
||||||
PROP_HAZE_GLARE_ANGLE = PROP_DIFFUSE_COLOR,
|
|
||||||
|
|
||||||
PROP_HAZE_ALTITUDE_EFFECT = PROP_AMBIENT_COLOR_UNUSED,
|
|
||||||
PROP_HAZE_CEILING = PROP_SPECULAR_COLOR_UNUSED,
|
|
||||||
PROP_HAZE_BASE_REF = PROP_LINEAR_ATTENUATION_UNUSED,
|
|
||||||
|
|
||||||
PROP_HAZE_BACKGROUND_BLEND = PROP_QUADRATIC_ATTENUATION_UNUSED,
|
|
||||||
|
|
||||||
PROP_HAZE_ATTENUATE_KEYLIGHT = PROP_ANIMATION_FRAME_INDEX,
|
|
||||||
PROP_HAZE_KEYLIGHT_RANGE = PROP_MODEL_URL,
|
|
||||||
PROP_HAZE_KEYLIGHT_ALTITUDE = PROP_ANIMATION_URL,
|
|
||||||
|
|
||||||
PROP_SKYBOX_COLOR = PROP_ANIMATION_URL,
|
PROP_SKYBOX_COLOR = PROP_ANIMATION_URL,
|
||||||
PROP_SKYBOX_URL = PROP_ANIMATION_FPS,
|
PROP_SKYBOX_URL = PROP_ANIMATION_FPS,
|
||||||
PROP_KEYLIGHT_AMBIENT_URL = PROP_ANIMATION_PLAYING,
|
PROP_KEYLIGHT_AMBIENT_URL = PROP_ANIMATION_PLAYING,
|
||||||
|
|
|
@ -34,7 +34,7 @@ public:
|
||||||
HifiSockAddr(const sockaddr* sockaddr);
|
HifiSockAddr(const sockaddr* sockaddr);
|
||||||
|
|
||||||
bool isNull() const { return _address.isNull() && _port == 0; }
|
bool isNull() const { return _address.isNull() && _port == 0; }
|
||||||
void clear() { _address = QHostAddress::Null; _port = 0;}
|
void clear() { _address.clear(); _port = 0;}
|
||||||
|
|
||||||
HifiSockAddr& operator=(const HifiSockAddr& rhsSockAddr);
|
HifiSockAddr& operator=(const HifiSockAddr& rhsSockAddr);
|
||||||
void swap(HifiSockAddr& otherSockAddr);
|
void swap(HifiSockAddr& otherSockAddr);
|
||||||
|
|
|
@ -30,7 +30,7 @@ PacketVersion versionForPacketType(PacketType packetType) {
|
||||||
case PacketType::EntityEdit:
|
case PacketType::EntityEdit:
|
||||||
case PacketType::EntityData:
|
case PacketType::EntityData:
|
||||||
case PacketType::EntityPhysics:
|
case PacketType::EntityPhysics:
|
||||||
return static_cast<PacketVersion>(EntityVersion::HasDynamicOwnershipTests);
|
return static_cast<PacketVersion>(EntityVersion::HazeEffect);
|
||||||
|
|
||||||
case PacketType::EntityQuery:
|
case PacketType::EntityQuery:
|
||||||
return static_cast<PacketVersion>(EntityQueryPacketVersion::JSONFilterWithFamilyTree);
|
return static_cast<PacketVersion>(EntityQueryPacketVersion::JSONFilterWithFamilyTree);
|
||||||
|
|
|
@ -196,7 +196,8 @@ QDebug operator<<(QDebug debug, const PacketType& type);
|
||||||
|
|
||||||
enum class EntityVersion : PacketVersion {
|
enum class EntityVersion : PacketVersion {
|
||||||
StrokeColorProperty = 77,
|
StrokeColorProperty = 77,
|
||||||
HasDynamicOwnershipTests
|
HasDynamicOwnershipTests,
|
||||||
|
HazeEffect
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class EntityScriptCallMethodVersion : PacketVersion {
|
enum class EntityScriptCallMethodVersion : PacketVersion {
|
||||||
|
|
|
@ -262,6 +262,8 @@ public:
|
||||||
|
|
||||||
Q_INVOKABLE MeshProxyList getMeshes() const;
|
Q_INVOKABLE MeshProxyList getMeshes() const;
|
||||||
|
|
||||||
|
void scaleToFit();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void loadURLFinished(bool success);
|
void loadURLFinished(bool success);
|
||||||
|
|
||||||
|
@ -320,7 +322,6 @@ protected:
|
||||||
virtual void initJointStates();
|
virtual void initJointStates();
|
||||||
|
|
||||||
void setScaleInternal(const glm::vec3& scale);
|
void setScaleInternal(const glm::vec3& scale);
|
||||||
void scaleToFit();
|
|
||||||
void snapToRegistrationPoint();
|
void snapToRegistrationPoint();
|
||||||
|
|
||||||
void computeMeshPartLocalBounds();
|
void computeMeshPartLocalBounds();
|
||||||
|
|
|
@ -91,32 +91,6 @@ QVariantMap HifiConfigVariantMap::mergeCLParametersWithJSONConfig(const QStringL
|
||||||
return mergedMap;
|
return mergedMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
HifiConfigVariantMap::HifiConfigVariantMap() :
|
|
||||||
_userConfigFilename(),
|
|
||||||
_masterConfig(),
|
|
||||||
_userConfig(),
|
|
||||||
_mergedConfig()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void HifiConfigVariantMap::loadMasterAndUserConfig(const QStringList& argumentList) {
|
|
||||||
// check if there is a master config file
|
|
||||||
const QString MASTER_CONFIG_FILE_OPTION = "--master-config";
|
|
||||||
|
|
||||||
int masterConfigIndex = argumentList.indexOf(MASTER_CONFIG_FILE_OPTION);
|
|
||||||
if (masterConfigIndex != -1) {
|
|
||||||
QString masterConfigFilepath = argumentList[masterConfigIndex + 1];
|
|
||||||
|
|
||||||
loadMapFromJSONFile(_masterConfig, masterConfigFilepath);
|
|
||||||
}
|
|
||||||
|
|
||||||
// load the user config - that method replace loadMasterAndUserConfig after the 1.7 migration
|
|
||||||
loadConfig(argumentList);
|
|
||||||
|
|
||||||
mergeMasterAndUserConfigs();
|
|
||||||
}
|
|
||||||
|
|
||||||
void HifiConfigVariantMap::loadConfig(const QStringList& argumentList) {
|
void HifiConfigVariantMap::loadConfig(const QStringList& argumentList) {
|
||||||
// load the user config
|
// load the user config
|
||||||
const QString USER_CONFIG_FILE_OPTION = "--user-config";
|
const QString USER_CONFIG_FILE_OPTION = "--user-config";
|
||||||
|
@ -172,14 +146,6 @@ void HifiConfigVariantMap::loadConfig(const QStringList& argumentList) {
|
||||||
loadMapFromJSONFile(_userConfig, _userConfigFilename);
|
loadMapFromJSONFile(_userConfig, _userConfigFilename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HifiConfigVariantMap::mergeMasterAndUserConfigs() {
|
|
||||||
// the merged config is initially matched to the master config
|
|
||||||
_mergedConfig = _masterConfig;
|
|
||||||
|
|
||||||
// then we merge in anything missing from the user config
|
|
||||||
addMissingValuesToExistingMap(_mergedConfig, _userConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
void HifiConfigVariantMap::loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename) {
|
void HifiConfigVariantMap::loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename) {
|
||||||
QFile configFile(filename);
|
QFile configFile(filename);
|
||||||
|
|
||||||
|
|
|
@ -21,26 +21,19 @@ class HifiConfigVariantMap {
|
||||||
public:
|
public:
|
||||||
static QVariantMap mergeCLParametersWithJSONConfig(const QStringList& argumentList);
|
static QVariantMap mergeCLParametersWithJSONConfig(const QStringList& argumentList);
|
||||||
|
|
||||||
HifiConfigVariantMap();
|
|
||||||
void loadMasterAndUserConfig(const QStringList& argumentList);
|
|
||||||
void loadConfig(const QStringList& argumentList);
|
void loadConfig(const QStringList& argumentList);
|
||||||
|
|
||||||
const QVariant value(const QString& key) const { return _userConfig.value(key); }
|
const QVariant value(const QString& key) const { return _userConfig.value(key); }
|
||||||
QVariant* valueForKeyPath(const QString& keyPath, bool shouldCreateIfMissing = false)
|
QVariant* valueForKeyPath(const QString& keyPath, bool shouldCreateIfMissing = false)
|
||||||
{ return ::valueForKeyPath(_userConfig, keyPath, shouldCreateIfMissing); }
|
{ return ::valueForKeyPath(_userConfig, keyPath, shouldCreateIfMissing); }
|
||||||
|
|
||||||
QVariantMap& getMergedConfig() { return _mergedConfig; }
|
|
||||||
QVariantMap& getConfig() { return _userConfig; }
|
QVariantMap& getConfig() { return _userConfig; }
|
||||||
|
|
||||||
void mergeMasterAndUserConfigs();
|
|
||||||
|
|
||||||
const QString& getUserConfigFilename() const { return _userConfigFilename; }
|
const QString& getUserConfigFilename() const { return _userConfigFilename; }
|
||||||
private:
|
private:
|
||||||
QString _userConfigFilename;
|
QString _userConfigFilename;
|
||||||
|
|
||||||
QVariantMap _masterConfig;
|
|
||||||
QVariantMap _userConfig;
|
QVariantMap _userConfig;
|
||||||
QVariantMap _mergedConfig;
|
|
||||||
|
|
||||||
void loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename);
|
void loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename);
|
||||||
void addMissingValuesToExistingMap(QVariantMap& existingMap, const QVariantMap& newMap);
|
void addMissingValuesToExistingMap(QVariantMap& existingMap, const QVariantMap& newMap);
|
||||||
|
|
|
@ -23,9 +23,15 @@
|
||||||
|
|
||||||
#include "SharedLogging.h"
|
#include "SharedLogging.h"
|
||||||
|
|
||||||
|
const QSettings::Format JSON_FORMAT = QSettings::registerFormat("json", readJSONFile, writeJSONFile);
|
||||||
|
|
||||||
QSettings::SettingsMap jsonDocumentToVariantMap(const QJsonDocument& document);
|
QSettings::SettingsMap jsonDocumentToVariantMap(const QJsonDocument& document);
|
||||||
QJsonDocument variantMapToJsonDocument(const QSettings::SettingsMap& map);
|
QJsonDocument variantMapToJsonDocument(const QSettings::SettingsMap& map);
|
||||||
|
|
||||||
|
QString settingsFilename() {
|
||||||
|
return QSettings().fileName();
|
||||||
|
}
|
||||||
|
|
||||||
bool readJSONFile(QIODevice& device, QSettings::SettingsMap& map) {
|
bool readJSONFile(QIODevice& device, QSettings::SettingsMap& map) {
|
||||||
QJsonParseError jsonParseError;
|
QJsonParseError jsonParseError;
|
||||||
|
|
||||||
|
|
|
@ -14,12 +14,13 @@
|
||||||
|
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
|
||||||
|
extern const QSettings::Format JSON_FORMAT;
|
||||||
|
|
||||||
|
QString settingsFilename();
|
||||||
|
|
||||||
bool readJSONFile(QIODevice& device, QSettings::SettingsMap& map);
|
bool readJSONFile(QIODevice& device, QSettings::SettingsMap& map);
|
||||||
bool writeJSONFile(QIODevice& device, const QSettings::SettingsMap& map);
|
bool writeJSONFile(QIODevice& device, const QSettings::SettingsMap& map);
|
||||||
|
|
||||||
static const auto JSON_FORMAT = QSettings::registerFormat("json", readJSONFile, writeJSONFile);
|
|
||||||
|
|
||||||
void loadOldINIFile(QSettings& settings);
|
void loadOldINIFile(QSettings& settings);
|
||||||
|
|
||||||
|
|
||||||
#endif // hifi_SettingHelpers_h
|
#endif // hifi_SettingHelpers_h
|
||||||
|
|
Loading…
Reference in a new issue