content/hifi-content/luis/test_scripts/LookAtApp/lookAtApp.js
2022-02-14 02:04:11 +01:00

165 lines
No EOL
5.4 KiB
JavaScript

//
// Created by Luis Cuenca on 9/13/19
// Copyright 2018 High Fidelity, Inc.
//
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
/* jslint bitwise: true */
/* global Script, AvatarManager, GlobalDebugger, Tablet
*/
(function(){
Script.registerValue("LOOKATCAMERAAPP", true);
var TABLET_BUTTON_NAME = "LOOKACAM";
var HTML_URL = Script.resolvePath("./lookAtApp.html");
var MSG_DOCUMENT_LOADED = 0;
var MSG_CREATE = 1;
var MSG_REFRESH = 2;
var MESSAGES_CHANNEL_REFRESH = "com.highfidelity.interface.lookAtCameraApp:refresh";
Messages.subscribe(MESSAGES_CHANNEL_REFRESH);
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
var tabletButton = tablet.addButton({
text: TABLET_BUTTON_NAME,
icon: Script.resolvePath("./lookAt-i.svg"),
activeIcon: Script.resolvePath("./lookAt-a.svg")
});
var globalData = MyAvatar.getLookAtCameraData();
var lookAtPoint;
var interpolatedLookAt = Vec3.normalize(MyAvatar.getHeadLookAt());
var shown = false;
var clickLookAt = false;
var lookingAtAvatar;
var lookingAvatarOffset;
function manageClick() {
if (shown) {
tablet.gotoHomeScreen();
} else {
tablet.gotoWebScreen(HTML_URL);
}
}
tabletButton.clicked.connect(manageClick);
function onScreenChanged(type, url) {
console.log("Screen changed");
if (type === "Web" && url === HTML_URL) {
tabletButton.editProperties({isActive: true});
if (!shown) {
// hook up to event bridge
tablet.webEventReceived.connect(onWebEventReceived);
}
shown = true;
} else {
tabletButton.editProperties({isActive: false});
if (shown) {
// disconnect from event bridge
tablet.webEventReceived.disconnect(onWebEventReceived);
}
shown = false;
}
}
function onWebEventReceived(msg) {
var message = JSON.parse(msg);
switch(message.type) {
case MSG_REFRESH: {
refresh(message.data, msg);
break;
}
case MSG_DOCUMENT_LOADED: {
tablet.emitScriptEvent(JSON.stringify(
{
"type": MSG_CREATE,
"data": globalData
}
));
break;
}
}
}
tablet.screenChanged.connect(onScreenChanged);
function shutdownTabletApp() {
tablet.removeButton(tabletButton);
if (shown) {
tablet.webEventReceived.disconnect(onWebEventReceived);
tablet.gotoHomeScreen();
}
tablet.screenChanged.disconnect(onScreenChanged);
}
function setValues(data) {
if (clickLookAt != data.clickLookAt) {
clickLookAt = data.clickLookAt;
if (!clickLookAt) {
lookAtPoint = undefined;
} else {
interpolatedLookAt = Vec3.normalize(MyAvatar.getHeadLookAt());
}
}
MyAvatar.setLookAtCameraData(data);
return;
}
function refresh(data, msg) {
setValues(data);
Messages.sendMessage(MESSAGES_CHANNEL_REFRESH, msg);
}
var mousePressEvent = function(event) {
if (!event.isLeftButton) return;
var pickRay = Camera.computePickRay(event.x, event.y);
var intersection = AvatarManager.findRayIntersection({origin: pickRay.origin, direction: pickRay.direction}, [], [], false);
lookingAtAvatar = intersection.intersects ? intersection.avatarID : undefined;
if (!lookingAtAvatar) {
intersection = Entities.findRayIntersection({origin: pickRay.origin, direction: pickRay.direction}, true);
lookAtPoint = intersection.intersection;
} else {
lookingAvatarOffset = Vec3.subtract(AvatarList.getAvatar(lookingAtAvatar).position, intersection.intersection);
}
}
Controller.mousePressEvent.connect(mousePressEvent);
Messages.messageReceived.connect(function(channel, message, senderID) {
if (channel === MESSAGES_CHANNEL_REFRESH) {
globalData = JSON.parse(message).data;
setValues(globalData);
if (globalData) {
tablet.emitScriptEvent(JSON.stringify(
{
"type": MSG_CREATE,
"data": globalData
}
));
}
}
});
Script.update.connect(function() {
if (clickLookAt && lookAtPoint) {
if (lookingAtAvatar) {
lookAtPoint = Vec3.normalize(Vec3.sum(AvatarList.getAvatar(lookingAtAvatar).position, lookingAvatarOffset));
}
interpolatedLookAt = Vec3.mix(interpolatedLookAt, lookAtPoint, Math.pow(globalData.frontLookAtSpeed, 4.0));
MyAvatar.setHeadLookAt(interpolatedLookAt);
}
});
Script.scriptEnding.connect(function () {
shutdownTabletApp();
});
}());