Merge pull request #9849 from hyperlogic/feature/can-touch-this

More accurate and responsive stylus and finger touching.
This commit is contained in:
Anthony Thibault 2017-03-10 17:07:11 -08:00 committed by GitHub
commit d7c6531d13
8 changed files with 630 additions and 404 deletions

View file

@ -17,6 +17,7 @@ module.exports = {
"Clipboard": false, "Clipboard": false,
"Controller": false, "Controller": false,
"DialogsManager": false, "DialogsManager": false,
"DebugDraw": false,
"Entities": false, "Entities": false,
"FaceTracker": false, "FaceTracker": false,
"GlobalServices": false, "GlobalServices": false,

View file

@ -609,6 +609,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
} }
} }
// make sure the debug draw singleton is initialized on the main thread.
DebugDraw::getInstance().removeMarker("");
_runningMarker.startRunningMarker(); _runningMarker.startRunningMarker();

View file

@ -346,7 +346,9 @@ void AnimDebugDraw::update() {
numVerts += (int)markerMap.size() * VERTICES_PER_BONE; numVerts += (int)markerMap.size() * VERTICES_PER_BONE;
auto myAvatarMarkerMap = DebugDraw::getInstance().getMyAvatarMarkerMap(); auto myAvatarMarkerMap = DebugDraw::getInstance().getMyAvatarMarkerMap();
numVerts += (int)myAvatarMarkerMap.size() * VERTICES_PER_BONE; numVerts += (int)myAvatarMarkerMap.size() * VERTICES_PER_BONE;
numVerts += (int)DebugDraw::getInstance().getRays().size() * VERTICES_PER_RAY; auto rays = DebugDraw::getInstance().getRays();
DebugDraw::getInstance().clearRays();
numVerts += (int)rays.size() * VERTICES_PER_RAY;
// allocate verts! // allocate verts!
std::vector<AnimDebugDrawData::Vertex> vertices; std::vector<AnimDebugDrawData::Vertex> vertices;
@ -398,10 +400,9 @@ void AnimDebugDraw::update() {
} }
// draw rays from shared DebugDraw singleton // draw rays from shared DebugDraw singleton
for (auto& iter : DebugDraw::getInstance().getRays()) { for (auto& iter : rays) {
addLine(std::get<0>(iter), std::get<1>(iter), std::get<2>(iter), v); addLine(std::get<0>(iter), std::get<1>(iter), std::get<2>(iter), v);
} }
DebugDraw::getInstance().clearRays();
data._vertexBuffer->resize(sizeof(AnimDebugDrawData::Vertex) * numVerts); data._vertexBuffer->resize(sizeof(AnimDebugDrawData::Vertex) * numVerts);
data._vertexBuffer->setSubData<AnimDebugDrawData::Vertex>(0, vertices); data._vertexBuffer->setSubData<AnimDebugDrawData::Vertex>(0, vertices);

View file

