end of day

This commit is contained in:
James B. Pollack 2015-10-19 18:04:08 -07:00
parent 3ddfce911e
commit 1daeedec9b
3 changed files with 310 additions and 185 deletions

View file

@ -12,37 +12,38 @@
(function() {
var _this;
var _this;
function Arrow() {
_this = this;
return;
function Arrow() {
_this = this;
return;
}
Arrow.prototype = {
preload: function(entityID) {
this.entityID = entityID;
},
collisionWithEntity: function(me, otherEntity, collision) {
Vec3.print('penetration = ', collision.penetration);
Vec3.print('collision contact point = ', collision.contactPoint);
Entities.editEntity(this.entityID, {
velocity: {
x: 0,
y: 0,
z: 0
},
gravity: {
x: 0,
y: 0,
z: 0
},
collisionsWillMove: false
})
}
}
Arrow.prototype = {
preload: function(entityID) {
this.entityID = entityID;
},
collisionWithEntity: function(me, otherEntity, collision) {
Vec3.print('penetration = ', collision.penetration);
Vec3.print('collision contact point = ', collision.contactPoint);
Entities.editEntity(this.entityID, {
velocity: {
x: 0,
y: 0,
z: 0
},
gravity: {
x: 0,
y: 0,
z: 0
}
collisionsWillMove: false
})
}
return new Arrow;
})
return new Arrow;
})

View file

