add beam disabler

This commit is contained in:
James B. Pollack 2015-11-22 22:12:43 -08:00
parent 3f4dee80d9
commit aa832311f5
3 changed files with 111 additions and 47 deletions

View file

@ -109,13 +109,13 @@ var GRABBABLE_PROPERTIES = [
var GRABBABLE_DATA_KEY = "grabbableKey"; // shared with grab.js
var GRAB_USER_DATA_KEY = "grabKey"; // shared with grab.js
var BEAM_DISABLER_KEY = 'beamDisablerKey'
var DEFAULT_GRABBABLE_DATA = {
grabbable: true,
invertSolidWhileHeld: false
};
var disabledHand = 'none';
// states for the state machine
var STATE_OFF = 0;
@ -411,11 +411,6 @@ function MyController(hand) {
this.search = function() {
this.grabbedEntity = null;
// if this hand is the one that's disabled, we don't want to search for anything at all
if (this.hand === disabledHand) {
return;
}
if (this.state == STATE_SEARCHING ? this.triggerSmoothedReleased() : this.bumperReleased()) {
this.setState(STATE_RELEASE);
return;
@ -460,17 +455,7 @@ function MyController(hand) {
// the ray is intersecting something we can move.
var intersectionDistance = Vec3.distance(pickRay.origin, intersection.intersection);
//this code will disabled the beam for the opposite hand of the one that grabbed it if the entity says so
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, intersection.entityID, DEFAULT_GRABBABLE_DATA);
if (grabbableData["turnOffOppositeBeam"]===true) {
if (this.hand === RIGHT_HAND) {
disabledHand = LEFT_HAND;
} else {
disabledHand = RIGHT_HAND;
}
} else {
disabledHand = 'none';
}
if (intersection.properties.name == "Grab Debug Entity") {
continue;
@ -758,21 +743,8 @@ function MyController(hand) {
this.nearGrabbing = function() {
var now = Date.now();
print('HAND IN NEAR GRAB:::' + this.hand)
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, this.grabbedEntity, DEFAULT_GRABBABLE_DATA);
var turnOffOtherHand = grabbableData["turnOffOtherHand"];
print('TURN OFF OTHER HAND??' + turnOffOtherHand);
if (turnOffOtherHand === 'left' && this.hand === 1) {
print('IGNORE RIGHT')
return
}
if (turnOffOtherHand === 'right' && this.hand === 0) {
print('IGNORE LEFT')
return
}
if (this.state == STATE_NEAR_GRABBING && this.triggerSmoothedReleased()) {
this.setState(STATE_RELEASE);
Entities.callEntityMethod(this.grabbedEntity, "releaseGrab");
@ -1121,10 +1093,6 @@ function MyController(hand) {
this.release = function() {
if (this.hand !== disabledHand) {
//release the disabled hand when we let go with the main one
disabledHand = 'none';
}
this.lineOff();
if (this.grabbedEntity !== null) {
@ -1246,14 +1214,64 @@ mapping.from([Controller.Standard.LB]).peek().to(leftController.bumperPress);
Controller.enableMapping(MAPPING_NAME);
var beamDisabler;
function createBeamDisabler() {
print('CREATING DISABLER')
var disablerProps = {
name: 'Hifi-Beam-Disabler',
type: 'Sphere',
dimensions: {
x: 0.1,
y: 0.1,
z: 0.1
},
color: {
red: 255,
green: 0,
blue: 0
},
visible: true,
position: MyAvatar.position,
ignoreForCollisions: true,
collisionsWillMove: false,
userData: JSON.stringify({
beamDisablerKey: {
handToDisable: 'none'
},
grabbableKey: {
grabbable: false
}
})
}
beamDisabler = Entities.addEntity(disablerProps)
}
function updateBeamDisablerPosition() {
Entities.editEntity(beamDisabler, {
position: MyAvatar.position
})
}
createBeamDisabler();
function update() {
rightController.update();
leftController.update();
updateBeamDisablerPosition();
var beamDisablerData = getEntityCustomData(BEAM_DISABLER_KEY, beamDisabler, {
handToDisable: 'none'
});
if (beamDisablerData.handToDisable !== 0) {
leftController.update();
}
if (beamDisablerData.handToDisable !== 1) {
rightController.update();
}
}
function cleanup() {
rightController.cleanup();
leftController.cleanup();
Entities.deleteEntity(beamDisabler);
Controller.disableMapping(MAPPING_NAME);
}

View file

@ -76,6 +76,7 @@
}
var USE_DEBOUNCE = false;
function interval() {
var lastTime = new Date().getTime();
@ -111,13 +112,13 @@
blue: 255
}
},
sinceLastUpdate:0,
preload: function(entityID) {
this.entityID = entityID;
this.stringPullSound = SoundCache.getSound(STRING_PULL_SOUND_URL);
this.shootArrowSound = SoundCache.getSound(SHOOT_ARROW_SOUND_URL);
this.arrowHitSound = SoundCache.getSound(ARROW_HIT_SOUND_URL);
this.arrowNotchSound = SoundCache.getSound(NOTCH_ARROW_SOUND_URL);
this.arrowWhizzSound = SoundCache.getSound(ARROW_WHIZZ_SOUND_URL);
},
@ -145,11 +146,25 @@
if (this.isGrabbed === true) {
return false;
}
this.isGrabbed = true;
this.initialHand = this.hand;
var ids = Entities.findEntities(MyAvatar.position, 1);
for (var i in ids) {
var entityId = ids[i];
var foundProps = Entities.getEntityProperties(entityId);
if (foundProps.name == "Hifi-Beam-Disabler") {
print('FOUND THE BEAM DISABLER')
setEntityCustomData('beamDisablerKey',entityId,{
handToDisable:this.initialHand==='left'?1:0
})
}
}
setEntityCustomData('grabbableKey', this.entityID, {
turnOffOtherHand: this.initialHand,
grabbable: false,
invertSolidWhileHeld: true,
turnOffOppositeBeam: true,
spatialKey: BOW_SPATIAL_KEY
@ -157,7 +172,19 @@
},
continueNearGrab: function() {
this.deltaTime = checkInterval();
//debounce during debugging -- maybe we're updating too fast?
if (USE_DEBOUNCE === true) {
this.deltaTime = checkInterval();
this.sinceLastUpdate = this.sinceLastUpdate + this.deltaTime;
if (this.sinceLastUpdate > 60) {
this.sinceLastUpdate = 0;
} else {
return;
}
}
this.bowProperties = Entities.getEntityProperties(this.entityID);
//create a string across the bow when we pick it up
@ -189,13 +216,27 @@
releaseGrab: function() {
print('RELEASE GRAB EVENT')
if (this.isGrabbed === true && this.hand === this.initialHand) {
var ids = Entities.findEntities(MyAvatar.position, 1);
for (var i in ids) {
var entityId = ids[i];
var foundProps = Entities.getEntityProperties(entityId);
if (foundProps.name == "Hifi-Beam-Disabler") {
print('FOUND THE BEAM DISABLER')
setEntityCustomData('beamDisablerKey',entityId,{
handToDisable:'none'
})
}
}
this.isGrabbed = false;
this.stringDrawn = false;
this.deleteStrings();
setEntityCustomData('grabbableKey', this.entityID, {
turnOffOtherHand: false,
grabbable: true,
turnOffOppositeBeam: true,
invertSolidWhileHeld: true,
turnOffOppositebBam: true,
spatialKey: BOW_SPATIAL_KEY
});
Entities.deleteEntity(this.preNotchString);
@ -414,15 +455,19 @@
// print('TRIGGER VALUE:::' + this.triggerValue);
if (this.triggerValue < DRAW_STRING_THRESHOLD && this.stringDrawn === true) {
// firing the arrow
print('TRIGGER VALUE??' + this.triggerValue)
// firing the arrow
print('HIT RELEASE LOOP IN CHECK');
this.updateArrowPositionInNotch(true);
this.drawStrings();
this.hasArrowNotched = false;
this.aiming = false;
this.stringDrawn = false;
this.updateArrowPositionInNotch(true);
} else if (this.triggerValue > DRAW_STRING_THRESHOLD && this.stringDrawn === true) {
// print('HIT CONTINUE LOOP IN CHECK')
print('HIT CONTINUE LOOP IN CHECK')
//continuing to aim the arrow
this.aiming = true;
@ -454,7 +499,6 @@
updateArrowPositionInNotch: function(shouldReleaseArrow) {
var bowProperties = Entities.getEntityProperties(this.entityID);
//set the notch that the arrow should go through
var frontVector = Quat.getFront(bowProperties.rotation);
var notchVectorForward = Vec3.multiply(frontVector, NOTCH_OFFSET_FORWARD);
@ -494,6 +538,7 @@
//shoot the arrow
if (shouldReleaseArrow === true) {
var arrowProperties = Entities.getEntityProperties(this.arrow);
//scale the shot strength by the distance you've pulled the arrow back and set its release velocity to be in the direction of the v
var arrowForce = this.scaleArrowShotStrength(pullBackDistance);
@ -504,7 +549,9 @@
collisionsWillMove: true,
velocity: releaseVelocity,
gravity: ARROW_GRAVITY,
lifetime: 10
lifetime: 10,
position:notchPosition,
rotation:arrowRotation
};
//actually shoot the arrow and play its sound

View file

@ -46,8 +46,7 @@ var bow = Entities.addEntity({
script: SCRIPT_URL,
userData: JSON.stringify({
grabbableKey: {
turnOffOtherHand:false,
turnOffOppositebeam:true,
turnOffOppositeBeam:true,
invertSolidWhileHeld: true,
spatialKey: {
relativePosition: {