From 619746676b39770d38d5b04165cf352446377591 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Fri, 6 Nov 2015 15:31:03 -0800 Subject: [PATCH] Fix ScriptAvatar (ac agent), and provide a simple working example assignment client script. --- .../src/avatars/ScriptableAvatar.cpp | 20 +++++-------- examples/acScripts/animatedAvatarAgent.js | 29 +++++++++++++++++++ 2 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 examples/acScripts/animatedAvatarAgent.js diff --git a/assignment-client/src/avatars/ScriptableAvatar.cpp b/assignment-client/src/avatars/ScriptableAvatar.cpp index 161be954ff..a78939256d 100644 --- a/assignment-client/src/avatars/ScriptableAvatar.cpp +++ b/assignment-client/src/avatars/ScriptableAvatar.cpp @@ -73,24 +73,20 @@ void ScriptableAvatar::update(float deltatime) { const FBXAnimationFrame& ceilFrame = _animation->getFrames().at((int)glm::ceil(currentFrame) % frameCount); const float frameFraction = glm::fract(currentFrame); - for (int i = 0; i < modelJoints.size(); i++) { - int mapping = animationJoints.indexOf(modelJoints[i]); - if (mapping != -1 && !_maskedJoints.contains(modelJoints[i])) { - JointData& data = _jointData[i]; + for (int i = 0; i < animationJoints.size(); i++) { + const QString& name = animationJoints[i]; + int mapping = getJointIndex(name); + if (mapping != -1 && !_maskedJoints.contains(name)) { + JointData& data = _jointData[mapping]; auto newRotation = safeMix(floorFrame.rotations.at(i), ceilFrame.rotations.at(i), frameFraction); - auto newTranslation = floorFrame.translations.at(i) * (1.0f - frameFraction) + - ceilFrame.translations.at(i) * frameFraction; - + // We could probably do translations as in interpolation in model space (rather than the parent space that each frame is in), + // but we don't do so for MyAvatar yet, so let's not be different here. if (data.rotation != newRotation) { data.rotation = newRotation; data.rotationSet = true; } - if (data.translation != newTranslation) { - data.translation = newTranslation; - data.translationSet = true; - } - } + } } } else { _animation.clear(); diff --git a/examples/acScripts/animatedAvatarAgent.js b/examples/acScripts/animatedAvatarAgent.js new file mode 100644 index 0000000000..4e550e9789 --- /dev/null +++ b/examples/acScripts/animatedAvatarAgent.js @@ -0,0 +1,29 @@ +"use strict"; +/*jslint vars: true, plusplus: true*/ +/*global Agent, Avatar, Script, Entities, Vec3, print*/ +// +// animatedAvatar.js +// examples/acScripts +// +// Created by Howard Stearns 11/6/15 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +// An assignment client script that animates one avatar at random location within 'spread' meters of 'origin'. +// In Domain Server Settings, go to scripts and give the url of this script. Press '+', and then 'Save and restart'. + +var origin = {x: 500, y: 502, z: 500}; +var spread = 10; // meters +var animationData = {url: "https://hifi-public.s3.amazonaws.com/ozan/anim/standard_anims/walk_fwd.fbx", lastFrame: 35}; +Avatar.skeletonModelURL = "https://hifi-public.s3.amazonaws.com/marketplace/contents/dd03b8e3-52fb-4ab3-9ac9-3b17e00cd85d/98baa90b3b66803c5d7bd4537fca6993.fst"; //lovejoy +Avatar.displayName = "'Bot"; +var millisecondsToWaitBeforeStarting = 10 * 1000; // To give the various servers a chance to start. + +Agent.isAvatar = true; +Script.setTimeout(function () { + Avatar.position = Vec3.sum(origin, {x: Math.random() * spread, y: 0, z: Math.random() * spread}); + print("Starting at", JSON.stringify(Avatar.position)); + Avatar.startAnimation(animationData.url, animationData.fps || 30, 1, true, false, animationData.firstFrame || 0, animationData.lastFrame); +}, millisecondsToWaitBeforeStarting);