API to configure animation and particle effect

This commit is contained in:
luiscuenca 2018-09-25 06:03:29 -07:00
parent 012cd207b3
commit 3e2ee119f0
6 changed files with 293 additions and 178 deletions

View file

@ -81,7 +81,7 @@ AvatarManager::AvatarManager(QObject* parent) :
const float AVATAR_TRANSIT_TRIGGER_DISTANCE = 1.0f; const float AVATAR_TRANSIT_TRIGGER_DISTANCE = 1.0f;
const int AVATAR_TRANSIT_FRAME_COUNT = 11; // Based on testing const int AVATAR_TRANSIT_FRAME_COUNT = 11; // Based on testing
const int AVATAR_TRANSIT_FRAMES_PER_METER = 3; // Based on testing const int AVATAR_TRANSIT_FRAMES_PER_METER = 1; // Based on testing
const QString START_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; const QString START_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx";
const QString MIDDLE_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; const QString MIDDLE_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx";
@ -95,6 +95,8 @@ AvatarManager::AvatarManager(QObject* parent) :
_transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 0, 14); _transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 0, 14);
_transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 15, 0); _transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 15, 0);
_transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 16, 38); _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 16, 38);
setAvatarTransitEffectDefaultProperties();
} }
AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer) { AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer) {
@ -339,7 +341,6 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
} }
avatar->simulate(deltaTime, inView); avatar->simulate(deltaTime, inView);
avatar->updateRenderItem(renderTransaction); avatar->updateRenderItem(renderTransaction);
avatar->updateSpaceProxy(workloadTransaction); avatar->updateSpaceProxy(workloadTransaction);
@ -887,7 +888,7 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV
} }
} }
QVariantMap AvatarManager::getPalData(const QList<QString> specificAvatarIdentifiers) { QVariantMap AvatarManager::getPalData(const QList<QString> specificAvatarIdentifiers) {
QJsonArray palData; QJsonArray palData;
auto avatarMap = getHashCopy(); auto avatarMap = getHashCopy();
@ -933,178 +934,277 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV
return doc.toVariantMap(); return doc.toVariantMap();
} }
QVariantMap AvatarManager::getAvatarTransitData() { QVariantMap AvatarManager::getAvatarTransitData() {
QVariantMap result; QVariantMap result;
result["frameCount"] = _transitConfig._totalFrames; result["frameCount"] = _transitConfig._totalFrames;
result["framesPerMeter"] = _transitConfig._framesPerMeter; result["framesPerMeter"] = _transitConfig._framesPerMeter;
result["isDistanceBased"] = _transitConfig._isDistanceBased; result["isDistanceBased"] = _transitConfig._isDistanceBased;
result["triggerDistance"] = _transitConfig._triggerDistance; result["triggerDistance"] = _transitConfig._triggerDistance;
result["showAnimation"] = _transitConfig._showAnimation; result["showAnimation"] = _transitConfig._showAnimation;
result["easeType"] = (int)_transitConfig._easeType; result["easeType"] = (int)_transitConfig._easeType;
result["showParticles"] = _transitConfig._showParticles; result["showParticles"] = _transitConfig._showParticles;
return result; return result;
}
void AvatarManager::setAvatarTransitData(const QVariantMap& data) {
if (data.contains("frameCount")) {
_transitConfig._totalFrames = data["frameCount"].toInt();
}
if (data.contains("framesPerMeter")) {
_transitConfig._framesPerMeter = data["framesPerMeter"].toInt();
}
if (data.contains("isDistanceBased")) {
_transitConfig._isDistanceBased = data["isDistanceBased"].toBool();
}
if (data.contains("triggerDistance")) {
_transitConfig._triggerDistance = data["triggerDistance"].toDouble();
}
if (data.contains("showAnimation")) {
_transitConfig._showAnimation = data["showAnimation"].toBool();
}
if (data.contains("easeType")) {
_transitConfig._easeType = (AvatarTransit::EaseType)data["easeType"].toInt();
}
if (data.contains("showParticles")) {
_transitConfig._showParticles = data["showParticles"].toBool();
}
} }
AvatarTransit::TransitAnimation AvatarManager::getAnimationFromJsonObject(const QJsonObject& object) { void AvatarManager::setAvatarTransitData(const QVariantMap& data) {
QString animationUrl; if (data.contains("frameCount")) {
int firstFrame = 0; _transitConfig._totalFrames = data["frameCount"].toInt();
int frameCount = 0; }
if (object.contains("animationUrl")) { if (data.contains("framesPerMeter")) {
animationUrl = object["animationUrl"].toString(); _transitConfig._framesPerMeter = data["framesPerMeter"].toInt();
} }
if (object.contains("firstFrame")) { if (data.contains("isDistanceBased")) {
firstFrame = object["firstFrame"].toInt(); _transitConfig._isDistanceBased = data["isDistanceBased"].toBool();
} }
if (object.contains("frameCount")) { if (data.contains("triggerDistance")) {
frameCount = object["frameCount"].toInt(); _transitConfig._triggerDistance = data["triggerDistance"].toDouble();
} }
return AvatarTransit::TransitAnimation(animationUrl, firstFrame, frameCount); if (data.contains("showAnimation")) {
} _transitConfig._showAnimation = data["showAnimation"].toBool();
}
void AvatarManager::setAvatarTransitAnimationData(const QVariantMap& data) { if (data.contains("easeType")) {
AvatarTransit::TransitAnimation startAnimation, middleAnimation, endAnimation; _transitConfig._easeType = (AvatarTransit::EaseType)data["easeType"].toInt();
}
if (data.contains("startAnimation")) { if (data.contains("showParticles")) {
QJsonObject object = data["startAnimation"].toJsonObject(); _transitConfig._showParticles = data["showParticles"].toBool();
_transitConfig._startTransitAnimation = getAnimationFromJsonObject(object); }
}
if (data.contains("middleAnimation")) {
QJsonObject object = data["middleAnimation"].toJsonObject();
_transitConfig._middleTransitAnimation = getAnimationFromJsonObject(object);
}
if (data.contains("endAnimation")) {
QJsonObject object = data["endAnimation"].toJsonObject();
_transitConfig._endTransitAnimation = getAnimationFromJsonObject(object);
}
} }
void AvatarManager::changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID) { AvatarTransit::TransitAnimation AvatarManager::getAnimationFromJsonObject(const QJsonObject& object) {
QString animationUrl;
if (!_transitConfig._showParticles) { int firstFrame = 0;
return; int frameCount = 0;
} if (object.contains("animationUrl")) {
EntityItemProperties props = getAvatarTransitEffectProperties(); animationUrl = object["animationUrl"].toString();
props.setParentID(avatarID); }
if (object.contains("firstFrame")) {
switch (status) { firstFrame = object["firstFrame"].toInt();
case AvatarTransit::Status::IDLE: }
case AvatarTransit::Status::TRANSITING: if (object.contains("frameCount")) {
case AvatarTransit::Status::START_FRAME: frameCount = object["frameCount"].toInt();
case AvatarTransit::Status::END_FRAME: }
break; return AvatarTransit::TransitAnimation(animationUrl, firstFrame, frameCount);
case AvatarTransit::Status::START_TRANSIT: }
effectID = DependencyManager::get<EntityScriptingInterface>()->addEntity(props);
break;
case AvatarTransit::Status::END_TRANSIT:
props = DependencyManager::get<EntityScriptingInterface>()->getEntityProperties(effectID);
props.setIsEmitting(false);
auto nid = DependencyManager::get<EntityScriptingInterface>()->editEntity(effectID, props);
break;
}
}
EntityItemProperties AvatarManager::getAvatarTransitEffectProperties() { void AvatarManager::setAvatarTransitAnimationData(const QVariantMap& data) {
EntityItemProperties props; AvatarTransit::TransitAnimation startAnimation, middleAnimation, endAnimation;
props.setIsEmitting(true); if (data.contains("startAnimation")) {
props.setLifetime(5.0f); QJsonObject object = data["startAnimation"].toJsonObject();
props.setLifespan(2.7f); _transitConfig._startTransitAnimation = getAnimationFromJsonObject(object);
props.setMaxParticles(200.0f); }
props.setEmitRate(200.0); if (data.contains("middleAnimation")) {
props.setEmitSpeed(2.8f); QJsonObject object = data["middleAnimation"].toJsonObject();
props.setSpeedSpread(0.2f); _transitConfig._middleTransitAnimation = getAnimationFromJsonObject(object);
props.setLocalPosition(glm::vec3(0.0f, -1.0f, 0.0f)); }
props.setEmitDimensions(glm::vec3(0.0f, 0.0f, 0.0f)); if (data.contains("endAnimation")) {
props.setEmitOrientation(Quaternions::X_180); QJsonObject object = data["endAnimation"].toJsonObject();
props.setEmitterShouldTrail(true); _transitConfig._endTransitAnimation = getAnimationFromJsonObject(object);
props.setParticleRadius(0.24f); }
props.setRadiusSpread(0.0f); }
props.setRadiusStart(0.0f);
props.setRadiusFinish(0.21f); void AvatarManager::changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID) {
props.setColor(xColor(0.0f, 180.0f, 239.0f));
props.setColorStart(glm::vec3(200.0f, 200.0f, 200.0f)); if (!_transitConfig._showParticles) {
props.setColorFinish(glm::vec3(0.0f, 0.0f, 0.0f)); return;
props.setEmitAcceleration(glm::vec3(0.0f, 0.0f, 0.0f)); }
props.setAlpha(0.15f); _transitEffectProperties.setParentID(avatarID);
props.setAccelerationSpread(glm::vec3(0.5f, 1.0f, 0.5f)); std::shared_ptr<Avatar> avatar;
props.setAlphaSpread(0.0f); avatar = (avatarID != _myAvatar->getID()) ? std::static_pointer_cast<Avatar>(getAvatarBySessionID(avatarID)) : _myAvatar;
props.setAlphaStart(0.3f);
props.setAlphaFinish(0.0f); _transitEffectProperties.setLifetime(_transitEffectProperties.getLifespan() + avatar->getTransit()->getTransitTime());
props.setParticleSpin(4.78f); float feetOffset = glm::length(avatar->getWorldPosition() - avatar->getWorldFeetPosition());
props.setParentJointIndex(_myAvatar->getJointIndex("neck")); _transitEffectProperties.setLocalPosition(glm::vec3(0.0f, -feetOffset, 0.0f));
props.setType(EntityTypes::ParticleEffect);
props.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/spark.png"); EntityItemProperties props;
props.setSpinSpread(0.0f); switch (status) {
props.setSpinStart(-4.57f); case AvatarTransit::Status::IDLE:
props.setSpinFinish(4.67f); case AvatarTransit::Status::TRANSITING:
props.setRotateWithEntity(false); case AvatarTransit::Status::START_FRAME:
props.setPolarStart(0.0f); case AvatarTransit::Status::END_FRAME:
props.setPolarFinish(0.0f); break;
props.setAzimuthStart(-3.1415f); case AvatarTransit::Status::START_TRANSIT:
props.setAzimuthFinish(3.1415f); effectID = DependencyManager::get<EntityScriptingInterface>()->addEntity(_transitEffectProperties);
props.setRotateWithEntity(true); break;
props.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); case AvatarTransit::Status::END_TRANSIT:
props.setParentJointIndex(_myAvatar->getJointIndex("head")); props = DependencyManager::get<EntityScriptingInterface>()->getEntityProperties(effectID);
/* props.setIsEmitting(false);
props.setIsEmitting(true); auto nid = DependencyManager::get<EntityScriptingInterface>()->editEntity(effectID, props);
props.setLifespan(0.5); break;
props.setMaxParticles(50); }
props.setEmitRate(50); }
props.setEmitSpeed(0.1f);
props.setSpeedSpread(0.1f); void AvatarManager::setAvatarTransitEffectData(const QVariantMap& data) {
props.setEmitDimensions(glm::vec3(0, 0, 0)); auto jsonToVector = [](const QJsonObject& object) {
props.setEmitOrientation(Quaternions::IDENTITY); if (object.contains("x") && object.contains("y") && object.contains("z")) {
props.setEmitterShouldTrail(true); float x = (float)object["x"].toDouble();
props.setParticleRadius(0.05f); float y = (float)object["y"].toDouble();
props.setRadiusSpread(0); float z = (float)object["z"].toDouble();
props.setRadiusStart(0); return glm::vec3(x, y, z);
props.setRadiusFinish(0.1); }
props.setColor(xColor(0, 180, 239)); return glm::vec3(0.0f, 0.0f, 0.0f);
props.setColorStart(glm::vec3(200, 200, 200)); };
props.setColorFinish(glm::vec3(0, 0, 0));
props.setEmitAcceleration(glm::vec3(0, 0, 0)); auto jsonToQuat = [jsonToVector](const QJsonObject& object) {
props.setAlpha(0.3); glm::vec3 components = jsonToVector(object);
props.setAccelerationSpread(glm::vec3(0.5, 1, 0.5)); if (object.contains("w")) {
props.setAlphaSpread(0.3); float w = (float)object["w"].toDouble();
props.setAlphaStart(1); return glm::quat(components.x, components.y, components.z, w);
props.setAlphaFinish(0); }
props.setParticleSpin(3.3); return Quaternions::IDENTITY;
props.setParentJointIndex(_myAvatar->getJointIndex("head")); };
props.setType(EntityTypes::ParticleEffect);
props.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/circle.png"); auto jsonToColor = [jsonToVector](const QJsonObject& object) {
props.setSpinSpread(2.53); glm::vec3 components = jsonToVector(object);
props.setSpinStart(3.31); return xColor(components.x, components.y, components.z);
props.setSpinFinish(3.31); };
props.setRotateWithEntity(false);
props.setPolarStart(0); _transitEffectProperties.setType(EntityTypes::ParticleEffect);
props.setPolarFinish(3.1415);
props.setAzimuthStart(-3.1415); if (data.contains("isEmitting")) {
props.setAzimuthFinish(3.1415); _transitEffectProperties.setIsEmitting(data["isEmitting"].toBool());
props.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); }
*/ if (data.contains("lifetime")) {
return props; _transitEffectProperties.setLifetime(data["lifetime"].toFloat());
} }
if (data.contains("lifespan")) {
_transitEffectProperties.setLifespan(data["lifespan"].toFloat());
}
if (data.contains("maxParticles")) {
_transitEffectProperties.setMaxParticles(data["maxParticles"].toFloat());
}
if (data.contains("emitRate")) {
_transitEffectProperties.setEmitRate(data["emitRate"].toFloat());
}
if (data.contains("emitSpeed")) {
_transitEffectProperties.setEmitSpeed(data["emitSpeed"].toFloat());
}
if (data.contains("speedSpread")) {
_transitEffectProperties.setSpeedSpread(data["speedSpread"].toFloat());
}
if (data.contains("localPosition")) {
_transitEffectProperties.setLocalPosition(jsonToVector(data["localPosition"].toJsonObject()));
}
if (data.contains("emitDimensions")) {
_transitEffectProperties.setEmitDimensions(jsonToVector(data["emitDimensions"].toJsonObject()));
}
if (data.contains("emitOrientation")) {
_transitEffectProperties.setEmitOrientation(jsonToQuat(data["emitOrientation"].toJsonObject()));
}
if (data.contains("emitterShouldTrail")) {
_transitEffectProperties.setEmitterShouldTrail(data["emitterShouldTrail"].toBool());
}
if (data.contains("particleRadius")) {
_transitEffectProperties.setParticleRadius(data["particleRadius"].toFloat());
}
if (data.contains("radiusSpread")) {
_transitEffectProperties.setRadiusSpread(data["radiusSpread"].toFloat());
}
if (data.contains("radiusStart")) {
_transitEffectProperties.setRadiusStart(data["radiusStart"].toFloat());
}
if (data.contains("radiusFinish")) {
_transitEffectProperties.setRadiusFinish(data["radiusFinish"].toFloat());
}
if (data.contains("color")) {
_transitEffectProperties.setColor(jsonToColor(data["color"].toJsonObject()));
}
if (data.contains("colorStart")) {
_transitEffectProperties.setColorStart(jsonToVector(data["colorStart"].toJsonObject()));
}
if (data.contains("colorFinish")) {
_transitEffectProperties.setColorFinish(jsonToVector(data["colorFinish"].toJsonObject()));
}
if (data.contains("emitAcceleration")) {
_transitEffectProperties.setEmitAcceleration(jsonToVector(data["emitAcceleration"].toJsonObject()));
}
if (data.contains("alpha")) {
_transitEffectProperties.setAlpha(data["alpha"].toFloat());
}
if (data.contains("accelerationSpread")) {
_transitEffectProperties.setAccelerationSpread(jsonToVector(data["accelerationSpread"].toJsonObject()));
}
if (data.contains("alphaSpread")) {
_transitEffectProperties.setAlphaSpread(data["alphaSpread"].toFloat());
}
if (data.contains("alphaStart")) {
_transitEffectProperties.setAlphaStart(data["alphaStart"].toFloat());
}
if (data.contains("alphaFinish")) {
_transitEffectProperties.setAlphaFinish(data["alphaFinish"].toFloat());
}
if (data.contains("particleSpin")) {
_transitEffectProperties.setParticleSpin(data["particleSpin"].toFloat());
}
if (data.contains("textures")) {
_transitEffectProperties.setTextures(data["textures"].toString());
}
if (data.contains("spinSpread")) {
_transitEffectProperties.setSpinSpread(data["spinSpread"].toFloat());
}
if (data.contains("spinStart")) {
_transitEffectProperties.setSpinStart(data["spinStart"].toFloat());
}
if (data.contains("spinFinish")) {
_transitEffectProperties.setSpinFinish(data["spinFinish"].toFloat());
}
if (data.contains("rotateWithEntity")) {
_transitEffectProperties.setRotateWithEntity(data["rotateWithEntity"].toBool());
}
if (data.contains("polarStart")) {
_transitEffectProperties.setPolarStart(data["polarStart"].toFloat());
}
if (data.contains("polarFinish")) {
_transitEffectProperties.setPolarFinish(data["polarFinish"].toFloat());
}
if (data.contains("azimuthStart")) {
_transitEffectProperties.setAzimuthStart(data["azimuthStart"].toFloat());
}
if (data.contains("azimuthFinish")) {
_transitEffectProperties.setAzimuthFinish(data["azimuthFinish"].toFloat());
}
if (data.contains("userData")) {
_transitEffectProperties.setUserData(data["userData"].toString());
} else {
_transitEffectProperties.setUserData("{\"grabbableKey\":{\"grabbable\":false}}");
}
}
void AvatarManager::setAvatarTransitEffectDefaultProperties() {
_transitEffectProperties.setIsEmitting(true);
_transitEffectProperties.setLifespan(2.7f);
_transitEffectProperties.setMaxParticles(200.0f);
_transitEffectProperties.setEmitRate(200.0);
_transitEffectProperties.setEmitSpeed(2.8f);
_transitEffectProperties.setSpeedSpread(0.2f);
_transitEffectProperties.setEmitDimensions(glm::vec3(0.0f, 0.0f, 0.0f));
_transitEffectProperties.setEmitOrientation(Quaternions::X_180);
_transitEffectProperties.setEmitterShouldTrail(true);
_transitEffectProperties.setParticleRadius(0.24f);
_transitEffectProperties.setRadiusSpread(0.0f);
_transitEffectProperties.setRadiusStart(0.0f);
_transitEffectProperties.setRadiusFinish(0.21f);
_transitEffectProperties.setColor(xColor(0.0f, 180.0f, 239.0f));
_transitEffectProperties.setColorStart(glm::vec3(200.0f, 200.0f, 200.0f));
_transitEffectProperties.setColorFinish(glm::vec3(0.0f, 0.0f, 0.0f));
_transitEffectProperties.setEmitAcceleration(glm::vec3(0.0f, 0.0f, 0.0f));
_transitEffectProperties.setAlpha(0.15f);
_transitEffectProperties.setAccelerationSpread(glm::vec3(0.5f, 1.0f, 0.5f));
_transitEffectProperties.setAlphaSpread(0.0f);
_transitEffectProperties.setAlphaStart(0.3f);
_transitEffectProperties.setAlphaFinish(0.0f);
_transitEffectProperties.setParticleSpin(4.78f);
_transitEffectProperties.setType(EntityTypes::ParticleEffect);
_transitEffectProperties.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/spark.png");
_transitEffectProperties.setSpinSpread(0.0f);
_transitEffectProperties.setSpinStart(-4.57f);
_transitEffectProperties.setSpinFinish(4.67f);
_transitEffectProperties.setRotateWithEntity(false);
_transitEffectProperties.setPolarStart(0.0f);
_transitEffectProperties.setPolarFinish(0.0f);
_transitEffectProperties.setAzimuthStart(-3.1415f);
_transitEffectProperties.setAzimuthFinish(3.1415f);
_transitEffectProperties.setRotateWithEntity(true);
_transitEffectProperties.setUserData("{\"grabbableKey\":{\"grabbable\":false}}");
}