@ -12,176 +12,285 @@
(function() {
var ARROW_MODEL_URL = '';
var ARROW_SCRIPT_URL = Script.resolvePath('arrow.js');
var ARROW_OFFSET = {
x: 0,
y: 0,
z: 0
};
var ARROW_GRAVITY = {
x: 0,
y: -9.8,
z: 0
};
var ARROW_MODEL_URL = "https://hifi-public.s3.amazonaws.com/models/bow/arrow.fbx";
var ARROW_COLLISION_HULL_URL = "https://hifi-public.s3.amazonaws.com/models/bow/arrow_collision_hull.obj";
var ARROW_SCRIPT_URL = Script.resolvePath('arrow.js');
var ARROW_OFFSET = 0.25;
var ARROW_FORCE = 0.25;
var ARROW_DIMENSIONS = {
x: 0.08,
y: 0.02,
z: 0.08
};
var ARROW_GRAVITY = {
x: 0,
y: -9.8,
z: 0
};
var TOP_NOTCH_OFFSET = {
x: 0,
y: 0,
z: 0
};
var TOP_NOTCH_OFFSET = 0.5;
var BOTTOM_NOTCH_OFFSET = 0.5;
var BOTTOM_NOTCH_OFFSET = {
x: 0,
y: 0,
z: 0
};
var LINE_DIMENSIONS = {
x: 5,
y: 5,
z: 5
};
var DRAW_STRING_THRESHOLD = 0.1;
var RELEASE_STRING_THRESHOLD = 0.85;
var DRAW_STRING_THRESHOLD = 0.80;
var _this;
var _this;
function Bow() {
_this = this;
return;
}
function Bow() {
_this = this;
return;
}
Bow.prototype = {
isGrabbed: false,
stringDrawn: false,
stringData: {
top: {},
bottom: {}
},
// create bow
// on pickup, wait for other hand to start trigger pull
// then create strings that start at top and bottom of bow
// extend them to the other hand position
// on trigger release,
// create arrow
// shoot arrow with velocity relative to distance between hand position and bow
// delete lines
preload: function(entityID) {
this.entityID = entityID;
},
Bow.prototype = {
isGrabbed: false,
stringDrawn: false,
hasArrow: false,
stringData: {
currentColor: {
red: 0,
green: 255,
blue: 0
}
setLeftHand: function() {
this.hand = 'left';
},
},
setRightHand: function() {
this.hand = 'right';
},
preload: function(entityID) {
this.entityID = entityID;
},
drawStrings: function() {
setLeftHand: function() {
if (this.isGrabbed === true) {
return false;
}
this.hand = 'left';
},
Entities.editEntity(this.topString, {
linePoints: this.stringData.top.points,
normals: this.stringData.top.normals,
strokeWidths: this.stringData.top.strokeWidths,
color: stringData.currentColor
});
setRightHand: function() {
if (this.isGrabbed === true) {
return false;
}
this.hand = 'right';
},
Entities.editEntity(this.bottomString, {
linePoints: this.stringData.bottom.points,
normals: this.stringData.bottom.normals,
strokeWidths: this.stringData.bottom.strokeWidths,
color: stringData.currentColor
});
drawStrings: function() {
this.updateStringPositions();
var lineVectors = this.getLocalLineVectors();
Entities.editEntity(this.topString, {
linePoints: [{
x: 0,
y: 0,
z: 0
}, lineVectors[0]],
lineWidth: 5,
color: this.stringData.currentColor
});
Entities.editEntity(this.bottomString, {
linePoints: [{
x: 0,
y: 0,
z: 0
}, lineVectors[1]],
lineWidth: 5,
color: this.stringData.currentColor
});
},
createStrings: function() {
this.createTopString();
this.createBottomString();
},
deleteStrings: function() {
Entities.deleteEntity(this.topString);
Entities.deleteEntity(this.bottomString);
},
createTopString: function() {
var stringProperties = {
type: 'Line',
position: Vec3.sum(this.bowProperties.position, TOP_NOTCH_OFFSET),
dimensions: LINE_DIMENSIONS
};
this.topString = Entities.addEntity(stringProperties);
},
createBottomString: function() {
var stringProperties = {
type: 'Line',
position: Vec3.sum(this.bowProperties.position, BOTTOM_NOTCH_OFFSET),
dimensions: LINE_DIMENSIONS
};
this.bottomString = Entities.addEntity(stringProperties);
},
updateStringPositions: function() {
var upVector = Quat.getFront(this.bowProperties.rotation);
var upOffset = Vec3.multiply(upVector, TOP_NOTCH_OFFSET);
var downVector = Vec3.multiply(-1, Quat.getFront(this.bowProperties.rotation));
var downOffset = Vec3.multiply(downVector, BOTTOM_NOTCH_OFFSET);
this.topStringPosition = Vec3.sum(this.bowProperties.position, upOffset);
this.bottomStringPosition = Vec3.sum(this.bowProperties.position, downOffset);
Entities.editEntity(this.topString, {
position: this.topStringPosition
});
Entities.editEntity(this.bottomString, {
position: this.bottomStringPosition
});
},
startNearGrab: function() {
if (this.isGrabbed === true) {
return false;
}
this.isGrabbed = true;
this.initialHand = this.hand;
},
continueNearGrab: function() {
this.bowProperties = Entities.getEntityProperties(this.entityID, ["position", "rotation"]);
this.checkStringHand();
},
releaseGrab: function() {
if (this.isGrabbed === true && this.hand === this.initialHand) {
this.isGrabbed = false;
this.stringDrawn = false;
this.deleteStrings();
this.hasArrow = false;
}
},
checkStringHand: function() {
//invert the hands because our string will be held with the opposite hand of the first one we pick up the bow with
if (this.initialHand === 'left') {
this.getStringHandPosition = MyAvatar.getRightPalmPosition;
this.getStringHandRotation = MyAvatar.getRightPalmRotation;
this.stringTriggerAction = Controller.findAction("RIGHT_HAND_CLICK");
} else if (this.initialHand === 'right') {
this.getStringHandPosition = MyAvatar.getLeftPalmPosition;
this.getStringHandRotation = MyAvatar.getLeftPalmRotation;
this.stringTriggerAction = Controller.findAction("LEFT_HAND_CLICK");
}
this.triggerValue = Controller.getActionValue(this.stringTriggerAction);
if (this.triggerValue < DRAW_STRING_THRESHOLD && this.stringDrawn === true) {
print('TRIGGER 1')
//let it fly
this.stringDrawn = false;
this.deleteStrings();
this.hasArrow = false;
//this.releaseArrow();
} else if (this.triggerValue >= DRAW_STRING_THRESHOLD && this.stringDrawn === true) {
print('TRIGGER 2')
//update
this.stringData.handPosition = this.getStringHandPosition();
this.stringData.handRotation = this.getStringHandRotation();
this.drawStrings();
this.updateArrowPosition();
} else if (this.triggerValue >= DRAW_STRING_THRESHOLD && this.stringDrawn === false) {
print('TRIGGER 3')
//create
this.stringDrawn = true;
},
createStrings: function() {
this.createTopString();
this.createBottomString();
},
deleteStrings: function() {
Entities.deleteEntity(this.topString);
Entities.deleteEntity(this.bottomString);
},
createTopString: function() {
var stringProperties = {
type: 'Polyline'
position: Vec3.sum(this.position, this.TOP_NOTCH_OFFSET);
};
this.topString = Entities.addEntity(stringProperties);
},
createBottomString: function() {
var stringProperties = {
type: 'Polyline'
position: Vec3.sum(this.position, this.TOP_NOTCH_OFFSET);
};
this.bottomString = Entities.addEntity(stringProperties);
},
startNearGrab: function() {
this.isGrabbed = true;
this.initialHand = this.hand;
},
continueNearGrab: function() {
this.bowProperties = Entities.getEntityProperties(this.entityID, ["position", "rotation"]);
this.checkStringHand();
},
releaseGrab: function() {
if (this.isGrabbed === true && this.hand === this.initialHand) {
this.isGrabbed = false;
this.createStrings();
this.stringData.handPosition = this.getStringHandPosition();
this.stringData.handRotation = this.getStringHandRotation();
if (this.hasArrow === false) {
this.createArrow();
this.hasArrow = true;
}
},
this.drawStrings();
checkStringHand: function() {
//invert the hands because our string will be held with the opposite hand of the first one we pick up the bow with
if (this.hand === 'left') {
this.getStringHandPosition = MyAvatar.getRightPalmPosition;
this.getStringHandRotation = MyAvatar.getRightPalmRotation;
this.stringTriggerAction = Controller.findAction("RIGHT_HAND_CLICK");
} else if (this.hand === 'right') {
this.getStringHandPosition = MyAvatar.getLeftPalmPosition;
this.getStringHandRotation = MyAvatar.getLeftPalmRotation;
this.stringTriggerAction = Controller.findAction("LEFT_HAND_CLICK");
}
}
this.triggerValue = Controller.getActionValue(handClick);
},
if (this.triggerValue < RELEASE_STRING_THRESHOLD && this.stringDrawn === true) {
getArrowPosition: function() {
var arrowVector = Vec3.subtract(this.bowProperties.position,this.stringData.handPosition);
arrowVector = Vec3.normalize(arrowVector);
arrowVector = Vec3.multiply(arrowVector,ARROW_OFFSET);
var arrowPosition = Vec3.sum(this.stringData.handPosition,arrowVector);
return arrowPosition;
},
this.releaseArrow();
this.stringDrawn = false;
updateArrowPosition: function() {
var arrowPosition = this.getArrowPosition();
print('ARROW POSITION:::' + JSON.stringify(arrowPosition));
Entities.editEntity(this.arrow, {
position: arrowPosition,
rotation: this.bowProperties.rotation
});
},
this.deleteStrings();
createArrow: function() {
print('CREATING ARROW');
var arrowProperties = {
name: 'Hifi-Arrow',
type: 'Model',
modelURL: ARROW_MODEL_URL,
dimensions: ARROW_DIMENSIONS,
position: this.getArrowPosition(),
rotation: this.bowProperties.rotation,
collisionsWillMove: false,
ignoreForCollisions: true,
script: ARROW_SCRIPT_URL,
lifetime: 40
};
} else if (this.triggerValue >= DRAW_STRING_THRESHOLD && this.stringDrawn === false) {
this.arrow = Entities.addEntity(arrowProperties);
},
this.stringData.handPosition = this.getStringHandPosition();
this.stringData.handRotation = this.getStringHandRotation();
this.drawStrings();
releaseArrow: function() {
}
var forwardVec = Quat.getFront(Quat.multiply(this.bowProperties.rotation, Quat.fromPitchYawRollDegrees(0, 180, 0)));
forwardVec = Vec3.normalize(forwardVec);
var handDistanceAtRelease = Vec3.length(this.bowProperties.position, this.stringData.handPosition);
},
forwardVec = Vec3.multiply(forwardVec, ARROW_FORCE);
releaseArrow: function() {
var arrowProperties = {
velocity: forwardVec,
collisionsWillMove: true,
gravity: ARROW_GRAVITY,
lifetime: 20
};
var handDistanceAtRelease = Vec3.length(this.bowProperties.position, this.stringData.handPosition);
var releaseDirection = Vec3.subtract(this.bowProperties.position, this.stringData.handPosition);
var releaseVector = Vec3.multiply(handDistanceAtRelease, releaseDirection);
Entities.editEntity(this.arrow, arrowProperties);
},
getLocalLineVectors: function() {
var topVector = Vec3.subtract(this.stringData.handPosition, this.topStringPosition);
var bottomVector = Vec3.subtract(this.stringData.handPosition, this.bottomStringPosition);
return [topVector, bottomVector];
}
};
var arrowProperties = {
type: 'Model',
dimensions: ARROW_DIMENSIONS,
position: Vec3.sum(this.bowProperties.position, ARROW_OFFSET),
velocity: releaseVector,
rotation: this.bowProperties.rotation;
collisionsWillMove: true,
gravity: ARROW_GRAVITY,
script: ARROW_SCRIPT_URL,
lifetime: 30
};
this.arrow = Entities.addEntity(arrowProperties);
},
return new Bow;
})
return new Bow();
});

