mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-24 16:25:34 +02:00
127 lines
3.7 KiB
JavaScript
127 lines
3.7 KiB
JavaScript
//
|
|
// Created by Bradley Austin Davis on 2015/08/29
|
|
// Copyright 2015 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
|
|
//
|
|
LEFT_CONTROLLER = 0;
|
|
RIGHT_CONTROLLER = 1;
|
|
|
|
// FIXME add a customizable wand model and a mechanism to switch between wands
|
|
HandController = function(side) {
|
|
this.side = side;
|
|
this.palm = 2 * side;
|
|
this.tip = 2 * side + 1;
|
|
this.action = findAction(side ? "ACTION2" : "ACTION1");
|
|
this.altAction = findAction(side ? "ACTION1" : "ACTION2");
|
|
this.active = false;
|
|
this.tipScale = 1.4;
|
|
this.pointer = Overlays.addOverlay("sphere", {
|
|
position: ZERO_VECTOR,
|
|
size: 0.01,
|
|
color: COLORS.YELLOW,
|
|
alpha: 1.0,
|
|
solid: true,
|
|
visible: false,
|
|
});
|
|
|
|
// Connect to desired events
|
|
var _this = this;
|
|
Controller.actionEvent.connect(function(action, state) {
|
|
_this.onActionEvent(action, state);
|
|
});
|
|
|
|
Script.update.connect(function(deltaTime) {
|
|
_this.onUpdate(deltaTime);
|
|
});
|
|
|
|
Script.scriptEnding.connect(function() {
|
|
_this.onCleanup();
|
|
});
|
|
}
|
|
|
|
HandController.prototype.onActionEvent = function(action, state) {
|
|
var spatialControlCount = Controller.getNumberOfSpatialControls();
|
|
// If only 2 spacial controls, then we only have one controller active, so use either button
|
|
// otherwise, only use the specified action
|
|
|
|
if (action == this.action) {
|
|
if (state) {
|
|
this.onClick();
|
|
} else {
|
|
this.onRelease();
|
|
}
|
|
}
|
|
|
|
if (action == this.altAction) {
|
|
if (state) {
|
|
this.onAltClick();
|
|
} else {
|
|
this.onAltRelease();
|
|
}
|
|
}
|
|
}
|
|
|
|
HandController.prototype.setActive = function(active) {
|
|
if (active == this.active) {
|
|
return;
|
|
}
|
|
logDebug("Hand controller changing active state: " + active);
|
|
this.active = active;
|
|
Overlays.editOverlay(this.pointer, {
|
|
visible: this.active
|
|
});
|
|
Entities.editEntity(this.wand, {
|
|
visible: this.active
|
|
});
|
|
}
|
|
|
|
HandController.prototype.updateControllerState = function() {
|
|
// FIXME this returns data if either the left or right controller is not on the base
|
|
this.palmPos = Controller.getSpatialControlPosition(this.palm);
|
|
var tipPos = Controller.getSpatialControlPosition(this.tip);
|
|
this.tipPosition = scaleLine(this.palmPos, tipPos, this.tipScale);
|
|
// When on the base, hydras report a position of 0
|
|
this.setActive(Vec3.length(this.palmPos) > 0.001);
|
|
|
|
//logDebug(Controller.getTriggerValue(0) + " " + Controller.getTriggerValue(1));
|
|
|
|
//if (this.active) {
|
|
// logDebug("#ctrls " + Controller.getNumberOfSpatialControls() + " Side: " + this.side + " Palm: " + this.palm + " " + vec3toStr(this.palmPos))
|
|
//}
|
|
}
|
|
|
|
HandController.prototype.onCleanup = function() {
|
|
Overlays.deleteOverlay(this.pointer);
|
|
}
|
|
|
|
HandController.prototype.onUpdate = function(deltaTime) {
|
|
this.updateControllerState();
|
|
if (this.active) {
|
|
Overlays.editOverlay(this.pointer, {
|
|
position: this.tipPosition
|
|
});
|
|
Entities.editEntity(this.wand, {
|
|
position: this.tipPosition
|
|
});
|
|
}
|
|
}
|
|
|
|
HandController.prototype.onClick = function() {
|
|
logDebug("Base hand controller does nothing on click");
|
|
}
|
|
|
|
HandController.prototype.onRelease = function() {
|
|
logDebug("Base hand controller does nothing on release");
|
|
}
|
|
|
|
HandController.prototype.onAltClick = function() {
|
|
logDebug("Base hand controller does nothing on alt click");
|
|
}
|
|
|
|
HandController.prototype.onAltRelease = function() {
|
|
logDebug("Base hand controller does nothing on alt click");
|
|
}
|
|
|
|
|