diff --git a/scripts/system/controllers/controllerModules/farGrabEntity.js b/scripts/system/controllers/controllerModules/farGrabEntity.js index 92fc4a45f1..5947633508 100644 --- a/scripts/system/controllers/controllerModules/farGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farGrabEntity.js @@ -111,6 +111,7 @@ Script.include("/~/system/libraries/controllers.js"); this.currentObjectPosition = targetProps.position; this.currentObjectRotation = targetProps.rotation; this.currentObjectTime = now; + this.initialEntityRotation = targetProps.rotation; this.grabRadius = this.grabbedDistance; this.grabRadialVelocity = 0.0; @@ -145,8 +146,14 @@ Script.include("/~/system/libraries/controllers.js"); Messages.sendLocalMessage('Hifi-unhighlight-entity', JSON.stringify(message)); var newTargetPosLocal = MyAvatar.worldToJointPoint(targetProps.position); - MyAvatar.setJointTranslation(FAR_GRAB_JOINTS[this.hand], newTargetPosLocal); - MyAvatar.setJointRotation(FAR_GRAB_JOINTS[this.hand], { x: 0, y: 0, z: 0, w: 1 }); // RKNOTE: This is where the rotation should be updated. + var newTargetRotLocal = this.targetProps.rotation; + if (this.shouldManipulateTarget()) { + var rotBetween = this.calculateEntityRotationManipulation(worldControllerRotation); + var newTargetRotLocal = Quat.multiply(rotBetween, newTargetRotLocal); + } + //MyAvatar.setJointTranslation(FAR_GRAB_JOINTS[this.hand], newTargetPosLocal); + this.setJointTranslation(newTargetPosLocal); + this.setJointRotation(newTargetRotLocal); var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID]; Entities.callEntityMethod(targetProps.id, "startDistanceGrab", args); @@ -234,8 +241,14 @@ Script.include("/~/system/libraries/controllers.js"); // var newTargetPosLocal = Mat4.transformPoint(MyAvatar.getSensorToWorldMatrix(), newTargetPosition); var newTargetPosLocal = MyAvatar.worldToJointPoint(newTargetPosition); - MyAvatar.setJointTranslation(FAR_GRAB_JOINTS[this.hand], newTargetPosLocal); - MyAvatar.setJointRotation(FAR_GRAB_JOINTS[this.hand], { x: 0, y: 0, z: 0, w: 1 }); // RKNOTE: This is where the rotation should be updated. + var newTargetRotLocal = this.initialEntityRotation; + if (this.shouldManipulateTarget()) { + var rotBetween = this.calculateEntityRotationManipulation(worldControllerRotation); + var newTargetRotLocal = Quat.multiply(rotBetween, newTargetRotLocal); + } + //MyAvatar.setJointTranslation(FAR_GRAB_JOINTS[this.hand], newTargetPosLocal); + this.setJointTranslation(newTargetPosLocal); + this.setJointRotation(newTargetRotLocal); this.previousRoomControllerPosition = roomControllerPosition; }; @@ -257,9 +270,10 @@ Script.include("/~/system/libraries/controllers.js"); })); unhighlightTargetEntity(this.targetEntityID); this.grabbing = false; - this.targetEntityID = null; this.potentialEntityWithContextOverlay = false; MyAvatar.clearJointData(FAR_GRAB_JOINTS[this.hand]); // RKNOTE: Here, we should edit the entity's position and rotation data with the current joint rotation data. + this.setTargetRotation(this.lastFarGrabJointRotation); + this.targetEntityID = null; }; this.updateRecommendedArea = function () { @@ -337,6 +351,10 @@ Script.include("/~/system/libraries/controllers.js"); grabMapping.disable(); }; + this.initialControllerRotation = Quat.IDENTITY; + this.initialEntityRotation = Quat.IDENTITY; + this.lastFarGrabJointRotation = Quat.IDENTITY; + this.leftTrigger = 0.0; this.rightTrigger = 0.0; this.leftGrip = 0.0; @@ -451,8 +469,25 @@ Script.include("/~/system/libraries/controllers.js"); props.rotation = newRot; Entitis.editEntity(this.targetEntityID, props); } + }; + + this.shouldManipulateTarget = function () { + return (this.getDominantGrip() > TRIGGER_ON_VALUE); } + this.calculateEntityRotationManipulation = function (controllerRotation) { + return Quat.multiply(controllerRotation, Quat.inverse(this.initialControllerRotation)); + } + + this.setJointTranslation(newTargetPosLocal) { + MyAvatar.setJointTranslation(FAR_GRAB_JOINTS[this.hand], newTargetPosLocal); + }; + + this.setJointRotation(newTargetRotLocal) { + this.lastFarGrabJointRotation = newTargetRotLocal; + MyAvatar.setJointRotation(FAR_GRAB_JOINTS[this.hand], newTargetRotLocal); + }; + this.isReady = function (controllerData) { if (HMD.active && this.hand === this.getOffHand()) { if (this.notPointingAtEntity(controllerData)) {