View file

@ -16,9 +16,9 @@ var SCRIPT_URL = Script.resolvePath('bow.js');
var MODEL_URL = "https://hifi-public.s3.amazonaws.com/models/bow/bow.fbx";
var COLLISION_HULL_URL = "https://hifi-public.s3.amazonaws.com/models/bow/bow_collision_hull.obj";
var BOW_DIMENSIONS = {
x: 0.08,
y: 0.30,
z: 0.08
x: 0.1,
y: 0.02,
z: 1
};
var BOW_GRAVITY = {
@ -26,20 +26,35 @@ var BOW_GRAVITY = {
y: 0,
z: 0
}
var BOW_ROTATION = Quat.fromPitchYawRollDegrees(90, 180, 0);
var center = Vec3.sum(Vec3.sum(MyAvatar.position, {
x: 0,
y: 0.5,
y: 1,
z: 0
}), Vec3.multiply(1, Quat.getFront(Camera.getOrientation())));
}), Vec3.multiply(1.5, Quat.getFront(Camera.getOrientation())));
var flashlight = Entities.addEntity({
var bow = Entities.addEntity({
name: 'Hifi-Bow',
type: "Model",
modelURL: MODEL_URL,
position: center,
rotation: BOW_ROTATION,
dimensions: BOW_DIMENSIONS,
collisionsWillMove: true,
gravity: BOW_GRAVITY,
shapeType: 'compound',
script: SCRIPT_URL
});
compoundShapeURL: COLLISION_HULL_URL,
script: SCRIPT_URL,
// userData: JSON.stringify({
// grabbableKey: {
// invertSolidWhileHeld: true
// }
// })
});
function cleanup() {
Entities.deleteEntity(bow);
}
Script.scriptEnding.connect(cleanup);