From e8ce1526876cfbba3c883891e9aa1165ea24adb6 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Wed, 5 Sep 2018 14:46:07 -0700 Subject: [PATCH] Scale collision picks relative to parent by adding and using more specialized transform nodes. --- .../src/raypick/PickScriptingInterface.cpp | 16 ++++++++-- .../src/ui/overlays/OverlayTransformNode.cpp | 30 +++++++++++++++++++ .../src/ui/overlays/OverlayTransformNode.h | 26 ++++++++++++++++ .../avatars-renderer/AvatarTransformNode.cpp | 30 +++++++++++++++++++ .../avatars-renderer/AvatarTransformNode.h | 25 ++++++++++++++++ .../entities/src/EntityTransformNode.cpp | 30 +++++++++++++++++++ libraries/entities/src/EntityTransformNode.h | 25 ++++++++++++++++ 7 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 interface/src/ui/overlays/OverlayTransformNode.cpp create mode 100644 interface/src/ui/overlays/OverlayTransformNode.h create mode 100644 libraries/avatars-renderer/src/avatars-renderer/AvatarTransformNode.cpp create mode 100644 libraries/avatars-renderer/src/avatars-renderer/AvatarTransformNode.h create mode 100644 libraries/entities/src/EntityTransformNode.cpp create mode 100644 libraries/entities/src/EntityTransformNode.h diff --git a/interface/src/raypick/PickScriptingInterface.cpp b/interface/src/raypick/PickScriptingInterface.cpp index 6dedf3fca1..c3a783a72b 100644 --- a/interface/src/raypick/PickScriptingInterface.cpp +++ b/interface/src/raypick/PickScriptingInterface.cpp @@ -24,11 +24,13 @@ #include "CollisionPick.h" #include "SpatialParentFinder.h" -#include "NestableTransformNode.h" #include "PickTransformNode.h" #include "MouseTransformNode.h" #include "avatar/MyAvatarHeadTransformNode.h" #include "avatar/AvatarManager.h" +#include "avatars-renderer/AvatarTransformNode.h" +#include "ui/overlays/OverlayTransformNode.h" +#include "EntityTransformNode.h" #include @@ -375,6 +377,16 @@ std::shared_ptr PickScriptingInterface::createTransformNode(const } auto sharedNestablePointer = nestablePointer.lock(); if (success && sharedNestablePointer) { + NestableType nestableType = sharedNestablePointer->getNestableType(); + if (nestableType == NestableType::Avatar) { + return std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); + } + if (nestableType == NestableType::Overlay) { + return std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); + } + if (nestableType == NestableType::Entity) { + return std::make_shared(std::static_pointer_cast(sharedNestablePointer), parentJointIndex); + } return std::make_shared(nestablePointer, parentJointIndex); } } @@ -394,7 +406,7 @@ std::shared_ptr PickScriptingInterface::createTransformNode(const } else if (!joint.isNull()) { auto myAvatar = DependencyManager::get()->getMyAvatar(); int jointIndex = myAvatar->getJointIndex(joint); - return std::make_shared(myAvatar, jointIndex); + return std::make_shared(myAvatar, jointIndex); } } diff --git a/interface/src/ui/overlays/OverlayTransformNode.cpp b/interface/src/ui/overlays/OverlayTransformNode.cpp new file mode 100644 index 0000000000..64f5be932c --- /dev/null +++ b/interface/src/ui/overlays/OverlayTransformNode.cpp @@ -0,0 +1,30 @@ +// +// Created by Sabrina Shanman 9/5/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 "OverlayTransformNode.h" + +OverlayTransformNode::OverlayTransformNode(std::weak_ptr overlay, int jointIndex) : + _overlay(overlay), + _jointIndex(jointIndex) +{} + +Transform OverlayTransformNode::getTransform() { + auto overlay = _overlay.lock(); + if (!overlay) { + return Transform(); + } + + bool success; + Transform jointWorldTransform = overlay->getTransform(_jointIndex, success); + if (!success) { + jointWorldTransform = Transform(); + } + + jointWorldTransform.setScale(overlay->getBounds().getScale()); + + return jointWorldTransform; +} \ No newline at end of file diff --git a/interface/src/ui/overlays/OverlayTransformNode.h b/interface/src/ui/overlays/OverlayTransformNode.h new file mode 100644 index 0000000000..79e6a37f45 --- /dev/null +++ b/interface/src/ui/overlays/OverlayTransformNode.h @@ -0,0 +1,26 @@ +// +// Created by Sabrina Shanman 9/5/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_OverlayTransformNode_h +#define hifi_OverlayTransformNode_h + +#include "NestableTransformNode.h" + +#include "Base3DOverlay.h" + +// For 3D overlays only +class OverlayTransformNode : public TransformNode { +public: + OverlayTransformNode(std::weak_ptr overlay, int jointIndex); + Transform getTransform() override; + +protected: + std::weak_ptr _overlay; + int _jointIndex; +}; + +#endif // hifi_OverlayTransformNode_h \ No newline at end of file diff --git a/libraries/avatars-renderer/src/avatars-renderer/AvatarTransformNode.cpp b/libraries/avatars-renderer/src/avatars-renderer/AvatarTransformNode.cpp new file mode 100644 index 0000000000..2f198e8917 --- /dev/null +++ b/libraries/avatars-renderer/src/avatars-renderer/AvatarTransformNode.cpp @@ -0,0 +1,30 @@ +// +// Created by Sabrina Shanman 9/5/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 "AvatarTransformNode.h" + +AvatarTransformNode::AvatarTransformNode(AvatarWeakPointer avatar, int jointIndex) : + _avatar(avatar), + _jointIndex(jointIndex) +{} + +Transform AvatarTransformNode::getTransform() { + auto avatar = _avatar.lock(); + if (!avatar) { + return Transform(); + } + + bool success; + Transform jointWorldTransform = avatar->getTransform(_jointIndex, success); + if (!success) { + jointWorldTransform = Transform(); + } + + jointWorldTransform.setScale(avatar->scaleForChildren()); + + return jointWorldTransform; +} \ No newline at end of file diff --git a/libraries/avatars-renderer/src/avatars-renderer/AvatarTransformNode.h b/libraries/avatars-renderer/src/avatars-renderer/AvatarTransformNode.h new file mode 100644 index 0000000000..9036d42639 --- /dev/null +++ b/libraries/avatars-renderer/src/avatars-renderer/AvatarTransformNode.h @@ -0,0 +1,25 @@ +// +// Created by Sabrina Shanman 9/5/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_AvatarTransformNode_h +#define hifi_AvatarTransformNode_h + +#include "NestableTransformNode.h" + +#include "Avatar.h" + +class AvatarTransformNode : public TransformNode { +public: + AvatarTransformNode(AvatarWeakPointer avatar, int jointIndex); + Transform getTransform() override; + +protected: + AvatarWeakPointer _avatar; + int _jointIndex; +}; + +#endif // hifi_AvatarTransformNode_h \ No newline at end of file diff --git a/libraries/entities/src/EntityTransformNode.cpp b/libraries/entities/src/EntityTransformNode.cpp new file mode 100644 index 0000000000..42b60759db --- /dev/null +++ b/libraries/entities/src/EntityTransformNode.cpp @@ -0,0 +1,30 @@ +// +// Created by Sabrina Shanman 9/5/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 "EntityTransformNode.h" + +EntityTransformNode::EntityTransformNode(EntityItemWeakPointer entity, int jointIndex) : + _entity(entity), + _jointIndex(jointIndex) +{} + +Transform EntityTransformNode::getTransform() { + auto entity = _entity.lock(); + if (!entity) { + return Transform(); + } + + bool success; + Transform jointWorldTransform = entity->getTransform(_jointIndex, success); + if (!success) { + jointWorldTransform = Transform(); + } + + jointWorldTransform.setScale(entity->getScaledDimensions()); + + return jointWorldTransform; +} \ No newline at end of file diff --git a/libraries/entities/src/EntityTransformNode.h b/libraries/entities/src/EntityTransformNode.h new file mode 100644 index 0000000000..fc5eeff652 --- /dev/null +++ b/libraries/entities/src/EntityTransformNode.h @@ -0,0 +1,25 @@ +// +// Created by Sabrina Shanman 9/5/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_EntityTransformNode_h +#define hifi_EntityTransformNode_h + +#include "NestableTransformNode.h" + +#include "EntityItem.h" + +class EntityTransformNode : public TransformNode { +public: + EntityTransformNode(EntityItemWeakPointer entity, int jointIndex); + Transform getTransform() override; + +protected: + EntityItemWeakPointer _entity; + int _jointIndex; +}; + +#endif // hifi_EntityTransformNode_h \ No newline at end of file