From 3167d3c0c726f791fff2d3c3041618e3032cd57a Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Thu, 23 Aug 2018 14:05:44 -0700 Subject: [PATCH] Create TransformNodes for SpatiallyNestables, the mouse, and MyAvatar head --- .../src/avatar/MyAvatarHeadTransformNode.cpp | 23 ++++++++++ .../src/avatar/MyAvatarHeadTransformNode.h | 19 ++++++++ interface/src/raypick/MouseTransformNode.cpp | 43 +++++++++++++++++++ interface/src/raypick/MouseTransformNode.h | 23 ++++++++++ .../shared/src/NestableTransformNode.cpp | 31 +++++++++++++ libraries/shared/src/NestableTransformNode.h | 25 +++++++++++ libraries/shared/src/TransformNode.h | 18 ++++++++ 7 files changed, 182 insertions(+) create mode 100644 interface/src/avatar/MyAvatarHeadTransformNode.cpp create mode 100644 interface/src/avatar/MyAvatarHeadTransformNode.h create mode 100644 interface/src/raypick/MouseTransformNode.cpp create mode 100644 interface/src/raypick/MouseTransformNode.h create mode 100644 libraries/shared/src/NestableTransformNode.cpp create mode 100644 libraries/shared/src/NestableTransformNode.h create mode 100644 libraries/shared/src/TransformNode.h diff --git a/interface/src/avatar/MyAvatarHeadTransformNode.cpp b/interface/src/avatar/MyAvatarHeadTransformNode.cpp new file mode 100644 index 0000000000..82c2f8b703 --- /dev/null +++ b/interface/src/avatar/MyAvatarHeadTransformNode.cpp @@ -0,0 +1,23 @@ +// +// Created by Sabrina Shanman 8/14/2018 +// Copyright 2018 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 +// + +#include "MyAvatarHeadTransformNode.h" + +#include "DependencyManager.h" +#include "AvatarManager.h" +#include "MyAvatar.h" + +Transform MyAvatarHeadTransformNode::getTransform() { + auto myAvatar = DependencyManager::get()->getMyAvatar(); + + glm::vec3 pos = myAvatar->getHeadPosition(); + glm::quat headOri = myAvatar->getHeadOrientation(); + glm::quat ori = headOri * glm::angleAxis(-PI / 2.0f, Vectors::RIGHT); + + return Transform(ori, myAvatar->scaleForChildren(), pos); +} \ No newline at end of file diff --git a/interface/src/avatar/MyAvatarHeadTransformNode.h b/interface/src/avatar/MyAvatarHeadTransformNode.h new file mode 100644 index 0000000000..a7d7144521 --- /dev/null +++ b/interface/src/avatar/MyAvatarHeadTransformNode.h @@ -0,0 +1,19 @@ +// +// Created by Sabrina Shanman 8/14/2018 +// Copyright 2018 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 +// +#ifndef hifi_MyAvatarHeadTransformNode_h +#define hifi_MyAvatarHeadTransformNode_h + +#include "TransformNode.h" + +class MyAvatarHeadTransformNode : public TransformNode { +public: + MyAvatarHeadTransformNode() { } + Transform getTransform() override; +}; + +#endif // hifi_MyAvatarHeadTransformNode_h \ No newline at end of file diff --git a/interface/src/raypick/MouseTransformNode.cpp b/interface/src/raypick/MouseTransformNode.cpp new file mode 100644 index 0000000000..4bc85ae69a --- /dev/null +++ b/interface/src/raypick/MouseTransformNode.cpp @@ -0,0 +1,43 @@ +// +// Created by Sabrina Shanman 8/14/2018 +// Copyright 2018 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 +// + +#include "MouseTransformNode.h" + +#include "DependencyManager.h" +#include "PickManager.h" +#include "MouseRayPick.h" + +const PickFilter MOUSE_TRANSFORM_NODE_PICK_FILTER( + 1 << PickFilter::PICK_ENTITIES | + 1 << PickFilter::PICK_AVATARS | + 1 << PickFilter::PICK_INCLUDE_NONCOLLIDABLE +); +const float MOUSE_TRANSFORM_NODE_MAX_DISTANCE = 1000.0f; + +MouseTransformNode::MouseTransformNode() { + _parentMouseRayPick = DependencyManager::get()->addPick(PickQuery::Ray, + std::make_shared(MOUSE_TRANSFORM_NODE_PICK_FILTER, MOUSE_TRANSFORM_NODE_MAX_DISTANCE, true)); +} + +MouseTransformNode::~MouseTransformNode() { + if (DependencyManager::isSet()) { + auto pickManager = DependencyManager::get(); + if (pickManager) { + pickManager->removePick(_parentMouseRayPick); + } + } +} + +Transform MouseTransformNode::getTransform() { + Transform transform; + std::shared_ptr rayPickResult = DependencyManager::get()->getPrevPickResultTyped(_parentMouseRayPick); + if (rayPickResult) { + transform.setTranslation(rayPickResult->intersection); + } + return transform; +} \ No newline at end of file diff --git a/interface/src/raypick/MouseTransformNode.h b/interface/src/raypick/MouseTransformNode.h new file mode 100644 index 0000000000..7a05370dd7 --- /dev/null +++ b/interface/src/raypick/MouseTransformNode.h @@ -0,0 +1,23 @@ +// +// Created by Sabrina Shanman 8/14/2018 +// Copyright 2018 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 +// +#ifndef hifi_MouseTransformNode_h +#define hifi_MouseTransformNode_h + +#include "TransformNode.h" + +class MouseTransformNode : public TransformNode { +public: + MouseTransformNode(); + ~MouseTransformNode(); + Transform getTransform() override; + +protected: + unsigned int _parentMouseRayPick = 0; +}; + +#endif // hifi_MouseTransformNode_h \ No newline at end of file diff --git a/libraries/shared/src/NestableTransformNode.cpp b/libraries/shared/src/NestableTransformNode.cpp new file mode 100644 index 0000000000..7fb7187aee --- /dev/null +++ b/libraries/shared/src/NestableTransformNode.cpp @@ -0,0 +1,31 @@ +// +// Created by Sabrina Shanman 8/14/2018 +// Copyright 2018 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 +// + +#include "NestableTransformNode.h" + +NestableTransformNode::NestableTransformNode(SpatiallyNestableWeakPointer spatiallyNestable, int jointIndex) : + _spatiallyNestable(spatiallyNestable), + _jointIndex(jointIndex) +{ +} + +Transform NestableTransformNode::getTransform() { + auto nestable = _spatiallyNestable.lock(); + if (!nestable) { + return Transform(); + } + + bool success; + Transform jointWorldTransform = nestable->getTransform(_jointIndex, success, 30); + + if (success) { + return jointWorldTransform; + } else { + return Transform(); + } +} \ No newline at end of file diff --git a/libraries/shared/src/NestableTransformNode.h b/libraries/shared/src/NestableTransformNode.h new file mode 100644 index 0000000000..131de9e786 --- /dev/null +++ b/libraries/shared/src/NestableTransformNode.h @@ -0,0 +1,25 @@ +// +// Created by Sabrina Shanman 8/14/2018 +// Copyright 2018 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 +// +#ifndef hifi_NestableTransformNode_h +#define hifi_NestableTransformNode_h + +#include "TransformNode.h" + +#include "SpatiallyNestable.h" + +class NestableTransformNode : public TransformNode { +public: + NestableTransformNode(SpatiallyNestableWeakPointer spatiallyNestable, int jointIndex); + Transform getTransform() override; + +protected: + SpatiallyNestableWeakPointer _spatiallyNestable; + int _jointIndex; +}; + +#endif // hifi_NestableTransformNode_h \ No newline at end of file diff --git a/libraries/shared/src/TransformNode.h b/libraries/shared/src/TransformNode.h new file mode 100644 index 0000000000..73223a8cee --- /dev/null +++ b/libraries/shared/src/TransformNode.h @@ -0,0 +1,18 @@ +// +// Created by Sabrina Shanman 8/14/2018 +// Copyright 2018 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 +// +#ifndef hifi_TransformNode_h +#define hifi_TransformNode_h + +#include "Transform.h" + +class TransformNode { +public: + virtual Transform getTransform() = 0; +}; + +#endif // hifi_TransformNode_h \ No newline at end of file