//// Copyright 2023 Overte e.V. let smoothing_settings = { enabled: true, targets: { LeftHand: { transform: 1, rotation: 1 }, RightHand: { transform: 1, rotation: 1 }, LeftFoot: { transform: 1, rotation: 1 }, RightFoot: { transform: 1, rotation: 1 }, Hips: { transform: 1, rotation: 1 }, Spine2: { transform: 1, rotation: 1 }, },}; let mapping;let mapping_settings = { name: "org.overte.controllers.smoothing", channels: [],}; const html_url = Script.resolvePath("./ui/index.html");let tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");let shown = false; tablet.screenChanged.connect(onScreenChanged);Script.scriptEnding.connect(shutdownTabletApp); let tabletButton = tablet.addButton({ text: "AviSmooth", icon: Script.resolvePath("./img/icon.png"), activeIcon: Script.resolvePath("./img/icon-a.png"),}); tabletButton.clicked.connect(() => { tablet.gotoWebScreen(html_url);}); function onScreenChanged(type, url) { if (type !== "Web" || url !== html_url) { tablet.webEventReceived.disconnect(onWebEventReceived); tabletButton.editProperties({ isActive: false }); shown = false; } else { tabletButton.editProperties({ isActive: true }); tablet.webEventReceived.connect(onWebEventReceived); shown = true; smoothing_settings = Settings.getValue( "smoothing_settings", smoothing_settings ); }} function shutdownTabletApp() { if (mapping) mapping.disable(); // Disable custom mapping tablet.removeButton(tabletButton); // Remove the app tablet.screenChanged.disconnect(onScreenChanged); tablet.webEventReceived.disconnect(onWebEventReceived);} const _sendMessage = (message) => tablet.emitScriptEvent(JSON.stringify(message)); function onWebEventReceived(message) { message = JSON.parse(message); if (message.action === "ready") { _sendMessage({ action: "initialize", data: smoothing_settings, }); } if (message.action === "new_settings") { smoothing_settings = message.data; mappingChanged(); } if (message.action === "set_state") { smoothing_settings.enabled = message.data; mappingChanged(); }} function mappingChanged() { Settings.setValue("smoothing_settings", smoothing_settings); if (mapping) mapping.disable(); if (smoothing_settings.enabled) { // Build mapping_settings mapping_settings.channels = []; Object.keys(smoothing_settings.targets).forEach((target) => mapping_settings.channels.push(_generateChannel(target)) ); function _generateChannel(name) { return { from: `Standard.${name}`, to: `Actions.${name}`, filters: [ { type: "exponentialSmoothing", translation: smoothing_settings.targets[name].transform, rotation: smoothing_settings.targets[name].rotation, }, ], }; } mapping = Controller.parseMapping(JSON.stringify(mapping_settings)); mapping.enable(); }}
//
// Copyright 2023 Overte e.V.
let smoothing_settings = {
enabled: true,
targets: {
LeftHand: { transform: 1, rotation: 1 },
RightHand: { transform: 1, rotation: 1 },
LeftFoot: { transform: 1, rotation: 1 },
RightFoot: { transform: 1, rotation: 1 },
Hips: { transform: 1, rotation: 1 },
Spine2: { transform: 1, rotation: 1 },
},
};
let mapping;
let mapping_settings = {
name: "org.overte.controllers.smoothing",
channels: [],
};
const html_url = Script.resolvePath("./ui/index.html");
let tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
let shown = false;
tablet.screenChanged.connect(onScreenChanged);
Script.scriptEnding.connect(shutdownTabletApp);
let tabletButton = tablet.addButton({
text: "AviSmooth",
icon: Script.resolvePath("./img/icon.png"),
activeIcon: Script.resolvePath("./img/icon-a.png"),
});
tabletButton.clicked.connect(() => {
tablet.gotoWebScreen(html_url);
});
function onScreenChanged(type, url) {
if (type !== "Web" || url !== html_url) {
tablet.webEventReceived.disconnect(onWebEventReceived);
tabletButton.editProperties({ isActive: false });
shown = false;
} else {
tabletButton.editProperties({ isActive: true });
tablet.webEventReceived.connect(onWebEventReceived);
shown = true;
smoothing_settings = Settings.getValue(
"smoothing_settings",
smoothing_settings
);
}
}
function shutdownTabletApp() {
if (mapping) mapping.disable(); // Disable custom mapping
tablet.removeButton(tabletButton); // Remove the app
tablet.screenChanged.disconnect(onScreenChanged);
tablet.webEventReceived.disconnect(onWebEventReceived);
}
const _sendMessage = (message) =>
tablet.emitScriptEvent(JSON.stringify(message));
function onWebEventReceived(message) {
message = JSON.parse(message);
if (message.action === "ready") {
_sendMessage({
action: "initialize",
data: smoothing_settings,
});
}
if (message.action === "new_settings") {
smoothing_settings = message.data;
mappingChanged();
}
if (message.action === "set_state") {
smoothing_settings.enabled = message.data;
mappingChanged();
}
}
function mappingChanged() {
Settings.setValue("smoothing_settings", smoothing_settings);
if (mapping) mapping.disable();
if (smoothing_settings.enabled) {
// Build mapping_settings
mapping_settings.channels = [];
Object.keys(smoothing_settings.targets).forEach((target) =>
mapping_settings.channels.push(_generateChannel(target))
);
function _generateChannel(name) {
return {
from: `Standard.${name}`,
to: `Actions.${name}`,
filters: [
{
type: "exponentialSmoothing",
translation: smoothing_settings.targets[name].transform,
rotation: smoothing_settings.targets[name].rotation,
},
],
};
}
mapping = Controller.parseMapping(JSON.stringify(mapping_settings));
mapping.enable();
}
}