165 lines
No EOL
5.4 KiB
JavaScript
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();
|
|
});
|
|
|
|
}()); |