diff --git a/BUILD.md b/BUILD.md
index 2ec0cbfa6e..0e1a54f406 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -73,11 +73,14 @@ Where `/path/to/directory` is the path to a directory where you wish the build f
// The identifying tag of the release.
CMAKE_BACKTRACE_TOKEN
- // The release version. (e.g. 2021.4.2-Osiris)
+ // The release version, e.g., 2021.3.2.
RELEASE_NUMBER
- // Typically, this is the build commit short hash. (e.g. f1576ab)
+ // The release name, e.g., Eos.
+ RELEASE_NAME
+ // The build commit, e.g., use a Git hash for the most recent commit in the branch - fd6973b.
+
BUILD_NUMBER
-
+
// The type of release.
RELEASE_TYPE=PRODUCTION|PR|DEV
diff --git a/cmake/macros/GenerateInstallers.cmake b/cmake/macros/GenerateInstallers.cmake
index 640cc1720f..89eeecfbbb 100644
--- a/cmake/macros/GenerateInstallers.cmake
+++ b/cmake/macros/GenerateInstallers.cmake
@@ -4,6 +4,7 @@
#
# Created by Leonardo Murillo on 12/16/2015.
# Copyright 2015 High Fidelity, Inc.
+# Copyright 2021 Vircadia contributors.
#
# Distributed under the Apache License, Version 2.0.
# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@@ -31,7 +32,7 @@ macro(GENERATE_INSTALLERS)
set(CPACK_PACKAGE_NAME ${_DISPLAY_NAME})
set(CPACK_PACKAGE_VENDOR "Vircadia")
set(CPACK_PACKAGE_VERSION ${BUILD_VERSION})
- set(CPACK_PACKAGE_FILE_NAME "Vircadia${_PACKAGE_NAME_EXTRA}-${BUILD_VERSION}")
+ set(CPACK_PACKAGE_FILE_NAME "Vircadia${_PACKAGE_NAME_EXTRA}-${BUILD_VERSION}-${RELEASE_NAME}")
set(CPACK_NSIS_DISPLAY_NAME ${_DISPLAY_NAME})
set(CPACK_NSIS_PACKAGE_NAME ${_DISPLAY_NAME})
if (PR_BUILD)
diff --git a/interface/resources/qml/hifi/avatarapp/MessageBoxes.qml b/interface/resources/qml/hifi/avatarapp/MessageBoxes.qml
index 62ceee1b63..ccc28174a1 100644
--- a/interface/resources/qml/hifi/avatarapp/MessageBoxes.qml
+++ b/interface/resources/qml/hifi/avatarapp/MessageBoxes.qml
@@ -112,8 +112,7 @@ MessageBox {
popup.button1text = 'CANCEL'
popup.titleText = 'Get Avatars'
- popup.bodyText = 'Get avatars from Marketplace.' + '
' +
- 'Wear avatars in Inventory.'
+ popup.bodyText = 'Get avatars from the Community Bazaar. (Coming soon!)'
popup.onLinkClicked = function(link) {
popup.close();
diff --git a/interface/resources/serverless/tutorial.json b/interface/resources/serverless/tutorial.json
index e333d8246e..17e7ea26e7 100644
--- a/interface/resources/serverless/tutorial.json
+++ b/interface/resources/serverless/tutorial.json
@@ -4,6 +4,56 @@
"/": "/0.155245,-0.941538,23.9289/0,0.791589,0,0.611053"
},
"Entities": [
+ {
+ "id": "{0a199807-4a83-4286-b09c-f21124627c3e}",
+ "type": "Box",
+ "name": "Config Wizard Loader",
+ "lastEdited": 1613737207915514,
+ "visible": false,
+ "position": {
+ "x": -1.2722,
+ "y": 0.4266,
+ "z": 24.2307
+ },
+ "dimensions": {
+ "x": 0.20000000298023224,
+ "y": 0.20000000298023224,
+ "z": 0.20000000298023224
+ },
+ "rotation": {
+ "x": 0,
+ "y": -0.7660443782806396,
+ "z": 0,
+ "w": -0.6427876949310303
+ },
+ "created": 1613736996738696,
+ "lastEditedBy": "{ff9b500e-e450-4127-b41f-1c42be16f71b}",
+ "queryAACube": {
+ "x": -0.17320507764816284,
+ "y": -0.17320507764816284,
+ "z": -0.17320507764816284,
+ "scale": 0.3464101552963257
+ },
+ "grab": {
+ "grabbable": false
+ },
+ "damping": 0,
+ "angularDamping": 0,
+ "collisionless": true,
+ "ignoreForCollisions": true,
+ "script": "https://cdn-1.vircadia.com/us-e-1/DomainContent/Tutorial/Apps/configWizard/dist/wizardLoader.js",
+ "color": {
+ "red": 0,
+ "green": 180,
+ "blue": 239
+ },
+ "shape": "Cube",
+ "clientOnly": false,
+ "avatarEntity": false,
+ "localEntity": false,
+ "faceCamera": false,
+ "isFacingAvatar": false
+ },
{
"id": "{eb485a2d-2040-42f6-a960-51c88e2434b9}",
"type": "Box",
diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 06ce6c3d6c..eec1efbd99 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -2989,6 +2989,8 @@ Application::~Application() {
qInstallMessageHandler(LogHandler::verboseMessageHandler);
#ifdef Q_OS_MAC
+ // 26 Feb 2021 - Tried re-enabling this call but OSX still crashes on exit.
+ //
// 10/16/2019 - Disabling this call. This causes known crashes (A), and it is not
// fully understood whether it might cause other unknown crashes (B).
//
diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp
index 2fd52ee036..095e8333ee 100644
--- a/libraries/animation/src/AnimInverseKinematics.cpp
+++ b/libraries/animation/src/AnimInverseKinematics.cpp
@@ -22,6 +22,7 @@
#include "AnimationLogging.h"
#include "CubicHermiteSpline.h"
#include "AnimUtil.h"
+#include "AnimSkeleton.h"
static const int MAX_TARGET_MARKERS = 30;
static const float JOINT_CHAIN_INTERP_TIME = 0.5f;
@@ -66,7 +67,7 @@ AnimInverseKinematics::IKTargetVar::IKTargetVar(const QString& jointNameIn, cons
poleVectorVar(poleVectorVarIn),
weight(weightIn),
numFlexCoefficients(flexCoefficientsIn.size()),
- jointIndex(-1)
+ jointIndex(AnimSkeleton::INVALID_JOINT_INDEX)
{
numFlexCoefficients = std::min(numFlexCoefficients, (size_t)MAX_FLEX_COEFFICIENTS);
for (size_t i = 0; i < numFlexCoefficients; i++) {
@@ -172,14 +173,14 @@ bool debounceJointWarnings() {
void AnimInverseKinematics::computeTargets(const AnimVariantMap& animVars, std::vector& targets, const AnimPoseVec& underPoses) {
- _hipsTargetIndex = -1;
+ _hipsTargetIndex = AnimSkeleton::INVALID_JOINT_INDEX;
targets.reserve(_targetVarVec.size());
for (auto& targetVar : _targetVarVec) {
// update targetVar jointIndex cache
- if (targetVar.jointIndex == -1) {
+ if (targetVar.jointIndex == AnimSkeleton::INVALID_JOINT_INDEX) {
int jointIndex = _skeleton->nameToJointIndex(targetVar.jointName);
if (jointIndex >= 0) {
// this targetVar has a valid joint --> cache the indices
@@ -190,7 +191,7 @@ void AnimInverseKinematics::computeTargets(const AnimVariantMap& animVars, std::
}
IKTarget target;
- if (targetVar.jointIndex != -1) {
+ if (targetVar.jointIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
target.setType(animVars.lookup(targetVar.typeVar, (int)IKTarget::Type::RotationAndPosition));
target.setIndex(targetVar.jointIndex);
if (target.getType() != IKTarget::Type::Unknown) {
@@ -329,7 +330,7 @@ void AnimInverseKinematics::solve(const AnimContext& context, const std::vector<
// update the absolutePoses
for (int i = 0; i < (int)_relativePoses.size(); ++i) {
auto parentIndex = _skeleton->getParentIndex((int)i);
- if (parentIndex != -1) {
+ if (parentIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
absolutePoses[i] = absolutePoses[parentIndex] * _relativePoses[i];
}
}
@@ -351,12 +352,12 @@ void AnimInverseKinematics::solve(const AnimContext& context, const std::vector<
// finally set the relative rotation of each tip to agree with absolute target rotation
for (auto& target: targets) {
int tipIndex = target.getIndex();
- int parentIndex = (tipIndex >= 0) ? _skeleton->getParentIndex(tipIndex) : -1;
+ int parentIndex = (tipIndex >= 0) ? _skeleton->getParentIndex(tipIndex) : AnimSkeleton::INVALID_JOINT_INDEX;
int chainIndex = targetToChainMap[tipIndex];
bool needsInterpolation = _prevJointChainInfoVec[chainIndex].timer > 0.0f;
float alpha = needsInterpolation ? getInterpolationAlpha(_prevJointChainInfoVec[chainIndex].timer) : 0.0f;
// update rotationOnly targets that don't lie on the ik chain of other ik targets.
- if (parentIndex != -1 && !_rotationAccumulators[tipIndex].isDirty() &&
+ if (parentIndex != AnimSkeleton::INVALID_JOINT_INDEX && !_rotationAccumulators[tipIndex].isDirty() &&
(target.getType() == IKTarget::Type::RotationOnly || target.getType() == IKTarget::Type::Unknown)) {
if (target.getType() == IKTarget::Type::RotationOnly) {
const glm::quat& targetRotation = target.getRotation();
@@ -434,11 +435,11 @@ void AnimInverseKinematics::solveTargetWithCCD(const AnimContext& context, const
int tipIndex = target.getIndex();
int pivotIndex = _skeleton->getParentIndex(tipIndex);
- if (pivotIndex == -1 || pivotIndex == _hipsIndex) {
+ if (pivotIndex == AnimSkeleton::INVALID_JOINT_INDEX || pivotIndex == _hipsIndex) {
return;
}
int pivotsParentIndex = _skeleton->getParentIndex(pivotIndex);
- if (pivotsParentIndex == -1) {
+ if (pivotsParentIndex == AnimSkeleton::INVALID_JOINT_INDEX) {
// TODO?: handle case where tip's parent is root?
return;
}
@@ -485,7 +486,7 @@ void AnimInverseKinematics::solveTargetWithCCD(const AnimContext& context, const
chainDepth++;
// descend toward root, pivoting each joint to get tip closer to target position
- while (pivotIndex != _hipsIndex && pivotsParentIndex != -1) {
+ while (pivotIndex != _hipsIndex && pivotsParentIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
assert(chainDepth < jointChainInfoOut.jointInfoVec.size());
@@ -579,12 +580,12 @@ void AnimInverseKinematics::solveTargetWithCCD(const AnimContext& context, const
if (target.getPoleVectorEnabled()) {
int topJointIndex = target.getIndex();
int midJointIndex = _skeleton->getParentIndex(topJointIndex);
- if (midJointIndex != -1) {
+ if (midJointIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
int baseJointIndex = _skeleton->getParentIndex(midJointIndex);
- if (baseJointIndex != -1) {
+ if (baseJointIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
int baseParentJointIndex = _skeleton->getParentIndex(baseJointIndex);
AnimPose topPose, midPose, basePose;
- int topChainIndex = -1, baseChainIndex = -1;
+ int topChainIndex = AnimSkeleton::INVALID_JOINT_INDEX, baseChainIndex = AnimSkeleton::INVALID_JOINT_INDEX;
const size_t MAX_CHAIN_DEPTH = 30;
AnimPose postAbsPoses[MAX_CHAIN_DEPTH];
AnimPose accum = absolutePoses[_hipsIndex];
@@ -756,7 +757,7 @@ void AnimInverseKinematics::computeAndCacheSplineJointInfosForIKTarget(const Ani
int index = target.getIndex();
int endIndex = _skeleton->getParentIndex(_hipsIndex);
- while (index != endIndex) {
+ while (index != endIndex && index != AnimSkeleton::INVALID_JOINT_INDEX) {
AnimPose defaultPose = _skeleton->getAbsoluteDefaultPose(index);
float ratio = glm::dot(defaultPose.trans() - basePose.trans(), baseToTipNormal) / baseToTipLength;
@@ -1460,7 +1461,7 @@ void AnimInverseKinematics::setSkeletonInternal(AnimSkeleton::ConstPointer skele
// invalidate all targetVars
for (auto& targetVar: _targetVarVec) {
- targetVar.jointIndex = -1;
+ targetVar.jointIndex = AnimSkeleton::INVALID_JOINT_INDEX;
}
for (auto& accumulator: _rotationAccumulators) {
@@ -1480,18 +1481,18 @@ void AnimInverseKinematics::setSkeletonInternal(AnimSkeleton::ConstPointer skele
if (_hipsIndex >= 0) {
_hipsParentIndex = _skeleton->getParentIndex(_hipsIndex);
} else {
- _hipsParentIndex = -1;
+ _hipsParentIndex = AnimSkeleton::INVALID_JOINT_INDEX;
}
_leftHandIndex = _skeleton->nameToJointIndex("LeftHand");
_rightHandIndex = _skeleton->nameToJointIndex("RightHand");
} else {
clearConstraints();
- _headIndex = -1;
- _hipsIndex = -1;
- _hipsParentIndex = -1;
- _leftHandIndex = -1;
- _rightHandIndex = -1;
+ _headIndex = AnimSkeleton::INVALID_JOINT_INDEX;
+ _hipsIndex = AnimSkeleton::INVALID_JOINT_INDEX;
+ _hipsParentIndex = AnimSkeleton::INVALID_JOINT_INDEX;
+ _leftHandIndex = AnimSkeleton::INVALID_JOINT_INDEX;
+ _rightHandIndex = AnimSkeleton::INVALID_JOINT_INDEX;
}
}
@@ -1531,7 +1532,7 @@ void AnimInverseKinematics::debugDrawRelativePoses(const AnimContext& context) c
// draw line to parent
int parentIndex = _skeleton->getParentIndex(i);
- if (parentIndex != -1) {
+ if (parentIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
glm::vec3 parentPos = transformPoint(geomToWorldMatrix, poses[parentIndex].trans());
DebugDraw::getInstance().drawRay(pos, parentPos, GRAY);
}
@@ -1580,7 +1581,7 @@ void AnimInverseKinematics::debugDrawIKChain(const JointChainInfo& jointChainInf
DebugDraw::getInstance().drawRay(pos, pos + AXIS_LENGTH * zAxis, BLUE);
// draw line to parent
- if (parentIndex != -1) {
+ if (parentIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
glm::vec3 parentPos = transformPoint(geomToWorldMatrix, poses[parentIndex].trans());
glm::vec4 color = GRAY;
@@ -1629,13 +1630,13 @@ void AnimInverseKinematics::debugDrawConstraints(const AnimContext& context) con
// draw line to parent
int parentIndex = _skeleton->getParentIndex(i);
- if (parentIndex != -1) {
+ if (parentIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
glm::vec3 parentPos = transformPoint(geomToWorldMatrix, poses[parentIndex].trans());
DebugDraw::getInstance().drawRay(pos, parentPos, GRAY);
}
glm::quat parentAbsRot;
- if (parentIndex != -1) {
+ if (parentIndex != AnimSkeleton::INVALID_JOINT_INDEX) {
parentAbsRot = poses[parentIndex].rot();
}
@@ -1733,7 +1734,7 @@ void AnimInverseKinematics::preconditionRelativePosesToAvoidLimbLock(const AnimC
const float MIN_AXIS_LENGTH = 1.0e-4f;
for (auto& target : targets) {
- if (target.getIndex() != -1 && target.getType() == IKTarget::Type::RotationAndPosition) {
+ if (target.getIndex() != AnimSkeleton::INVALID_JOINT_INDEX && target.getType() == IKTarget::Type::RotationAndPosition) {
for (int i = 0; i < NUM_LIMBS; i++) {
if (limbs[i].first == target.getIndex()) {
int tipIndex = limbs[i].first;
diff --git a/libraries/animation/src/AnimSkeleton.cpp b/libraries/animation/src/AnimSkeleton.cpp
index b26d00d8d0..bd338aae4a 100644
--- a/libraries/animation/src/AnimSkeleton.cpp
+++ b/libraries/animation/src/AnimSkeleton.cpp
@@ -66,7 +66,7 @@ int AnimSkeleton::nameToJointIndex(const QString& jointName) const {
if (_jointIndicesByName.end() != itr) {
return itr.value();
}
- return -1;
+ return INVALID_JOINT_INDEX;
}
int AnimSkeleton::getNumJoints() const {
@@ -80,7 +80,7 @@ int AnimSkeleton::getChainDepth(int jointIndex) const {
do {
chainDepth++;
index = _parentIndices[index];
- } while (index != -1);
+ } while (index != INVALID_JOINT_INDEX);
return chainDepth;
} else {
return 0;
@@ -108,7 +108,7 @@ const AnimPose& AnimSkeleton::getPostRotationPose(int jointIndex) const {
std::vector AnimSkeleton::getChildrenOfJoint(int jointIndex) const {
// Children and grandchildren, etc.
std::vector result;
- if (jointIndex != -1) {
+ if (jointIndex != INVALID_JOINT_INDEX) {
for (int i = jointIndex + 1; i < (int)_parentIndices.size(); i++) {
if (_parentIndices[i] == jointIndex || (std::find(result.begin(), result.end(), _parentIndices[i]) != result.end())) {
result.push_back(i);
@@ -135,7 +135,7 @@ void AnimSkeleton::convertRelativePosesToAbsolute(AnimPoseVec& poses) const {
int lastIndex = std::min((int)poses.size(), _jointsSize);
for (int i = 0; i < lastIndex; ++i) {
int parentIndex = _parentIndices[i];
- if (parentIndex != -1) {
+ if (parentIndex != INVALID_JOINT_INDEX) {
poses[i] = poses[parentIndex] * poses[i];
}
}
@@ -146,7 +146,7 @@ void AnimSkeleton::convertAbsolutePosesToRelative(AnimPoseVec& poses) const {
int lastIndex = std::min((int)poses.size(), _jointsSize);
for (int i = lastIndex - 1; i >= 0; --i) {
int parentIndex = _parentIndices[i];
- if (parentIndex != -1) {
+ if (parentIndex != INVALID_JOINT_INDEX) {
poses[i] = poses[parentIndex].inverse() * poses[i];
}
}
@@ -157,7 +157,7 @@ void AnimSkeleton::convertRelativeRotationsToAbsolute(std::vector& ro
int lastIndex = std::min((int)rotations.size(), _jointsSize);
for (int i = 0; i < lastIndex; ++i) {
int parentIndex = _parentIndices[i];
- if (parentIndex != -1) {
+ if (parentIndex != INVALID_JOINT_INDEX) {
rotations[i] = rotations[parentIndex] * rotations[i];
}
}
@@ -168,7 +168,7 @@ void AnimSkeleton::convertAbsoluteRotationsToRelative(std::vector& ro
int lastIndex = std::min((int)rotations.size(), _jointsSize);
for (int i = lastIndex - 1; i >= 0; --i) {
int parentIndex = _parentIndices[i];
- if (parentIndex != -1) {
+ if (parentIndex != INVALID_JOINT_INDEX) {
rotations[i] = glm::inverse(rotations[parentIndex]) * rotations[i];
}
}
@@ -280,7 +280,7 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector& joints,
// so we can restore them after a future mirror operation
_nonMirroredIndices.push_back(i);
}
- int mirrorJointIndex = -1;
+ int mirrorJointIndex = INVALID_JOINT_INDEX;
if (_joints[i].name.startsWith("Left")) {
QString mirrorJointName = QString(_joints[i].name).replace(0, 4, "Right");
mirrorJointIndex = nameToJointIndex(mirrorJointName);
@@ -350,7 +350,7 @@ std::vector AnimSkeleton::lookUpJointIndices(const std::vector& jo
result.reserve(jointNames.size());
for (auto& name : jointNames) {
int index = nameToJointIndex(name);
- if (index == -1) {
+ if (index == INVALID_JOINT_INDEX) {
qWarning(animation) << "AnimSkeleton::lookUpJointIndices(): could not find bone with name " << name;
}
result.push_back(index);
diff --git a/libraries/animation/src/AnimSkeleton.h b/libraries/animation/src/AnimSkeleton.h
index efc1c1599f..e36ceb4042 100644
--- a/libraries/animation/src/AnimSkeleton.h
+++ b/libraries/animation/src/AnimSkeleton.h
@@ -30,6 +30,8 @@ public:
const QString& getJointName(int jointIndex) const;
int getNumJoints() const;
int getChainDepth(int jointIndex) const;
+
+ static const int INVALID_JOINT_INDEX { -1 };
// the default poses are the orientations of the joints on frame 0.
const AnimPose& getRelativeDefaultPose(int jointIndex) const;
diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp
index e553672b02..9fbf7a2801 100644
--- a/libraries/script-engine/src/ScriptEngine.cpp
+++ b/libraries/script-engine/src/ScriptEngine.cpp
@@ -470,7 +470,10 @@ void ScriptEngine::waitTillDoneRunning(bool shutdown) {
// We should never be waiting (blocking) on our own thread
assert(workerThread != QThread::currentThread());
-#ifdef Q_OS_MAC
+#if 0
+ // 26 Feb 2021 - Disabled this OSX-specific code because it causes OSX to crash on shutdown; without this code, OSX
+ // doesn't crash on shutdown. Qt 5.12.3 and Qt 5.15.2.
+ //
// On mac, don't call QCoreApplication::processEvents() here. This is to prevent
// [NSApplication terminate:] from prematurely destroying the static destructors
// while we are waiting for the scripts to shutdown. We will pump the message
diff --git a/pkg-scripts/README b/pkg-scripts/README
deleted file mode 100644
index 6eb74980d0..0000000000
--- a/pkg-scripts/README
+++ /dev/null
@@ -1,60 +0,0 @@
-Collection of scripts to create server distribution packages. Most of these scripts assume
-use of the build script at https://github.com/vircadia/vircadia-builder, specifically that
-the following directory structure exists
-
-base folder/
- source/ git checkout
- build/ result of cmake build
- qt5-install/ installed or built Qt5 installation
-
-These scripts assume that the current directory is the pkg-scripts folder inside of the source directory
-and that the base folder can be reached by going to "../..". This may not work if pkg-scripts is a symlink;
-adding an VIRCADIA=~/Vircadia to the beginning of the commandline will override where it looks for the base folder
-
-Ubuntu:
- DEBEMAIL="your-email@somewhere.com" DEBFULLNAME="Your Full Name" ./make-deb-server
-
- This script will retrieve the current git commit date and hash and assemble a version from it.
- It will attempt construct a .deb file in the pkg-scripts folder
-
-Amazon Linux 2:
- ./make-rpm-server
-
- This script will retrieve the current git commit date and hash and assemble a version from it.
- It will attempt construct an .rpm file in the pkg-scripts folder
-
-Docker:
- ./make-docker-server
-
- This script will attempt to create a docker container
-
-Results:
- The following directory structure is created for binaries:
- /opt/vircadia - executables
- /opt/vircadia/lib - private shared libraries required for executables
- /opt/vircadia/resources - files required by domain-server administrative website
- /opt/vircadia/plugins - files required by assignment-client, mainly for audio codecs
-
- The following systemd services are installed in /usr/lib/systemd/system:
- vircadia-assignment-client.service
- vircadia-domain-server.service
- vircadia-server.target - used to launch/shutdown the two prior services
- vircadia-assignment-client@.service
- vircadia-domain-server@.service
- vircadia-server@.target - used to launch/shutdown the two prior services
-
- The top three services in this list are the "normal" services that launch Vircadia
- in the typical fashion. The bottom three services are "template" services designed
- to permit multiple services to be installed and running on a single machine.
-
- The script "/opt/vircadia/new-server serverName basePort" will do the necessary
- setup for a new domain with the specified server name and port. Upon installation
- the package will create and launch a domain named "default" at base port 40100.
- The domain name here has nothing to do with the name people will use to find your
- domain and has nothing to do with "place names", it is only used to locate the files
- used to configure and run the domain on your server.
-
- The server stores its files in the following locations:
- /var/lib/vircadia/.local - "unnamed" services (the default location for Vircadia servers)
- /var/lib/vircadia/serverName - "named" (template) domains
- /etc/opt/vircadia - environment variables when launching named domains
diff --git a/pkg-scripts/README.md b/pkg-scripts/README.md
new file mode 100644
index 0000000000..f4f1056877
--- /dev/null
+++ b/pkg-scripts/README.md
@@ -0,0 +1,88 @@
+# Vircadia Server Packaging Scripts
+
+Collection of scripts to create server distribution packages. Most of these scripts assume
+use of the build script at https://github.com/vircadia/vircadia-builder, specifically that
+the following directory structure exists:
+
+```
+base folder/
+ source/ git checkout
+ build/ result of cmake build
+ qt5-install/ installed or built Qt5 installation
+```
+
+These scripts assume that the current directory is the pkg-scripts folder inside of the source directory
+and that the base folder can be reached by going to `../..`. This may not work if pkg-scripts is a symlink; adding an VIRCADIA=~/Vircadia to the beginning of the commandline will override where it looks for the base folder.
+
+## Ubuntu
+```
+DEBVERSION="Semver e.g. 2021.1.0" DEBEMAIL="your-email@somewhere.com" DEBFULLNAME="Your Full Name" ./make-deb-server
+```
+
+This script will retrieve the current git commit date and hash and append it to your specified version.
+It will attempt construct a .deb file in the pkg-scripts folder
+
+## Amazon Linux 2
+
+You will need to install `rpm-build` if you have not already.
+```
+sudo yum install rpm-build
+```
+Then, run the build script.
+```
+RPMVERSION="Semver e.g. 2021.1.0" ./make-rpm-server
+```
+
+This script will retrieve the current git commit date and hash and append it to your specified version.
+It will attempt construct an .rpm file in the pkg-scripts folder
+
+## Docker
+```
+./make-docker-server
+```
+
+This script will attempt to create a docker container.
+
+## Results
+
+### Binaries
+
+The following directory structure is created for binaries:
+```
+/opt/vircadia - executables
+/opt/vircadia/lib - private shared libraries required for executables
+/opt/vircadia/resources - files required by domain-server administrative website
+/opt/vircadia/plugins - files required by assignment-client, mainly for audio codecs
+```
+
+### Services
+
+The following systemd services are installed in `/usr/lib/systemd/system`:
+```
+vircadia-assignment-client.service
+vircadia-domain-server.service
+vircadia-server.target - used to launch/shutdown the two prior services
+vircadia-assignment-client@.service
+vircadia-domain-server@.service
+vircadia-server@.target - used to launch/shutdown the two prior services
+```
+
+The top three services in this list are the "normal" services that launch Vircadia
+in the typical fashion. The bottom three services are "template" services designed
+to permit multiple services to be installed and running on a single machine.
+
+The script `/opt/vircadia/new-server serverName basePort` will do the necessary
+setup for a new domain with the specified server name and port. Upon installation
+the package will create and launch a domain named "default" at base port 40100.
+The domain name here has nothing to do with the name people will use to find your
+domain and has nothing to do with "place names", it is only used to locate the files
+used to configure and run the domain on your server.
+
+### Stored Files
+
+The server stores its files in the following locations:
+```
+/var/lib/vircadia/.local - "unnamed" services (the default location for Vircadia servers)
+/var/lib/vircadia/serverName - "named" (template) domains
+/etc/opt/vircadia - environment variables when launching named domains
+```
diff --git a/pkg-scripts/make-deb-server b/pkg-scripts/make-deb-server
index 6a7bff26c3..2040563691 100755
--- a/pkg-scripts/make-deb-server
+++ b/pkg-scripts/make-deb-server
@@ -6,11 +6,11 @@ fi
GITDATE=`git -C $VIRCADIA/source log -n 1 --format=raw | grep author | cut -d">" -f 2 | cut -d" " -f 2 | xargs -I {} date -d @{} +"%Y%m%d"`
GITCOMMIT=`git -C $VIRCADIA/source rev-parse HEAD | cut -c 1-7`
-VERSION=2020.2.0-asteria-$GITDATE-$GITCOMMIT
+VERSION=$DEBVERSION-$GITDATE-$GITCOMMIT
sudo apt-get install chrpath binutils dh-make
-DEB_BUILD_ROOT=temp-make-deb/vircadia-server-$VERSION-0ubuntu1
+DEB_BUILD_ROOT=temp-make-deb/vircadia-server_$VERSION-0ubuntu1
rm -r temp-make-deb
mkdir -p $DEB_BUILD_ROOT
diff --git a/pkg-scripts/make-rpm-server b/pkg-scripts/make-rpm-server
index 20ac76d4b0..8bbc61593e 100755
--- a/pkg-scripts/make-rpm-server
+++ b/pkg-scripts/make-rpm-server
@@ -5,7 +5,7 @@ if [ "$VIRCADIA" = "" ]; then
fi
GITDATE=`git -C $VIRCADIA/source log -n 1 --format=raw | grep author | cut -d">" -f 2 | cut -d" " -f 2 | xargs -I {} date -d @{} +"%Y%m%d"`
GITCOMMIT=`git -C $VIRCADIA/source rev-parse HEAD | cut -c 1-7`
-VERSION=2020.2.0_ASTERIA_${GITDATE}_${GITCOMMIT}
+VERSION=${RPMVERSION}_${GITDATE}_${GITCOMMIT}
SOFILES=`ls \
$VIRCADIA/build/libraries/*/*.so \
diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js
index b27008e255..82b228008f 100644
--- a/scripts/defaultScripts.js
+++ b/scripts/defaultScripts.js
@@ -36,6 +36,7 @@ var DEFAULT_SCRIPTS_COMBINED = [
"system/inspect.js",
"system/keyboardShortcuts/keyboardShortcuts.js",
"system/checkForUpdates.js",
+ "system/onEscape.js",
"system/onFirstRun.js",
"system/appreciate/appreciate_app.js"
];
diff --git a/scripts/system/away.js b/scripts/system/away.js
index ef79791e44..7268dc3233 100644
--- a/scripts/system/away.js
+++ b/scripts/system/away.js
@@ -3,10 +3,9 @@
//
// away.js
//
-// examples
-//
// Created by Howard Stearns 11/3/15
// Copyright 2015 High Fidelity, Inc.
+// Copyright 2021 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
@@ -255,17 +254,6 @@ function setActiveProperties() {
Script.clearInterval(avatarMovedInterval);
}
-function maybeGoActive(event) {
- if (event.isAutoRepeat) { // isAutoRepeat is true when held down (or when Windows feels like it)
- return;
- }
- if (!isAway && (event.text === 'ESC')) {
- goAway();
- } else {
- goActive();
- }
-}
-
var wasHmdActive = HMD.active;
var wasMouseCaptured = Reticle.mouseCaptured;
@@ -329,12 +317,24 @@ var CHANNEL_AWAY_ENABLE = "Hifi-Away-Enable";
var handleMessage = function(channel, message, sender) {
if (channel === CHANNEL_AWAY_ENABLE && sender === MyAvatar.sessionUUID) {
print("away.js | Got message on Hifi-Away-Enable: ", message);
- setEnabled(message === 'enable');
+ if (message === 'enable') {
+ setEnabled(true);
+ } else if (message === 'toggle') {
+ toggleAway();
+ }
}
};
Messages.subscribe(CHANNEL_AWAY_ENABLE);
Messages.messageReceived.connect(handleMessage);
+function toggleAway() {
+ if (!isAway) {
+ goAway();
+ } else {
+ goActive();
+ }
+}
+
var maybeIntervalTimer = Script.setInterval(function() {
maybeMoveOverlay();
maybeGoAway();
@@ -343,7 +343,6 @@ var maybeIntervalTimer = Script.setInterval(function() {
Controller.mousePressEvent.connect(goActive);
-Controller.keyPressEvent.connect(maybeGoActive);
// Note peek() so as to not interfere with other mappings.
eventMapping.from(Controller.Standard.LeftPrimaryThumb).peek().to(goActive);
eventMapping.from(Controller.Standard.RightPrimaryThumb).peek().to(goActive);
@@ -371,7 +370,6 @@ Script.scriptEnding.connect(function () {
HMD.awayStateWhenFocusLostInVRChanged.disconnect(awayStateWhenFocusLostInVRChanged);
Controller.disableMapping(eventMappingName);
Controller.mousePressEvent.disconnect(goActive);
- Controller.keyPressEvent.disconnect(maybeGoActive);
Messages.messageReceived.disconnect(handleMessage);
Messages.unsubscribe(CHANNEL_AWAY_ENABLE);
});
diff --git a/scripts/system/create/assets/data/createAppTooltips.json b/scripts/system/create/assets/data/createAppTooltips.json
index 21b41bd354..4884cb3930 100644
--- a/scripts/system/create/assets/data/createAppTooltips.json
+++ b/scripts/system/create/assets/data/createAppTooltips.json
@@ -587,7 +587,7 @@
"tooltip": "The mode in which to draw an entity, either \"Solid\" or \"Wireframe\"."
},
"billboardMode": {
- "tooltip": "Determines if and how the entity will face the camera.",
+ "tooltip": "Determines if and how the entity will face the camera."
},
"renderWithZones": {
"tooltip": "If set, this entity will only render when your avatar is inside of a zone in this list."
diff --git a/scripts/system/onEscape.js b/scripts/system/onEscape.js
new file mode 100644
index 0000000000..323b8b0612
--- /dev/null
+++ b/scripts/system/onEscape.js
@@ -0,0 +1,34 @@
+'use strict';
+
+//
+// onEscape.js
+//
+// Created by Kalila L. on Feb 3 2021.
+// Copyright 2021 Vircadia contributors.
+//
+// This script manages actions when the user triggers an "escape" key or action.
+//
+// Distributed under the Apache License, Version 2.0.
+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
+//
+
+(function() { // BEGIN LOCAL_SCOPE
+
+ function maybeEscapeKeyPressed (event) {
+ if (event.isAutoRepeat) { // isAutoRepeat is true when held down (or when Windows feels like it)
+ return;
+ }
+
+ if (event.text === 'ESC') {
+ var CHANNEL_AWAY_ENABLE = 'Hifi-Away-Enable';
+ Messages.sendMessage(CHANNEL_AWAY_ENABLE, 'toggle', true);
+ }
+ }
+
+ Controller.keyPressEvent.connect(maybeEscapeKeyPressed);
+
+ Script.scriptEnding.connect(function () {
+ Controller.keyPressEvent.disconnect(maybeEscapeKeyPressed);
+ });
+
+}());
diff --git a/scripts/system/onFirstRun.js b/scripts/system/onFirstRun.js
index 65c1d06ec5..e7052c0e3a 100644
--- a/scripts/system/onFirstRun.js
+++ b/scripts/system/onFirstRun.js
@@ -13,6 +13,7 @@
//
(function() { // BEGIN LOCAL_SCOPE
+ // Check to see if we should run this script or bail...
var SETTING_TO_CHECK = 'firstRun';
var DEFAULT_DISPLAY_NAME = '';
@@ -20,6 +21,8 @@
return;
}
+ // If this is our first run, then proceed...
+
if (MyAvatar.displayName === '') {
var selectedDisplayName = Window.prompt('Enter a display name.', MyAvatar.displayName);