@ -27,10 +27,10 @@ var DEFAULT_SCRIPTS = [
"system/tablet-users.js", "system/tablet-users.js",
"system/selectAudioDevice.js", "system/selectAudioDevice.js",
"system/notifications.js", "system/notifications.js",
"system/controllers/squeezeHands.js",
"system/controllers/controllerDisplayManager.js", "system/controllers/controllerDisplayManager.js",
"system/controllers/handControllerGrab.js", "system/controllers/handControllerGrab.js",
"system/controllers/handControllerPointer.js", "system/controllers/handControllerPointer.js",
"system/controllers/squeezeHands.js",
"system/controllers/grab.js", "system/controllers/grab.js",
"system/controllers/teleport.js", "system/controllers/teleport.js",
"system/controllers/toggleAdvancedMovementForHandControllers.js", "system/controllers/toggleAdvancedMovementForHandControllers.js",

File diff suppressed because it is too large Load diff

View file

@ -11,6 +11,7 @@
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
/* eslint indent: ["error", 4, { "outerIIFEBody": 0 }] */
(function() { // BEGIN LOCAL_SCOPE (function() { // BEGIN LOCAL_SCOPE
@ -25,7 +26,11 @@ var OVERLAY_RAMP_RATE = 8.0;
var animStateHandlerID; var animStateHandlerID;
var isBothIndexesPointing = false; var leftIndexPointingOverride = 0;
var rightIndexPointingOverride = 0;
var leftThumbRaisedOverride = 0;
var rightThumbRaisedOverride = 0;
var HIFI_POINT_INDEX_MESSAGE_CHANNEL = "Hifi-Point-Index"; var HIFI_POINT_INDEX_MESSAGE_CHANNEL = "Hifi-Point-Index";
var isLeftIndexPointing = false; var isLeftIndexPointing = false;
@ -53,7 +58,7 @@ function init() {
"leftHandOverlayAlpha", "leftHandGraspAlpha", "leftHandOverlayAlpha", "leftHandGraspAlpha",
"rightHandOverlayAlpha", "rightHandGraspAlpha", "rightHandOverlayAlpha", "rightHandGraspAlpha",
"isLeftHandGrasp", "isLeftIndexPoint", "isLeftThumbRaise", "isLeftIndexPointAndThumbRaise", "isLeftHandGrasp", "isLeftIndexPoint", "isLeftThumbRaise", "isLeftIndexPointAndThumbRaise",
"isRightHandGrasp", "isRightIndexPoint", "isRightThumbRaise", "isRightIndexPointAndThumbRaise", "isRightHandGrasp", "isRightIndexPoint", "isRightThumbRaise", "isRightIndexPointAndThumbRaise"
] ]
); );
Messages.subscribe(HIFI_POINT_INDEX_MESSAGE_CHANNEL); Messages.subscribe(HIFI_POINT_INDEX_MESSAGE_CHANNEL);
@ -66,21 +71,23 @@ function animStateHandler(props) {
leftHandGraspAlpha: lastLeftTrigger, leftHandGraspAlpha: lastLeftTrigger,
rightHandOverlayAlpha: rightHandOverlayAlpha, rightHandOverlayAlpha: rightHandOverlayAlpha,
rightHandGraspAlpha: lastRightTrigger, rightHandGraspAlpha: lastRightTrigger,
isLeftHandGrasp: !isBothIndexesPointing && !isLeftIndexPointing && !isLeftThumbRaised,
isLeftIndexPoint: (isBothIndexesPointing || isLeftIndexPointing) && !isLeftThumbRaised, isLeftHandGrasp: !isLeftIndexPointing && !isLeftThumbRaised,
isLeftThumbRaise: !isBothIndexesPointing && !isLeftIndexPointing && isLeftThumbRaised, isLeftIndexPoint: isLeftIndexPointing && !isLeftThumbRaised,
isLeftIndexPointAndThumbRaise: (isBothIndexesPointing || isLeftIndexPointing) && isLeftThumbRaised, isLeftThumbRaise: !isLeftIndexPointing && isLeftThumbRaised,
isRightHandGrasp: !isBothIndexesPointing && !isRightIndexPointing && !isRightThumbRaised, isLeftIndexPointAndThumbRaise: isLeftIndexPointing && isLeftThumbRaised,
isRightIndexPoint: (isBothIndexesPointing || isRightIndexPointing) && !isRightThumbRaised,
isRightThumbRaise: !isBothIndexesPointing && !isRightIndexPointing && isRightThumbRaised, isRightHandGrasp: !isRightIndexPointing && !isRightThumbRaised,
isRightIndexPointAndThumbRaise: (isBothIndexesPointing || isRightIndexPointing) && isRightThumbRaised isRightIndexPoint: isRightIndexPointing && !isRightThumbRaised,
isRightThumbRaise: !isRightIndexPointing && isRightThumbRaised,
isRightIndexPointAndThumbRaise: isRightIndexPointing && isRightThumbRaised
}; };
} }
function update(dt) { function update(dt) {
var leftTrigger = clamp(Controller.getValue(Controller.Standard.LT) + Controller.getValue(Controller.Standard.LeftGrip), 0, 1); var leftTrigger = clamp(Controller.getValue(Controller.Standard.LT) + Controller.getValue(Controller.Standard.LeftGrip), 0, 1);
var rightTrigger = clamp(Controller.getValue(Controller.Standard.RT) + Controller.getValue(Controller.Standard.RightGrip), 0, 1); var rightTrigger = clamp(Controller.getValue(Controller.Standard.RT) + Controller.getValue(Controller.Standard.RightGrip), 0, 1);
// Average last few trigger values together for a bit of smoothing // Average last few trigger values together for a bit of smoothing
var tau = clamp(dt / TRIGGER_SMOOTH_TIMESCALE, 0, 1); var tau = clamp(dt / TRIGGER_SMOOTH_TIMESCALE, 0, 1);
lastLeftTrigger = lerp(leftTrigger, lastLeftTrigger, tau); lastLeftTrigger = lerp(leftTrigger, lastLeftTrigger, tau);
@ -103,18 +110,61 @@ function update(dt) {
} }
// Pointing index fingers and raising thumbs // Pointing index fingers and raising thumbs
isLeftIndexPointing = leftHandPose.valid && Controller.getValue(Controller.Standard.LeftIndexPoint) === 1; isLeftIndexPointing = (leftIndexPointingOverride > 0) || (leftHandPose.valid && Controller.getValue(Controller.Standard.LeftIndexPoint) === 1);
isRightIndexPointing = rightHandPose.valid && Controller.getValue(Controller.Standard.RightIndexPoint) === 1; isRightIndexPointing = (rightIndexPointingOverride > 0) || (rightHandPose.valid && Controller.getValue(Controller.Standard.RightIndexPoint) === 1);
isLeftThumbRaised = leftHandPose.valid && Controller.getValue(Controller.Standard.LeftThumbUp) === 1; isLeftThumbRaised = (leftThumbRaisedOverride > 0) || (leftHandPose.valid && Controller.getValue(Controller.Standard.LeftThumbUp) === 1);
isRightThumbRaised = rightHandPose.valid && Controller.getValue(Controller.Standard.RightThumbUp) === 1; isRightThumbRaised = (rightThumbRaisedOverride > 0) || (rightHandPose.valid && Controller.getValue(Controller.Standard.RightThumbUp) === 1);
} }
function handleMessages(channel, message, sender) { function handleMessages(channel, message, sender) {
if (sender === MyAvatar.sessionUUID && channel === HIFI_POINT_INDEX_MESSAGE_CHANNEL) { if (sender === MyAvatar.sessionUUID && channel === HIFI_POINT_INDEX_MESSAGE_CHANNEL) {
var data = JSON.parse(message); var data = JSON.parse(message);
if (data.pointIndex !== undefined) { if (data.pointIndex !== undefined) {
print("pointIndex: " + data.pointIndex); if (data.pointIndex) {
isBothIndexesPointing = data.pointIndex; leftIndexPointingOverride++;
rightIndexPointingOverride++;
} else {
leftIndexPointingOverride--;
rightIndexPointingOverride--;
}
}
if (data.pointLeftIndex !== undefined) {
if (data.pointLeftIndex) {
leftIndexPointingOverride++;
} else {
leftIndexPointingOverride--;
}
}
if (data.pointRightIndex !== undefined) {
if (data.pointRightIndex) {
rightIndexPointingOverride++;
} else {
rightIndexPointingOverride--;
}
}
if (data.raiseThumbs !== undefined) {
if (data.raiseThumbs) {
leftThumbRaisedOverride++;
rightThumbRaisedOverride++;
} else {
leftThumbRaisedOverride--;
rightThumbRaisedOverride--;
}
}
if (data.raiseLeftThumb !== undefined) {
if (data.raiseLeftThumb) {
leftThumbRaisedOverride++;
} else {
leftThumbRaisedOverride--;
}
}
if (data.raiseRightThumb !== undefined) {
if (data.raiseRightThumb) {
rightThumbRaisedOverride++;
} else {
rightThumbRaisedOverride--;
}
} }
} }
} }

