From 6cfd831a5a5aaec8577325a1ef8af39ede85887a Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Sat, 21 Nov 2015 09:50:56 -0800 Subject: [PATCH] Menu: Added Developer > Avatar > Debug Draw Position Also renamed "Debug Draw Bind Pose" to "Debug Draw Default Pose" --- interface/src/Menu.cpp | 6 ++- interface/src/Menu.h | 3 +- interface/src/avatar/MyAvatar.cpp | 75 +++++++++++++------------------ interface/src/avatar/MyAvatar.h | 6 +-- libraries/animation/src/Rig.cpp | 12 +++-- libraries/animation/src/Rig.h | 1 + 6 files changed, 49 insertions(+), 54 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index c56b430622..561f0c7e1b 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -443,10 +443,12 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::FixGaze, 0, false); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableAvatarUpdateThreading, 0, false, qApp, SLOT(setAvatarUpdateThreading(bool))); - addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawBindPose, 0, false, - avatar, SLOT(setEnableDebugDrawBindPose(bool))); + addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawDefaultPose, 0, false, + avatar, SLOT(setEnableDebugDrawDefaultPose(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawAnimPose, 0, false, avatar, SLOT(setEnableDebugDrawAnimPose(bool))); + addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawPosition, 0, false, + avatar, SLOT(setEnableDebugDrawPosition(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::MeshVisible, 0, true, avatar, SLOT(setEnableMeshVisible(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::DisableEyelidAdjustment, 0, false); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 4efb7e7749..c30c04cc09 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -131,7 +131,8 @@ namespace MenuOption { const QString AddressBar = "Show Address Bar"; const QString Animations = "Animations..."; const QString AnimDebugDrawAnimPose = "Debug Draw Animation"; - const QString AnimDebugDrawBindPose = "Debug Draw Bind Pose"; + const QString AnimDebugDrawDefaultPose = "Debug Draw Default Pose"; + const QString AnimDebugDrawPosition= "Debug Draw Position"; const QString Antialiasing = "Antialiasing"; const QString AssetMigration = "ATP Asset Migration"; const QString Atmosphere = "Atmosphere"; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index e53eec95c1..cec110d874 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -40,7 +40,6 @@ #include #include "devices/Faceshift.h" - #include "Application.h" #include "AvatarManager.h" #include "Environment.h" @@ -353,12 +352,6 @@ void MyAvatar::updateHMDFollowVelocity() { // This is so the correct camera can be used for rendering. void MyAvatar::updateSensorToWorldMatrix() { -//#ifdef DEBUG_RENDERING - // draw marker about avatar's position - const glm::vec4 red(1.0f, 0.0f, 0.0f, 1.0f); - DebugDraw::getInstance().addMyAvatarMarker("pos", glm::quat(), glm::vec3(), red); -//#endif - // update the sensor mat so that the body position will end up in the desired // position when driven from the head. glm::mat4 desiredMat = createMatFromQuatAndPos(getOrientation(), getPosition()); @@ -631,13 +624,8 @@ float loadSetting(QSettings& settings, const char* name, float defaultValue) { return value; } -// Resource loading is not yet thread safe. If an animation is not loaded when requested by other than tha main thread, -// we block in AnimationHandle::setURL => AnimationCache::getAnimation. -// Meanwhile, the main thread will also eventually lock as it tries to render us. -// If we demand the animation from the update thread while we're locked, we'll deadlock. -// Until we untangle this, code puts the updates back on the main thread temporarilly and starts all the loading. -void MyAvatar::setEnableDebugDrawBindPose(bool isEnabled) { - _enableDebugDrawBindPose = isEnabled; +void MyAvatar::setEnableDebugDrawDefaultPose(bool isEnabled) { + _enableDebugDrawDefaultPose = isEnabled; if (!isEnabled) { AnimDebugDraw::getInstance().removeSkeleton("myAvatar"); @@ -652,6 +640,15 @@ void MyAvatar::setEnableDebugDrawAnimPose(bool isEnabled) { } } +void MyAvatar::setEnableDebugDrawPosition(bool isEnabled) { + if (isEnabled) { + const glm::vec4 red(1.0f, 0.0f, 0.0f, 1.0f); + DebugDraw::getInstance().addMyAvatarMarker("avatarPosition", glm::quat(), glm::vec3(), red); + } else { + DebugDraw::getInstance().removeMyAvatarMarker("avatarPosition"); + } +} + void MyAvatar::setEnableMeshVisible(bool isEnabled) { render::ScenePointer scene = qApp->getMain3DScene(); _skeletonModel.setVisibleInScene(isEnabled, scene); @@ -702,8 +699,9 @@ void MyAvatar::loadData() { settings.endGroup(); setEnableMeshVisible(Menu::getInstance()->isOptionChecked(MenuOption::MeshVisible)); - setEnableDebugDrawBindPose(Menu::getInstance()->isOptionChecked(MenuOption::AnimDebugDrawBindPose)); + setEnableDebugDrawDefaultPose(Menu::getInstance()->isOptionChecked(MenuOption::AnimDebugDrawDefaultPose)); setEnableDebugDrawAnimPose(Menu::getInstance()->isOptionChecked(MenuOption::AnimDebugDrawAnimPose)); + setEnableDebugDrawPosition(Menu::getInstance()->isOptionChecked(MenuOption::AnimDebugDrawPosition)); } void MyAvatar::saveAttachmentData(const AttachmentData& attachment) const { @@ -1257,34 +1255,33 @@ void MyAvatar::preRender(RenderArgs* renderArgs) { initHeadBones(); _skeletonModel.setCauterizeBoneSet(_headBoneSet); initAnimGraph(); - _debugDrawSkeleton = std::make_shared(_skeletonModel.getGeometry()->getFBXGeometry()); } - if (_enableDebugDrawBindPose || _enableDebugDrawAnimPose) { + if (_enableDebugDrawDefaultPose || _enableDebugDrawAnimPose) { + + auto animSkeleton = _rig->getAnimSkeleton(); // bones are aligned such that z is forward, not -z. glm::quat rotY180 = glm::angleAxis((float)M_PI, glm::vec3(0.0f, 1.0f, 0.0f)); AnimPose xform(glm::vec3(1), getOrientation() * rotY180, getPosition()); - /* - if (_enableDebugDrawBindPose && _debugDrawSkeleton) { + if (_enableDebugDrawDefaultPose && animSkeleton) { glm::vec4 gray(0.2f, 0.2f, 0.2f, 0.2f); - AnimDebugDraw::getInstance().addSkeleton("myAvatar", _debugDrawSkeleton, xform, gray); + AnimDebugDraw::getInstance().addSkeleton("myAvatar", animSkeleton, xform, gray); } - */ - if (_enableDebugDrawAnimPose && _debugDrawSkeleton) { + if (_enableDebugDrawAnimPose && animSkeleton) { glm::vec4 cyan(0.1f, 0.6f, 0.6f, 1.0f); auto rig = _skeletonModel.getRig(); // build absolute AnimPoseVec from rig AnimPoseVec absPoses; - absPoses.reserve(_debugDrawSkeleton->getNumJoints()); + absPoses.reserve(rig->getJointStateCount()); for (int i = 0; i < _rig->getJointStateCount(); i++) { absPoses.push_back(AnimPose(_rig->getJointTransform(i))); } - AnimDebugDraw::getInstance().addAbsolutePoses("myAvatar", _debugDrawSkeleton, absPoses, xform, cyan); + AnimDebugDraw::getInstance().addAbsolutePoses("myAvatar", animSkeleton, absPoses, xform, cyan); } } @@ -1749,28 +1746,18 @@ glm::mat4 MyAvatar::deriveBodyFromHMDSensor() const { const glm::vec3 DEFAULT_NECK_POS(0.0f, 1.70f, 0.0f); const glm::vec3 DEFAULT_HIPS_POS(0.0f, 1.05f, 0.0f); - vec3 localEyes, localNeck; - if (!_debugDrawSkeleton) { - localEyes = (((DEFAULT_RIGHT_EYE_POS + DEFAULT_LEFT_EYE_POS) / 2.0f) - DEFAULT_HIPS_POS); - localNeck = (DEFAULT_NECK_POS - DEFAULT_HIPS_POS); - } else { - // TODO: At the moment MyAvatar does not have access to the rig, which has the skeleton, which has the bind poses. - // for now use the _debugDrawSkeleton, which is initialized with the same FBX model as the rig. + int rightEyeIndex = _rig->indexOfJoint("RightEye"); + int leftEyeIndex = _rig->indexOfJoint("LeftEye"); + int neckIndex = _rig->indexOfJoint("Neck"); + int hipsIndex = _rig->indexOfJoint("Hips"); - // TODO: cache these indices. - int rightEyeIndex = _debugDrawSkeleton->nameToJointIndex("RightEye"); - int leftEyeIndex = _debugDrawSkeleton->nameToJointIndex("LeftEye"); - int neckIndex = _debugDrawSkeleton->nameToJointIndex("Neck"); - int hipsIndex = _debugDrawSkeleton->nameToJointIndex("Hips"); + glm::vec3 absRightEyePos = rightEyeIndex != -1 ? _rig->getAbsoluteDefaultPose(rightEyeIndex).trans : DEFAULT_RIGHT_EYE_POS; + glm::vec3 absLeftEyePos = leftEyeIndex != -1 ? _rig->getAbsoluteDefaultPose(leftEyeIndex).trans : DEFAULT_LEFT_EYE_POS; + glm::vec3 absNeckPos = neckIndex != -1 ? _rig->getAbsoluteDefaultPose(neckIndex).trans : DEFAULT_NECK_POS; + glm::vec3 absHipsPos = neckIndex != -1 ? _rig->getAbsoluteDefaultPose(hipsIndex).trans : DEFAULT_HIPS_POS; - glm::vec3 absRightEyePos = rightEyeIndex != -1 ? _rig->getAbsoluteDefaultPose(rightEyeIndex).trans : DEFAULT_RIGHT_EYE_POS; - glm::vec3 absLeftEyePos = leftEyeIndex != -1 ? _rig->getAbsoluteDefaultPose(leftEyeIndex).trans : DEFAULT_LEFT_EYE_POS; - glm::vec3 absNeckPos = neckIndex != -1 ? _rig->getAbsoluteDefaultPose(neckIndex).trans : DEFAULT_NECK_POS; - glm::vec3 absHipsPos = neckIndex != -1 ? _rig->getAbsoluteDefaultPose(hipsIndex).trans : DEFAULT_HIPS_POS; - - localEyes = (((absRightEyePos + absLeftEyePos) / 2.0f) - absHipsPos); - localNeck = (absNeckPos - absHipsPos); - } + glm::vec3 localEyes = (((absRightEyePos + absLeftEyePos) / 2.0f) - absHipsPos); + glm::vec3 localNeck = (absNeckPos - absHipsPos); // apply simplistic head/neck model // figure out where the avatar body should be by applying offsets from the avatar's neck & head joints. diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index e6578c4e13..13575388e3 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -255,8 +255,9 @@ public slots: const QString& getAnimGraphUrl() const { return _animGraphUrl; } - void setEnableDebugDrawBindPose(bool isEnabled); + void setEnableDebugDrawDefaultPose(bool isEnabled); void setEnableDebugDrawAnimPose(bool isEnabled); + void setEnableDebugDrawPosition(bool isEnabled); void setEnableMeshVisible(bool isEnabled); void setAnimGraphUrl(const QString& url) { _animGraphUrl = url; } @@ -386,9 +387,8 @@ private: RigPointer _rig; bool _prevShouldDrawHead; - bool _enableDebugDrawBindPose { false }; + bool _enableDebugDrawDefaultPose { false }; bool _enableDebugDrawAnimPose { false }; - AnimSkeleton::ConstPointer _debugDrawSkeleton { nullptr }; AudioListenerMode _audioListenerMode; glm::vec3 _customListenPosition; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 4e47332e87..455b447f17 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -161,9 +161,9 @@ void Rig::prefetchAnimation(const QString& url) { } void Rig::destroyAnimGraph() { - _animSkeleton = nullptr; - _animLoader = nullptr; - _animNode = nullptr; + _animSkeleton.reset(); + _animLoader.reset(); + _animNode.reset(); _relativePoses.clear(); _absolutePoses.clear(); _overridePoses.clear(); @@ -237,7 +237,11 @@ int Rig::getJointStateCount() const { } int Rig::indexOfJoint(const QString& jointName) const { - return _animSkeleton->nameToJointIndex(jointName); + if (_animSkeleton) { + return _animSkeleton->nameToJointIndex(jointName); + } else { + return -1; + } } void Rig::setModelOffset(const glm::mat4& modelOffset) { diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index ee208f6b4e..9428ae2c5e 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -74,6 +74,7 @@ public: virtual ~Rig() {} void destroyAnimGraph(); + void overrideAnimation(const QString& url, float fps, bool loop, float firstFrame, float lastFrame); void restoreAnimation(); QStringList getAnimationRoles() const;