Merge pull request #6 from kasenvr/master

Upgrading
This commit is contained in:
Alezia Kurdis 2020-09-24 23:01:15 -04:00 committed by GitHub
commit 7612b71455
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
93 changed files with 148680 additions and 1430 deletions

View file

@ -154,18 +154,18 @@ public class EndpointUsersProvider implements UsersProvider {
}
public interface EndpointUsersProviderService {
@GET("api/v1/users")
@GET("/api/v1/users")
Call<UsersResponse> getUsers(@Query("filter") String filter,
@Query("per_page") int perPage,
@Query("online") Boolean online);
@DELETE("api/v1/user/connections/{connectionUserName}")
@DELETE("/api/v1/user/connections/{connectionUserName}")
Call<UsersResponse> removeConnection(@Path("connectionUserName") String connectionUserName);
@DELETE("api/v1/user/friends/{friendUserName}")
@DELETE("/api/v1/user/friends/{friendUserName}")
Call<UsersResponse> removeFriend(@Path("friendUserName") String friendUserName);
@POST("api/v1/user/friends")
@POST("/api/v1/user/friends")
Call<UsersResponse> addFriend(@Body BodyAddFriend friendUserName);
/* response

View file

@ -169,7 +169,7 @@ public class UserStoryDomainProvider implements DomainProvider {
}
public interface UserStoryDomainProviderService {
@GET("api/v1/user_stories")
@GET("/api/v1/user_stories")
Call<UserStories> getUserStories(@Query("include_actions") String includeActions,
@Query("restriction") String restriction,
@Query("require_online") boolean requireOnline,

View file

@ -14,7 +14,10 @@
#include <queue>
#if !defined(Q_MOC_RUN)
// Work around https://bugreports.qt.io/browse/QTBUG-80990
#include <tbb/concurrent_vector.h>
#endif
#include <QtCore/QJsonObject>

View file

@ -12,7 +12,10 @@
#ifndef hifi_AudioMixerSlave_h
#define hifi_AudioMixerSlave_h
#if !defined(Q_MOC_RUN)
// Work around https://bugreports.qt.io/browse/QTBUG-80990
#include <tbb/concurrent_vector.h>
#endif
#include <AABox.h>
#include <AudioHRTF.h>

View file

@ -8,20 +8,20 @@
{
"name": "access_token",
"label": "Access Token",
"help": "This is your OAuth access token to connect this domain-server with your High Fidelity account. <br/>It can be generated by clicking the 'Connect Account' button above.<br/>You can also go to the <a href='https://metaverse.highfidelity.com/user/security' target='_blank'>My Security</a> page of your account and generate a token with the 'domains' scope and paste it here.",
"help": "This is your OAuth access token to connect this domain-server with your Metaverse account. <br/>It can be generated by clicking the 'Connect Account' button above.<br/>You can also go to the Security page of your account on your Metaverse Server and generate a token with the 'domains' scope and paste it here.",
"advanced": true,
"backup": false
},
{
"name": "id",
"label": "Domain ID",
"help": "This is your High Fidelity domain ID. If you do not want your domain to be registered in the High Fidelity metaverse you can leave this blank.",
"help": "This is your Metaverse domain ID. If you do not want your domain to be registered in the Metaverse you can leave this blank.",
"advanced": true
},
{
"name": "automatic_networking",
"label": "Automatic Networking",
"help": "This defines how other nodes in the High Fidelity metaverse will be able to reach your domain-server.<br/>If you don't want to deal with any network settings, use full automatic networking.",
"help": "This defines how other nodes in the Metaverse will be able to reach your domain-server.<br/>If you don't want to deal with any network settings, use full automatic networking.",
"default": "disabled",
"type": "select",
"options": [
@ -35,7 +35,7 @@
},
{
"value": "disabled",
"label": "None: use the network information I have entered for this domain at metaverse.highfidelity.com"
"label": "None: use the network information I have entered for this domain at in the Metaverse Server."
}
]
},
@ -50,7 +50,7 @@
{
"name": "enable_packet_verification",
"label": "Enable Packet Verification",
"help": "Enable secure checksums on communication that uses the High Fidelity protocol. Increases security with possibly a small performance penalty.",
"help": "Enable secure checksums on communication that uses the Metaverse protocol. Increases security with possibly a small performance penalty.",
"default": true,
"type": "checkbox",
"advanced": true
@ -160,7 +160,7 @@
"name": "descriptors",
"label": "Description",
"restart": false,
"help": "This data will be queryable from your server. It may be collected by High Fidelity and used to share your domain with others.",
"help": "This data will be queryable from your server. It may be collected by the Metaverse and used to share your domain with others.",
"settings": [
{
"name": "world_name",

View file

@ -51,9 +51,9 @@ $.extend(Settings, {
var URLs = {
// STABLE METAVERSE_URL: https://metaverse.highfidelity.com
// STAGING METAVERSE_URL: https://staging.highfidelity.com
METAVERSE_URL: 'https://metaverse.highfidelity.com',
CDN_URL: 'https://cdn.highfidelity.com',
PLACE_URL: 'https://hifi.place',
DEFAULT_METAVERSE_URL: "https://metaverse.vircadia.com/live",
CDN_URL: 'https://content.vircadia.com/eu-c-1',
PLACE_URL: 'https://xr.place'
};
var Strings = {
@ -61,7 +61,7 @@ var Strings = {
CHOOSE_DOMAIN_BUTTON: "Choose from my domains",
CREATE_DOMAIN_BUTTON: "Create new domain ID",
CREATE_DOMAIN_SUCCESS_JUST_CONNECTED: "We connnected your High Fidelity account and created a new domain ID for this machine.",
CREATE_DOMAIN_SUCCESS_JUST_CONNECTED: "We connnected your Metaverse account and created a new domain ID for this machine.",
CREATE_DOMAIN_SUCCESS: "We created a new domain ID for this machine.",
// When a place modification fails, they will be brought back to the previous
@ -92,7 +92,7 @@ var Strings = {
ADD_PLACE_LOADING_DIALOG: "Loading your places...",
ADD_PLACE_NOT_CONNECTED_TITLE: "Access token required",
ADD_PLACE_NOT_CONNECTED_MESSAGE: "You must have an access token to query your High Fidelity places.<br><br>Please follow the instructions on the settings page to add an access token.",
ADD_PLACE_NOT_CONNECTED_MESSAGE: "You must have an access token to query your Metaverse places.<br><br>Please follow the instructions on the settings page to add an access token.",
};
var DOMAIN_ID_TYPE_NONE = 0;
@ -230,213 +230,212 @@ function getDomainFromAPI(callback) {
function chooseFromHighFidelityPlaces(accessToken, forcePathTo, onSuccessfullyAdded) {
if (accessToken) {
getMetaverseUrl(function(metaverse_url) {
var loadingDialog = showLoadingDialog(Strings.ADD_PLACE_LOADING_DIALOG);
var loadingDialog = showLoadingDialog(Strings.ADD_PLACE_LOADING_DIALOG);
function loadPlaces() {
$.ajax("/api/places", {
dataType: 'json',
jsonp: false,
success: function(data) {
if (data.status == 'success') {
var modal_buttons = {
cancel: {
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 or Viewpoint</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();
function loadPlaces() {
$.ajax("/api/places", {
dataType: 'json',
jsonp: false,
success: function(data) {
if (data.status == 'success') {
var modal_buttons = {
cancel: {
label: Strings.ADD_PLACE_CANCEL_BUTTON,
className: 'add-place-cancel-button btn-default'
}
});
place_select.trigger('change');
};
modal_buttons["success"] = {
label: Strings.ADD_PLACE_CONFIRM_BUTTON,
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();
var dialog;
var modal_body;
if (data.data.places.length) {
var places_by_id = {};
if (forcePathTo === undefined || forcePathTo === null) {
var placePath = $('#place-path-input').val();
modal_body = $('<div>');
modal_body.append($("<p>Choose a place name that you own or <a href='" + 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 or Viewpoint</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 {
var placePath = forcePathTo;
warning.show();
}
});
place_select.trigger('change');
$('.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');
modal_buttons["success"] = {
label: Strings.ADD_PLACE_CONFIRM_BUTTON,
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) {
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();
if (forcePathTo === undefined || forcePathTo === null) {
var placePath = $('#place-path-input').val();
} 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);
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);
});
}
}
maybeCreateNewDomainID();
return false;
}
maybeCreateNewDomainID();
return false;
}
} else {
modal_buttons["success"] = {
label: Strings.ADD_PLACE_NO_PLACES_BUTTON,
callback: function() {
window.open(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,
onEscape: true
});
} 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;
bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR);
}
dialog = bootbox.dialog({
title: Strings.ADD_PLACE_TITLE,
message: modal_body,
closeButton: false,
buttons: modal_buttons,
onEscape: true
});
} else {
},
error: function() {
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);
},
complete: function() {
loadingDialog.modal('hide');
}
});
}
var domainType = getCurrentDomainIDType();
if (domainType !== DOMAIN_ID_TYPE_UNKNOWN) {
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);
}
});
}
})
}
});
}
var domainType = getCurrentDomainIDType();
if (domainType !== DOMAIN_ID_TYPE_UNKNOWN) {
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 {
bootbox.alert({
title: Strings.ADD_PLACE_NOT_CONNECTED_TITLE,
@ -507,8 +506,7 @@ function getMetaverseUrl(callback) {
callback(data.metaverse_url);
},
error: function() {
callback(URLs.METAVERSE_URL);
callback(URLs.DEFAULT_METAVERSE_URL);
}
});
}

View file

@ -16,7 +16,7 @@ $(document).ready(function(){
Settings.extraGroupsAtEnd = Settings.extraDomainGroupsAtEnd;
Settings.extraGroupsAtIndex = Settings.extraDomainGroupsAtIndex;
var METAVERSE_URL = URLs.METAVERSE_URL;
var METAVERSE_URL = URLs.DEFAULT_METAVERSE_URL;
var SSL_PRIVATE_KEY_FILE_ID = 'ssl-private-key-file';
var SSL_PRIVATE_KEY_CONTENTS_ID = 'key-contents';
@ -277,7 +277,7 @@ $(document).ready(function(){
swal({
title: '',
type: 'error',
text: "There was a problem retrieving domain information from High Fidelity API.",
text: "There was a problem retrieving domain information from the Metaverse API.",
confirmButtonText: 'Try again',
showCancelButton: true,
closeOnConfirm: false
@ -306,7 +306,7 @@ $(document).ready(function(){
if (hasAccessToken) {
el = "<p>";
el += "<span class='account-connected-header'>High Fidelity Account Connected</span>";
el += "<span class='account-connected-header'>Metaverse Account Connected</span>";
el += "<button id='" + Settings.DISCONNECT_ACCOUNT_BTN_ID + "' class='btn'>Disconnect</button>";
el += "</p>";
el = $(el);
@ -319,7 +319,7 @@ $(document).ready(function(){
}
buttonSetting.help = "";
buttonSetting.classes = "btn-primary";
buttonSetting.button_label = "Connect High Fidelity Account";
buttonSetting.button_label = "Connect Metaverse Account";
buttonSetting.html_id = Settings.CONNECT_ACCOUNT_BTN_ID;
buttonSetting.href = METAVERSE_URL + "/user/tokens/new?for_domain_server=true";
@ -713,7 +713,7 @@ $(document).ready(function(){
html_id: Settings.PLACES_TABLE_ID,
help: "The following places currently point to this domain.</br>To point places to this domain, "
+ " go to the <a href='" + METAVERSE_URL + "/user/places'>My Places</a> "
+ "page in your High Fidelity Metaverse account.",
+ "page in your Metaverse account.",
read_only: true,
can_add_new_rows: false,
columns: [
@ -997,7 +997,7 @@ $(document).ready(function(){
if (data.data.domains.length) {
// setup a select box for the returned domains
modal_body = "<p>Choose the High Fidelity domain you want this domain-server to represent.<br/>This will set your domain ID on the settings page.</p>";
modal_body = "<p>Choose the Metaverse domain you want this domain-server to represent.<br/>This will set your domain ID on the settings page.</p>";
domain_select = $("<select id='domain-name-select' class='form-control'></select>");
_.each(data.data.domains, function(domain){
var domainString = "";
@ -1026,7 +1026,7 @@ $(document).ready(function(){
window.open(METAVERSE_URL + "/user/domains", '_blank');
}
}
modal_body = "<p>You do not have any domains in your High Fidelity account." +
modal_body = "<p>You do not have any domains in your Metaverse account." +
"<br/><br/>Go to your domains page to create a new one. Once your domain is created re-open this dialog to select it.</p>"
}
@ -1038,7 +1038,7 @@ $(document).ready(function(){
})
},
error: function() {
bootbox.alert("Failed to retrieve your domains from the High Fidelity Metaverse");
bootbox.alert("Failed to retrieve your domains from the Metaverse");
},
complete: function() {
// remove the spinner from the choose button
@ -1049,7 +1049,7 @@ $(document).ready(function(){
} else {
bootbox.alert({
message: "You must have an access token to query your High Fidelity domains.<br><br>" +
message: "You must have an access token to query your Metaverse domains.<br><br>" +
"Please follow the instructions on the settings page to add an access token.",
title: "Access token required"
})

View file

@ -3,12 +3,12 @@
<h4 class="step-title"></h4>
<dl class="row">
<dd class="col-md-12">
<span class='step-description'>By connecting your High Fidelity Account you will be granting access to your account information.</span>
<span class='step-description'>By connecting your Metaverse Account you will be granting access to your account information.</span>
</dd>
</dl>
<dl class="row">
<dd class="col-md-12">
<a id="connect-account-btn" role="button" class="btn btn-primary btn-md btn-block" target="_blank">Connect your High Fidelity account</a>
<a id="connect-account-btn" role="button" class="btn btn-primary btn-md btn-block" target="_blank">Connect your Metaverse account</a>
</dd>
</dl>
@ -25,7 +25,7 @@
<div class="col-md-12">
<span class='step-description'>
<a target='_blank' href='https://docs.vircadia.dev/create-and-explore/start-working-in-your-sandbox/place-names'>Place names</a> are similar to web addresses. Users who want to visit your domain can
enter its Place Name in High Fidelity's Interface. You can choose a Place Name for your domain.</br>
enter its Place Name in Vircadia's Interface. You can choose a Place Name for your domain.</br>
Your domain may also be reachable by <b>IP address</b>.
</span>
</div>
@ -56,11 +56,11 @@
<div class="wizard-step col-md-9 col-centered" style="display: none;">
<h4 class="step-title"></h4>
<div class="row">
<p id="permissions-description" class="col-md-12 step-info"><b>Localhost</b> has been granted administrator privileges to this domain. (Localhost is any</br>user on the same machine as the High Fidelity Server)</p>
<p id="permissions-description" class="col-md-12 step-info"><b>Localhost</b> has been granted administrator privileges to this domain. (Localhost is any</br>user on the same machine as the Vircadia Server)</p>
</div>
<div id="admin-row" class="row">
<p class="col-md-6">
<span class="step-info"><span id="admin-description"><b>Add your High Fidelity username</b> and any other usernames</span> to grant <span class='wizard-link' data-toggle="tooltip" title="Users who will have all the permissions for this domain.">administrator privileges</span></span>
<span class="step-info"><span id="admin-description"><b>Add your Metaverse username</b> and any other usernames</span> to grant <span class='wizard-link' data-toggle="tooltip" title="Users who will have all the permissions for this domain.">administrator privileges</span></span>
</p>
<div class="col-md-6">
<input id="admin-usernames" type="text" class="form-control">
@ -95,7 +95,7 @@
</p>
<p class="col-md-5">
<label>
<input id="connect-logged-in" name="connect-radio" type="radio" value="logged-in"> Users logged into High Fidelity
<input id="connect-logged-in" name="connect-radio" type="radio" value="logged-in"> Users logged into the Metaverse
</label>
</p>
<p class="col-md-2">
@ -126,7 +126,7 @@
</p>
<p class="col-md-5">
<label>
<input id="rez-logged-in" name="rez-radio" type="radio" value="logged-in" disabled> Users logged into High Fidelity
<input id="rez-logged-in" name="rez-radio" type="radio" value="logged-in" disabled> Users logged into the Metaverse
</label>
</p>
<p class="col-md-2">
@ -164,14 +164,14 @@
<dt class="col-md-4 step-info">Username</dt>
<dd class="col-md-8">
<input id="http_username" type="text" class="form-control">
<span class='help-block'>This does not have to be your High Fidelity username</span>
<span class='help-block'>This does not have to be your Metaverse username</span>
</dd>
</dl>
<dl class="row">
<dt class="col-md-4 step-info">Enter password</dt>
<dd class="col-md-8">
<input id="http_password" type="password" class="form-control">
<span class='help-block'>This should not be the same as your High Fidelity password</span>
<span class='help-block'>This should not be the same as your Metaverse password</span>
</dd>
</dl>
<dl id="verify-password-row" class="row">
@ -262,4 +262,5 @@
<script src='/js/bootbox.min.js'></script>
<script src='/js/sha256.js'></script>
<script src='js/wizard.js'></script>
<script src='../js/shared.js'></script>
<!--#include virtual="page-end.html"-->

View file

@ -2,121 +2,127 @@ var Metaverse = {
accessToken: null
}
var CURRENT_METAVERSE_URL;
var currentStepNumber;
$(document).ready(function(){
Strings.ADD_PLACE_NOT_CONNECTED_MESSAGE = "You must have an access token to query your High Fidelity places.<br><br>" +
"Please go back and connect your account.";
getMetaverseUrl(function(metaverse_url) {
CURRENT_METAVERSE_URL = metaverse_url;
$('#connect-account-btn').attr('href', URLs.METAVERSE_URL + "/user/tokens/new?for_domain_server=true");
Strings.ADD_PLACE_NOT_CONNECTED_MESSAGE = "You must have an access token to query your Metaverse places.<br><br>" +
"Please go back and connect your account.";
$('[data-toggle="tooltip"]').tooltip();
$('#connect-account-btn').attr('href', CURRENT_METAVERSE_URL + "/user/tokens/new?for_domain_server=true");
$('.perms-link').on('click', function() {
var modal_body = '<div>';
modal_body += '<b>None</b> - No one will have permissions. Only you and the users your have given administrator privileges to will have permissions.</br></br>';
modal_body += '<b>Friends</b> - Users who are your Friends in High Fidelity.</br></br>';
modal_body += '<b>Users logged into High Fidelity</b> - Users who are currently logged into High Fidelity.</br></br>';
modal_body += '<b>Everyone</b> - Anyone who uses High Fidelity.';
modal_body += '</div>';
$('[data-toggle="tooltip"]').tooltip();
dialog = bootbox.dialog({
title: "User definition",
message: modal_body,
closeButton: true
});
return false;
});
$('.perms-link').on('click', function() {
var modal_body = '<div>';
modal_body += '<b>None</b> - No one will have permissions. Only you and the users your have given administrator privileges to will have permissions.</br></br>';
modal_body += '<b>Friends</b> - Users who are your Friends in the Metaverse.</br></br>';
modal_body += '<b>Users logged into the Metaverse</b> - Users who are currently logged into the Metaverse.</br></br>';
modal_body += '<b>Everyone</b> - Anyone who uses the Metaverse.';
modal_body += '</div>';
$('body').on('click', '.next-button', function() {
goToNextStep();
});
$('body').on('click', '.back-button', function() {
goToPreviousStep();
});
$('body').on('click', '#skip-wizard-button', function() {
skipWizard();
})
$('body').on('click', '#connect-account-btn', function() {
$(this).blur();
prepareAccessTokenPrompt(function(accessToken) {
Metaverse.accessToken = accessToken;
saveAccessToken();
});
});
$('body').on('click', '#save-permissions', function() {
savePermissions();
});
function triggerSaveUsernamePassword(event) {
if (event.keyCode === 13) {
$("#save-username-password").click();
}
}
$("#http_username").keyup(triggerSaveUsernamePassword);
$("#http_password").keyup(triggerSaveUsernamePassword);
$("#verify_http_password").keyup(triggerSaveUsernamePassword);
$('body').on('click', '#save-username-password', function() {
saveUsernamePassword();
});
$('body').on('click', '#change-place-name', function() {
chooseFromHighFidelityPlaces(Settings.data.values.metaverse.access_token, "/0,-10,0", function(placeName) {
updatePlaceNameLink(placeName);
});
});
$('body').on('click', '#visit-domain', function() {
$('#share-link')[0].click();
});
$('input[type=radio][name=connect-radio]').change(function() {
var inputs = $('input[type=radio][name=rez-radio]');
var disabled = [];
switch (this.value) {
case 'none':
disabled = inputs.splice(1);
break;
case 'friends':
disabled = inputs.splice(2);
break;
case 'logged-in':
disabled = inputs.splice(3);
break;
case 'everyone':
disabled = inputs.splice(4);
break;
}
$.each(inputs, function() {
$(this).prop('disabled', false);
});
$.each(disabled, function() {
if ($(this).prop('checked')) {
$(inputs.last()).prop('checked', true);
}
$(this).prop('disabled', true);
});
});
reloadSettings(function(success) {
if (success) {
getDomainFromAPI();
setupWizardSteps();
updatePlaceNameDisplay();
updateUsernameDisplay();
} else {
swal({
title: '',
type: 'error',
text: "There was a problem loading the domain settings.\nPlease refresh the page to try again.",
dialog = bootbox.dialog({
title: "User definition",
message: modal_body,
closeButton: true
});
return false;
});
$('body').on('click', '.next-button', function() {
goToNextStep();
});
$('body').on('click', '.back-button', function() {
goToPreviousStep();
});
$('body').on('click', '#skip-wizard-button', function() {
skipWizard();
})
$('body').on('click', '#connect-account-btn', function() {
$(this).blur();
prepareAccessTokenPrompt(function(accessToken) {
Metaverse.accessToken = accessToken;
saveAccessToken();
});
});
$('body').on('click', '#save-permissions', function() {
savePermissions();
});
function triggerSaveUsernamePassword(event) {
if (event.keyCode === 13) {
$("#save-username-password").click();
}
}
$("#http_username").keyup(triggerSaveUsernamePassword);
$("#http_password").keyup(triggerSaveUsernamePassword);
$("#verify_http_password").keyup(triggerSaveUsernamePassword);
$('body').on('click', '#save-username-password', function() {
saveUsernamePassword();
});
$('body').on('click', '#change-place-name', function() {
chooseFromHighFidelityPlaces(Settings.data.values.metaverse.access_token, "/0,-10,0", function(placeName) {
updatePlaceNameLink(placeName);
});
});
$('body').on('click', '#visit-domain', function() {
$('#share-link')[0].click();
});
$('input[type=radio][name=connect-radio]').change(function() {
var inputs = $('input[type=radio][name=rez-radio]');
var disabled = [];
switch (this.value) {
case 'none':
disabled = inputs.splice(1);
break;
case 'friends':
disabled = inputs.splice(2);
break;
case 'logged-in':
disabled = inputs.splice(3);
break;
case 'everyone':
disabled = inputs.splice(4);
break;
}
$.each(inputs, function() {
$(this).prop('disabled', false);
});
$.each(disabled, function() {
if ($(this).prop('checked')) {
$(inputs.last()).prop('checked', true);
}
$(this).prop('disabled', true);
});
});
reloadSettings(function(success) {
if (success) {
getDomainFromAPI();
setupWizardSteps();
updatePlaceNameDisplay();
updateUsernameDisplay();
} else {
swal({
title: '',
type: 'error',
text: "There was a problem loading the domain settings.\nPlease refresh the page to try again.",
});
}
});
});
});
@ -142,7 +148,7 @@ function setupWizardSteps() {
});
$('#permissions-description').html('You <span id="username-display"></span>have been assigned administrator privileges to this domain.');
$('#admin-description').html('Add more High Fidelity usernames');
$('#admin-description').html('Add more Metaverse usernames');
} else {
$('.cloud-only').remove();
$('#save-permissions').text("Finish");
@ -171,7 +177,7 @@ function updatePlaceNameLink(address) {
function updatePlaceNameDisplay() {
if (Settings.data.values.metaverse.id) {
$.getJSON(URLs.METAVERSE_URL + '/api/v1/domains/' + Settings.data.values.metaverse.id, function(data) {
$.getJSON(CURRENT_METAVERSE_URL + '/api/v1/domains/' + Settings.data.values.metaverse.id, function(data) {
if (data.status === 'success') {
if (data.domain.default_place_name) {

View file

@ -821,7 +821,7 @@ void DomainGatekeeper::requestUserPublicKey(const QString& username, bool isOpti
callbackParams.errorCallbackMethod = "publicKeyJSONErrorCallback";
const QString USER_PUBLIC_KEY_PATH = "api/v1/users/%1/public_key";
const QString USER_PUBLIC_KEY_PATH = "/api/v1/users/%1/public_key";
qDebug().nospace() << "Requesting " << (isOptimistic ? "optimistic " : " ") << "public key for user " << username;
@ -1048,7 +1048,7 @@ void DomainGatekeeper::getGroupMemberships(const QString& username) {
callbackParams.jsonCallbackMethod = "getIsGroupMemberJSONCallback";
callbackParams.errorCallbackMethod = "getIsGroupMemberErrorCallback";
const QString GET_IS_GROUP_MEMBER_PATH = "api/v1/groups/members/%2";
const QString GET_IS_GROUP_MEMBER_PATH = "/api/v1/groups/members/%2";
DependencyManager::get<AccountManager>()->sendRequest(GET_IS_GROUP_MEMBER_PATH.arg(username),
AccountManagerAuth::Required,
QNetworkAccessManager::PostOperation, callbackParams,
@ -1114,7 +1114,7 @@ void DomainGatekeeper::getDomainOwnerFriendsList() {
callbackParams.jsonCallbackMethod = "getDomainOwnerFriendsListJSONCallback";
callbackParams.errorCallbackMethod = "getDomainOwnerFriendsListErrorCallback";
const QString GET_FRIENDS_LIST_PATH = "api/v1/user/friends";
const QString GET_FRIENDS_LIST_PATH = "/api/v1/user/friends";
if (DependencyManager::get<AccountManager>()->hasValidAccessToken()) {
DependencyManager::get<AccountManager>()->sendRequest(GET_FRIENDS_LIST_PATH, AccountManagerAuth::Required,
QNetworkAccessManager::GetOperation, callbackParams, QByteArray(),
@ -1196,7 +1196,7 @@ Node::LocalID DomainGatekeeper::findOrCreateLocalID(const QUuid& uuid) {
return existingLocalIDIt->second;
}
assert(_localIDs.size() < std::numeric_limits<LocalIDs::value_type>::max() - 2);
assert(_localIDs.size() < (size_t)(std::numeric_limits<LocalIDs::value_type>::max() - 2));
Node::LocalID newLocalID;
do {

View file

@ -4,6 +4,7 @@
//
// Created by Stephen Birarda on 9/26/13.
// Copyright 2013 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -118,7 +119,7 @@ bool DomainServer::forwardMetaverseAPIRequest(HTTPConnection* connection,
root.insert(requestSubobjectKey, subobject);
QJsonDocument doc { root };
QUrl url{ MetaverseAPI::getCurrentMetaverseServerURL().toString() + metaversePath };
QUrl url { MetaverseAPI::getCurrentMetaverseServerURL().toString() + metaversePath };
QNetworkRequest req(url);
req.setHeader(QNetworkRequest::UserAgentHeader, NetworkingConstants::VIRCADIA_USER_AGENT);
@ -1156,7 +1157,7 @@ QUrl DomainServer::oauthAuthorizationURL(const QUuid& stateUUID) {
QUrl authorizationURL = _oauthProviderURL;
const QString OAUTH_AUTHORIZATION_PATH = "/oauth/authorize";
authorizationURL.setPath(OAUTH_AUTHORIZATION_PATH);
authorizationURL.setPath(MetaverseAPI::getCurrentMetaverseServerURLPath() + OAUTH_AUTHORIZATION_PATH);
QUrlQuery authorizationQuery;
@ -1434,7 +1435,7 @@ void DomainServer::sendPendingTransactionsToServer() {
transactionCallbackParams.jsonCallbackMethod = "transactionJSONCallback";
while (i != _pendingAssignmentCredits.end()) {
accountManager->sendRequest("api/v1/transactions",
accountManager->sendRequest("/api/v1/transactions",
AccountManagerAuth::Required,
QNetworkAccessManager::PostOperation,
transactionCallbackParams, i.value()->postJson().toJson());
@ -1620,7 +1621,7 @@ void DomainServer::sendICEServerAddressToMetaverseAPI() {
callbackParameters.errorCallbackMethod = "handleFailedICEServerAddressUpdate";
callbackParameters.jsonCallbackMethod = "handleSuccessfulICEServerAddressUpdate";
qCDebug(domain_server_ice) << "Updating ice-server address in High Fidelity Metaverse API to"
qCDebug(domain_server_ice) << "Updating ice-server address in Metaverse API to"
<< (_iceServerSocket.isNull() ? "" : _iceServerSocket.getAddress().toString());
static const QString DOMAIN_ICE_ADDRESS_UPDATE = "/api/v1/domains/%1/ice_server_address";
@ -1979,6 +1980,7 @@ const QString URI_OAUTH = "/oauth";
bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) {
const QString JSON_MIME_TYPE = "application/json";
const QString URI_ID = "/id";
const QString URI_ASSIGNMENT = "/assignment";
const QString URI_NODES = "/nodes";
const QString URI_SETTINGS = "/settings";
@ -2055,7 +2057,6 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
}
// check if this is a request for our domain ID
const QString URI_ID = "/id";
if (connection->requestOperation() == QNetworkAccessManager::GetOperation
&& url.path() == URI_ID) {
QUuid domainID = nodeList->getSessionUUID();
@ -2562,7 +2563,7 @@ bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &u
const QString OAUTH_TOKEN_REQUEST_PATH = "/oauth/token";
QUrl tokenRequestUrl = _oauthProviderURL;
tokenRequestUrl.setPath(OAUTH_TOKEN_REQUEST_PATH);
tokenRequestUrl.setPath(MetaverseAPI::getCurrentMetaverseServerURLPath() + OAUTH_TOKEN_REQUEST_PATH);
const QString OAUTH_GRANT_TYPE_POST_STRING = "grant_type=authorization_code";
QString tokenPostBody = OAUTH_GRANT_TYPE_POST_STRING;
@ -2876,7 +2877,7 @@ QNetworkReply* DomainServer::profileRequestGivenTokenReply(QNetworkReply* tokenR
// fire off a request to get this user's identity so we can see if we will let them in
QUrl profileURL = _oauthProviderURL;
profileURL.setPath("/api/v1/user/profile");
profileURL.setPath(MetaverseAPI::getCurrentMetaverseServerURLPath() + "/api/v1/user/profile");
profileURL.setQuery(QString("%1=%2").arg(OAUTH_JSON_ACCESS_TOKEN_KEY, accessToken));
qDebug() << "Sending profile request to: " << profileURL;
@ -3725,7 +3726,7 @@ void DomainServer::screensharePresence(QString roomname, QUuid avatarID, int exp
callbackData.insert("roomname", roomname);
callbackData.insert("avatarID", avatarID.toString());
callbackParams.callbackData = callbackData;
const QString PATH = "api/v1/domains/%1/screenshare";
const QString PATH = "/api/v1/domains/%1/screenshare";
QString domain_id = uuidStringWithoutCurlyBraces(getID());
QJsonObject json, screenshare;
screenshare["username"] = verifiedUsername;

View file

@ -4,6 +4,7 @@
//
// Created by Stephen Birarda on 2014-06-24.
// Copyright 2014 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -1998,7 +1999,7 @@ void DomainServerSettingsManager::apiGetGroupID(const QString& groupName) {
callbackParams.jsonCallbackMethod = "apiGetGroupIDJSONCallback";
callbackParams.errorCallbackMethod = "apiGetGroupIDErrorCallback";
const QString GET_GROUP_ID_PATH = "api/v1/groups/names/%1";
const QString GET_GROUP_ID_PATH = "/api/v1/groups/names/%1";
DependencyManager::get<AccountManager>()->sendRequest(GET_GROUP_ID_PATH.arg(groupName),
AccountManagerAuth::Required,
QNetworkAccessManager::GetOperation, callbackParams);
@ -2064,7 +2065,7 @@ void DomainServerSettingsManager::apiGetGroupRanks(const QUuid& groupID) {
callbackParams.jsonCallbackMethod = "apiGetGroupRanksJSONCallback";
callbackParams.errorCallbackMethod = "apiGetGroupRanksErrorCallback";
const QString GET_GROUP_RANKS_PATH = "api/v1/groups/%1/ranks";
const QString GET_GROUP_RANKS_PATH = "/api/v1/groups/%1/ranks";
DependencyManager::get<AccountManager>()->sendRequest(GET_GROUP_RANKS_PATH.arg(groupID.toString().mid(1,36)),
AccountManagerAuth::Required,
QNetworkAccessManager::GetOperation, callbackParams);

View file

@ -4,6 +4,7 @@
//
// Created by Stephen Birarda on 2014-06-24.
// Copyright 2014 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -108,7 +109,7 @@ public:
QStringList getDomainServerGroupNames();
QStringList getDomainServerBlacklistGroupNames();
// these are used to locally cache the result of calling "api/v1/groups/.../is_member/..." on metaverse's api
// these are used to locally cache the result of calling "/api/v1/groups/.../is_member/..." on metaverse's api
void clearGroupMemberships(const QString& name) { _groupMembership[name.toLower()].clear(); }
void recordGroupMembership(const QString& name, const QUuid groupID, QUuid rankID);
QUuid isGroupMember(const QString& name, const QUuid& groupID); // returns rank or -1 if not a member

View file

@ -211,8 +211,15 @@ void IceServer::requestDomainPublicKey(const QUuid& domainID) {
auto& networkAccessManager = NetworkAccessManager::getInstance();
QUrl publicKeyURL{ MetaverseAPI::getCurrentMetaverseServerURL() };
// qDebug() << "publicKeyURL" << publicKeyURL;
// qDebug() << "MetaverseAPI::getCurrentMetaverseServerURLPath()" << MetaverseAPI::getCurrentMetaverseServerURLPath();
QString publicKeyPath = QString("/api/v1/domains/%1/public_key").arg(uuidStringWithoutCurlyBraces(domainID));
publicKeyURL.setPath(publicKeyPath);
publicKeyURL.setPath("/" + MetaverseAPI::getCurrentMetaverseServerURLPath() + publicKeyPath);
// qDebug() << "publicKeyPath" << publicKeyPath;
// qDebug() << "publicKeyURL.setPath" << "/" + MetaverseAPI::getCurrentMetaverseServerURLPath() + publicKeyPath;
// qDebug() << "publicKeyURL" << publicKeyURL;
// qDebug() << "publicKeyURL.isValid()" << publicKeyURL.isValid();
// qDebug() << "publicKeyURL.errorString()" << publicKeyURL.errorString();
QNetworkRequest publicKeyRequest { publicKeyURL };
publicKeyRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);

View file

@ -148,7 +148,7 @@ Windows.ScrollingWindow {
}
function canAddToWorld(path) {
var supportedExtensions = [/\.fbx\b/i, /\.obj\b/i, /\.jpg\b/i, /\.png\b/i, /\.gltf\b/i];
var supportedExtensions = [/\.fbx\b/i, /\.obj\b/i, /\.jpg\b/i, /\.png\b/i, /\.gltf\b/i, /\.glb\b/i];
if (selectedItemCount > 1) {
return false;

View file

@ -148,7 +148,7 @@ Rectangle {
}
function canAddToWorld(path) {
var supportedExtensions = [/\.fbx\b/i, /\.obj\b/i, /\.jpg\b/i, /\.png\b/i, /\.gltf\b/i];
var supportedExtensions = [/\.fbx\b/i, /\.obj\b/i, /\.jpg\b/i, /\.png\b/i, /\.gltf\b/i, /\.glb\b/i];
if (selectedItemCount > 1) {
return false;

View file

@ -7123,7 +7123,7 @@ void Application::updateWindowTitle() const {
QString metaverseDetails;
if (isMetaverseLoggedIn) {
metaverseDetails = " (Metaverse: Logged in as " + metaverseUsername + ")";
metaverseDetails = " (Metaverse: Connected to " + MetaverseAPI::getCurrentMetaverseServerURL().toString() + " as " + metaverseUsername + ")";
} else {
metaverseDetails = " (Metaverse: Not Logged In)";
}

View file

@ -4,6 +4,7 @@
//
// Created by Gabriel Calero on 9/28/18.
// Copyright 2015 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -12,4 +13,4 @@
#pragma once
#include <QString>
static const QString API_SIGNUP_PATH = "api/v1/users";
static const QString API_SIGNUP_PATH = "/api/v1/users";

View file

@ -168,6 +168,7 @@ const btCollisionShape* OtherAvatar::createCollisionShape(int32_t jointIndex, bo
}
// Note: MultiSphereLow case really means: "skip fingers and use spheres for hands,
// else fall through to MultiSphereHigh case"
/* fall-thru */
case BodyLOD::MultiSphereHigh:
computeDetailedShapeInfo(shapeInfo, jointIndex);
break;

View file

@ -30,7 +30,7 @@ QNetworkRequest createNetworkRequest() {
QNetworkRequest request;
QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath(USER_ACTIVITY_URL);
requestURL.setPath(MetaverseAPI::getCurrentMetaverseServerURLPath() + USER_ACTIVITY_URL);
request.setUrl(requestURL);

View file

@ -108,7 +108,7 @@ void ScreenshareScriptingInterface::requestScreenshareInfo() {
// See `DomainServer::screensharePresence()` for more info about that.
QString currentDomainID = uuidStringWithoutCurlyBraces(addressManager->getDomainID());
QString requestURLPath = "api/v1/domains/%1/screenshare";
QString requestURLPath = "/api/v1/domains/%1/screenshare";
JSONCallbackParameters callbackParams;
callbackParams.callbackReceiver = this;
callbackParams.jsonCallbackMethod = "handleSuccessfulScreenshareInfoGet";

View file

@ -172,7 +172,7 @@ void LoginDialog::linkOculus() {
callbackParams.callbackReceiver = this;
callbackParams.jsonCallbackMethod = "linkCompleted";
callbackParams.errorCallbackMethod = "linkFailed";
const QString LINK_OCULUS_PATH = "api/v1/user/oculus/link";
const QString LINK_OCULUS_PATH = "/api/v1/user/oculus/link";
QJsonObject payload;
payload["oculus_nonce"] = nonce;
@ -200,7 +200,7 @@ void LoginDialog::createAccountFromOculus(QString email, QString username, QStri
callbackParams.jsonCallbackMethod = "createCompleted";
callbackParams.errorCallbackMethod = "createFailed";
const QString CREATE_ACCOUNT_FROM_OCULUS_PATH = "api/v1/user/oculus/create";
const QString CREATE_ACCOUNT_FROM_OCULUS_PATH = "/api/v1/user/oculus/create";
QJsonObject payload;
payload["oculus_nonce"] = nonce;
@ -251,7 +251,7 @@ void LoginDialog::linkSteam() {
callbackParams.jsonCallbackMethod = "linkCompleted";
callbackParams.errorCallbackMethod = "linkFailed";
const QString LINK_STEAM_PATH = "api/v1/user/steam/link";
const QString LINK_STEAM_PATH = "/api/v1/user/steam/link";
QJsonObject payload;
payload["steam_auth_ticket"] = QJsonValue::fromVariant(QVariant(ticket));
@ -278,7 +278,7 @@ void LoginDialog::createAccountFromSteam(QString username) {
callbackParams.jsonCallbackMethod = "createCompleted";
callbackParams.errorCallbackMethod = "createFailed";
const QString CREATE_ACCOUNT_FROM_STEAM_PATH = "api/v1/user/steam/create";
const QString CREATE_ACCOUNT_FROM_STEAM_PATH = "/api/v1/user/steam/create";
QJsonObject payload;
payload["steam_auth_ticket"] = QJsonValue::fromVariant(QVariant(ticket));

View file

@ -424,6 +424,7 @@ void OctreeStatsDialog::showOctreeServersOfType(NodeType_t serverType) {
extraDetails << "<br/>" << itemInfo.caption << " " << stats.getItemValue(item);
}
} // fall through... since MOST has all of MORE
/* fall-thru */
case MORE: {
QString totalString = locale.toString((uint)stats.getTotalElements());
QString internalString = locale.toString((uint)stats.getTotalInternal());

View file

@ -154,7 +154,6 @@ protected:
std::mutex _materialsLock;
quint64 _created;
QUuid _entityID;
// The base class relies on comparing the model transform to the entity transform in order
// to trigger an update, so the member must not be visible to derived classes as a modifiable
@ -164,6 +163,8 @@ protected:
// i.e. to see if the rendering code needs to update because of a change in state of the
// entity. This forces all the rendering code itself to be independent of the entity
const EntityItemPointer _entity;
QUuid _entityID;
};
template <typename T>

View file

@ -166,7 +166,7 @@ void ParticleEffectEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEn
particleUniforms.rotateWithEntity = _particleProperties.rotateWithEntity ? 1 : 0;
});
// Update particle uniforms
memcpy(&_uniformBuffer.edit<ParticleUniforms>(), &particleUniforms, sizeof(ParticleUniforms));
_uniformBuffer.edit<ParticleUniforms>() = particleUniforms;
}
ItemKey ParticleEffectEntityRenderer::getKey() {

View file

@ -4,6 +4,7 @@
//
// Created by Brad Hefta-Gaub on 12/4/13.
// Copyright 2013 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -1040,7 +1041,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
* @property {boolean} groupCulled=false - <code>true</code> if the mesh parts of the model are LOD culled as a group,
* <code>false</code> if separate mesh parts are LOD culled individually.
*
* @example <caption>Rez a Vive tracker puck.</caption>
* @example <caption>Rez a cowboy hat.</caption>
* var entity = Entities.addEntity({
* type: "Model",
* position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0.75, z: -2 })),

View file

@ -4,6 +4,7 @@
//
// Created by Brad Hefta-Gaub on 12/4/13.
// Copyright 2013 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -1492,7 +1493,7 @@ void EntityTree::startDynamicDomainVerificationOnServer(float minimumAgeToRemove
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath("/api/v1/commerce/proof_of_purchase_status/location");
requestURL.setPath(MetaverseAPI::getCurrentMetaverseServerURLPath() + "/api/v1/commerce/proof_of_purchase_status/location");
QJsonObject request;
request["certificate_id"] = certificateID;
networkRequest.setUrl(requestURL);
@ -1724,7 +1725,7 @@ void EntityTree::validatePop(const QString& certID, const EntityItemID& entityIt
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QUrl requestURL = MetaverseAPI::getCurrentMetaverseServerURL();
requestURL.setPath("/api/v1/commerce/proof_of_purchase_status/transfer");
requestURL.setPath(MetaverseAPI::getCurrentMetaverseServerURLPath() + "/api/v1/commerce/proof_of_purchase_status/transfer");
QJsonObject request;
request["certificate_id"] = certID;
networkRequest.setUrl(requestURL);

View file

@ -378,10 +378,10 @@ protected:
TransformCamera _cams[2];
Cameras(){};
Cameras(const TransformCamera& cam) { memcpy(_cams, &cam, sizeof(TransformCamera)); };
Cameras(const TransformCamera& cam) { _cams[0] = cam; };
Cameras(const TransformCamera& camL, const TransformCamera& camR) {
memcpy(_cams, &camL, sizeof(TransformCamera));
memcpy(_cams + 1, &camR, sizeof(TransformCamera));
_cams[0] = camL;
_cams[1] = camR;
};
};

View file

@ -331,8 +331,7 @@ void GLBackend::do_setStateBlendFactor(const Batch& batch, size_t paramOffset) {
void GLBackend::do_setStateScissorRect(const Batch& batch, size_t paramOffset) {
Vec4i rect;
memcpy(&rect, batch.readData(batch._params[paramOffset]._uint), sizeof(Vec4i));
memcpy(glm::value_ptr(rect), batch.readData(batch._params[paramOffset]._uint), sizeof(Vec4i));
if (_stereo.isStereo()) {
rect.z /= 2;
if (_stereo._pass) {

View file

@ -24,7 +24,7 @@ void GLBackend::do_setViewTransform(const Batch& batch, size_t paramOffset) {
}
void GLBackend::do_setProjectionTransform(const Batch& batch, size_t paramOffset) {
memcpy(&_transform._projection, batch.readData(batch._params[paramOffset]._uint), sizeof(Mat4));
memcpy(glm::value_ptr(_transform._projection), batch.readData(batch._params[paramOffset]._uint), sizeof(Mat4));
_transform._invalidProj = true;
}
@ -35,7 +35,7 @@ void GLBackend::do_setProjectionJitter(const Batch& batch, size_t paramOffset) {
}
void GLBackend::do_setViewportTransform(const Batch& batch, size_t paramOffset) {
memcpy(&_transform._viewport, batch.readData(batch._params[paramOffset]._uint), sizeof(Vec4i));
memcpy(glm::value_ptr(_transform._viewport), batch.readData(batch._params[paramOffset]._uint), sizeof(Vec4i));
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
{

View file

@ -440,6 +440,7 @@ QVector<glm::uint32> scriptable::ScriptableMeshPart::getFace(glm::uint32 faceInd
if (faceIndex < getNumFaces()) {
return getIndices().mid(faceIndex * getTopologyLength(), getTopologyLength());
}
/* fall-thru */
default: return QVector<glm::uint32>();
}
}

View file

@ -99,10 +99,10 @@ public:
const size_t offsetHL = hiCoords.x + loCoords.y * _lineStride;
const size_t offsetLH = loCoords.x + hiCoords.y * _lineStride;
const size_t offsetHH = hiCoords.x + hiCoords.y * _lineStride;
assert(offsetLL >= 0 && offsetLL < _lineStride * (_dims.y + 2 * EDGE_WIDTH));
assert(offsetHL >= 0 && offsetHL < _lineStride * (_dims.y + 2 * EDGE_WIDTH));
assert(offsetLH >= 0 && offsetLH < _lineStride * (_dims.y + 2 * EDGE_WIDTH));
assert(offsetHH >= 0 && offsetHH < _lineStride * (_dims.y + 2 * EDGE_WIDTH));
assert(offsetLL < _lineStride * (_dims.y + 2 * EDGE_WIDTH));
assert(offsetHL < _lineStride * (_dims.y + 2 * EDGE_WIDTH));
assert(offsetLH < _lineStride * (_dims.y + 2 * EDGE_WIDTH));
assert(offsetHH < _lineStride * (_dims.y + 2 * EDGE_WIDTH));
glm::vec4 colorLL = pixels[offsetLL];
glm::vec4 colorHL = pixels[offsetHL];
glm::vec4 colorLH = pixels[offsetLH];

View file

@ -15,7 +15,12 @@
#include <controllers/InputDevice.h>
#include "InputPlugin.h"
#include <QtGui/qtouchdevice.h>
#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
#include <QtGui/QList>
#else
#include <QTouchEvent>
#include <QtCore/QList>
#endif
#include "VirtualPadManager.h"
class QTouchEvent;

View file

@ -223,12 +223,14 @@ public:
};
namespace std {
#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
template <>
struct hash<QByteArray> {
size_t operator()(const QByteArray& byteArray) const {
return qHash(byteArray);
}
};
#endif
template <>
struct hash<TextureExtra> {

View file

@ -221,17 +221,24 @@ QNetworkRequest AccountManager::createRequest(QString path, AccountManagerAuth::
uuidStringWithoutCurlyBraces(_sessionID).toLocal8Bit());
QUrl requestURL = _authURL;
if (requestURL.isEmpty()) { // Assignment client doesn't set _authURL.
requestURL = getMetaverseServerURL();
}
// qCDebug(networking) << "Received path" << path;
// qCDebug(networking) << "path.left(path.indexOf(\" ? \"))" << path.left(path.indexOf("?"));
// qCDebug(networking) << "getMetaverseServerURLPath(true)" << getMetaverseServerURLPath(true);
int queryStringLocation = path.indexOf("?");
if (path.startsWith("/")) {
requestURL.setPath(path.left(queryStringLocation));
requestURL.setPath(getMetaverseServerURLPath(false) + path.left(queryStringLocation));
} else {
requestURL.setPath("/" + path.left(queryStringLocation));
requestURL.setPath(getMetaverseServerURLPath(true) + path.left(queryStringLocation));
}
// qCDebug(networking) << "Creating request path" << requestURL;
// qCDebug(networking) << "requestURL.isValid()" << requestURL.isValid();
// qCDebug(networking) << "requestURL.errorString()" << requestURL.errorString();
if (queryStringLocation >= 0) {
QUrlQuery query(path.mid(queryStringLocation+1));
@ -556,7 +563,7 @@ void AccountManager::requestAccessToken(const QString& login, const QString& pas
request.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QUrl grantURL = _authURL;
grantURL.setPath("/oauth/token");
grantURL.setPath(getMetaverseServerURLPath() + "/oauth/token");
QByteArray postData;
postData.append("grant_type=password&");
@ -579,7 +586,7 @@ void AccountManager::requestAccessTokenWithAuthCode(const QString& authCode, con
request.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QUrl grantURL = _authURL;
grantURL.setPath("/oauth/token");
grantURL.setPath(getMetaverseServerURLPath() + "/oauth/token");
QByteArray postData;
postData.append("grant_type=authorization_code&");
@ -602,7 +609,7 @@ void AccountManager::requestAccessTokenWithSteam(QByteArray authSessionTicket) {
request.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QUrl grantURL = _authURL;
grantURL.setPath("/oauth/token");
grantURL.setPath(getMetaverseServerURLPath() + "/oauth/token");
QByteArray postData;
postData.append("grant_type=password&");
@ -624,7 +631,7 @@ void AccountManager::requestAccessTokenWithOculus(const QString& nonce, const QS
request.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QUrl grantURL = _authURL;
grantURL.setPath("/oauth/token");
grantURL.setPath(getMetaverseServerURLPath() + "/oauth/token");
QByteArray postData;
postData.append("grant_type=password&");
@ -655,7 +662,7 @@ void AccountManager::refreshAccessToken() {
request.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QUrl grantURL = _authURL;
grantURL.setPath("/oauth/token");
grantURL.setPath(getMetaverseServerURLPath() + "/oauth/token");
QByteArray postData;
postData.append("grant_type=refresh_token&");
@ -688,7 +695,7 @@ void AccountManager::setAccessTokens(const QString& response) {
} else {
// clear the path from the response URL so we have the right root URL for this access token
QUrl rootURL = rootObject.contains("url") ? rootObject["url"].toString() : _authURL;
rootURL.setPath("");
rootURL.setPath(getMetaverseServerURLPath());
qCDebug(networking) << "Storing an account with access-token for" << qPrintable(rootURL.toString());
@ -723,7 +730,7 @@ void AccountManager::requestAccessTokenFinished() {
} else {
// clear the path from the response URL so we have the right root URL for this access token
QUrl rootURL = requestReply->url();
rootURL.setPath("");
rootURL.setPath(getMetaverseServerURLPath());
qCDebug(networking) << "Storing an account with access-token for" << qPrintable(rootURL.toString());
@ -759,7 +766,7 @@ void AccountManager::refreshAccessTokenFinished() {
} else {
// clear the path from the response URL so we have the right root URL for this access token
QUrl rootURL = requestReply->url();
rootURL.setPath("");
rootURL.setPath(getMetaverseServerURLPath());
qCDebug(networking) << "Storing an account with a refreshed access-token for" << qPrintable(rootURL.toString());
@ -784,7 +791,7 @@ void AccountManager::requestProfile() {
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QUrl profileURL = _authURL;
profileURL.setPath("/api/v1/user/profile");
profileURL.setPath(getMetaverseServerURLPath() + "/api/v1/user/profile");
QNetworkRequest profileRequest(profileURL);
profileRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
@ -834,7 +841,7 @@ void AccountManager::requestAccountSettings() {
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QUrl lockerURL = _authURL;
lockerURL.setPath("/api/v1/user/locker");
lockerURL.setPath(getMetaverseServerURLPath() + "/api/v1/user/locker");
QNetworkRequest lockerRequest(lockerURL);
lockerRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
@ -905,7 +912,7 @@ void AccountManager::postAccountSettings() {
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QUrl lockerURL = _authURL;
lockerURL.setPath("/api/v1/user/locker");
lockerURL.setPath(getMetaverseServerURLPath() + "/api/v1/user/locker");
QNetworkRequest lockerRequest(lockerURL);
lockerRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
@ -1003,8 +1010,8 @@ void AccountManager::uploadPublicKey() {
qCDebug(networking) << "Attempting upload of public key";
// upload the public key so data-web has an up-to-date key
const QString USER_PUBLIC_KEY_UPDATE_PATH = "api/v1/user/public_key";
const QString DOMAIN_PUBLIC_KEY_UPDATE_PATH = "api/v1/domains/%1/public_key";
const QString USER_PUBLIC_KEY_UPDATE_PATH = "/api/v1/user/public_key";
const QString DOMAIN_PUBLIC_KEY_UPDATE_PATH = "/api/v1/domains/%1/public_key";
QString uploadPath;
const auto& domainID = _accountInfo.getDomainID();

View file

@ -101,6 +101,9 @@ public:
const QString& getTemporaryDomainKey(const QUuid& domainID) { return _accountInfo.getTemporaryDomainKey(domainID); }
QUrl getMetaverseServerURL() { return MetaverseAPI::getCurrentMetaverseServerURL(); }
QString getMetaverseServerURLPath(bool appendForwardSlash = false) {
return MetaverseAPI::getCurrentMetaverseServerURLPath(appendForwardSlash);
}
void removeAccountFromFile();

View file

@ -2,8 +2,8 @@
// MetaverseAPI.cpp
// libraries/networking/src
//
// Created by Kalila (kasenvr) on 2019-12-16.
// Copyright 2019 Vircadia
// Created by Kalila L. on 2019-12-16.
// Copyright 2019 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -23,7 +23,7 @@ namespace MetaverseAPI {
QUrl getCurrentMetaverseServerURL() {
QUrl selectedMetaverseURL;
Setting::Handle<QUrl> selectedMetaverseURLSetting("private/selectedMetaverseURL",
NetworkingConstants::METAVERSE_SERVER_URL_STABLE);
NetworkingConstants::METAVERSE_SERVER_URL_STABLE);
selectedMetaverseURL = selectedMetaverseURLSetting.get();
@ -32,7 +32,17 @@ namespace MetaverseAPI {
if (QProcessEnvironment::systemEnvironment().contains(HIFI_METAVERSE_URL_ENV)) {
return QUrl(QProcessEnvironment::systemEnvironment().value(HIFI_METAVERSE_URL_ENV));
}
return selectedMetaverseURL;
};
}
QString getCurrentMetaverseServerURLPath(bool appendForwardSlash){
QString path = getCurrentMetaverseServerURL().path();
if (!path.isEmpty() && appendForwardSlash) {
path.append("/");
}
return path;
};
} // namespace MetaverseAPI

View file

@ -2,8 +2,8 @@
// MetaverseAPI.h
// libraries/networking/src
//
// Created by Kalila (kasenvr) on 2019-12-16.
// Copyright 2019 Vircadia
// Created by Kalila L. on 2019-12-16.
// Copyright 2019 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -17,6 +17,7 @@
namespace MetaverseAPI {
QUrl getCurrentMetaverseServerURL();
QString getCurrentMetaverseServerURLPath(bool appendForwardSlash = false);
}
#endif // athena_MetaverseAPI_h

View file

@ -4,6 +4,7 @@
//
// Created by Stephen Birarda on 2015-03-31.
// Copyright 2015 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -19,14 +20,15 @@ namespace NetworkingConstants {
// If you want to use STAGING instead of STABLE,
// links from the Domain Server web interface (like the connect account token generation)
// will still point at stable unless you ALSO change the Domain Server Metaverse Server URL inside of:
// <hifi repo>\domain-server\resources\web\js\shared.js
// <vircadia repo>\domain-server\resources\web\js\shared.js
// You can avoid changing that and still effectively use a connected domain on staging
// if you manually generate a personal access token for the domains scope
// at https://staging.highfidelity.com/user/tokens/new?for_domain_server=true
const QUrl METAVERSE_SERVER_URL_STABLE { "https://metaverse.highfidelity.com" };
const QUrl METAVERSE_SERVER_URL_STAGING { "https://staging-metaverse.vircadia.com" };
// For now we only have one Metaverse server.
const QUrl METAVERSE_SERVER_URL_STABLE { "https://metaverse.vircadia.com/live" };
const QUrl METAVERSE_SERVER_URL_STAGING { "https://metaverse.vircadia.com/live" };
// Web Engine requests to this parent domain have an account authorization header added
const QString AUTH_HOSTNAME_BASE = "highfidelity.com";
@ -42,11 +44,11 @@ namespace NetworkingConstants {
const QUrl BUILDS_XML_URL("https://highfidelity.com/builds.xml");
const QUrl MASTER_BUILDS_XML_URL("https://highfidelity.com/dev-builds.xml");
// For now we only have one ice server.
#if USE_STABLE_GLOBAL_SERVICES
const QString ICE_SERVER_DEFAULT_HOSTNAME = "ice.highfidelity.com";
const QString ICE_SERVER_DEFAULT_HOSTNAME = "ice.vircadia.com";
#else
const QString ICE_SERVER_DEFAULT_HOSTNAME = "dev-ice.highfidelity.com";
const QString ICE_SERVER_DEFAULT_HOSTNAME = "ice.vircadia.com";
#endif
const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com";

View file

@ -4,6 +4,7 @@
//
// Created by Simon Walton on Oct 15, 2018.
// Copyright 2018 High Fidelity, Inc.
// Copyright 2020 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@ -247,8 +248,7 @@ bool OctreeEntitiesFileParser::readEntitiesArray(QVariantList& entitiesArray) {
// model
"modelURL",
"animation.url",
// FIXME: Handle models' "textures" and "originalTextures" properties which include URLs. Note that Particles
// also has a "textures" property.
"textures",
// image
"imageURL",
// web
@ -258,7 +258,7 @@ bool OctreeEntitiesFileParser::readEntitiesArray(QVariantList& entitiesArray) {
"ambientLight.ambientURL",
"skybox.url",
// particles
"textures",
//"textures", Already specified for model entity type.
// materials
"materialURL",
// ...shared
@ -292,11 +292,30 @@ bool OctreeEntitiesFileParser::readEntitiesArray(QVariantList& entitiesArray) {
}
} else {
if (entityObject.contains(key) && entityObject[key].isString()) {
const QString url = entityObject[key].toString();
const QString value = entityObject[key].toString();
if (url.startsWith("./") || url.startsWith("../")) {
entityObject[key] = _relativeURL.resolved(url).toString();
if (value.startsWith("./") || value.startsWith("../")) {
// URL value.
entityObject[key] = _relativeURL.resolved(value).toString();
isDirty = true;
} else if (value.startsWith("{")) {
// Object with URL values.
auto document = QJsonDocument::fromJson(value.toUtf8());
if (!document.isNull()) {
auto object = document.object();
bool isObjectUpdated = false;
for (const QString& key : object.keys()) {
auto value = object[key].toString();
if (value.startsWith("./") || value.startsWith("../")) {
object[key] = _relativeURL.resolved(value).toString();
isObjectUpdated = true;
}
}
if (isObjectUpdated) {
entityObject[key] = QString(QJsonDocument(object).toJson());
isDirty = true;
}
}
}
}
}

View file

@ -16,6 +16,7 @@
#include "OctreeLogging.h"
#include "NumericalConstants.h"
#include <glm/gtc/type_ptr.hpp>
bool OctreePacketData::_debug = false;
AtomicUIntStat OctreePacketData::_totalBytesOfOctalCodes { 0 };
@ -702,17 +703,17 @@ void OctreePacketData::debugBytes() {
}
int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, glm::vec2& result) {
memcpy(&result, dataBytes, sizeof(result));
memcpy(glm::value_ptr(result), dataBytes, sizeof(result));
return sizeof(result);
}
int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, glm::vec3& result) {
memcpy(&result, dataBytes, sizeof(result));
memcpy(glm::value_ptr(result), dataBytes, sizeof(result));
return sizeof(result);
}
int OctreePacketData::unpackDataFromBytes(const unsigned char* dataBytes, glm::u8vec3& result) {
memcpy(&result, dataBytes, sizeof(result));
memcpy(glm::value_ptr(result), dataBytes, sizeof(result));
return sizeof(result);
}
@ -743,7 +744,12 @@ int OctreePacketData::unpackDataFromBytes(const unsigned char *dataBytes, QVecto
memcpy(&length, dataBytes, sizeof(uint16_t));
dataBytes += sizeof(length);
result.resize(length);
memcpy(result.data(), dataBytes, length * sizeof(glm::vec3));
for(int i=0;i<length;i++) {
memcpy(glm::value_ptr(result[i]), dataBytes, sizeof(glm::vec3));
dataBytes += sizeof(glm::vec3);
}
return sizeof(uint16_t) + length * sizeof(glm::vec3);
}

View file

@ -691,6 +691,7 @@ void RenderPipelines::updateMultiMaterial(graphics::MultiMaterial& multiMaterial
break;
case graphics::Material::CULL_FACE_MODE:
multiMaterial.setCullFaceMode(graphics::Material::DEFAULT_CULL_FACE_MODE);
break;
case graphics::MaterialKey::ALBEDO_MAP_BIT:
if (schemaKey.isAlbedoMap()) {
drawMaterialTextures->setTexture(gr::Texture::MaterialAlbedo, textureCache->getWhiteTexture());

View file

@ -18,6 +18,7 @@
#include "GLMHelpers.h"
#include "ByteCountCoding.h"
#include "PropertyFlags.h"
#include <glm/gtc/type_ptr.hpp>
class BufferParser {
public:
@ -98,7 +99,10 @@ template<>
inline void BufferParser::readValue(QVector<glm::vec3>& result) {
uint16_t length; readValue(length);
result.resize(length);
memcpy(result.data(), _data + _offset, sizeof(glm::vec3) * length);
for (int i=0; i<length; i++) {
memcpy(glm::value_ptr(result[i]), _data + _offset + (sizeof(glm::vec3)*i), sizeof(glm::vec3) * length);
}
_offset += sizeof(glm::vec3) * length;
}

View file

@ -620,7 +620,9 @@ void PolygonClip::clipToScreen(const glm::vec2* inputVertexArray, int inLength,
glm::vec2* tempVertexArrayB = new glm::vec2[maxLength];
// set up our temporary arrays
memcpy(tempVertexArrayA, inputVertexArray, sizeof(glm::vec2) * inLength);
for (int i=0; i<inLength; i++) {
tempVertexArrayA[i] = inputVertexArray[i];
}
// Left edge
LineSegment2 edge;

View file

@ -597,12 +597,14 @@ namespace std {
}
};
#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
template <>
struct hash<QString> {
size_t operator()(const QString& a) const {
return qHash(a);
}
};
#endif
}
/**jsdoc

View file

@ -15,12 +15,15 @@
#pragma warning( disable : 4334 )
#endif
#if !defined(Q_MOC_RUN)
// Work around https://bugreports.qt.io/browse/QTBUG-80990
#include <tbb/concurrent_queue.h>
#include <tbb/concurrent_unordered_map.h>
#include <tbb/concurrent_unordered_set.h>
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for.h>
#include <tbb/blocked_range2d.h>
#endif
#ifdef _WIN32
#pragma warning( pop )

View file

@ -153,13 +153,13 @@ void packBlendshapeOffsets_AVX2(float (*unpacked)[9], uint32_t (*packed)[4], int
__m256 s7 = _mm256_setzero_ps();
switch (rem) {
case 7: s6 = _mm256_loadu_ps(unpacked[i+6]);
case 6: s5 = _mm256_loadu_ps(unpacked[i+5]);
case 5: s4 = _mm256_loadu_ps(unpacked[i+4]);
case 4: s3 = _mm256_loadu_ps(unpacked[i+3]);
case 3: s2 = _mm256_loadu_ps(unpacked[i+2]);
case 2: s1 = _mm256_loadu_ps(unpacked[i+1]);
case 1: s0 = _mm256_loadu_ps(unpacked[i+0]);
case 7: s6 = _mm256_loadu_ps(unpacked[i+6]); /* fall-thru */
case 6: s5 = _mm256_loadu_ps(unpacked[i+5]); /* fall-thru */
case 5: s4 = _mm256_loadu_ps(unpacked[i+4]); /* fall-thru */
case 4: s3 = _mm256_loadu_ps(unpacked[i+3]); /* fall-thru */
case 3: s2 = _mm256_loadu_ps(unpacked[i+2]); /* fall-thru */
case 2: s1 = _mm256_loadu_ps(unpacked[i+1]); /* fall-thru */
case 1: s0 = _mm256_loadu_ps(unpacked[i+0]); /* fall-thru */
}
__m256 t0 = _mm256_unpacklo_ps(s0, s1);
@ -269,13 +269,13 @@ void packBlendshapeOffsets_AVX2(float (*unpacked)[9], uint32_t (*packed)[4], int
// store pack x 8
switch (rem) {
case 7: _mm_storeu_si128((__m128i*)packed[i+6], _mm256_extractf128_si256(v2, 1));
case 6: _mm_storeu_si128((__m128i*)packed[i+5], _mm256_extractf128_si256(v1, 1));
case 5: _mm_storeu_si128((__m128i*)packed[i+4], _mm256_extractf128_si256(v0, 1));
case 4: _mm_storeu_si128((__m128i*)packed[i+3], _mm256_castsi256_si128(v3));
case 3: _mm_storeu_si128((__m128i*)packed[i+2], _mm256_castsi256_si128(v2));
case 2: _mm_storeu_si128((__m128i*)packed[i+1], _mm256_castsi256_si128(v1));
case 1: _mm_storeu_si128((__m128i*)packed[i+0], _mm256_castsi256_si128(v0));
case 7: _mm_storeu_si128((__m128i*)packed[i+6], _mm256_extractf128_si256(v2, 1)); /* fall-thru */
case 6: _mm_storeu_si128((__m128i*)packed[i+5], _mm256_extractf128_si256(v1, 1)); /* fall-thru */
case 5: _mm_storeu_si128((__m128i*)packed[i+4], _mm256_extractf128_si256(v0, 1)); /* fall-thru */
case 4: _mm_storeu_si128((__m128i*)packed[i+3], _mm256_castsi256_si128(v3)); /* fall-thru */
case 3: _mm_storeu_si128((__m128i*)packed[i+2], _mm256_castsi256_si128(v2)); /* fall-thru */
case 2: _mm_storeu_si128((__m128i*)packed[i+1], _mm256_castsi256_si128(v1)); /* fall-thru */
case 1: _mm_storeu_si128((__m128i*)packed[i+0], _mm256_castsi256_si128(v0)); /* fall-thru */
}
}

View file

@ -14,6 +14,7 @@
#include "../NumericalConstants.h"
#include "../ViewFrustum.h"
#include <glm/gtc/type_ptr.hpp>
void ConicalViewFrustum::set(const ViewFrustum& viewFrustum) {
// The ConicalViewFrustum has two parts: a central sphere (same as ViewFrustum) and a circular cone that bounds the frustum part.
@ -131,9 +132,9 @@ int ConicalViewFrustum::serialize(unsigned char* destinationBuffer) const {
int ConicalViewFrustum::deserialize(const unsigned char* sourceBuffer) {
const unsigned char* startPosition = sourceBuffer;
memcpy(&_position, sourceBuffer, sizeof(_position));
memcpy(glm::value_ptr(_position), sourceBuffer, sizeof(_position));
sourceBuffer += sizeof(_position);
memcpy(&_direction, sourceBuffer, sizeof(_direction));
memcpy(glm::value_ptr(_direction), sourceBuffer, sizeof(_direction));
sourceBuffer += sizeof(_direction);
sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &_angle);
sourceBuffer += unpackClipValueFromTwoByte(sourceBuffer, _farClip);

View file

@ -7,7 +7,7 @@ logfile_maxbytes=0
pidfile=/var/run/supervisord.pid
[program:domain-server]
command=/opt/vircadia/domain-server
command=/opt/vircadia/domain-server --get-temp-name
autorestart=unexpected
directory=/opt/vircadia

View file

@ -105,7 +105,7 @@ private:
static QVariantMap zipNonZeroValues(const QStringList& keys, const QVector<float>& values) {
QVariantMap out;
for (int i=1; i < values.size(); i++) {
if (fabs(values[i]) > 1.0e-6) {
if (fabs(values[i]) > 1.0e-6f) {
out[keys.value(i)] = values[i];
}
}

View file

@ -160,7 +160,7 @@
return elContent;
}
// For any URLs present, unless they are already identified within
// an `a` element, linkify them.
function _linkifyUrls(matches, $el) {
@ -181,47 +181,53 @@
case ext == "JPG":
case ext == "GIF":
case ext == "JPEG":
elContent = elContent.replace(this, "<br/><img src='" + this
+ "'class=\"responsive z-depth-2\"><br/><a href=\"javascript:gotoClipboard('" + this + "');\" target='_blank'>" + this
+ "</a><a onclick=\"gotoExternalURL('" + this
+ "');return false;\"href=\"" + this
+ "\">&#x1F4F2;</a>");
var replaceWith = "<br/>";
replaceWith += "<img src='" + this + "'class=\"responsive z-depth-2\"><br/>";
replaceWith += "<a onclick=\"gotoClipboard('" + this + "');return false;\" href=\"" + this + "\" target=\"_blank\">" + this + "</a>";
replaceWith += "<a onclick=\"gotoExternalURL('" + this + "');return false;\"href=\"" + this + "\">&#x1F4F2;</a>";
elContent = elContent.replace(this, replaceWith);
break;
case ext == "iframe":
elContent = elContent.replace(this, "<br/><iframe class=\"z-depth-2\" src='" + this
+ "'width=\"440\" height=\"248\" frameborder=\"0\"></iframe>");
var replaceWith = "<br/>";
replaceWith += "<iframe class=\"z-depth-2\" src='" + this;
replaceWith += "'width=\"440\" height=\"248\" frameborder=\"0\"></iframe>";
elContent = elContent.replace(this, replaceWith);
break;
case ext == "webm":
elContent = elContent.replace(this, "<br/><video controls class=\"z-depth-2 responsive\"><source src='" + this
+ "' type='video/" + ext + "'></video><br/><a href=\"javascript:gotoClipboard('" + this
+ "');\">" + this
+ "</a><a onclick=\"gotoExternalURL('" + this
+ "');return false;\"href=\"" + this
+ "\">&#x1F4F2;</a>");
var replaceWith = "<br/>";
replaceWith += "<video controls class=\"z-depth-2 responsive\"><source src='" + this;
replaceWith += "' type='video/" + ext + "'></video>";
replaceWith += "<br/>";
replaceWith += "<a onclick=\"gotoClipboard('" + this + "');return false;\" href=\"" + this + "\">" + this + "</a>";
replaceWith += "<a onclick=\"gotoExternalURL('" + this + "');return false;\"href=\"" + this + "\">&#x1F4F2;</a>";
elContent = elContent.replace(this, replaceWith);
break;
case protocol === "HIFI":
case protocol === "hifi":
elContent = elContent.replace(this, "<br/><a href=\"javascript:gotoHiFi('" + this + "');\">" + this + "</a>");
break;
case !!this.match(/(https?:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)([^& \n<]+)(?:[^ \n<]+)?/g):
case !!this.match(/(https?:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/)([^& \n<]+)(?:[^ \n<]+)?/g):
var youtubeMatch = this.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);
if (youtubeMatch && youtubeMatch[2].length == 11) {
elContent = "<br/><iframe class=\"z-depth-2\" width='420' height='236' src='https://www.youtube.com/embed/" + youtubeMatch[2]
+ "' frameborder='0'></iframe><br/><a href=\"javascript:gotoURL('" + this
+ "');\">" + this
+ "</a><a onclick=\"gotoExternalURL('" + this
+ "');return false;\"href=\"" + this
+ "\">&#x1F4F2;</a>";
var replaceWith = "<br/>";
replaceWith += "<iframe class=\"z-depth-2\" width='420' height='236' src='https://www.youtube.com/embed/" + youtubeMatch[2] + "' frameborder='0'></iframe>";
replaceWith += "<br/>";
replaceWith += "<a onclick=\"gotoExternalURL('" + this + "');return false;\" href=\"" + this + "\">" + this + "</a>";
replaceWith += "<a onclick=\"gotoExternalURL('" + this + "');return false;\" href=\"" + this + "\">&#x1F4F2;</a>";
elContent = replaceWith;
break;
}
// else fall through to default
default:
elContent = elContent.replace(this, "<br/><a onclick=\"gotoURL('" + this
+ "');return false;\" href=\"" + this
+ "\">" + this
+ "</a><a onclick=\"gotoExternalURL('" + this
+ "');return false;\"href=\"" + this
+ "\">&#x1F4F2;</a>");
var replaceWith = "<br/>";
replaceWith += "<a onclick=\"gotoURL('" + this + "');return false;\" href=\"" + this + "\">" + this + "</a>";
replaceWith += "<a onclick=\"gotoExternalURL('" + this + "');return false;\"href=\"" + this + "\">&#x1F4F2;</a>";
elContent = elContent.replace(this, replaceWith);
break;
}

View file

@ -1,178 +0,0 @@
<!--
// addLocation.html
//
// Created by Darlingnotin in 2019.
// Copyright 2019 Darlingnotin
//
// Distributed under the ISC license.
// See the accompanying file LICENSE or https://opensource.org/licenses/ISC
-->
<!DOCTYPE html>
<html>
<head>
<title>Explore</title>
<link href="bootstrap.min.css" rel="stylesheet">
<style>
.myButton {
box-shadow: 3px 4px 0px 0px #899599;
background: linear-gradient(to bottom, #ededed 5%, #bab1ba 100%);
background-color: #ededed;
border-radius: 15px;
border: 1px solid #d6bcd6;
display: inline-block;
cursor: pointer;
color: #3a8a9e;
font-family: Arial;
font-size: 17px;
padding: 2px 19px;
text-decoration: none;
text-shadow: 0px 1px 0px #e1e2ed;
}
.myButton:hover {
background: linear-gradient(to bottom, #bab1ba 5%, #ededed 100%);
background-color: #bab1ba;
}
.myButton:active {
position: relative;
top: 1px;
}
.myButtonB {
box-shadow: 3px 4px 0px 0px #899599;
background: linear-gradient(to bottom, #ededed 5%, #bab1ba 100%);
background-color: #ededed;
border-radius: 15px;
border: 1px solid #d6bcd6;
display: inline-block;
cursor: pointer;
color: #3a8a9e;
font-family: Arial;
font-size: 17px;
padding: 2px 19px;
text-decoration: none;
text-shadow: 0px 1px 0px #e1e2ed;
position: absolute;
right: 0;
}
.myButtonB:hover {
background: linear-gradient(to bottom, #bab1ba 5%, #ededed 100%);
background-color: #bab1ba;
}
.myButtonB:active {
position: relative;
top: 1px;
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td,
th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #EFEFEF;
}
input[type=text],
select {
width: 450px;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #dddddd;
border-radius: 4px;
box-sizing: border-box;
}
</style>
</head>
<body onload="retrieveInformation()">
<h1>Add Location</h1><br>
<h3>Location List Provider URL</h3>
<select id="javascriptURL">
</select>
<h3>Domain Name</h3>
<input type="text" id="domainName" placeholder="Enter Domain Name here">
<h3>Owner</h3>
<input type="text" id="owner" placeholder="Enter Owner here">
<h3>Port</h3>
<input type="text" id="port" placeholder="Enter Port here (default 40102)"><br><br>
<button class="myButton" onclick="addLocation()">Add</button>
<script>
var retrievePortInformationResponse;
var metaverseProviderList = [];
function retrieveInformation() {
var readyEvent = {
"action": "retrievePortInformation",
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
function addToSelect() {
for (let i = 0; i < metaverseProviderList.length; i++) {
var x = document.getElementById("javascriptURL");
var option = document.createElement("option");
option.text = metaverseProviderList[i];
x.add(option);
}
}
function addLocation() {
var domainName = document.getElementById("domainName").value;
if (domainName == "") {
domainName = "Enter domain name";
}
var owner = document.getElementById("owner").value;
if (owner == "") {
owner = "Enter owner of domain";
}
var port = document.getElementById("port").value;
var javascriptURL = document.getElementById("javascriptURL").value;
if (port == "") {
port = 40102;
}
var readyEvent = {
"action": "addLocation",
"domainName": domainName,
"owner": owner,
"Port": port,
"script": javascriptURL
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
EventBridge.scriptEventReceived.connect(function (message) {
var messageData = JSON.parse(message);
if (messageData.action == "retrievePortInformationResponse") {
retrievePortInformationResponse = messageData.goToAddresses;
for (let i = 0; i < retrievePortInformationResponse.length; i++) {
metaverseProvider = retrievePortInformationResponse[i].split("/")[2].split(":")[0];
metaverseProviderList[metaverseProviderList.length] = "https://" + metaverseProvider + "/interim/d-goto/app/decentralizedGoToServerScript.js";
}
addToSelect();
}
});
</script>
</bodyonload="retrieveAddressList()">
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,59 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 50 50"
style="enable-background:new 0 0 50 50;"
xml:space="preserve"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="explore-a.svg"><metadata
id="metadata18"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs16" /><sodipodi:namedview
pagecolor="#ff0000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1062"
inkscape:window-height="481"
id="namedview14"
showgrid="false"
inkscape:zoom="4.72"
inkscape:cx="29.375221"
inkscape:cy="25"
inkscape:window-x="759"
inkscape:window-y="32"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style3">
.st0{fill:#FFFFFF;}
</style><g
id="Layer_2" /><g
style="display:inline;fill:#aaccff;stroke:#000000"
id="g5138"
transform="matrix(0.09456523,0,0,0.09456523,5.5165215,5.1539559)"><path
id="path5124"
d="m 209,15 a 195,195 0 1 0 2,0 z"
inkscape:connector-curvature="0"
style="fill:#aaccff;stroke-width:26" /><path
id="path5126"
d="M 210,15 V 405 M 405,210 H 15 M 59,90 a 260,260 0 0 0 302,0 m 0,240 A 260,260 0 0 0 59,330 M 195,20 a 250,250 0 0 0 0,382 m 30,0 a 250,250 0 0 0 0,-382"
inkscape:connector-curvature="0"
style="fill:#aaccff;stroke-width:18" /></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24">
<path d="M17.9,17.39C17.64,16.59 16.89,16 16,16H15V13A1,1 0 0,0 14,12H8V10H10A1,1 0 0,0 11,9V7H13A2,2 0 0,0 15,5V4.59C17.93,5.77 20,8.64 20,12C20,14.08 19.2,15.97 17.9,17.39M11,19.93C7.05,19.44 4,16.08 4,12C4,11.38 4.08,10.78 4.21,10.21L9,15V16A2,2 0 0,0 11,18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 437 B

View file

@ -1,59 +1,3 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 50 50"
style="enable-background:new 0 0 50 50;"
xml:space="preserve"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="explore-a.svg"><metadata
id="metadata18"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs16" /><sodipodi:namedview
pagecolor="#ff0000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1062"
inkscape:window-height="481"
id="namedview14"
showgrid="false"
inkscape:zoom="4.72"
inkscape:cx="29.375221"
inkscape:cy="25"
inkscape:window-x="759"
inkscape:window-y="32"
inkscape:window-maximized="0"
inkscape:current-layer="Layer_1" /><style
type="text/css"
id="style3">
.st0{fill:#FFFFFF;}
</style><g
id="Layer_2" /><g
style="display:inline;fill:#aaccff;stroke:#FFFFFF"
id="g5138"
transform="matrix(0.09456523,0,0,0.09456523,5.5165215,5.1539559)"><path
id="path5124"
d="m 209,15 a 195,195 0 1 0 2,0 z"
inkscape:connector-curvature="0"
style="fill:#aaccff;stroke-width:26" /><path
id="path5126"
d="M 210,15 V 405 M 405,210 H 15 M 59,90 a 260,260 0 0 0 302,0 m 0,240 A 260,260 0 0 0 59,330 M 195,20 a 250,250 0 0 0 0,382 m 30,0 a 250,250 0 0 0 0,-382"
inkscape:connector-curvature="0"
style="fill:#aaccff;stroke-width:18" /></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24">
<path fill="#ffffff" d="M17.9,17.39C17.64,16.59 16.89,16 16,16H15V13A1,1 0 0,0 14,12H8V10H10A1,1 0 0,0 11,9V7H13A2,2 0 0,0 15,5V4.59C17.93,5.77 20,8.64 20,12C20,14.08 19.2,15.97 17.9,17.39M11,19.93C7.05,19.44 4,16.08 4,12C4,11.38 4.08,10.78 4.21,10.21L9,15V16A2,2 0 0,0 11,18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 451 B

View file

@ -1,212 +1,568 @@
<!--
// explore.html
//
// Created by Darlingnotin in 2019.
// Copyright 2019 Darlingnotin
//
// Distributed under the ISC license.
// See the accompanying file LICENSE or https://opensource.org/licenses/ISC
-->
<!DOCTYPE html>
<html>
<head>
<title>Explore</title>
<link href="bootstrap.min.css" rel="stylesheet">
<link href="../libraries/materialdesignicons/css/materialdesignicons.min.css" rel="stylesheet" />
<link href="../libraries/vuetify/vuetify-v2.3.9.min.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
<style>
.myButton {
box-shadow: 3px 4px 0px 0px #899599;
background: linear-gradient(to bottom, #ededed 5%, #bab1ba 100%);
background-color: #ededed;
border-radius: 15px;
border: 1px solid #d6bcd6;
display: inline-block;
cursor: pointer;
color: #3a8a9e;
font-family: Arial;
font-size: 17px;
padding: 2px 19px;
text-decoration: none;
text-shadow: 0px 1px 0px #e1e2ed;
html {
overflow: hidden;
background: black;
}
.myButton:hover {
background: linear-gradient(to bottom, #bab1ba 5%, #ededed 100%);
background-color: #bab1ba;
}
.myButton:active {
position: relative;
top: 1px;
}
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td,
th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #EFEFEF;
}
input[type=text],
select {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
display: inline-block;
border: 1px solid #dddddd;
border-radius: 4px;
box-sizing: border-box;
#component-templates {
display: none;
}
</style>
<!--<script src="js/TestEventBridge.js"></script>-->
</head>
<body>
<div id="component-templates">
<div id="add-location-template">
<v-dialog v-model="dialog" fullscreen hide-overlay transition="dialog-bottom-transition">
<template v-slot:activator="{ on, attrs }">
<v-btn color="grey darken-3" class="ml-5" v-show="permission" value="animations" v-bind="attrs" v-on="on" fab small>
<v-icon color="purple">mdi-map-plus</v-icon>
</v-btn>
</template>
<v-card>
<v-toolbar dark color="purple">
<v-btn icon dark @click="closeDialog();">
<v-icon>mdi-close</v-icon>
</v-btn>
<v-toolbar-title>Add Location</v-toolbar-title>
<v-spacer></v-spacer>
<v-toolbar-items>
<v-btn dark text @click="addLocation()">Save</v-btn>
</v-toolbar-items>
</v-toolbar>
<v-card-text>
<v-container>
<v-form ref="form"
v-model="valid"
lazy-validation>
<v-row>
<v-col cols="12" sm="6" md="4">
<v-text-field v-model="domainName" :rules="domainNameRules" label="Domain Display Name *" required hint="This is the name that shows on the listing" persistent-hint></v-text-field>
</v-col>
<v-col cols="12" sm="6" md="4">
<v-text-field v-model="owner" :rules="ownerRules" label="Owner *" hint="Owner name to show in listing" required persistent-hint></v-text-field>
</v-col>
<v-col cols="12">
<v-text-field v-model="port" :rules="portRules" label="Port *" hint="Domain server port number (default 40102)" required persistent-hint></v-text-field>
</v-col>
<v-col cols="12">
<v-select v-model="locationProvider" :rules="locationProviderRules" :items="locationProviders"
label="Location Provider *" required persistent-hint hint="The location provider to use when adding domain."></v-select>
</v-col>
</v-row>
</v-form>
</v-container>
<small>*indicates required field</small>
</v-card-text>
<v-card-text>
When you add a location, you are actually creating a location beacon wherever you are currently standing. By default this will show up as a red cube.
If you need to amend the details of your listing at a later date, simply open the Create app in your domain, find the entity with the name "Explore Marker (Your domain name)"
and modify its userData values.
You can also hide the marker easily by toggling the entity's visibility. It will still function when hidden.
</v-card-text>
</v-card>
</v-dialog>
</div>
<div id="add-bookmark-template"></div>
<div id="explore-template">
<div>
<v-container fluid class="pa-0">
<v-data-iterator :items="items"
:items-per-page.sync="itemsPerPage"
:page.sync="page"
:search="visit"
:sort-by="sortBy"
:sort-desc="sortDesc"
:loading="loading"
@page-count="pageCount = $event"
hide-default-footer>
<template v-slot:header>
<v-row dense>
<v-text-field v-model="visit" clearable
flat
solo-inverted
hide-details
label="Visit"
class="pb-3"
append-icon="mdi-location-enter"
v-on:keyup.enter="visitIconCallback"
@click:append="visitIconCallback">
<body onload="retrieveAddressList()">
</v-text-field>
</v-row>
</template>
<h3>Explore</h3>
<button class="myButton" onclick="navigateBack()">< Back</button>
<button class="myButton" onclick="navigateHome()">Home</button>
<button class="myButton" onclick="navigateForward()">Forward ></button>
<template v-slot:default="props">
<v-row dense>
<v-col v-for="item in props.items"
:key="item.name"
cols="12"
sm="6"
md="4"
lg="3">
<v-hover
v-slot:default="{ hover }"
>
<v-card
@click.native="openLocation(item['Visit'])"
:color="hover ? 'grey darken-3' : 'grey darken-4'"
>
<!--<v-card-title class="headline">{{ item["Domain Name"] }}</v-card-title>-->
<div class="d-flex flex-no-wrap justify-space-between">
<div>
<v-card-title class="text-h6 d-block text-truncate pa-2" v-text="item['Domain Name']" style="max-width: 400px;"></v-card-title>
<v-card-subtitle class="pa-2 d-block text-truncate" style="max-width: 400px;" v-text="item.Owner"></v-card-subtitle>
</div>
<div style="text-align: right;">
<v-card-title align-right class="align-right" v-text="item['People']"></v-card-title>
</div>
</div>
</v-card>
</hover>
</v-col>
</v-row>
</template>
<input type="text" id="domainAddressInput" placeholder="Type domain address here">
<template v-slot:footer>
<v-footer absolute dense class="font-weight-medium " color="black">
<v-col class="text-center pa-0"
cols="12">
<v-pagination v-model="page"
color="purple"
:total-visible="8"
:length="pageCount"
prev-icon="mdi-menu-left"
next-icon="mdi-menu-right"></v-pagination>
</v-col>
<button class="myButton" onclick="myDomainAddressInputGoTo()">Visit</button>
<p id="showData"></p>
</v-footer>
</template>
</v-data-iterator>
</v-container>
</div>
</div>
<div id="bookmarks-template">
<div>
<v-container fluid class="pa-0">
<v-data-iterator :items="items"
:items-per-page.sync="itemsPerPage"
:page.sync="page"
:search="search"
:sort-by="sortBy"
:sort-desc="sortDesc"
:loading="loading"
@page-count="pageCount = $event"
hide-default-footer>
<template v-slot:header>
<v-row dense>
<v-col cols="12"
sm="6"
md="4"
lg="3">
<v-text-field v-model="search"
clearable
flat
solo-inverted
hide-details
label="Search"
class="pb-3"></v-text-field>
</v-col>
</v-row>
</template>
<p id="addLocation"></p>
<template v-slot:default="props">
<v-row dense>
<v-col v-for="item in props.items"
:key="item.name"
cols="12"
sm="6"
md="4"
lg="3">
<v-card hover @click.native="openLocation(item['location'])">
<div class="d-flex flex-no-wrap justify-space-between">
<div>
<v-card-title class="text-h6 d-block text-truncate pa-2" v-text="item['name']" style="max-width: 400px;"></v-card-title>
</div>
</div>
</v-card>
</v-col>
</v-row>
</template>
<template v-slot:footer>
<v-footer absolute dense class="font-weight-medium " color="black">
<v-col class="text-center pa-0"
cols="12">
<v-pagination v-model="page"
color="purple"
:total-visible="8"
:length="pageCount"
prev-icon="mdi-menu-left"
next-icon="mdi-menu-right"></v-pagination>
</v-col>
</v-footer>
</template>
</v-data-iterator>
</v-container>
</div>
</div>
<div id="events-template">
<div>events from template</div>
</div>
<div id="settings-template">
<div>settings from template</div>
</div>
</div>
<div id="app">
<v-app>
<div>
<v-app-bar dense>
<v-toolbar-title>Explore</v-toolbar-title>
<v-spacer></v-spacer>
<v-tooltip bottom>
<template v-slot:activator="{ on, attrs }">
<v-btn v-bind="attrs" v-on="on" color="grey darken-3" class="mx-1" v-show="isHomeSet" value="animations" fab small @click="navigateHome()">
<v-icon color="purple">mdi-home</v-icon>
</v-btn>
</template>
<span>Go Home</span>
</v-tooltip>
<v-tooltip bottom>
<template v-slot:activator="{ on, attrs }">
<v-btn v-bind="attrs" v-on="on" color="grey darken-3" class="mx-1" value="animations" fab small @click="navigateBack()">
<v-icon color="purple">mdi-arrow-left-bold</v-icon>
</v-btn>
</template>
<span>Go Back</span>
</v-tooltip>
<v-tooltip bottom>
<template v-slot:activator="{ on, attrs }">
<v-btn v-bind="attrs" v-on="on" color="grey darken-3" class="mx-1" value="animations" fab small @click="navigateForward()">
<v-icon color="purple">mdi-arrow-right-bold</v-icon>
</v-btn>
</template>
<span>Go Forward</span>
</v-tooltip>
<!--<v-btn value="animations" fab small>
<v-icon color="purple">mdi-map-marker-plus</v-icon>
</v-btn>-->
<add-location ref="addLocation" :permission="permission"></add-location>
</v-app-bar>
</div>
<v-main>
<v-container>
<router-view></router-view>
</v-container>
</v-main>
<v-bottom-navigation grow color="purple lighten-1" shift v-model="activeItem">
<v-btn value="explore" :to="{ path: '/'}">
<span>Explore</span>
<v-icon>mdi-map-search-outline</v-icon>
</v-btn>
<!--<v-btn value="bookmarks" :to="{ path: '/bookmarks'}">
<span>Bookmarks</span>
<v-icon>mdi-map-marker</v-icon>
</v-btn>-->
<!--<v-btn value="events" :to="{ path: '/events'}" >
<span>Events</span>
<v-icon>mdi-calendar-month</v-icon>
</v-btn>-->
<!--<v-btn value="settings" :to="{ path: '/settings'}">
<span>Settings</span>
<v-icon>mdi-cog</v-icon>
</v-btn>-->
</v-bottom-navigation>
</v-app>
</div>
<script src="../libraries/vue/vue.min.js"></script>
<script src="../libraries/vue-router/vue-router.js"></script>
<script src="../libraries/vuetify/vuetify-v2.3.9.js"></script>
<script>
var exploreComponent = null;
var locationData = null;
function getAddressListData(component) {
exploreComponent = component;
function myDomainAddressInputGoTo() {
var vircadiaUrl = document.getElementById("domainAddressInput").value;
if (vircadiaUrl !== "") {
var readyEvent = {
"action": "goToUrl",
"visit": vircadiaUrl,
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
if (locationData != null) {
exploreComponent.updateData(locationData);
return;
}
}
function navigateBack() {
var readyEvent = {
"action": "navigateBack"
}
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
function navigateHome() {
var readyEvent = {
"action": "navigateHome"
}
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
function navigateForward() {
var readyEvent = {
"action": "navigateForward"
}
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
function navigateTo(url) {
var readyEvent = {
"action": "goToUrl",
"visit": url,
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
function retrieveAddressList() {
var readyEvent = {
"action": "requestAddressList",
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
EventBridge.scriptEventReceived.connect(function (message) {
var messageData = JSON.parse(message);
if (messageData.action == "addressList") {
myAddress = messageData.myAddress;
createTableFromJSON();
if (messageData.permission) {
document.getElementById("addLocation").innerHTML = "<button class=\"myButton\" onclick=\"window.location.href = 'addLocation.html';\">Add Location To Explore</button>";
var bookmarksComponent = null;
var bookmarksData = null;
function getBookmarkListData(component) {
bookmarksComponent = component;
if (bookmarksData != null) {
bookmarksComponent.updateData(bookmarksData);
return;
}
var readyEvent = {
"action": "requestBookmarksList",
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
var addLocationComponent = null;
var addLocationData = null;
function getAddLocationData(component) {
addLocationComponent = component;
if (addLocationData != null) {
addLocationComponent.updateData(addLocationData);
return;
}
var readyEvent = {
"action": "retrievePortInformation",
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
const Explore = {
data() {
return {
loading: true,
visit: '',
filter: {},
sortDesc: true,
page: 1,
pageCount: 0,
itemsPerPage: 6,
sortBy: 'People',
items: [],
}
},
template: document.getElementById("explore-template").innerHTML,
created() {
this.fetchData();
},
methods: {
openLocation(url) {
var readyEvent = {
"action": "goToUrl",
"visit": url,
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
},
visitIconCallback() {
if (this.visit !== "") {
this.openLocation(this.visit);
}
},
fetchData() {
this.error = this.post = null;
this.loading = true;
getAddressListData(this);
},
updateData(data) {
this.items = data;
this.loading = false;
}
}
};
const Bookmarks =
{
data() {
return {
loading: true,
search: '',
visit: '',
filter: {},
sortDesc: true,
page: 1,
pageCount: 0,
itemsPerPage: 6,
sortBy: 'name',
items: [], //testLocationData,
}
},
template: document.getElementById("bookmarks-template").innerHTML,
created() {
this.fetchData();
},
methods: {
openLocation(url) {
var readyEvent = {
"action": "goToUrl",
"visit": url,
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
},
fetchData() {
this.error = this.post = null;
this.loading = true;
getBookmarkListData(this);
},
updateData(data) {
this.items = data;
this.loading = false;
}
}
};
const Events = { template: document.getElementById("events-template").innerHTML };
const Settings = { template: document.getElementById("settings-template").innerHTML }
const AddLocation = {
data() {
return {
valid: true,
//permission: false,
dialog: false,
domainName: "",
domainNameRules: [
v => !!v || 'Domain Display Name is required',
],
owner: "",
ownerRules: [
v => !!v || 'Owner is required',
],
port: "40102",
portRules: [
v => !!v || 'Port is required',
v => /^[0-9]{1,5}$/.test(v) || 'Must be a valid port number'
],
locationProvider: "",
locationProviderRules: [
v => !!v || 'Location Provider is required',
],
locationProviders: []
}
},
watch: {
dialog: function (val) {
if (val) {
this.opening();
}
},
},
props: {
permission: false
},
template: document.getElementById("add-location-template").innerHTML,
methods: {
opening() {
getAddLocationData(this);
},
updateData(data) {
this.locationProviders = data;
this.locationProvider = data[0];
},
addLocation() {
if (this.$refs.form.validate()) {
var readyEvent = {
"action": "addLocation",
"domainName": this.domainName,
"owner": this.owner,
"Port": this.port,
"script": this.locationProvider
};
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
this.closeDialog();
}
},
closeDialog() {
this.domainName = "";
this.owner = "";
this.port = "40102";
this.locationProvider = "Current";
this.dialog = false;
this.$refs.form.resetValidation();
}
}
}
const routes = [
{ path: '/', component: Explore },
{ path: '/bookmarks', component: Bookmarks },
{ path: '/events', component: Events },
{ path: '/settings', component: Settings }
];
const router = new VueRouter({ routes });
const vm = new Vue({
router,
el: '#app',
data: {
activeItem: string = 'explore',
permission: false,
isHomeSet: false,
},
vuetify: new Vuetify({
theme: {
dark: true,
},
}),
components: {
'add-location': AddLocation
},
methods: {
navigateHome() {
var readyEvent = {
"action": "navigateHome"
}
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
},
navigateBack() {
var readyEvent = {
"action": "navigateBack"
}
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
},
navigateForward() {
var readyEvent = {
"action": "navigateForward"
}
EventBridge.emitWebEvent(JSON.stringify(readyEvent));
}
},
created: function () {
const self = this;
EventBridge.scriptEventReceived.connect(function (message) {
var messageData = JSON.parse(message);
if (messageData.action == "addressListv2") {
self.permission = messageData.permission;
locationData = messageData.myAddress;
exploreComponent.updateData(locationData);
self.isHomeSet = messageData.isHomeSet;
}
if (messageData.action == "bookmarksList") {
bookmarksData = messageData.bookmarks;
bookmarksComponent.updateData(bookmarksData);
}
if (messageData.action == "retrievePortInformationResponse") {
addLocationData = messageData.goToAddresses;
for (let i = 0; i < addLocationData.length; i++) {
var metaverseProvider = addLocationData[i].split("/")[2].split(":")[0];
addLocationData[i] = "https://" + metaverseProvider + "/interim/d-goto/app/decentralizedGoToServerScript.js";
}
addLocationComponent.updateData(addLocationData);
}
});
}
});
var myAddress = [{}];
function createTableFromJSON() {
var col = [];
for (var i = 0; i < myAddress.length; i++) {
for (var key in myAddress[i]) {
if (col.indexOf(key) === -1) {
col.push(key);
}
}
}
var table = document.createElement("table");
table.setAttribute('id', 'domains');
table.setAttribute('class', 'table table-striped sampleTable domains');
var thead = table.createTHead();
//var tr = table.insertRow(-1);
for (var i = 0; i < col.length; i++) {
var th = document.createElement("th");
if (col[i] === 'People') th.setAttribute('data-sortas', 'numeric');
th.innerHTML = col[i];
thead.appendChild(th);
}
var tbdy = document.createElement('tbody');
for (var i = 0; i < myAddress.length; i++) {
tr = table.insertRow(-1);
for (var j = 0; j < col.length; j++) {
var tabCell = tr.insertCell(-1);
if (j == 2) {
var url = "<input id=\"Button\" class=\"myButton\" type=\"button\" onclick=\"navigateTo('" + myAddress[i][col[j]] + "')\" value=\"Visit\" />";
tabCell.innerHTML = url;
} else {
tabCell.innerHTML = myAddress[i][col[j]];
}
}
}
var divContainer = document.getElementById("showData");
divContainer.innerHTML = "";
divContainer.appendChild(table);
$("#domains").fancyTable({
sortColumn: 3, // column number for initial sorting
sortOrder: 'desc', // 'desc', 'descending', 'asc', 'ascending', -1 (descending) and 1 (ascending)
sortable: true,
pagination: true, // default: false
perPage: 7,
searchable: true,
globalSearch: true,
globalSearchExcludeColumns: [3] // exclude column 2 & 5
});
}
</script>
<script src="jquery.min.js"></script>
<script src="bootstrap.min.js"></script>
<script src="fancyTable.js"></script>
</body>
</html>

View file

@ -74,9 +74,10 @@
permission = Entities.canRez()
var readyEvent = {
"action": "addressList",
"action": "addressListv2",
"myAddress": children,
"permission": permission
"permission": permission,
"isHomeSet": LocationBookmarks.getHomeLocationAddress().length > 0
};
tablet.emitScriptEvent(JSON.stringify(readyEvent));

View file

@ -1,260 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 50 200.1"
style="enable-background:new 0 0 50 200.1;"
xml:space="preserve"
id="svg125"
sodipodi:docname="Explore.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
id="metadata131"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs129" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview127"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:zoom="5.6568542"
inkscape:cx="18.340874"
inkscape:cy="67.670896"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer6"><sodipodi:guide
position="14.125,99.999998"
orientation="0,1"
id="guide204"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" /><sodipodi:guide
position="-85.689885,150"
orientation="0,1"
id="guide206"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" /><sodipodi:guide
position="-93.693885,49.999999"
orientation="0,1"
id="guide208"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" /><sodipodi:guide
position="-93.458473,0"
orientation="0,1"
id="guide210"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" /><sodipodi:guide
position="-62.619531,200"
orientation="0,1"
id="guide212"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" /><sodipodi:guide
position="20.995787,157.79945"
orientation="0,1"
id="guide214"
inkscape:locked="false" /><sodipodi:guide
position="22.746663,107.80388"
orientation="0,1"
id="guide216"
inkscape:locked="false" /><sodipodi:guide
position="22.776089,57.704999"
orientation="0,1"
id="guide218"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" /><sodipodi:guide
position="20.716236,7.5989999"
orientation="0,1"
id="guide220"
inkscape:locked="false"
inkscape:label=""
inkscape:color="rgb(0,0,255)" /><sodipodi:guide
position="13.21875,164.20312"
orientation="0,1"
id="guide230"
inkscape:locked="false" /><sodipodi:guide
position="18.292969,164.20703"
orientation="0,1"
id="guide5167"
inkscape:locked="false" /><sodipodi:guide
position="19.776893,114.21984"
orientation="0,1"
id="guide5169"
inkscape:locked="false" /><sodipodi:guide
position="18.473165,64.114696"
orientation="0,1"
id="guide5171"
inkscape:locked="false" /><sodipodi:guide
position="18.649941,14.009553"
orientation="0,1"
id="guide5173"
inkscape:locked="false" /></sodipodi:namedview>
<style
type="text/css"
id="style10">
.st0{fill:#414042;}
.st1{fill:#FFFFFF;}
.st2{fill:#1E1E1E;}
.st3{fill:#333333;}
</style>
<g
id="Layer_3">
</g>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Base"
style="display:inline"><g
id="Layer_2">
<g
id="g16">
<g
id="g14">
<path
class="st0"
d="m 50.1,146.1 c 0,2.2 -1.8,4 -4,4 h -42 c -2.2,0 -4,-1.8 -4,-4 v -42 c 0,-2.2 1.8,-4 4,-4 h 42 c 2.2,0 4,1.8 4,4 z"
id="path12"
inkscape:connector-curvature="0"
style="fill:#414042" />
</g>
</g>
<g
id="g22">
<g
id="g20">
<path
class="st0"
d="m 50,196.1 c 0,2.2 -1.8,4 -4,4 H 4 c -2.2,0 -4,-1.8 -4,-4 v -42 c 0,-2.2 1.8,-4 4,-4 h 42 c 2.2,0 4,1.8 4,4 z"
id="path18"
inkscape:connector-curvature="0"
style="fill:#414042" />
</g>
</g>
<g
id="g28">
<g
id="g26">
<path
class="st1"
d="m 50,46 c 0,2.2 -1.8,4 -4,4 H 4 C 1.8,50 0,48.2 0,46 V 4 C 0,1.8 1.8,0 4,0 h 42 c 2.2,0 4,1.8 4,4 z"
id="path24"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
</g>
<g
id="g32">
<path
class="st2"
d="m 50,96.1 c 0,2.2 -1.8,4 -4,4 H 4 c -2.2,0 -4,-1.8 -4,-4 v -42 c 0,-2.2 1.8,-4 4,-4 h 42 c 2.2,0 4,1.8 4,4 z"
id="path30"
inkscape:connector-curvature="0"
style="fill:#1e1e1e" />
</g>
</g></g><g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Text"
style="display:none"
sodipodi:insensitive="true" /><g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="World"
style="display:inline"><g
style="fill:#aaccff;stroke:#000000"
id="g5138"
transform="matrix(0.06304349,0,0,0.06304349,11.1413,6.36036)"><path
id="path5124"
d="m 209,15 a 195,195 0 1 0 2,0 z"
inkscape:connector-curvature="0"
style="stroke-width:26;fill:#aaccff" /><path
id="path5126"
d="M 210,15 V 405 M 405,210 H 15 M 59,90 a 260,260 0 0 0 302,0 m 0,240 A 260,260 0 0 0 59,330 M 195,20 a 250,250 0 0 0 0,382 m 30,0 a 250,250 0 0 0 0,-382"
inkscape:connector-curvature="0"
style="stroke-width:18;fill:#aaccff" /></g><g
transform="matrix(0.06304349,0,0,0.06304349,11.1413,56.347551)"
id="g5155"
style="fill:#aaccff;stroke:#000000"><path
style="fill:#aaccff;stroke-width:26"
inkscape:connector-curvature="0"
d="m 209,15 a 195,195 0 1 0 2,0 z"
id="path5151" /><path
style="fill:#aaccff;stroke-width:18"
inkscape:connector-curvature="0"
d="M 210,15 V 405 M 405,210 H 15 M 59,90 a 260,260 0 0 0 302,0 m 0,240 A 260,260 0 0 0 59,330 M 195,20 a 250,250 0 0 0 0,382 m 30,0 a 250,250 0 0 0 0,-382"
id="path5153" /></g><g
style="fill:#aaccff;stroke:#000000"
id="g5161"
transform="matrix(0.06304349,0,0,0.06304349,12.025183,106.4527)"><path
id="path5157"
d="m 209,15 a 195,195 0 1 0 2,0 z"
inkscape:connector-curvature="0"
style="fill:#aaccff;stroke-width:26" /><path
id="path5159"
d="M 210,15 V 405 M 405,210 H 15 M 59,90 a 260,260 0 0 0 302,0 m 0,240 A 260,260 0 0 0 59,330 M 195,20 a 250,250 0 0 0 0,382 m 30,0 a 250,250 0 0 0 0,-382"
inkscape:connector-curvature="0"
style="fill:#aaccff;stroke-width:18" /></g><g
transform="matrix(0.06304349,0,0,0.06304349,12.025183,156.55784)"
id="g5190"
style="fill:#aaccff;stroke:#000000"><path
style="fill:#aaccff;stroke-width:26"
inkscape:connector-curvature="0"
d="m 209,15 a 195,195 0 1 0 2,0 z"
id="path5186" /><path
style="fill:#aaccff;stroke-width:18"
inkscape:connector-curvature="0"
d="M 210,15 V 405 M 405,210 H 15 M 59,90 a 260,260 0 0 0 302,0 m 0,240 A 260,260 0 0 0 59,330 M 195,20 a 250,250 0 0 0 0,382 m 30,0 a 250,250 0 0 0 0,-382"
id="path5188" /></g></g><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.33333206px;line-height:1.5;font-family:Verdana;-inkscape-font-specification:Verdana;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
x="3.625"
y="42.300552"
id="text236"><tspan
sodipodi:role="line"
id="tspan234"
x="3.625"
y="97.624832" /></text>
<path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.22626972px;line-height:1.5;font-family:Verdana;-inkscape-font-specification:Verdana;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.31582576"
d="m 30.032087,35.765146 c -0.941155,0 -1.679424,0.297877 -2.214236,0.897073 -0.534805,0.59633 -0.803088,1.408963 -0.803088,2.438204 0,1.020642 0.268283,1.831959 0.803088,2.434022 0.534812,0.599197 1.273081,0.899166 2.214236,0.899166 0.943776,0 1.683255,-0.299969 2.218061,-0.899166 0.534805,-0.602063 0.801179,-1.41338 0.801179,-2.434022 0,-1.029241 -0.267577,-1.841874 -0.805004,-2.438204 -0.537428,-0.599196 -1.275703,-0.897073 -2.214236,-0.897073 z M 4.6754597,35.896884 v 6.404989 H 8.9108061 V 41.06186 H 6.1783862 v -1.582951 h 2.535472 v -1.237921 h -2.535472 v -1.104092 h 2.7324199 v -1.240012 z m 4.8950284,0 2.0344959,3.178447 -2.0765627,3.226542 h 1.6673697 l 1.284944,-2.107813 1.261999,2.107813 h 1.747679 l -2.076563,-3.291366 2.044056,-3.113623 h -1.671192 l -1.254351,1.996984 -1.218021,-1.996984 z m 6.7612579,0 v 6.404989 h 1.508663 v -2.086901 h 0.940763 c 0.427322,0 0.78312,-0.06337 1.068875,-0.19238 0.288377,-0.129014 0.550647,-0.320664 0.783969,-0.572957 0.170406,-0.186354 0.300229,-0.415605 0.391986,-0.687967 0.09175,-0.275228 0.137672,-0.55601 0.137672,-0.842708 0,-0.369839 -0.06155,-0.687681 -0.187386,-0.951442 C 20.853071,36.703757 20.673012,36.488432 20.437067,36.319282 20.240449,36.178801 20.01327,36.074426 19.756353,36.00562 19.502058,35.93395 19.187858,35.896884 18.81559,35.896884 Z m 5.898892,0 v 6.404989 H 26.4526 V 41.06186 h -2.7133 v -5.164976 z m 11.96987,0 v 6.404989 h 1.501016 v -2.348287 h 0.696013 l 1.59662,2.348287 h 1.845202 l -1.954193,-2.745594 c 0.372269,-0.197819 0.657391,-0.44417 0.856629,-0.742334 0.201861,-0.298166 0.302115,-0.685411 0.302115,-1.15846 0,-0.344036 -0.06395,-0.628763 -0.195036,-0.855253 -0.128457,-0.229358 -0.303703,-0.414972 -0.523913,-0.558321 -0.217597,-0.143348 -0.450791,-0.237199 -0.699839,-0.280205 -0.249056,-0.04301 -0.546916,-0.06483 -0.892962,-0.06483 z m 6.306174,0 v 6.404989 h 4.235349 V 41.06186 h -2.732419 v -1.582951 h 2.537381 v -1.237921 h -2.537381 v -1.104092 h 2.732419 v -1.240012 z m -10.47077,1.074817 c 0.18876,0 0.370017,0.03969 0.543047,0.1171 0.175645,0.07741 0.329031,0.202285 0.462731,0.374303 0.131078,0.166285 0.238053,0.385016 0.31932,0.65451 0.08127,0.269496 0.12238,0.594454 0.12238,0.978628 0,0.358371 -0.03627,0.672267 -0.107079,0.938896 -0.07075,0.263762 -0.180163,0.493012 -0.326977,0.687967 -0.131079,0.172017 -0.283263,0.299526 -0.458907,0.382668 -0.175644,0.08027 -0.360513,0.119192 -0.554515,0.119192 -0.193995,0 -0.378864,-0.03892 -0.554516,-0.119192 -0.175644,-0.08027 -0.32974,-0.205152 -0.460818,-0.374304 -0.131078,-0.169152 -0.23614,-0.387881 -0.317415,-0.654509 -0.07864,-0.269495 -0.118547,-0.59523 -0.118547,-0.976537 0,-0.372706 0.04113,-0.697664 0.122372,-0.978627 0.0839,-0.28383 0.190155,-0.506505 0.32124,-0.667055 0.141565,-0.172019 0.296865,-0.29558 0.464644,-0.370124 0.170402,-0.07454 0.351665,-0.112916 0.54304,-0.112916 z m 5.665612,0.104557 h 0.546865 c 0.180896,0 0.339799,0.0052 0.476121,0.01673 0.136327,0.0086 0.255325,0.03568 0.357565,0.08155 0.146807,0.06594 0.251382,0.157162 0.311677,0.27184 0.06026,0.114679 0.08987,0.251394 0.08987,0.411944 0,0.18062 -0.02473,0.326001 -0.07457,0.434946 -0.04719,0.106078 -0.122675,0.203875 -0.227537,0.292751 -0.110113,0.09175 -0.246664,0.149848 -0.4092,0.175651 -0.162536,0.0258 -0.36495,0.03974 -0.606141,0.03974 H 35.70153 Z m -17.861115,0.01673 h 0.260049 c 0.249052,0 0.449062,0.0039 0.598493,0.01255 0.149431,0.0058 0.301612,0.04411 0.458909,0.112918 0.117972,0.05161 0.222541,0.142051 0.311676,0.273932 0.08914,0.129013 0.133847,0.283602 0.133847,0.464221 0,0.183485 -0.02236,0.34148 -0.06693,0.470494 -0.04193,0.126146 -0.111421,0.234466 -0.208421,0.326208 -0.112729,0.103209 -0.252883,0.172614 -0.420667,0.207018 -0.165161,0.0344 -0.375994,0.05019 -0.632911,0.05019 h -0.434052 z"
id="text240"
inkscape:connector-curvature="0" /><path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.22626972px;line-height:1.5;font-family:Verdana;-inkscape-font-specification:Verdana;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.31582576"
d="m 30.03125,85.759766 c -0.941155,0 -1.678079,0.297288 -2.212891,0.896484 -0.534805,0.59633 -0.802734,1.408259 -0.802734,2.4375 0,1.020642 0.267929,1.833484 0.802734,2.435547 0.534812,0.599197 1.271736,0.898437 2.212891,0.898437 0.943776,0 1.683944,-0.29924 2.21875,-0.898437 0.534805,-0.602063 0.800781,-1.414905 0.800781,-2.435547 0,-1.029241 -0.26726,-1.84117 -0.804687,-2.4375 -0.537428,-0.599196 -1.276311,-0.896484 -2.214844,-0.896484 z M 4.6757812,85.890625 v 6.40625 h 4.234375 V 91.056641 H 6.1777344 V 89.472656 H 8.7128906 V 88.234375 H 6.1777344 v -1.103516 h 2.7324218 v -1.240234 z m 4.8945313,0 2.0351565,3.179687 -2.0761721,3.226563 h 1.6660151 l 1.285157,-2.109375 1.261719,2.109375 h 1.748046 l -2.076172,-3.292969 2.042969,-3.113281 h -1.669922 l -1.253906,1.998047 -1.21875,-1.998047 z m 6.7617185,0 v 6.40625 h 1.507813 v -2.087891 h 0.941406 c 0.427322,0 0.782604,-0.0624 1.068359,-0.191406 0.288377,-0.129014 0.551835,-0.321926 0.785157,-0.574219 0.170406,-0.186354 0.298868,-0.415138 0.390625,-0.6875 0.09175,-0.275228 0.138672,-0.555099 0.138671,-0.841797 0,-0.369838 -0.06166,-0.689363 -0.1875,-0.953124 C 20.853345,86.697176 20.673445,86.483603 20.4375,86.314453 20.240882,86.173972 20.012776,86.068806 19.755859,86 19.501564,85.92833 19.188674,85.890625 18.816406,85.890625 Z m 5.898438,0 v 6.40625 h 4.222656 v -1.240234 h -2.712891 v -5.166016 z m 11.970703,0 v 6.40625 h 1.5 v -2.349609 h 0.697266 l 1.595703,2.349609 h 1.845703 l -1.955078,-2.746094 c 0.372269,-0.197819 0.658183,-0.444023 0.857422,-0.742187 0.201861,-0.298166 0.300781,-0.685154 0.300781,-1.158203 0,-0.344036 -0.06227,-0.628979 -0.19336,-0.855469 -0.128457,-0.229358 -0.30518,-0.415245 -0.52539,-0.558594 -0.217597,-0.143348 -0.450171,-0.238244 -0.699219,-0.28125 -0.249056,-0.04301 -0.546532,-0.06445 -0.892578,-0.06445 z m 6.304687,0 v 6.40625 h 4.236329 v -1.240234 h -2.732422 v -1.583985 h 2.537109 v -1.238281 h -2.537109 v -1.103516 h 2.732422 v -1.240234 z m -10.470703,1.076172 c 0.18876,0 0.369939,0.03978 0.542969,0.117187 0.175645,0.07741 0.329191,0.201029 0.462891,0.373047 0.131078,0.166285 0.239045,0.384803 0.320312,0.654297 0.08127,0.269496 0.121094,0.594342 0.121094,0.978516 0,0.358371 -0.03466,0.672824 -0.105469,0.939453 -0.07075,0.263762 -0.181311,0.492545 -0.328125,0.6875 -0.131079,0.172017 -0.28334,0.29967 -0.458984,0.382812 -0.175644,0.08027 -0.360686,0.119141 -0.554688,0.119141 -0.193995,0 -0.379035,-0.03887 -0.554687,-0.119141 -0.175644,-0.08027 -0.327907,-0.203894 -0.458985,-0.373047 -0.131078,-0.169151 -0.237084,-0.389621 -0.318359,-0.65625 -0.07864,-0.269495 -0.119141,-0.595255 -0.119141,-0.976562 0,-0.372706 0.04181,-0.697553 0.123047,-0.978516 0.0839,-0.28383 0.189228,-0.505465 0.320313,-0.666015 0.141565,-0.172019 0.297065,-0.29655 0.464844,-0.371094 0.170401,-0.07454 0.351593,-0.111328 0.542968,-0.111328 z m 5.666016,0.103515 h 0.546875 c 0.180896,0 0.34024,0.006 0.476562,0.01758 0.136327,0.0086 0.255182,0.03421 0.357422,0.08008 0.146807,0.06594 0.252205,0.158759 0.3125,0.273437 0.06026,0.114679 0.08984,0.25156 0.08984,0.41211 0,0.18062 -0.02633,0.324648 -0.07617,0.433593 -0.04719,0.106078 -0.1217,0.204093 -0.226562,0.292969 -0.110113,0.09175 -0.247621,0.149978 -0.410157,0.175781 -0.162536,0.0258 -0.364277,0.03906 -0.605468,0.03906 H 35.70117 Z m -17.861328,0.01758 h 0.259765 c 0.249052,0 0.450179,0.0031 0.59961,0.01172 0.149431,0.0058 0.301687,0.04447 0.458984,0.113282 0.117972,0.05161 0.221412,0.141556 0.310547,0.273437 0.08914,0.129013 0.134766,0.284225 0.134766,0.464844 0,0.183485 -0.02184,0.341689 -0.06641,0.470703 -0.04193,0.126146 -0.111984,0.23443 -0.208984,0.326172 -0.112729,0.103209 -0.252138,0.172627 -0.419922,0.207031 -0.165161,0.0344 -0.375895,0.04883 -0.632812,0.04883 h -0.435547 z"
id="path4755"
inkscape:connector-curvature="0" /><path
inkscape:connector-curvature="0"
id="path4758"
d="m 30.03125,135.8579 c -0.941155,0 -1.678079,0.29729 -2.212891,0.89648 -0.534805,0.59633 -0.802734,1.40826 -0.802734,2.4375 0,1.02064 0.267929,1.83349 0.802734,2.43555 0.534812,0.5992 1.271736,0.89844 2.212891,0.89844 0.943776,0 1.683944,-0.29924 2.21875,-0.89844 0.534805,-0.60206 0.800781,-1.41491 0.800781,-2.43555 0,-1.02924 -0.26726,-1.84117 -0.804687,-2.4375 -0.537428,-0.59919 -1.276311,-0.89648 -2.214844,-0.89648 z m -25.3554688,0.13086 v 6.40625 h 4.234375 v -1.24024 H 6.1777344 v -1.58398 h 2.5351562 v -1.23828 H 6.1777344 v -1.10352 h 2.7324218 v -1.24023 z m 4.8945313,0 2.0351565,3.17968 -2.0761721,3.22657 h 1.6660151 l 1.285157,-2.10938 1.261719,2.10938 h 1.748046 l -2.076172,-3.29297 2.042969,-3.11328 h -1.669922 l -1.253906,1.99804 -1.21875,-1.99804 z m 6.7617185,0 v 6.40625 h 1.507813 v -2.08789 h 0.941406 c 0.427322,0 0.782604,-0.0624 1.068359,-0.19141 0.288377,-0.12901 0.551835,-0.32193 0.785157,-0.57422 0.170406,-0.18635 0.298868,-0.41514 0.390625,-0.6875 0.09175,-0.27523 0.138672,-0.5551 0.138671,-0.8418 0,-0.36983 -0.06166,-0.68936 -0.1875,-0.95312 -0.123217,-0.26376 -0.303117,-0.47734 -0.539062,-0.64649 -0.196618,-0.14048 -0.424724,-0.24564 -0.681641,-0.31445 -0.254295,-0.0717 -0.567185,-0.10937 -0.939453,-0.10937 z m 5.898438,0 v 6.40625 h 4.222656 v -1.24024 h -2.712891 v -5.16601 z m 11.970703,0 v 6.40625 h 1.5 v -2.34961 h 0.697266 l 1.595703,2.34961 h 1.845703 l -1.955078,-2.7461 c 0.372269,-0.19782 0.658183,-0.44402 0.857422,-0.74218 0.201861,-0.29817 0.300781,-0.68516 0.300781,-1.15821 0,-0.34403 -0.06227,-0.62898 -0.19336,-0.85547 -0.128457,-0.22935 -0.30518,-0.41524 -0.52539,-0.55859 -0.217597,-0.14335 -0.450171,-0.23824 -0.699219,-0.28125 -0.249056,-0.043 -0.546532,-0.0644 -0.892578,-0.0644 z m 6.304687,0 v 6.40625 h 4.236329 v -1.24024 h -2.732422 v -1.58398 h 2.537109 v -1.23828 h -2.537109 v -1.10352 h 2.732422 v -1.24023 z m -10.470703,1.07617 c 0.18876,0 0.369939,0.0398 0.542969,0.11719 0.175645,0.0774 0.329191,0.20102 0.462891,0.37304 0.131078,0.16629 0.239045,0.38481 0.320312,0.6543 0.08127,0.2695 0.121094,0.59434 0.121094,0.97852 0,0.35837 -0.03466,0.67282 -0.105469,0.93945 -0.07075,0.26376 -0.181311,0.49254 -0.328125,0.6875 -0.131079,0.17202 -0.28334,0.29967 -0.458984,0.38281 -0.175644,0.0803 -0.360686,0.11914 -0.554688,0.11914 -0.193995,0 -0.379035,-0.0389 -0.554687,-0.11914 -0.175644,-0.0803 -0.327907,-0.20389 -0.458985,-0.37305 -0.131078,-0.16915 -0.237084,-0.38962 -0.318359,-0.65625 -0.07864,-0.26949 -0.119141,-0.59525 -0.119141,-0.97656 0,-0.3727 0.04181,-0.69755 0.123047,-0.97851 0.0839,-0.28383 0.189228,-0.50547 0.320313,-0.66602 0.141565,-0.17202 0.297065,-0.29655 0.464844,-0.37109 0.170401,-0.0745 0.351593,-0.11133 0.542968,-0.11133 z m 5.666016,0.10351 h 0.546875 c 0.180896,0 0.34024,0.006 0.476562,0.0176 0.136327,0.009 0.255182,0.0342 0.357422,0.0801 0.146807,0.0659 0.252205,0.15876 0.3125,0.27344 0.06026,0.11468 0.08984,0.25156 0.08984,0.41211 0,0.18062 -0.02633,0.32465 -0.07617,0.43359 -0.04719,0.10608 -0.1217,0.2041 -0.226562,0.29297 -0.110113,0.0917 -0.247621,0.14998 -0.410157,0.17578 -0.162536,0.0258 -0.364277,0.0391 -0.605468,0.0391 H 35.70117 Z m -17.861328,0.0176 h 0.259765 c 0.249052,0 0.450179,0.003 0.59961,0.0117 0.149431,0.006 0.301687,0.0445 0.458984,0.11329 0.117972,0.0516 0.221412,0.14155 0.310547,0.27343 0.08914,0.12902 0.134766,0.28423 0.134766,0.46485 0,0.18348 -0.02184,0.34169 -0.06641,0.4707 -0.04193,0.12615 -0.111984,0.23443 -0.208984,0.32617 -0.112729,0.10321 -0.252138,0.17263 -0.419922,0.20703 -0.165161,0.0344 -0.375895,0.0488 -0.632812,0.0488 h -0.435547 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.22626972px;line-height:1.5;font-family:Verdana;-inkscape-font-specification:Verdana;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.31582576" /><path
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.22626972px;line-height:1.5;font-family:Verdana;-inkscape-font-specification:Verdana;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.31582576"
d="m 30.03125,185.9639 c -0.941155,0 -1.678079,0.29729 -2.212891,0.89648 -0.534805,0.59633 -0.802734,1.40826 -0.802734,2.4375 0,1.02064 0.267929,1.83349 0.802734,2.43555 0.534812,0.5992 1.271736,0.89844 2.212891,0.89844 0.943776,0 1.683944,-0.29924 2.21875,-0.89844 0.534805,-0.60206 0.800781,-1.41491 0.800781,-2.43555 0,-1.02924 -0.26726,-1.84117 -0.804687,-2.4375 -0.537428,-0.59919 -1.276311,-0.89648 -2.214844,-0.89648 z m -25.3554688,0.13086 v 6.40625 h 4.234375 v -1.24024 H 6.1777344 v -1.58398 h 2.5351562 v -1.23828 H 6.1777344 v -1.10352 h 2.7324218 v -1.24023 z m 4.8945313,0 2.0351565,3.17968 -2.0761721,3.22657 h 1.6660151 l 1.285157,-2.10938 1.261719,2.10938 h 1.748046 l -2.076172,-3.29297 2.042969,-3.11328 h -1.669922 l -1.253906,1.99804 -1.21875,-1.99804 z m 6.7617185,0 v 6.40625 h 1.507813 v -2.08789 h 0.941406 c 0.427322,0 0.782604,-0.0624 1.068359,-0.19141 0.288377,-0.12901 0.551835,-0.32193 0.785157,-0.57422 0.170406,-0.18635 0.298868,-0.41514 0.390625,-0.6875 0.09175,-0.27523 0.138672,-0.5551 0.138671,-0.8418 0,-0.36983 -0.06166,-0.68936 -0.1875,-0.95312 -0.123217,-0.26376 -0.303117,-0.47734 -0.539062,-0.64649 -0.196618,-0.14048 -0.424724,-0.24564 -0.681641,-0.31445 -0.254295,-0.0717 -0.567185,-0.10937 -0.939453,-0.10937 z m 5.898438,0 v 6.40625 h 4.222656 v -1.24024 h -2.712891 v -5.16601 z m 11.970703,0 v 6.40625 h 1.5 v -2.34961 h 0.697266 l 1.595703,2.34961 h 1.845703 l -1.955078,-2.7461 c 0.372269,-0.19782 0.658183,-0.44402 0.857422,-0.74218 0.201861,-0.29817 0.300781,-0.68516 0.300781,-1.15821 0,-0.34403 -0.06227,-0.62898 -0.19336,-0.85547 -0.128457,-0.22935 -0.30518,-0.41524 -0.52539,-0.55859 -0.217597,-0.14335 -0.450171,-0.23824 -0.699219,-0.28125 -0.249056,-0.043 -0.546532,-0.0644 -0.892578,-0.0644 z m 6.304687,0 v 6.40625 h 4.236329 v -1.24024 h -2.732422 v -1.58398 h 2.537109 v -1.23828 h -2.537109 v -1.10352 h 2.732422 v -1.24023 z m -10.470703,1.07617 c 0.18876,0 0.369939,0.0398 0.542969,0.11719 0.175645,0.0774 0.329191,0.20102 0.462891,0.37304 0.131078,0.16629 0.239045,0.38481 0.320312,0.6543 0.08127,0.2695 0.121094,0.59434 0.121094,0.97852 0,0.35837 -0.03466,0.67282 -0.105469,0.93945 -0.07075,0.26376 -0.181311,0.49254 -0.328125,0.6875 -0.131079,0.17202 -0.28334,0.29967 -0.458984,0.38281 -0.175644,0.0803 -0.360686,0.11914 -0.554688,0.11914 -0.193995,0 -0.379035,-0.0389 -0.554687,-0.11914 -0.175644,-0.0803 -0.327907,-0.20389 -0.458985,-0.37305 -0.131078,-0.16915 -0.237084,-0.38962 -0.318359,-0.65625 -0.07864,-0.26949 -0.119141,-0.59525 -0.119141,-0.97656 0,-0.3727 0.04181,-0.69755 0.123047,-0.97851 0.0839,-0.28383 0.189228,-0.50547 0.320313,-0.66602 0.141565,-0.17202 0.297065,-0.29655 0.464844,-0.37109 0.170401,-0.0745 0.351593,-0.11133 0.542968,-0.11133 z m 5.666016,0.10351 h 0.546875 c 0.180896,0 0.34024,0.006 0.476562,0.0176 0.136327,0.009 0.255182,0.0342 0.357422,0.0801 0.146807,0.0659 0.252205,0.15876 0.3125,0.27344 0.06026,0.11468 0.08984,0.25156 0.08984,0.41211 0,0.18062 -0.02633,0.32465 -0.07617,0.43359 -0.04719,0.10608 -0.1217,0.2041 -0.226562,0.29297 -0.110113,0.0917 -0.247621,0.14998 -0.410157,0.17578 -0.162536,0.0258 -0.364277,0.0391 -0.605468,0.0391 H 35.70117 Z m -17.861328,0.0176 h 0.259765 c 0.249052,0 0.450179,0.003 0.59961,0.0117 0.149431,0.006 0.301687,0.0445 0.458984,0.11329 0.117972,0.0516 0.221412,0.14155 0.310547,0.27343 0.08914,0.12902 0.134766,0.28423 0.134766,0.46485 0,0.18348 -0.02184,0.34169 -0.06641,0.4707 -0.04193,0.12615 -0.111984,0.23443 -0.208984,0.32617 -0.112729,0.10321 -0.252138,0.17263 -0.419922,0.20703 -0.165161,0.0344 -0.375895,0.0488 -0.632812,0.0488 h -0.435547 z"
id="path4760"
inkscape:connector-curvature="0" /></svg>

Before

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,217 +0,0 @@
/*!
* jQuery fancyTable plugin
* https://github.com/myspace-nu
*
* Copyright 2018 Johan Johansson
* Released under the MIT license
*/
(function($) {
$.fn.fancyTable = function(options) {
var settings = $.extend({
inputStyle: "",
inputPlaceholder: "Search...",
pagination: false,
paginationClass: "btn btn-light",
paginationClassActive: "active",
pagClosest: 3,
perPage: 10,
sortable: true,
searchable: true,
onInit: function(){ },
onUpdate: function(){ },
testing: false
}, options);
var instance = this;
this.settings = settings;
this.tableUpdate = function (elm) {
elm.fancyTable.matches = 0;
$(elm).find("tbody tr").each(function() {
var n=0;
var match = true;
var globalMatch = false;
$(this).find("td").each(function() {
if(!settings.globalSearch && elm.fancyTable.searchArr[n] && !(new RegExp(elm.fancyTable.searchArr[n],"i").test($(this).html()))){
match = false;
} else if(settings.globalSearch && (!elm.fancyTable.search || (new RegExp(elm.fancyTable.search,"i").test($(this).html())))){
if(!Array.isArray(settings.globalSearchExcludeColumns) || !settings.globalSearchExcludeColumns.includes(n+1)){
globalMatch = true;
}
}
n++;
});
if((settings.globalSearch && globalMatch) || (!settings.globalSearch && match)){
elm.fancyTable.matches++
if(!settings.pagination || (elm.fancyTable.matches>(elm.fancyTable.perPage*(elm.fancyTable.page-1)) && elm.fancyTable.matches<=(elm.fancyTable.perPage*elm.fancyTable.page))){
$(this).show();
} else {
$(this).hide();
}
} else {
$(this).hide();
}
});
elm.fancyTable.pages = Math.ceil(elm.fancyTable.matches/elm.fancyTable.perPage);
if(settings.pagination){
var paginationElement = (elm.fancyTable.paginationElement) ? $(elm.fancyTable.paginationElement) : $(elm).find(".pag");
paginationElement.empty();
for(var n=1; n<=elm.fancyTable.pages; n++){
if(n==1 || (n>(elm.fancyTable.page-(settings.pagClosest+1)) && n<(elm.fancyTable.page+(settings.pagClosest+1))) || n==elm.fancyTable.pages){
var a = $("<a>",{
html:n,
"data-n": n,
style:"margin:0.2em",
class:settings.paginationClass+" "+((n==elm.fancyTable.page)?settings.paginationClassActive:"")
}).css("cursor","pointer").bind("click",function(){
elm.fancyTable.page = $(this).data("n");
instance.tableUpdate(elm);
});
if(n==elm.fancyTable.pages && elm.fancyTable.page<(elm.fancyTable.pages-settings.pagClosest-1)){
paginationElement.append($("<span>...</span>"));
}
paginationElement.append(a);
if(n==1 && elm.fancyTable.page>settings.pagClosest+2){
paginationElement.append($("<span>...</span>"));
}
}
}
}
settings.onUpdate.call(this,elm);
};
this.reinit = function(elm){
$(this).each(function(){
$(this).find("th a").contents().unwrap();
$(this).find("tr.fancySearchRow").remove();
});
$(this).fancyTable(this.settings);
};
this.tableSort = function (elm) {
if(typeof elm.fancyTable.sortColumn !== "undefined" && elm.fancyTable.sortColumn < elm.fancyTable.nColumns){
$(elm).find("thead th div.sortArrow").each(function(){
$(this).remove();
});
var sortArrow = $("<div>",{"class":"sortArrow"}).css({"margin":"0.1em","display":"inline-block","width":0,"height":0,"border-left":"0.4em solid transparent","border-right":"0.4em solid transparent"});
sortArrow.css(
(elm.fancyTable.sortOrder>0) ?
{"border-top":"0.4em solid #000"} :
{"border-bottom":"0.4em solid #000"}
);
$(elm).find("thead th a").eq(elm.fancyTable.sortColumn).append(sortArrow);
var rows = $(elm).find("tbody tr").toArray().sort(
function(a, b) {
var stra = $(a).find("td").eq(elm.fancyTable.sortColumn).html();
var strb = $(b).find("td").eq(elm.fancyTable.sortColumn).html();
if(elm.fancyTable.sortAs[elm.fancyTable.sortColumn] == 'numeric'){
return((elm.fancyTable.sortOrder>0) ? parseFloat(stra)-parseFloat(strb) : parseFloat(strb)-parseFloat(stra));
} else {
return((stra<strb)?-elm.fancyTable.sortOrder:(stra>strb)?elm.fancyTable.sortOrder:0);
}
}
);
$(elm).find("tbody").empty().append(rows);
}
};
this.each(function() {
if($(this).prop("tagName")!=="TABLE"){
console.warn("fancyTable: Element is not a table.");
return true;
}
var elm = this;
elm.fancyTable = {
nColumns: $(elm).find("td").first().parent().find("td").length,
nRows : $(this).find("tbody tr").length,
perPage : settings.perPage,
page : 1,
pages : 0,
matches : 0,
searchArr : [],
search : "",
sortColumn : settings.sortColumn,
sortOrder : (typeof settings.sortOrder === "undefined") ? 1 : (new RegExp("desc","i").test(settings.sortOrder) || settings.sortOrder == -1) ? -1 : 1,
sortAs:[], // undefined or numeric
paginationElement : settings.paginationElement
};
if($(elm).find("tbody").length==0){
var content = $(elm).html();
$(elm).empty();
$(elm).append("<tbody>").append($(content));
}
if($(elm).find("thead").length==0){
$(elm).prepend($("<thead>"));
// Maybe add generated headers at some point
//var c=$(elm).find("tr").first().find("td").length;
//for(var n=0; n<c; n++){
// $(elm).find("thead").append($("<th></th>"));
//}
}
if(settings.sortable){
var n=0;
$(elm).find("thead th").each(function() {
elm.fancyTable.sortAs.push(($(this).data('sortas')=='numeric')?'numeric':'');
var content = $(this).html();
var a = $("<a>",{
html:content,
"data-n": n,
class:""
}).css("cursor","pointer").bind("click",function(){
if(elm.fancyTable.sortColumn == $(this).data("n")){
elm.fancyTable.sortOrder=-elm.fancyTable.sortOrder;
} else {
elm.fancyTable.sortOrder=1;
}
elm.fancyTable.sortColumn = $(this).data("n");
instance.tableSort(elm);
instance.tableUpdate(elm);
});
$(this).empty();
$(this).append(a);
n++;
});
}
if(settings.searchable){
var searchHeader = $("<tr>").addClass("fancySearchRow");
if(settings.globalSearch){
var searchField = $("<input>",{
"placeholder": settings.inputPlaceholder,
style:"width:100%;"+settings.inputStyle
}).bind("change paste keyup",function(){
elm.fancyTable.search = $(this).val();
elm.fancyTable.page = 1;
instance.tableUpdate(elm);
});
var th = $("<th>",{ style:"padding:2px;" }).attr("colspan",elm.fancyTable.nColumns);
$(searchField).appendTo($(th));
$(th).appendTo($(searchHeader));
} else {
var n=0;
$(elm).find("td").first().parent().find("td").each(function() {
elm.fancyTable.searchArr.push("");
var searchField = $("<input>",{
"data-n": n,
"placeholder": settings.inputPlaceholder,
style:"width:100%;"+settings.inputStyle
}).bind("change paste keyup",function(){
elm.fancyTable.searchArr[$(this).data("n")] = $(this).val();
elm.fancyTable.page = 1;
instance.tableUpdate(elm);
});
var th = $("<th>",{ style:"padding:2px;" });
$(searchField).appendTo($(th));
$(th).appendTo($(searchHeader));
n++;
});
}
searchHeader.appendTo($(elm).find("thead"));
}
// Sort
instance.tableSort(elm);
if(settings.pagination && !settings.paginationElement){
$(elm).find("tfoot").remove();
$(elm).append($("<tfoot><tr></tr></tfoot>"));
$(elm).find("tfoot tr").append($("<td class='pag'></td>",{ }).attr("colspan",elm.fancyTable.nColumns));
}
instance.tableUpdate(elm);
settings.onInit.call(this,elm);
});
return this;
};
}(jQuery));

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,25 @@
> *Note:* Please use the main [MaterialDesign](https://github.com/Templarian/MaterialDesign/issues) repo to report issues. This repo is for distribution of the Webfont files only.
# Webfont - Material Design Icons
Webfont distribution for the [Material Design Icons](https://materialdesignicons.com).
```
npm install @mdi/font
```
> Package built with [@mdi/font-build](https://github.com/Templarian/MaterialDesign-Font-Build).
## Related Packages
[NPM @MDI Organization](https://npmjs.com/org/mdi)
- JavaScript/Typescript: [MaterialDesign-JS](https://github.com/Templarian/MaterialDesign-JS)
- SVG: [MaterialDesign-SVG](https://github.com/Templarian/MaterialDesign-SVG)
- Font-Build [MaterialDesign-Font-Build](https://github.com/Templarian/MaterialDesign-Font-Build)
- Desktop Font: [MaterialDesign-Font](https://github.com/Templarian/MaterialDesign-Font)
## Learn More
- [MaterialDesignIcons.com](https://materialdesignicons.com)
- https://github.com/Templarian/MaterialDesign

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,97 @@
Copyright (c) 2014, Austin Andrews (http://materialdesignicons.com/),
with Reserved Font Name Material Design Icons.
Copyright (c) 2014, Google (http://www.google.com/design/)
uses the license at https://github.com/google/material-design-icons/blob/master/LICENSE
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View file

@ -0,0 +1,28 @@
{
"name": "@mdi/font",
"version": "5.5.55",
"description": "Dist for Material Design Webfont. This includes the Stock and Community icons in a single webfont collection.",
"style": "css/materialdesignicons.css",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/Templarian/MaterialDesign-Webfont.git"
},
"keywords": [
"material",
"design",
"icons",
"webfont"
],
"author": {
"name": "Austin Andrews",
"web": "http://twitter.com/templarian"
},
"license": "(OFL-1.1 AND MIT)",
"bugs": {
"url": "https://github.com/Templarian/MaterialDesign/issues"
},
"homepage": "https://materialdesignicons.com"
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,27 @@
// From Font Awesome
.#{$mdi-css-prefix}-spin:before {
-webkit-animation: #{$mdi-css-prefix}-spin 2s infinite linear;
animation: #{$mdi-css-prefix}-spin 2s infinite linear;
}
@-webkit-keyframes #{$mdi-css-prefix}-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes #{$mdi-css-prefix}-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}

View file

@ -0,0 +1,10 @@
.#{$mdi-css-prefix}:before,
.#{$mdi-css-prefix}-set {
display: inline-block;
font: normal normal normal #{$mdi-font-size-base}/1 '#{$mdi-font-name}'; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094
line-height: inherit;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

View file

@ -0,0 +1,65 @@
$mdi-sizes: 18 24 36 48 !default;
@each $mdi-size in $mdi-sizes {
.#{$mdi-css-prefix}-#{$mdi-size}px {
&.#{$mdi-css-prefix}-set,
&.#{$mdi-css-prefix}:before {
font-size: $mdi-size * 1px;
}
}
}
.#{$mdi-css-prefix}-dark {
&:before {
color: rgba(0, 0, 0, 0.54);
}
&.#{$mdi-css-prefix}-inactive:before {
color: rgba(0, 0, 0, 0.26);
}
}
.#{$mdi-css-prefix}-light {
&:before {
color: rgba(255, 255, 255, 1);
}
&.#{$mdi-css-prefix}-inactive:before {
color: rgba(255, 255, 255, 0.3);
}
}
$mdi-degrees: 45 90 135 180 225 270 315 !default;
@each $mdi-degree in $mdi-degrees {
.#{$mdi-css-prefix}-rotate-#{$mdi-degree}{
&:before {
-webkit-transform: rotate(#{$mdi-degree}deg);
-ms-transform: rotate(#{$mdi-degree}deg);
transform: rotate(#{$mdi-degree}deg);
}
/*
// Not included in production
&.#{$mdi-css-prefix}-flip-h:before {
-webkit-transform: scaleX(-1) rotate(#{$mdi-degree}deg);
transform: scaleX(-1) rotate(#{$mdi-degree}deg);
filter: FlipH;
-ms-filter: "FlipH";
}
&.#{$mdi-css-prefix}-flip-v:before {
-webkit-transform: scaleY(-1) rotate(#{$mdi-degree}deg);
-ms-transform: rotate(#{$mdi-degree}deg);
transform: scaleY(-1) rotate(#{$mdi-degree}deg);
filter: FlipV;
-ms-filter: "FlipV";
}
*/
}
}
.#{$mdi-css-prefix}-flip-h:before {
-webkit-transform: scaleX(-1);
transform: scaleX(-1);
filter: FlipH;
-ms-filter: "FlipH";
}
.#{$mdi-css-prefix}-flip-v:before {
-webkit-transform: scaleY(-1);
transform: scaleY(-1);
filter: FlipV;
-ms-filter: "FlipV";
}

View file

@ -0,0 +1,20 @@
@function char($character-code) {
@if function-exists("selector-append") {
@return unquote("\"\\#{$character-code}\"");
}
@if "\\#{'x'}" == "\\x" {
@return str-slice("\x", 1, 1) + $character-code;
}
@else {
@return #{"\"\\"}#{$character-code + "\""};
}
}
@function mdi($name) {
@if map-has-key($mdi-icons, $name) == false {
@warn "Icon #{$name} not found.";
@return "";
}
@return char(map-get($mdi-icons, $name));
}

View file

@ -0,0 +1,10 @@
@each $key, $value in $mdi-icons {
.#{$mdi-css-prefix}-#{$key}::before {
content: char($value);
}
}
.#{$mdi-css-prefix}-blank::before {
content: "\F68C";
visibility: hidden;
}

View file

@ -0,0 +1,10 @@
@font-face {
font-family: '#{$mdi-font-name}';
src: url('#{$mdi-font-path}/#{$mdi-filename}-webfont.eot?v=#{$mdi-version}');
src: url('#{$mdi-font-path}/#{$mdi-filename}-webfont.eot?#iefix&v=#{$mdi-version}') format('embedded-opentype'),
url('#{$mdi-font-path}/#{$mdi-filename}-webfont.woff2?v=#{$mdi-version}') format('woff2'),
url('#{$mdi-font-path}/#{$mdi-filename}-webfont.woff?v=#{$mdi-version}') format('woff'),
url('#{$mdi-font-path}/#{$mdi-filename}-webfont.ttf?v=#{$mdi-version}') format('truetype');
font-weight: normal;
font-style: normal;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
/* MaterialDesignIcons.com */
@import "variables";
@import "functions";
@import "path";
@import "core";
@import "icons";
@import "extras";
@import "animated";

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -183,7 +183,7 @@ Controller.mousePressEvent.connect(function (event) {
for (var i = 0; i < notificationList.length; i++) {
if (overlay === notificationList[i].id) {
Overlays.deleteOverlay(notificationList[i].id)
Messages.sendMessage(MAIN_CHAT_APP_CHANNEL, JSON.stringify({
Messages.sendLocalMessage(MAIN_CHAT_APP_CHANNEL, JSON.stringify({
type: "ShowChatWindow",
}));
}