// // flourish-augmentation-simple.js // // // Created by Davedub, August 2014 // // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // // always at the top... var pathToOverlays = "/Users/ozan/Documents/Assets/Animations/ArmSwingTest/flourish-augmentation/overlays"; // print out some joint information var jointList = MyAvatar.getJointNames(); var jointMappings = "\n# Avatar joint list start"; for (var i = 0; i < jointList.length; i++) { jointMappings = jointMappings + "\njointIndex = " + jointList[i] + " = " + i; } print(jointMappings + "\n# walk.js avatar joint list end"); resetJoints(); var hipsToFeetDistance = MyAvatar.getJointPosition("Hips").y - MyAvatar.getJointPosition("RightFoot").y; print('\nHips to feet: '+hipsToFeetDistance); // not needed yet, but will be // animation stuff var handleValue = 0; var filterStrength = 0; MyAvatar.setJointData("LeftArm", Quat.fromPitchYawRollDegrees( 80, 0, 0)); // overlays var controlPosX = Window.innerWidth/2; var controlPosY = 0; var minSliderX = controlPosX+18; var sliderRangeX = 190; var minHandleX = controlPosX+77; var handleRangeX = 190; var handlePosition = 0; var controllerBackground = Overlays.addOverlay("image", { bounds: { x: controlPosX, y: controlPosY, width: 250, height: 380}, imageURL: pathToOverlays+"flourish-augmentation-control-overlay.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var controllerHandle = Overlays.addOverlay("image", { bounds: { x: minHandleX, y: controlPosY+225, width: 79, height: 100}, imageURL: pathToOverlays+"flourish-augmentation-handle-overlay.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); var controllerSlider = Overlays.addOverlay("image", { bounds: { x: minSliderX, y: controlPosY+178, width: 25, height: 25}, imageURL: pathToOverlays+"ddao-slider-handle.png", color: { red: 255, green: 255, blue: 255}, alpha: 1 }); // main loop - using crude averaging filters for quick implementation //var shoulderPDampingFilter = [0,0,0,0]; //var shoulderYDampingFilter = [0,0,0,0]; //var shoulderRDampingFilter = [0,0,0,0]; var upperArmPDampingFilter = [0,0,0,0,0,0,0,0,0,0,0,0]; //var upperArmYDampingFilter = [0,0,0,0,0,0]; //var upperArmRDampingFilter = [0,0,0,0,0,0]; var lowerArmPDampingFilter = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; //var lowerArmYDampingFilter = [0,0,0,0,0,0,0,0]; //var lowerArmRDampingFilter = [0,0,0,0,0,0,0,0]; //var handDampingPFilter = [0,0,0,0,0,0,0,0,0,0]; //var handDampingYFilter = [0,0,0,0,0,0,0,0,0,0]; //var handDampingRFilter = [0,0,0,0,0,0,0,0,0,0]; Script.update.connect(function(deltaTime) { // blend three keyframes using handle position for weighting var keyframeOneWeight = 0; var keyframeTwoWeight = 0; var keyframeThreeWeight = 0; if(handleValue>0 && movingHandle) { // right keyframeOneWeight = 0; keyframeTwoWeight = handleValue; keyframeThreeWeight = 1-handleValue; } else if (handleValue<=0 && movingHandle) { // left keyframeOneWeight = 0; keyframeTwoWeight = 1-handleValue; keyframeThreeWeight = handleValue; } else if(!movingHandle) { // idle keyframeOneWeight = 1; keyframeTwoWeight = 0; keyframeThreeWeight = 0; } var shoulderPitch = keyframeOneWeight * keyFrameOne.joints[0].pitch + keyframeTwoWeight * keyFrameTwo.joints[0].pitch + keyframeThreeWeight * keyFrameThree.joints[0].pitch; var upperArmPitch = keyframeOneWeight * keyFrameOne.joints[1].pitch + keyframeTwoWeight * keyFrameTwo.joints[1].pitch + keyframeThreeWeight * keyFrameThree.joints[1].pitch; var lowerArmPitch = keyframeOneWeight * keyFrameOne.joints[2].pitch + keyframeTwoWeight * keyFrameTwo.joints[2].pitch + keyframeThreeWeight * keyFrameThree.joints[2].pitch; var handPitch = keyframeOneWeight * keyFrameOne.joints[3].pitch + keyframeTwoWeight * keyFrameTwo.joints[3].pitch + keyframeThreeWeight * keyFrameThree.joints[3].pitch; var shoulderYaw = keyframeOneWeight * keyFrameOne.joints[0].yaw + keyframeTwoWeight * keyFrameTwo.joints[0].yaw + keyframeThreeWeight * keyFrameThree.joints[0].yaw; var upperArmYaw = keyframeOneWeight * keyFrameOne.joints[1].yaw + keyframeTwoWeight * keyFrameTwo.joints[1].yaw + keyframeThreeWeight * keyFrameThree.joints[1].yaw; var lowerArmYaw = keyframeOneWeight * keyFrameOne.joints[2].yaw + keyframeTwoWeight * keyFrameTwo.joints[2].yaw + keyframeThreeWeight * keyFrameThree.joints[2].yaw; var handYaw = keyframeOneWeight * keyFrameOne.joints[3].yaw + keyframeTwoWeight * keyFrameTwo.joints[3].yaw + keyframeThreeWeight * keyFrameThree.joints[3].yaw; var shoulderRoll = keyframeOneWeight * keyFrameOne.joints[0].roll + keyframeTwoWeight * keyFrameTwo.joints[0].roll + keyframeThreeWeight * keyFrameThree.joints[0].roll; var upperArmRoll = keyframeOneWeight * keyFrameOne.joints[1].roll + keyframeTwoWeight * keyFrameTwo.joints[1].roll + keyframeThreeWeight * keyFrameThree.joints[1].roll; var lowerArmRoll = keyframeOneWeight * keyFrameOne.joints[2].roll + keyframeTwoWeight * keyFrameTwo.joints[2].roll + keyframeThreeWeight * keyFrameThree.joints[2].roll; var handRoll = keyframeOneWeight * keyFrameOne.joints[3].roll + keyframeTwoWeight * keyFrameTwo.joints[3].roll + keyframeThreeWeight * keyFrameThree.joints[3].roll; // filter upper arm pitch upperArmPDampingFilter.push(upperArmPitch); upperArmPDampingFilter.shift(); var upperArmPitchFinal = 0; for(ea in upperArmPDampingFilter) upperArmPitchFinal += upperArmPDampingFilter[ea]; upperArmPitchFinal /= upperArmPDampingFilter.length; upperArmPitch = (filterStrength*upperArmPitchFinal) + ((1-filterStrength) * upperArmPitch); // filter forearm pitch lowerArmPDampingFilter.push(lowerArmPitch); lowerArmPDampingFilter.shift(); var lowerArmPitchFinal = 0; for(ea in lowerArmPDampingFilter) lowerArmPitchFinal += lowerArmPDampingFilter[ea]; lowerArmPitchFinal /= lowerArmPDampingFilter.length; lowerArmPitch = (filterStrength*lowerArmPitchFinal) + ((1-filterStrength) * lowerArmPitch); MyAvatar.setJointData("RightShoulder", Quat.fromPitchYawRollDegrees( shoulderPitch, shoulderYaw, shoulderRoll)); MyAvatar.setJointData("RightArm", Quat.fromPitchYawRollDegrees( upperArmPitch, upperArmYaw, upperArmRoll)); MyAvatar.setJointData("RightForeArm", Quat.fromPitchYawRollDegrees( lowerArmPitch, lowerArmYaw, lowerArmRoll)); MyAvatar.setJointData("RightHand", Quat.fromPitchYawRollDegrees( handPitch, handYaw, handRoll)); }); // mouse stuff var movingHandle = false; var movingSlider = false; function mousePressEvent(event) { var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); if(clickedOverlay===controllerHandle) movingHandle = true; else if(clickedOverlay===controllerSlider) movingSlider = true; } function mouseMoveEvent(event) { if(movingHandle) { var thumbClickOffsetX = event.x - minHandleX; var thumbPositionNormalised = thumbClickOffsetX / handleRangeX; if(thumbPositionNormalised<-2) thumbPositionNormalised = -2; if(thumbPositionNormalised>2) thumbPositionNormalised = 2; handleValue = (thumbPositionNormalised+2.001)/4; var handleX = (thumbPositionNormalised * sliderRangeX); // sets range Overlays.editOverlay(controllerHandle, { x: handleX + minHandleX} ); } else if(movingSlider) { var thumbClickOffsetX = event.x - minSliderX; var thumbPositionNormalised = thumbClickOffsetX / sliderRangeX; if(thumbPositionNormalised<0) thumbPositionNormalised = 0; if(thumbPositionNormalised>1) thumbPositionNormalised = 1; filterStrength = thumbPositionNormalised; var sliderX = thumbPositionNormalised * sliderRangeX ; // sets range Overlays.editOverlay(controllerSlider, { x: sliderX + minSliderX} ); } } function mouseReleaseEvent(event) { //var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); if(movingHandle) { movingHandle = false; handleValue = 0; Overlays.editOverlay(controllerHandle, { x: minHandleX} ); } else if(movingSlider) movingSlider = false; } Controller.mouseMoveEvent.connect(mouseMoveEvent); Controller.mousePressEvent.connect(mousePressEvent); Controller.mouseReleaseEvent.connect(mouseReleaseEvent); // zero out all joints function resetJoints() { var avatarJointNames = MyAvatar.getJointNames(); for (var i = 0; i < avatarJointNames.length; i++) { //MyAvatar.setJointData(avatarJointNames[i], Quat.fromPitchYawRollDegrees(0,0,0)); MyAvatar.clearJointData(avatarJointNames[i]); } } // Script ending Script.scriptEnding.connect(function() { Overlays.deleteOverlay(controllerSlider); Overlays.deleteOverlay(controllerHandle); Overlays.deleteOverlay(controllerBackground); // leave the avi in zeroed out stance resetJoints(); }); // standing - middle var keyFrameOne = { "joints":[ { "name":"RightShoulder", "pitch":0, "yaw":0, "roll":0 }, { "name":"RightArm", "pitch":80, "yaw":0, "roll":0 }, { "name":"RightForeArm", "pitch":0, "yaw":0, "roll":0 }, { "name":"RightHand", "pitch":0, "yaw":0, "roll":0 } ] } // arm wave right var keyFrameTwo = { "joints":[ { "name":"RightShoulder", "pitch":-23, "yaw":-10.5, "roll":-0.5 }, { "name":"RightArm", "pitch":-0.5, "yaw":-32, "roll":-1.5 }, { "name":"RightForeArm", "pitch":-40, "yaw":30, "roll":7.5 }, { "name":"RightHand", "pitch":0, "yaw":90, "roll":0 } ] } // arm wave left var keyFrameThree = { "joints":[ { "name":"RightShoulder", "pitch":-23, "yaw":-10.5, "roll":-0.5 }, { "name":"RightArm", "pitch":-10.5, "yaw":-32, "roll":-1.5 }, { "name":"RightForeArm", "pitch":-110, "yaw":30, "roll":7.5 }, { "name":"RightHand", "pitch":0, "yaw":90, "roll":0 } ] }