View file

@ -24,6 +24,7 @@
#include <SimpleMovingAverage.h> #include <SimpleMovingAverage.h>
#include <shared/RateCounter.h> #include <shared/RateCounter.h>
#include <avatars-renderer/ScriptAvatar.h> #include <avatars-renderer/ScriptAvatar.h>
#include <EntityItemProperties.h>
#include <AudioInjector.h> #include <AudioInjector.h>
#include <workload/Space.h> #include <workload/Space.h>
@ -31,6 +32,7 @@
#include "MyAvatar.h" #include "MyAvatar.h"
#include "OtherAvatar.h" #include "OtherAvatar.h"
using SortedAvatar = std::pair<float, std::shared_ptr<Avatar>>; using SortedAvatar = std::pair<float, std::shared_ptr<Avatar>>;
/**jsdoc /**jsdoc
@ -183,7 +185,7 @@ public:
Q_INVOKABLE QVariantMap getAvatarTransitData(); Q_INVOKABLE QVariantMap getAvatarTransitData();
Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data); Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data);
Q_INVOKABLE void setAvatarTransitAnimationData(const QVariantMap& data); Q_INVOKABLE void setAvatarTransitAnimationData(const QVariantMap& data);
EntityItemProperties getAvatarTransitEffectProperties(); Q_INVOKABLE void setAvatarTransitEffectData(const QVariantMap& data);
float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); }
int getIdentityRequestsSent() const { return _identityRequestsSent; } int getIdentityRequestsSent() const { return _identityRequestsSent; }
@ -214,6 +216,7 @@ private:
void playTransitAnimations(AvatarTransit::Status status); void playTransitAnimations(AvatarTransit::Status status);
AvatarTransit::TransitAnimation getAnimationFromJsonObject(const QJsonObject& object); AvatarTransit::TransitAnimation getAnimationFromJsonObject(const QJsonObject& object);
void AvatarManager::setAvatarTransitEffectDefaultProperties();
QVector<AvatarSharedPointer> _avatarsToFade; QVector<AvatarSharedPointer> _avatarsToFade;
QVector<AvatarSharedPointer> _avatarsToCopy; QVector<AvatarSharedPointer> _avatarsToCopy;
@ -239,8 +242,8 @@ private:
std::vector<int32_t> _spaceProxiesToDelete; std::vector<int32_t> _spaceProxiesToDelete;
// Other avatars smooth transit global configuration // Other avatars smooth transit global configuration
AvatarTransit::TransitConfig _transitConfig; AvatarTransit::TransitConfig _transitConfig;
EntityItemProperties _transitEffectProperties;
}; };
#endif // hifi_AvatarManager_h #endif // hifi_AvatarManager_h

View file

@ -916,6 +916,7 @@ void MyAvatar::updateSensorToWorldMatrix() {
updateJointFromController(controller::Action::RIGHT_HAND, _controllerRightHandMatrixCache); updateJointFromController(controller::Action::RIGHT_HAND, _controllerRightHandMatrixCache);
if (hasSensorToWorldScaleChanged) { if (hasSensorToWorldScaleChanged) {
setTransitScale(sensorToWorldScale);
emit sensorToWorldScaleChanged(sensorToWorldScale); emit sensorToWorldScaleChanged(sensorToWorldScale);
} }

View file

@ -251,9 +251,9 @@ void setupPreferences() {
{ {
auto getter = [myAvatar]()->int { return myAvatar->getShowTransit() ? 0 : 1; }; auto getter = [myAvatar]()->int { return myAvatar->getShowTransit() ? 0 : 1; };
auto setter = [myAvatar](int value) { myAvatar->setShowTransit(value == 0); }; auto setter = [myAvatar](int value) { myAvatar->setShowTransit(value == 0); };
auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Show transit / Hide transit", getter, setter); auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Snap teleport / Smooth teleport", getter, setter);
QStringList items; QStringList items;
items << "Show transit" << "Hide Transit"; items << "Snap teleport" << "Smooth teleport";
preference->setItems(items); preference->setItems(items);
preferences->addPreference(preference); preferences->addPreference(preference);
} }

View file

@ -116,8 +116,9 @@ void Avatar::setShowNamesAboveHeads(bool show) {
AvatarTransit::Status AvatarTransit::update(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { AvatarTransit::Status AvatarTransit::update(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) {
glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition;
float oneFrameDistance = glm::length(currentPosition - _lastPosition); float oneFrameDistance = glm::length(currentPosition - _lastPosition);
const float MAX_TRANSIT_DISTANCE = 20.0f; const float MAX_TRANSIT_DISTANCE = 30.0f;
if (oneFrameDistance > config._triggerDistance && oneFrameDistance < MAX_TRANSIT_DISTANCE && !_isTransiting) { float scaledMaxTransitDistance = MAX_TRANSIT_DISTANCE * _scale;
if (oneFrameDistance > config._triggerDistance && oneFrameDistance < scaledMaxTransitDistance && !_isTransiting) {
start(deltaTime, _lastPosition, currentPosition, config); start(deltaTime, _lastPosition, currentPosition, config);
} }
_lastPosition = currentPosition; _lastPosition = currentPosition;
@ -1988,6 +1989,11 @@ AvatarTransit::Status Avatar::updateTransit(float deltaTime, const glm::vec3& av
return _transit.update(deltaTime, avatarPosition, config); return _transit.update(deltaTime, avatarPosition, config);
} }
void Avatar::setTransitScale(float scale) {
std::lock_guard<std::mutex> lock(_transitLock);
return _transit.setScale(scale);
}
void Avatar::overrideNextPackagePositionData(const glm::vec3& position) { void Avatar::overrideNextPackagePositionData(const glm::vec3& position) {
std::lock_guard<std::mutex> lock(_transitLock); std::lock_guard<std::mutex> lock(_transitLock);
_overrideGlobalPosition = true; _overrideGlobalPosition = true;

View file

@ -98,6 +98,8 @@ public:
glm::vec3 getCurrentPosition() { return _currentPosition; } glm::vec3 getCurrentPosition() { return _currentPosition; }
bool getNextPosition(glm::vec3& nextPosition); bool getNextPosition(glm::vec3& nextPosition);
glm::vec3 getEndPosition() { return _endPosition; } glm::vec3 getEndPosition() { return _endPosition; }
float getTransitTime() { return _totalTime; }
void setScale(float scale) { _scale = scale; }
private: private:
Status updatePosition(float deltaTime); Status updatePosition(float deltaTime);
@ -122,6 +124,7 @@ private:
Status _status { Status::IDLE }; Status _status { Status::IDLE };
bool _showAnimation { false }; bool _showAnimation { false };
bool _showParticles { false }; bool _showParticles { false };
float _scale { 1.0f };
}; };
class Avatar : public AvatarData, public scriptable::ModelProvider { class Avatar : public AvatarData, public scriptable::ModelProvider {
@ -447,6 +450,8 @@ public:
std::shared_ptr<AvatarTransit> getTransit() { return std::make_shared<AvatarTransit>(_transit); }; std::shared_ptr<AvatarTransit> getTransit() { return std::make_shared<AvatarTransit>(_transit); };
AvatarTransit::Status updateTransit(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); AvatarTransit::Status updateTransit(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config);
void setTransitScale(float scale);
QUuid& getTransitEffectID() { return _transitEffectID; }; QUuid& getTransitEffectID() { return _transitEffectID; };
void overrideNextPackagePositionData(const glm::vec3& position); void overrideNextPackagePositionData(const glm::vec3& position);