Needs a lot of cleanup. Data has been de-duplicated, and where identical copies existed, one of them has been replaced with a symlink. Some files have been excluded, such as binaries, installers and debug dumps. Some of that may still be present.
349 lines
No EOL
10 KiB
JavaScript
349 lines
No EOL
10 KiB
JavaScript
//
|
|
// 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
|
|
}
|
|
]
|
|
} |