View file

@ -13,6 +13,7 @@
button, button,
BUTTON_NAME = "PAINT", BUTTON_NAME = "PAINT",
isFingerPainting = false, isFingerPainting = false,
shouldPointFingers = false,
leftHand = null, leftHand = null,
rightHand = null, rightHand = null,
leftBrush = null, leftBrush = null,
@ -308,9 +309,14 @@
Messages.sendMessage(HIFI_POINTER_DISABLE_MESSAGE_CHANNEL, JSON.stringify({ Messages.sendMessage(HIFI_POINTER_DISABLE_MESSAGE_CHANNEL, JSON.stringify({
pointerEnabled: enabled pointerEnabled: enabled
}), true); }), true);
Messages.sendMessage(HIFI_POINT_INDEX_MESSAGE_CHANNEL, JSON.stringify({
pointIndex: !enabled var newShouldPointFingers = !enabled;
}), true); if (newShouldPointFingers !== shouldPointFingers) {
Messages.sendMessage(HIFI_POINT_INDEX_MESSAGE_CHANNEL, JSON.stringify({
pointIndex: newShouldPointFingers
}), true);
shouldPointFingers = newShouldPointFingers;
}
} }
function enableProcessing() { function enableProcessing() {
@ -430,4 +436,4 @@
setUp(); setUp();
Script.scriptEnding.connect(tearDown); Script.scriptEnding.connect(tearDown);
}()); }());

View file

@ -175,11 +175,11 @@ WebTablet = function (url, width, dpi, hand, clientOnly, location) {
isAA: HMD.active isAA: HMD.active
}); });
var HOME_BUTTON_Y_OFFSET = (this.height / 2) - 0.009; var HOME_BUTTON_Y_OFFSET = (this.height / 2) - (this.height / 20);
this.homeButtonID = Overlays.addOverlay("sphere", { this.homeButtonID = Overlays.addOverlay("sphere", {
name: "homeButton", name: "homeButton",
localPosition: {x: -0.001, y: -HOME_BUTTON_Y_OFFSET, z: 0.0}, localPosition: {x: -0.001, y: -HOME_BUTTON_Y_OFFSET, z: 0.0},
localRotation: Quat.angleAxis(0, Y_AXIS), localRotation: {x: 0, y: 1, z: 0, w: 0},
dimensions: { x: 4 * tabletScaleFactor, y: 4 * tabletScaleFactor, z: 4 * tabletScaleFactor}, dimensions: { x: 4 * tabletScaleFactor, y: 4 * tabletScaleFactor, z: 4 * tabletScaleFactor},
alpha: 0.0, alpha: 0.0,
visible: true, visible: true,