mirror of
https://github.com/AleziaKurdis/Overte-community-apps.git
synced 2025-04-06 22:13:56 +02:00
Inventory app initial release (v2.0.2)
This commit is contained in:
parent
e6a3299a57
commit
2076334315
14 changed files with 389 additions and 55 deletions
1
applications/inventory-app/css/app.b8b71034.css
Normal file
1
applications/inventory-app/css/app.b8b71034.css
Normal file
|
@ -0,0 +1 @@
|
|||
.draggable-card{background-color:#272727;margin:5px 0}.draggable-card .handle{width:40px!important}.top-level-folder{background-color:#272727}.top-level-folder .v-list-group__header__prepend-icon{background-color:rgba(0,0,0,.3);width:50px;height:50px;margin:5px 5px 7px 0!important;padding:5px 18px 5px 8px}.top-level-folder .handle{width:40px!important}.top-level-folder .folder-icon{margin-right:10px}.top-level-folder .folder-button{font-size:.795rem!important}.v-list-group .column-item{max-width:100%!important;margin-top:5px;margin-bottom:5px}.v-list-group .draggable-card{background-color:rgba(0,0,0,.3);padding-right:16px;padding-left:0!important}.v-list-group .draggable-card .handle{margin-right:16px}.app-version{text-align:center;color:hsla(0,0%,100%,.6);font-weight:lighter}.handle{background-color:rgba(0,0,0,.3)}.inventoryApp::-webkit-scrollbar{width:0!important}
|
File diff suppressed because one or more lines are too long
BIN
applications/inventory-app/favicon.ico
Normal file
BIN
applications/inventory-app/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
1
applications/inventory-app/index.html
Normal file
1
applications/inventory-app/index.html
Normal file
|
@ -0,0 +1 @@
|
|||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=favicon.ico><title>Inventory</title><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css><link href=css/app.b8b71034.css rel=preload as=style><link href=css/chunk-vendors.3e0d3dfb.css rel=preload as=style><link href=js/app.f3f72a7d.js rel=preload as=script><link href=js/chunk-vendors.46609e4a.js rel=preload as=script><link href=css/chunk-vendors.3e0d3dfb.css rel=stylesheet><link href=css/app.b8b71034.css rel=stylesheet></head><body><noscript><strong>We're sorry but Inventory doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.46609e4a.js></script><script src=js/app.f3f72a7d.js></script></body></html>
|
1
applications/inventory-app/inventory-a-msg.svg
Normal file
1
applications/inventory-app/inventory-a-msg.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path fill="#0c0" d="M17,14H19V17H22V19H19V22H17V19H14V17H17V14M10,2H14A2,2 0 0,1 16,4V6H20A2,2 0 0,1 22,8V13.53C20.94,12.58 19.54,12 18,12A6,6 0 0,0 12,18C12,19.09 12.29,20.12 12.8,21H4C2.89,21 2,20.1 2,19V8C2,6.89 2.89,6 4,6H8V4C8,2.89 8.89,2 10,2M14,6V4H10V6H14Z" /></svg>
|
After Width: | Height: | Size: 552 B |
1
applications/inventory-app/inventory-a.svg
Normal file
1
applications/inventory-app/inventory-a.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M16.5,12C19,12 21,14 21,16.5C21,17.38 20.75,18.21 20.31,18.9L23.39,22L22,23.39L18.88,20.32C18.19,20.75 17.37,21 16.5,21C14,21 12,19 12,16.5C12,14 14,12 16.5,12M16.5,14A2.5,2.5 0 0,0 14,16.5A2.5,2.5 0 0,0 16.5,19A2.5,2.5 0 0,0 19,16.5A2.5,2.5 0 0,0 16.5,14M10,2H14A2,2 0 0,1 16,4V6H20A2,2 0 0,1 22,8V13.03C20.85,11.21 18.82,10 16.5,10A6.5,6.5 0 0,0 10,16.5C10,18.25 10.69,19.83 11.81,21H4C2.89,21 2,20.1 2,19V8C2,6.89 2.89,6 4,6H8V4C8,2.89 8.89,2 10,2M14,6V4H10V6H14Z" /></svg>
|
After Width: | Height: | Size: 761 B |
1
applications/inventory-app/inventory-i-msg.svg
Normal file
1
applications/inventory-app/inventory-i-msg.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path fill="#0f0" d="M17,14H19V17H22V19H19V22H17V19H14V17H17V14M10,2H14A2,2 0 0,1 16,4V6H20A2,2 0 0,1 22,8V13.53C20.94,12.58 19.54,12 18,12A6,6 0 0,0 12,18C12,19.09 12.29,20.12 12.8,21H4C2.89,21 2,20.1 2,19V8C2,6.89 2.89,6 4,6H8V4C8,2.89 8.89,2 10,2M14,6V4H10V6H14Z" /></svg>
|
After Width: | Height: | Size: 552 B |
1
applications/inventory-app/inventory-i.svg
Normal file
1
applications/inventory-app/inventory-i.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path fill="white" d="M16.5,12C19,12 21,14 21,16.5C21,17.38 20.75,18.21 20.31,18.9L23.39,22L22,23.39L18.88,20.32C18.19,20.75 17.37,21 16.5,21C14,21 12,19 12,16.5C12,14 14,12 16.5,12M16.5,14A2.5,2.5 0 0,0 14,16.5A2.5,2.5 0 0,0 16.5,19A2.5,2.5 0 0,0 19,16.5A2.5,2.5 0 0,0 16.5,14M10,2H14A2,2 0 0,1 16,4V6H20A2,2 0 0,1 22,8V13.03C20.85,11.21 18.82,10 16.5,10A6.5,6.5 0 0,0 10,16.5C10,18.25 10.69,19.83 11.81,21H4C2.89,21 2,20.1 2,19V8C2,6.89 2.89,6 4,6H8V4C8,2.89 8.89,2 10,2M14,6V4H10V6H14Z" /></svg>
|
After Width: | Height: | Size: 775 B |
293
applications/inventory-app/inventory.js
Normal file
293
applications/inventory-app/inventory.js
Normal file
|
@ -0,0 +1,293 @@
|
|||
//
|
||||
// inventory.js
|
||||
//
|
||||
// Created by kasenvr@gmail.com on 2 Apr 2020
|
||||
// Copyright 2020 Vircadia and contributors.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
(function () { // BEGIN LOCAL_SCOPE
|
||||
var AppUi = Script.require('appUi');
|
||||
var ui;
|
||||
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
||||
|
||||
// VARIABLES
|
||||
var inventoryDataSettingString = "inventoryApp.data";
|
||||
var inventoryData;
|
||||
|
||||
var inventorySettingsString = "inventoryApp.settings";
|
||||
var inventorySettings;
|
||||
|
||||
var RECEIVING_ITEM_QUEUE_LIMIT = 5;
|
||||
var receivingItemQueue = [];
|
||||
|
||||
// APP EVENT AND MESSAGING ROUTING
|
||||
|
||||
function onWebAppEventReceived(event) {
|
||||
var eventJSON = JSON.parse(event);
|
||||
if (eventJSON.app == "inventory") { // This is our web app!
|
||||
// print("inventory.js received a web event: " + event);
|
||||
|
||||
if (eventJSON.command == "ready") {
|
||||
initializeInventoryApp();
|
||||
}
|
||||
|
||||
if (eventJSON.command == "web-to-script-inventory") {
|
||||
receiveInventory(eventJSON.data);
|
||||
}
|
||||
|
||||
if (eventJSON.command == "web-to-script-settings") {
|
||||
receiveSettings(eventJSON.data);
|
||||
}
|
||||
|
||||
if (eventJSON.command == "use-item") {
|
||||
useItem(eventJSON.data);
|
||||
}
|
||||
|
||||
if (eventJSON.command == "share-item") {
|
||||
shareItem(eventJSON.data);
|
||||
}
|
||||
|
||||
if (eventJSON.command == "web-to-script-request-nearby-users") {
|
||||
sendNearbyUsers();
|
||||
}
|
||||
|
||||
if (eventJSON.command == "web-to-script-request-receiving-item-queue") {
|
||||
sendReceivingItemQueue();
|
||||
}
|
||||
|
||||
if (eventJSON.command == "web-to-script-update-receiving-item-queue") {
|
||||
updateReceivingItemQueue(eventJSON.data);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
tablet.webEventReceived.connect(onWebAppEventReceived);
|
||||
|
||||
function sendToWeb(command, data) {
|
||||
var dataToSend = {
|
||||
"app": "inventory",
|
||||
"command": command,
|
||||
"data": data
|
||||
}
|
||||
|
||||
tablet.emitScriptEvent(JSON.stringify(dataToSend));
|
||||
}
|
||||
|
||||
var inventoryMessagesChannel = "com.vircadia.inventory";
|
||||
|
||||
function onMessageReceived(channel, message, sender, localOnly) {
|
||||
if (channel == inventoryMessagesChannel) {
|
||||
var messageJSON = JSON.parse(message);
|
||||
// Window.alert("Passed 0 " + messageJSON.recipient + " vs " + MyAvatar.sessionUUID);
|
||||
if (messageJSON.command == "share-item" && messageJSON.recipient == MyAvatar.sessionUUID) { // We are receiving an item.
|
||||
// Window.alert("Passed 1 " + messageJSON.recipient + " vs " + MyAvatar.sessionUUID);
|
||||
pushReceivedItemToQueue(sender, messageJSON.type, messageJSON.name, messageJSON.url);
|
||||
}
|
||||
}
|
||||
// print("Message received:");
|
||||
// print("- channel: " + channel);
|
||||
// print("- message: " + message);
|
||||
// print("- sender: " + sender);
|
||||
// print("- localOnly: " + localOnly);
|
||||
}
|
||||
|
||||
function sendMessage(dataToSend) {
|
||||
Messages.sendMessage(inventoryMessagesChannel, JSON.stringify(dataToSend));
|
||||
}
|
||||
|
||||
// END APP EVENT AND MESSAGING ROUTING
|
||||
|
||||
// SEND AND RECEIVE INVENTORY STATE
|
||||
|
||||
function receiveInventory(receivedInventoryData) {
|
||||
inventoryData = receivedInventoryData;
|
||||
saveInventory();
|
||||
}
|
||||
|
||||
function sendInventory() {
|
||||
sendToWeb("script-to-web-inventory", inventoryData);
|
||||
}
|
||||
|
||||
// END SEND AND RECEIVE INVENTORY STATE
|
||||
|
||||
// SEND AND RECEIVE SETTINGS STATE
|
||||
|
||||
function receiveSettings(receivedSettingsData) {
|
||||
inventorySettings = receivedSettingsData;
|
||||
saveSettings();
|
||||
}
|
||||
|
||||
function sendSettings() {
|
||||
sendToWeb("script-to-web-settings", inventorySettings);
|
||||
}
|
||||
|
||||
// END SEND AND RECEIVE SETTINGS STATE
|
||||
|
||||
function saveInventory() {
|
||||
Settings.setValue(inventoryDataSettingString, inventoryData);
|
||||
}
|
||||
|
||||
function loadInventory() {
|
||||
inventoryData = Settings.getValue(inventoryDataSettingString);
|
||||
}
|
||||
|
||||
function saveSettings() {
|
||||
Settings.setValue(inventorySettingsString, inventorySettings);
|
||||
}
|
||||
|
||||
function loadSettings() {
|
||||
inventorySettings = Settings.getValue(inventorySettingsString);
|
||||
}
|
||||
|
||||
function pushReceivedItemToQueue(senderUUID, type, name, url) {
|
||||
console.info("Receiving an item:", name, "from:", senderUUID);
|
||||
var getAvatarData = AvatarList.getAvatar(senderUUID);
|
||||
var senderName = getAvatarData.sessionDisplayName;
|
||||
var senderDistance = Vec3.distance(MyAvatar.position, getAvatarData.position);
|
||||
|
||||
var packageRequest = {
|
||||
"senderUUID": senderUUID,
|
||||
"senderName": senderName,
|
||||
"senderDistance": senderDistance,
|
||||
"data": {
|
||||
"type": type,
|
||||
"name": name,
|
||||
"url": url
|
||||
}
|
||||
}
|
||||
|
||||
if (receivingItemQueue.length === RECEIVING_ITEM_QUEUE_LIMIT) {
|
||||
receivingItemQueue = receivingItemQueue.slice(1, 5);
|
||||
}
|
||||
|
||||
receivingItemQueue.push(packageRequest);
|
||||
ui.messagesWaiting(receivingItemQueue.length > 0);
|
||||
}
|
||||
|
||||
function sendReceivingItemQueue() {
|
||||
sendToWeb("script-to-web-receiving-item-queue", receivingItemQueue);
|
||||
}
|
||||
|
||||
function updateReceivingItemQueue(data) {
|
||||
receivingItemQueue = data;
|
||||
ui.messagesWaiting(receivingItemQueue.length > 0);
|
||||
}
|
||||
|
||||
function sendNearbyUsers() {
|
||||
var nearbyUsers = AvatarList.getAvatarsInRange(MyAvatar.position, 25); // Find all users within 25m.
|
||||
var nearbyUsersToSend = [];
|
||||
|
||||
nearbyUsers.forEach(function(user, i) {
|
||||
var objectToWrite;
|
||||
var aviDetails = AvatarList.getAvatar(user)
|
||||
var aviName = aviDetails.displayName;
|
||||
var aviDistance = Vec3.distance(MyAvatar.position, aviDetails.position);
|
||||
// Window.alert("aviName" + aviName + "user" + user + "MyAvatar.sessionUUID" + MyAvatar.sessionUUID);
|
||||
if (user != MyAvatar.sessionUUID || Controller.getValue(Controller.Hardware.Keyboard.Shift)) { // Don't add ourselves to the list!
|
||||
objectToWrite = { "name": aviName, "distance": aviDistance, "uuid": user };
|
||||
nearbyUsersToSend.push(objectToWrite);
|
||||
}
|
||||
});
|
||||
|
||||
sendToWeb("script-to-web-nearby-users", nearbyUsersToSend);
|
||||
}
|
||||
|
||||
function useItem(item) {
|
||||
|
||||
//TODO: Add animation support for avatars...?
|
||||
|
||||
// Convert the item.type before checking it...
|
||||
item.type = item.type.toUpperCase();
|
||||
|
||||
// Depending on the type, we decide how to load this item.
|
||||
if (item.type == "SCRIPT") {
|
||||
ScriptDiscoveryService.loadScript(item.url, true, false, false, true, false); // See SDS.loadScript in APIDocs for more.
|
||||
}
|
||||
|
||||
if (item.type == "MODEL") {
|
||||
var entityID = Entities.addEntity({
|
||||
type: "Model",
|
||||
position: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -1.5 })),
|
||||
rotation: MyAvatar.orientation,
|
||||
modelURL: item.url,
|
||||
collisionless: true,
|
||||
});
|
||||
}
|
||||
|
||||
if (item.type == "AVATAR") {
|
||||
MyAvatar.useFullAvatarURL(item.url);
|
||||
}
|
||||
|
||||
if (item.type == "PLACE") {
|
||||
location.handleLookupString(item.url, true); // https://apidocs.vircadia.dev/location.html#.handleLookupString
|
||||
}
|
||||
|
||||
if (item.type == "JSON") {
|
||||
// https://apidocs.vircadia.dev/Clipboard.html#.importEntities
|
||||
var jsonToLoad = item.url;
|
||||
if (jsonToLoad) {
|
||||
if (Clipboard.importEntities(jsonToLoad)) {
|
||||
Clipboard.pasteEntities(
|
||||
Vec3.sum(
|
||||
MyAvatar.position,
|
||||
Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 0, z: -1.5 })
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (item.type == "UNKNOWN") {
|
||||
// We don't know how to handle this yet.
|
||||
Window.alert("Unknown item type, unable to use.");
|
||||
}
|
||||
}
|
||||
|
||||
function shareItem(data) {
|
||||
data.command = "share-item";
|
||||
sendMessage(data);
|
||||
}
|
||||
|
||||
function initializeInventoryApp() {
|
||||
sendSettings();
|
||||
sendInventory();
|
||||
sendReceivingItemQueue();
|
||||
}
|
||||
|
||||
function onOpened() {
|
||||
console.log("hello world!");
|
||||
}
|
||||
|
||||
function onClosed() {
|
||||
console.log("hello world!");
|
||||
}
|
||||
|
||||
function startup() {
|
||||
|
||||
loadInventory();
|
||||
loadSettings();
|
||||
|
||||
Messages.messageReceived.connect(onMessageReceived);
|
||||
Messages.subscribe(inventoryMessagesChannel);
|
||||
|
||||
ui = new AppUi({
|
||||
buttonName: "INVENTORY",
|
||||
home: Script.resolvePath("index.html"),
|
||||
graphicsDirectory: Script.resolvePath("./"), // Where your button icons are located
|
||||
onOpened: onOpened,
|
||||
onClosed: onClosed
|
||||
});
|
||||
}
|
||||
|
||||
startup();
|
||||
|
||||
Script.scriptEnding.connect(function () {
|
||||
Messages.messageReceived.disconnect(onMessageReceived);
|
||||
Messages.unsubscribe(inventoryMessagesChannel);
|
||||
});
|
||||
|
||||
}()); // END LOCAL_SCOPE
|
2
applications/inventory-app/js/app.f3f72a7d.js
Normal file
2
applications/inventory-app/js/app.f3f72a7d.js
Normal file
File diff suppressed because one or more lines are too long
1
applications/inventory-app/js/app.f3f72a7d.js.map
Normal file
1
applications/inventory-app/js/app.f3f72a7d.js.map
Normal file
File diff suppressed because one or more lines are too long
21
applications/inventory-app/js/chunk-vendors.46609e4a.js
Normal file
21
applications/inventory-app/js/chunk-vendors.46609e4a.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,50 +1,59 @@
|
|||
var metadata = { "applications": [
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "doppelganger-mirror",
|
||||
"name": "Doppelganger-Mirror",
|
||||
"description": "Generate a double of your avatar that only you can see. This allows you to examine your avatar and see how you move. The doppelganger can be grabbed and positioned however you want.",
|
||||
"jsfile": "doppelganger-mirror/app-doppleganger.js",
|
||||
"icon": "doppelganger-mirror/doppleganger-i.svg",
|
||||
"caption": "MIRROR"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "spectator-camera",
|
||||
"name": "Spectator Camera",
|
||||
"description": "Give you a video camera that can display its image on your monitor screen for video capture. It can capture from the camera or from the VR Headset. It can also take classic and spherical 360 snapshots (equirectangular format). Definitely a must.",
|
||||
"jsfile": "spectator-camera/spectatorCamera.js",
|
||||
"icon": "spectator-camera/spectator-i.svg",
|
||||
"caption": "SPECTATOR"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "gravimeter",
|
||||
"name": "Gravimeter",
|
||||
"description": "This application returns a record of the orientation and the position of your avatar. This tool becomes very helpful when you want to build on a sphere with a radial gravity, where it's arduous to evaluate the perpendicularity of the floor.",
|
||||
"jsfile": "gravimeter/gravimeter.js",
|
||||
"icon": "gravimeter/gravimeter_icon.png",
|
||||
"caption": "GRAVITY"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "record",
|
||||
"name": "Record",
|
||||
"description": "With this application, you can make a recording of your avatar (movements and voice), and replay it as a copy of yourself. (Requires an Assignment Client Script to be run on the domain.)",
|
||||
"jsfile": "record/record.js",
|
||||
"icon": "record/icon.svg",
|
||||
"caption": "RECORD"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "domain-navigator",
|
||||
"name": "Domain Navigator",
|
||||
"description": "This tool is to help teleporting yourself rapidly where you need in a domain in a couple of clicks, without having to enter numbers in a path. Ideal for those who are working on large landscapes. (Precision: 80 meters.)",
|
||||
"jsfile": "domain-navigator/dom_nav.js",
|
||||
"icon": "domain-navigator/dom_nav_icon_i.png",
|
||||
"caption": "DOM NAV"
|
||||
},
|
||||
{
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "inventory-app",
|
||||
"name": "Inventory App",
|
||||
"description": "The inventory app allows you to store, use, and share items in Vircadia.",
|
||||
"jsfile": "inventory-app/inventory.js",
|
||||
"icon": "inventory-app/inventory-i.svg",
|
||||
"caption": "INVENTORY"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "doppelganger-mirror",
|
||||
"name": "Doppelganger-Mirror",
|
||||
"description": "Generate a double of your avatar that only you can see. This allows you to examine your avatar and see how you move. The doppelganger can be grabbed and positioned however you want.",
|
||||
"jsfile": "doppelganger-mirror/app-doppleganger.js",
|
||||
"icon": "doppelganger-mirror/doppleganger-i.svg",
|
||||
"caption": "MIRROR"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "spectator-camera",
|
||||
"name": "Spectator Camera",
|
||||
"description": "Give you a video camera that can display its image on your monitor screen for video capture. It can capture from the camera or from the VR Headset. It can also take classic and spherical 360 snapshots (equirectangular format). Definitely a must.",
|
||||
"jsfile": "spectator-camera/spectatorCamera.js",
|
||||
"icon": "spectator-camera/spectator-i.svg",
|
||||
"caption": "SPECTATOR"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "gravimeter",
|
||||
"name": "Gravimeter",
|
||||
"description": "This application returns a record of the orientation and the position of your avatar. This tool becomes very helpful when you want to build on a sphere with a radial gravity, where it's arduous to evaluate the perpendicularity of the floor.",
|
||||
"jsfile": "gravimeter/gravimeter.js",
|
||||
"icon": "gravimeter/gravimeter_icon.png",
|
||||
"caption": "GRAVITY"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "record",
|
||||
"name": "Record",
|
||||
"description": "With this application, you can make a recording of your avatar (movements and voice), and replay it as a copy of yourself. (Requires an Assignment Client Script to be run on the domain.)",
|
||||
"jsfile": "record/record.js",
|
||||
"icon": "record/icon.svg",
|
||||
"caption": "RECORD"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "domain-navigator",
|
||||
"name": "Domain Navigator",
|
||||
"description": "This tool is to help teleporting yourself rapidly where you need in a domain in a couple of clicks, without having to enter numbers in a path. Ideal for those who are working on large landscapes. (Precision: 80 meters.)",
|
||||
"jsfile": "domain-navigator/dom_nav.js",
|
||||
"icon": "domain-navigator/dom_nav_icon_i.png",
|
||||
"caption": "DOM NAV"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "vr-grabscale",
|
||||
"name": "VR Grabscale",
|
||||
|
@ -52,8 +61,8 @@ var metadata = { "applications": [
|
|||
"jsfile": "vr-grabscale/VRBuildGrabScale.js",
|
||||
"icon": "vr-grabscale/logo.png",
|
||||
"caption": "VR SCALE"
|
||||
},
|
||||
{
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "radar",
|
||||
"name": "Radar",
|
||||
|
@ -63,13 +72,13 @@ var metadata = { "applications": [
|
|||
"caption": "RADAR"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
"directory": "refresh-app",
|
||||
"name": "Refresh App",
|
||||
"description": "Add two buttons that refresh your avatar and attachments.",
|
||||
"jsfile": "refresh-app/refreshApp.js",
|
||||
"icon": "refresh-app/refresh-circle-w.png",
|
||||
"caption": "REFRESH"
|
||||
"isActive": true,
|
||||
"directory": "refresh-app",
|
||||
"name": "Refresh App",
|
||||
"description": "Add two buttons that refresh your avatar and attachments.",
|
||||
"jsfile": "refresh-app/refreshApp.js",
|
||||
"icon": "refresh-app/refresh-circle-w.png",
|
||||
"caption": "REFRESH"
|
||||
},
|
||||
{
|
||||
"isActive": true,
|
||||
|
|
Loading…
Reference in a new issue