mirror of
https://github.com/lubosz/overte.git
synced 2025-04-23 13:33:38 +02:00
working on toybox script, squeezeHands, and default mappings
This commit is contained in:
parent
b3f6c45fa3
commit
23fea1f221
4 changed files with 101 additions and 35 deletions
|
@ -11,6 +11,8 @@
|
|||
//
|
||||
Script.include("http://s3.amazonaws.com/hifi-public/scripts/libraries/toolBars.js");
|
||||
|
||||
HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/";
|
||||
|
||||
var nullActionID = "00000000-0000-0000-0000-000000000000";
|
||||
var controllerID;
|
||||
var controllerActive;
|
||||
|
@ -20,7 +22,7 @@ var leftHandActionID = nullActionID;
|
|||
var rightHandActionID = nullActionID;
|
||||
|
||||
var TRIGGER_THRESHOLD = 0.2;
|
||||
var GRAB_RADIUS = 0.25;
|
||||
var GRAB_RADIUS = 0.15;
|
||||
|
||||
var LEFT_HAND_CLICK = Controller.findAction("LEFT_HAND_CLICK");
|
||||
var RIGHT_HAND_CLICK = Controller.findAction("RIGHT_HAND_CLICK");
|
||||
|
@ -32,7 +34,7 @@ var leftHandGrabAction = LEFT_HAND_CLICK;
|
|||
|
||||
var rightHandGrabValue = 0;
|
||||
var leftHandGrabValue = 0;
|
||||
var prevRightHandGrabValue = 0;
|
||||
var prevRightHandGrabValue = 0
|
||||
var prevLeftHandGrabValue = 0;
|
||||
|
||||
var grabColor = { red: 0, green: 255, blue: 0};
|
||||
|
@ -46,8 +48,8 @@ var toolBar = new ToolBar(0, 0, ToolBar.vertical, "highfidelity.toybox.toolbar",
|
|||
});
|
||||
|
||||
var BUTTON_SIZE = 32;
|
||||
var SWORD_IMAGE = "https://hifi-public.s3.amazonaws.com/images/sword/sword.svg"; // replace this with a table icon
|
||||
var CLEANUP_IMAGE = "http://s3.amazonaws.com/hifi-public/images/delete.png"; // cleanup table
|
||||
var SWORD_IMAGE = "https://hifi-public.s3.amazonaws.com/images/sword/sword.svg"; // TODO: replace this with a table icon
|
||||
var CLEANUP_IMAGE = "http://s3.amazonaws.com/hifi-public/images/delete.png";
|
||||
var tableButton = toolBar.addOverlay("image", {
|
||||
width: BUTTON_SIZE,
|
||||
height: BUTTON_SIZE,
|
||||
|
@ -61,20 +63,25 @@ var cleanupButton = toolBar.addOverlay("image", {
|
|||
alpha: 1
|
||||
});
|
||||
|
||||
var leftHandOverlay = Overlays.addOverlay("sphere", {
|
||||
var overlays = true;
|
||||
var leftHandOverlay;
|
||||
var rightHandOverlay;
|
||||
if (overlays) {
|
||||
leftHandOverlay = Overlays.addOverlay("sphere", {
|
||||
position: MyAvatar.getLeftPalmPosition(),
|
||||
size: GRAB_RADIUS,
|
||||
color: releaseColor,
|
||||
alpha: 0.5,
|
||||
solid: false
|
||||
});
|
||||
var rightHandOverlay = Overlays.addOverlay("sphere", {
|
||||
rightHandOverlay = Overlays.addOverlay("sphere", {
|
||||
position: MyAvatar.getRightPalmPosition(),
|
||||
size: GRAB_RADIUS,
|
||||
color: releaseColor,
|
||||
alpha: 0.5,
|
||||
solid: false
|
||||
});
|
||||
}
|
||||
|
||||
var OBJECT_HEIGHT_OFFSET = 0.5;
|
||||
var MIN_OBJECT_SIZE = 0.05;
|
||||
|
@ -86,9 +93,9 @@ var TABLE_DIMENSIONS = {
|
|||
};
|
||||
|
||||
var GRAVITY = {
|
||||
x: 0,
|
||||
y: -2,
|
||||
z: 0
|
||||
x: 0.0,
|
||||
y: -2.0,
|
||||
z: 0.0
|
||||
}
|
||||
|
||||
var LEFT = 0;
|
||||
|
@ -101,6 +108,8 @@ var tableEntities = Array(NUM_OBJECTS + 1); // Also includes table
|
|||
|
||||
var VELOCITY_MAG = 0.3;
|
||||
|
||||
var entitiesToResize = [];
|
||||
|
||||
var MODELS = Array(
|
||||
{ modelURL: "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.fbx" },
|
||||
{ modelURL: "https://s3.amazonaws.com/hifi-public/marketplace/hificontent/Vehicles/clara/spaceshuttle.fbx" },
|
||||
|
@ -113,11 +122,20 @@ var MODELS = Array(
|
|||
{ modelURL: "https://hifi-public.s3.amazonaws.com/marketplace/contents/029db3d4-da2c-4cb2-9c08-b9612ba576f5/02949063e7c4aed42ad9d1a58461f56d.fst?1427169842" },
|
||||
{ modelURL: "https://hifi-public.s3.amazonaws.com/models/props/MidCenturyModernLivingRoom/Interior/Bar.fbx" },
|
||||
{ modelURL: "https://hifi-public.s3.amazonaws.com/marketplace/contents/96124d04-d603-4707-a5b3-e03bf47a53b2/1431770eba362c1c25c524126f2970fb.fst?1436924721" }
|
||||
// Complex models:
|
||||
// { modelURL: "https://s3.amazonaws.com/hifi-public/marketplace/hificontent/Architecture/sketchfab/cudillero.fbx" },
|
||||
// { modelURL: "https://hifi-public.s3.amazonaws.com/ozan/sets/musicality/musicality.fbx" },
|
||||
// { modelURL: "https://hifi-public.s3.amazonaws.com/ozan/sets/statelyHome/statelyHome.fbx" }
|
||||
);
|
||||
|
||||
var COLLISION_SOUNDS = Array(
|
||||
"http://public.highfidelity.io/sounds/Collisions-ballhitsandcatches/pingpong_TableBounceMono.wav",
|
||||
"http://public.highfidelity.io/sounds/Collisions-ballhitsandcatches/billiards/collision1.wav"
|
||||
);
|
||||
|
||||
var RESIZE_TIMER = 0.0;
|
||||
var RESIZE_WAIT = 0.05; // 50 milliseconds
|
||||
|
||||
function letGo(hand) {
|
||||
var actionIDToRemove = (hand == LEFT) ? leftHandActionID : rightHandActionID;
|
||||
var entityIDToEdit = (hand == LEFT) ? leftHandObjectID : rightHandObjectID;
|
||||
|
@ -126,6 +144,7 @@ function letGo(hand) {
|
|||
MyAvatar.getRightPalmAngularVelocity();
|
||||
if (actionIDToRemove != nullActionID && entityIDToEdit != null) {
|
||||
Entities.deleteAction(entityIDToEdit, actionIDToRemove);
|
||||
// TODO: upon successful letGo, restore collision groups
|
||||
if (hand == LEFT) {
|
||||
leftHandObjectID = null;
|
||||
leftHandActionID = nullActionID;
|
||||
|
@ -143,11 +162,11 @@ function setGrabbedObject(hand) {
|
|||
var minDistance = GRAB_RADIUS;
|
||||
for (var i = 0; i < entities.length; i++) {
|
||||
if ((hand == LEFT && entities[i] == rightHandObjectID) ||
|
||||
(hand == RIGHT) && entities[i] == leftHandObjectID) {
|
||||
(hand == RIGHT && entities[i] == leftHandObjectID)) {
|
||||
continue;
|
||||
} else {
|
||||
var distance = Vec3.distance(Entities.getEntityProperties(entities[i]).position, handPosition);
|
||||
if (distance < minDistance) {
|
||||
if (distance <= minDistance) {
|
||||
objectID = entities[i];
|
||||
minDistance = distance;
|
||||
}
|
||||
|
@ -170,15 +189,17 @@ function grab(hand) {
|
|||
}
|
||||
var objectID = (hand == LEFT) ? leftHandObjectID : rightHandObjectID;
|
||||
var handRotation = (hand == LEFT) ? MyAvatar.getLeftPalmRotation() : MyAvatar.getRightPalmRotation();
|
||||
var handPosition = (hand == LEFT) ? MyAvatar.getLeftPalmPosition() : MyAvatar.getRightPalmPosition();
|
||||
|
||||
var objectRotation = Entities.getEntityProperties(objectID).rotation;
|
||||
var offsetRotation = Quat.multiply(Quat.inverse(handRotation), objectRotation);
|
||||
|
||||
var objectPosition = Entities.getEntityProperties(objectID).position;
|
||||
var offset = Vec3.subtract(objectPosition, handPosition);
|
||||
var offsetPosition = Vec3.multiplyQbyV(Quat.inverse(Quat.multiply(handRotation, offsetRotation)), offset);
|
||||
// print(JSON.stringify(offsetPosition));
|
||||
var actionID = Entities.addAction("hold", objectID, {
|
||||
relativePosition: {
|
||||
x: 0.0,
|
||||
y: 0.0,
|
||||
z: 0.0
|
||||
},
|
||||
relativePosition: { x: 0, y: 0, z: 0 },
|
||||
relativeRotation: offsetRotation,
|
||||
hand: (hand == LEFT) ? "left" : "right",
|
||||
timeScale: 0.05
|
||||
|
@ -190,7 +211,7 @@ function grab(hand) {
|
|||
rightHandObjectID = null;
|
||||
}
|
||||
} else {
|
||||
// Entities.editEntity(objectID, { ignore});
|
||||
// TODO: upon successful grab, add to collision group so object doesn't collide with immovable entities
|
||||
if (hand == LEFT) {
|
||||
leftHandActionID = actionID;
|
||||
} else {
|
||||
|
@ -199,28 +220,65 @@ function grab(hand) {
|
|||
}
|
||||
}
|
||||
|
||||
function update() {
|
||||
Overlays.editOverlay(leftHandOverlay, { position: MyAvatar.getLeftPalmPosition() });
|
||||
Overlays.editOverlay(rightHandOverlay, { position: MyAvatar.getRightPalmPosition() });
|
||||
function resizeModels() {
|
||||
var newEntitiesToResize = [];
|
||||
for (var i = 0; i < entitiesToResize.length; i++) {
|
||||
var naturalDimensions = Entities.getEntityProperties(entitiesToResize[i]).naturalDimensions;
|
||||
if (naturalDimensions.x != 1.0 || naturalDimensions.y != 1.0 || naturalDimensions.z != 1.0) {
|
||||
// bigger range of sizes for models
|
||||
var dimensions = Vec3.multiply(randFloat(MIN_OBJECT_SIZE, 3.0*MAX_OBJECT_SIZE), Vec3.normalize(naturalDimensions));
|
||||
Entities.editEntity(entitiesToResize[i], {
|
||||
dimensions: dimensions,
|
||||
shapeType: "box"
|
||||
});
|
||||
} else {
|
||||
newEntitiesToResize.push(entitiesToResize[i]);
|
||||
}
|
||||
|
||||
}
|
||||
entitiesToResize = newEntitiesToResize;
|
||||
}
|
||||
|
||||
function update(deltaTime) {
|
||||
if (overlays) {
|
||||
Overlays.editOverlay(leftHandOverlay, { position: MyAvatar.getLeftPalmPosition() });
|
||||
Overlays.editOverlay(rightHandOverlay, { position: MyAvatar.getRightPalmPosition() });
|
||||
}
|
||||
|
||||
// if (tableCreated && RESIZE_TIMER < RESIZE_WAIT) {
|
||||
// RESIZE_TIMER += deltaTime;
|
||||
// } else if (tableCreated) {
|
||||
// resizeModels();
|
||||
// }
|
||||
|
||||
rightHandGrabValue = Controller.getActionValue(rightHandGrabAction);
|
||||
leftHandGrabValue = Controller.getActionValue(leftHandGrabAction);
|
||||
|
||||
if (rightHandGrabValue > TRIGGER_THRESHOLD && rightHandObjectID == null) {
|
||||
Overlays.editOverlay(rightHandOverlay, { color: grabColor });
|
||||
if (rightHandGrabValue > TRIGGER_THRESHOLD &&
|
||||
prevRightHandGrabValue < TRIGGER_THRESHOLD) {
|
||||
if (overlays) {
|
||||
Overlays.editOverlay(rightHandOverlay, { color: grabColor });
|
||||
}
|
||||
grab(RIGHT);
|
||||
} else if (rightHandGrabValue < TRIGGER_THRESHOLD &&
|
||||
prevRightHandGrabValue > TRIGGER_THRESHOLD) {
|
||||
Overlays.editOverlay(rightHandOverlay, { color: releaseColor });
|
||||
if (overlays) {
|
||||
Overlays.editOverlay(rightHandOverlay, { color: releaseColor });
|
||||
}
|
||||
letGo(RIGHT);
|
||||
}
|
||||
|
||||
if (leftHandGrabValue > TRIGGER_THRESHOLD && leftHandObjectID == null) {
|
||||
Overlays.editOverlay(leftHandOverlay, { color: grabColor });
|
||||
if (leftHandGrabValue > TRIGGER_THRESHOLD &&
|
||||
prevLeftHandGrabValue < TRIGGER_THRESHOLD) {
|
||||
if (overlays) {
|
||||
Overlays.editOverlay(leftHandOverlay, { color: grabColor });
|
||||
}
|
||||
grab(LEFT);
|
||||
} else if (leftHandGrabValue < TRIGGER_THRESHOLD &&
|
||||
prevLeftHandGrabValue > TRIGGER_THRESHOLD) {
|
||||
Overlays.editOverlay(leftHandOverlay, { color: releaseColor });
|
||||
if (overlays) {
|
||||
Overlays.editOverlay(leftHandOverlay, { color: releaseColor });
|
||||
}
|
||||
letGo(LEFT);
|
||||
}
|
||||
|
||||
|
@ -231,8 +289,10 @@ function update() {
|
|||
function cleanUp() {
|
||||
letGo(RIGHT);
|
||||
letGo(LEFT);
|
||||
Overlays.deleteOverlay(leftHandOverlay);
|
||||
Overlays.deleteOverlay(rightHandOverlay);
|
||||
if (overlays) {
|
||||
Overlays.deleteOverlay(leftHandOverlay);
|
||||
Overlays.deleteOverlay(rightHandOverlay);
|
||||
}
|
||||
removeTable();
|
||||
toolBar.cleanup();
|
||||
}
|
||||
|
@ -268,11 +328,14 @@ randInt = function(low, high) {
|
|||
function createTable() {
|
||||
var tablePosition = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(MyAvatar.orientation)));
|
||||
tableEntities[0] = Entities.addEntity( {
|
||||
type: "Box",
|
||||
type: "Model",
|
||||
shapeType: 'box',
|
||||
position: tablePosition,
|
||||
dimensions: TABLE_DIMENSIONS,
|
||||
rotation: MyAvatar.orientation,
|
||||
color: { red: 255, green: 0, blue: 0 }
|
||||
// color: { red: 102, green: 51, blue: 0 },
|
||||
modelURL: HIFI_PUBLIC_BUCKET + 'eric/models/woodFloor.fbx',
|
||||
collisionSoundURL: "http://public.highfidelity.io/sounds/dice/diceCollide.wav"
|
||||
});
|
||||
|
||||
for (var i = 1; i < NUM_OBJECTS + 1; i++) {
|
||||
|
@ -308,7 +371,8 @@ function createTable() {
|
|||
restitution: 0.01,
|
||||
density: 0.5,
|
||||
collisionsWillMove: true,
|
||||
color: { red: randInt(0, 255), green: randInt(0, 255), blue: randInt(0, 255) }
|
||||
color: { red: randInt(0, 255), green: randInt(0, 255), blue: randInt(0, 255) },
|
||||
// collisionSoundURL: COLLISION_SOUNDS[randInt(0, COLLISION_SOUNDS.length)]
|
||||
});
|
||||
if (type == "Model") {
|
||||
var randModel = randInt(0, MODELS.length);
|
||||
|
@ -316,11 +380,13 @@ function createTable() {
|
|||
shapeType: "box",
|
||||
modelURL: MODELS[randModel].modelURL
|
||||
});
|
||||
entitiesToResize.push(tableEntities[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function removeTable() {
|
||||
RESIZE_TIMER = 0.0;
|
||||
for (var i = 0; i < tableEntities.length; i++) {
|
||||
Entities.deleteEntity(tableEntities[i]);
|
||||
}
|
|
@ -535,8 +535,8 @@ void SixenseManager::assignDefaultInputMapping(UserInputMapper& mapper) {
|
|||
mapper.addInputChannel(UserInputMapper::LEFT_HAND, makeInput(LEFT_HAND));
|
||||
mapper.addInputChannel(UserInputMapper::RIGHT_HAND, makeInput(RIGHT_HAND));
|
||||
|
||||
mapper.addInputChannel(UserInputMapper::LEFT_HAND_CLICK, makeInput(BUTTON_FWD, 0));
|
||||
mapper.addInputChannel(UserInputMapper::RIGHT_HAND_CLICK, makeInput(BUTTON_FWD, 1));
|
||||
mapper.addInputChannel(UserInputMapper::LEFT_HAND_CLICK, makeInput(BACK_TRIGGER, 0));
|
||||
mapper.addInputChannel(UserInputMapper::RIGHT_HAND_CLICK, makeInput(BACK_TRIGGER, 1));
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -394,8 +394,8 @@ void ViveControllerManager::assignDefaultInputMapping(UserInputMapper& mapper) {
|
|||
mapper.addInputChannel(UserInputMapper::ACTION1, makeInput(GRIP_BUTTON, 0));
|
||||
mapper.addInputChannel(UserInputMapper::ACTION2, makeInput(GRIP_BUTTON, 1));
|
||||
|
||||
mapper.addInputChannel(UserInputMapper::LEFT_HAND_CLICK, makeInput(TRIGGER_BUTTON, 0));
|
||||
mapper.addInputChannel(UserInputMapper::RIGHT_HAND_CLICK, makeInput(TRIGGER_BUTTON, 1));
|
||||
mapper.addInputChannel(UserInputMapper::LEFT_HAND_CLICK, makeInput(BACK_TRIGGER, 0));
|
||||
mapper.addInputChannel(UserInputMapper::RIGHT_HAND_CLICK, makeInput(BACK_TRIGGER, 1));
|
||||
|
||||
// Hands
|
||||
mapper.addInputChannel(UserInputMapper::LEFT_HAND, makeInput(LEFT_HAND));
|
||||
|
|
Loading…
Reference in a new issue