mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 22:39:18 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi into editHandleToggleFix
This commit is contained in:
commit
6f0ac32344
10 changed files with 128 additions and 64 deletions
|
@ -36,13 +36,13 @@
|
||||||
#include <SettingHandle.h>
|
#include <SettingHandle.h>
|
||||||
#include <UsersScriptingInterface.h>
|
#include <UsersScriptingInterface.h>
|
||||||
#include <UUID.h>
|
#include <UUID.h>
|
||||||
#include <avatars-renderer/OtherAvatar.h>
|
|
||||||
#include <shared/ConicalViewFrustum.h>
|
#include <shared/ConicalViewFrustum.h>
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
#include "InterfaceLogging.h"
|
#include "InterfaceLogging.h"
|
||||||
#include "Menu.h"
|
#include "Menu.h"
|
||||||
#include "MyAvatar.h"
|
#include "MyAvatar.h"
|
||||||
|
#include "OtherAvatar.h"
|
||||||
#include "SceneScriptingInterface.h"
|
#include "SceneScriptingInterface.h"
|
||||||
|
|
||||||
// 50 times per second - target is 45hz, but this helps account for any small deviations
|
// 50 times per second - target is 45hz, but this helps account for any small deviations
|
||||||
|
@ -192,6 +192,15 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
|
||||||
while (!sortedAvatars.empty()) {
|
while (!sortedAvatars.empty()) {
|
||||||
const SortableAvatar& sortData = sortedAvatars.top();
|
const SortableAvatar& sortData = sortedAvatars.top();
|
||||||
const auto avatar = std::static_pointer_cast<Avatar>(sortData.getAvatar());
|
const auto avatar = std::static_pointer_cast<Avatar>(sortData.getAvatar());
|
||||||
|
const auto otherAvatar = std::static_pointer_cast<OtherAvatar>(sortData.getAvatar());
|
||||||
|
|
||||||
|
// if the geometry is loaded then turn off the orb
|
||||||
|
if (avatar->getSkeletonModel()->isLoaded()) {
|
||||||
|
// remove the orb if it is there
|
||||||
|
otherAvatar->removeOrb();
|
||||||
|
} else {
|
||||||
|
otherAvatar->updateOrbPosition();
|
||||||
|
}
|
||||||
|
|
||||||
bool ignoring = DependencyManager::get<NodeList>()->isPersonalMutingNode(avatar->getID());
|
bool ignoring = DependencyManager::get<NodeList>()->isPersonalMutingNode(avatar->getID());
|
||||||
if (ignoring) {
|
if (ignoring) {
|
||||||
|
|
|
@ -250,7 +250,7 @@ public:
|
||||||
Q_ENUM(DriveKeys)
|
Q_ENUM(DriveKeys)
|
||||||
|
|
||||||
explicit MyAvatar(QThread* thread);
|
explicit MyAvatar(QThread* thread);
|
||||||
~MyAvatar();
|
virtual ~MyAvatar();
|
||||||
|
|
||||||
void instantiableAvatar() override {};
|
void instantiableAvatar() override {};
|
||||||
void registerMetaTypes(ScriptEnginePointer engine);
|
void registerMetaTypes(ScriptEnginePointer engine);
|
||||||
|
|
60
interface/src/avatar/OtherAvatar.cpp
Normal file
60
interface/src/avatar/OtherAvatar.cpp
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
//
|
||||||
|
// Created by Bradley Austin Davis on 2017/04/27
|
||||||
|
// Copyright 2013-2017 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 "OtherAvatar.h"
|
||||||
|
#include "Application.h"
|
||||||
|
|
||||||
|
OtherAvatar::OtherAvatar(QThread* thread) : Avatar(thread) {
|
||||||
|
// give the pointer to our head to inherited _headData variable from AvatarData
|
||||||
|
_headData = new Head(this);
|
||||||
|
_skeletonModel = std::make_shared<SkeletonModel>(this, nullptr);
|
||||||
|
_skeletonModel->setLoadingPriority(OTHERAVATAR_LOADING_PRIORITY);
|
||||||
|
connect(_skeletonModel.get(), &Model::setURLFinished, this, &Avatar::setModelURLFinished);
|
||||||
|
connect(_skeletonModel.get(), &Model::rigReady, this, &Avatar::rigReady);
|
||||||
|
connect(_skeletonModel.get(), &Model::rigReset, this, &Avatar::rigReset);
|
||||||
|
|
||||||
|
// add the purple orb
|
||||||
|
createOrb();
|
||||||
|
}
|
||||||
|
|
||||||
|
OtherAvatar::~OtherAvatar() {
|
||||||
|
removeOrb();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OtherAvatar::removeOrb() {
|
||||||
|
if (qApp->getOverlays().isAddedOverlay(_otherAvatarOrbMeshPlaceholderID)) {
|
||||||
|
qApp->getOverlays().deleteOverlay(_otherAvatarOrbMeshPlaceholderID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OtherAvatar::updateOrbPosition() {
|
||||||
|
if (_otherAvatarOrbMeshPlaceholder != nullptr) {
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setWorldPosition(getHead()->getPosition());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OtherAvatar::createOrb() {
|
||||||
|
if (_otherAvatarOrbMeshPlaceholderID == UNKNOWN_OVERLAY_ID ||
|
||||||
|
!qApp->getOverlays().isAddedOverlay(_otherAvatarOrbMeshPlaceholderID)) {
|
||||||
|
_otherAvatarOrbMeshPlaceholder = std::make_shared<Sphere3DOverlay>();
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setAlpha(1.0f);
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setColor({ 0xFF, 0x00, 0xFF });
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setIsSolid(false);
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setPulseMin(0.5);
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setPulseMax(1.0);
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setColorPulse(1.0);
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setIgnoreRayIntersection(true);
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setDrawInFront(false);
|
||||||
|
_otherAvatarOrbMeshPlaceholderID = qApp->getOverlays().addOverlay(_otherAvatarOrbMeshPlaceholder);
|
||||||
|
// Position focus
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setWorldOrientation(glm::quat(0.0f, 0.0f, 0.0f, 1.0));
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setWorldPosition(getHead()->getPosition());
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setDimensions(glm::vec3(0.5f, 0.5f, 0.5f));
|
||||||
|
_otherAvatarOrbMeshPlaceholder->setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
32
interface/src/avatar/OtherAvatar.h
Normal file
32
interface/src/avatar/OtherAvatar.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
//
|
||||||
|
// Created by Bradley Austin Davis on 2017/04/27
|
||||||
|
// Copyright 2013-2017 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_OtherAvatar_h
|
||||||
|
#define hifi_OtherAvatar_h
|
||||||
|
|
||||||
|
#include <avatars-renderer/Avatar.h>
|
||||||
|
#include "ui/overlays/Overlays.h"
|
||||||
|
#include "ui/overlays/Sphere3DOverlay.h"
|
||||||
|
#include "InterfaceLogging.h"
|
||||||
|
|
||||||
|
class OtherAvatar : public Avatar {
|
||||||
|
public:
|
||||||
|
explicit OtherAvatar(QThread* thread);
|
||||||
|
virtual ~OtherAvatar();
|
||||||
|
|
||||||
|
virtual void instantiableAvatar() override { };
|
||||||
|
virtual void createOrb() override;
|
||||||
|
void updateOrbPosition();
|
||||||
|
void removeOrb();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::shared_ptr<Sphere3DOverlay> _otherAvatarOrbMeshPlaceholder { nullptr };
|
||||||
|
OverlayID _otherAvatarOrbMeshPlaceholderID { UNKNOWN_OVERLAY_ID };
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // hifi_OtherAvatar_h
|
|
@ -1338,6 +1338,9 @@ void Avatar::scaleVectorRelativeToPosition(glm::vec3 &positionToScale) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
||||||
|
if (!isMyAvatar()) {
|
||||||
|
createOrb();
|
||||||
|
}
|
||||||
AvatarData::setSkeletonModelURL(skeletonModelURL);
|
AvatarData::setSkeletonModelURL(skeletonModelURL);
|
||||||
if (QThread::currentThread() == thread()) {
|
if (QThread::currentThread() == thread()) {
|
||||||
_skeletonModel->setURL(_skeletonModelURL);
|
_skeletonModel->setURL(_skeletonModelURL);
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include <graphics-scripting/Forward.h>
|
#include <graphics-scripting/Forward.h>
|
||||||
#include <GLMHelpers.h>
|
#include <GLMHelpers.h>
|
||||||
|
|
||||||
|
|
||||||
#include "Head.h"
|
#include "Head.h"
|
||||||
#include "SkeletonModel.h"
|
#include "SkeletonModel.h"
|
||||||
#include "Rig.h"
|
#include "Rig.h"
|
||||||
|
@ -41,7 +40,6 @@ static const float SCALING_RATIO = .05f;
|
||||||
extern const float CHAT_MESSAGE_SCALE;
|
extern const float CHAT_MESSAGE_SCALE;
|
||||||
extern const float CHAT_MESSAGE_HEIGHT;
|
extern const float CHAT_MESSAGE_HEIGHT;
|
||||||
|
|
||||||
|
|
||||||
enum ScreenTintLayer {
|
enum ScreenTintLayer {
|
||||||
SCREEN_TINT_BEFORE_LANDSCAPE = 0,
|
SCREEN_TINT_BEFORE_LANDSCAPE = 0,
|
||||||
SCREEN_TINT_BEFORE_AVATARS,
|
SCREEN_TINT_BEFORE_AVATARS,
|
||||||
|
@ -69,7 +67,7 @@ public:
|
||||||
static void setShowNamesAboveHeads(bool show);
|
static void setShowNamesAboveHeads(bool show);
|
||||||
|
|
||||||
explicit Avatar(QThread* thread);
|
explicit Avatar(QThread* thread);
|
||||||
~Avatar();
|
virtual ~Avatar();
|
||||||
|
|
||||||
virtual void instantiableAvatar() = 0;
|
virtual void instantiableAvatar() = 0;
|
||||||
|
|
||||||
|
@ -109,6 +107,7 @@ public:
|
||||||
float getLODDistance() const;
|
float getLODDistance() const;
|
||||||
|
|
||||||
virtual bool isMyAvatar() const override { return false; }
|
virtual bool isMyAvatar() const override { return false; }
|
||||||
|
virtual void createOrb() { }
|
||||||
|
|
||||||
virtual QVector<glm::quat> getJointRotations() const override;
|
virtual QVector<glm::quat> getJointRotations() const override;
|
||||||
using AvatarData::getJointRotation;
|
using AvatarData::getJointRotation;
|
||||||
|
@ -167,8 +166,8 @@ public:
|
||||||
|
|
||||||
virtual int parseDataFromBuffer(const QByteArray& buffer) override;
|
virtual int parseDataFromBuffer(const QByteArray& buffer) override;
|
||||||
|
|
||||||
static void renderJointConnectingCone( gpu::Batch& batch, glm::vec3 position1, glm::vec3 position2,
|
static void renderJointConnectingCone(gpu::Batch& batch, glm::vec3 position1, glm::vec3 position2,
|
||||||
float radius1, float radius2, const glm::vec4& color);
|
float radius1, float radius2, const glm::vec4& color);
|
||||||
|
|
||||||
virtual void applyCollision(const glm::vec3& contactPoint, const glm::vec3& penetration) { }
|
virtual void applyCollision(const glm::vec3& contactPoint, const glm::vec3& penetration) { }
|
||||||
|
|
||||||
|
@ -235,7 +234,7 @@ public:
|
||||||
|
|
||||||
/// Scales a world space position vector relative to the avatar position and scale
|
/// Scales a world space position vector relative to the avatar position and scale
|
||||||
/// \param vector position to be scaled. Will store the result
|
/// \param vector position to be scaled. Will store the result
|
||||||
void scaleVectorRelativeToPosition(glm::vec3 &positionToScale) const;
|
void scaleVectorRelativeToPosition(glm::vec3& positionToScale) const;
|
||||||
|
|
||||||
void slamPosition(const glm::vec3& position);
|
void slamPosition(const glm::vec3& position);
|
||||||
virtual void updateAttitude(const glm::quat& orientation) override;
|
virtual void updateAttitude(const glm::quat& orientation) override;
|
||||||
|
@ -254,7 +253,6 @@ public:
|
||||||
void setPositionViaScript(const glm::vec3& position) override;
|
void setPositionViaScript(const glm::vec3& position) override;
|
||||||
void setOrientationViaScript(const glm::quat& orientation) override;
|
void setOrientationViaScript(const glm::quat& orientation) override;
|
||||||
|
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* @function MyAvatar.getParentID
|
* @function MyAvatar.getParentID
|
||||||
* @returns {Uuid}
|
* @returns {Uuid}
|
||||||
|
@ -283,7 +281,6 @@ public:
|
||||||
// This calls through to the SpatiallyNestable versions, but is here to expose these to JavaScript.
|
// This calls through to the SpatiallyNestable versions, but is here to expose these to JavaScript.
|
||||||
Q_INVOKABLE virtual void setParentJointIndex(quint16 parentJointIndex) override;
|
Q_INVOKABLE virtual void setParentJointIndex(quint16 parentJointIndex) override;
|
||||||
|
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* Returns an array of joints, where each joint is an object containing name, index, and parentIndex fields.
|
* Returns an array of joints, where each joint is an object containing name, index, and parentIndex fields.
|
||||||
* @function MyAvatar.getSkeleton
|
* @function MyAvatar.getSkeleton
|
||||||
|
@ -349,7 +346,6 @@ public:
|
||||||
// not all subclasses of AvatarData have access to this data.
|
// not all subclasses of AvatarData have access to this data.
|
||||||
virtual bool canMeasureEyeHeight() const override { return true; }
|
virtual bool canMeasureEyeHeight() const override { return true; }
|
||||||
|
|
||||||
|
|
||||||
virtual float getModelScale() const { return _modelScale; }
|
virtual float getModelScale() const { return _modelScale; }
|
||||||
virtual void setModelScale(float scale) { _modelScale = scale; }
|
virtual void setModelScale(float scale) { _modelScale = scale; }
|
||||||
virtual glm::vec3 scaleForChildren() const override { return glm::vec3(getModelScale()); }
|
virtual glm::vec3 scaleForChildren() const override { return glm::vec3(getModelScale()); }
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
//
|
|
||||||
// Created by Bradley Austin Davis on 2017/04/27
|
|
||||||
// Copyright 2013-2017 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 "OtherAvatar.h"
|
|
||||||
|
|
||||||
OtherAvatar::OtherAvatar(QThread* thread) : Avatar(thread) {
|
|
||||||
// give the pointer to our head to inherited _headData variable from AvatarData
|
|
||||||
_headData = new Head(this);
|
|
||||||
_skeletonModel = std::make_shared<SkeletonModel>(this, nullptr);
|
|
||||||
_skeletonModel->setLoadingPriority(OTHERAVATAR_LOADING_PRIORITY);
|
|
||||||
connect(_skeletonModel.get(), &Model::setURLFinished, this, &Avatar::setModelURLFinished);
|
|
||||||
connect(_skeletonModel.get(), &Model::rigReady, this, &Avatar::rigReady);
|
|
||||||
connect(_skeletonModel.get(), &Model::rigReset, this, &Avatar::rigReset);
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
//
|
|
||||||
// Created by Bradley Austin Davis on 2017/04/27
|
|
||||||
// Copyright 2013-2017 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_OtherAvatar_h
|
|
||||||
#define hifi_OtherAvatar_h
|
|
||||||
|
|
||||||
#include "Avatar.h"
|
|
||||||
|
|
||||||
class OtherAvatar : public Avatar {
|
|
||||||
public:
|
|
||||||
explicit OtherAvatar(QThread* thread);
|
|
||||||
virtual void instantiableAvatar() override {};
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // hifi_OtherAvatar_h
|
|
|
@ -1639,22 +1639,24 @@ QVariantMap ScriptEngine::fetchModuleSource(const QString& modulePath, const boo
|
||||||
loader->start(MAX_RETRIES);
|
loader->start(MAX_RETRIES);
|
||||||
|
|
||||||
if (!loader->isFinished()) {
|
if (!loader->isFinished()) {
|
||||||
QTimer monitor;
|
// This lambda can get called AFTER this local scope has completed.
|
||||||
QEventLoop loop;
|
// This is why we pass smart ptrs to the lambda instead of references to local variables.
|
||||||
QObject::connect(loader, &BatchLoader::finished, this, [&monitor, &loop]{
|
auto monitor = std::make_shared<QTimer>();
|
||||||
monitor.stop();
|
auto loop = std::make_shared<QEventLoop>();
|
||||||
loop.quit();
|
QObject::connect(loader, &BatchLoader::finished, this, [monitor, loop] {
|
||||||
|
monitor->stop();
|
||||||
|
loop->quit();
|
||||||
});
|
});
|
||||||
|
|
||||||
// this helps detect the case where stop() is invoked during the download
|
// this helps detect the case where stop() is invoked during the download
|
||||||
// but not seen in time to abort processing in onload()...
|
// but not seen in time to abort processing in onload()...
|
||||||
connect(&monitor, &QTimer::timeout, this, [this, &loop]{
|
connect(monitor.get(), &QTimer::timeout, this, [this, loop] {
|
||||||
if (isStopping()) {
|
if (isStopping()) {
|
||||||
loop.exit(-1);
|
loop->exit(-1);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
monitor.start(500);
|
monitor->start(500);
|
||||||
loop.exec();
|
loop->exec();
|
||||||
}
|
}
|
||||||
loader->deleteLater();
|
loader->deleteLater();
|
||||||
return req;
|
return req;
|
||||||
|
|
|
@ -285,6 +285,7 @@ function printToPolaroid(image_url) {
|
||||||
var polaroid_url = image_url;
|
var polaroid_url = image_url;
|
||||||
|
|
||||||
var model_pos = Vec3.sum(MyAvatar.position, Vec3.multiply(1.25, Quat.getForward(MyAvatar.orientation)));
|
var model_pos = Vec3.sum(MyAvatar.position, Vec3.multiply(1.25, Quat.getForward(MyAvatar.orientation)));
|
||||||
|
model_pos.y += 0.2; // Print a bit closer to the head
|
||||||
|
|
||||||
var model_q1 = MyAvatar.orientation;
|
var model_q1 = MyAvatar.orientation;
|
||||||
var model_q2 = Quat.angleAxis(90, Quat.getRight(model_q1));
|
var model_q2 = Quat.angleAxis(90, Quat.getRight(model_q1));
|
||||||
|
@ -294,11 +295,11 @@ function printToPolaroid(image_url) {
|
||||||
"type": 'Model',
|
"type": 'Model',
|
||||||
"shapeType": 'box',
|
"shapeType": 'box',
|
||||||
|
|
||||||
"name": "New Snapshot",
|
"name": "Snapshot by " + MyAvatar.sessionDisplayName,
|
||||||
"description": "Printed from Snaps",
|
"description": "Printed from SNAP app",
|
||||||
"modelURL": POLAROID_MODEL_URL,
|
"modelURL": POLAROID_MODEL_URL,
|
||||||
|
|
||||||
"dimensions": { "x": 0.5667, "y": 0.0212, "z": 0.4176 },
|
"dimensions": { "x": 0.5667, "y": 0.042, "z": 0.4176 },
|
||||||
"position": model_pos,
|
"position": model_pos,
|
||||||
"rotation": model_rot,
|
"rotation": model_rot,
|
||||||
|
|
||||||
|
@ -306,9 +307,9 @@ function printToPolaroid(image_url) {
|
||||||
|
|
||||||
"density": 200,
|
"density": 200,
|
||||||
"restitution": 0.15,
|
"restitution": 0.15,
|
||||||
"gravity": { "x": 0, "y": -4.5, "z": 0 },
|
"gravity": { "x": 0, "y": -2.5, "z": 0 },
|
||||||
|
|
||||||
"velocity": { "x": 0, "y": 3.5, "z": 0 },
|
"velocity": { "x": 0, "y": 1.95, "z": 0 },
|
||||||
"angularVelocity": { "x": -1.0, "y": 0, "z": -1.3 },
|
"angularVelocity": { "x": -1.0, "y": 0, "z": -1.3 },
|
||||||
|
|
||||||
"dynamic": true,
|
"dynamic": true,
|
||||||
|
|
Loading…
Reference in a new issue